# チャーン分析/チャーン予測とは？実際に用いられる手法とPythonでの実装方法

> 当サイト【スタビジ】の本記事では、顧客の離反を防ぐための施策チャーン分析についてまとめていきます。チャーン分析に使える手法をいくつか紹介した後、その中で定番のロジスティック回帰分析をPythonで実装していきます！

- URL: https://toukei-lab.com/churn-analysis
- 公開: 2022.11.29 / 更新: 2024.12.08
- サイト: スタビジ（https://toukei-lab.com）

:::talk{who="umatan"}
この記事では、顧客の離反を防ぐための施策であるチャーン分析についてまとめていきます。チャーン分析に使える手法をいくつか紹介した後、その中で定番のロジスティック回帰分析をPythonで実装していきます！
:::

こんにちは！

データサイエンティストのウマたん([@statistics1012](https://twitter.com/statistics1012?lang=ja))です！

サービスをグロースさせるためには当たり前ですが**そのサービスが保有する会員数・契約者数を増やすことが大事。**

そして、契約増加数&#x306F;**（新規契約数ー解約数）**&#x3067;表現することができます。

サービスローンチ直後は新規契約数をとにかく増やすことに注力するべきですが、<mark>ある程度安定した市場になってくると解約数をいかに減らすかが喫緊の問題になってきます。</mark>

例えば、日本の3大キャリアは新規契約数を取ることに躍起になり<mark>解約数を減らす手段がなかなかワークしていないのが現状です。</mark>

既存の顧客のロイヤリティを高めいかに解約数を減らすかが非常に重要になってきているのです。

そんな解約数を減らすために有用なのが「**チャーン分析**」と呼ばれる手法。

:::talk{who="umatan"}
チャーン分析はもし上手くいけば大きなビジネスインパクトを与えることができるんだ！
:::

この記事ではそんなチャーン分析の特徴とPythonでの実装を見ていきたいと思います。

:::box{title="読み飛ばしガイド"}
・[チャーン分析とは](/churn-analysis#i)\
・[チャーン分析に用いられる手法](/churn-analysis#i-2)\
・[チャーン分析で気を付けなければいけないこと](/churn-analysis#i-5)\
・[実際にロジスティック回帰分析でチャーン分析をやってみよう！](/churn-analysis#i-6)
:::

:::talk{who="umatan"}
Pythonの勉強は以下の記事をチェック！
:::

<https://toukei-lab.com/python-learn>

以下のYouTube動画でも解説していますので、あわせてチェックしてみてください！

::youtube{#4RvmZnDw9kY}

## チャーン分析とは

![Site Stats](/wp-content/uploads/2017/11/Site-Stats-amico.png)

それでは、まず**チャーン分析とは何なのか**見ていきましょう！

以下のYoutube動画でも詳しく解説しています！

::youtube{#AdMdG8Mx9dw}

チャーン分析のチャーンとは、英語で「かき混ぜる・激しく動く」などの意味。そこからビジネスの世界でチャーンと言うと解約という意味を表します。

すなわちチャーン分析と&#x306F;**<mark>解約する顧客を予測するという分析手法</mark>。**

解約予測なので、チャーン予測とも呼ばれます。

チャーン分析により正確に解約顧客を予測することが出来れば、**効率よく解約顧客を減らすことができる可能性が高くなります。**

![チャーン分析](/wp-content/uploads/2022/11/29294666b115e7d68838e8c43ba0e7b4.jpg)

やみくもに解約数を減らそうとするのではなく、<mark>このままだと解約してしまいそうな人に対して適切な施策を打つことが可能になるのです。</mark>

## チャーン分析に用いられる手法

![python](/wp-content/uploads/2019/08/Admin-amico-min.png)

チャーン分析においては予測するだけではなく、<mark>どの変数が解約に影響しているかを解釈</mark>する必要も出てきます。

分析手法には、**精度に重きを置く手法**と**結果の解釈に重きを置く手法**がありますのでそれぞれについて見ていきたいと思います。

### ロジスティック回帰分析

![ロジスティック回帰](/wp-content/uploads/2018/02/logistic-e1573992631282.jpg)

[ロジスティック回帰分析](/%E3%83%AD%E3%82%B8%E3%82%B9%E3%83%86%E3%82%A3%E3%83%83%E3%82%AF%E5%9B%9E%E5%B8%B0)は、[線形重回帰分析](/%e5%9b%9e%e5%b8%b0%e5%88%86%e6%9e%90)の応用であり線形回帰分析を拡張した手法であり、重回帰分析の仲間なので説明変数がどのくらい目的変数に寄与しているかも理解しやすく、<mark>今後の施策に活かしやすくなっています。</mark>

また、結果は0,1ではなく確率値で表現することが可能なため<mark>解約する確率が80％以上と予測された人に施策を打つなどと閾値を決めてアクションを取ることができるのが特徴</mark>です。

こちらは、**結果の解釈に重きを置く手法。**

予測精度だけ見ると、これから紹介する機械学習手法の方が高いことが多いです。

ロジスティック回帰分析に関してもっと詳しく知りたい方はこちらをご覧ください！

<https://toukei-lab.com/%E3%83%AD%E3%82%B8%E3%82%B9%E3%83%86%E3%82%A3%E3%83%83%E3%82%AF%E5%9B%9E%E5%B8%B0>

:::talk{who="umatan"}
解釈性の高さから、ビジネスの現場でもよく使われる手法だよ！
:::

### ランダムフォレスト

![バギング　ランダムフォレスト](/wp-content/uploads/2018/01/66c19942ab4ba346fdb64ccc04cde373-5.png)

[ランダムフォレスト](/%E3%83%A9%E3%83%B3%E3%83%80%E3%83%A0%E3%83%95%E3%82%A9%E3%83%AC%E3%82%B9%E3%83%88)は、<mark>簡単な実装でかつ高速でそこそこ高い精度をたたき出せる便利な手法。</mark>

ざっくり言うと、

**[決定木](/%E6%B1%BA%E5%AE%9A%E6%9C%A8)をたくさん集めて合体させた手法**

です。

決定木は単体だとそれほど強い手法ではありません。

しかし、その決定木を[バギング](/ensemble)と呼ばれる集団学習法を用いてたくさん集めてくると最強のランダムフォレストが出来上がるんです。

集団学習法は，決して精度が高いとはいえない弱いモデルをたくさん構築し，これらの予測結果を統合することで高い精度を出す方法論です。

ランダムフォレストでは<mark>変数重要度を算出することが可能でどの変数が寄与しているかは把握することが可能です。</mark>

ランダムフォレストに関してもっと詳しく知りたい方はこちらをご覧ください！

<https://toukei-lab.com/%E3%83%A9%E3%83%B3%E3%83%80%E3%83%A0%E3%83%95%E3%82%A9%E3%83%AC%E3%82%B9%E3%83%88>

### XGBoost

![勾配ブースティング](/wp-content/uploads/2019/07/xgboost.jpg)

XGBoostもランダムフォレストと同じく決定木を基にした手法です。

ランダムフォレストは[アンサンブル学習](/ensemble)であるバギングを決定木と組み合わせていますが、XGBoostではアンサンブル学習である**ブースティング**を決定木と組み合わせています。

バギングは弱い学習器（決定木）が並列で多数決を行うことで効果を発揮するイメージですが、<mark>ブースティングは直列でチューニングを行い徐々に改善していくイメージ</mark>です。

データセットやパラメータにもよりますが、ランダムフォレストよりもXGBoostの方が時間がかかる分精度が高い場合が多いです。

XGBoostでも変数重要度を算出することが可能です。

ただ、どの説明変数がどのくらい変化したら目的変数もどのくらい変化するかを算出するのはロジスティック回帰分析に得意とするところでXGBoostやランダムフォレストでは難しいです。

XGBoostに関して詳しくは以下の記事をご覧ください！

<https://toukei-lab.com/xgboost>

ちなみにXgboostを改良したLightGBMとCatboostもいかにまとめています！

<https://toukei-lab.com/light-gbm>

<https://toukei-lab.com/catboost>

:::talk{who="umatan"}
XGboostやランダムフォレストも使われることはあるけど、まだまだロジスティック回帰分析はビジネス最前線でよく使われるメジャーな手法なんだ！
:::

チャーン分析による企業課題の解決を以下の小説でまとめていますので是非参考にしてみてください！

::product[俺たちひよっこデータサイエンティストが世界を変える]{url="https://www.amazon.co.jp/dp/B089FHMJMB?tag=statistic08-22&linkCode=ogi&th=1&psc=1" image="https://m.media-amazon.com/images/I/31GBCi--NDL._SL160_.jpg" amazon="https://www.amazon.co.jp/dp/B089FHMJMB?tag=statistic08-22&linkCode=ogi&th=1&psc=1" kindle="https://www.amazon.co.jp/dp/B089FHMJMB?tag=statistic08-22&linkCode=ogi&th=1&psc=1"}

あまり具体的なデータサイエンティストの仕事について分かりやすく書いている本が見当たらなかったので自分で執筆しました！

ストーリー形式で分かりやすく書いていますので、目を通していただけるとイメージが湧くと思います。

価格は300円ちょっとですし、[Kindle unlimited](https://www.amazon.co.jp/kindle-dbs/hz/subscribe/ku?ref_=dbs_p_ebk_r00_pbcb_diupu0_hpe3p0\&passThroughAsin=B089FHMJMB&_encoding=UTF8\&shoppingPortalEnabled=true&_encoding=UTF8\&tag=statistic08-22\&linkCode=ur2\&linkId=6234f336129dd97c7c7749d98135bc96\&camp=247\&creative=1211)であれば無料で読めるのでぜひチェックしてみてくださいね！

## チャーン分析で気を付けなければいけないこと

![](/wp-content/uploads/2019/03/PAK85_Projectannai20141123172459_TP_V.jpg)

チャーン分析で高い精度を算出するのは<mark>適切な変数さえ選べばそれほど難しくはありません。</mark>

ただ大事なのは、<mark>**その結果をどのようにビジネスに落とし込むか。**</mark>

例えばある変数が解約率にものすごく影響していることが分かったとしても、そのような変数は往々にして「**これまでの継続月数**」などアンコントローラブルであり解約に影響しているのは当たり前である変数なことが多いです。

仮に継続月数が長いほど解約率が低いという因果関係が分かったとして嬉しいでしょうか？\
ふーん、まあ当たり前だよね、<mark>継続月数を伸ばすのが難しいんだよ</mark>、とそれだけではアクションに繋がりません。

そこでよく行われるのは、解約率によってユーザーをセグメント分けし<mark>それぞれのセグメントに対して[ABテスト](/ab-test)的にある施策を打ってみてその結果を受け今後の施策を使い分けるというモノ。</mark>

例えば、解約率20％以下ユーザーに過剰なクーポン施策を行うとチャーンレートが上がってしまうかもしれませんが、80％以上のユーザーに対しては過剰なクーポン施策が有効かもしれません。

ユーザーをセグメントに分けて効果検証を行うことで、<mark>ただの予測がアクションに結び付く結果になるのです。</mark>

## 実際にロジスティック回帰分析でチャーン分析をやってみよう！

![](/wp-content/uploads/2018/09/goriIMGL9703_TP_V1-e1555747456954.jpg)

ここでは簡易的に[ロジスティック回帰分析](/%e3%83%ad%e3%82%b8%e3%82%b9%e3%83%86%e3%82%a3%e3%83%83%e3%82%af%e5%9b%9e%e5%b8%b0)を使ってチャーン分析を行ってみます。

PythonでもRでも簡単に実装できますが、今回はPythonを使って実装してみます。

用いるのは、ライブラリ<mark>[scikit-learn](/scikit-learn)</mark>に入っているdiabetesというデータセット。

```python
from sklearn.datasets import load_diabetes
diabetes = load_diabetes()
print(diabetes.feature_names)
```

> \[‘age’, ‘sex’, ‘bmi’, ‘bp’, ‘s1’, ‘s2’, ‘s3’, ‘s4’, ‘s5’, ‘s6’]

患者の状況と1年後の症状がデータとして入っています。

10個の説明変数に対して、症状を表す1つの量的変数が目的変数。

それぞれの変数については見ていかず予測精度だけ見ていきます。

チャーン分析にふさわしいデータセットが見つからなかったので、今回はこのデータセットを使って疑似的にチャーン変数を作っていきます。

1年後の症状は量的変数で入っているので、ここでは平均より高い場合は1、低い場合は0と無理やり変換して、ある患者の現在の症状から1年後の0・１症状を予測します。

本来であれば、解約をフラグの0,1に対して解約確率を算出するイメージです。

コードは以下。

```text title="ロジスティック回帰でチャーン分析（模擬）"
# 必要なライブラリ読み込み
import numpy as np
import pandas as pd
from statistics import mean
from sklearn.datasets import load_diabetes
diabetes = load_diabetes()
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression as LR

# 01に変換
label=[]
for i in diabetes.target:
    if i>mean(diabetes.target):
        label.append(1)
    else: label.append(0)
 
# ランダムにテストデータと訓練データ作成
X_train, X_test, y_train, y_test = train_test_split(
        diabetes.data, label, test_size=0.5, random_state=1234)

#　ロジスティック回帰実行
clf = LR()
clf.fit(X_train, y_train) 

# テストデータのラベル予測
a = clf.predict(X_test)

# 予測精度
clf.score(X_test, y_test)
```

アウトプットとしては、テストデータの0/1を予測したリストと、予測精度が算出されます。

:::box
array(\[0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])

予測精度＝0.7149321266968326
:::

疑似的にチャーン分析を行うことができました。

無理やり0/1変数を作り出したので<mark>それほど高い予測精度は出ておりません。</mark>

ここでは行いませんが、<mark>XGBoostやランダムフォレストで実装するともっと良い精度が出るでしょう。</mark>

また、回帰モデルの回帰係数を用いれば、それぞれのサンプルのチャーン確率を算出することができます。

チャーン確率によってユーザーをセグメント分けすることでビジネスチャンスが見出されるかもしれません。

## チャーン分析　まとめ

本記事では、<mark>チャーン分析の説明と注意点、簡単な実装</mark>について見てきました！

チャーン分析を身に付ければビジネスに大きなインパクトを与えられること間違いなし！

チャーン分析の考え方自体は簡単ですが、

:::box
**・どんな変数を持ってくるか**\
**・どんな手法を使うか**\
**・結果をどうビジネスに落とし込むか**
:::

はなかなか難しい。

統計学・機械学習・データサイエンス・AI・Pythonについて勉強したい方は以下の記事を参考にしてみてください！

<https://toukei-lab.com/statistics-freshman>

<https://toukei-lab.com/machine-learning-study>

<https://toukei-lab.com/data-scientist>

<https://toukei-lab.com/ai-learning>

<https://toukei-lab.com/python-learn>

また、詳しくAIやデータサイエンスの勉強がしたい！という方は当サイト「スタビジ」が提供する[スタビジアカデミー](https://toukei-lab.com/achademy/)というサービスで体系的に学ぶことが可能ですので是非参考にしてみてください！

:::box
業界最安級AIデータサイエンス特化スクール：「[スタビジアカデミー（スタアカ）](https://toukei-lab.com/achademy/)」
:::