Survival Analysis ด้วย Python
Shae Wang
Senior Data Scientist
ข้อมูลตัวอย่างที่ $n=5$:
| duration | observed |
|---|---|
| 2 | 1 |
| 5 | 0 |
| 3 | 1 |
| 5 | 1 |
| 2 | 0 |
ขั้นตอนที่ 1: เรียงข้อมูลจากน้อยไปมาก ถ้าค่าเท่ากัน ให้ข้อมูล censored อยู่หลังข้อมูลที่ไม่ใช่ censored
ขั้นตอนที่ 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)$
ขั้นตอนที่ 1: เรียงระยะเวลาจากน้อยไปมาก ถ้าค่าเท่ากัน ให้ข้อมูล censored อยู่หลังข้อมูลที่ไม่ใช่ censored
| duration |
|---|
| 2 |
| 5+ |
| 3 |
| 5 |
| 2+ |
ใช้เครื่องหมาย "+" แทนข้อมูล censored: 2, 5+, 3, 5, 2+
ขั้นตอนที่ 1: เรียงระยะเวลาจากน้อยไปมาก ถ้าค่าเท่ากัน ให้ข้อมูล censored อยู่หลังข้อมูลที่ไม่ใช่ censored
| $t_i$ |
|---|
| 2, 2+ |
| 3 |
| 5, 5+ |
ขั้นตอนที่ 2: สำหรับแต่ละ $t_i$ คำนวณ $d_i$, $n_i$ และ $\big(1-\frac{d_i}{n_i}\big)$
| $t_i$ |
|---|
| 2, 2+ |
| 3 |
| 5, 5+ |
ขั้นตอนที่ 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 |
ขั้นตอนที่ 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 |
ขั้นตอนที่ 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$ |
ขั้นตอนที่ 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 |
| $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 |


ความน่าจะเป็นของการรอดชีพ ณ แต่ละช่วงเวลาระหว่าง 0 ถึง 5
ความเข้าใจผิดที่พบบ่อย: ถ้ากราฟลงไปถึง 0 หมายความว่าไม่มีผู้รอดชีพเลย
from lifelines import KaplanMeierFitter
import matplotlib.pyplot as plt
kmf = KaplanMeierFitter()
kmf.fit(durations, event_observed)
kmf.survival_function_.plot()
plt.show()
ชื่อ 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()
plt.show()

mortgage_kmf.plot_survival_function()
plt.show()

พล็อต survival function แบบเส้นต่อเนื่อง
kmf.survival_function_.plot()
plt.show()

พล็อต survival function แบบเส้นขั้นบันไดโดยไม่แสดง confidence interval
kmf.plot(ci_show=False)
plt.show()

พล็อต survival function แบบเส้นขั้นบันไดพร้อม confidence interval
kmf.plot()
plt.show()

อีกวิธีหนึ่ง...
kmf.plot_survival_function()
plt.show()
Survival Analysis ด้วย Python