Python 데이터 분석
Python 데이터분석 기초 39 - Two-way ANOVA(이원분산분석)
코딩탕탕
2022. 11. 9. 18:00
Two-way ANOVA(이원분산분석)
요인 복수 - 각 요인의 데이터(그룹)도 복수이다.
# Two-way ANOVA(이원분산분석) : 요인 복수 - 각 요인의 데이터(그룹)도 복수
import pandas as pd
import urllib.request
import matplotlib.pyplot as plt
from statsmodels.formula.api import ols
from statsmodels.stats.anova import anova_lm
import statsmodels.api as sm
plt.rc('font', family = 'malgun gothic')
url = "https://raw.githubusercontent.com/pykwon/python/master/testdata_utf8/group3_2.txt"
data = pd.read_csv(urllib.request.urlopen(url), delimiter = ',') # delimiter는 컴마이다(컴마로 구분한다).
print(data.head(3), data.shape)
print()
# data.boxplot(column = '머리둘레', by = '태아수')
# plt.show()
# data.boxplot(column = '머리둘레', by = '관측자수')
# plt.show()
# 귀무 : 태아수와 관측자수는 태아의 머리둘레와 관련이 없다.
# 대립 : 태아수와 관측자수는 태아의 머리둘레와 관련이 있다.
# 상호 작용을 빼고 한 경우
reg = ols("data['머리둘레'] ~ C(data['태아수']) + C(data['관측자수'])", data = data).fit() # 학습을 위해 fit 함수 사용
result = anova_lm(reg, type = 2)
print(result)
print()
# 상호 작용(교호작용, Interaction이란 한 요인의 효과가 다른 요인의 수준에 의존하는 경우를 말한다.)을 적용한 경우
reg2 = ols("머리둘레 ~ C(태아수) + C(관측자수) + C(태아수):C(관측자수)", data = data).fit() # 학습을 위해 fit 함수 사용
result2 = anova_lm(reg2, type = 2)
print(result2)
# 해석 : p-value = 0.3295509 > 0.05 이므로 귀무가설 채택
# 태아수와 관측자수는 태아의 머리둘레와 관련이 없다.
<console>
머리둘레 태아수 관측자수
0 14.3 1 1
1 14.0 1 1
2 14.8 1 1 (36, 3)
df sum_sq mean_sq F PR(>F)
C(data['태아수']) 2.0 324.008889 162.004444 2023.182239 1.006291e-32
C(data['관측자수']) 3.0 1.198611 0.399537 4.989593 6.316641e-03
Residual 30.0 2.402222 0.080074 NaN NaN
df sum_sq mean_sq F PR(>F)
C(태아수) 2.0 324.008889 162.004444 2113.101449 1.051039e-27
C(관측자수) 3.0 1.198611 0.399537 5.211353 6.497055e-03
C(태아수):C(관측자수) 6.0 0.562222 0.093704 1.222222 3.295509e-01
Residual 24.0 1.840000 0.076667 NaN NaN