이원분산분석
예제 데이터 poison.csv를 다운로드 받는다.
데이터를 연다.
import pandas as pd
dat = pd.read_csv('poisons.csv', index_col=0)
dat.head()
time | poison | treat | |
---|---|---|---|
1 | 0.31 | 1 | A |
2 | 0.45 | 1 | A |
3 | 0.46 | 1 | A |
4 | 0.43 | 1 | A |
5 | 0.36 | 2 | A |
이 데이터에서 종속변수는 time, 독립변수는 poison과 treat이다.
균형설계자료인지 확인한다.
dat.groupby('poison').agg(len)
time | treat | |
---|---|---|
poison | ||
1 | 16.0 | 16 |
2 | 16.0 | 16 |
3 | 16.0 | 16 |
poison 요인으로 구분한 집단별 표본수는 모두 16으로 동일
dat.groupby('treat').agg(len)
time | poison | |
---|---|---|
treat | ||
A | 12.0 | 12 |
B | 12.0 | 12 |
C | 12.0 | 12 |
D | 12.0 | 12 |
treat 요인구분한 집단별 표본수는 모두 12으로 동일
dat.groupby(['poison', 'treat']).agg(len)
time | ||
---|---|---|
poison | treat | |
1 | A | 4.0 |
B | 4.0 | |
C | 4.0 | |
D | 4.0 | |
2 | A | 4.0 |
B | 4.0 | |
C | 4.0 | |
D | 4.0 | |
3 | A | 4.0 |
B | 4.0 | |
C | 4.0 | |
D | 4.0 |
poison과 treat 요인으로 구분한 각 집단별 표본수는 모두 4로 동일
모든 집단별 표본수가 동일하므로, 균형설계자료
이원분산분석 실시:
from statsmodels.formula.api import ols
from statsmodels.stats.anova import anova_lm
model = ols('time ~ C(poison) * C(treat)', dat).fit()
anova_lm(model)
df | sum_sq | mean_sq | F | PR(>F) | |
---|---|---|---|---|---|
C(poison) | 2.0 | 1.033012 | 0.516506 | 23.221737 | 3.331440e-07 |
C(treat) | 3.0 | 0.921206 | 0.307069 | 13.805582 | 3.777331e-06 |
C(poison):C(treat) | 6.0 | 0.250138 | 0.041690 | 1.874333 | 1.122506e-01 |
Residual | 36.0 | 0.800725 | 0.022242 | NaN | NaN |
결과 해석: - poison: F(2, 36) = 23.222, p < 0.05로 유의미. 즉 poison의 수준에 따라 평균에 차이가 난다고 볼 수 있음 - treat: F(3, 36) = 13.806, p < 0.05로 유의미. 즉 treat의 수준에 따라 평균에 차이가 난다고 볼 수 있음 - poison:treat: F(6, 36) = 1.874, p > 0.05로 유의미하지 않음. 상호작용 효과는 발견하지 못함