2026년 7월 27일 | 개발 공부
Spiegelhalter's Z는 이진 확률 예측이 보정됐다는 가정 아래, 실제로 관측한 Brier 오차가 기대값에서 얼마나 멀리 벗어났는지를 표준화한 검정 통계량이다. 모델이 0.8이라고 말한 사례가 장기적으로 80%쯤 발생하는지 보고 싶은데, reliability diagram의 모양만으로는 표본 흔들림과 구조적 어긋남을 구분하기 어려울 때가 있다. 이 검정은 그 질문을 하나의 Z-score와 p-value로 접어 준다.
나는 처음에 이 이름을 보고 단순히 관측 양성 수에서 기대 양성 수를 빼는 검정이라고 생각했다. 실제로 원래의 Spiegelhalter 통계량은 조금 다르다. 각 예측의 제곱오차와 보정 가정 아래 기대 제곱오차를 비교하고, 그 차이를 Brier 오차의 분산으로 나눈다. 그래서 부호만 보고 과대예측과 과소예측 방향을 바로 붙이면 안 되고, 검정 통과를 보정 완료 판정으로 읽어서도 안 된다.
1. 비교 대상은 두 개의 Brier 오차 합
예측 확률을 p, 실제 결과를 0 또는 1인 y라고 두면 관측 오차는 (y-p)²이다. 모델의 확률이 정확히 보정돼 있다면 y는 성공 확률 p를 가진 Bernoulli 결과로 볼 수 있고, 이때 제곱오차의 기대값은 p(1-p)가 된다. 예측이 0이나 1에 가까울수록 기대오차는 작고, 0.5에 가까울수록 결과 불확실성이 커져 기대오차도 커진다.
observed_error = sum((y - p)^2)
expected_error = sum(p * (1 - p))
variance = sum((1 - 2p)^2 * p * (1 - p))
Z = (observed_error - expected_error) / sqrt(variance)
Brier score는 보통 평균으로 적지만 여기서는 합으로 써도 된다. 분자와 분산을 같은 표본 규모로 구성하므로 최종 표준화에서 일관되게 처리된다. Z가 0에 가깝다는 것은 관측한 제곱오차가 보정 가정 아래 예상 범위와 비슷했다는 뜻이다. 절댓값이 커질수록 이 표본의 오차 합을 단순한 결과 흔들림으로 설명하기 어려워진다.
2. 다섯 샘플로 계산하면 무엇이 보이나
확률이 0.10, 0.90, 0.21, 0.90, 0.50이고 실제 결과가 0, 1, 0, 1, 0인 작은 예시를 보자. 관측 제곱오차의 합은 0.3241이고, 각 p(1-p)를 더한 기대오차는 0.6859다. 둘의 차이 -0.3618을 분산 합 0.22860876의 제곱근으로 나누면 Z는 약 -0.757이 된다. 표준정규분포의 양측 p-value는 약 0.449다.
5% 유의수준에서는 보정 가설을 기각하지 않는다. 하지만 이 문장을 “다섯 건으로 보정이 확인됐다”라고 바꾸면 안 된다. 표본이 작아 큰 어긋남도 잡지 못했을 수 있고, 이 예시는 0.1과 0.9에서 우연히 결과가 잘 맞아 관측 오차가 기대오차보다 작게 나온 경우다. 기각하지 못함은 합격이 아니라, 현재 표본에서 반대 증거가 충분하지 않다는 상태다.
3. 음수와 양수에 방향 이름을 붙이지 않는 이유
이 식의 분자는 결과 y-p가 아니라 제곱오차 (y-p)²에서 기대오차를 뺀 값이다. 따라서 음수 Z는 실제 양성이 예상보다 적었다는 뜻이 아니다. 관측 Brier 오차가 보정 가정 아래 기대한 오차보다 작았다는 뜻에 가깝다. 반대로 양수 Z는 오차가 기대보다 컸다는 신호지만, 어느 확률 구간에서 과대예측했는지 또는 과소예측했는지는 알려 주지 않는다.
방향을 보려면 calibration curve의 대각선 위아래, calibration intercept, 확률 구간별 signed gap을 함께 남겨야 한다. 전체 사건률이 이동한 문제와 0.2에서는 과대예측하고 0.8에서는 과소예측한 S자 모양은 같은 전역 통계량 안에서 상쇄되거나 비슷한 절댓값으로 접힐 수 있다. 나는 Z 옆에 최소한 reliability diagram 한 장을 붙여, 검정 결과가 숨긴 위치 정보를 다시 펼쳐 본다.
4. 0.5 근처 예측과 작은 표본의 함정
분산 항에는 (1-2p)²가 들어간다. p가 정확히 0.5면 이 항은 0이다. 실제로 p=0.5에서는 y가 0이든 1이든 제곱오차가 항상 0.25라서, 해당 샘플은 Brier 오차의 확률적 변동을 만들지 않는다. 모든 예측이 0.5라면 분자와 분모가 함께 0이 되어 통계량이 정의되지 않는다. 비슷한 확률만 반복하는 모델에서는 분모가 작아 수치가 불안정한지 먼저 확인해야 한다.
또 하나는 독립성이다. 같은 사용자에게서 나온 연속 이벤트, 같은 환자의 반복 측정, 같은 query를 seed만 바꿔 복제한 결과를 독립 샘플처럼 넣으면 유효 표본 수를 부풀릴 수 있다. 이 경우 단순한 정규 근사 p-value보다 사용자·환자·query 단위의 cluster bootstrap이나 별도 검증 설계를 고려하는 편이 낫다. 큰 데이터에서는 아주 작은 실무 오차도 유의하게 잡힐 수 있으므로 p-value와 함께 오차 크기를 계속 봐야 한다.
5. ECE와 ICI를 대체하지 않는다
Expected Calibration Error는 confidence bin별 평균 확률과 실제 빈도의 간격을 가중 평균하고, Integrated Calibration Index는 평활 calibration curve와 예측 확률의 절대 간격을 표본 분포에 따라 평균한다. 둘은 “얼마나 어긋났는가”를 크기로 보여 준다. Spiegelhalter's Z는 그 오차가 보정 가정 아래 표본 흔들림으로 설명 가능한지를 검정하는 쪽에 가깝다.
Brier score 자체도 예측 확률 품질을 읽는 proper scoring rule이지만, 보정과 구분력의 효과가 함께 섞인다. Tjur's D는 실제 양성·음성 그룹의 평균 확률 간격을 보여 주므로 또 다른 질문에 답한다. 평가표에서는 Brier score, calibration intercept와 slope, ICI 또는 ECE, reliability diagram, Tjur's D를 역할별 열로 나누고, Spiegelhalter's Z와 p-value는 보정 가설 검정 열에 둔다. 한 숫자가 다른 열을 지우게 만들지 않는 구성이 더 안전했다.
6. 실험 로그에 남길 최소 항목
내가 기록할 최소 항목은 evaluation split, 표본 수, 양성 수, 예측 확률 범위, 관측 Brier 오차 합, 기대오차 합, 분산 합, Z, 양측 p-value다. 예측이 0.5 근처에 얼마나 몰렸는지와 반복 측정 단위도 적는다. 모델을 여러 개 비교했다면 각 모델의 p-value만 줄 세우지 않고, 같은 검증셋에서 calibration curve와 오차 크기를 나란히 둔다.
계산 구현은 원 논문의 정의와 MAPIE의 calibration metric 예제를 대조하면 짧게 확인할 수 있다. 다만 라이브러리 함수 이름이 같아도 단순한 관측-기대 사건 수 Z를 구현한 자료가 섞여 있으므로 식을 먼저 확인해야 한다. 내가 이 통계량을 쓰는 목적은 모델에 “보정 통과” 도장을 찍는 것이 아니다. 확률 오차가 표본 흔들림의 범위인지 묻고, 다음에 열어 볼 calibration curve 구간을 좁히는 것이다.
참고한 정의는 Spiegelhalter의 1986년 논문과 MAPIE 문서에서 확인했다.
'[개발 공부]' 카테고리의 다른 글
| Decision Curve Analysis: 임계확률별 순이익으로 보는 모델 효용 (0) | 2026.08.03 |
|---|---|
| Hosmer-Lemeshow 검정: 위험도 그룹별 관측·기대 빈도 비교 (0) | 2026.07.28 |
| Tjur's D: 양성과 음성의 평균 예측 확률 차이 (0) | 2026.07.22 |
| Brier score 분해: 같은 점수 안의 보정과 구분력 (1) | 2026.07.17 |
| Integrated Calibration Index: 보정 곡선의 평균 간격 (0) | 2026.07.16 |