はじめに
今回は統計分析の手法の一つ「生存分析」について、できるだけわかりやすく解説していきます。難しい数式は最小限にして、概念や使い方を中心にお伝えしますので、統計初心者の方もぜひ最後までお付き合いください。
生存分析とは?
「生存分析」という名前を聞くと、医療や生物学の分野で使われる専門的な分析手法と思われるかもしれません。確かに名前の由来は医療分野ですが、実はとても幅広い場面で活用できる便利な分析方法なんです。
生存分析の本質:「何かが起きるまでの時間」を分析する方法
例えば:
- 患者さんが治療後に再発するまでの期間
- 新しい機械が故障するまでの期間
- サブスクリプションサービスの顧客が解約するまでの期間
- 就職してから転職するまでの期間
このように「あるイベントが発生するまでの時間」を分析するのが生存分析です。

なぜ普通の統計分析ではダメなの?
「時間の分析なら平均値や中央値を計算すればいいのでは?」と思われるかもしれません。しかし生存分析が必要になる理由は、観察期間が終わった時点でまだイベントが起きていないデータがあるからです。
これを「打ち切りデータ」と呼びます。
打ち切りデータとは
例えば、5年間の患者追跡調査を行うとしましょう:
- Aさん:3年目で再発(明確なイベント発生)
- Bさん:5年間再発せず(イベント未発生=打ち切り)
- Cさん:2年目で転院して追跡不能(途中で追跡不能=打ち切り)
普通の統計分析では「まだイベントが起きていない」Bさんのデータや、「追跡できなくなった」Cさんのデータをどう扱えばよいのかわかりません。生存分析は、このような不完全な情報も含めて解析できる強みがあるのです。

生存分析の基本概念
1. 生存関数(Survival Function)
生存関数 S(t) は、「時間 t までイベントが発生しない確率」を表します。
グラフでは時間とともに下がっていく曲線として表現され、直感的に「時間の経過とともにイベントが発生する人の割合がどう変化するか」を見ることができます。
2. ハザード関数(Hazard Function)
ハザード関数 h(t) は、「ある時点 t まで生き残った(イベントが発生していない)と仮定した上で、次の瞬間にイベントが発生する確率」です。
これは「瞬間的なリスク」と考えるとわかりやすいでしょう。例えば、製品の故障率や患者の再発リスクなどです。
代表的な生存分析手法
カプラン・マイヤー法
カプラン・マイヤー法は、生存関数を推定する最も基本的な方法です。特徴は:
- データから直接生存曲線を描ける
- グループ間の比較が視覚的にできる
- 専門的な前提条件が少ない
例えば、新薬Aと従来薬Bの効果を比較する医療研究では、両グループの生存曲線を並べて「どちらの薬の方が長く再発を防げるか」を視覚的に比較できます。
Cox比例ハザードモデル
カプラン・マイヤー法が「グループ間の単純比較」なら、Cox比例ハザードモデルは「様々な要因を同時に考慮した分析」です。
例えば、顧客の解約率を分析する場合:
- 年齢
- 契約プラン
- 利用頻度
- サポート問い合わせ回数
などの要因が、解約リスクにどのように影響するかを同時に分析できます。「年齢が1歳上がるとリスクは何%増加する」といった具体的な数値で影響度を知ることができるのです。
実際の応用例
医療分野での応用
新しい抗がん剤の治療効果を検証するとき、「5年生存率」などの指標で効果を測定します。生存分析を使えば、「治療後の生存期間」を詳細に分析でき、「どの時点で効果に差が出るのか」まで把握できます。
ビジネスでの応用
サブスクリプションビジネスでは「顧客が解約するまでの期間(顧客生存期間)」が重要な指標です。生存分析を使うと:
- どのタイミングで解約リスクが高まるか
- どのような顧客特性が解約リスクに影響するか
- どの施策が顧客維持に効果的か
などを分析できます。
工学分野での応用
製品の耐久性テストでは、「故障するまでの時間」を分析します。すべての製品が壊れるまで待つのは現実的でないため、一定期間で打ち切って生存分析を行います。これにより:
- 製品の平均寿命の推定
- 故障率カーブの作成
- 信頼性向上のための要因分析
が可能になります。
Pythonでの簡単な実装例
生存分析は専用のライブラリを使えば、比較的簡単に実装できます。Pythonではlifelines
というライブラリが便利です。
基本的な使い方を簡単に示します:
pythonコピーimport pandas as pd
from lifelines import KaplanMeierFitter
import matplotlib.pyplot as plt
# サンプルデータ
data = pd.DataFrame({
'duration': [5, 6, 9, 4, 8, 7, 10, 3], # イベント発生または観察期間
'event': [1, 1, 0, 1, 0, 1, 0, 1] # 1=イベント発生, 0=打ち切り
})
# カプラン・マイヤー法で分析
kmf = KaplanMeierFitter()
kmf.fit(data['duration'], data['event'])
# 生存曲線をプロット
plt.figure(figsize=(10, 6))
kmf.plot()
plt.title('生存曲線')
plt.xlabel('時間')
plt.ylabel('生存率')
plt.grid(True)
plt.show()
グループ比較も簡単にできます:
pythonコピー# グループデータ(例:治療群=1、対照群=0)
data['group'] = [1, 0, 1, 0, 1, 0, 1, 0]
# グループごとに分析
kmf_treatment = KaplanMeierFitter()
kmf_control = KaplanMeierFitter()
treatment_mask = data['group'] == 1
control_mask = data['group'] == 0
kmf_treatment.fit(data.loc[treatment_mask, 'duration'],
data.loc[treatment_mask, 'event'],
label='治療群')
kmf_control.fit(data.loc[control_mask, 'duration'],
data.loc[control_mask, 'event'],
label='対照群')
# 生存曲線を比較プロット
plt.figure(figsize=(10, 6))
kmf_treatment.plot()
kmf_control.plot()
plt.title('治療群と対照群の生存曲線比較')
plt.xlabel('時間')
plt.ylabel('生存率')
plt.grid(True)
plt.legend()
plt.show()
生存分析を使う際の注意点
1. サンプルサイズを考慮する
イベント発生数が少ない場合、統計的に有意な結果が得られにくくなります。特に多変量解析では、十分なサンプル数が必要です。
2. 打ち切りのメカニズムを理解する
データの打ち切りが「ランダム」に起こっていることが前提です。イベント発生リスクと関連して打ち切りが生じる場合(例:症状悪化で転院→追跡不能)、結果が歪む可能性があります。
3. 比例ハザード性の確認
Cox比例ハザードモデルでは、「各要因の影響は時間によらず一定」という前提があります。この前提が成り立たない場合、別のモデルを検討する必要があります。
まとめ
生存分析は「イベント発生までの時間」を分析する強力な手法です。医療研究だけでなく、ビジネス、工学など様々な分野で活用できます。特に:
- 打ち切りデータを適切に扱える
- グループ間の差を視覚的に比較できる
- 複数の要因の影響を同時に評価できる
といった特徴があります。
専門的な統計知識がなくても、基本的な概念を理解して適切なツールを使えば、自分のデータに生存分析を適用することができます。ぜひ自分の研究やビジネス課題に役立ててみてください!
コメント