Power BIによるSaaS分析9 -コホート分析

分析及びその考え方について、前回まで少し話をしてきました。今回はコホート分析というものについて紹介したいと思います。経過期間における生存分析というものになりますが、非常に面白い洞察が得られる分析となります。

コホート分析とは

コホート分析とは何か?Googleで調べると以下の定義となっています。

コホート分析はもともと心理学や社会学において用いられており、世代や社会的な経験によって被験者を分け、行動や意識にどのような変化が表れるのかを調べる分析手法。ユーザーを属性や条件でコホートに分け、ユーザーの動向を知るための分析方法”

簡単に言ってしまえば、

グループ分けして動向について分析する

と捉えれば良いかと思います。

Power BIコホート分析を行う場合、前回紹介しました通り、以下のようなチャートがこれに当たります。

f:id:marshal115:20220314145936p:plain

こちらのチャートはMRR(Monthly Recurring Revenue)がどの月からどれだけ継続したかを可視化したものですが、金額ベースであるため、通常は時が経てばその月のMRRが料金プランのUpgrade(MRRが増大)により、逆に増加していくケースもあります。その結果、”ユーザー数が変わらなくとも、MRRは増加トレンド”と出てしまうこともあります(逆も然りで、顧客が離反(チャーン)した場合とDowngrade(MRRが元の課金プランに戻る等)した場合のミックス等によって引き起こされます)。

そこで、コホート分析の1つの形として、MRRを# Customers_Signup(有料顧客数)に変更して、金額ベースではなく、人数ベースで同じように見ていくとをやっていきます。下図(右)のようになりますが、構成を分かりやすくするため、今回は2022年3月以降のデータも使用しています。
※ Power BIの「値」フィールドに、Total MRRから# Customers_Signupというメジャーに変更

f:id:marshal115:20220320153445p:plain

左図はMRR(金額ベース)、右図は# Customers(顧客ベース)別に見たチャートですが、上述の通り、例えば'22/02時点からSignupした顧客において、顧客数が殆ど変わっていないのにMRRが上昇しているのが見て取れます。前回の記事にて、コホート分析を行う1つの理由は顧客を利用開始月でグループ分けしてその後の傾向を見ていくと、MRRを効率よく増やせているかどうかが分かるようになると説明しましたが、上図(右)のように、顧客数の推移に注目することも非常に重要となります。なぜなら、この2つの図を見ると、

左図ではMRRが足踏みしながらも直近数か月では増加傾向にあるものの、右図では客数が減少トレンドを辿っている

からです。

この場合、間違った判断として、金額の推移だけを見て、ビジネスは順調ですと伝えてしまうことであり、

現在のMRRが新規顧客によって支えられている = 新規の顧客が取れていない

ことを意味しているのです。SaaSビジネスにおいては客数の減少は致命的であり、いくらUpgradeという選択肢があるにしても、サービスの使い勝手が悪い場合、既存顧客にも見放される運命にあることは言うまでもありません。そこで、下記質問に答えられるような分析が必要となってきます。

顧客の生涯において、どのタイミングで最も客離れ(チャーン)が発生しているか

この質問の意図は単純です。例えば、4月に有料サインアップした顧客と8月にサインアップした顧客を比較した場合、どちらがより長く顧客として残っていたか、4月よりも8月のほうが顧客フィードバックにうまく対応できたことでサービスクオリティが上昇し、結果的に顧客維持率(リテンション率)が良くなったのではないか等、こうした分析ができるようになると、その後の打ち手を入れやすくなるわけです。

顧客リテンション率(生存分析)

顧客離れが生じているかどうかに対する分析となりますので、顧客リテンション率を見ていくことになります。なお、顧客リテンション率については

  1. 生存分析用の顧客リテンション率(生存確率)
  2. 月次ベース顧客リテンション率

の2つがあり、前者は経過月ベースでみるもの、後者は通常の時系列ベースチャートで表現することになります。2は分かりやすい(既にMeasure構築済み)のですが、1が今回のメインとなりますので、以下その考え方について説明していきます。

答えから先に見ていきますと、1を可視化したものは以下のようになります。

f:id:marshal115:20220320162534p:plain
こちらはテーブルマトリックスですが、縦(Y軸)に開始月、横軸(X軸)に経過月、中身(%)がY軸のそれぞれの開始月を100%とした場合、そこから経過した月数別に見た生存確率(顧客リテンション率)となります。例えば'22/03を見ると、4ヵ月目から顧客離れ(以降、「顧客チャーン」)が発生し、生存確率が100%から67%に下落し、翌月には更に33%へ下落しています。

コホート分析として、上表はYMをコホート(グループ)として分解したものですが、国・性別・使用デバイス等、様々なディメンションで見ていくことも可能となります。なお、全体の動向を見たい場合、下図のように、X軸を経過月数、Y軸を生存確率と表現して見ていくことになります。

f:id:marshal115:20220320164844p:plain

これを見ると、経過月数が4ヵ月を経過した辺りから急激に生存確率(顧客リテンション)が落ち、10ヵ月を超えると更に急落していることが分かります。

ちなみに、サンプル数が少ないことや'22/04以降は新規顧客がいないという想定になっているため、マトリックステーブルは上記のような分布になりましたが、通常は下記のような分布となります。

f:id:marshal115:20220320164026p:plain

Power BIによる生存分析の構築

それでは生存分析のチャートを作っていきます。解説を分かりやすくするため、まずは客数ベースのコホート分析(下図左)をテーブルマトリックスに変更します。下記(右)が左側のチャートから変更されたものですが、テーブルの縦軸がチャートのX軸、テーブルの横軸がチャートの凡例('21/04等)となっています。

f:id:marshal115:20220320173241p:plain

生存分析で必要な情報は、テーブルの横軸を下記のように変換していくことです。

f:id:marshal115:20220320174251p:plain

生存分析を行うためには、それぞれのスタート月を揃える必要があり、横軸を経過月(0~○ヵ月)に変換していきます。なお、縦軸は前述の通り、YMではなく、国・性別等に変更することで、下図のように、異なるディメンションで動向を見ることが可能となります。

f:id:marshal115:20220320174752p:plain

横軸の経過月は列となりますが、やり方は下図の通り、SalesテーブルでMonthsPassedという計算列を追加するだけです。

f:id:marshal115:20220320175620p:plain

DATEDIFFという関数を使って、Sales[SignupDate](こちらは前回の記事を参照)とSales[Date]の経過月数をMonthsPassedとして計算します。これにより、縦軸(行)にdSignup[YM]、横軸(列)にSales[MonthPassed]をそれぞれドラッグ&ドロップし、# Customers_Signupというメジャーを値に指定すれば、上記「# Customers by # Months elapsed」というマトリックスが出来上がります。

f:id:marshal115:20220320180559p:plain

ここで、新しいMeasureを作ります。Survival Probabilityという名称ですが、0ヵ月目から経過した月数別にみて、顧客を維持できている確率(生存確率)という指標になります。データ・サイエンスの世界でよく使用される指標の1つで、覚えておくと良いでしょう。

  • Survival Probability(生存確率)
Survival Probability =
VAR _current_customer = [# Customers_Signup]
VAR _customer_by_month =
    CALCULATE (
        [# Customers_Signup],
        ALLEXCEPT ( Sales, dSignup, dCustomer )
    )
VAR _result =
    DIVIDE ( _current_customer, _customer_by_month )
RETURN
    _result

この指標をテーブルマトリックスに入れたものが上でも紹介した下図となります。

f:id:marshal115:20220320182002p:plain

なお、DAX関数ではALLEXCEPTを使って、dSignupとdCustomerテーブルはフィルターに従うように条件を付けていますが、例えばdSignupを入れ忘れると、以下のような結果となってしまいます。

f:id:marshal115:20220320182326p:plain

なぜこのようになるかというと、A = _current_customer、B = _customer_by_monthで考えた場合、Bは下図のように、全て同じ数値(期間に関係なく、全ての有料サインアップ客数)となってしまうためです。

f:id:marshal115:20220320182945p:plain

dSignupをALLEXCEPTに入れることで、このテーブルはフィルターが機能し、横軸のSales[MonthsPassed]はフィルターが外されているため、Bの本来の数字は以下のようになります。これであれば、B(分母)は経過月数(横軸)に関わらずYMの0ヵ月目の# Customers_Signupで固定され、A ÷ Bが正しい数字となって算出されるわけです。

f:id:marshal115:20220320183511p:plain

同様に、dCustomerをALLEXCEPTに入れ忘れた場合、下図のように、dCustomerにある項目でフィルターできなくなってしまい、間違った結果となってしまいます。

f:id:marshal115:20220320184032p:plain

一方、ALLEXCEPT ( Sales, dSignup, dCustomer )を使った正しい結果は、以下の通り、正しい数字を算出しています。

f:id:marshal115:20220320184611p:plain

これにて、冒頭で解説した1番目の「生存分析用の顧客リテンション率(生存確率)」を算出することができたので、例えば以下のようなダッシュボードを作ることができたりします。

f:id:marshal115:20220320232739p:plain

右上のSurvival Probabilityは前述の通りですが、生存分析の基本的なチャートとなっています。右下のマトリックステーブルは国別・性別ベースで見た生存率であり、ChinaとJapanに大きな違い(Japanのほうがサービスをより長く使っている)があることが分かります。ここでChina > Maleで絞ってみると、下図のようにクロスフィルター機能によって全体の動向が瞬時にして分かるようになります。

f:id:marshal115:20220320232903p:plain

なお、補足しておきますと、左下のRetention Rateというチャートは冒頭の2番の「月次ベース顧客リテンション率」のことであり、客数ベースのCustomer Retentionに加え、Net Revenue Retention(NRR)も表示しています。Customer Retentionは最大値が100%ですが、NRRはExpansionによって100%を上回る場合があり、

Customer Retentionが100%を下回るのに、NRRが100%を超えるという”ネガティブ・チャーン”

が発生することも珍しくありません。市場に歓迎されているSaaSビジネスほど、NRRが100%を超えており、前回解説したMRR by Signup Month(今回の冒頭にあるチャート)もそれぞれのサインアップ月(凡例)でサービスのUpgradeによりMRRが拡大推移していくような動きとなっています。

まとめ

Power BIによるコホート分析はやり方さえ分かってしまえば、構築するのは簡単です。データモデルを適切に変更することがポイントですが、作り方だけではなく、なぜコホート分析が重要であるか、ビジネスにどのようなインパクトをもたらすことができるかについて考えていくと良いでしょう。

生存分析は言い換えれば、顧客が最もチャーンしてしまうタイミングを見つけることができることを意味しますので、様々なディメンションで傾向を探っていき、場合によってはクラスターに分解して施策(ABテストや未来予測)を打ち出していくことも考えるべきでしょう。

f:id:marshal115:20220320235854p:plain

可視化だけで終わるのではなく、いかに結果をアクションプランへ落とし込んでいくかが試されると言えます。

次回は下記より

marshal115.hatenablog.com