이 포스트는
effect_measures.qmd,time_to_event_measures.qmd와 함께 Epidemiology 측정 지표 시리즈를 완성한다. 진단검사는 epidemiology 의 분류 lens 이며, ML 분류 모형 평가와 동일한 수학 구조를 공유한다.
1 정의
| 질병 (D+) | 정상 (D-) | |
|---|---|---|
| 검사 양성 (T+) | TP (True Positive) | FP (False Positive) |
| 검사 음성 (T-) | FN (False Negative) | TN (True Negative) |
- Sensitivity \(\text{Sn} = P(T^+ \mid D^+) = TP / (TP + FN)\) — 환자 잘 잡는가
- Specificity \(\text{Sp} = P(T^- \mid D^-) = TN / (TN + FP)\) — 정상 잘 잡는가
- PPV \(= P(D^+ \mid T^+) = TP / (TP + FP)\) — 양성이 실제 환자일 확률
- NPV \(= P(D^- \mid T^-) = TN / (TN + FN)\) — 음성이 실제 정상일 확률
핵심 차이: - Sn / Sp: 검사의 본질 — 질병 유무에 의존, 유병률에 무관 - PPV / NPV: 검사의 응용 — 유병률에 강하게 의존
ML 분류와 매핑: - Sensitivity = Recall (TPR) - Specificity = TNR - PPV = Precision - NPV = NPV (혼동 금지: ML 의 NPV 는 동일) - 1 - Specificity = FPR
진단검사를 두 관점에서 평가한다:
관점 1 — 검사 자체 성능 (검사 제조사·연구자 lens): - “이 검사는 환자를 잘 잡는가? 정상을 잘 거르는가?” → Sensitivity, Specificity - 분모가 실제 상태 (D+, D-) — 검사의 본질적 능력 - 유병률 무관 — 어느 인구에서 사용하든 일정
관점 2 — 임상 활용 (의사·환자 lens): - “양성이면 얼마나 환자일 것 같나? 음성이면 안심해도 되나?” → PPV, NPV - 분모가 검사 결과 (T+, T-) — 결과를 받은 사람 입장 - 유병률 의존 — 같은 검사도 환자 인구에 따라 다른 신뢰도
비유 — 자동차 시험과 도로 주행: - Sn/Sp = 자동차의 brake test 점수 (제조사 스펙) — 차의 본질적 성능 - PPV/NPV = 도로 상황·운전자 능력 결합한 실전 안전성 — 같은 차도 빙판길에서는 위험
의사결정 흐름:
연구 단계: Sn, Sp 로 검사 채택 결정 (유병률 미정의 일반 인구)
↓
임상 단계: PPV, NPV 로 환자별 의사소통 ("이 양성 결과는 80% 확률로 진짜")
↓
정책 단계: PAR/PAF 와 결합해 인구 영향 추정
A/B test 분류 메트릭에서: - Recall (Sn) = “구매할 사용자를 모형이 얼마나 잡는가” — 추천 시스템 coverage - Precision (PPV) = “추천한 사용자 중 진짜 구매자 비율” — 추천의 정확도 - F1 = 두 지표의 조화평균 — 비대칭 cost 가 없을 때 단일 척도
2 왜 4 지표 모두 필요한가
검사 A: Sn = 100%, Sp = 0% (모두 양성으로 판정) - 모든 환자를 잡지만 (Sn 100%), 모든 정상도 양성 → 분별력 0 - “코로나입니다” 라고 매번 외치는 검사
검사 B: Sn = 99%, Sp = 99%, 유병률 0.1% (희귀 질환) - TP / (TP + FP) = 0.99 × 0.001 / (0.99 × 0.001 + 0.01 × 0.999) ≈ 9% - 양성 100 명 중 91 명이 거짓 양성 — 추가 검사 없이는 확진 불가
→ Sn / Sp 로 검사를 평가하고, PPV / NPV 로 임상 활용을 평가한다.
(Schulz & Grimes, 2018, Ch.8)
3 PPV·NPV 와 유병률의 관계
베이즈 정리로 PPV 를 사전 확률 (유병률) 로 표현:
\[ \text{PPV} = \frac{\text{Sn} \cdot \text{Prev}}{\text{Sn} \cdot \text{Prev} + (1 - \text{Sp}) \cdot (1 - \text{Prev})} \]
| 시나리오 | 유병률 | Sn | Sp | PPV | NPV |
|---|---|---|---|---|---|
| Screening (저위험) | 0.001 | 0.99 | 0.99 | 0.090 | 0.99999 |
| 일반 외래 | 0.05 | 0.99 | 0.99 | 0.839 | 0.9995 |
| 응급실 (고위험) | 0.30 | 0.99 | 0.99 | 0.977 | 0.9957 |
같은 검사라도 PPV 는 100 배 차이 — 임상 활용 시 사전 확률 (유병률 또는 임상 의심 정도) 을 항상 고려해야 한다.
심근경색 표지자 troponin 검사 (Sn = 0.95, Sp = 0.95) 가 두 환경에서 어떻게 다른가:
응급실 (가슴 통증 환자): 사전 확률 30% - PPV = \(\frac{0.95 \times 0.3}{0.95 \times 0.3 + 0.05 \times 0.7}\) = 0.890 - 양성이면 89% 확률로 진짜 심근경색 → 즉시 PCI 결정 가능
건강검진 (무증상 일반 성인): 사전 확률 0.1% - PPV = \(\frac{0.95 \times 0.001}{0.95 \times 0.001 + 0.05 \times 0.999}\) = 0.019 - 양성이면 2% 확률로 진짜 → 건강검진의 양성 100 명 중 98 명이 거짓 양성, 추가 검사·불안 유발
같은 검사 = 다른 임상 의미: 응급실은 “screen + confirm” 일체화 가능, 건강검진은 추가 검사 없이는 무용. 이 때문에 무증상자 대상 screening 검사는 매우 높은 Sp (≥0.99) 가 필수.
Bayes 의 직관: 사전 확률이 매우 낮으면 (희귀 질환), 검사가 아무리 좋아도 양성 결과는 false positive 가 압도적. “TC 검진을 하지 않는 게 좋다” 는 의학적 권고 (USPSTF 2014) 의 base.
A/B test 비유: 클릭 모델이 95% 정확도라도, 클릭률이 1% 인 사용자 인구에서는 모델이 “클릭” 으로 분류한 사용자 중 80%+ 가 false positive. 추천 시스템 평가 시 ROC AUC 만 보면 위험 — Precision-Recall AUC 와 함께 본다 (아래 §AUC 함정 참조).
4 우도비 (Likelihood Ratio) 와 Bayesian Update
PPV/NPV 는 유병률에 의존해서 검사 자체의 특성을 잘 표현하지 못한다. 우도비는 검사의 본질을 단일 숫자로 압축한다.
4.1 LR+ / LR-
\[ \text{LR}^+ = \frac{\text{Sn}}{1 - \text{Sp}}, \quad \text{LR}^- = \frac{1 - \text{Sn}}{\text{Sp}} \]
- LR+ : 양성 결과가 환자에게서 나올 확률 / 정상에게서 나올 확률
- LR- : 음성 결과가 환자에게서 나올 확률 / 정상에게서 나올 확률
- LR+ 클수록, LR- 작을수록 좋은 검사
| LR+ | 진단 정보량 |
|---|---|
| > 10 | 강한 양성 증거 (사후 확률 크게 증가) |
| 5~10 | 중간 양성 증거 |
| 2~5 | 약한 양성 증거 |
| 1~2 | 거의 무의미 |
| LR- | 배제 정보량 |
|---|---|
| < 0.1 | 강한 배제 증거 |
| 0.1~0.2 | 중간 배제 증거 |
| 0.2~0.5 | 약한 배제 증거 |
| 0.5~1 | 거의 무의미 |
4.2 Bayesian Update — Pre-test → Post-test Odds
\[ \text{Post-test odds} = \text{Pre-test odds} \times \text{LR} \]
- LR 이 검사 결과를 사전 확률을 사후 확률로 업데이트하는 베이즈 인수
- 유병률에 무관하게 LR 자체가 검사 특성
\[ P(D^+ \mid T^+) = \frac{\text{LR}^+ \cdot P(D^+) / (1 - P(D^+))}{1 + \text{LR}^+ \cdot P(D^+) / (1 - P(D^+))} \]
베이즈 정리: \[ P(D^+ \mid T^+) = \frac{P(T^+ \mid D^+) \cdot P(D^+)}{P(T^+)} \]
이걸 odds 로 변환 하면: \[ \frac{P(D^+ \mid T^+)}{P(D^- \mid T^+)} = \frac{P(T^+ \mid D^+)}{P(T^+ \mid D^-)} \times \frac{P(D^+)}{P(D^-)} \]
- 좌변: 사후 오즈 (post-test odds)
- 우변 1 항: \(\text{LR}^+\) (검사 정보)
- 우변 2 항: 사전 오즈 (pre-test odds)
→ 사후 오즈 = LR × 사전 오즈 — 곱셈으로 단순화. 검사를 여러 번 (조건부 독립 가정 하) 할 때도:
\[ \text{Final odds} = \text{Pre-odds} \times \text{LR}_1 \times \text{LR}_2 \times \cdots \]
연속 검사가 마치 가산 정보 (log scale 에서 가법) 처럼 작동.
왜 odds 인가: 확률 \(P\) 의 곱셈은 비선형이지만, 오즈 \(P/(1-P)\) 의 곱셈은 베이즈 정리의 자연스러운 표현. 의료 의사결정에서 odds 사고가 직관적인 이유.
계산 예시 — 단계별 진단:
환자가 가슴 통증으로 응급실 내원: 1. 임상 의심 (사전 확률) 30% → odds = 0.43 2. 심전도 정상 (LR- = 0.5) → 0.43 × 0.5 = 0.215 → 18% 3. troponin 양성 (LR+ = 8) → 0.215 × 8 = 1.72 → 63% 4. 영상 confirm (LR+ = 5) → 1.72 × 5 = 8.6 → 90%
각 검사 결과가 누적 정보로 작동 — 의사가 환자를 “검사로 좁혀가는” 사고의 수학적 표현.
스마트폰 trick: \(\text{LR}^+ = 10\) 의 직관 — “양성 결과가 사전 확률을 약 10 배 상향 (낮은 확률 영역에서)”. 임상 의사가 LR 표를 외우는 이유: 빠른 판단의 base.
4.3 Fagan Nomogram — 시각적 베이즈 업데이트
Fagan (1975) 의 nomogram 은 사전 확률 (유병률 또는 임상 의심) → LR → 사후 확률을 직선으로 연결.
- 환자 진료 후 임상적으로 “이 환자가 질병일 확률 30%” 라고 추정 (사전 확률)
- 검사를 시행, 양성 결과
- 그 검사의 LR+ = 8 (문헌 값)
- Pre-odds = 0.3 / 0.7 = 0.43 → Post-odds = 0.43 × 8 = 3.44 → Post-prob = 3.44 / 4.44 = 77%
- 사후 확률 77% 로 치료 시작 결정
(Schulz & Grimes, 2018, Ch.9)
4.4 Diagnostic Odds Ratio (DOR)
\[ \text{DOR} = \frac{\text{LR}^+}{\text{LR}^-} = \frac{\text{Sn} \cdot \text{Sp}}{(1 - \text{Sn})(1 - \text{Sp})} \]
- 검사의 단일 척도 — Sn·Sp 를 결합
- DOR = 1 → 검사 무용
- DOR > 25 → 일반적으로 좋은 검사
- 진단 메타분석의 표준 효과 측정량
5 임계값 최적화 — ROC 와 Youden’s J
연속 점수 (예: troponin 농도, 모형 출력 확률) 를 이항으로 변환할 때 cutoff 가 Sn·Sp 사이의 trade-off 를 결정.
5.1 ROC Curve (Receiver Operating Characteristic)
- x 축: 1 - Specificity (FPR)
- y 축: Sensitivity (TPR)
- 곡선의 모든 cutoff 후보를 시각화
5.2 AUC (Area Under Curve)
\[ \text{AUC} = P(\text{score}_{D^+} > \text{score}_{D^-}) \]
- 무작위 환자와 무작위 정상을 비교했을 때 환자 점수가 더 높을 확률
- AUC = 0.5: 무용 (동전 던지기), AUC = 1.0: 완벽
- 가이드: 0.7~0.8 (수용), 0.8~0.9 (좋음), > 0.9 (우수)
- 임계값 무관 — 전체 곡선의 단일 척도
게임 규칙: 1. 환자 인구에서 무작위 1 명 추출 → 검사 점수 \(s_+\) 2. 정상 인구에서 무작위 1 명 추출 → 검사 점수 \(s_-\) 3. 환자 점수가 더 높으면 (score 가 양성에 비례하는 모형) “이김”
이 게임을 무한 반복했을 때 승률이 AUC.
- AUC = 0.5: 동전 던지기 — 검사가 환자/정상을 구별 못 함
- AUC = 0.7: 70% 확률로 환자 점수가 더 높음 → 임상적으로 활용 가능
- AUC = 0.9: 거의 항상 환자가 더 높음 — 우수
- AUC = 1.0: 환자와 정상이 완전히 분리됨 (모든 환자 점수 > 모든 정상 점수)
Mann-Whitney U 통계량과 동일: AUC = U / (n+ × n-) — 비모수 통계량의 표준 확률 해석.
임계값 무관의 의미: ROC AUC 는 cutoff 를 정하지 않은 상태의 평가. cutoff 결정은 별도 의사결정 (Sn 우선 or Sp 우선?). AUC 가 좋아도 cutoff 를 잘못 정하면 임상에서 무용.
A/B test 분류 모형: 추천 알고리즘 A vs B 비교 시 AUC 만 보면 함정 — 클래스 불균형 (1% positive) 일 때 PR-AUC 가 더 정직 (위 §AUC 의 함정 박스).
5.3 Youden’s J Index
\[ J = \text{Sn} + \text{Sp} - 1 \]
- 0~1 범위 (1 이 완벽)
- 최적 cutoff 결정의 표준: \(\arg\max_t [\text{Sn}(t) + \text{Sp}(t) - 1]\)
- 비용 함수가 대칭일 때 적절 — Sn·Sp 의 가치가 다르면 cost-sensitive cutoff 사용
5.4 AUC 의 함정 — 클래스 불균형
희귀 양성 (질병 유병률 1%) 에서 AUC 0.95 인 모델도 PPV 가 낮을 수 있음. Precision-Recall (PR) Curve 와 PR-AUC 가 보완:
- PR Curve: x 축 Recall (=Sn), y 축 Precision (=PPV)
- 클래스 불균형 시 ROC 보다 정직
6 모형 평가 — 보정과 식별력
ML 분류·예측 모형은 임계값 하나로 평가하면 안 된다. 보정 (Calibration) 과 식별력 (Discrimination) 두 축으로 동시 평가.
6.1 Calibration — 예측 확률과 실제 빈도의 일치
모형이 “이 환자가 질병일 확률 = 0.7” 라고 예측한 환자 100 명 중 실제 70 명이 질병이면 well-calibrated.
- Calibration plot: 예측 확률 분위 (x) vs 실제 양성 비율 (y) — 대각선이 이상적
- Hosmer-Lemeshow test: 분위별 관찰 vs 기대 사건수 비교 (\(\chi^2\))
- Brier score: \(\frac{1}{N} \sum (p_i - y_i)^2\) — 보정 + 식별력 동시 척도 (낮을수록 좋음)
- Calibration slope / intercept: logit(p) 로 회귀
예시: 모형 A 는 모든 환자에게 0.45 ~ 0.55 의 확률만 출력. 모형 B 는 환자에게 0.1 ~ 0.9 사이로 출력.
- AUC: 두 모형이 비슷할 수 있음 (rank ordering 만 보므로)
- Calibration: 모형 A 는 0.5 라고 한 환자 100 명 중 실제 양성이 50% → well-calibrated. 모형 B 는 0.9 라고 한 환자 중 실제 60% 만 양성 → over-confident → 잘못된 calibration
왜 calibration 이 중요한가 — 임상 의사결정:
- 의사가 “이 환자 위험 30%” 모형 출력을 보고 cutoff 가 25% 인 가이드라인 적용 → 약 처방
- Calibration 이 깨지면 (실제 위험은 50%): 환자 underdose, 부작용·재발
AUC 와 Calibration 은 독립 — 둘 다 봐야:
| 시나리오 | AUC | Cal | 결과 |
|---|---|---|---|
| 잘 만든 모형 | 0.85 | OK | 임상 활용 가능 |
| Rank 좋지만 왜곡 | 0.85 | Bad | recalibration 필요 (Platt scaling, isotonic) |
| 보정은 좋지만 분리력 약함 | 0.62 | OK | 임상적으로 의사결정 보조에 부족 |
Recalibration 방법:
- Platt scaling: \(P_{\text{new}} = \sigma(a \cdot P_{\text{old}} + b)\) 로 logistic 회귀 적합
- Isotonic regression: 단조 비모수 보정 — 더 유연하지만 데이터 많이 필요
- Temperature scaling (NN): logit 을 \(T\) 로 나눔 — overconfident 모형 평탄화
Brier score 의 직관: \((p - y)^2\) 의 평균 — 확률 예측의 RMSE. Brier = 0 이 완벽, 0.25 가 항상 0.5 예측 (no-skill). MSE 와 같은 분해:
\[ \text{Brier} = \text{Reliability} - \text{Resolution} + \text{Uncertainty} \]
각 항이 calibration·discrimination·base rate 에 대응.
6.2 Discrimination — 양성과 음성을 분리하는 능력
- ROC AUC, PR AUC (위 §임계값 최적화)
- C-statistic (생존 모형의 AUC 일반화)
6.3 NRI / IDI — 새 모형이 기존 모형보다 나은가
새로운 변수를 추가했을 때 모형이 얼마나 개선되었는지의 지표.
- NRI (Net Reclassification Improvement): 새 모형이 환자의 위험을 위로, 정상의 위험을 아래로 재분류하는 비율의 합
- IDI (Integrated Discrimination Improvement): 양성과 음성의 평균 예측 확률 차이의 향상
해석: 임상적으로 의미 있는 cutoff 가 있는 경우 (예: 10% 위험 cutoff) NRI 가 의미 있고, cutoff 가 명확하지 않으면 IDI 가 나음.
(Pencina et al., 2008)
7 Spectrum Bias — 진단검사 평가의 함정
문제: 검사 평가 연구가 명백한 환자 (severe disease) 와 명백한 정상 (healthy volunteer) 만 포함하면 Sn·Sp 가 과대평가됨. 임상 현장의 모호한 환자에서는 성능이 훨씬 낮음.
해결: 임상 현장의 환자 분포를 반영한 prospective 평가, 또는 spectrum-stratified 보고.
신경학적 검사 개발 사례:
- 개발 코호트: 명백한 알츠하이머 환자 (MMSE < 15) + 정상 대학생 (MMSE = 30) → Sn = 0.95, Sp = 0.95
- 임상 현장: 60~70 세 일반 외래 (인지 호소 환자) — 경도 인지 장애 (MCI), 우울증, 노화에 의한 정상 감소가 섞임 → Sn = 0.70, Sp = 0.85
왜 떨어지는가:
- 개발 코호트는 양 극단 만 포함 → 검사가 쉬움 (큰 차이 잡기는 쉬움)
- 임상 현장은 회색 지대 가 다수 → 검사가 어려움 (작은 차이 잡기 어려움)
다른 형태의 선택 편향:
| 편향 | 설명 |
|---|---|
| Spectrum bias | 환자 중증도 분포의 차이 |
| Verification bias | 양성만 진단 confirm → Sn 과대, Sp 영향 |
| Incorporation bias | gold standard 가 검사 결과를 포함 → 자기참조 |
| Reviewer bias | 검사 결과 알고 gold standard 평가 → 비독립 |
해결 — STARD 가이드라인:
- Prospective 코호트: 임상 현장에서 모든 환자에게 검사 + gold standard 둘 다 수행
- Independent blind review: 검사 결과와 gold standard 평가가 독립
- Spectrum-stratified 보고: 중증도 별로 Sn·Sp 따로 보고
A/B test 비유 — 모형 검증의 함정:
- Offline 평가: 깨끗한 historical data → AUC = 0.85
- Online A/B: 실제 사용자 (행동 변화·새 패턴 포함) → AUC = 0.72
Offline-online gap 의 본질이 spectrum bias. 검증 코호트가 운영 환경을 대표하지 않으면 모형 성능 과대 추정. AB_test/41-project-agent-offline-eval.qmd 의 핵심 주제.
(Schulz & Grimes, 2018, Ch.8 의 한계 절)
8 진단 메타분석
진단검사 메타분석은 효과 메타분석과 다른 점이 있다.
8.1 Bivariate Model — Sn 과 Sp 의 동시 분포
각 연구의 Sn 과 Sp 는 cutoff 선택에 의해 trade-off 관계 — 따로 메타분석하면 정보 손실. Bivariate normal model:
\[ \binom{\text{logit Sn}_i}{\text{logit Sp}_i} \sim N \left( \binom{\mu_{\text{Sn}}}{\mu_{\text{Sp}}}, \Sigma \right) \]
- \(\Sigma\) 의 비대각 항이 Sn-Sp 음의 상관 (cutoff 변동의 결과) 을 잡음
8.2 HSROC (Hierarchical Summary ROC)
- 각 연구의 (1-Sp, Sn) 점들로부터 SROC (Summary ROC) 곡선 추정
- 계층 모형으로 연구 간 이질성 반영
8.3 Pooled DOR
DOR 의 연구 간 합산 — random-effects 메타분석 (\(\tau^2\) 포함).
9 응용 분야
| 분야 | 핵심 지표 | 사례 |
|---|---|---|
| 질병 screening | Sn, Sp, PPV (유병률 의존) | 유방암 screening (mammography) |
| 임상 진단 | LR+/LR-, Fagan nomogram | troponin → 심근경색 진단 |
| ML 분류 모형 | AUC, PR-AUC, calibration, Brier | 신용 평가, 추천 시스템 |
| Spam 필터 | Sn, FPR, 비대칭 cost | 양성 cost 가 음성 cost 보다 큼 |
| A/B test 분류 메트릭 | Precision-Recall, F1 | 추천 모델 평가 |
| 시스템 알람 | FPR, FNR, 비용 가중 cutoff | 의료 모니터, 사이버 보안 |
10 예시 — 코로나 진단 검사 (가상)
검사 A (RT-PCR): Sn = 0.95, Sp = 0.99 검사 B (Rapid antigen): Sn = 0.80, Sp = 0.97
| LR+ | LR- | DOR | PPV (유병률 5%) | NPV (유병률 5%) | |
|---|---|---|---|---|---|
| 검사 A | 95 | 0.051 | 1881 | 0.833 | 0.997 |
| 검사 B | 26.7 | 0.206 | 130 | 0.585 | 0.989 |
해석: - 검사 A 가 모든 면에서 우수 (DOR 14 배). 양성 결과 신뢰도도 큼. - 검사 B 양성: 사전 5% → 사후 58% (확진은 어려움) - 검사 B 음성: 사전 95% → 사후 98.9% (배제 정도 가능, 환자 안심) - 임상 활용: 검사 B 로 1 차 screening, 양성이면 검사 A 로 확진 — Sn 향상 + 비용 절감
11 코드
import numpy as np
import pandas as pd
from sklearn.metrics import (
confusion_matrix, roc_auc_score, roc_curve, brier_score_loss,
precision_recall_curve, average_precision_score
)
from sklearn.calibration import calibration_curve
from scipy import stats
# 1. 분할표 → 단일 지표
def diagnostic_metrics(TP, FP, FN, TN):
Sn = TP / (TP + FN)
Sp = TN / (TN + FP)
PPV = TP / (TP + FP)
NPV = TN / (TN + FN)
LR_pos = Sn / (1 - Sp)
LR_neg = (1 - Sn) / Sp
DOR = LR_pos / LR_neg
Youden_J = Sn + Sp - 1
return {"Sn": Sn, "Sp": Sp, "PPV": PPV, "NPV": NPV,
"LR+": LR_pos, "LR-": LR_neg, "DOR": DOR, "J": Youden_J}
# 검사 A
print(diagnostic_metrics(TP=95, FP=10, FN=5, TN=990))
# 2. PPV 의 유병률 의존성
def ppv_from_prev(Sn, Sp, prev):
return Sn * prev / (Sn * prev + (1 - Sp) * (1 - prev))
for prev in [0.001, 0.01, 0.05, 0.10, 0.30]:
ppv = ppv_from_prev(0.95, 0.99, prev)
print(f"유병률 {prev:.3f} → PPV = {ppv:.3f}")
# 3. Bayesian Update — Pre-test → Post-test
def post_test_prob(pre_prob, LR):
pre_odds = pre_prob / (1 - pre_prob)
post_odds = pre_odds * LR
return post_odds / (1 + post_odds)
print(f"사전 30%, LR+=8 → 사후 {post_test_prob(0.30, 8):.3f}")
print(f"사전 30%, LR-=0.05 → 사후 {post_test_prob(0.30, 0.05):.3f}")
# 4. ROC, AUC, Youden's J 로 최적 cutoff
np.random.seed(0)
y_true = np.random.binomial(1, 0.3, 1000)
y_score = np.random.normal(y_true * 1.5, 1.0) # 양성에 우호적인 점수
auc = roc_auc_score(y_true, y_score)
fpr, tpr, thresholds = roc_curve(y_true, y_score)
J = tpr - fpr
optimal_idx = J.argmax()
print(f"AUC = {auc:.3f}, 최적 cutoff = {thresholds[optimal_idx]:.3f}, "
f"Sn = {tpr[optimal_idx]:.3f}, Sp = {1 - fpr[optimal_idx]:.3f}")
# 5. Calibration: Brier score + Calibration curve
y_prob = 1 / (1 + np.exp(-y_score)) # softmax
brier = brier_score_loss(y_true, y_prob)
print(f"Brier score = {brier:.4f} (lower is better)")
prob_true, prob_pred = calibration_curve(y_true, y_prob, n_bins=10)
# prob_pred 와 prob_true 가 같으면 well-calibrated
# 6. PR-AUC (불균형 데이터에 더 정직)
pr_auc = average_precision_score(y_true, y_score)
print(f"PR-AUC = {pr_auc:.3f}")
# 7. 진단검사 신뢰구간 (Wilson score interval)
from statsmodels.stats.proportion import proportion_confint
TP, FN = 95, 5
Sn_ci = proportion_confint(TP, TP + FN, alpha=0.05, method="wilson")
print(f"Sn = {TP/(TP+FN):.3f}, 95% CI {Sn_ci}")# Fagan Nomogram — 베이지안 업데이트 시각화 (개념 코드)
import matplotlib.pyplot as plt
import numpy as np
def fagan_plot(pre_probs=[0.05, 0.30, 0.70], LRs=[0.1, 1, 10]):
fig, ax = plt.subplots(1, 1, figsize=(6, 8))
for pre in pre_probs:
for LR in LRs:
post = post_test_prob(pre, LR)
ax.plot([0, 1], [pre, post], alpha=0.5,
label=f"Pre={pre:.2f}, LR={LR}")
ax.set_xlabel("Pre / Post"); ax.set_ylabel("Probability")
ax.set_title("Fagan-style Bayesian update")
ax.legend(fontsize=7)
plt.tight_layout()
# plt.savefig("fagan.png")12 관련 주제
선행 지식
- Effect Measures — RR/RD/NNT/CI
- Time-to-Event Measures — IR/HR/KM
- Relative Risk & Odds Ratio — base
Epidemiology 시리즈 cross-link
- Bradford Hill Criteria (예정)
- Confounding (예정)
- Bias (예정) — Spectrum bias
Causal Inference 시리즈
- Causal Effect Definition
- Effect Modification — sub-group sensitivity
A/B Test 연결
- Metrics Design (OEC) — Brier·AUC 가 OEC 의 component 가 될 수 있음
- Offline Evaluation — 분류 모델 사전 평가
다른 카테고리 연결
- Machine Learning — 분류 평가 (예정) — 동일한 수학, ML lens
- Statistics — 가설 검정 — Sn / Sp 의 신뢰구간
- Surveilance — FDA/IVD 진단검사 규제 — 진단검사 승인 기준