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

 

column = '머리둘레', by = '태아수'

 

column = '머리둘레', by = '관측자수'