세 가지 다른 교육 방법(A, B, C)을 사용하여 수험생들의 시험 성적을 개선시키는 효과를 평가하고자 한다. 30명의 학생들을 무작위로 세 그룹으로 배정하여 교육을 실시하였고, 시험을 보고 성적을 측정하였습니다.
1. f값
2. p값
3. 검정결과 출력
groupA = [85, 92, 78, 88, 83, 90, 76, 84, 92, 87]
groupB = [79, 69, 84, 78, 79, 83, 79, 81, 86, 88]
groupC = [75, 68, 74, 65, 77, 72, 70, 73, 78, 75]
Shapiro-Wilk 검정
1. 귀무가설(): 데이터가 정규분포를 따른다
2. 대립가설(): 데이터가 정규분포를 따르지 않는다.
from scipy import stats
print(stats.shapiro(groupA))
print(stats.shapiro(groupB))
print(stats.shapiro(groupC))
out:
ShapiroResult(statistic=0.9364545941352844, pvalue=0.5142781734466553)
ShapiroResult(statistic=0.9197027683258057, pvalue=0.3544830083847046)
ShapiroResult(statistic=0.9560540914535522, pvalue=0.7401155233383179)
Levene 검정
1. 귀무가설(H₀): 각 그룹의 분산이 동일하다(등분산성 가정이 성립한다).
2. 대립가설(H₁): 적어도 하나의 그룹의 분산이 다른 그룹과 다르다(등분산성 가정이 성립하지 않는다).
print(stats.levene(groupA,groupB,groupC))
out:
LeveneResult(statistic=0.38606847697756774, pvalue=0.6834162323267926)
import pandas as pd
data = {
'scores': groupA + groupB + groupC,
'groups': ['A'] * len(groupA) + ['B'] * len(groupB) + ['C'] * len(groupC)
}
df = pd.DataFrame(data)
df
out:
scores groups
0 85 A
1 92 A
2 78 A
3 88 A
4 83 A
5 90 A
6 76 A
...
ols 함수로 ANOVA 모델 학습
ols 함수는 일반선형회귀를 수행, 이를 통해 ANOVA 모델 학습
즉 ANOVA는 그룹을 예측 변수로 사용한 단순 회귀 분석으로 볼 수 있음
from statsmodels.formula.api import ols
model = ols('scores ~ groups', df).fit()
statsmodels.stats.anova 모듈의 anova_lm 함수를 통해 ANOVA 수행 F-통계량과 p-value를 구함
from statsmodels.stats.anova import anova_lm
print(anova_lm(model))
out:
df sum_sq mean_sq F PR(>F)
groups 2.0 834.2 417.100000 16.884108 0.000018
Residual 27.0 667.0 24.703704 NaN NaN
df 자유도
- df(groups): 총 그룹의 수 -1 (3-1 = 2)
- df(Residual): 전체 데이터 수 - 그룹 개수 (30 - 3 = 27)
sum_sq (제곱합)
- groups: 그룹간 제곱합, 각 그룹의 평균과 전체 평균 간의 차이를 제곱하여 더한 값 ( 그룹간 차이가 클 수록 값이 커짐)
- Residual: 잔차 제곱의 합으로, 각 데이터의 실제 값과 해당 그룹의 평균 간 차이를 제곱하여 더한 값 (데이터의 변동성 나타냄)
mean_sq(평균 제곱)
F-통계량
PR(>F) (P-value)
F-통계량: 16.88, p-value:0.000018
p-value < 0.05, 귀무가설을 기각
세 그룹(A, B, C) 간 평균 성적 차이가 통계적으로 유의미하다는 결론
# 일원배치법 수행
f_value, p_value = stats.f_oneway(groupA, groupB, groupC)
# F-value
print(round(f_value,2))
# p-value
print(format(p_value,'.6f'))
16.88
0.000018
결론은 위와 같음
f_oneway vs ols의 개요f_oneway (단순 ANOVA):
scipy.stats에서 제공하는 함수, 단순한 일원분산분석을 수행ols + anova_lm (회귀 분석을 이용한 ANOVA):
statsmodels에서 제공하는 함수, 일반 선형 회귀(OLS 회귀)를 이용한 ANOVA 수행| 항목 | f_oneway | ols + anova_lm |
|---|---|---|
| 모델링 접근법 | 단순한 ANOVA 수행 | OLS 회귀를 이용한 ANOVA 수행 (회귀 모델 기반) |
| 출력 정보 | F-통계량과 p-value | 자유도, 제곱합, 평균 제곱, F-통계량, p-value 등 |
| 확장성 | 다변량 분석이 어려움 | 여러 독립 변수 추가가 가능 (확장된 회귀 분석) |
| 사용성 | 빠르고 간단하게 평균 차이를 검정하는 데 적합 | 회귀 계수나 모델 적합성을 추가적으로 평가 가능 |
| 복잡한 모델링 | 단일 요인(그룹) 간 평균 차이 검정에 적합 | 다중 요인 분석 및 상호작용, 공변량 등을 다룰 수 있음 |
| 고급 기능 지원 | 제한적 | 잔차 분석, 회귀 계수 추정 등 다양한 통계적 분석 가능 |
f_oneway는 단순한 그룹 간 평균 차이 검정, F-통계량과 p-value를 반환하여 그룹 간 평균 차이가 있는지 판단ols와 anova_lm는 회귀 분석 기반의 ANOVA를 수행, 더 확장된 분석(여러 요인, 상호작용, 공변량 분석 등)을 지원, 더 자세한 ANOVA 테이블과 통계 정보