일원 ANOVA로 그룹 평균 차이 검정하기: F-통계량과 등분산 점검
일원 ANOVA의 F-통계량, 정규성·등분산 가정, Levene 검정과 Welch ANOVA, 사후검정 선택 기준을 정리한다.
2026-08-14 · 최초 발행 2024-04-29
평균 차이는 F-통계량만으로 읽지 않는다
일원 ANOVA는 하나의 요인(독립변수)으로 구분한 여러 그룹의 종속변수 평균이 같은지 검정하는 방법이다. 귀무가설 H0는 모든 그룹 평균이 동일하다는 것이며, 대립가설 H1은 적어도 하나의 그룹 평균이 다르다는 것이다.
검정의 중심에는 집단간 평균 제곱(MSB)과 집단내 평균 제곱(MSW)의 비율이 있다.
F = MSB / MSW
F 값이 클수록 집단 내부의 변동에 비해 그룹 간 평균 차이 신호가 크다는 뜻이다. 다만 유의성 판단 전에 관측치의 독립성, 각 그룹 잔차의 정규성, 그룹 간 등분산성을 함께 확인해야 한다.
유의한 결과가 나왔다고 해서 어느 그룹이 다른지는 바로 알 수 없다. 등분산 가정이 충족되면 Tukey HSD를, 가정이 깨졌다면 Games–Howell을 사후검정으로 선택할 수 있다. 차이의 실질적 크기는 η² 또는 ω²로 해석한다.
분산을 나누고 가정을 확인하는 흐름
총제곱합(SS)은 집단간 제곱합(SSB)과 집단내 제곱합(SSW)으로 나뉜다. 각 제곱합을 자유도로 나눠 평균제곱(MS)을 구하고, 여기서 F-통계량과 p-값을 도출한다.
표본 크기가 불균형하면 가중 평균을 반영해야 하며, 극단값은 MSW를 왜곡할 수 있다. 분석 전에 잔차와 데이터 품질을 확인하는 이유다.
정규성은 QQ-plot, Shapiro–Wilk, 잔차 진단으로 살핀다. 등분산성은 Levene 검정의 center=mean 또는 center=median 설정, 혹은 Brown–Forsythe로 점검한다. Bartlett 검정은 정규성에 민감하다.
등분산성이 충족되지 않으면 Welch ANOVA, 로그 또는 Box–Cox 변환, 로버스트 방법을 검토할 수 있다. 정규성 위반이 심하면 Kruskal–Wallis 같은 비모수 대안도 선택지다.
등분산 검정은 데이터 상태에 맞춰 고른다
| 검정 | 정규성 민감도 | 등분산 위반 강건성 | 이상치 민감도 | 권고 상황 |
|---|---|---|---|---|
| Levene (mean) | 중간 | 중간 | 중간 | 표본수 중간 이상, 대략적인 강건성 필요 |
| Brown–Forsythe (median) | 낮음 | 높음 | 낮음 | 정규성 의심, 이상치 존재 가능 |
| Bartlett | 높음 | 낮음 | 높음 | 정규성 확신, 깔끔한 데이터 |
실무에서는 Brown–Forsythe를 우선 적용하는 방식을 권장한다.
사후검정도 데이터 조건과 비교 목적에 따라 달라진다. Tukey HSD는 등분산성과 유사한 표본수 조건에서 전체 유의수준(패밀리와이즈)을 통제한다. Games–Howell은 등분산 위반과 표본수 불균형에 강건하다. 대조군과 비교할 때는 Dunnett을, 다중비교 보정에는 Holm 또는 Benjamini–Hochberg를 적용할 수 있다.
분석 결과가 쓰이는 장면
제조 공정에서는 라인 A/B/C의 치수 편차 평균을 비교해 공정 변경 효과와 공정능력 개선 여부를 판단할 수 있다. 마케팅 실험에서는 3개 프로모션 유형의 평균 객단가를 비교하고, 유의한 차이가 확인된 뒤 효율적인 프로모션을 선별한다.
교육·의학 연구에서는 수업 방식이나 치료 군 사이의 평균 점수 또는 지표를 비교하고, 사후검정으로 차이를 주도한 군을 찾는다. SaaS 제품에서는 기능 버전별 평균 사용시간을 비교해 릴리즈 의사결정과 롤백 기준을 세울 수 있다.
이런 분석은 다중 그룹 평균 비교 절차를 표준화하고, 다중비교 보정으로 1종 오류를 통제하는 데 쓰인다. 자동화 가능한 분석 파이프라인과 리포트 템플릿을 운영하면 재현성과 보고 일관성도 높일 수 있다. 유의 차이를 근거로 변경 도입·중단을 판단해 실험 비용을 줄이는 데도 활용된다.
입력부터 예외 처리까지 갖춰야 할 기준
입력 데이터는 (value, group) 형태의 장형 데이터가 적합하다. 그룹 수는 3 이상, 각 그룹은 n ≥ 2를 권장하며 극단적인 표본 불균형은 피한다.
처리 과정에서는 결측 제거 또는 대체와 이상치 점검을 먼저 수행한다. 그룹별 Shapiro–Wilk와 Levene 또는 Brown–Forsythe로 가정을 확인한 뒤, 등분산성이 충족되면 일원 ANOVA를 적용하고 위반되면 Welch ANOVA를 적용한다. 이후 Tukey HSD 또는 Games–Howell을 수행하고 효과크기와 신뢰구간을 함께 보고한다.
결과 표에는 F, df_between, df_within, p-값, η² 또는 ω²를 포함한다. 사후검정 결과는 비교쌍, 평균차, CI, p-보정을 제시하고, 통계적 유의성과 실질적 유의성은 분리해 서술한다.
그룹 수가 부족하거나 단일 관측 그룹이 있으면 분석을 중단하고 데이터 수집을 다시 설계한다. 심각한 이상치가 탐지되면 로버스트 대안이나 변환 지침을 제시하며, 표본이 매우 불균형하면 Welch ANOVA를 우선한다.
Python으로 검정과 사후분석 실행하기
전제조건: Python 3.10+, numpy, pandas, scipy>=1.9, statsmodels>=0.14, pingouin(옵션, Games–Howell)
# pip install numpy pandas scipy statsmodels pingouin
import numpy as np
import pandas as pd
from scipy.stats import shapiro, levene, f_oneway
from statsmodels.stats.oneway import anova_oneway
from statsmodels.stats.multicomp import pairwise_tukeyhsd
# 1) 예시 데이터 생성
rng = np.random.default_rng(42)
A = rng.normal(10, 2.0, 40)
B = rng.normal(11, 2.0, 38)
C = rng.normal(13, 2.0, 42)
df = pd.DataFrame({
"value": np.concatenate([A, B, C]),
"group": (["A"]*len(A) + ["B"]*len(B) + ["C"]*len(C))
})
# 2) 정규성 점검(그룹별)
for g, vals in df.groupby("group")["value"]:
stat, p = shapiro(vals)
print(f"Shapiro {g}: W={stat:.3f}, p={p:.3f}")
# 3) 등분산 점검(Levene; Brown–Forsythe는 center='median')
groups = [df.loc[df.group==g, "value"].values for g in df["group"].unique()]
lev_stat, lev_p = levene(*groups, center='median') # Brown–Forsythe
print(f"Levene(BF): W={lev_stat:.3f}, p={lev_p:.3f}")
# 4) 본검정
if lev_p >= 0.05:
# 등분산 가정 충족 → 고전적 일원 ANOVA
F, p = f_oneway(*groups)
print(f"ANOVA(equal var): F={F:.3f}, p={p:.5f}")
# 효과크기(η²) 계산
grand_mean = df["value"].mean()
ssb = sum(len(gv)*(gv.mean() - grand_mean)**2 for gv in [df[df.group==g]["value"] for g in df.group.unique()])
ssw = sum(((df[df.group==g]["value"] - df[df.group==g]["value"].mean())**2).sum() for g in df.group.unique())
eta2 = ssb / (ssb + ssw)
print(f"eta^2={eta2:.3f}")
# 사후검정: Tukey HSD
res = pairwise_tukeyhsd(endog=df["value"], groups=df["group"], alpha=0.05)
print(res.summary())
else:
# 등분산 위반 → Welch ANOVA
res = anova_oneway(groups, use_var='unequal', welch_correction=True)
print(res) # table: statistic, pvalue, dof
# 사후검정: Games–Howell (pingouin)
try:
import pingouin as pg
gh = pg.pairwise_gameshowell(dv="value", between="group", data=df)
print(gh[["A","B","mean(A)-mean(B)","pval","CI95%"]])
except ImportError:
print("pingouin 미설치: pip install pingouin 후 Games–Howell 사용 권장")
Shapiro p≥0.05가 다수이고 Levene p≥0.05이면 고전적 ANOVA 수행이 적합하다고 판단한다. 유의한 결과에서는 사후검정과 효과크기를 동시에 보고한다.
보고 체계에서 생기는 선택의 차이
사전 설계 단계에서는 Cohen’s f에 따른 효과크기 가정, 표본수 산정, 무작위배정 절차를 정한다. 분석 뒤에는 가정 검정, 본검정, 사후검정, 효과크기, CI를 한 리포트에 포함해 진단 결과를 표준화한다. Brown–Forsythe와 Welch ANOVA 같은 로버스트 옵션도 기본 선택지로 둔다.
로버스트 검정은 보수성이 커져 검정력이 감소할 수 있다. 로그 같은 변환은 해석의 직관성을 낮출 수 있고, 다중비교 보정을 강화하면 탐지 민감도도 낮아진다. 이 선택들은 데이터 상태와 분석 목적을 함께 놓고 판단해야 한다.