logo

[basic-stat-python] 이원분산분석

예제 데이터 poison.csv를 다운로드 받는다.

데이터를 연다.

import pandas as pd
dat = pd.read_csv('poisons.csv', index_col=0)
dat.head()
timepoisontreat
10.311A
20.451A
30.461A
40.431A
50.362A

이 데이터에서 종속변수는 time, 독립변수는 poison과 treat이다.

균형설계자료인지 확인한다.

dat.groupby('poison').agg(len)
timetreat
poison
116.016
216.016
316.016

poison 요인으로 구분한 집단별 표본수는 모두 16으로 동일

dat.groupby('treat').agg(len)
timepoison
treat
A12.012
B12.012
C12.012
D12.012

treat 요인구분한 집단별 표본수는 모두 12으로 동일

dat.groupby(['poison', 'treat']).agg(len)
time
poisontreat
1A4.0
B4.0
C4.0
D4.0
2A4.0
B4.0
C4.0
D4.0
3A4.0
B4.0
C4.0
D4.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)
dfsum_sqmean_sqFPR(>F)
C(poison)2.01.0330120.51650623.2217373.331440e-07
C(treat)3.00.9212060.30706913.8055823.777331e-06
C(poison):C(treat)6.00.2501380.0416901.8743331.122506e-01
Residual36.00.8007250.022242NaNNaN

결과 해석:

  • 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로 유의미하지 않음. 상호작용 효과는 발견하지 못함
Previous
다원분산분석