순위 데이터의 관계와 합치도를 읽는 Spearman·Kendall 지표
Spearman rho, Kendall tau, Kendall W로 순위 데이터의 단조 관계와 평가자 간 합치도를 측정하고 운영에 적용하는 방법을 정리한다.
2026-08-14 · 최초 발행 2024-04-29
값 대신 순서로 관계를 측정할 때
순위 상관은 순서형·서열형 데이터 사이의 단조 관계 강도를 보는 방법이다. 원래 값의 크기나 간격 대신 순위를 사용하므로, 이상치와 비선형성이 있는 데이터에도 강건한 비모수 통계 지표가 된다.
두 순위 변수의 관계를 볼 때는 Spearman's rho(ρ) 또는 Kendall's tau(τ)를 사용한다. 여러 평가자나 모델이 동일한 항목을 순위화한 결과의 합치도는 Kendall's W로 측정한다.
Spearman's rho (ρ)
Spearman's rho는 각 변수의 값을 순위로 바꾼 뒤 Pearson 상관계수를 계산한다. 단조(monotonic) 관계를 감지하는 데 적합하며, 계수는 -1(완전 역순)부터 1(완전 순서 일치)까지의 범위를 가진다. 0은 관계가 없음을 뜻한다.
값 사이의 간격 정보는 반영하지 않고 순위 차이에 반응한다. 동률(ties)이 있으면 평균 순위 처리가 필요하다.
Kendall's tau (τ)
Kendall's tau는 가능한 모든 순서쌍에서 일치(Concordant)와 불일치(Discordant)가 차지하는 비율 차이를 바탕으로 한다. 따라서 순서가 얼마나 일관되게 유지되는지 직접 다룬다.
τ-a는 동률이 없을 때, τ-b는 동률 보정이 필요할 때, τ-c는 대칭표 변형에 사용한다. 실무에서는 τ-b 사용을 권장한다. 범위는 -1부터 1까지이며, 표본이 작거나 동률이 많은 경우 해석 안정성이 우수하다.
Kendall's W로 보는 집단 순위 합치도
Kendall's W는 여러 평가자 또는 모델이 같은 항목 집합에 매긴 순위가 얼마나 일치하는지 측정한다. 집단 수준의 순위 일치도를 나타내며, 0은 무작위 수준, 1은 완전 합치에 해당한다.
검정은 근사적으로 χ² ≈ m·(n-1)·W, 자유도 n-1을 사용한다. 여기서 m은 평가자 수, n은 항목 수다. 평가자 간 신뢰도나 모델 앙상블의 순위 일관성을 평가할 때 쓸 수 있다.
지표를 계산하기 전에 정할 운영 규칙
순서형·서열형 데이터를 전제로 하며, 동률이 발생하면 평균 순위를 부여한다. τ-b와 W에는 동률 보정 항을 적용한다. 결측치는 공통 관측치의 교집합으로 제한하고, 결측 비율이 높다면 편향도 점검해야 한다.
ρ와 τ는 두 변수의 단조 관계 강도와 방향을 나타낸다. W는 다수 평가자의 집단 합치도를 다룬다. 효과 크기는 약 0.10.3을 약함, 0.30.5를 중간, >0.5를 강함으로 보는 관례가 있지만 도메인에 맞춰 재조정할 필요가 있다.
계산 비용도 선택 기준이 된다. ρ는 정렬 O(n log n)과 상관 계산 O(n)으로 구성되어 대규모 데이터에 적합하다. τ는 기본적으로 O(n²)이지만 고급 알고리즘을 사용하면 O(n log n)까지 가능하며, 동률이 많을수록 비용이 증가한다. W는 평가자별 랭킹에 O(m·n log n), 합산에 O(n)이 들며 m·n이 큰 패널 데이터에서도 효율적이다.
ρ와 τ는 이상치와 비선형성에 강건하다. 특히 τ는 작은 샘플과 동률이 많은 데이터에서 더 안정적이다. p-value와 신뢰구간은 표본 크기가 크면 정규 근사를, 작으면 순열 또는 부트스트랩을 권장한다.
입력부터 품질 판단까지의 흐름
랭킹 품질과 평가 프로세스에 적용하는 방법
검색·추천 랭킹에서는 시스템이 만든 순위와 인간 평가 순위가 얼마나 일치하는지 확인할 수 있다. 평가 셋을 수집하고 동률 처리 규칙을 확정한 뒤 ρ 또는 τ를 산출한다. 통계적 유의성을 보고하고, 결과를 릴리스 게이트 조건으로 둘 수 있다.
모델 앙상블이나 패널 평가에서는 모델 K개 또는 평가자 m명의 합치도를 Kendall’s W로 검증한다. 항목별 점수를 랭킹으로 바꾼 후 W를 계산하고 χ² 검정을 수행한다. 임계값에 미달하면 캘리브레이션이나 가이드라인 재교육을 검토한다.
의료·금융 위험 점수처럼 전문가의 수기 순위와 모델 위험도 순위를 비교하는 경우에도 활용할 수 있다. 비선형 관계가 존재할 때 ρ와 τ를 사용하고, 전문가 패널의 합의 순위를 기준으로 편차가 큰 영역을 찾아 피처 또는 정책을 수정한다.
주관식 채점과 태깅 품질 관리에서는 W로 평가자 간 신뢰도를 관리한다. 주기적으로 표본을 추출해 재평가하고 W 추세를 모니터링하며, 임계 이하 평가자는 재교육한다.
지표별 선택 기준
| 지표 | 성능(시간복잡도) | 확장성 | 일관성(단조함수 하) | 안정성(이상치/동률) | 운영 편의 |
|---|---|---|---|---|---|
| Spearman ρ | O(n log n) | 대규모 n에 우수 | 높음(단조 변환 불변) | 이상치 강건, 동률 평균랭크 필요 | 라이브러리 풍부, 해석 직관 |
| Kendall τ-b | 기본 O(n²), 고급 O(n log n) | 대규모 n은 최적화 필요 | 매우 높음(쌍 비교 기반) | 동률 보정 내장, 작은 표본에 안정 | 랭킹 역전 민감도 높음 |
| Kendall’s W | O(m·n log n + n) | m·n 증가에 선형적 | 집단 합치도 전용 | 동률 보정 필요 시 공식 지원 | 평가자/모델 합치도 표준 |
ρ는 빠른 진단과 탐색적 데이터 분석(EDA)의 기본값으로 쓸 수 있다. τ는 순위 역전에 민감한 랭킹 품질 및 페어 비교에 맞고, W는 평가자·모델 합치도 QA와 레이블링 품질 관리에 적합하다.
Python으로 Kendall's W 계산하기
전제조건은 다음과 같다.
- Python 3.10+, numpy 1.26+, scipy 1.11+
- 표본 수 충분 시 정규 근사, 소표본은 부트스트랩 권장
# pip install numpy scipy
import numpy as np
from scipy.stats import spearmanr, kendalltau, rankdata, chi2
def kendalls_w(scores: np.ndarray):
"""
Kendall's W (tie-corrected).
scores: shape (m, n) = (raters, items), 실수/정수 점수 허용
반환: (W, chi2_stat, p_value)
"""
if scores.ndim != 2:
raise ValueError("scores must be 2D (raters x items)")
m, n = scores.shape
if m < 2 or n < 2:
return np.nan, np.nan, np.nan
# 각 평가자(rater)별 항목 순위화(동률은 평균순위)
ranks = np.apply_along_axis(rankdata, 1, scores, method='average') # (m, n)
Rj = ranks.sum(axis=0) # 항목별 랭크 합
Rbar = m * (n + 1) / 2
S = np.sum((Rj - Rbar) ** 2)
# 동률 보정항 T = sum_r sum_g (t^3 - t), g는 rater r의 tie group
T = 0.0
for r in range(m):
_, counts = np.unique(scores[r, :], return_counts=True)
T += np.sum(counts**3 - counts)
denom = (m**2) * (n**3 - n) - m * T
if denom <= 0:
return np.nan, np.nan, np.nan
W = 12 * S / denom
# 근사적 유의성 검정: chi-square with df = n - 1
chi2_stat = m * (n - 1) * W
p_val = 1 - chi2.cdf(chi2_stat, df=n - 1)
return float(W), float(chi2_stat), float(p_val)
# 예시 데이터
x = np.array([10, 20, 30, 40, 50, 60])
y = np.array([9, 18, 35, 33, 55, 62])
rho, p_rho = spearmanr(x, y) # Spearman's rho
tau, p_tau = kendalltau(x, y, variant='b') # Kendall's tau-b
# 3명의 평가자가 6개 항목을 평가(점수 -> 랭킹)
scores = np.array([
[3.0, 2.0, 5.0, 1.0, 4.0, 4.0], # rater 1 (동률 포함)
[2.0, 2.0, 5.0, 1.0, 3.0, 4.0], # rater 2
[3.0, 1.0, 4.0, 1.0, 5.0, 2.0], # rater 3
])
W, chi2_stat, p_w = kendalls_w(scores)
print(f"Spearman rho={rho:.3f}, p={p_rho:.3g}")
print(f"Kendall tau-b={tau:.3f}, p={p_tau:.3g}")
print(f"Kendall W={W:.3f}, chi2={chi2_stat:.3f}, p={p_w:.3g}")
동률 규칙은 평균순위(method='average')로 고정해 일관되게 적용한다. 결측치와 동일값 열은 확인하고, 분산 0 변수는 ρ와 τ를 계산할 수 없으므로 제외한다. 표본 n<20 또는 동률이 다수라면 순열·부트스트랩으로 p-value를 보강한다.
리포트에는 ρ·τ·W, 95% CI, 표본 크기, 동률 비율, 전처리 규칙을 함께 기록한다.
순위 지표가 만드는 운영상의 변화
ρ와 τ를 사용하면 이상치와 비선형성 하에서도 상관 검출 민감도를 유지할 수 있으며, Pearson 대비 거짓 음성을 줄일 수 있다. W는 평가자 합치도를 정량화해 W ≥ 0.7 같은 관리 임계값을 설정하고 품질 게이트를 자동화하는 데 활용할 수 있다.
서로 다른 스케일의 점수와 등급도 단일 랭킹 프레임으로 통합해 비교할 수 있다. 모델과 평가 프로세스의 신뢰도를 높이고 의사결정의 근거를 강화하는 데도 연결된다.