순위와 순위변환¶
대부분의 비모수 검정은 원자료를 순위 --- 관측값을 작은 값부터 정렬했을 때 차지하는 위치 --- 로 바꾸어 분포무관 성질을 얻는다. 이 단순한 변환은 구체적인 수치를 버리면서 순서는 보존하는데, 위치 이동·확률적 우월·단조 연관성을 탐지하는 데 필요한 정보는 정확히 그 순서이다.
이 절에서는 순위변환을 형식적으로 정의하고, 중간순위로 동점을 처리하는 방법을 설명하며, 순위통계량을 비모수 추론의 토대로 만드는 핵심 성질을 소개한다.
순위의 정의¶
표본 \(X_1, X_2, \ldots, X_n\)이 주어졌을 때 관측값 \(X_i\)의 순위는 정렬된 표본에서 \(X_i\)가 차지하는 위치이다. 형식적으로 \(X_{(1)} \le X_{(2)} \le \cdots \le X_{(n)}\)을 순서통계량이라 하자. 모든 값이 서로 다르면 \(X_i\)의 순위는 다음을 만족하는 유일한 정수 \(R_i\)이다.
동치로,
여기서 \(\mathbf{1}(\cdot)\)은 지시함수이다.
작은 표본에 순위 매기기
표본 \(X = (7.3, \; 2.1, \; 5.8, \; 9.0, \; 4.5)\)를 보자. 정렬하면 순서통계량은 \((2.1, \; 4.5, \; 5.8, \; 7.3, \; 9.0)\)이다. 순위는 다음과 같다.
| \(i\) | \(X_i\) | \(R_i\) |
|---|---|---|
| 1 | 7.3 | 4 |
| 2 | 2.1 | 1 |
| 3 | 5.8 | 3 |
| 4 | 9.0 | 5 |
| 5 | 4.5 | 2 |
중간순위로 동점 처리하기¶
관측값 둘 이상이 같은 값을 가지면 각각에 서로 다른 정수 순위를 배정하는 일이 모호해진다. 표준적인 해법은 동점인 관측값 모두에 중간순위(평균순위라고도 한다), 즉 그 동점값들이 차지했을 순위들의 산술평균을 배정하는 것이다.
정렬된 표본에서 위치 \(j, j+1, \ldots, j+k-1\)의 관측값이 모두 같다면 각각은 다음 중간순위를 받는다.
동점이 있을 때의 중간순위
\(X = (4, \; 7, \; 7, \; 7, \; 10)\)을 보자. 정렬된 값들은 위치 1부터 5를 차지한다. 세 개의 7이 위치 2, 3, 4를 차지하므로 각각 중간순위 \((2 + 3 + 4)/3 = 3\)을 받는다.
| \(i\) | \(X_i\) | 순위 위치 | 중간순위 \(R_i\) |
|---|---|---|---|
| 1 | 4 | 1 | 1 |
| 2 | 7 | 2, 3, 4 | 3 |
| 3 | 7 | 2, 3, 4 | 3 |
| 4 | 7 | 2, 3, 4 | 3 |
| 5 | 10 | 5 | 5 |
중간순위의 합은 여전히 \(1 + 3 + 3 + 3 + 5 = 15 = n(n+1)/2\)임에 주목하라. 이 성질은 언제나 성립한다.
동점이 검정통계량에 미치는 영향
많은 비모수 검정통계량은 귀무분포를 유도할 때 동점이 없다고 가정한다. 동점이 있으면 동점 보정계수를 적용해야 한다. 예를 들어 Kruskal-Wallis 검정과 Wilcoxon 순위합검정은 동점 집단의 개수와 크기에 의존하는 보정항으로 나눈다. 동점을 무시하면 검정통계량의 분산이 부풀려져 검정이 보수적으로 된다.
순위의 성질¶
순위를 분포무관 추론에 특히 유용하게 만드는 성질이 여럿 있다.
순위의 합. 크기 \(n\)인 임의의 표본에서 순위 \(R_1, R_2, \ldots, R_n\)은 \(\{1, 2, \ldots, n\}\)의 순열이므로(동점이 있어 중간순위를 써도 총합은 같다),
평균순위. 순위의 평균은 밑에 깔린 분포의 모양과 무관하게 언제나
이다.
순위의 분산. 동점이 없을 때 순위의 분산은
분포무관 성질. 모든 관측값이 같은 연속분포에서 나왔다는 귀무가설 아래에서는 순위의 모든 순열이 동등하게 가능하다. 따라서 순위에만 의존하는 임의의 통계량의 귀무분포를 모집단 분포를 몰라도 열거만으로 정확히 계산할 수 있다.
실전에서의 순위변환¶
순위변환은 임의의 연속분포를 \(\{1, 2, \ldots, n\}\) 위의 이산균등분포로 바꾼다. 여기에는 두 가지 중요한 귀결이 있다.
- 이상치 저항성. 극단적인 관측값은 그 값이 10이든 10{,}000이든 순위 \(n\)을 받는다. 순위변환은 모든 관측값의 영향력에 상한을 씌운다.
- 척도 불변성. 순위는 자료에 대한 임의의 단조증가 변환에 불변이다. 순위를 매기기 전에 로그변환이나 제곱근변환을 적용해도 순위는 바뀌지 않는다.

세 줄 모두 \(n = 12\)인 표본이고, 위쪽 축에는 원값이 실제 간격대로, 아래쪽 축에는 그 값들의 순위가 놓여 있다. 두 축을 잇는 선이 각 관측값이 어디로 가는지를 보여 준다.
첫째 줄은 정규 자료 \((29.6, 33.8, \ldots, 66.3, 76.6)\)이다. 원값이 가운데 \(46\)--\(48\) 근처에 뭉쳐 있어 위쪽 점들이 서로 붙어 있지만, 아래쪽에서는 \(1\)부터 \(12\)까지 똑같은 간격으로 펼쳐진다. 둘째 줄은 같은 순서를 유지한 채 지수함수를 씌워 만든 치우친 자료 \((12.1, 16.3, \ldots, 151.8, 307.2)\)인데, 원값 배치는 완전히 달라졌지만 아래쪽 줄은 첫째 줄과 한 점도 다르지 않다. 이것이 척도 불변성이며, 순위검정에 로그변환을 먼저 적용해도 \(p\)값이 소수점 이하 전부 그대로인 이유이다.
셋째 줄이 로버스트성을 보여 준다. 첫째 줄의 마지막 값 \(76.6\)을 \(900\)으로 바꾼 것뿐인데 표본평균이 \(49.17\)에서 \(117.78\)로, 표준편차가 \(12.62\)에서 \(246.51\)로 스무 배 가까이 부풀었다. 위쪽 축에서는 나머지 11개가 왼쪽 끝에 짓눌려 구별이 되지 않는다. 그런데 아래쪽 순위 축은 첫째 줄과 완전히 동일하다. \(900\)이든 \(9{,}000\)이든 순위 12를 받을 뿐이기 때문이다.
이 그림이 말하는 바를 한 문장으로 옮기면 이렇다. 순위변환은 임의의 연속분포를 \(\{1, 2, \ldots, n\}\) 위의 균등한 격자로 보내며, 그 격자 위에서 관측값 하나가 행사할 수 있는 영향력의 상한은 순위 \(n\)칸이다. 표본평균에는 그런 상한이 없다. 위쪽 축의 모양이 세 줄 모두 다르다는 것이 모수적 검정이 세 경우에 서로 다르게 반응한다는 뜻이고, 아래쪽 축이 세 줄 모두 같다는 것이 순위검정이 세 경우에 똑같은 답을 낸다는 뜻이다.
정규화 변환으로서의 순위
적당히 비정규인 자료에서는 관측값을 순위로(또는 van der Waerden 변환이라 불리는 정규점수 \(\Phi^{-1}(R_i / (n+1))\)로) 바꾸는 것이 실용적인 정규화 단계가 될 수 있다. 이렇게 순위변환된 자료를 표준적인 분산분석이나 회귀 방법으로 분석하면 로버스트성이 좋은 검정을 얻는다.
동점 보정계수¶
동점이 있으면 순위 기반 통계량의 정확 귀무분포가 달라진다. 대부분의 검정통계량은 보정계수를 넣는다. \(g\)를 서로 다른 동점 집단의 개수, \(t_j\)를 \(j\)번째 집단의 동점 관측값 개수라 하자. 흔히 쓰는 보정계수는
이다. 보정된 검정통계량은 보정되지 않은 통계량을 \(C\)로 나누어 얻는다(동치로, 그 분산을 \(C\)로 나눈다). 동점이 없으면 모든 \(j\)에 대해 \(t_j = 1\)이므로 \(C = 1\)이고 보정이 필요 없다.
흔히 쓰는 순위 기반 통계량¶
이 장 전체에서 다음 순위 기반 검정통계량이 등장한다.
| 통계량 | 정의 | 쓰이는 곳 |
|---|---|---|
| Wilcoxon \(W^+\) | 양의 차이들의 순위합 | 부호순위검정 |
| Wilcoxon \(W\) | 한 집단의 순위합 | 순위합검정 |
| Mann-Whitney \(U\) | 쌍별 승수 | 이표본 검정 |
| Kruskal-Wallis \(H\) | 집단 간 순위 변동 | 다집단 검정 |
| Friedman \(\chi^2_F\) | 블록 내 순위 변동 | 반복측정 |
| Spearman \(r_s\) | 순위의 Pearson 상관 | 상관 |
| Kendall \(\tau\) | 정규화된 일치도 계수 | 상관 |
이들 통계량은 모두 원자료가 아니라 순위 위에서 작동하므로, 위에서 설명한 분포무관 성질과 이상치 저항성을 물려받는다.
연습문제¶
연습문제 1. \(X = (3, 5, 5, 5, 8, 8, 11, 11, 11, 11)\)의 중간순위를 손으로 구하고, 합이 \(n(n+1)/2\)인지 확인하라. 이 표본의 동점 보정계수 \(C\)도 계산하라.
풀이
정렬된 위치는 1부터 10까지이다.
| 값 | 차지하는 위치 | 중간순위 | 개수 \(t_j\) |
|---|---|---|---|
| 3 | 1 | \(1\) | 1 |
| 5 | 2, 3, 4 | \((2+3+4)/3 = 3\) | 3 |
| 8 | 5, 6 | \((5+6)/2 = 5.5\) | 2 |
| 11 | 7, 8, 9, 10 | \((7+8+9+10)/4 = 8.5\) | 4 |
순위 벡터는 \((1, 3, 3, 3, 5.5, 5.5, 8.5, 8.5, 8.5, 8.5)\)이고 합은
보정계수는 \(t = (1, 3, 2, 4)\)이므로(\(t_j = 1\)인 집단은 \(t_j^3 - t_j = 0\)이라 기여하지 않는다)
import numpy as np
from scipy import stats
x = np.array([3, 5, 5, 5, 8, 8, 11, 11, 11, 11])
r = stats.rankdata(x)
print(r, r.sum()) # [1. 3. 3. 3. 5.5 5.5 8.5 8.5 8.5 8.5] 55.0
출력:
[1. 3. 3. 3. 5.5 5.5 8.5 8.5 8.5 8.5] 55.0
연습문제 2. 연습문제 1의 표본에서 중간순위의 (모)분산을 계산하고, 동점이 없을 때의 값 \((n^2-1)/12\)와 비교하라. 두 값 사이의 관계에서 보정계수 \(C\)가 왜 그런 형태인지 설명하라.
풀이
print(r.var()) # 7.5
print((10**2 - 1) / 12) # 8.25
print(7.5 / 8.25) # 0.9090909...
출력:
7.5
8.25
0.9090909090909091
동점이 없을 때 \(8.25\), 동점이 있을 때 \(7.5\)이고, 그 비가 정확히 \(C = 10/11 = 0.9091\)이다. 이것은 우연이 아니라 항등식이다.
직관은 이렇다. 동점 집단 하나를 중간순위로 뭉개면 그 집단 내부의 순위 변동이 완전히 사라진다. \(t_j\)개짜리 집단이 잃는 제곱합은 정확히 \(t_j(t_j^2-1)/12\)이고, 이를 전체 \(n(n^2-1)/12\)로 나누면
가 되어 \(C\)의 정의에 나오는 분수와 정확히 일치한다.
이 때문에 동점을 무시한 검정이 보수적이 된다. Kruskal-Wallis 같은 통계량은 순위 분산으로 표준화하는데, 실제 분산(\(7.5\))보다 큰 값(\(8.25\))으로 나누면 통계량이 과소평가되어 기각을 덜 하게 된다. 통계량을 \(C\)로 나누는 것이 바로 이 과소평가를 되돌리는 조작이다.
연습문제 3. \(Y = (2.0, \; 7.5, \; 1.1, \; 9.9, \; 4.4)\)에 대해 \(\text{rank}(Y)\), \(\text{rank}(\log Y)\), \(\text{rank}(Y^3)\), \(\text{rank}(-Y)\), \(\text{rank}((Y-5)^2)\)을 각각 구하라. 어느 것이 원래 순위와 같고 어느 것이 다른가? 그 이유는?
풀이
y = np.array([2.0, 7.5, 1.1, 9.9, 4.4])
for name, z in [("y", y), ("log y", np.log(y)), ("y^3", y**3),
("-y", -y), ("(y-5)^2", (y - 5)**2)]:
print(name, stats.rankdata(z))
출력:
y [2. 4. 1. 5. 3.]
log y [2. 4. 1. 5. 3.]
y^3 [2. 4. 1. 5. 3.]
-y [4. 2. 5. 1. 3.]
(y-5)^2 [3. 2. 4. 5. 1.]
| 변환 | 순위 | 원래와 같은가 |
|---|---|---|
| \(Y\) | \((2, 4, 1, 5, 3)\) | --- |
| \(\log Y\) | \((2, 4, 1, 5, 3)\) | 같다 |
| \(Y^3\) | \((2, 4, 1, 5, 3)\) | 같다 |
| \(-Y\) | \((4, 2, 5, 1, 3)\) | 정확히 뒤집힘 |
| \((Y-5)^2\) | \((3, 2, 4, 5, 1)\) | 완전히 다름 |
\(\log\)와 세제곱은 단조증가 함수이므로 \(Y_i < Y_j \iff g(Y_i) < g(Y_j)\)가 그대로 유지되어 순위가 보존된다. \(-Y\)는 단조감소이므로 순위가 \(R \mapsto n + 1 - R\)로 뒤집힌다. 검정통계량이 대칭적이면 이 뒤집기는 \(p\)값을 바꾸지 않는다.
\((Y-5)^2\)는 단조가 아니다. \(5\) 아래와 위를 접어 버리므로 순서 정보가 파괴된다. \(Y = 4.4\)(원래 순위 3)가 새 순위 1이 되고, \(Y = 2.0\)(원래 순위 2)이 새 순위 3이 된다.
실무적 함의: 순위 기반 검정에 로그변환을 먼저 적용하는 것은 의미가 없다. \(p\)값이 소수점 이하 전부 동일하게 나온다. 반대로 \(t\) 검정에서는 로그변환이 결과를 크게 바꾼다. 이 불변성이 순위 검정의 장점이자 한계이다. 척도 선택에 흔들리지 않지만, 척도를 잘 골라 얻을 수 있었을 정보도 쓰지 못한다.
연습문제 4.
연습문제 1의 자료를 세 집단 \(A = (3, 5, 5, 8)\), \(B = (5, 8, 11, 11)\), \(C = (11, 11)\)로 나누어 Kruskal-Wallis 검정을 수행하라. scipy.stats.kruskal이 동점 보정을 자동으로 하는지 확인하고, 보정을 하지 않으면 통계량이 어떻게 달라지는지 계산하라.
풀이
a, b, c = [3, 5, 5, 8], [5, 8, 11, 11], [11, 11]
print(stats.kruskal(a, b, c))
# KruskalResult(statistic=5.235, pvalue=0.0730)
출력:
KruskalResult(statistic=5.2349999999999985, pvalue=0.07298509768315993)
손으로 확인해 보자. 합친 자료의 중간순위는 연습문제 1과 같다. 집단별 순위합은
- \(A\): \(1 + 3 + 3 + 5.5 = 12.5\) (\(n_A = 4\))
- \(B\): \(3 + 5.5 + 8.5 + 8.5 = 25.5\) (\(n_B = 4\))
- \(C\): \(8.5 + 8.5 = 17\) (\(n_C = 2\))
보정하지 않은 통계량은
import numpy as np
R = np.array([12.5, 25.5, 17.0]); ni = np.array([4, 4, 2]); n = 10
H_raw = 12 / (n * (n + 1)) * np.sum(R**2 / ni) - 3 * (n + 1)
print(H_raw, H_raw / (10 / 11)) # 4.759... 5.235...
출력:
4.759090909090908 5.2349999999999985
보정 전 \(H' = 4.759\), 보정 후 \(H = H'/C = 4.759 \times 11/10 = 5.235\)로 SciPy 결과와 일치한다. SciPy는 동점 보정을 자동으로 한다.
\(p\)값에 미치는 영향은 \(\chi^2_2\) 기준으로 \(0.0925 \to 0.0730\)이다. 이 표본에서는 동점 비율이 높아(\(10\)개 중 \(9\)개가 동점) 보정이 \(p\)값을 20% 넘게 줄였다. 동점이 적으면 \(C\)가 \(1\)에 가까워 차이는 무시할 만하다.
다만 여기서 더 중요한 경고가 있다. 집단 크기가 \(4, 4, 2\)로 매우 작고 자료가 심하게 이산적이어서 \(\chi^2\) 근사 자체가 신뢰할 만하지 않다. 이런 경우에는 순열검정으로 정확 \(p\)값을 구하는 편이 낫다.
정리하며¶
순위변환은 비모수 검정의 중심 장치이다. 관측값을 정렬된 표본에서의 위치로 대체함으로써 순위 기반 방법은 분포무관성, 이상치에 대한 로버스트성, 순서형 자료에 대한 적용성을 얻는다. 동점이 생기면 중간순위가 순위변환의 핵심 성질을 보존하고, 보정계수가 검정통계량의 명목 유의수준을 유지하게 한다. 이 토대 위에 세워지는 구체적인 순위 기반 절차들은 이어지는 절에서 전개한다.