分散分析

7.2. 分散分析#

t 検定は 2 群間の母平均に有意差があるかを検定する手法ですが、3 群以上のデータを比較する場合には使用できません。3 群以上のデータにおける母平均の差を検定するためには、分散分析Analysis of Variance; ANOVA)を用います。分散分析は、複数の群の母平均の差異を同時に評価できるため、たとえば 3 種類以上のどんぐりの重さを比較する際に有効です。また、t 検定と同様に、分散分析においてもデータが正規分布に従うことが前提となります。データが正規分布に従っていない場合、分散分析の結果の信頼性は低下するため、検定を行う前にデータの分布を確認することが重要です。

今回は、アラカシ、シラカシ、コナラの 3 種類のどんぐりの重さに違いがあるかどうかを、分散分析を用いて検定します。まず、データを準備し、各群の分布を確認します。

# !wget https://py.biopapyrus.jp/data/acorns.clean.csv
acorns_data = pd.read_csv('acorns.clean.csv')

arakashi = acorns_data['weight'][acorns_data['tree'] == 'arakashi']
shirakashi = acorns_data['weight'][acorns_data['tree'] == 'shirakashi']
konara = acorns_data['weight'][acorns_data['tree'] == 'konara']
Hide code cell source
import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot()
ax.hist(shirakashi, alpha=0.5, label='shirakashi')
ax.hist(arakashi, alpha=0.5, label='arakashi')
ax.hist(konara, alpha=0.5, label='konara')
ax.legend()
plt.show()
../_images/2f757c290a7ecf43f8806027b118d301c133a235df12a33186731999c6759d8e.png

次に、「アラカシ、シラカシ、コナラのどんぐりの重さに差はない」という帰無仮説を立て、有意水準を 5% として検定を行います。分散分析は、SciPy ライブラリの stats モジュールに含まれる f_oneway 関数を使用します。

import scipy.stats as stats
res = stats.f_oneway(arakashi, shirakashi, konara)

分散分析の結果として、F 統計量と p 値が得られます。

print(res.statistic)
print(res.pvalue)
14.356705776434133
2.603440728711446e-05

F 統計量は、群間の平均の差と群内のばらつきの比率を表します。この値が大きいほど、群間に有意差がある可能性が高いといえます。また、p 値が事前に設定した有意水準よりも小さい場合、帰無仮説を棄却し、群間の平均に有意差があると統計的に結論付けることができます。今回の結果として、p 値が 0.05 より小さいため、帰無仮説を棄却し、アラカシ、シラカシ、コナラのどんぐりの平均重には有意差があると解釈できます。

なお、分散分析は群間に差があるかどうかを検定する手法であり、どの群間で差があるのかを示すものではありません。したがって、群間の平均値の差をさらに詳しく検討したい場合には、多重比較検定を行う必要があります。具体的には、Tukey 検定、Dunnett 検定、あるいは Williams 検定などを用いて、群間の差の有無を個別に検定することができます。

!rm acorns.clean.csv