メインコンテンツへスキップ
見出し画像

書記が数学やるだけ#224 分散分析の基本原理

    分散分析(ANOVA)について,まずは基本原理から学習する。


    問題

    スクリーンショット 2022-01-24 18.44.24


    本問は『一般線形モデルによる生物科学のための現代統計学』で公開されているデータセットに基づいている。



    説明

    分散分析(ANOVA)は,例えば3群以上からなるデータの母平均の差を検定するのに用いられる。

    スクリーンショット 2022-01-24 18.36.15


    基本的な考え方に平方和分解があり,残差による変動(群内平方和)から要因効果による変動(群間平方和)を分離して比較する。

    スクリーンショット 2022-01-24 18.37.46


    自由度も要因と残差に分解して考えることができる。

    スクリーンショット 2022-01-24 18.39.41


    帰無仮説「全ての母平均が等しい」として,F検定により判断する。

    スクリーンショット 2022-01-24 18.41.01


    解答

    手計算による解答から。

    肥料ごとの平均と標準偏差を求めておく。

    数学やるだけ解答#224_page-0001


    それぞれの平方和を計算する。

    数学やるだけ解答#224_page-0002


    平方和と自由度からF値を計算し,検定を行う。

    ここまでの手順は,分散分析表によりまとめられる。

    数学やるだけ解答#224_page-0003


    以下,Pythonによるコード。

    # ライブラリの読み込み
    import numpy as np
    import pandas as pd
    import scipy as sp
    import statsmodels
    import statsmodels.api as sm
    import statsmodels.formula.api as smf


    今回使うデータは,予め"分散分析-1"というcsvファイルを作成し読み込むことにした(作成方法は省略)。

    # データの読み込み
    data = pd.read_csv('分散分析-1.csv')
    print(data)


    FERTILラベルを文字型に変換する。

    data['FERTIL'] = data['FERTIL'].astype(str)
    print(data.dtypes)


    まずはデータを観察する。肥料ごとの収穫量をプロットする。肥料ごとの違いと,同じ肥料内でのばらつきに注目。

    import matplotlib.pyplot as plt
    import seaborn as sns
    sns.swarmplot(x="FERTIL", y="YIELD",data=data,dodge=True)

    画像7


    参考までに,箱ひげ図を重ねてみる。

    sns.boxplot(x=data["FERTIL"], y=data["YIELD"])
    sns.swarmplot(x="FERTIL", y="YIELD",data=data,dodge=True)

    画像8


    分散分析のモデルを作成し,分散分析表を表示させる。

    # モデル化
    anova_mod = smf.ols('YIELD ~ FERTIL', data=data).fit()
    # 分散分析表
    anova_table = sm.stats.anova_lm(anova_mod, tye=2)
    anova_table

    スクリーンショット 2022-01-25 10.39.18


    より詳細について。

    anova_mod.summary()

    スクリーンショット 2022-01-25 10.42.12


    例えば,帰無仮説「全ての母平均は等しい」とし有意水準5%のF検定を行うと,p値より帰無仮説が棄却されることが言える。

    つまり,肥料ごとに収穫量に違いがあることがわかる。しかし,具体的にどの肥料同士に差があるかまではわからない点に注意。これについては,後日多重比較の回で扱うことにする。


    本記事のもくじはこちら:


    あなたへのおすすめ