**일원분산분석(One-way ANOVA)**을 중심으로, 개념부터 가정, 수학적 배경, 절차, 사후검정, 그리고 Python 실습 예시까지 순차적으로 정리한 내용입니다. 실제 연구나 실무에서 3개 이상의 집단 평균을 비교할 때 가장 일반적으로 사용하는 통계 기법이니, 전체 흐름을 한 번에 살펴볼 수 있도록 구성했습니다.
1. 개요
1.1 기본 개념
•
ANOVA(Analysis of Variance, 분산분석)는 3개 이상의 집단 평균 차이를 동시에 비교하기 위한 통계 기법입니다.
•
“집단 A, B, C 간에 종속변수(연속형)의 평균값이 서로 같은가?”를 검정할 때, 각 집단 간 평균 차이를 분산(Variance)을 이용해서 분석합니다.
•
한 가지 독립변수(요인 Factor)에 여러 수준(Level)이 존재하고, 종속변수가 연속형인 경우를 일원분산분석(One-way ANOVA)라고 부릅니다.
1.2 예시 시나리오
•
교육 프로그램 A, B, C(세 종류)가 학습 성과(시험 점수)에 미치는 영향을 비교하고 싶을 때
•
다이어트 약/운동/식이요법(세 가지 방법)이 체중 감소량에 미치는 효과를 비교하고 싶을 때
2. 가정(Assumptions)
ANOVA는 다음과 같은 전제 조건을 바탕으로 합니다.
1.
정규성(Normality): 각 집단의 종속변수가 정규분포를 따른다고 가정
2.
등분산성(Homogeneity of variance): 각 집단의 분산이 동일하다고 가정 (Bartlett test, Levene test 등으로 확인)
3.
독립성(Independence): 표본들이 서로 독립적이어야 함 (한 대상이 여러 집단에 중복 참여 X)
만약 정규성이나 등분산성 가정이 크게 위배된다면, Welch ANOVA(등분산성 미가정)나 Kruskal-Wallis 검정(비모수적 대안)을 고려할 수 있습니다.
3. 수학적 배경
3.1 분산분석(ANOVA)의 아이디어
•
총제곱합(SST: Total Sum of Squares): 전체 변동(집단 간 변동 + 집단 내 변동)
•
집단 간 제곱합(SSB: Between-groups Sum of Squares): 집단별 평균(집단 중심) 간의 차이로 인한 변동
•
집단 내 제곱합(SSE: Error Sum of Squares): 각 집단 내에서 개별 데이터가 집단 평균과 얼마나 다른지 나타내는 변동
3.2 F 통계량
•
분산분석의 핵심 지표는 F 통계량이며, 보통 다음과 같이 정의됩니다.
•
MSBMSB (Between Mean Square):
•
MSEMSE (Error Mean Square):
◦
여기서 k는 집단 수 ,
◦
N 은 전체 표본 수.
귀무가설(H0H_0): 모든 집단의 평균은 동일하다
대립가설(H1H_1): 적어도 한 집단의 평균은 다르다
만약 그룹 간 차이가 크면 MSB가 커져서 F 값이 커지고, 귀무가설을 기각(집단 평균 차이 존재)하게 됩니다.
4. 절차
1.
데이터 수집: 예) 3개 집단(A, B, C), 각 집단 별로 10명에게서 종속변수를 측정
2.
가정 확인
•
정규성: 각 집단에 대해 Shapiro-Wilk test 또는 Kolmogorov-Smirnov test 등을 수행
•
등분산성: Levene's test, Bartlett's test로 확인
3.
ANOVA 수행
•
분산분석 표(ANOVA table)에서 F 통계량과 p-값 도출
•
p < 0.05일 경우, “적어도 한 집단의 평균이 다른 집단과 유의한 차이”
4.
사후검정(Post-hoc test)
•
집단이 3개 이상이면, 유의미한 차이가 나는 “특정 집단 간” 쌍별 비교를 해야 함
•
Tukey HSD, Scheffé, Bonferroni 등의 다중비교 방법
5.
결과 해석
•
ANOVA 결과 + 사후검정 결과, 각 집단 간 어떤 차이가 존재하는지 종합적으로 보고
5. 사후검정(Post-hoc tests)
5.1 주요 기법
•
Tukey HSD(Test)
◦
등분산 가정이 충족되고, 표본 크기도 비슷한 경우 자주 사용
◦
직관적이고 쉬운 해석 가능
•
Bonferroni
◦
쌍별 t-검정에 대한 유의수준 보정을 적용
◦
보수적 보정(유의수준이 많이 낮아짐)
•
Scheffé
◦
보수적인 방법으로, 표본 크기가 다르거나 가정이 조금 깨져도 적용 가능
5.2 사후검정 결과 해석
•
어떤 두 집단 간 평균 차이가 p < 0.05로 유의하다면, 그 두 집단 사이에 통계적으로 의미 있는 차이가 있다고 결론 내립니다.
•
모든 쌍별 비교(pairs) 결과를 표로 정리하는 경우가 많음.
6. Python 예시 코드 (One-way ANOVA)
아래 예시는 Python에서 **scipy.stats**와 statsmodels 라이브러리를 사용해 일원분산분석을 수행하고, Tukey 사후검정까지 해보는 데모입니다.
import numpy as np
import pandas as pd
from scipy.stats import f_oneway
# statsmodels 패키지로 ANOVA & Post-hoc
import statsmodels.api as sm
from statsmodels.formula.api import ols
from statsmodels.stats.multicomp import pairwise_tukeyhsd
# ------------------------------------------------
# 1) 예시 데이터 생성
# ------------------------------------------------
np.random.seed(42)
group_A = np.random.normal(loc=50, scale=5, size=30) # A 집단
group_B = np.random.normal(loc=55, scale=5, size=30) # B 집단
group_C = np.random.normal(loc=60, scale=5, size=30) # C 집단
df = pd.DataFrame({
'score': np.concatenate([group_A, group_B, group_C]),
'group': ['A']*30 + ['B']*30 + ['C']*30
})
# ------------------------------------------------
# 2) SciPy를 이용한 간단 ANOVA
# ------------------------------------------------
f_stat, p_val = f_oneway(group_A, group_B, group_C)
print("== One-way ANOVA (SciPy) ==")
print(f"F-statistic = {f_stat:.4f}, p-value = {p_val:.4f}\n")
# ------------------------------------------------
# 3) StatsModels를 이용한 ANOVA
# ------------------------------------------------
model = ols('score ~ C(group)', data=df).fit()
anova_table = sm.stats.anova_lm(model, typ=2)
print("== ANOVA Table (StatsModels) ==")
print(anova_table)
# ------------------------------------------------
# 4) 사후검정 (Tukey HSD)
# ------------------------------------------------
tukey_result = pairwise_tukeyhsd(endog=df['score'],
groups=df['group'],
alpha=0.05)
print("\n== Tukey Post-hoc Test ==")
print(tukey_result)
# 요약 해석
# - ANOVA 결과 p < 0.05라면, 세 집단 간 평균에 통계적 유의 차이가 있음.
# - Tukey 결과를 보면, 어떤 집단 간 차이가 유의한지(pairwise) 표시됨.
Python
복사
실행 결과 해석
1.
ANOVA F 통계량 & p-값
•
SciPy 또는 StatsModels 결과에서 p-value < 0.05라면, “적어도 하나의 집단 평균이 다른 집단과 유의미하게 다르다”로 판단합니다.
2.
Tukey 사후검정
•
A-B, A-C, B-C 쌍별로 비교한 p-값을 제공
•
p-값 < 0.05인 쌍이 있다면, 그 두 집단 사이 차이가 유의함을 의미
7. 확장: 이원분산분석(Two-way ANOVA) & 반복측정 ANOVA
•
이원분산분석: 독립변수(요인)가 2개일 때(예: 교육방식과 성별). 주효과(Main effect)와 상호작용효과(Interaction)까지 검정.
•
반복측정 ANOVA: 동일한 집단이 여러 시간/조건에서 측정된 데이터(예: 전후 검사). 종속표본 t-검정의 확장판으로, 구형성(sphericity) 가정 등을 추가로 고려.
이러한 확장 모델들은 실험설계(교육연구, 심리실험 등)에서 매우 자주 사용됩니다.
8. 결과 보고 시 팁
1.
기본 통계치: 각 집단의 평균, 표준편차, 표본 크기 제시
2.
ANOVA 표: F 값, 자유도(df), p-값, 효과크기( 등)
η2\eta^2
3.
사후검정: 어떤 집단 간 차이가 유의미한지 명시
4.
가정 충족 여부: 정규성, 등분산성 검정 결과 간단히 언급
5.
시각화: 박스플롯, 에러바 플롯 등을 통해 집단 간 평균/분포 차이 시각적으로 표현
9. 요약
•
*일원분산분석(One-way ANOVA)**는 세 개 이상의 독립 집단 간 종속변수의 평균 차이를 검정하는 대표적인 방법.
•
전제되는 정규성, 등분산성, 독립성 가정을 만족해야 신뢰도 높은 결과를 얻을 수 있음.
•
결과가 유의하다면, 사후검정을 통해 구체적으로 어느 집단 사이에 차이가 있는지 파악해야 함.
•
Python에서는 scipy.stats.f_oneway나 statsmodels의 anova_lm을 통해 손쉽게 ANOVA를 수행하고, pairwise_tukeyhsd 함수로 Tukey 사후검정을 진행할 수 있음.
이러한 절차와 코드를 숙지해두면, 실제 데이터에서 3개 이상의 집단 평균을 비교해야 할 때 빠르고 정확하게 분석을 수행할 수 있습니다. 필요한 경우, Welch ANOVA나 Kruskal-Wallis 검정 등 가정이 덜 엄격한 대안들도 함께 고려할 수 있다는 점을 기억해두시기 바랍니다.
참고자료
Copyright ⓒ TeamSparta All rights reserved.