HOME
home
About
home

ANOVA

**일원분산분석(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): 각 집단 내에서 개별 데이터가 집단 평균과 얼마나 다른지 나타내는 변동
SST=SSB+SSESST = SSB + SSE

3.2 F 통계량

분산분석의 핵심 지표는 F 통계량이며, 보통 다음과 같이 정의됩니다.
F=MSBMSEF = \frac{MSB}{MSE}
MSBMSB (Between Mean Square):
SSB/(k1)SSB / (k - 1)
MSEMSE (Error Mean Square):
SSE/(Nk)SSE / (N - k)
여기서 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_onewaystatsmodelsanova_lm을 통해 손쉽게 ANOVA를 수행하고, pairwise_tukeyhsd 함수로 Tukey 사후검정을 진행할 수 있음.
이러한 절차와 코드를 숙지해두면, 실제 데이터에서 3개 이상의 집단 평균을 비교해야 할 때 빠르고 정확하게 분석을 수행할 수 있습니다. 필요한 경우, Welch ANOVA나 Kruskal-Wallis 검정 등 가정이 덜 엄격한 대안들도 함께 고려할 수 있다는 점을 기억해두시기 바랍니다.
참고자료
Copyright ⓒ TeamSparta All rights reserved.