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
2
5+
3
5
2+

「+」で打ち切りデータを示す: 2, 5+, 3, 5, 2+

Pythonで学ぶSurvival Analysis

Kaplan–Meier生存曲線の作り方

手順1: 期間を昇順に並べる。同値の場合は、打ち切りを非打ち切りの後に置く。

$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

Ayo berlatih!

Pythonで学ぶSurvival Analysis

Preparing Video For Download...