Summary
3개 이상 독립 집단의 분포를 비교하는 비모수 검정. One-way ANOVA의 비모수 대안. Mann-Whitney U test의 다집단 확장이며, 순위 기반으로 검정한다.
용어 설명
- 순위 기반 검정 (Rank-based test): 원래 데이터 값 대신 **크기 순서(순위)**를 이용하는 검정. 이상치에 강건하고 분포 가정 불필요
- 동점 (Ties): 여러 관측치가 같은 값을 가질 때. 평균 순위를 부여하며, 동점이 많으면 H 통계량에 보정 필요
- Dunn’s test: Kruskal-Wallis 유의 시 수행하는 사후 검정. 어떤 집단 쌍이 다른지 순위 기반으로 비교
- χ² 근사: 표본이 충분히 크면 H 통계량이 자유도 k−1인 카이제곱 분포에 근사
Kruskal-Wallis Test
언제 사용하는가?
- One-way ANOVA 대안: 정규성 가정 위반, 소표본
- 순서형 데이터: 연속형이 아닌 순서 척도
- 이상치 존재: 순위 기반이므로 극단값에 강건
→ 통계 검정법 개요 의사결정 플로우차트 참조
검정 통계량
수식 변수 풀이
- : Kruskal-Wallis 통계량 — 집단 간 순위 차이가 클수록 값이 커짐
- : 전체 관측치 수 (모든 집단 합산)
- : 집단 수 (예: 3개 교수법이면 k = 3)
- : 집단 i의 관측치 수
- : 집단 i의 순위합 — 전체를 합쳐서 순위를 매긴 후 해당 집단의 순위를 모두 더한 값
- 직관: “각 집단의 평균 순위가 얼마나 다른가?” → 모든 집단의 평균 순위가 비슷하면 H ≈ 0
-
: 전체 관측치 수
-
: 집단 수
-
: 집단 i의 관측치 수
-
: 집단 i의 순위합
-
동점(ties) 보정:
수식 변수 풀이
- : 동점 보정된 H 통계량
- : 각 동점 그룹의 동점 개수 (예: 3개 값이 같으면 t = 3)
- 보정 효과: 동점이 많으면 분모가 1보다 작아져 → 검정이 약간 더 보수적
- 대표본 근사:
가설
- : 모든 집단의 분포가 동일하다
- : 적어도 하나의 집단이 다른 분포를 가진다
사후 검정 필요
ANOVA처럼 H₀ 기각 시 “어떤 집단이 다른지”는 알 수 없다.
→ Dunn’s test (사후 검정) 필요
가정
| 가정 | 설명 |
|---|---|
| 독립 표본 | 집단 간, 집단 내 관측치 독립 |
| 순서 척도 이상 | 순위 부여가 가능해야 함 |
| 유사한 분포 형태 | 분포의 위치(location) 차이만 검정 |
사후 검정: Dunn’s Test
Kruskal-Wallis가 유의하면, 모든 쌍별 비교:
수식 변수 풀이
- : 집단 i, j의 평균 순위
- 분모: 두 집단의 평균 순위 차이에 대한 표준오차
- 직관: “두 집단의 평균 순위 차이가 우연에 의한 것인지?” → |z|가 크면 유의
다중비교 보정 필요: Bonferroni, Holm, Benjamini-Hochberg 등
Effect Size: Epsilon-squared (ε²)
수식 변수 풀이
- : Epsilon-squared — Kruskal-Wallis의 효과 크기. 0~1 범위
- 해석 기준은 η²와 동일: 0.01(small), 0.06(medium), 0.14(large)
- 직관: “순위 변동 중 집단 차이가 설명하는 비율”
또는 eta-squared 근사:
| ε² 값 | 해석 |
|---|---|
| 0.01 | Small |
| 0.06 | Medium |
| 0.14 | Large |
Example
3개 교수법(A, B, C), 각 8명, 시험 점수:
집단 점수 A 65, 70, 72, 68, 71, 67, 69, 74 B 78, 82, 75, 80, 77, 83, 79, 81 C 60, 63, 58, 65, 62, 59, 64, 61 → 정규성 위반 or 소표본 → Kruskal-Wallis 사용
→ H 유의 시 Dunn’s test로 A-B, A-C, B-C 쌍별 비교
Implementation
from scipy import stats import scikit_posthocs as sp # pip install scikit-posthocs import pingouin as pg # === Kruskal-Wallis === h_stat, p = stats.kruskal(group_a, group_b, group_c) print(f"H={h_stat:.2f}, p={p:.4f}") # === Dunn's test (사후 검정) === import pandas as pd df = pd.DataFrame({ 'score': list(group_a) + list(group_b) + list(group_c), 'group': ['A']*len(group_a) + ['B']*len(group_b) + ['C']*len(group_c) }) dunn = sp.posthoc_dunn(df, val_col='score', group_col='group', p_adjust='bonferroni') print(dunn) # === pingouin === result = pg.kruskal(data=df, dv='score', between='group') print(result) # === effect size (epsilon-squared) === import numpy as np N = len(df) epsilon_sq = h_stat / (N - 1) print(f"ε² = {epsilon_sq:.3f}")
ANOVA vs Kruskal-Wallis 선택 기준
| 기준 | ANOVA | Kruskal-Wallis |
|---|---|---|
| 정규성 | 충족 | 위반 |
| 표본 크기 | 충분 (n > 30/집단) | 소표본 가능 |
| 검정력 | 가정 충족 시 높음 | 약간 낮음 (순위 정보 손실) |
| 이상치 | 민감 | 강건 |
| 사후 검정 | Tukey, Bonferroni | Dunn’s test |
실용 가이드
n > 30이고 극단적 비정규가 아니면 ANOVA가 robust. 소표본이거나 명확한 비정규 시 Kruskal-Wallis.
관련 문서
- ANOVA — 모수 대안
- Mann-Whitney U test — 2집단 비모수 (Kruskal-Wallis의 특수 사례)
- Post-hoc(사후 검정) — ANOVA 사후 검정 방법들
- 통계 검정법 개요 — 모수/비모수 대응표