Kaplan-Meier 모형 시각화

Python에서의 Survival Analysis

Shae Wang

Senior Data Scientist

Kaplan-Meier 생존곡선은 어떻게 구성하나요?

장난감 데이터 $n=5$:

duration observed
2 1
5 0
3 1
5 1
2 0

1단계: 데이터를 오름차순으로 정렬합니다. 동률일 때는 검열 데이터가 비검열 데이터 뒤에 옵니다.

2단계: 각 $t_i$에 대해 $d_i$, $n_i$, 그리고 $\big(1-\frac{d_i}{n_i}\big)$ 계산

3단계: 각 $t_i$에 대해 $\big(1-\frac{d_i}{n_i}\big)$를 $\big(1-\frac{d_{i-1}}{n_{i-1}}\big)$, $\big(1-\frac{d_{i-2}}{n_{i-2}}\big)$, ... , $\big(1-\frac{d_0}{n_0}\big)$와 곱합니다

Python에서의 Survival Analysis

Kaplan-Meier 생존곡선은 어떻게 구성하나요?

1단계: duration을 오름차순으로 정렬합니다. 동률일 때는 검열 데이터가 비검열 뒤에 옵니다.

duration
2
5+
3
5
2+

"+" 기호는 검열을 의미: 2, 5+, 3, 5, 2+

Python에서의 Survival Analysis

Kaplan-Meier 생존곡선은 어떻게 구성하나요?

1단계: duration을 오름차순으로 정렬합니다. 동률일 때는 검열 데이터가 비검열 뒤에 옵니다.

$t_i$
2, 2+
3
5, 5+
Python에서의 Survival Analysis

Kaplan-Meier 생존곡선은 어떻게 구성하나요?

2단계: 각 $t_i$에 대해 $d_i$, $n_i$, 그리고 $\big(1-\frac{d_i}{n_i}\big)$ 계산

$t_i$
2, 2+
3
5, 5+
Python에서의 Survival Analysis

Kaplan-Meier 생존곡선은 어떻게 구성하나요?

2단계: 각 $t_i$에 대해 $d_i$, $n_i$, 그리고 $\big(1-\frac{d_i}{n_i}\big)$ 계산

$t_i$ $d_i$
2, 2+ 1
3 1
5, 5+ 1
Python에서의 Survival Analysis

Kaplan-Meier 생존곡선은 어떻게 구성하나요?

2단계: 각 $t_i$에 대해 $d_i$, $n_i$, 그리고 $\big(1-\frac{d_i}{n_i}\big)$ 계산

$t_i$ $d_i$ $n_i$
2, 2+ 1 5
3 1 3
5, 5+ 1 2
Python에서의 Survival Analysis

Kaplan-Meier 생존곡선은 어떻게 구성하나요?

2단계: 각 $t_i$에 대해 $d_i$, $n_i$, 그리고 $\big(1-\frac{d_i}{n_i}\big)$ 계산

$t_i$ $d_i$ $n_i$ $\big(1-\frac{d_i}{n_i}\big)$
2, 2+ 1 5 $4/5$
3 1 3 $2/3$
5, 5+ 1 2 $1/2$
Python에서의 Survival Analysis

Kaplan-Meier 생존곡선은 어떻게 구성하나요?

3단계: 각 $t_i$에 대해 $\big(1-\frac{d_i}{n_i}\big)$를 $\big(1-\frac{d_{i-1}}{n_{i-1}}\big)$, $\big(1-\frac{d_{i-2}}{n_{i-2}}\big)$, ... , $\big(1-\frac{d_0}{n_0}\big)$와 곱합니다.

$t_i$ $d_i$ $n_i$ $\big(1-\frac{d_i}{n_i}\big)$ $S(t_i)$
2, 2+ 1 5 4/5 4/5 = 0.8
3 1 3 2/3 4/5 $\cdot$ 2/3 = 0.53
5, 5+ 1 2 1/2 4/5 $\cdot$ 2/3 $\cdot$ 1/2 = 0.27
Python에서의 Survival Analysis

Kaplan-Meier 생존곡선은 어떻게 구성하나요?

$t_i$ $d_i$ $n_i$ $\big(1-\frac{d_i}{n_i}\big)$ $S(t_i)$
2, 2+ 1 5 $4/5$ 0.8
3 1 3 $2/3$ 0.53
5, 5+ 1 2 $1/2$ 0.27

표에서 생성된 Kaplan-Meier 곡선.

Python에서의 Survival Analysis

생존곡선 해석

표에서 생성된 Kaplan-Meier 곡선.

  • 0부터 5까지 각 시점의 생존확률

  • 흔한 오해: 곡선이 0이면 아무도 생존하지 못했다.

  • 마지막 관측이 검열이 아니면(실제 사건 시간이 알려짐) 곡선이 0으로 떨어질 수 있습니다.
Python에서의 Survival Analysis

Kaplan-Meier 생존곡선 그리기

from lifelines import KaplanMeierFitter
import matplotlib.pyplot as plt

kmf = KaplanMeierFitter()
kmf.fit(durations, event_observed)
kmf.survival_function_.plot()
plt.show()
Python에서의 Survival Analysis

모기지 문제 예시

DataFrame 이름: mortgage_df

id duration paid_off
1 25 0
2 17 1
3 5 0
... ... ...
100 30 1
from lifelines import KaplanMeierFitter
from matplotlib import pyplot as plt
mortgage_kmf = KaplanMeierFitter()
mortgage_kmf.fit(duration=mortgage_df["duration"], 
        event_observed=mortgage_df["paid_off"])
mortgage_kmf.survival_function_.plot()
Python에서의 Survival Analysis

모기지 문제 예시

plt.show()

모기지 문제 생존곡선 시각화.

Python에서의 Survival Analysis

생존곡선 신뢰구간

mortgage_kmf.plot_survival_function()
plt.show()

신뢰구간이 포함된 모기지 문제 생존곡선 시각화.

Python에서의 Survival Analysis

신뢰구간이 유용한 이유

  • 각 시점 생존확률 점추정의 불확실성을 정량화
  • 신뢰구간이 넓을수록 확신이 낮음(표본 수 작음)
  • 신뢰구간이 좁을수록 확신이 높음(표본 수 큼)
Python에서의 Survival Analysis

Kaplan-Meier 생존곡선 그리는 방법들

생존함수 점추정을 연속선으로 그림.

kmf.survival_function_.plot()
plt.show()

연속선으로 그린 생존함수.

신뢰구간 없이 계단형 선으로 그림.

kmf.plot(ci_show=False)
plt.show()

계단형 선으로 그린 생존함수.

Python에서의 Survival Analysis

Kaplan-Meier 생존곡선 그리는 방법들

신뢰구간과 함께 계단형 선으로 그림.

kmf.plot()
plt.show()

신뢰구간과 함께 계단형 선으로 그린 생존함수.

또 다른 방법...

kmf.plot_survival_function()
plt.show()
Python에서의 Survival Analysis

연습해 봅시다!

Python에서의 Survival Analysis

Preparing Video For Download...