콘텐츠로 이동

Kendall의 타우

Spearman의 \(r_s\)처럼 Kendall의 타우도 두 변수 사이 연관을 재는 순위 기반 측도이다. 다만 순위 자체의 상관을 구하는 대신, 관측값들 사이의 일치쌍과 불일치쌍의 개수를 센다. 이 쌍 세기 방식 덕분에 Kendall의 타우는 더 직접적인 확률적 해석을 갖고 작은 표본에서 통계적 성질도 흔히 더 낫다.


일치쌍과 불일치쌍

\(n\)개의 짝지어진 관측값 \((x_1, y_1), \ldots, (x_n, y_n)\)에서 \(i < j\)인 두 관측값 \((x_i, y_i)\)와 \((x_j, y_j)\)의 쌍을 생각하자.

  • \(x_i < x_j\)이고 \(y_i < y_j\)이거나 \(x_i > x_j\)이고 \(y_i > y_j\)이면 일치쌍이다. 다시 말해 두 변수가 그 쌍의 순서를 같게 매긴다.

  • \(x_i < x_j\)이고 \(y_i > y_j\)이거나 \(x_i > x_j\)이고 \(y_i < y_j\)이면 불일치쌍이다. 두 변수가 순서를 반대로 매긴다.

  • \(x_i = x_j\)이거나 \(y_i = y_j\)(또는 둘 다)이면 동점쌍이다.

전체 쌍의 개수는 \(\binom{n}{2} = \frac{n(n-1)}{2}\)이다.


Kendall의 타우-a

가장 단순한 형태인 Kendall의 타우-a는

\[ \tau_a = \frac{C - D}{\binom{n}{2}} = \frac{C - D}{\frac{n(n-1)}{2}} \]

로 정의되며 \(C\)는 일치쌍의 수, \(D\)는 불일치쌍의 수이다.

타우-a는 동점을 전혀 조정하지 않는다. 동점이 있으면 동점쌍이 일치도 불일치도 아니므로, 관계가 완전히 단조여도 \(\tau_a\)가 \(\pm 1\)에 이르지 못한다.


Kendall의 타우-b

동점을 다루기 위해 Kendall의 타우-b는 분모를 조정한다:

\[ \tau_b = \frac{C - D}{\sqrt{(C + D + T_X)(C + D + T_Y)}} \]

여기서

  • \(T_X\) = \(X\)에서는 동점이지만 \(Y\)에서는 아닌 쌍의 수
  • \(T_Y\) = \(Y\)에서는 동점이지만 \(X\)에서는 아닌 쌍의 수

이다. 타우-b는 (동점이 많아야 한 변수에만 있다면) 동점이 있어도 자료가 완전히 단조일 때 \(\pm 1\)에 도달할 수 있다. 실무에서 가장 흔히 보고되며 대부분의 통계 소프트웨어에서 기본값이다.


확률적 해석

Kendall의 타우에는 우아한 확률적 해석이 있다. 무작위로 고른 두 관측값 쌍 \((x_i, y_i)\)와 \((x_j, y_j)\)에 대해

\[ \tau = P(\text{concordant}) - P(\text{discordant}) \]

이다. 즉:

  • \(\tau = 1\): 모든 쌍이 일치한다(순서가 완전히 일치).
  • \(\tau = -1\): 모든 쌍이 불일치한다(순서가 완전히 뒤집힘).
  • \(\tau = 0\): 일치쌍과 불일치쌍이 똑같이 그럴듯하다(단조 연관 없음).

성질

  1. 범위. 타우-a와 타우-b 모두 \(-1 \le \tau \le 1\)이다(동점이 있으면 타우-a는 경계에 도달하지 못할 수 있다).

  2. 대칭성. \(\tau_{XY} = \tau_{YX}\).

  3. 단조 변환에 대한 불변성. Spearman의 \(r_s\)처럼 Kendall의 타우도 관측값의 수치가 아니라 순서에만 의존한다.

  4. 로버스트성. 상대적 순서에만 의존하므로 Kendall의 타우는 이상점에 로버스트하다.

  5. 크기. 같은 자료에서 \(|\tau|\)는 대체로 \(|r_s|\)보다 작다. 대략적인 환산은 \(\tau \approx \frac{2}{\pi} \arcsin(r_s)\)이지만 이변량 정규 자료에서만 정확하다.


계산 보기

다섯 개의 짝지어진 관측값을 생각하자:

\(i\) \(x_i\) \(y_i\)
1 1 3
2 2 5
3 3 4
4 4 2
5 5 1

쌍은 \(\binom{5}{2} = 10\)개이다. \(x\)로 정렬한 상태(이미 정렬됨)에서 각 쌍을 비교한다:

쌍 \((i,j)\) \(x\) 순서 \(y\) 순서 결과
(1,2) \(1 < 2\) \(3 < 5\) 일치
(1,3) \(1 < 3\) \(3 < 4\) 일치
(1,4) \(1 < 4\) \(3 > 2\) 불일치
(1,5) \(1 < 5\) \(3 > 1\) 불일치
(2,3) \(2 < 3\) \(5 > 4\) 불일치
(2,4) \(2 < 4\) \(5 > 2\) 불일치
(2,5) \(2 < 5\) \(5 > 1\) 불일치
(3,4) \(3 < 4\) \(4 > 2\) 불일치
(3,5) \(3 < 5\) \(4 > 1\) 불일치
(4,5) \(4 < 5\) \(2 > 1\) 불일치

일치쌍 \(C = 2\), 불일치쌍 \(D = 8\)이다. 동점이 없으므로

\[ \tau_a = \tau_b = \frac{2 - 8}{10} = -0.6 \]

이다. 음수 값은 \(X\)가 커질수록 \(Y\)가 작아지는 (강한) 경향을 나타낸다.

다섯 점을 잇는 선분 열 개의 방향을 세는 것이 타우이고, 같은 자료에서 타우는 언제나 스피어만보다 0 에 가깝다

왼쪽이 위 표를 그림으로 옮긴 것이다. 점 다섯 개를 서로 잇는 선분이 \(\binom{5}{2} = 10\)개 있고, 각 선분이 오른쪽 위로 올라가면 일치쌍(초록), 오른쪽 아래로 내려가면 불일치쌍(빨강)이다. 세어 보면 초록 둘, 빨강 여덟이다. 표를 한 줄씩 읽는 것보다 이 그림 한 장이 정의를 더 빨리 전달한다. Kendall의 타우가 "선분의 기울기 부호를 센 것"이라면, 기울기의 크기는 전혀 쓰지 않는다는 점도 바로 보인다. 점을 세로로 아무리 멀리 옮겨도 선분의 방향만 그대로면 \(\tau\)는 변하지 않는다. 성질 3과 4가 여기서 나온다.

오른쪽은 성질 5를 확인한 것이다. \(n = 50\)인 이변량 정규 표본 2,000개를 \(\rho\)를 바꿔 가며 만들고 각 자료에서 \(\tau\)와 \(r_s\)를 함께 계산해 찍었다. 점구름이 회색 대각선(\(\tau = r_s\))보다 안쪽으로 눌려 있고, 붉은 곡선 \(\tau = \frac{2}{\pi}\arcsin(r_s)\) 위에 거의 정확히 얹힌다. 구체적으로 \(r_s = 0.5\)이면 \(\tau \approx 0.33\), \(r_s = 0.7\)이면 \(\tau \approx 0.49\), \(r_s = 0.9\)라야 \(\tau \approx 0.71\)이다.

그래서 \(\tau = 0.35\)와 \(r_s = 0.35\)를 "비슷한 세기"로 읽으면 안 된다. 앞의 것은 뒤의 것보다 훨씬 강한 연관이다. 논문에서 \(\tau\)를 보고할 때 관례적인 "\(0.7\) 이상이면 강함" 같은 기준을 그대로 적용하는 실수가 흔한데, 그 기준은 Pearson의 \(r\)을 염두에 둔 것이다. 두 계수는 서로 다른 눈금 위에 있으며, 굳이 견주려면 위 변환식을 거쳐야 한다.


Kendall과 Spearman

항목 Kendall \(\tau\) Spearman \(r_s\)
기반 일치/불일치 쌍 순위 상관
전형적인 크기 절댓값이 더 작다 절댓값이 더 크다
소표본 행동 분산 성질이 더 낫다 변동이 크다
동점 처리 타우-b가 명시적으로 조정 중간순위
확률적 해석 직접적: \(P(C) - P(D)\) 간접적
계산 비용 병합정렬로 \(O(n \log n)\) 순위 매김에 \(O(n \log n)\)

동점이 없는 큰 표본에서는 두 검정의 검정력이 비슷하다. 표본이 작거나 명확한 확률적 해석을 원할 때 Kendall의 타우가 흔히 선호된다.


보기 1. Kendall의 타우 구하기. 앞에서 손으로 센 자료 \(x = (1,2,3,4,5)\), \(y = (3,5,4,2,1)\) 을 코드로 다룬다. \(C = 2\), \(D = 8\) 이므로 \(\tau = -0.6\) 이다.

(1) 같은 자료의 Spearman \(r_s\) 를 간편 공식 \(1 - 6\sum d_i^2/\{n(n^2-1)\}\) 로 구하시오. \(\lvert\tau\rvert\) 와 \(\lvert r_s\rvert\) 가운데 어느 쪽이 큰가.

(2) 두 계수는 서로 묶여 있어 아무 값이나 짝지을 수 없다. \(n = 5, 6, 7\) 의 순열을 전부 돌려

\[ \lvert\, 3\tau - 2r_s \,\rvert \le 1 \]

이 성립하는지 확인하시오. 이 자료에서 \(3\tau - 2r_s\) 는 얼마인가.

(3) \(n = 5\) 이므로 \(5! = 120\) 가지 순열을 모두 셀 수 있다. \(\tau\) 와 \(r_s\) 의 정확한 양측 p-값을 유리수로 구하고, scipy 가 돌려주는 두 p-값과 견주시오.

(4) 코드로 확인하시오.

풀이

(1) Spearman. \(x\) 의 순위는 \((1,2,3,4,5)\), \(y = (3,5,4,2,1)\) 의 순위도 값 그대로 \((3,5,4,2,1)\) 이다. 차를 적으면

\[ d = (1-3,\ 2-5,\ 3-4,\ 4-2,\ 5-1) = (-2,\ -3,\ -1,\ +2,\ +4), \qquad \sum d_i^2 = 4+9+1+4+16 = 34 \]

이고 동점이 없으므로 간편 공식을 쓸 수 있다.

\[ r_s = 1 - \frac{6 \times 34}{5(25-1)} = 1 - \frac{204}{120} = 1 - 1.7 = -0.7 \]

\(\lvert r_s \rvert = 0.7 > 0.6 = \lvert\tau\rvert\) 다. 앞 절에서 본 대로 타우가 늘 0 에 더 가깝다.

(2) 두 계수는 함께 움직인다. 같은 순위자료에서 나온 두 수이니 자유롭게 떨어질 수 없다. 이 자료에서는

\[ 3\tau - 2r_s = 3(-0.6) - 2(-0.7) = -1.8 + 1.4 = -0.4 \]

로 \([-1, 1]\) 안에 있다. 이것이 우연인지 보려면 세어 보면 된다. \(n = 5, 6, 7\) 에 대해 \(n!\) 가지 순열을 전부 돌려 \(\lvert 3\tau - 2r_s\rvert\) 의 최댓값을 찾으면 세 경우 모두 정확히 \(1\) 이 나온다(아래 코드). 곧

\[ -1 \le 3\tau - 2r_s \le 1 \]

이 성립하고, 등호가 실제로 달성되므로 더 좁힐 수 없는 한계다. 이 부등식을 뒤집어 읽으면

\[ \frac{3\tau - 1}{2} \le r_s \le \frac{3\tau + 1}{2} \]

이다. \(\tau = -0.6\) 이면 \(r_s \in [-1.4, -0.4]\), 곧 실제로는 \([-1, -0.4]\) 다. 관측된 \(-0.7\) 이 그 안에 있다.

쓸모. 논문에 \(\tau\) 만 적혀 있어도 \(r_s\) 의 범위를 알 수 있고, 거꾸로도 된다. 둘이 크게 어긋나 보이면 계산이 틀렸을 가능성을 먼저 의심하면 된다.

(3) 정확 p-값. \(n = 5\) 이고 동점이 없으므로 \(H_0\) 아래의 표본공간은 \(y\) 순위의 \(5! = 120\) 가지 배열이다. 전부 세면

\[ \#\{\lvert\tau\rvert \ge 0.6\} = 28 \quad\Longrightarrow\quad p_\tau = \frac{28}{120} = \frac{7}{30} = 0.233333 \]
\[ \#\{\lvert r_s\rvert \ge 0.7\} = 28 \quad\Longrightarrow\quad p_{r_s} = \frac{28}{120} = \frac{7}{30} = 0.233333 \]

두 정확 p-값이 똑같이 \(7/30\) 이다. 이 자료에서 두 통계량이 같은 28 개 배열을 "이만큼 극단적" 으로 골라내기 때문이다(일반적으로 늘 같지는 않다).

이제 scipy 와 견준다.

통계량 scipy p 정확 p
Kendall \(\tau\) \(-0.6\) \(0.233333\) \(7/30 = 0.233333\) 정확히 같다
Spearman \(r_s\) \(-0.7\) \(0.188120\) \(7/30 = 0.233333\) 너무 작다

kendalltau 는 작은 표본에서 정확분포를 쓰고 spearmanr 는 \(t\) 근사를 쓴다. 그래서 Kendall 쪽은 \(7/30\) 과 소수 여섯째 자리까지 맞고, Spearman 쪽은 \(0.1881\) 로 참값보다 \(0.045\) 작다. 근사가 기각하는 쪽으로 기울어 있다. 관측값 다섯 개로 \(t\) 분포를 믿은 대가다.

여기서는 \(0.1881\) 이든 \(0.2333\) 이든 \(0.05\) 보다 크므로 결론이 같다. 애초에 \(n = 5\) 에서 얻을 수 있는 가장 작은 양측 p-값이 \(2/120 = 1/60 = 0.0167\) 이니, 완전한 단조관계가 아니고서는 유의해질 수 없다.

(4) 수치적으로.

import numpy as np
from scipy import stats

# x 는 오름차순인데 y 는 올랐다 내려간다. 일치쌍과 불일치쌍이 섞인 자료다.
x = np.array([1, 2, 3, 4, 5])
y = np.array([3, 5, 4, 2, 1])

# 타우는 (일치쌍 - 불일치쌍) / 전체 쌍이다. "무작위로 두 점을 골랐을 때
# 같은 방향으로 움직일 확률에서 반대 방향일 확률을 뺀 값"으로 읽을 수 있다.
tau, p_value = stats.kendalltau(x, y)
print(f"Kendall tau-b = {tau:.4f}, p-value = {p_value:.4f}")

# 스피어만과 견준다. 둘 다 순위만 쓰지만 눈금이 달라 타우 쪽이 늘 더 작다.
# 표본이 작거나 이상치가 있을 때는 타우가 더 안정적이다.
r_s, p_s = stats.spearmanr(x, y)
print(f"Spearman r_s  = {r_s:.4f}, p-value = {p_s:.4f}")

# (1) 간편 공식으로 r_s 를 직접
d = stats.rankdata(x) - stats.rankdata(y)
n = len(x)
print(f"\nd = {d.astype(int).tolist()}   sum d^2 = {int((d**2).sum())}"
      f"   r_s = {1 - 6 * (d**2).sum() / (n * (n**2 - 1)):.4f}")
print(f"3*tau - 2*r_s = {3 * tau - 2 * r_s:.4f}")

# (2) n! 가지 순열을 전부 돌려 |3tau - 2r_s| 의 최댓값을 본다
from itertools import permutations

for m in (5, 6, 7):
    xs = np.arange(1, m + 1)
    worst = max(abs(3 * stats.kendalltau(xs, q).statistic
                    - 2 * stats.spearmanr(xs, q).statistic)
                for q in permutations(xs))
    print(f"n = {m}:  max |3tau - 2r_s| = {worst:.6f}")

# (3) 정확 p-값. 120 가지를 모두 센다.
perms = list(permutations(range(1, 6)))
taus = np.array([stats.kendalltau(x, q).statistic for q in perms])
rss = np.array([stats.spearmanr(x, q).statistic for q in perms])
n_tau = int((np.abs(taus) >= abs(tau) - 1e-9).sum())
n_rs = int((np.abs(rss) >= abs(r_s) - 1e-9).sum())
print(f"\n|tau| >= 0.6 인 배열 {n_tau}/120   정확 p = {n_tau / 120:.6f}"
      f"   scipy = {p_value:.6f}")
print(f"|r_s| >= 0.7 인 배열 {n_rs}/120   정확 p = {n_rs / 120:.6f}"
      f"   scipy = {p_s:.6f}")
print(f"가장 작은 양측 p-값 2/120 = {2 / 120:.6f}")

출력:

Kendall tau-b = -0.6000, p-value = 0.2333
Spearman r_s  = -0.7000, p-value = 0.1881

d = [-2, -3, -1, 2, 4]   sum d^2 = 34   r_s = -0.7000
3*tau - 2*r_s = -0.4000
n = 5:  max |3tau - 2r_s| = 1.000000
n = 6:  max |3tau - 2r_s| = 1.000000
n = 7:  max |3tau - 2r_s| = 1.000000

|tau| >= 0.6 인 배열 28/120   정확 p = 0.233333   scipy = 0.233333
|r_s| >= 0.7 인 배열 28/120   정확 p = 0.233333   scipy = 0.188120
가장 작은 양측 p-값 2/120 = 0.016667

Kendall의 \(\tau = -0.60\)이 Spearman의 \(r_s = -0.70\)보다 0에 가깝다. 우연이 아니라 일반적인 경향이다. 두 계수는 대체로 \(\tau \approx \frac{2}{\pi}\arcsin(r_s)\) 관계에 있어 \(|\tau| \le |r_s|\)가 된다. 두 값을 직접 비교하면 안 되고, 각자의 척도에서 읽어야 한다.

(1)의 간편 공식이 \(\sum d_i^2 = 34\) 에서 r_s = -0.7000 을 그대로 준다.

(2)의 max |3tau - 2r_s| = 1.000000 이 세 번 똑같이 나온다. \(n = 5, 6, 7\) 의 모든 순열에서 \(\lvert 3\tau - 2r_s\rvert\) 가 \(1\) 을 넘지 않으면서 \(1\) 에 도달한다. 이 자료의 \(-0.4\) 는 그 안쪽에 넉넉히 들어 있다.

(3)이 요점이다. \(\lvert\tau\rvert \ge 0.6\) 인 배열과 \(\lvert r_s\rvert \ge 0.7\) 인 배열이 둘 다 28 개여서 정확 p-값이 \(28/120 = 7/30 = 0.233333\) 으로 같다. 그런데 scipy 의 두 값은 다르다. kendalltau 는 0.233333 으로 정확값과 맞고 spearmanr 는 0.188120 으로 작다. 앞의 것은 정확분포를, 뒤의 것은 \(t\) 근사를 쓰기 때문이다.

관측값이 5개뿐이라 두 p-값 모두 유의하지 않다. 애초에 이 표본크기에서 나올 수 있는 가장 작은 양측 p-값이 0.016667 이다.

scipy.stats.kendalltau 함수는 기본으로 타우-b를 계산한다. 가설검정의 자세한 내용은 Kendall의 타우 검정을 보라.


연습문제

연습문제 1. 자료 \(X = (1, 2, 3, 4, 5)\), \(Y = (2, 4, 1, 3, 5)\)에 대해 Kendall의 \(\tau\)를 계산하라.

풀이

전체 \(\binom{5}{2} = 10\)개 쌍에서 일치쌍과 불일치쌍을 센다:

쌍 \((i,j)\) \(X_j - X_i\) \(Y_j - Y_i\) 일치?
(1,2) + + C
(1,3) + \(-\) D
(1,4) + + C
(1,5) + + C
(2,3) + \(-\) D
(2,4) + \(-\) D
(2,5) + + C
(3,4) + + C
(3,5) + + C
(4,5) + + C

일치: \(C = 7\), 불일치: \(D = 3\).

\[ \tau = \frac{C - D}{\binom{n}{2}} = \frac{7 - 3}{10} = 0.4 \]

연습문제 2. 둘 다 단조 연관을 재는데도 Kendall의 \(\tau\)와 Spearman의 \(\rho\)가 개념적으로 어떻게 다른지 설명하라.

풀이

Kendall의 \(\tau\)는 모든 관측값 쌍 중 일치쌍의 비율에서 불일치쌍의 비율을 뺀 값이다. 직접적인 확률적 해석을 갖는다: 무작위로 고른 쌍에 대해 \(\tau = P(\text{일치}) - P(\text{불일치})\)이다.

Spearman의 \(\rho\)는 순위에 적용한 Pearson 상관이다. 순위 사이의 선형 연관을 재며 순위 차이의 크기에 민감하다.

핵심 차이: (1) \(\tau\)는 쌍별 비교(순서형)에 기반하고 \(\rho\)는 실제 순위값을 쓴다. (2) 같은 자료에서 \(\tau\)가 \(\rho\)보다 절댓값이 작은 경향이 있다. (3) \(\tau\)는 점근 성질이 더 단순하고 표준오차를 계산하기 쉽다. (4) \(\rho\)는 선형적인 순위 관계를 탐지하는 데 더 강력하고 \(\tau\)는 더 로버스트하다.

연습문제 3. 자료에 이상점이 있거나 관계가 비선형이면서 단조일 때 Pearson의 \(r\)보다 Kendall의 \(\tau\)가 선호되는 이유는?

풀이

Kendall의 \(\tau\)는 실제 값이 아니라 순서형 패턴(어느 관측값이 더 큰가)에만 기반한다. 그래서:

  1. 이상점에 로버스트하다: 극단값 하나는 (\(\binom{n}{2}\)개 중) 많아야 \(n - 1\)개의 쌍별 비교를 바꾸고, 그것도 순서를 바꿀 때에만 그렇다. 제곱편차를 쓰는 Pearson의 \(r\)은 극단값 하나에 크게 영향받는다.

  2. 비선형 단조 관계에 적합하다: \(Y\)가 \(X\)의 단조증가하지만 비선형인 함수라면(예: \(Y = e^X\)) Kendall의 \(\tau = 1\)(완전 일치)이지만 Pearson의 \(r < 1\)이다. \(r\)은 선형 연관만 재기 때문이다.

  3. 분포에 의존하지 않는다: \(\tau\)에 기반한 추론의 타당성에 정규성 가정이 필요하지 않다.

연습문제 4. Kendall의 \(\tau\)에서 동점은 어떻게 처리하는가? (동점을 조정한 형태인) \(\tau_b\)의 공식을 진술하라.

풀이

동점이 있으면 \(X_i = X_j\)이거나 \(Y_i = Y_j\)인 쌍은 일치도 불일치도 아니다. 기본 공식 \(\tau_a = (C - D)/\binom{n}{2}\)는 동점을 반영하지 않으므로, 동점이 있는 완전 단조 자료에서도 \(|\tau_a| < 1\)이 된다.

Kendall의 \(\tau_b\)는 분모를 조정한다:

\[ \tau_b = \frac{C - D}{\sqrt{(C + D + T_X)(C + D + T_Y)}} \]

여기서 \(T_X\)는 \(X\)에서만 동점인 쌍의 수, \(T_Y\)는 \(Y\)에서만 동점인 쌍의 수이다. 이렇게 하면 동점 구조가 허용하는 한 최대로 일치(또는 불일치)할 때 \(\tau_b\)가 \(\pm 1\)에 도달할 수 있다. 대부분의 소프트웨어가 기본으로 \(\tau_b\)를 보고한다.

연습문제 5. \(\tau\)가 "일치 확률 \(-\) 불일치 확률"이라는 해석을 모의실험으로 확인하고, 이 해석이 왜 스피어만보다 유리한지 설명하라.

풀이

정의. 두 쌍 \((X_1,Y_1)\), \((X_2,Y_2)\)를 독립으로 뽑았을 때

\[ \tau=P\bigl((X_1-X_2)(Y_1-Y_2)>0\bigr) -P\bigl((X_1-X_2)(Y_1-Y_2)<0\bigr) \]

직접 해석되는 확률이다.

import warnings
warnings.filterwarnings("ignore")

import numpy as np

rng = np.random.default_rng(21001)
for rho in [0.0, 0.5, 0.8]:
    z = rng.standard_normal((400, 2))
    x = z[:, 0]
    y = rho * z[:, 0] + np.sqrt(1 - rho**2) * z[:, 1]
    conc = disc = 0
    for i in range(400):
        for j in range(i + 1, 400):
            s = np.sign(x[i] - x[j]) * np.sign(y[i] - y[j])
            if s > 0:
                conc += 1
            elif s < 0:
                disc += 1
    tot = conc + disc
    print(f"  ρ={rho:.1f}: P(일치)={conc / tot:.4f}, "
          f"P(불일치)={disc / tot:.4f}, 차이={(conc - disc) / tot:.4f}, "
          f"τ 이론={2 / np.pi * np.arcsin(rho):.4f}")
  ρ=0.0: P(일치)=0.4642, P(불일치)=0.5358, 차이=-0.0716, τ 이론=0.0000
  ρ=0.5: P(일치)=0.6773, P(불일치)=0.3227, 차이=0.3546, τ 이론=0.3333
  ρ=0.8: P(일치)=0.8013, P(불일치)=0.1987, 차이=0.6025, τ 이론=0.5903

차이가 이론값과 잘 맞는다.

\(\rho\) \(P\)(일치) 차이 \(=\hat\tau\) 이론 \(\tau\)
0.0 0.464 \(-0.072\) 0.000
0.5 0.677 0.355 0.333
0.8 0.801 0.603 0.590

\(\rho=0\)에서 \(-0.072\)가 나온 것은 표본이 400개뿐이라 생긴 변동이다. \(\hat\tau\)의 표준오차가 \(\sqrt{2(2n+5)/(9n(n-1))}=0.034\)이므로 2 표준오차 안이다.

\(\tau\)에서 일치 확률을 바로 얻는다.

\[ P(\text{일치})=\frac{1+\tau}{2} \]

\(\tau=0.59\)면 \(P=0.795\)다. "두 관측을 무작위로 뽑으면 80%는 같은 방향"이라고 말할 수 있다.

이것이 \(\tau\)의 결정적 장점이다.

측도 직접 해석
피어슨 \(r\) \(r^2\)이 설명 비율
스피어만 \(r_s\) 없음(순위의 피어슨일 뿐)
켄들 \(\tau\) 일치 확률

스피어만은 확률로 번역되지 않는다. \(r_s=0.58\)이 무엇의 0.58인지 말하기 어렵다. \(\tau=0.41\)은 "일치 확률 70.5%"다.

비전문가에게 설명할 때 특히 유용하다.

"τ = 0.4 입니다"
  → "두 사람을 무작위로 골랐을 때, 한쪽이 X 가 크면 Y 도 클 확률이
     70% 입니다. 반대인 경우가 30% 이고요."

\(\tau\)는 U-통계량이라는 이론적 이점도 있다. 표본 \(\tau\)가

\[ \hat\tau=\frac{1}{\binom n2}\sum_{i<j}\operatorname{sgn}(x_i-x_j)\operatorname{sgn}(y_i-y_j) \]

로 모든 쌍의 평균이므로, U-통계량 이론이 그대로 적용되어 점근 정규성과 분산 공식이 깔끔하게 나온다.

스피어만에는 그런 구조가 없다. 순위 자체가 모든 자료에 의존하므로 단순한 U-통계량이 아니다.

대가는 계산량이다.

측도 계산 복잡도
피어슨·스피어만 \(O(n\log n)\)
켄들(순진한 구현) \(O(n^2)\)
켄들(병합 정렬 기반) \(O(n\log n)\)

scipy는 병합 정렬 기반을 쓰므로 실무에서 문제가 되지 않는다.

연습문제 6. 연습문제 4의 \(\tau_b\)를 직접 계산하고 scipy와 대조하라. \(\tau_a\), \(\tau_c\)와는 어떻게 다른가?

풀이

세 변형.

\[ \tau_a=\frac{C-D}{\binom n2}, \qquad \tau_b=\frac{C-D}{\sqrt{(C+D+T_x)(C+D+T_y)}}, \qquad \tau_c=\frac{2m(C-D)}{n^2(m-1)} \]

여기서 \(T_x\)는 \(x\)에서만 동점인 쌍의 수, \(m=\min(\text{행 수},\text{열 수})\)다.

import warnings
warnings.filterwarnings("ignore")

import numpy as np
from scipy import stats

x = np.array([1, 2, 2, 3, 4, 4, 4, 5, 6, 7], float)
y = np.array([2, 1, 3, 3, 5, 4, 6, 5, 8, 7], float)
print(f"x = {x.astype(int).tolist()}")
print(f"y = {y.astype(int).tolist()}")
for v in ["b", "c"]:
    r = stats.kendalltau(x, y, variant=v)
    print(f"  tau-{v}: {r.statistic:+.6f}  (p = {r.pvalue:.4f})")

n = len(x)
C = D = Tx = Ty = 0
for i in range(n):
    for j in range(i + 1, n):
        dx, dy = np.sign(x[i] - x[j]), np.sign(y[i] - y[j])
        if dx == 0 and dy == 0:
            pass                      # 양쪽 동점은 어디에도 세지 않는다
        elif dx == 0:
            Tx += 1
        elif dy == 0:
            Ty += 1
        elif dx * dy > 0:
            C += 1
        else:
            D += 1
print(f"\n수동 계산:  일치 C={C}, 불일치 D={D}, x 동점={Tx}, y 동점={Ty}")
print(f"  tau-a = (C-D)/[n(n-1)/2] = {(C - D) / (n * (n - 1) / 2):+.6f}")
print(f"  tau-b = (C-D)/√[(C+D+Tx)(C+D+Ty)] = "
      f"{(C - D) / np.sqrt((C + D + Tx) * (C + D + Ty)):+.6f}")
x = [1, 2, 2, 3, 4, 4, 4, 5, 6, 7]
y = [2, 1, 3, 3, 5, 4, 6, 5, 8, 7]
  tau-b: +0.785937  (p = 0.0024)
  tau-c: +0.770000  (p = 0.0024)

수동 계산:  일치 C=36, 불일치 D=3, x 동점=4, y 동점=2
  tau-a = (C-D)/[n(n-1)/2] = +0.733333
  tau-b = (C-D)/√[(C+D+Tx)(C+D+Ty)] = +0.785937

\(\tau_b\)가 scipy와 소수점 여섯 자리까지 일치한다.

변형 값 특징
\(\tau_a\) \(+0.733\) 동점을 불일치처럼 취급
\(\tau_b\) \(+\mathbf{0.786}\) 동점을 분모에서 보정
\(\tau_c\) \(+0.770\) 정방형이 아닌 표를 보정

\(\tau_a\)가 가장 작다. 동점 쌍 6개가 \(C-D\)에는 기여하지 않으면서 분모 45에는 들어가 값을 눌러 놓는다.

\(\tau_b\)는 동점 쌍을 분모에서 뺀다. 정확히 말하면 기하평균으로 보정한다.

\[ \sqrt{(C+D+T_x)(C+D+T_y)}=\sqrt{43\times41}=42.0 \]

분모가 45에서 42로 줄어 값이 커진다.

\(\tau_b\)의 성질 셋.

  1. 동점이 없으면 \(\tau_a=\tau_b\)다.
  2. \(|\tau_b|\leq1\)이고, 완벽한 단조 관계에서 \(\pm1\)에 도달할 수 있다.
  3. \(\tau_a\)는 동점이 있으면 \(\pm1\)에 도달하지 못한다.

두 번째가 \(\tau_b\)를 기본값으로 만든 이유다. scipy.stats.kendalltau의 기본값이 variant="b"다.

\(\tau_c\)(스튜어트의 \(\tau_c\))는 언제 쓰나. 행과 열의 범주 수가 다른 분할표에서다.

\[ \tau_c=\frac{2m(C-D)}{n^2(m-1)},\qquad m=\min(R,C) \]

\(3\times5\) 표처럼 정방형이 아니면 \(\tau_b\)가 \(\pm1\)에 도달할 수 없어 \(\tau_c\)가 보정한다.

상황 권장
연속 자료, 동점 없음 \(\tau_a=\tau_b\)(같다)
동점이 있는 순위 \(\tau_b\)
정방형이 아닌 분할표 \(\tau_c\)

동점이 매우 많으면 주의가 필요하다. 예를 들어 \(x\)가 이분 변수면 \(T_x\)가 거대해져 \(\tau_b\)가 불안정해진다. 그런 경우에는 순위상관 대신 적절한 연관 측도(파이, 크래머 \(V\))를 쓴다.

연습문제 7. \(\tau\)의 표준오차와 신뢰구간을 만들어라. \(H_0\)의 공식을 그대로 쓰면 되는가?

풀이

\(H_0\) 아래의 정확한 표준오차.

\[ \operatorname{SD}_0(\hat\tau)=\sqrt{\frac{2(2n+5)}{9n(n-1)}} \]

이것은 \(\tau=0\)일 때만 맞는다. 구간을 만들 때 쓰면 안 된다.

피엘러의 수정.

\[ \operatorname{SE}\bigl(\operatorname{arctanh}\hat\tau\bigr)=\sqrt{\frac{0.437}{n-4}} \]
import warnings
warnings.filterwarnings("ignore")

import numpy as np
from scipy import stats

rng = np.random.default_rng(21004)
print("arctanh(τ̂) 의 실제 SD 와 피엘러 공식")
print(f"{'ρ':>6s} {'n':>5s} {'실제 SD':>9s} {'√(0.437/(n-4))':>15s}")
for rho in [0.0, 0.5, 0.8]:
    for n in [20, 50]:
        ts = []
        for _ in range(4_000):
            z = rng.standard_normal((n, 2))
            x = z[:, 0]
            y = rho * z[:, 0] + np.sqrt(1 - rho**2) * z[:, 1]
            ts.append(np.arctanh(stats.kendalltau(x, y).statistic))
        print(f"{rho:6.2f} {n:5d} {np.std(ts, ddof=1):9.4f} "
              f"{np.sqrt(0.437 / (n - 4)):15.4f}")
arctanh(τ̂) 의 실제 SD 와 피엘러 공식
     ρ     n     실제 SD  √(0.437/(n-4))
  0.00    20    0.1666          0.1653
  0.00    50    0.0994          0.0975
  0.50    20    0.1633          0.1653
  0.50    50    0.0961          0.0975
  0.80    20    0.1659          0.1653
  0.80    50    0.0962          0.0975

피엘러 공식이 놀랍도록 정확하다. 여섯 경우 모두 0.002 이내다.

\(\rho\)에 거의 무관하다(0.163~0.167). 이것이 \(\operatorname{arctanh}\) 변환의 효과다. 원 척도에서는 \(\tau\)가 1에 가까울수록 분산이 줄지만, \(z\) 척도에서는 고정된다.

\(H_0\) 공식과 비교하면.

\(n\) \(H_0\) 공식 피엘러(\(z\) 척도)
20 0.1667 0.1653
50 0.1017 0.0975

우연히 비슷하다. \(\tau=0\) 근처에서는 \(\operatorname{arctanh}\tau\approx\tau\)이므로 두 공식이 일치한다. \(\tau\)가 크면 \(H_0\) 공식은 원 척도에서 과대평가한다.

잭나이프·부트스트랩 구간도 잘 작동한다.

def tau_ci_jack(x, y, a=0.05):
    """잭나이프 표준오차를 쓴 켄들 구간."""
    n = len(x)
    t = stats.kendalltau(x, y).statistic
    ts = np.empty(n)
    for i in range(n):
        m = np.ones(n, bool)
        m[i] = False
        ts[i] = stats.kendalltau(x[m], y[m]).statistic
    se = np.sqrt((n - 1) / n * ((ts - ts.mean())**2).sum())
    q = stats.norm.ppf(1 - a / 2)
    return t - q * se, t + q * se

rng = np.random.default_rng(21004)
B = 2_000
print("피복확률 (명목 95%)")
print(f"{'ρ':>6s} {'n':>5s} {'잭나이프':>9s} {'부트스트랩':>11s}")
for rho in [0.0, 0.5, 0.8]:
    for n in [20, 50]:
        kt_th = 2 / np.pi * np.arcsin(rho)
        a = b = 0
        for _ in range(B):
            z = rng.standard_normal((n, 2))
            x = z[:, 0]
            y = rho * z[:, 0] + np.sqrt(1 - rho**2) * z[:, 1]
            lo, hi = tau_ci_jack(x, y)
            a += lo <= kt_th <= hi
            bs = [stats.kendalltau(x[i], y[i]).statistic
                  for i in (rng.integers(0, n, n) for _ in range(200))]
            lo, hi = np.quantile(bs, [0.025, 0.975])
            b += lo <= kt_th <= hi
        print(f"{rho:6.2f} {n:5d} {a / B:9.4f} {b / B:11.4f}")
피복확률 (명목 95%)
     ρ     n      잭나이프       부트스트랩
  0.00    20    0.9380      0.9450
  0.00    50    0.9505      0.9405
  0.50    20    0.9350      0.9510
  0.50    50    0.9575      0.9540
  0.80    20    0.9445      0.9595
  0.80    50    0.9490      0.9535

셋 다 쓸 만하다.

방법 피복확률 계산
피엘러 0.932~0.955 즉시
잭나이프 0.935~0.958 \(O(n^2)\)
부트스트랩 0.941~0.960 무겁다

\(n=20\)에서 잭나이프가 0.935~0.945로 약간 낮다. 부트스트랩이 가장 안정적이다.

실무 권고.

상황 방법
빠르게, 근사적으로 피엘러
동점이 많거나 분포가 이상함 부트스트랩(쌍째 재표집)
\(H_0:\tau=0\) 검정만 \(H_0\) 공식(정확)

검정과 구간에 다른 공식을 쓴다는 점이 혼동의 원인이다. \(H_0\) 공식은 검정에 정확하지만 구간에는 쓸 수 없다.

연습문제 8. 연습문제 3의 주장을 수치로 확인하라. 이상점과 비선형에서 \(\tau\)가 정말 \(r\)보다 나은가?

풀이
import numpy as np
from scipy import stats

rng = np.random.default_rng(20005)
n = 20
z = rng.standard_normal((n, 2))
x, y = z[:, 0], z[:, 1]
print(f"원 자료 (n={n}): 피어슨 {np.corrcoef(x, y)[0, 1]:+.4f}, "
      f"스피어만 {stats.spearmanr(x, y).statistic:+.4f}, "
      f"켄들 {stats.kendalltau(x, y).statistic:+.4f}")

print(f"\n한 점 (a, a) 를 추가하면")
print(f"{'a':>6s} {'피어슨':>9s} {'스피어만':>10s} {'켄들':>9s}")
for a in [3, 10, 100]:
    X, Y = np.append(x, a), np.append(y, a)
    print(f"{a:6d} {np.corrcoef(X, Y)[0, 1]:+9.4f} "
          f"{stats.spearmanr(X, Y).statistic:+10.4f} "
          f"{stats.kendalltau(X, Y).statistic:+9.4f}")

print(f"\n단조 비선형: y = exp(3x)")
xs = np.linspace(-1, 1, 30)
ys = np.exp(3 * xs)
print(f"  피어슨 {np.corrcoef(xs, ys)[0, 1]:+.4f}, "
      f"스피어만 {stats.spearmanr(xs, ys).statistic:+.4f}, "
      f"켄들 {stats.kendalltau(xs, ys).statistic:+.4f}")

print(f"\n단조 비선형: y = x^9")
ys = xs**9
print(f"  피어슨 {np.corrcoef(xs, ys)[0, 1]:+.4f}, "
      f"스피어만 {stats.spearmanr(xs, ys).statistic:+.4f}, "
      f"켄들 {stats.kendalltau(xs, ys).statistic:+.4f}")

print(f"\n비단조: y = x²")
ys = xs**2
print(f"  피어슨 {np.corrcoef(xs, ys)[0, 1]:+.4f}, "
      f"스피어만 {stats.spearmanr(xs, ys).statistic:+.4f}, "
      f"켄들 {stats.kendalltau(xs, ys).statistic:+.4f}")
원 자료 (n=20): 피어슨 +0.3119, 스피어만 +0.3188, 켄들 +0.2000

한 점 (a, a) 를 추가하면
     a       피어슨       스피어만        켄들
     3   +0.5816    +0.4117   +0.2762
    10   +0.9049    +0.4117   +0.2762
   100   +0.9988    +0.4117   +0.2762

단조 비선형: y = exp(3x)
  피어슨 +0.8131, 스피어만 +1.0000, 켄들 +1.0000

단조 비선형: y = x^9
  피어슨 +0.6944, 스피어만 +1.0000, 켄들 +1.0000

비단조: y = x²
  피어슨 -0.0000, 스피어만 -0.0127, 켄들 -0.0070

연습문제 3의 주장이 모두 확인된다.

(가) 이상점. \(a\)가 3이든 100이든 \(\tau\)는 \(+0.2762\)로 고정이다. 피어슨은 \(+0.58\)에서 \(+0.999\)까지 간다.

(나) 단조 비선형. \(y=e^{3x}\)나 \(y=x^9\)처럼 완벽한 단조이면

관계 피어슨 켄들
\(y=e^{3x}\) 0.813 1.000
\(y=x^9\) 0.694 1.000

\(\tau=1\)이 정확히 옳다. 관계가 완벽하게 단조이므로 모든 쌍이 일치한다. 피어슨은 "직선이 아니므로 완벽하지 않다"고 말하는데, 질문이 다르다.

측도 묻는 것
피어슨 직선에 얼마나 가까운가
켄들·스피어만 순서가 얼마나 일치하는가

\(y=x^9\)에서 피어슨이 0.69로 떨어지는 것이 시사적이다. 관계는 결정론적인데도 \(r\)이 1이 아니다.

(다) 비단조에서는 셋 다 0이다. \(y=x^2\)에서 피어슨 \(-0.000\), 스피어만 \(-0.013\), 켄들 \(-0.007\)이다.

\(\tau=0\)을 "무관하다"로 읽으면 완전히 틀렸다. \(y\)는 \(x\)로 완전히 결정된다.

이것이 모든 상관계수의 한계다.

관계 피어슨 순위상관 필요한 도구
선형 잡음 잡음 —
단조 비선형 부분적 잡음 —
비단조(U자, 주기) 0 0 거리 상관, 상호정보

거리 상관(Székely)은 \(y=x^2\)에서도 0이 아니다. 독립일 때만 0이 되는 성질을 갖는다.

실무 절차 셋.

  1. 산점도를 본다. 비단조이면 상관계수를 쓰지 않는다.
  2. 피어슨과 켄들을 비교한다. 켄들이 훨씬 크면 단조 비선형, 피어슨이 훨씬 크면 이상점.
  3. 단조 비선형이면 변환(\(\log y\) 등) 후 피어슨을 쓰거나 순위상관을 보고한다.

연습문제 9. 켄들과 스피어만 중 무엇을 고를지 기준을 세워라.

풀이

두 측도의 값이 다르다. 같은 자료에서 \(r_s>\tau\)인 것이 보통이다.

\[ r_s\approx\frac{3}{2}\tau\quad(\text{이변량 정규에서}) \]
import warnings
warnings.filterwarnings("ignore")

import numpy as np
from scipy import stats

rng = np.random.default_rng(21006)
print("이변량 정규에서 두 측도의 비")
print(f"{'ρ':>6s} {'스피어만':>9s} {'켄들':>8s} {'r_s/τ':>8s} {'3/2':>6s}")
for rho in [0.2, 0.4, 0.6, 0.8, 0.95]:
    z = rng.standard_normal((5_000, 2))
    x = z[:, 0]
    y = rho * z[:, 0] + np.sqrt(1 - rho**2) * z[:, 1]
    rs = stats.spearmanr(x, y).statistic
    tk = stats.kendalltau(x, y).statistic
    print(f"{rho:6.2f} {rs:9.4f} {tk:8.4f} {rs / tk:8.4f} {1.5:6.2f}")

print("\n검정력 비교 (ρ=0.3, 정규)")
B = 6_000
print(f"{'n':>5s} {'스피어만':>9s} {'켄들':>8s}")
for n in [20, 50, 100]:
    b = c = 0
    for _ in range(B):
        z = rng.standard_normal((n, 2))
        x = z[:, 0]
        y = 0.3 * z[:, 0] + np.sqrt(0.91) * z[:, 1]
        b += stats.spearmanr(x, y).pvalue < 0.05
        c += stats.kendalltau(x, y).pvalue < 0.05
    print(f"{n:5d} {b / B:9.4f} {c / B:8.4f}")
이변량 정규에서 두 측도의 비
     ρ      스피어만       켄들    r_s/τ    3/2
  0.20    0.1854   0.1242   1.4929   1.50
  0.40    0.3884   0.2640   1.4710   1.50
  0.60    0.5659   0.3978   1.4225   1.50
  0.80    0.7922   0.5963   1.3286   1.50
  0.95    0.9451   0.7970   1.1858   1.50

검정력 비교 (ρ=0.3, 정규)
    n      스피어만       켄들
   20    0.2262   0.2147
   50    0.5280   0.5235
  100    0.8310   0.8272

\(r_s/\tau\)가 작은 \(\rho\)에서 1.5에 가깝고 큰 \(\rho\)에서 1로 간다.

\(\rho\) \(r_s/\tau\)
0.2 1.49
0.6 1.42
0.95 1.19

\(3/2\) 근사는 \(\rho\)가 작을 때만 좋다. 둘 다 \(\pm1\)로 수렴하므로 비가 1에 가까워진다.

검정력은 거의 같다. \(n=100\)에서 0.831 대 0.827로 0.4%포인트 차이다. 검정력으로 고를 이유가 없다.

선택 기준 다섯.

기준 켄들 스피어만
해석 확률로 직접 없음
계산 \(O(n\log n)\) \(O(n\log n)\)
동점 처리 \(\tau_b\)가 명확 평균 순위(관례)
작은 표본 더 안정적 약간 변동이 큼
관례 덜 쓰임 더 널리 쓰임
이론 U-통계량 복잡

실무에서는 관례가 크게 작용한다. 스피어만이 더 널리 보고되므로 독자가 익숙하다.

켄들을 권하는 경우 셋.

  1. 동점이 많다(서열 척도, 등급).
  2. 표본이 작다(\(n<20\)).
  3. 확률로 설명해야 한다(비전문가 대상).

스피어만을 권하는 경우 둘.

  1. 피어슨과 직접 비교하고 싶다(\(\rho_s\approx\rho\)).
  2. 관례를 따라야 한다.

둘 다 보고해도 좋다. 방향과 유의성이 같으면 결론이 방법에 민감하지 않다는 증거다.

주의 — 값을 비교할 때. "\(\tau=0.3\)이 \(r_s=0.4\)보다 작다"고 말하면 안 된다. 다른 척도이므로, 같은 자료에서 \(\tau=0.3\)이면 \(r_s\approx0.44\)일 것이다.

연습문제 10. 켄들의 \(\tau\)에 대한 사용 지침을 정리하라.

풀이

정의.

\[ \hat\tau=\frac{C-D}{\binom n2} \qquad(\text{동점이 없을 때}) \]

해석. \(P(\text{일치})=\dfrac{1+\tau}{2}\).

핵심 수치 여섯.

사실 값
이변량 정규에서 \(\tau\) \(\frac{2}{\pi}\arcsin\rho\)
\(\rho=0.8\)일 때 \(\tau\) 0.59(일치 확률 79.5%)
\(r_s/\tau\) 1.18~1.48
\(H_0\)의 정확한 SD \(\sqrt{\frac{2(2n+5)}{9n(n-1)}}\)
구간의 SE \(\sqrt{\frac{0.437}{n-4}}\)(\(z\) 척도)
스피어만 대비 검정력 거의 동일

언제 쓰나.

상황 \(\tau\)가 적절한가
동점이 많은 순위 자료 그렇다(\(\tau_b\))
확률로 설명해야 함 그렇다
작은 표본 그렇다
단조 비선형 그렇다
선형 · 정규 피어슨이 낫다
비단조 부적절(셋 다)

변형의 선택.

변형 언제
\(\tau_a\) 동점이 없을 때(= \(\tau_b\))
\(\tau_b\) 기본값, 동점 보정
\(\tau_c\) 정방형이 아닌 분할표

scipy 사용법.

stats.kendalltau(x, y)                  → τ_b (기본값), p
stats.kendalltau(x, y, variant="c")     → τ_c
stats.kendalltau(x, y, method="exact")  → 정확 p (동점이 없을 때)

주의: 동점이 있으면 method="exact" 를 쓸 수 없다

추론.

목적 방법
\(H_0:\tau=0\) \(z=\hat\tau/\operatorname{SD}_0\), 정확 SD
\(n<10\), 동점 없음 정확 순열검정
\(\tau\)의 구간 피엘러 또는 부트스트랩
동점이 많음 부트스트랩

흔한 오해 넷.

오해 사실
\(\tau\)와 \(r\)을 같은 기준으로 해석 \(\tau\)가 체계적으로 작다
\(\tau=0\)이면 독립 비단조 관계를 놓친다
\(H_0\) SD를 구간에 사용 \(\tau\neq0\)에서 틀린다
\(\tau\)가 느리다 \(O(n\log n)\) 구현이 표준

첫 줄이 가장 흔하다. "\(\tau=0.3\)은 작은 효과"라고 쓰면 안 된다. 대응하는 \(\rho\)는 약 0.45로 중간 이상이다.

\[ \rho=\sin\frac{\pi\tau}{2} \]

\(\tau=0.3\)이면 \(\rho=\sin(0.471)=0.454\)다.

보고 형식.

교육 수준(6단계)과 소득 구간(8단계)의 연관

  켄들 τ_b = 0.34,  95% CI [0.27, 0.41],  n = 420,  p < 0.001
  → 두 사람을 무작위로 뽑으면 67% 에서 순서가 일치한다
  (대응하는 피어슨 척도로는 약 0.51)

  두 변수 모두 서열 척도이고 동점이 많아 τ_b 를 사용했다.

일치 확률로 번역한 문장을 넣는 것이 \(\tau\) 보고의 강점이다.

한 문장. 켄들의 \(\tau\)는 "순서가 맞을 확률"을 직접 재는 측도이며, 동점이 많고 표본이 작은 서열 자료에서 가장 믿을 만하다.


정리하며

Kendall의 타우는 일치쌍과 불일치쌍을 비교하여 단조 연관을 잰다. 타우-b 변형은 동점을 조정하며 실무의 표준 선택이다. 같은 자료에서 Spearman의 \(r_s\)보다 절댓값이 작은 경향이 있지만 직접적인 확률적 해석과 더 나은 소표본 성질을 제공한다. 둘 다 비선형 단조 관계에 대해 Pearson의 \(r\)을 대신하는 로버스트한 순위 기반 대안이다.