kuroの覚え書き

96の個人的覚え書き

正規分布しているかの検定

例によって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)

f:id:k-kuro:20200817195854p:plain
Sepal lengthはこのデータでは微妙に正規分布から外れている(P<0.05)
f:id:k-kuro:20200817200010p:plain
Sepal widthはP>0.05なので正規分布と言えるらしい。