Diagnostic & Screening Measures: 진단·분류 평가 지표 종합

Sensitivity·Specificity·PPV·LR±·AUC — 분류 lens 의 Effect Measure

진단검사 평가는 epidemiology 의 분류 lens 다. 동시에 ML 분류 모형 평가의 base 이기도 하다. Sensitivity, Specificity, PPV, NPV, Likelihood Ratio (LR±), Diagnostic Odds Ratio (DOR), Youden’s J, ROC AUC, Brier score, Calibration, NRI, IDI, 진단 메타분석 (Bivariate·HSROC), Bayesian update (Fagan nomogram) 까지 9 카테고리 중 진단·screening + 모형 진단 + 진단 메타분석을 통합 정리한다.

Epidemiology
Experimentation
Machine Learning
저자

Kwangmin Kim

공개

2026년 05월 08일

이 포스트는 effect_measures.qmd, time_to_event_measures.qmd 와 함께 Epidemiology 측정 지표 시리즈를 완성한다. 진단검사는 epidemiology 의 분류 lens 이며, ML 분류 모형 평가와 동일한 수학 구조를 공유한다.

1 정의

정의: Diagnostic Test 의 2x2 분할표
질병 (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

직관: 4 지표는 두 가지 다른 질문에 답한다

진단검사를 두 관점에서 평가한다:

관점 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 지표 모두 필요한가

직관: Sn 100% 검사도 쓸모없을 수 있다

검사 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 배 차이 — 임상 활용 시 사전 확률 (유병률 또는 임상 의심 정도) 을 항상 고려해야 한다.

직관: 응급실 vs 건강검진 — 같은 검사가 다르게 작동한다

심근경색 표지자 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^+))} \]

직관: LR 의 곱셈은 베이즈 정리의 압축

베이즈 정리: \[ 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 → 사후 확률을 직선으로 연결.

직관: Fagan 사용 흐름
  1. 환자 진료 후 임상적으로 “이 환자가 질병일 확률 30%” 라고 추정 (사전 확률)
  2. 검사를 시행, 양성 결과
  3. 그 검사의 LR+ = 8 (문헌 값)
  4. Pre-odds = 0.3 / 0.7 = 0.43 → Post-odds = 0.43 × 8 = 3.44 → Post-prob = 3.44 / 4.44 = 77%
  5. 사후 확률 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 (우수)
  • 임계값 무관 — 전체 곡선의 단일 척도
직관: AUC 는 “두 사람 비교 게임의 승률”

게임 규칙: 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 — 예측 확률과 실제 빈도의 일치

정의: Well-calibrated Model

모형이 “이 환자가 질병일 확률 = 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) 로 회귀
직관: AUC 가 좋은 모형도 calibration 이 망가질 수 있다

예시: 모형 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 / 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 보고.

직관: “Lab Sn 95%” 가 “Real-world Sn 70%” 가 되는 이유

신경학적 검사 개발 사례:

  • 개발 코호트: 명백한 알츠하이머 환자 (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 예시 — 코로나 진단 검사 (가상)

사례: 두 검사 비교, 유병률 5%

검사 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 관련 주제

선행 지식

Epidemiology 시리즈 cross-link

Causal Inference 시리즈

A/B Test 연결

다른 카테고리 연결

Subscribe

Enjoy this blog? Get notified of new posts by email: