Pythonによる分散分析

分散分析(Analysis Of VAriance; ANOVA)は3標本以上の差の検定です。

Pythonの統計パッケージには、scipy.statsやstatsmodelsがあります。最近はpingouinというものもあります。いずれもANOVAをサポートしています。それぞれのパッケージでの使用方法を説明します。

scipy.statsによるANOVA

from scipy import stats

x = [43, 55, 57, 72, 51, 52, 48, 46, 58, 54]
y = [53, 44, 54, 51, 68, 64, 45, 67, 49, 56]
z = [77, 55, 67, 54, 46, 75, 65, 57, 49, 61]
print(stats.f_oneway(x, y, z))

結果

F_onewayResult(statistic=1.6463168290164742, pvalue=0.21152459574247603)

statsmodelsによるANOVA

import pandas as pd
import statsmodels.api as sm
from statsmodels.formula.api import ols

x = [43, 55, 57, 72, 51, 52, 48, 46, 58, 54]
y = [53, 44, 54, 51, 68, 64, 45, 67, 49, 56]
z = [77, 55, 67, 54, 46, 75, 65, 57, 49, 61]

values = x + y + z
groups = ['x'] * len(x) + ['y'] * len(y) + ['z'] * len(z)
data = pd.DataFrame({'values': values, 'groups': groups})

lm = ols('values ~ groups', data=data).fit()
sm.stats.anova_lm(lm, typ=2) # Type 2 Anova DataFrame

結果

               sum_sq    df         F    PR(>F)
groups     271.666667   2.0  1.646317  0.211525
Residual  2227.700000  27.0       NaN       NaN

pingouinによるANOVA

import pandas as pd
import pingouin as pg

x = [43, 55, 57, 72, 51, 52, 48, 46, 58, 54]
y = [53, 44, 54, 51, 68, 64, 45, 67, 49, 56]
z = [77, 55, 67, 54, 46, 75, 65, 57, 49, 61]

values = x + y + z
groups = ['x'] * len(x) + ['y'] * len(y) + ['z'] * len(z)
data = pd.DataFrame({'values': values, 'groups': groups})

print(pg.anova(data, dv='values', between='groups'))

結果

   Source  ddof1  ddof2         F     p-unc       np2
0  groups      2     27  1.646317  0.211525  0.108694