Skip to Content

윌콕슨 부호순위 검정 (Wilcoxon Signed-Rank Test)

아래는 **윌콕슨 부호 순위 검정(Wilcoxon Signed-Rank Test)**에 대한 개념과 Python 예시를 정리한 내용입니다. 이 검정은 대응 표본(related samples) 간의 차이를 비교하기 위해 사용되는 비모수적(non-parametric) 검정입니다.


1. 개념 정리

1.1 Wilcoxon Signed-Rank Test란?

  • Wilcoxon Signed-Rank Test대응 표본(또는 짝지어진 자료)에서 두 시점(또는 두 조건)의 중앙값 차이를 검정하는 비모수적 방법입니다.
  • 예를 들어, 치료 전과 치료 후 같은 동일한 대상(환자)을 두 번 측정했을 때, “두 시점의 측정값 중앙값이 달라졌는지”를 검정합니다.
  • *대응 표본 T 검정( Paired t-test )**의 비모수적 대체 방법으로 볼 수 있습니다. 즉, 정규성 가정이 어렵거나, 표본 크기가 작아 정규 분포를 가정하기 힘든 경우에 Wilcoxon Signed-Rank Test를 사용합니다.

1.2 가설 설정

  • 귀무가설(H₀): “두 시점(조건)의 중앙값 차이는 0이다.” (또는 “차이가 없다.”)
  • 대립가설(H₁): “두 시점(조건)의 중앙값 차이가 0이 아니다.” (양측 검정)

단측 검정도 가능하지만, 실무에서는 보통 양측 검정이 더 흔하게 쓰입니다.

1.3 검정 아이디어 (부호와 순위를 이용)

  1. 차이값: 두 시점(조건)에서의 측정값 차이()를 구한다. Di=X2i−X1iD_i = X_{2i} - X_{1i}
  2. 절댓값 기반으로 순위(Rank) 부여: 가 큰 순서대로 순위를 매긴다(0은 제외). ∣Di∣|D_i|
  3. 차이의 부호(+, -) 조사: 각 순위를 + 또는 - 그룹으로 분류
  4. 부호별 순위합 계산: +인 경우의 순위합() vs. -인 경우의 순위합() W+W^+ W−W^-
  5. 두 순위합 중 더 작은 쪽()을 검정 통계량으로 사용 → 표본 크기에 따라 윌콕슨 분포(또는 정규근사)를 통해 p-value 계산 min⁡(W+,W−)\min(W^+, W^-)

2. Python 실습 예시

아래는 scipy.stats 라이브러리의 wilcoxon 함수를 이용해 Wilcoxon Signed-Rank Test를 수행하는 방법을 예시로 보여줍니다.

2.1 라이브러리 임포트

import numpy as np import pandas as pd from scipy.stats import wilcoxon

2.2 예시 데이터 생성

  • 시나리오: 동일 환자 10명을 대상으로,
    • 치료 **전(before)**에 대한 점수(또는 증상 정도),
    • 치료 **후(after)**에 대한 점수를 각각 측정.
  • 실제 데이터에서는 전후 차이가 있을 것으로 기대.
np.random.seed(123) # 예: 치료 전 점수 (평균: 50, 표준편차: 10) before = np.random.normal(loc=50, scale=10, size=10) # 예: 치료 후 점수 (전보다 평균적으로 5 정도 낮아졌다고 가정) after = before - np.random.normal(loc=5, scale=3, size=10) df = pd.DataFrame({ 'before': before, 'after': after }) print(df)

2.3 Wilcoxon Signed-Rank Test 수행

  • scipy.statswilcoxon(x, y, zero_method='wilcox', correction=False, alternative='two-sided') 함수를 사용
    • x, y: 대응되는 두 시점(또는 조건)의 데이터
    • alternative='two-sided': 양측 검정
    • (버전에 따라 alternative 파라미터가 없을 수도 있으므로, 해당 버전에 맞춰 사용)
stat, p_value = wilcoxon(df['before'], df['after'], alternative='two-sided') print("[Wilcoxon Signed-Rank Test]") print(f"Statistic (W) = {stat:.4f}, p-value = {p_value:.4f}")
  • 결과로 나오는 stat는 Wilcoxon 검정 통계량(부호순위합 등에서 파생)이 되고, p_value가 유의수준()보다 작으면 귀무가설(H₀)을 기각(즉, 전후 차이가 유의하다고 결론). α\alpha
alpha = 0.05 if p_value < alpha: print("=> 귀무가설 기각: 치료 전후 중앙값에 유의한 차이가 있음.") else: print("=> 귀무가설 채택(기각 실패): 전후 차이가 유의하지 않음.")

3. 결과 해석 및 주의사항

  1. p-value < 0.05: “치료 전과 후의 중앙값이 다르다” (즉, 통계적으로 유의한 차이)
  2. p-value ≥ 0.05: “중앙값 차이를 통계적으로 유의하게 볼 수 없다”
  • 이는 “정말 같다”기보다는 “차이가 있다고 말할 근거가 부족하다”라는 의미
  1. 정규성 가정 없음
  • Paired t-test와 달리 정규성(각 시점, 차이값이 정규분포) 가정이 필요 없습니다.
  1. 표본 크기
  • 표본 크기가 작아도 괜찮지만, Wilcoxon 통계량 표(또는 정규 근사)를 사용할 때는 약간의 제한이 있습니다.
  • 실제 scipy.stats.wilcoxon 함수는 적절히 p-value를 계산해줍니다.
  1. 동점값(차이값=0)이 많다면
  • 차이값이 정확히 0인 표본은 순위 부여에서 제외하거나, 처리 방식(zero_method 파라미터) 등이 필요합니다.
  • wilcoxon(..., zero_method='wilcox')가 기본이고, 동점값이 많을 경우에는 'pratt' 옵션도 고려할 수 있습니다.

4. 요약

  • Wilcoxon Signed-Rank Test는 두 시점(또는 두 조건)에서 동일한 대상(짝지어진 표본)의 자료가 있을 때, 중앙값 차이가 유의한지 검정하는 비모수적(non-parametric) 방법입니다.
  • 정규성 가정이 필요한 Paired t-test에 대한 대안으로, 표본 크기가 작고 분포 형태가 불분명할 때 특히 유용합니다.
  • Python의 scipy.stats.wilcoxon 함수를 통해 간편히 수행 가능하며, p-value 해석을 통해 귀무가설 기각 여부를 판단합니다.

참고문헌

  1. Wilcoxon, F. (1945). Individual comparisons by ranking methods. Biometrics, 1(6), 80–83.
  2. Hollander, M., Wolfe, D. A., & Chicken, E. (2013). Nonparametric Statistical Methods. John Wiley & Sons.
  3. SciPy 공식 문서: scipy.stats.wilcoxon  이상으로 Wilcoxon Signed-Rank Test의 기초 개념과 Python 구현 예시를 살펴보았습니다. 실제 분석 상황에서도, 데이터가 정규분포를 따르지 않는다고 의심될 때(또는 표본 수가 매우 작을 때) 유용하게 적용할 수 있는 기법입니다.
  • 요약

Wilcoxon Signed-Rank Test

1. 개요

Wilcoxon Signed-Rank Test는 대응표본의 비모수적 검정 방법으로, paired t-test의 비모수적 대안입니다.

1.1 사용 조건

  • 정규성 가정이 위배될 때
  • 순서형 데이터 분석 시
  • 이상치가 존재할 때

1.2 장단점

장점

  • 정규성 가정 불필요
  • 이상치에 강건함
  • 순서형 데이터 분석 가능 단점
  • 검정력이 t-test보다 낮음
  • 중위수 차이 검정으로 제한
  • 표본 크기가 작을 때 한계

2. 검정 절차

2.1 기본 단계

  1. 쌍을 이루는 관측값의 차이(D) 계산
  2. 차이의 절대값 계산 및 순위 부여
  3. 원래 차이의 부호를 순위에 부여
  4. 양의 순위합(W+)과 음의 순위합(W-) 계산
  5. 검정통계량 W = min(W+, W-) 계산

2.2 영가설과 대립가설

  • H₀: 처리 전후 차이의 중위수 = 0
  • H₁: 처리 전후 차이의 중위수 ≠ 0

3. 통계량 계산

3.1 계산 과정

def wilcoxon_signed_rank(before, after): # 차이 계산 differences = [a - b for a, b in zip(after, before)] # 절대값 및 순위 계산 abs_diff = [abs(d) for d in differences] ranks = rankdata(abs_diff) # 부호 있는 순위 계산 signed_ranks = [r if d > 0 else -r for r, d in zip(ranks, differences)] # 순위합 계산 w_plus = sum(r for r in signed_ranks if r > 0) w_minus = abs(sum(r for r in signed_ranks if r < 0)) return min(w_plus, w_minus)

3.2 임계값 결정

  • 표본 크기에 따른 임계값표 사용
  • 대표본(n>20)의 경우 정규근사 사용

4. 실습 예제

4.1 데이터 예시

before = [10, 12, 15, 11, 20, 18, 16, 14, 19, 13] after = [12, 15, 17, 12, 22, 20, 17, 15, 21, 14] from scipy import stats stats.wilcoxon(before, after)

4.2 Python 구현

import numpy as np from scipy import stats import pandas as pd # 데이터 준비 data = pd.DataFrame({ 'before': before, 'after': after }) # 차이 계산 data['difference'] = data['after'] - data['before'] data['abs_diff'] = abs(data['difference']) data['rank'] = data['abs_diff'].rank() data['signed_rank'] = data.apply( lambda x: x['rank'] if x['difference'] > 0 else -x['rank'], axis=1 ) # 통계량 계산 W_plus = sum(data[data['signed_rank'] > 0]['signed_rank']) W_minus = abs(sum(data[data['signed_rank'] < 0]['signed_rank'])) W = min(W_plus, W_minus)

5. 결과 해석

5.1 해석 기준

  • p < α: 귀무가설 기각
  • p ≥ α: 귀무가설 채택

5.2 효과 크기

from scipy import stats # r = Z / sqrt(N) z_stat = stats.wilcoxon(before, after).statistic n = len(before) r = z_stat / np.sqrt(n) # 효과 크기 해석 # r = 0.1 (작은 효과) # r = 0.3 (중간 효과) # r = 0.5 (큰 효과)

6. 실무 적용 시 고려사항

  1. 표본 크기
  • n < 10: 정확한 확률 사용
  • n ≥ 10: 정규근사 가능
  1. 동률 처리
  • 평균 순위 할당
  • 연속성 보정 고려
  1. 영(0) 차이 처리
  • 제거 후 분석
  • 표본 크기 조정

7. R과 Python 코드 비교

7.1 R 코드

# 기본 분석 wilcox.test(after, before, paired=TRUE) # 효과 크기 계산 library(rstatix) wilcox_effsize(data, after ~ before, paired=TRUE)

7.2 Python 코드

from scipy import stats # 기본 분석 stats.wilcoxon(after, before) # 효과 크기 계산 z_stat = stats.wilcoxon(after, before).statistic r = z_stat / np.sqrt(len(after))

8. 연습문제

  1. 다음 데이터에 대해 Wilcoxon Signed-Rank Test 수행:
before = [45, 50, 55, 48, 52, 47, 49, 51, 46, 53] after = [48, 53, 57, 49, 54, 48, 52, 53, 47, 55]
  1. 결과 해석:
  • 통계량 계산
  • p-value 해석
  • 효과 크기 계산

참고문헌

  1. Wilcoxon, F. (1945). Individual comparisons by ranking methods. Biometrics Bulletin, 1(6), 80-83.
  2. Pratt, J. W. (1959). Remarks on zeros and ties in the Wilcoxon signed rank procedures. Journal of the American Statistical Association, 54(287), 655-667.