이원분산분석 :: Python 기초 통계 - mindscale
Skip to content

이원분산분석

예제 데이터 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로 유의미하지 않음. 상호작용 효과는 발견하지 못함