2026년 6월 12일 | 개발 공부
Kruskal-Wallis 검정은 서로 짝지을 수 없는 세 묶음 이상의 값을 순위로 바꿔 비교하는 비모수 검정이다. 두 독립 표본이면 Mann-Whitney U test를 떠올리면 되는데, 그 질문이 세 그룹 이상으로 늘어나면 Kruskal-Wallis 쪽이 먼저 후보가 된다. 평균이 아니라 전체 값을 한 줄로 섞은 뒤 rank 합이 한쪽 그룹에 치우쳤는지 보는 방식이라, outlier가 꽤 있거나 분포 모양을 정규분포로 보기 애매한 평가 로그에서 손이 간다.
나는 이 검정을 처음 볼 때 Friedman test와 자주 헷갈렸다. 둘 다 세 설정 이상을 rank로 비교하고, 결과도 전체 차이 신호를 먼저 묻기 때문이다. 갈림길은 생각보다 단순하다. 같은 query, 같은 seed, 같은 사용자처럼 모든 설정이 같은 block을 지나갔다면 Friedman 쪽이다. 반대로 A 그룹의 샘플과 B 그룹의 샘플이 서로 다른 독립 묶음이라면 Kruskal-Wallis 쪽이 자연스럽다.
paired 구조를 만들 수 없는 표
예를 들어 세 검색 시스템의 로그를 비교한다고 하자. 이상적인 실험이면 같은 query set을 세 시스템에 모두 통과시켜 paired delta를 만들고, Friedman이나 paired permutation으로 내려갈 수 있다. 그런데 실제 운영 로그에서는 시스템마다 들어온 query 분포가 다를 때가 있다. A는 내부 사용자 로그, B는 베타 사용자 로그, C는 공개 데모 로그라면 query를 1:1로 맞추기 어렵다. 이때 평균 nDCG만 비교하면 로그 구성 차이와 outlier가 결론을 쉽게 흔든다.
Kruskal-Wallis는 이런 표에서 각 값을 하나의 긴 목록으로 모은 뒤, 작은 값부터 큰 값까지 순위를 붙인다. 그다음 그룹별 rank 합이나 평균 rank가 비슷한지 본다. 한 그룹이 실제로 높은 값 쪽에 자주 놓이면 평균 rank가 올라가고, 낮은 값 쪽에 몰리면 내려간다. 그래서 “평균은 비슷한데 분포 전체가 살짝 밀린 것 아닌가” 같은 질문을 한 번 더 점검할 수 있다.
다만 이 검정이 모든 운영 로그를 공정하게 만들어 주지는 않는다. 독립 표본이라는 말은 샘플들이 서로 짝을 이루지 않는다는 뜻이지, 세 그룹의 데이터 수집 조건이 아무렇게나 달라도 된다는 뜻은 아니다. 사용자군, 시간대, query 난이도, 필터링 조건이 크게 다르면 rank 차이는 모델 성능보다 데이터 구성 차이를 반영할 수 있다. 그래서 나는 Kruskal-Wallis를 쓰기 전에 그룹 정의부터 노트에 적는다.
전체 신호와 사후 비교를 나누기
Kruskal-Wallis 결과가 유의하게 나왔다고 해서 바로 “세 그룹이 모두 다르다”라고 쓰면 위험하다. 이 검정은 기본적으로 적어도 한 그룹의 분포 위치가 다를 수 있다는 전체 신호를 준다. 어느 쌍이 갈라졌는지는 별도 사후 비교로 내려가야 한다. 두 그룹씩 다시 Mann-Whitney U test를 열고, Holm-Bonferroni 같은 보정을 붙이는 방식이 흔한 이유가 여기에 있다.
이 흐름은 Friedman 다음에 Nemenyi나 쌍별 Wilcoxon으로 내려가는 구조와 닮았다. 차이는 paired 구조를 유지하느냐 버리느냐다. 같은 평가 단위를 공유하는 표에서는 paired 정보를 최대한 살리는 쪽이 낫고, 애초에 공유 단위를 만들 수 없는 표에서는 독립 표본 rank 비교로 질문을 바꾸는 편이 낫다. 검정 이름보다 먼저 “내 샘플이 서로 짝인가”를 적어 두면 길을 덜 잃는다.
사후 비교에서도 p-value만 남기지 않는 편이 좋다. 그룹별 샘플 수, median, IQR, 평균 rank, 큰 차이를 만든 샘플 몇 개를 함께 봐야 한다. 특히 로그 수가 한쪽만 많으면 전체 rank가 작은 차이에도 민감해질 수 있고, tie가 많으면 rank 해석이 뭉개진다. 이런 조건을 빼고 별표만 표에 붙이면, 나중에 다시 읽을 때 무엇이 실제 차이였는지 거의 남지 않는다.
내가 남기는 최소 메모
작은 평가 노트에서 Kruskal-Wallis를 쓸 때 내가 남기는 항목은 다섯 가지다. 첫째, 왜 paired 비교를 못 했는지. 둘째, 그룹별 샘플 수와 수집 조건. 셋째, median과 IQR. 넷째, 평균 rank와 전체 p-value. 다섯째, 사후 비교를 열었다면 어떤 보정을 붙였는지다. 이 정도만 있어도 “대충 세 로그를 비교했다”가 아니라, 독립 묶음 비교라는 제약을 인정한 기록이 된다.
효과 크기도 따로 본다. 두 그룹 비교라면 Cliff's delta가 손에 잘 잡히고, 세 그룹 이상에서는 pairwise 효과 크기를 함께 두거나 epsilon-squared 계열 값을 보조로 볼 수 있다. 핵심은 유의성 신호와 차이의 크기를 분리하는 것이다. 샘플이 많으면 작은 차이도 유의해질 수 있고, 샘플이 적으면 꽤 큰 차이도 검정표에서는 흐릿해질 수 있다.
반대로 이 검정을 일부러 쓰지 않는 경우도 있다. 같은 query set을 세 설정이 모두 통과했다면 독립 표본처럼 풀지 않는다. 그 순간에는 query별 난이도라는 공통 배경을 버리는 셈이라, Friedman이나 paired permutation으로 가는 편이 정보 손실이 적다. 또 그룹별 분포 모양이 너무 다르면 Kruskal-Wallis의 rank 위치 차이를 “중앙값 차이”처럼 단순하게 말하지 않는다. 한쪽은 꼬리가 길고, 다른 한쪽은 값이 두 봉우리로 갈라진다면 전체 rank 신호는 원인을 섞어서 보여 줄 수 있다.
그래서 표 옆에는 작은 sanity check를 붙인다. 그룹별 histogram을 아주 거칠게라도 보고, tie가 많은 metric인지 확인하고, 수집 기간이나 필터 조건이 한쪽에만 붙었는지 적는다. 통계 검정은 이 확인을 대신해 주지 않는다. 오히려 검정이 유의하게 나왔을 때 “모델 차이인지, 로그 구성 차이인지”를 다시 묻게 만드는 장치에 가깝다.
실무 로그에서는 이 한 줄이 꽤 중요하다. 검정 결과를 슬랙에 붙이기 전, 나는 보통 “paired 아님”, “수집 조건 다름”, “사후 비교 필요” 같은 짧은 주석을 먼저 둔다. 그러면 숫자가 결론처럼 굳기 전에, 이 표가 답할 수 있는 질문의 폭이 자연스럽게 좁아진다.
정리하면 Kruskal-Wallis 검정은 독립적인 세 묶음 이상의 점수 분포를 rank로 비교하는 도구다. 내 기준에서는 모델 우승자를 뽑는 도장이라기보다, paired 비교를 만들 수 없는 평가 로그에서 “어느 그룹의 분포가 한쪽으로 밀렸는가”를 먼저 보는 얇은 필터에 가깝다. 이 필터를 통과한 뒤에야 사후 비교, 효과 크기, 샘플 구성 점검으로 내려가는 순서가 덜 흔들린다.
'[개발 공부]' 카테고리의 다른 글
| Hodges-Lehmann 추정량: p-value 옆 중앙 차이 (0) | 2026.06.16 |
|---|---|
| Dunn 사후검정: Kruskal-Wallis 뒤의 쌍별 rank 비교 (0) | 2026.06.15 |
| Nemenyi 사후검정: Friedman 다음 쌍별 rank 비교 (0) | 2026.06.11 |
| Kendall's W: Friedman 검정 옆 효과 크기 (0) | 2026.06.04 |
| Friedman 검정: 세 설정을 같은 query set에서 비교하기 (1) | 2026.06.03 |