例によってwebアプリ拡張。
統計処理をするにあたって、データが正規分布しているかどうかによってその後の処理が分岐する事が多い。
なので、まずは正規分布かどうかを確定させる必要がある。
Shapiro-Wilk testで判定。Q–Q plot, quantile-quantile plotも参考に。
@app.route('/shapiro', methods=['GET', 'POST']) def shapiro_index(): user = g.user.name form=StatForm() dir = "./user/" + user + "/ttest" if os.path.exists(dir): shutil.rmtree(dir) if not os.path.exists(dir): os.makedirs(dir) input = dir + "/input.txt" output = dir + "/output.txt" if request.method == 'POST': if 'file' not in request.files: flash('No file part') return redirect(request.url) file = request.files['file'] if file.filename == '': if form.samp_t.data: samp = form.samp_t.data.strip() f = open(input, 'w') f.write(samp) f.close() else: flash('No data input') return redirect(request.url) if file and allowed_file(file.filename): file.save(input) if os.path.exists(input): if form.data_f.data=='csv': df = pd.read_csv(input) if form.data_f.data=='tsv': df = pd.read_table(input) dfs1 = df.iloc[:, form.index_col.data].dropna() data = np.array(dfs1.values.tolist()) header = df.columns record = df.values.tolist() results = stats.shapiro(data) stat_fig = dir + "/stat_" + str(time.time()) + ".png" plt.figure(figsize=(5,5)) stats.probplot(data, dist="norm", plot=plt) plt.savefig(stat_fig) img_url = "../../static/" + stat_fig return render_template('/tools/shapiro.html', form=form, results=results, header=header, record=record, img_url=img_url) return render_template('/tools/shapiro.html', form=form)
Sepal lengthはこのデータでは微妙に正規分布から外れている(P<0.05)
Sepal widthはP>0.05なので正規分布と言えるらしい。