paired bootstrap
평균이 올랐을 때 “우연이 아닌가” 를 확인하는 방법. 문항을 복원추출로 다시 뽑아 여러 번 채점해 보고, 차이가 0을 넘는지 본다.
왜 필요한가
우리가 이것 때문에 실제로 틀렸다.
36문항에서 BM25가 +0.073이 나와 “확정”이라고 적었다. 164문항에서 −0.031. 부호가 뒤집혔다. → 검색 실험 결과 §7
“평균이 올랐다”만으로는 같은 실수를 반복한다. 문항이 몇 개 다르게 뽑혔어도 같은 결론이 났을지를 봐야 한다.
어떻게 하나
164문항에서 164개를 복원추출(같은 문항이 두 번 뽑혀도 됨)해 평균 차이를 계산한다. 이걸 1만 번 반복하면 차이값이 1만 개 나온다. 그중 2.5% ~ 97.5% 구간이 95% 신뢰구간이다.
구간이 0을 포함하지 않는다 → 우연으로 보기 어렵다
구간이 0을 품는다 → 이 데이터로는 "더 낫다"고 말할 수 없다
paired가 붙는 이유
두 구성의 점수를 따로 리샘플하지 않고, 문항별 차이 d_i = 도전점수(i) − 기준점수(i)를 리샘플한다.
문항마다 난이도가 다른데(어떤 질문은 뭘 써도 맞히고 어떤 건 뭘 써도 틀린다), 그 공통 잡음이 뺄셈에서 상쇄된다. 같은 문항을 양쪽에 똑같이 물렸기 때문에 가능한 일이고, 그래서 구간이 훨씬 좁아진다.
재현성: 난수 시드를 고정해야 같은 값이 다시 나온다. 우리는
20260729로 박아뒀다.
읽을 때 주의
“구간이 0을 품는다” ≠ “차이가 없다”. 그건 “이 데이터로는 잴 수 없다” 는 뜻이다. 표본이 적거나 정답지가 부실하면 진짜 차이가 있어도 구간이 넓게 나온다.
우리 프로젝트에서
2차 실험 승격 기준의 주 기준이다 — “종단 MRR@10 차이의 95% 신뢰구간 하한 > 0” (검색 실험 설계 §5).
실제로 그 기준이 판정을 갈랐다. 정답지 편향을 걷어낸 뒤 KURE가 +0.0297까지 앞섰는데도, 구간 하한이 −0.0042로 0을 아슬아슬하게 품어 채택하지 못했다. 평균만 봤으면 채택했을 자리다. → 검색 실험 결과 §1 · 편향 제거 경위는 검색 실험 결과 §8
상·하한 채점과 함께 쓰면 “채점 가정 × 신뢰구간” 두 겹으로 가둘 수 있다.