Wilcoxon과 Friedman으로 반복측정 데이터를 비모수로 비교하는 법

반복측정 데이터에 Wilcoxon 부호순위 검정과 Friedman 검정을 적용하는 조건, 통계량, 효과크기, 사후검정, Python·R 구현 및 보고 기준을 정리합니다.

2026-08-14 · 최초 발행 2024-04-29

반복측정 비교에서 순위 기반 검정을 고르는 기준

같은 대상에게서 얻은 측정값은 독립 표본처럼 다루기 어렵다. 두 조건의 사전·사후 변화처럼 대응된 값이 있고 차이 분포의 정규성을 확신하기 어렵다면 Wilcoxon 부호순위 검정이 대안이 된다. 세 개 이상 조건을 동일 대상 또는 블록에서 비교할 때는 Friedman 검정이 전체 차이를 먼저 판단하는 방법이다.

Wilcoxon 부호순위 검정은 두 대응 조건의 중앙값 차이를 검정한다. 차이값이 중앙값을 중심으로 대칭이라는 가정은 필요하지만 정규성은 요구하지 않으며, 순위 기반 통계량을 사용하므로 이상치에 강건하다.

Friedman 검정은 반복측정 또는 블록 설계에서 처리 간 중앙 순위 차이를 검정하는 omnibus 절차다. 각 피험자 또는 블록 안에서 조건의 순위를 매기고, 처리별 순위합으로 통계량을 계산한다. 반복측정 분산분석(rANOVA)의 비모수 대응 절차로 볼 수 있다.

대응 t-검정에는 Wilcoxon 부호순위 검정이, rANOVA에는 Friedman 검정이 각각 대응한다.

설계와 데이터 처리에서 먼저 확인할 점

Wilcoxon 검정은 같은 개체에서 두 조건을 비교하는 설계에 맞는다. 측정척도는 최소 서열 이상이어야 하며, 조건 간 차이 분포가 중앙값을 중심으로 대칭이라는 전제를 둔다.

Friedman 검정에서는 각 개체가 k(≥3) 조건을 모두 측정한다. 블록은 서로 독립이어야 하고, 블록 내부에서 순위화할 수 있어야 한다. 구형성 가정은 필요하지 않다.

결측값은 대응 관계를 깨뜨릴 수 있으므로 리스트와이즈로 페어를 제거한다. Wilcoxon에서는 0 차이를 제외하고, 동점은 평균순위로 처리한다. 검정 전에 가설, 유의수준, 양측·단측 여부를 정해 두고 사용할 근사와 보정 옵션도 함께 명시한다.

통계량이 만들어지는 방식

Wilcoxon에서는 먼저 차이 di=Yi−Xi를 구한다. 0인 차이를 제외한 뒤 |di|를 순위화하고, 동점에는 평균순위를 부여한다. 부호별 순위합 W+, W−를 계산한 다음 정규근사 또는 정확검정으로 p-값을 구한다.

Friedman 검정은 블록마다 k개 조건을 1~k로 순위화하는 데서 시작한다. 동점은 평균순위를 사용하고, 처리별 순위합 Rj를 구한다. 검정통계량은 다음과 같다.

Q = (12/(n·k·(k+1)))·ΣRj² − 3n(k+1)

p-값은 df=k−1의 카이제곱 근사 또는 Iman–Davenport F 근사로 계산한다.

효과크기와 사후분석을 함께 남긴다

Wilcoxon의 효과크기는 r = |z|/√n’로 표현할 수 있으며, n’은 0이 아닌 쌍의 수다. 중앙값 차이의 신뢰구간에는 부호검정 기반 Hodges–Lehmann 추정치를 사용하는 방식을 권장한다.

Friedman의 효과크기인 Kendall의 W는 다음과 같이 계산한다.

Kendall의 W = Q / (n·k·(k−1))

값의 범위는 0~1이며, 0은 무효과, 1은 완전 일치를 뜻한다. 전체 검정 뒤의 비교에는 Nemenyi를 사용할 수 있고, Conover와 Holm 보정을 함께 쓰는 방식도 실무에서 권장된다. Nemenyi는 등분산 가정을 둔다.

Wilcoxon에서는 n’≤20일 때 정확검정을 권장하며, n’≥10~15에서는 정규근사가 실무적으로 적합하다. 효과가 작고 변동이 크면 표본 수에 민감하다. Friedman은 n≥10, k≤6 환경에서 안정적이며, 사후 다중비교는 검정력을 분산시키므로 Holm 또는 Benjamini–Hochberg 보정으로 균형을 잡는다.

제품·품질·모델 평가에 적용하는 모습

UX와 제품 업무에서는 동일 사용자의 과업시간 전후 비교에 Wilcoxon을 쓸 수 있다. 3개 UI 프로토타입의 주관적 순위는 Friedman 검정 뒤 Nemenyi 사후검정으로 비교한다.

알고리즘 성능 비교에서는 n개 데이터셋에서 k개 모델의 점수를 Friedman으로 비교하고, 사후검정으로 최상위 모델을 식별한다. 제조·품질 영역에서는 공정개선 전후 스크랩률에 Wilcoxon을 적용하고, 3개 파라미터 설정의 결함 수는 Friedman으로 비교할 수 있다. 환자군의 사전·사후 지표 변화와 3시점 이상 종속측정의 치료효과도 각각 이 두 절차의 대상이 된다.

분석 결과에는 데이터 구조와 가정 확인 방식, 적용 절차, 통계량, p-값, 효과크기, 한계를 함께 기록한다. 사후분석을 했다면 다중비교 보정 방법과 신뢰구간도 남긴다.

검정 선택부터 보고까지의 흐름

2조건, 대응3조건 이상, 반복측정/블록작음충분아니오연구 설계 파악조건Wilcoxon 부호순위 검정Friedman 검정전처리: di=Yi−Xi, di=0 제거,|di| 순위화통계량: W+, W− z 근사표본 규모정확검정정규 근사 + 연속성 보정효과크기 r, HL 추정치 CI전처리: 블록 순위화, 처리별순위합 Rj통계량 Q, χ²(df=k−1) 또는Iman–Davenport F유의사후검정: Nemenyi/Conover+ Holm보고:가정·절차·p·효과크기·CI·보정품질관리: 결측/동점/이상치처리 명시

검정별 운영상 차이

항목 Wilcoxon 부호순위 Friedman
성능(복잡도) O(n log n) 순위화 O(n·k log k) 블록 내 순위화
확장성 수천 쌍까지 실무 무리 없음 n·k가 수만 단위까지 실무 가능
일관성(가정 민감도) 차이 대칭성 위반 시 보수적 블록 독립성/일관된 순위화 중요
안정성(이상치) 순위 기반으로 강건 순위 기반으로 강건
운영 편의 패키지 기본 제공, 해석 단순 사후검정·보정 필요로 보고 복잡도↑

Python과 R에서 재현하는 최소 예제

사용 환경은 Python 3.10+, scipy>=1.9, scikit-posthocs>=0.7.0 또는 R 4.2+, stats 기본 패키지와 PMCMRplus(옵션)다. 동점과 결측 처리, 보정 옵션을 코드와 보고서에 명시하고 분석계획 사전등록, 시드 고정, 버전 기록을 통해 재현성을 확보한다.

Python (SciPy)

# python 3.10+, scipy 1.11, scikit-posthocs 0.7.0
import numpy as np
from scipy.stats import wilcoxon, friedmanchisquare
import scikit_posthocs as sp

# 1) Wilcoxon: 사전-사후
pre  = np.array([10, 12, 9, 15, 14, 11, 13, 10, 12, 16])
post = np.array([12, 12, 10, 14, 15, 12, 14, 11, 12, 15])

stat, p = wilcoxon(post, pre, alternative="two-sided", zero_method="wilcox")
n_nonzero = np.sum((post - pre) != 0)
# 정규근사 z 스코어 추출은 SciPy에서 직접 제공하지 않음 → 효과크기는 대안적으로 부호화된 r 추정 생략 또는 보고 생략
print(f"Wilcoxon W+={stat:.1f}, p={p:.4f}, n'={n_nonzero}")

# 2) Friedman: 3개 처리의 반복측정
A = np.array([0.72, 0.75, 0.78, 0.70, 0.74])
B = np.array([0.74, 0.76, 0.80, 0.69, 0.73])
C = np.array([0.71, 0.77, 0.79, 0.68, 0.72])

Q, p_f = friedmanchisquare(A, B, C)
print(f"Friedman Q={Q:.3f}, p={p_f:.4f}")

# 사후검정: Nemenyi (모든 쌍 비교, p-값 보정 내장)
data = np.vstack([A, B, C]).T  # shape: (subjects, treatments)
nemenyi = sp.posthoc_nemenyi_friedman(data)
print(nemenyi)

zero_method="wilcox"는 Wilcoxon에서 0 차이를 제거하는 절차다. "pratt"를 선택하면 분산 보정 방식이 달라진다. Friedman의 Nemenyi 사후검정에는 scikit-posthocs의 posthoc_nemenyi_friedman을 사용한다.

R

# R 4.2+, packages: stats, PMCMRplus(optional)
pre  <- c(10,12,9,15,14,11,13,10,12,16)
post <- c(12,12,10,14,15,12,14,11,12,15)

# 1) Wilcoxon
wilcox.test(post, pre, paired = TRUE, alternative = "two.sided", exact = FALSE, correct = TRUE)

# 2) Friedman
A <- c(0.72,0.75,0.78,0.70,0.74)
B <- c(0.74,0.76,0.80,0.69,0.73)
C <- c(0.71,0.77,0.79,0.68,0.72)

df <- data.frame(
  subj = factor(1:5),
  A = A, B = B, C = C
)
m <- as.matrix(df[, c("A","B","C")])
friedman.test(m)

# 사후검정: Nemenyi (PMCMRplus)
# install.packages("PMCMRplus")
# PMCMRplus::frdAllPairsNemenyiTest(m)

Wilcoxon 보고에는 W 통계량, n’(0 제외 쌍 수), p-값, r 또는 Hodges–Lehmann 추정치와 CI, 대칭성 가정 언급을 포함한다. Friedman 보고에는 Q, df, p-값, Kendall의 W, 보정 방법을 포함한 사후검정 결과를 남긴다.

가정이 불확실한 반복측정 분석의 효과

이상치·비정규 데이터에서는 오탐지율(FPR)을 안정화하고 재현성을 ±5~10% 수준으로 개선할 수 있다. 다중비교 보정을 적용하면 과대해석 위험을 낮추고 가족단위 오류율(FWER)을 통제한다.

가정 충족 여부가 불확실한 상황에서도 의사결정의 신뢰성을 높일 수 있으며, 처리 절차를 표준화하면 분석과 리뷰 사이의 커뮤니케이션 비용도 줄어든다. 조직의 파이프라인과 코드 템플릿에 이 절차를 반영하면 분석 품질과 속도를 함께 개선할 수 있다.

비모수 검정Wilcoxon 검정Friedman 검정반복측정통계 분석