본문 바로가기
자격증/[빅분기] 빅데이터분석기사

[작업형3] 이원 분산 분석 실습 + 심화

by 바다의 공간 2024. 11. 19.

🟡이원 분산 분석

 
 

가정에서 재배하고 있는 네 가지 토마토 종자(A, B, C, D)에 대해 세 가지 종류의 비료 (11, 12, 13)를

사용하여 재배된 토마토 수를 조사하였다. 종자 및 비료 종류 간의 토마토 수의 차이가 있는지

유의수준 0.05하에서 검정하시오. (단, 정규성, 등분산성에 만족한 데이터)

  • 종자 (주 효과)
    • 귀무가설(H0): 종자 간의 토마토 수에 차이가 없다.
    • 대립가설(H1): 적어도 하나의 종자에서 토마토 수에 차이가 있다.
  • 비료 (주 효과)
    • 귀무가설(H0): 비료 종류 간의 토마토 수에 차이가 없다.
    • 대립가설(H1): 적어도 하나의 비료 종류에서 토마토 수에 차이가 있다.
  • 상호작용 효과:
    • 귀무가설(H0): 종자와 비료 간의 상호작용은 토마토 수에 영향을 미치지 않는다.
    • 대립가설(H1): 종자와 비료 간의 상호작용은 토마토 수에 영향을 미친다.

 

🟡 이번에도 가상의 데이터를 구축했습니다.

import pandas as pd
df = pd.read_csv("https://raw.githubusercontent.com/lovedlim/inf/main/p3/tomato.csv")
# df = pd.read_csv("tomato.csv")
print(df.head())
print(df.shape)

 

 

 

🟡 이원 분산 분석은 anova로 확인할 수 있고 ols로 

가져오려고합니다.

# anova 테이블
from statsmodels.formula.api import ols
from statsmodels.stats.anova import anova_lm

model = ols('토마토수 ~ C(종자) + C(비료) + C(종자):C(비료)', data=df).fit()
anova_lm(model)

 

여기서 statsmodels.stats.anova import anova_lm 은 암기해야합니다~

여기서는 상호작용 효과까지 들어가니 종자:비료 를 함께 기재해주어야합니다. 

범주형 데이터가 있기때문에 C로 모두 감싸줍니다. 그냥 다 감싸는게 안전할것같아요

그리고 종속변수는 C를 감싸지 않습니다. 이 점 주의해주세요.

지금은 회귀분석을 하고있고 종속변수는 수치형 변수니 굳이 C로 감쌀 이유가 없죠.

 

 

🟡 우리가 봐야할건 PR을 봐야하는데 자연(e)가있으니 표기법을 해줍니다.

# 일반표기법 format(지수표기법, '.10f')
print(format(7.254117e-10,'.10f'))
print(format(1.835039e-03,'.10f'))
print(format(2.146636e-01,'.10f'))

#0.0000000007
#0.0018350390
#0.2146636000

종자, 비료 모두 대립가설채택이지만 종자:비료 즉 상호작용 효과는 귀무가설이 채택되게 됩니다.

 

 

🟡 또 굳이 다 묶어서 하지 않아도 formula를 활용해서 한번에 할 수 있는 방법이 있는데

# formula * 활용
from statsmodels.formula.api import ols
from statsmodels.stats.anova import anova_lm
# model = ols('토마토수 ~ C(종자) + C(비료) + C(종자):C(비료)', data=df).fit()
model = ols('토마토수 ~ C(종자) * C(비료)', data=df).fit()
anova_lm(model)

이렇게 적을 수 있습니다. 

값은 모두 같게 산출됩니다.

 

 


 

🟡 사후검정 확인하기

투키와 본페로니를 사용해서 사후검정을 확인해볼 수 있습니다.

 

from statsmodels.stats.multicomp import pairwise_tukeyhsd

# Tukey HSD
tukey_summary1 = pairwise_tukeyhsd(df['토마토수'], df['종자'], alpha=0.05)
tukey_summary2 = pairwise_tukeyhsd(df['토마토수'], df['비료'].astype(str), alpha=0.05)
print(tukey_summary1)
print(tukey_summary2)

 

 

 

본페로니검정입니다.

# Bonferroni
from scipy import stats
from statsmodels.stats.multicomp import MultiComparison

mc = MultiComparison(df['토마토수'], df['종자'])
bon_result = mc.allpairtest(stats.ttest_ind, method="bonf", alpha=0.05)
print(bon_result[0])

mc = MultiComparison(df['토마토수'], df['비료'])
bon_result = mc.allpairtest(stats.ttest_ind, method="bonf")
print(bon_result[0])

# 영상에 나온 .astype(str)은 삭제해도 됩니다.