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.01Small
0.06Medium
0.14Large

Example

3개 교수법(A, B, C), 각 8명, 시험 점수:

집단점수
A65, 70, 72, 68, 71, 67, 69, 74
B78, 82, 75, 80, 77, 83, 79, 81
C60, 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 선택 기준

기준ANOVAKruskal-Wallis
정규성충족위반
표본 크기충분 (n > 30/집단)소표본 가능
검정력가정 충족 시 높음약간 낮음 (순위 정보 손실)
이상치민감강건
사후 검정Tukey, BonferroniDunn’s test

실용 가이드

n > 30이고 극단적 비정규가 아니면 ANOVA가 robust. 소표본이거나 명확한 비정규 시 Kruskal-Wallis.


관련 문서