💬 일원 분산 분석
주어진 데이터는 4가지 다른 교육 방법을 적용한 대학생들의 학점 결과이다. 이 실험에서는 비슷한 실력을 가진 학생 40명을 무작위로 4개(A, B, C, D)그룹으로 나누었고, 각 그룹은 다른 교육 방법을 적용했다. 학생들의 학점 결과에는 교육 방법에 따른 차이가 있는지 유의수준 0.5하에서 검정하시오.
- 귀무가설(H0): 네 가지 교육 방법에 의한 학생들의 학점 평균은 동일하다.
- 대립가설(H1): 적어도 두 그룹의 학점 평균은 다르다.
import pandas as pd
df = pd.DataFrame({
'A': [3.5, 4.3, 3.8, 3.6, 4.1, 3.2, 3.9, 4.4, 3.5, 3.3],
'B': [3.9, 4.4, 4.1, 4.2, 4.5, 3.8, 4.2, 3.9, 4.4, 4.3],
'C': [3.2, 3.7, 3.6, 3.9, 4.3, 4.1, 3.8, 3.5, 4.4, 4.0],
'D': [3.8, 3.4, 3.1, 3.5, 3.6, 3.9, 3.2, 3.7, 3.3, 3.4]
})
print(df.head(2))
💬 이번에도 마찬가지로 작은 데이터를 가지고왔다.
일원분산분석을 통해서 각각 pvale들을 확인하고 귀무,대립가설을 확인해보겠습니다.
# 일원 분산 분석
from scipy import stats
stats.f_oneway(df['A'],df['B'],df['C'],df['D'])
💬 결과
F_onewayResult(statistic=7.2969837587007, pvalue=0.0006053225519892207)
pvalue값은 0.05보다 작으니 대립가설 채택입니다.
💬기본가정이 있었는데
문제가 쉽다면 정규성, 등분산성이 만족한다는 전제조건이 달릴거같고
만약 아니라면 샤피로 윌크, 레빈을 이요해서 일원분산분석을 하라고 할 것입니다!
# 정규성, 등분산, 일원 분산 분석
# Shapiro-Wilk(샤피로-윌크) 정규성 검정
print(stats.shapiro(df['A']))
print(stats.shapiro(df['B']))
print(stats.shapiro(df['C']))
print(stats.shapiro(df['D']))
# Levene(레빈) 등분산 검정
print(stats.levene(df['A'], df['B'], df['C'], df['D']))
# 일원 분산 분석
print(stats.f_oneway(df['A'], df['B'], df['C'], df['D']))
💬 결과
ShapiroResult(statistic=0.9498823422157768, pvalue=0.667108682193412)
ShapiroResult(statistic=0.9346447100990081, pvalue=0.495096931740429)
ShapiroResult(statistic=0.9871342658078467, pvalue=0.9919546177620264)
ShapiroResult(statistic=0.9752339025839639, pvalue=0.9346854448707619)
LeveneResult(statistic=1.5433829973707245, pvalue=0.22000894224209636)
F_onewayResult(statistic=7.2969837587007, pvalue=0.0006053225519892207)
결과는stats.f_oneway(df['A'], df['B'] , df['C'] , df['D'])를보면 위에 값과 똑같은것을 볼 수 있습니다.
💬 심화학습
분산분석의 데이터를 길게 바꾸어볼것입니다.
요런식으로요~
# 데이터 재구조화 (긴 형태)
df_melt=df.melt()
df_melt.head()
melt : 녹다라는뜻인데 녹여서 걍 세로로 쭉 내린다는 걸로 이해하면 암기쉬울듯해요.
원래는 컬럼기준을로 나뉘어져있었는데 길게~ 내리는겁니다.
💬분산분석 테이블로 출력하기(anova_lm)
# ANOVA 테이블
from statsmodels.formula.api import ols
from statsmodels.stats.anova import anova_lm
model = ols('value~variable',data=df_melt).fit()
anova_lm(model)
결과는 모두 같다는것을 확인할 수 있습니다.
stats와 scipy를 활용한 것을 확인할 수 있습니다. 보통은 scipy를 구해서 구하는게 편하겠찌만
자유도 등을 더 물어보게 된다면 anova를 써야합니다..!
💬사후검정
귀무가설/대립가설 보면 두 그룹의 평균을 이야기하는데 어떤 두 그룹인지는 모르니까
어떤 그룹들 간에 통계적으로 유의미한 차이가 있는지 구체적으로 파악하는것이 목적입니다.
가장 많이 쓰이는 투키, 본페로니 이렇게 두개가 있습니다.
from scipy import stats
from statsmodels.stats.multicomp import pairwise_tukeyhsd, MultiComparison
# Tukey HSD (투키)
tukey_result = pairwise_tukeyhsd(df_melt['value'], df_melt['variable'], alpha=0.05)
print(tukey_result.summary())
# Bonferroni(본페로니)
mc = MultiComparison(df_melt['value'], df_melt['variable'])
bon_result = mc.allpairtest(stats.ttest_ind, method='bonf')
print(bon_result[0])
reject가 True인것을 보면 유의미하다~ 라고 볼 수 있습니다.
본페로니는 조금 더 엄격하게 내립니다.
💬크루스칼-왈리스 검정(비모수 검정)
정규성검정중에 한그룹이라도 정규분포에 만족하지 못하는 경우에 비모수검정을 진행하게 됩니다.
가장 흔한건 크루스칼-왈리스 검정이 있습니다.
import pandas as pd
from scipy import stats
# 데이터
df = pd.DataFrame({
'A': [10.5, 11.3, 10.8, 10.6, 11.1, 10.2, 10.9, 11.4, 10.5, 10.3],
'B': [10.9, 11.4, 11.1, 11.2, 11.5, 10.8, 11.2, 10.9, 11.4, 11.3],
'C': [10.2, 10.7, 10.6, 10.9, 11.3, 11.1, 10.8, 10.5, 11.4, 11.0],
'D': [13.8, 10.4, 10.1, 10.5, 10.6, 10.9, 10.2, 10.7, 10.3, 10.4]
})
# 정규성 검정
print(stats.shapiro(df['A']))
print(stats.shapiro(df['B']))
print(stats.shapiro(df['C']))
print(stats.shapiro(df['D']))
# Kruskal-Wallis 검정
stats.kruskal(df['A'], df['B'], df['C'], df['D'])
ShapiroResult(statistic=0.9498823422157767, pvalue=0.6671086821934112)
ShapiroResult(statistic=0.9346447100990083, pvalue=0.49509693174043135)
ShapiroResult(statistic=0.9871342658078467, pvalue=0.9919546177620264)
ShapiroResult(statistic=0.5759975003447693, pvalue=2.8656624682936833e-05)
KruskalResult(statistic=11.183607021517561, pvalue=0.010773365310213669)
'자격증 > [빅분기] 빅데이터분석기사' 카테고리의 다른 글
[작업형3] 이원 분산 분석 실습 + 심화 (0) | 2024.11.19 |
---|---|
[작업형2] roc_acu_score 에러. (0) | 2024.11.18 |
[작업형3] 분산분석 개념 (0) | 2024.11.16 |
[작업형3] 다선형회귀, 범주형이 섞여있다면? (0) | 2024.11.14 |
[작업형3] 회귀분석-단순 선형 회귀 분석 (3) (0) | 2024.11.13 |