[개발 공부] / Mann-Whitney U 검정: 두 묶음의 순위 비교.md

Mann-Whitney U 검정: 두 묶음의 순위 비교

조회

2026년 5월 27일 | 개발 공부


Mann-Whitney U 검정은 두 독립 표본의 값이 어느 쪽으로 더 자주 큰지 순위로 비교하는 비모수 검정이다. 평균이 몇 점 차이 나는지를 바로 묻기보다, A 묶음에서 하나를 뽑고 B 묶음에서 하나를 뽑았을 때 A가 더 큰 경우가 얼마나 자주 생기는지를 본다. 나는 처음 이 검정을 봤을 때 “t-test의 비모수 버전” 정도로만 외웠는데, 실제 평가 로그에 붙여 보니 그렇게 단순하게 부르면 놓치는 부분이 꽤 있었다.

가장 먼저 갈라야 하는 것은 paired인지 independent인지다. 같은 query, 같은 seed, 같은 edge를 두 설정이 함께 지나간 결과라면 샘플은 서로 짝이 있다. 이때는 Wilcoxon signed-rank test나 paired permutation test처럼 짝 구조를 보존하는 쪽이 자연스럽다. 반대로 서로 다른 사용자 그룹, 서로 다른 테스트 묶음, 혹은 같은 단위로 맞출 수 없는 두 결과 묶음이라면 Mann-Whitney U가 더 맞는 출발점이 된다.

예를 들어 추천 모델 A와 B를 비교하는데, A는 지난주 운영 로그 80개 세션에서, B는 이번 주 별도 실험 로그 80개 세션에서 얻은 점수라고 해 보자. 두 로그가 같은 사용자나 같은 query로 맞춰져 있지 않다면 “각 세션별 차이”를 만들 수 없다. 이 상황에서 평균 점수만 비교하면 outlier가 눈에 너무 크게 들어온다. Mann-Whitney U는 점수를 한 줄로 섞어 순위를 매긴 뒤, 한쪽 묶음이 높은 순위를 얼마나 많이 가져가는지로 차이 신호를 본다.

코드로는 보통 이렇게 시작한다.

from scipy.stats import mannwhitneyu

stat, p = mannwhitneyu(scores_a, scores_b, alternative="two-sided")
print(stat, p)

여기서 조심할 점은 p-value만 보고 “A가 이겼다”로 닫지 않는 것이다. p-value는 두 묶음이 같은 분포에서 왔다고 볼 때 지금만큼 순위 차이가 나올 가능성을 묻는 값에 가깝다. 실무 로그에서는 샘플 수가 커지면 작은 차이도 유의하게 보일 수 있고, 반대로 샘플 수가 작으면 꽤 일관된 차이도 애매하게 남는다. 그래서 나는 Mann-Whitney U를 쓸 때 효과 크기와 같이 적는 습관을 더 중요하게 본다.

이때 옆에 붙이기 좋은 값이 Cliff's delta다. Cliff's delta는 “A가 B보다 큰 쌍의 비율 - B가 A보다 큰 쌍의 비율”로 읽을 수 있어서, Mann-Whitney U가 보고 있는 순위 비교의 감각과 잘 맞는다. p-value가 작아도 Cliff's delta가 0 근처라면 차이는 있지만 운영 판단까지 밀어붙이기엔 약할 수 있다. 반대로 p-value가 애매해도 delta가 꽤 크고 샘플 수가 작다면, 다음 실험에서 더 볼 후보로 남길 이유가 생긴다.

두 번째 함정은 tie 처리다. 평가 점수가 0/1 성공 여부처럼 거칠거나, nDCG를 소수 몇 자리에서 잘라 저장하면 같은 값이 많이 생긴다. tie가 많으면 순위 기반 검정의 해석이 흐려진다. 이런 경우에는 원래 metric 해상도를 유지할 수 있는지, 성공/실패 표로 바꿔 McNemar test를 보는 편이 나은지, 아니면 bootstrap confidence interval로 평균 차이의 흔들림을 보는 편이 나은지 다시 확인해야 한다.

세 번째는 방향이다. SciPy의 alternative="greater"를 쓸 때는 scores_a가 scores_b보다 큰 방향을 검정한다. metric이 낮을수록 좋은 latency, error rate, rank 같은 값이면 방향을 뒤집어 읽어야 한다. 나는 이런 실수를 한 번 하고 나서부터 결과 표에 metric direction을 따로 적는다. “higher is better”인지 “lower is better”인지가 표 머리에 없으면, 나중에 p-value와 effect size의 부호를 다시 볼 때 꽤 쉽게 헷갈린다.

작게라도 절차를 고정해 두면 실수가 줄어든다. 나는 먼저 두 묶음이 같은 평가 단위로 짝지어지는지 확인하고, 짝이 없을 때만 Mann-Whitney U 후보로 올린다. 그다음 metric 방향, tie 비율, 샘플 수, outlier 몇 개를 한 화면에 둔다. 마지막으로 p-value 옆에 Cliff's delta나 승패 비율을 같이 적는다. 이 네 줄을 빼먹으면 검정 이름은 맞게 썼는데 해석은 평균 비교와 크게 다르지 않게 흘러간다. 특히 실험 노트에는 “왜 paired 검정을 쓰지 않았는가”를 한 문장 남겨 두면 나중에 표를 다시 볼 때 훨씬 편하다.

내 기준에서 Mann-Whitney U는 결론 도장보다 평균표가 의심스러울 때 여는 보조 렌즈에 가깝다. 평균은 좋아졌는데 몇 개 outlier가 끌고 간 것인지, 중앙값은 비슷한데 상위권 순위가 한쪽으로 쏠렸는지, 같은 paired unit으로 묶을 수 없는 로그를 어떻게 읽어야 하는지 확인하는 용도다. 그래서 최종 표에는 평균, 중앙값, Mann-Whitney U p-value, Cliff's delta, 샘플 수, tie 비율을 같이 둔다. 숫자 하나가 아니라 여러 얇은 신호를 겹쳐 놓아야 다음 실험을 덜 감으로 고르게 된다.

댓글

홈으로 돌아가기

검색 결과

"" 검색 결과입니다.