はじめに
「顧客が解約するかどうか」を予測する際、多くの場合はロジスティック回帰やランダムフォレストで「解約する / しない」を二値分類します。しかしこれでは「いつ離脱するか」という時間の情報が完全に無視されます。
また、現在も契約を継続している顧客(まだ解約していないデータ)の扱いも課題となります。いつか解約するかもしれない「現在進行形のデータ」を二値分類で正しく扱えないと、顧客の生涯価値(LTV)を過小評価してしまうからです。
生存時間解析を使うと、次のことができます。
- 「入会から6ヶ月後に継続している確率は何%か」を推定する
- 「契約形態を変えると、離脱リスクが何倍になるか」を定量化する
- 「月次契約 → 2年契約に誘導すると、24ヶ月後継続率が何ポイント改善するか」をシミュレーションする
本記事では Kaggle の Telco Customer Churn データセットを使い、Pythonライブラリ lifelines で実際に分析した結果とインサイトを紹介します。
1. lifelines とは
lifelinesはPythonの生存時間解析ライブラリです。統計・医学分野で発展した手法を、データサイエンス・ビジネス分析向けに使いやすくパッケージ化されています。
できること
| 手法 | クラス | 用途 |
|---|---|---|
| カプラン・マイヤー法 | KaplanMeierFitter |
生存曲線の可視化・グループ比較 |
| コックス比例ハザードモデル | CoxPHFitter |
特徴量の影響定量化・個別予測 |
| ワイブル・指数モデル等 |
WeibullFitter など |
パラメトリックな生存時間モデリング |
| Log-rank 検定 | logrank_test |
グループ間の生存曲線の差の検定 |
メリット
-
打ち切りデータを正しく扱える
「まだ解約していない」という情報を捨てずに学習できる。
通常の回帰や分類では「解約していない顧客」を「絶対に解約しない人」として扱ってしまうか、データから除外するしかありません。生存時間解析は、「現時点まで生き残っている(=少なくとも●ヶ月は継続した)」という途中の経過情報を確率計算に組み込めるため、データを1件も無駄にせず正しく学習できます。 -
ハザード比で施策の効果を定量化できる
「都度払いは銀行引落より離脱リスクが1.47倍高い」という形で、特徴量の影響を直感的に説明できる。 -
What-if シミュレーションができる
「この顧客が月次契約から2年契約に変えたら、『平均してあと何ヶ月契約を続けてくれるか(顧客の半数が解約するまでの期間)』がどう延びるか」を予測できる。
デメリット
-
比例ハザード仮定
コックス比例ハザードモデルは「各特徴量のリスク比が時間によらず常に一定」という前提(仮定)があります。この仮定が崩れるデータでは、正しい分析結果が得られません。例えば、「入会直後はキャンペーン特典の有無で解約率に大差があるが、1年経つと特典の有無は関係なくなる」といった時間経過で影響度が変わるケースには、そのまま適応できないため注意が必要です。 -
競合リスクの扱いが限定的
分析したい原因(例:自発的なサービス解約)以外の理由で離脱が発生するケースでは正確な確率を計算することが困難です。例えば、「自発的なサービス解約」を分析したいのに、「引っ越しによる強制解約」や「サービスの強制終了」など、別の原因による離脱が混ざると正確な確率が計算できなくなります。
2. 分析データの概要
Kaggle: Telco Customer Churn Dataset
Telco Customer Churnデータセットは、通信会社の顧客利用状況や解約情報、契約内容、月額料金などを記録した7,043件のレコードで構成されています。特に利用月数(tenure)と解約(Churn)のデータは、顧客の生存時間分析のチュートリアルとして広く利用されています。
| 項目 | 値 |
|---|---|
| 件数 | 7,043 件 |
| 離脱率 | 26.5%(離脱 1,869 件・継続 5,174 件) |
| 期間 | 最大 72ヶ月 |
主な特徴量:
| カラム | 内容 |
|---|---|
tenure |
利用月数(生存時間) |
Churn |
解約したか(イベント) |
Contract |
契約形態(月次契約 / 1年契約 / 2年契約) |
InternetService |
インターネット種別(電話回線 / 光回線 / なし) |
PaymentMethod |
支払方法(都度払い / 銀行振込 / etc..) |
MonthlyCharges |
毎月の支払い |
前処理コード(概要)
簡単に前処理の例です。
import pandas as pd
from lifelines import CoxPHFitter, KaplanMeierFitter
df = pd.read_csv("data/Customer-Churn.csv")
df["TotalCharges"] = pd.to_numeric(df["TotalCharges"], errors="coerce")
df = df.dropna()
# Churn を 0/1 に変換
df["Churn"] = (df["Churn"] == "Yes").astype(int)
# カテゴリ変数をダミー化
df = pd.get_dummies(df, drop_first=True)
3. カプラン・マイヤー法:全体の生存曲線
特徴量を一切使わず、「各時点で何割の顧客がまだ継続しているか」 を推定します。
kmf = KaplanMeierFitter()
kmf.fit(df["tenure"], event_observed=df["Churn"])
kmf.plot_survival_function()
結果
| 利用月数 | 継続率 |
|---|---|
| 1ヶ月 | 94.6% |
| 6ヶ月 | 88.5% |
| 12ヶ月 | 84.3% |
| 24ヶ月 | 78.9% |
| 60ヶ月 | 66.4% |
読み取れるインサイト
1. 初期離脱リスクが最も高い
入会から12ヶ月以内に 15.7% が離脱します。13ヶ月〜60ヶ月の48ヶ月間で 17.9% しか離脱しないことと比べると、最初1年のリスクがいかに高いかがわかります。
2. 65〜66ヶ月付近でハザードが再上昇する
60ヶ月(5年)付近で月次離脱数が急増しています。5年という契約更新の節目、またはライフイベントでの更新離脱が疑われます。
| 月 | リスク集合 | 離脱数 | 月次ハザード率 |
|---|---|---|---|
| 63 | 1,261 | 4 | 0.32% |
| 64 | 1,189 | 4 | 0.34% |
| 65 | 1,109 | 9 | 0.81% |
| 66 | 1,033 | 13 | 1.26% |
4. コックス比例ハザードモデル:何が離脱リスクを高めるか
複数の特徴量を同時に考慮して、それぞれが離脱リスクにどう影響するかを推定します。
cph = CoxPHFitter(penalizer=0.1)
cph.fit(df, duration_col="tenure", event_col="Churn")
cph.print_summary()
ハザード比ランキング(p < 0.05 の変数)
| 変数 | ハザード比 | 解釈 |
|---|---|---|
| Contract = Two year | 0.35 | 2年契約は離脱リスクを 65% 低下 |
| Contract = One year | 0.51 | 1年契約は離脱リスクを 49% 低下 |
| InternetService = Fiber optic | 1.60 | 光回線は離脱リスクを 60% 上昇 |
| OnlineSecurity = Yes | 0.65 | セキュリティオプション有りで 35% 低下 |
| PaymentMethod = Electronic check | 1.47 | 都度払いは離脱リスクを 47% 上昇 |
| TechSupport = Yes | 0.72 | テクサポ有りで 28% 低下 |
| OnlineBackup = Yes | 0.73 | バックアップ有りで 27% 低下 |
| Partner = Yes | 0.73 | パートナー有りで 27% 低下 |
最も影響が大きいのは「契約形態」と「インターネットサービス種別」です。
なぜ「月次契約」が表に出てこないのか?
カテゴリ変数はダミー変数化の際、1つを基準(ハザード比 = 1.0)として除外します。
Contract列では件数最多の 月次契約 が基準となるため表に現れません。「2年契約のハザード比 0.35」は「月次契約と比べて離脱リスクが 35% の水準」という意味です。同じように「1年契約のハザード比 0.51」は「月次契約と比べて離脱リスクが 51% の水準」と解釈できます。
すなわち「2年契約または1年契約であれば月次契約よりリスクが下がる」ことを示しており、これは裏を返せば月次契約が契約形態の中で最もリスクが高い状態であることを統計的に意味しています。
C-index(モデルの予測精度)
C-index = 0.74
C-index は「実際に先に離脱した顧客を、モデルが正しく高リスクと予測できている割合」です。
- 0.5 = ランダム(意味なし)
- 0.7 = 実用的な目安
- 1.0 = 完全な予測
0.74 はビジネス用途として十分な精度となります。
5. クロス集計:構造的なリスクの把握
コックスモデルのハザード比は各変数を独立に見ます。しかし「月次契約 × 光回線」のような組み合わせのリスクを直接見るには、クロス集計が有効です。
契約形態 × インターネットサービス別 離脱率
| 契約形態 | DSL 離脱率 | 光回線 離脱率 | インターネットなし |
|---|---|---|---|
| 月次契約 | 32.2% | 54.6% | 18.9% |
| 1年契約 | 9.3% | 19.3% | 2.5% |
| 2年契約 | 1.9% | 7.2% | 0.8% |
月次 × 光回線は離脱率 54.6%、 全離脱件数(1,869件)の 62.2%(1,162件) がこのセグメントから発生しています。同じ光回線でも2年契約に変えると 7.2% まで下がります(7.6倍の差)。
6. 高リスクと考えられる顧客の個別予測
最悪リスクのプロファイル(月次契約・光回線・都度払い・オプションなし・利用12ヶ月)の生存確率を予測します。
sample = {
"tenure": 12,
"Contract_One year": 0,
"Contract_Two year": 0,
"InternetService_Fiber optic": 1,
"PaymentMethod_Electronic check": 1,
"OnlineSecurity_Yes": 0,
"TechSupport_Yes": 0,
# ... その他特徴量
}
sample_df = pd.DataFrame([sample])
sf = cph.predict_survival_function(sample_df)
予測結果
| 時点 | 継続確率 |
|---|---|
| 12ヶ月後 | 47.7% |
| 24ヶ月後 | 26.6% |
| 36ヶ月後 | 12.4% |
| 中央生存時間 | 12.0ヶ月 |
上記の条件では、3年以内に約9割が離脱する確率であることを確認できます。
7. What-if シミュレーション:施策の効果を定量化する
生存時間解析の最大の強みは、「施策を打ったらどうなるか」をシミュレーションできることです。
各対策後の中央生存時間と継続率の変化
| 施策 | 中央生存時間 | 24ヶ月後継続率 | 変化幅 |
|---|---|---|---|
| ベースライン(現状) | 12.0ヶ月 | 26.6% | ─ |
| ①月次 → 2年契約に誘導 | 35.0ヶ月 | 63.1% | +36.5pt |
| ②都度払い → 自動引落 | 18.0ヶ月 | 40.5% | +13.9pt |
| ③セキュリティオプション追加 | 19.0ヶ月 | 42.0% | +15.4pt |
| ①+②+③ 全て実施 | 55.0ヶ月 | 81.5% | +54.9pt |
3つの施策を組み合わせると、24ヶ月後の継続率が 26.6% → 81.5% に跳ね上がります。
8. 施策の優先度
ここまでの分析(コックスモデル・クロス集計・What-if シミュレーション)を統合し、どのような施策が考えられるか整理します。影響の大きさ・対象顧客の件数・実施コストの3軸で優先度を判断しています。
| 優先度 | 施策 | 対象 | 期待効果 |
|---|---|---|---|
| ★★★ | 月次契約 → 長期契約への誘導(割引・特典) | 月次×光回線の全顧客 | 離脱率を最大40pt低下 |
| ★★★ | 入会12ヶ月以内の顧客への集中オンボーディング | 新規顧客全員 | 最リスク期間への直接介入 |
| ★★☆ | 都度払い → 自動引落への切り替えキャンペーン | 都度払いユーザー | 離脱率を約30pt低下 |
| ★★☆ | セキュリティ・テクサポのクロスセル | 月次×光回線×オプションなし | ハザード比 0.65〜0.72 の効果 |
| ★☆☆ | 5年前後の顧客への更新前プロアクティブオファー | tenure 58〜62ヶ月の顧客 | 更新離脱の防止 |
9. 本番運用に向けて:MLOps との組み合わせ
分析モデルを一度作って終わりにすると、時間の経過とともに精度が劣化します。原因は2種類あります。
データドリフトは「入力データの分布が変わる」現象です。たとえば長期契約への誘導キャンペーンが成功すると、月次契約に残り続ける顧客の属性が変わります。モデルが学習時に見ていた「月次契約ユーザー」と、推論時に入力される「月次契約ユーザー」が別物になっていくイメージです。
概念ドリフトは「入力と出力の関係性そのものが変わる」現象です。たとえば競合他社の格安プランが登場すると、これまでは価格に鈍感だった顧客層も離脱し始め、「月次契約 = 高リスク」という学習済みのルールが通用しなくなります。入力データの分布は変わらなくても、正解ラベルとの関係が変化します。
どちらの場合も結果は同じで、ハザード比の大きさや重要変数の順位が変わり、モデルの予測精度が静かに低下していきます。
なぜ定期的な再学習が必要か
モデルは学習した時点の「過去のデータ」を覚えているだけで、その後の変化には自動で追随しません。問題は、劣化が緩やかなため気づきにくいことです。「なんとなく動いている」ように見えながら、気づいたときには予測がほぼランダム、ということが起こります。
また生存時間解析では、ハザード比が変わると施策の優先度も変わります。古いモデルを使い続けると、効果が薄れた施策に予算を投じ続けるリスクがあります。
モデルの定期再学習・評価・デプロイを自動化するパイプラインの構築については、後続の記事で解説します。
MLOpsをAWSで実現してみた ─ 生存時間解析モデルの自動学習・評価・デプロイ
まとめ
生存時間解析について一番の気づきは問いの立て方が変わることでした。回帰や分類は結果が出るかどうかしか扱えません。しかし生存時間解析を使うと、「いつ・どのくらいのペースで起きるか」 という時間軸の問いに答えられます。「解約するか」ではなく「6ヶ月後にまだ継続している確率は何%か」を問えるようになります。
また、ハザード比という形で「どの要因がどれだけリスクに影響するか」を数値で示せるため、説明可能性も高いです。ランダムフォレストのような予測精度重視のモデルとは異なり、なぜその顧客が高リスクなのかを説明しやすい点は、ビジネス現場での活用において大きな強みだと感じました。


