分散分析(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