🚀 解約予測モデルを業務に活かす ─ XGBoost×SHAPで可視化し、営業施策に変えた実践例

こんにちは、@pomeshiba29 です！

今回は、通信業界における「顧客の解約予測モデル」を作成し、実際に業務適用まで行ったプロセスを共有します。
再現性のあるコードやダッシュボード活用例も交えて紹介しますので、実務でAIを活用したい方の参考になれば幸いです。

# 1. なぜ解約予測に取り組んだのか？
サブスクリプション型の通信サービスにおいて「解約」は単なる売上減ではなく、将来の利益損失も意味します。
> 例えば、月額5,000円の契約が100件解約されると  
> 年間で **6,000万円** の売上損失が発生します。  
> さらに、その代替顧客を獲得するには高額なマーケティング費がかかります。

このような背景から、
- 「誰が」
- 「いつ」
- 「なぜ」
解約しそうなのかを予測することは、営業やマーケ部門にとって重要なテーマです。

# 2. 使用データと前処理
### 📦 使用データセット
- データ名：[Telco Customer Churn Dataset](https://www.kaggle.com/blastchar/telco-customer-churn)
- 特徴：7,000人以上の顧客データ（契約情報・サービス利用・支払い方法など）
- データ提供元：Kaggle（オープンデータ）

| 属性カテゴリ   | 内容例                |
| -------- | ------------------ |
| 顧客属性     | 性別、パートナー有無、扶養者有無など |
| 契約情報     | 契約年数、月額料金、支払方法など   |
| サービス利用状況 | インターネット、TV、電話の有無など |
| ターゲット変数  | `Churn`（解約の有無）     |

### 🧹 前処理ポイント
#### ✅ ポイント①：個人情報の匿名化
本データはすでに匿名化されていますが、実務では外部委託時に必須です。

#### ✅ ポイント②：欠損値の処理
通信業界の実データでは、未記入などで欠損が発生しやすいです。

```python
import pandas as pd
df = pd.read_csv("Telco-Customer-Churn.csv")
print(df.isnull().sum())

# 出力例
# TotalCharges       11  ← 欠損あり！
```
TotalCharges は「契約直後でまだ請求が発生していない顧客」と推測し、0で補完しました。
```python
df['TotalCharges'] = pd.to_numeric(df['TotalCharges'], errors='coerce')
df['TotalCharges'].fillna(0, inplace=True)
```
#### ✅ ポイント③：カテゴリ変数の変換
XGBoostで扱えるようにOne-hot Encodingを実施：
```python
df = pd.get_dummies(df, drop_first=True)
```

# 3. モデル構築
### 🔧 採用モデル：XGBoost
- 理由：精度が高く高速、非線形な特徴に強い

- 実装：`xgboost.XGBClassifier` を用いて分類モデルを構築

- パラメータ調整やコード全体は [GitHubリポジトリ](https://github.com/pomeshiba29/customer-churn-prediction) にて公開

# 4. モデル評価と特徴量の解釈
### 📊 モデル評価結果
| 指標        | 意味       | 値    |
| --------- | -------- | ---- |
| Precision | 解約予測の的中率 | 0.62 |
| Recall    | 解約者の検出率  | 0.63 |
| F1-score  | 調和平均     | 0.63 |
| AUC       | モデルの識別能力 | 0.84 |

### 📊【参考】PrecisionとRecallとF1-scoreの可視化
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2681141/bf5c9846-c258-44e1-b21c-28dd2cae5f21.png)

### 📊 【参考】ROC曲線
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2681141/0cb6e90a-453c-4217-a6de-b2fa9b6b285b.png)

### 🔍 SHAPによる特徴量の読み解き
| 特徴量                              | 意味         | 解釈（SHAPより）   |
| -------------------------------- | ---------- | ------------ |
| `contract_score`                 | 契約の長さ（0〜2） | 長期契約者は解約しにくい |
| `tenure`                         | 契約月数       | 長いほど解約リスクが低い |
| `InternetService_Fiber optic`    | 光回線契約の有無   | 高額で解約されやすい   |
| `PaymentMethod_Electronic check` | 電子チェック支払いか | 解約率がやや高い     |
| `InternetService_No`             | インターネット非契約 | 解約可能性がそもそも低い |

### 【参考】SHAPによる可視化
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2681141/fa0fef8a-a9e1-421b-a990-6c6010a66603.png)

# 5. 解約予測スコアの業務適用
### 🎯 シナリオ①：解約スコアをダッシュボードで可視化

- Looker Studio にて解約スコア可視化ダッシュボードを構築
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2681141/3104b618-2857-4610-81b9-d5856cd1494d.png)

- 一例として「契約6ヶ月以下」「スコア0.7以上」の顧客を抽出

- 年間約 $41,934 の損失抑止が見込める(※顧客あたりの年間売上金額は仮の値)

### 🎯 シナリオ②：営業施策のトリガーに活用
| 洞察             | 対応施策（例）         |
| -------------- | --------------- |
| 契約期間が短いと解約しやすい | 新規加入後キャンペーンの実施  |
| 光回線契約者の解約傾向が高い | セット割・割引案内のメール配信 |
| 電子チェック支払いの顧客   | 支払方法変更の提案やリマインド |

# 6. まとめと今後の展望
- 解約予測モデルは、「誰が使うか」「どう使うか」まで設計することで価値が最大化されます

- 今後は Streamlit などでさらに現場で使いやすい可視化UIを構築していきたいと考えています

# 🔗 参考リンク
- 📘 データ出典：[Kaggle - Telco Customer Churn](https://www.kaggle.com/blastchar/telco-customer-churn)

- 💻 GitHubリポジトリ：https://github.com/pomeshiba29/customer-churn-prediction

# ✍️ 最後に
ここまでお読みいただきありがとうございました！
この記事が「機械学習モデルを業務で使いたい方」や「解約予測の設計に悩んでいる方」の一助になれば幸いです !

# 🐶 投稿者情報：@pomeshiba29
ビジネスサイドのデータサイエンティスト。
AIを業務に取り入れるために、自分でモデル開発なども行いながら
実践的なノウハウをQiitaで発信していきます。