생존 분석 모델 선택과 검증: Kaplan-Meier, Cox PH, AFT

생존 분석의 데이터 구조와 검열 처리부터 Kaplan-Meier, Cox PH, AFT 모델의 가정 점검·검증·운영 방법을 정리한다.

2026-08-14 · 최초 발행 2025-10-14

사건이 아직 일어나지 않은 관측치를 어떻게 다룰 것인가

의료 임상시험의 생존 시간, 설비 고장까지의 기간, 고객 이탈 시점처럼 사건 발생 시간을 다루는 데이터에는 추적이 끝날 때까지 사건이 발생하지 않은 관측치가 함께 들어온다. 이 검열 정보를 버리지 않고 활용하기 위해 Kaplan-Meier, Cox Proportional Hazards, Accelerated Failure Time(AFT) 모델을 사용한다.

생존함수 S(t)는 시점 t까지 사건이 일어나지 않을 확률을 뜻하며, 누적위험함수 H(t)와는 S(t) = exp(−H(t)) 관계에 있다. 위험함수 h(t)는 특정 시점에서의 순간 사건 발생률, 즉 조건부 발생률을 나타낸다.

검열은 사건을 관측하지 못했거나 추적이 중단된 상태를 표시한다. 우측 검열이 일반적이며, 좌측 추정이 불가능한 구간이 있으면 좌측 검열이나 트렁케이션도 고려해야 한다.

분석 데이터는 보통 duration(기간), event(사건 여부), covariates(공변량)로 구성한다. 공변량이 시간에 따라 바뀐다면 (start_time, stop_time, event) 형태의 start–stop 포맷을 사용한다.

목적에 따라 달라지는 모델의 역할

Kaplan-Meier(KM)와 Nelson–Aalen은 분포를 전제하지 않는 비모수 추정 방법이다. 생존 곡선을 확인하고 그룹 차이를 비교하기 좋지만, 공변량 효과를 추정하는 데에는 한계가 있다.

Cox 비례위험(Cox PH)은 베이스라인 위험을 특정 분포로 고정하지 않는 반모수 모델이다. 부분우도(Partial Likelihood)로 추정하며, 위험비(HR)를 해석하기 쉽다는 점이 강점이다.

AFT는 Weibull, Log-normal, Log-logistic 등의 분포를 전제하는 모수 모델이다. 시간 스케일에서 사건까지의 시간이 얼마나 가속되거나 감속되는지를 계수로 해석할 수 있지만, 분포 가정이 맞는지 확인해야 한다.

모델을 평가할 때는 다음 관점이 함께 필요하다.

  • 판별력은 Concordance index(C-index)와 시간의존 AUC로 본다.
  • 예측오차는 Brier score와 Integrated Brier Score로 확인한다.
  • 보정은 시점별 예측 생존확률과 관측 비율을 비교한다.
  • 가정 진단에는 Schoenfeld 잔차, 로그-마이너스-로그 플롯, Cox-Snell 잔차, AFT 분포 적합도 진단을 사용한다.

적합 전에 정리해야 하는 데이터와 가정

사건 정의를 일관되게 정하고 검열과 트렁케이션을 명시한 뒤, 시간 단위를 표준화한다. 시간의존 공변량이 있다면 start–stop 형식으로 변환하고 구간 상수(piecewise-constant) 가정을 적용한다.

동일 시점의 사건이 여러 건인 경우에는 ties 처리 방식도 정해야 한다. Efron(권장), Breslow, Exact 중에서 선택한다.

Cox PH는 공변량 효과가 시간에 따라 비례적으로 유지된다는 비례위험 가정을 전제로 한다. AFT는 생존시간의 로그 스케일 선형성과 선택한 분포를 검증해야 한다. 가정이 맞지 않으면 층화 Cox, 시간가변 계수, 분포가 유연한 AFT, 스플라인 기반 베이스라인 추정을 적용할 수 있다.

KM은 점프형 생존곡선을 추정하며 그룹 간 비교에는 로그랭크 검정을 사용한다. Cox는 부분우도를 최적화하고, 표준오차에 샌드위치 추정을 사용할 수 있다. 페널라이저는 과적합과 수렴 문제를 완화하는 데 활용한다. AFT는 최대우도로 적합하며, 분포 선택과 적합도 진단이 함께 따라야 한다.

탐색부터 운영 감시까지 이어지는 흐름

PH 성립PH 위반수렴 실패가정 위반성능 저하입력: duration/event,covariates, censoring전처리: 결측/이상치,start–stop 변환, ties=Efron탐색: KM 추정, 그룹비교(로그랭크)가정 점검Cox PH 적합: 부분우도,페널라이저대안: 층화/시간가변 Cox 또는AFT진단: Schoenfeld 잔차,영향점, 수렴 확인AFT 적합: 분포선택(Weibull/Log-normal),적합도 진단예측: 생존곡선/중앙생존시간,위험층화평가: C-index, Brier score,캘리브레이션문제 발생?페널티/스케일링↑, 변수 축소모형 교체/확장특성 공학, 상호작용,재표본검증

외부 검증 세트에서 C-index와 시점별 Brier score를 확인하고, 캘리브레이션 플롯 및 재표본검정(부트스트랩/시계열 CV)을 적용한다. 배포 뒤에는 스코어링 파이프라인과 함께 가정 위반·분포 드리프트 알림을 감시하고 재학습 주기를 운영해야 한다.

해석 목적과 가정에 맞춘 선택

설명력과 해석 용이성이 우선이라면 위험비 해석이 가능한 Cox PH가 적합하다. 분포 가정이 타당하고 시간 스케일 효과를 직관적으로 해석해야 한다면 AFT를 선택한다. 공변량이 없거나 단순한 그룹 비교가 목적이라면 KM이 적합하다.

항목 Kaplan-Meier Cox 비례위험 AFT
성능(예측/추정) 그룹 차이 검정에 강점, 공변량 효과 한계 광범위 데이터에 견고한 성능 분포 적합 시 높은 예측력
확장성(특성/규모) 대규모 처리 용이, 공변량 확장 제한 고차원 가능(페널티/Elastic Net), 시간의존 공변량 지원 분포·파라미터 수 증가 시 복잡도 상승
일관성(가정 민감도) 가정 최소 PH 가정 위반에 민감 분포 가정 위반에 민감
안정성(수렴/분산) 안정적 추정 ties/희소 이벤트에서 수렴 이슈 가능 수렴 민감, 초기값·스케일링 영향
운영 편의(해석/툴) 생존곡선 직관, 쉬운 커뮤니케이션 HR 해석 용이, 툴 풍부 시간 가속 계수 직관, 분포 선택 필요

시간 데이터를 의사결정에 연결하는 장면

의료 임상시험에서는 치료군과 대조군의 생존곡선을 비교하고 HR을 추정해 중간분석과 종료 의사결정을 지원한다. PH 가정이 맞지 않으면 층화 Cox나 시간가변 효과를 적용하거나 AFT로 전환한다.

제조·설비 예지보전에서는 장비 고장까지의 시간을 모델링하고, 사용 조건과 환경 센서 데이터를 공변량으로 반영한다. AFT(Weibull)를 활용하면 수명분석과 예방정비 스케줄 최적화에 연결할 수 있다.

금융 리스크와 SaaS 이탈 분석에서는 고객 이탈까지의 시간을 대상으로 프로모션과 접속 로그의 시간의존 공변량을 반영한다. Cox PH 기반 위험층화는 리텐션 캠페인 타이밍을 잡는 데 활용된다.

Python으로 KM, Cox PH, AFT 적합하기

실행 환경은 Python 3.10+, lifelines 0.27+, pandas 2.x, numpy 1.23+이며, 우측 검열을 포함한 lifelines.datasets.load_rossi 데이터를 사용한다.

# pip install lifelines==0.27.8 pandas numpy
import numpy as np
import pandas as pd
from lifelines import KaplanMeierFitter, CoxPHFitter, WeibullAFTFitter
from lifelines.datasets import load_rossi

# 1) 데이터 로드
df = load_rossi()  # columns: week(duration), arrest(event), age, fin, race, wexp, mar, paro, prio

# 2) Kaplan-Meier 추정
kmf = KaplanMeierFitter()
kmf.fit(durations=df["week"], event_observed=df["arrest"])
km_surv = kmf.survival_function_

# 3) Cox 비례위험 적합
cph = CoxPHFitter(penalizer=0.1)  # 수렴 안정화 목적의 페널티
cph.fit(df, duration_col="week", event_col="arrest", ties="efron")
cox_cindex = cph.concordance_index_

# 비례위험 가정 점검(요약 출력)
# 경고가 발생하면 층화/시간가변 공변량 또는 AFT 고려
cph.check_assumptions(df, p_value_threshold=0.05, show_plots=False)

# 4) AFT(Weibull) 적합
aft = WeibullAFTFitter()
aft.fit(df, duration_col="week", event_col="arrest")
aft_cindex = aft.concordance_index_

# 5) 예측 예시: 특정 관측치의 생존곡선
x = df.drop(columns=["week", "arrest"]).iloc[[0]]
cox_surv_curve = cph.predict_survival_function(x)
aft_surv_curve = aft.predict_survival_function(x)

print("KM S(10주)≈", float(kmf.survival_function_at_times(10)))
print("Cox C-index=", round(cox_cindex, 3))
print("AFT C-index=", round(aft_cindex, 3))

수렴에 실패하면 변수 스케일링, 강한 상관 제거, 페널티 조정(penalizer, l1_ratio)을 적용한다. PH 가정을 위반하면 stratify_cols 인자를 사용하거나 시간가변 상호작용(예: x \* log(time))을 추가한다. 평가는 학습·검증을 분리하고 시간 누적 메트릭(IBS)과 외부 검증 세트를 병행한다.

위험층화의 효과를 운영 결과로 연결하기

위험층화를 이용하면 리소스 배분을 정량화하고 임상·리스크 의사결정의 일관성을 높일 수 있다. 로지스틱/정적 모델 대비 C-index 0.05~0.10p 개선을 기대할 수 있으며, 도메인·특성공학 수준에 따라 편차가 존재한다.

예방정비나 캠페인 타이밍을 최적화하면 다운타임을 10~20% 줄이고 불필요한 개입을 15% 이상 축소할 수 있다. HR 또는 가속계수는 원인 해석의 근거가 되어 규제·감사 대응에도 활용된다.

KM으로 분포를 탐색한 뒤 Cox PH로 해석 중심의 베이스라인을 만들고, 가정 위반이나 시간 스케일 해석이 필요할 때 AFT로 전환하는 흐름을 템플릿화할 수 있다. 이 과정에 가정 진단, 검증, 운영 모니터링을 연결하면 프로젝트별 재사용 체계를 갖출 수 있다.

생존 분석Kaplan-MeierCox 비례위험AFT예지보전