顧客離反予測(チャーン予測) scikit-learn

顧客離反予測(チャーン予測)

顧客離反予測(チャーン予測)の例題として、以下のようなシナリオを考えます:

あるテレコム会社があり、顧客の情報と過去の利用データが得られています。

これを使って、顧客が離反するかどうかを予測し、リテンション戦略を立てたいとします。

scikit-learnを使ってロジスティック回帰モデルを構築し、結果をグラフ化してみましょう。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import confusion_matrix, roc_auc_score, roc_curve

# ダミーデータを生成するための関数(仮想的なデータです)
def generate_dummy_data(n_samples=1000):
np.random.seed(42)
age = np.random.normal(40, 10, n_samples)
usage_months = np.random.randint(1, 25, n_samples)
monthly_expense = np.random.normal(100, 50, n_samples)
churn = np.random.randint(0, 2, n_samples)

data = pd.DataFrame({'Age': age, 'UsageMonths': usage_months, 'MonthlyExpense': monthly_expense, 'Churn': churn})
return data

# ダミーデータを生成
data = generate_dummy_data()

# 特徴量とターゲットに分割
X = data.drop('Churn', axis=1)
y = data['Churn']

# 訓練データとテストデータに分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# ロジスティック回帰モデルを構築
model = LogisticRegression()
model.fit(X_train, y_train)

# テストデータを用いて予測
y_pred = model.predict(X_test)
y_prob = model.predict_proba(X_test)[:, 1] # 予測確率を取得

# ROC曲線をプロットして結果を可視化
fpr, tpr, thresholds = roc_curve(y_test, y_prob)
roc_auc = roc_auc_score(y_test, y_prob)

plt.figure(figsize=(8, 6))
plt.plot(fpr, tpr, color='blue', lw=2, label='ROC curve (AUC = {:.2f})'.format(roc_auc))
plt.plot([0, 1], [0, 1], color='gray', lw=2, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver Operating Characteristic (ROC) Curve')
plt.legend(loc='lower right')
plt.show()

上記のコードでは、ダミーデータを作成してロジスティック回帰モデルを構築し、ROC曲線をプロットしています。

ROC曲線はモデルの性能を評価する際によく用いられる指標で、AUC (Area Under the Curve) の値が高いほど優れた予測モデルと言えます。

[実行結果]

ソースコード解説

上記のコードは、ロジスティック回帰モデルを使用して顧客離反予測(チャーン予測)を行い、その結果をROC曲線を用いて可視化しています。

以下にコードの詳細を説明します:

  1. ダミーデータを生成する関数 generate_dummy_data:

    • この関数は仮想的なデータを生成するためのもので、乱数を使って顧客の年齢 (Age)、利用期間 (UsageMonths)、月間支出 (MonthlyExpense)、および離反したかどうかを表すターゲット変数 (Churn) を作成します。
  2. ダミーデータの生成:

    • generate_dummy_data() 関数を呼び出して、ダミーデータを生成します。このデータは data という名前のPandas DataFrameに保存されます。
  3. 特徴量とターゲットの分割:

    • X = data.drop('Churn', axis=1) で特徴量 (Age, UsageMonths, MonthlyExpense) を取得します。
    • y = data['Churn'] でターゲット変数 Churn(離反したかどうかを表すラベル)を取得します。
  4. 訓練データとテストデータの分割:

    • train_test_split() を使ってデータを訓練データとテストデータに分割します。テストデータは全体の20%に設定されており、random_state=42 で乱数シードを固定して再現性を保証しています。
  5. ロジスティック回帰モデルの構築と学習:

    • LogisticRegression() を使用してロジスティック回帰モデルを初期化し、fit() メソッドで訓練データに適合させます。
  6. テストデータを用いた予測:

    • predict() メソッドを使用して、テストデータの特徴量を用いて離反の予測を行います。
    • predict_proba() メソッドを使用して、各テストサンプルがクラス1(離反)に属する確率を取得します。
  7. ROC曲線のプロットと結果の可視化:

    • roc_curve() 関数を用いて、予測確率と真のターゲット値を用いてROC曲線のデータを取得します。
    • roc_auc_score() 関数を用いて、ROC曲線の下の面積 (AUC) を計算します。
    • plt.figure() でグラフのサイズを設定し、plt.plot() を用いてROC曲線を描画します。
    • plt.plot([0, 1], [0, 1], color='gray', lw=2, linestyle='--') は対角線を描画し、ランダムな予測の場合の参考として用います。
    • ラベル、軸の範囲、タイトルなどのグラフの詳細設定を行います。
    • 最後に plt.show() でグラフを表示します。

結果として、ROC曲線が表示されます。

この曲線は、モデルの性能評価に使用され、AUCスコアが曲線下の面積を示します。

AUCが高いほど、モデルの性能が良いとされます。

結果解説

表示されるグラフは「Receiver Operating Characteristic (ROC) Curve(受信者動作特性曲線)」です。

ROC曲線は、二値分類モデル(ここではロジスティック回帰モデル)の性能評価に用いられるグラフで、以下の要素で構成されています:

  • X軸(横軸): False Positive Rate (FPR)

    • FPRは、実際には陰性(クラス0)であるもののうち、モデルが陽性(クラス1)と誤って予測したサンプルの割合を示します。計算式は FPR = FP / (FP + TN) であり、FPは偽陽性の数、TNは真陰性の数です。
  • Y軸(縦軸): True Positive Rate (TPR) または Recall

    • TPRは、実際には陽性(クラス1)であるもののうち、モデルが陽性と正しく予測したサンプルの割合を示します。計算式は TPR = TP / (TP + FN) であり、TPは真陽性の数、FNは偽陰性の数です。

ROC曲線の解釈:

  • 曲線の左下に近いほど、FPRが低く、真陰性率が高くなりますが、偽陽性率が高くなる傾向があります。
  • 曲線の右上に近いほど、FPRが高く、真陽性率が高くなりますが、偽陰性率が低くなる傾向があります。

AUC (Area Under the Curve):

  • ROC曲線の下の面積をAUCと呼びます。AUCは0から1の間の値を取り、モデルの性能を評価する指標です。

AUCが1に近いほど、モデルの性能が優れていると言えます。

このグラフを見ることで、モデルの性能がどれくらい優れているかが把握できます。

AUCが高いほど、モデルの予測精度が高いと言えます。ROC曲線が左上に近いほど、優れた分類モデルと言えます。