[개발 공부] / Friedman 검정: 세 설정을 같은 query set에서 비교하기.md

Friedman 검정: 세 설정을 같은 query set에서 비교하기

조회

2026년 6월 3일 | 개발 공부


Friedman 검정은 같은 평가 단위를 여러 설정이 함께 지나갔을 때, 평균 점수 하나로 세 설정 이상을 바로 줄 세우기 전에 순위 차이가 우연처럼 보이는지 확인하는 비모수 검정이다. 나는 검색이나 GraphRAG 평가 로그를 볼 때 A/B 두 설정만 비교하면 마음이 편했는데, 실제로는 baseline, rerank, graph boost처럼 후보가 세 개 이상으로 늘어나는 순간이 더 많았다. 그때마다 평균 nDCG만 보고 “2번 설정이 제일 좋다”라고 적어 두면, 같은 query set 위에서 반복 측정됐다는 구조를 너무 쉽게 버리게 된다. 작은 로그일수록 이 차이가 더 크게 느껴진다.

핵심은 독립된 세 묶음 비교가 아니라 같은 블록 안의 순위 비교라는 점이다. query 100개가 있고, 각 query마다 세 retrieval profile의 점수가 있다면 query 하나가 하나의 block이 된다. Friedman 검정은 각 query 안에서 세 profile에 순위를 매긴 뒤, 특정 profile이 전반적으로 높은 순위를 받는지 본다. 평균 점수의 절대 차이를 직접 쓰기보다 block마다 상대 순위를 보므로, 점수 스케일이 query마다 다르게 출렁이는 상황에서도 꽤 단단한 보조 렌즈가 된다.

A/B 비교에서 막히는 지점

두 설정만 비교할 때는 paired permutation test나 Wilcoxon signed-rank test를 먼저 떠올리기 쉽다. 같은 query의 delta를 만들고, 그 delta가 어느 방향으로 쏠리는지 보면 된다. 그런데 후보가 세 개가 되면 비교쌍이 바로 늘어난다. A와 B, A와 C, B와 C를 각각 보면 p-value도 세 개가 나오고, Holm-Bonferroni나 Benjamini-Hochberg 같은 multiple-comparison 보정까지 붙여야 한다.

그 자체가 틀린 접근은 아니다. 다만 “세 설정 중 적어도 하나가 다른가”라는 질문과 “어느 두 설정이 다른가”라는 질문을 한 번에 섞으면 해석이 지저분해진다. Friedman 검정은 여기서 먼저 전체 차이 신호를 묻는다. 전체 후보군 안에 순위 차이가 있는지를 확인하고, 신호가 있을 때만 사후 비교로 내려가는 식이다. 나는 이 순서를 두면 실험 노트가 덜 흥분한다. 처음부터 모든 쌍을 펼쳐 놓고 유의한 조합을 찾아다니는 습관을 조금 눌러 주기 때문이다.

실험 로그에서는 무엇을 남길까

내가 작은 평가 스크립트에 붙인다면 결과 표에는 대략 네 가지를 남길 것 같다. 첫째, block이 무엇인지다. retrieval이면 query id, GNN seed 비교라면 seed나 edge group, 추천 평가라면 user id처럼 같은 평가 단위가 반복 측정되는지 먼저 고정한다. 둘째, 각 block 안에서 동점 처리를 어떻게 했는지다. metric 해상도가 낮으면 tie가 꽤 자주 생기고, 이 tie 처리가 순위 평균에 영향을 준다.

query_id | baseline | rerank | graph_boost
q001     | 0.42     | 0.55   | 0.51
q002     | 0.80     | 0.78   | 0.84
q003     | 0.10     | 0.25   | 0.22

셋째, 평균 rank를 같이 남긴다. Friedman p-value만 보면 결국 또 유의성 문장으로 빨려 들어간다. 반대로 profile별 평균 rank를 옆에 두면 어느 설정이 꾸준히 앞서는지, 아니면 한두 query에서 크게 이겨서 평균 점수만 올린 것인지 다시 보게 된다. 넷째, 사후 비교를 했다면 어떤 보정을 붙였는지 기록한다. Nemenyi test를 쓰든, 쌍별 Wilcoxon에 Holm 보정을 붙이든, “전체 검정 통과 후 내려간 비교”라는 상태가 남아 있어야 다음에 로그를 읽는 사람이 덜 헷갈린다.

실제로는 이 네 가지 옆에 실패 샘플도 붙여 두는 편이 좋다. 예를 들어 평균 rank는 graph boost가 제일 낮게 나왔는데, 특정 질의군에서는 baseline이 계속 앞선다면 그 질의군은 다음 라운드의 디버깅 후보가 된다. 통계 검정은 “어느 설정이 이겼다”라고 선언하는 장치라기보다, 어떤 결과를 다시 열어 볼지 줄여 주는 압축 장치에 가깝다. 나는 그래서 p-value 옆에 query id 몇 개를 같이 남기는 쪽을 더 믿는다.

언제 쓰지 않는 편이 나은가

Friedman 검정이 만능은 아니다. 같은 block을 만들 수 없다면 출발점부터 흔들린다. 예를 들어 모델 A는 1번 데이터셋, 모델 B는 2번 데이터셋, 모델 C는 다른 기간의 로그에서 나온 값이라면 같은 query set 위의 반복 측정이라고 보기 어렵다. 이때는 Mann-Whitney U test나 Kruskal-Wallis test처럼 독립 묶음 비교 쪽을 먼저 봐야 한다. paired 구조가 있느냐 없느냐가 검정 선택의 첫 번째 분기다.

또 하나는 sample 수다. query가 너무 적고 tie가 많은데 p-value만 또렷하게 적으면 숫자가 실제보다 단단해 보인다. 나는 이런 경우 Friedman 결과를 결론으로 쓰기보다 inspection queue를 정하는 신호로만 둔다. 평균 rank가 가장 낮은 후보를 바로 채택하는 게 아니라, rank가 갈린 query들을 다시 열어 보고 왜 갈렸는지 확인하는 식이다. 특히 RAG 평가는 한 query의 relevance label이 애매하면 전체 순위 해석도 같이 흔들린다.

내 기준의 사용 순서

정리하면 내 기준은 꽤 단순하다. 같은 평가 단위에서 두 설정만 비교하면 paired permutation이나 Wilcoxon으로 간다. 같은 평가 단위에서 세 설정 이상을 비교하면 Friedman으로 전체 rank 신호를 먼저 본다. 전체 차이가 보이면 그때 쌍별 비교와 보정을 붙인다. 독립 묶음이면 Mann-Whitney U나 그 확장 쪽을 다시 생각한다. 이 분기만 지켜도 검정 이름을 외우는 부담보다 평가 단위 확인이 먼저 온다.

이 순서를 노트 앞쪽에 적어 두면, 평가 결과를 볼 때 덜 즉흥적으로 움직인다. 평균표는 여전히 필요하지만, 평균표만으로 후보를 고르면 작은 실험일수록 운이 너무 크게 섞인다. Friedman 검정은 그 운을 완전히 없애지는 못해도, 같은 query set을 공유한다는 정보를 버리지 않게 잡아 주는 장치에 가깝다. 그래서 결과표에는 평균, 평균 rank, p-value, 사후 비교 여부를 한 줄에 같이 둔다. 나한테는 그 정도 역할이면 충분하다. 결론을 대신하는 숫자가 아니라, 다음에 열어 볼 query를 고르는 얌전한 필터다.

댓글

홈으로 돌아가기

검색 결과

"" 검색 결과입니다.