支払いデータから生存分析用のデータを作成する方法

SaaSなどサブスクリプション型のビジネスを効率的に改善していくために、 サービスの利用開始からのリテンション率を経過時間ごとに可視化して、顧客のチャーンのトレンドを的確に理解する生存分析という手法があります。

  • SaaS アナリティクス・ワークショップ #7 - コホート分析 Part.2 - 生存曲線 - Link

このノートでは、SaaSなどのサブスクリプション型のビジネスの月払いの支払いデータを使って、生存分析を行うためのデータの作り方を紹介します。

利用データ

今回はサービスの支払いデータと、顧客のキャンセルのデータ、2つのデータを利用します。

支払いデータは以下のように1行が月額の支払いを表しています。そのため、ユーザーはサービスを解約しない限り、毎月、同じ月の日に月額費用を支払うことになります。

続いて、顧客のキャンセルデータは以下のように、1行はユーザーごとの契約ステータスを表しています。

生存分析を行うためのデータ

生存曲線を描くためには、以下のようなデータが必要です。

  • 観察対象1人に対して1行のデータ
  • 観察対象の生存期間(開始日、終了日)
  • 観察対象のイベントのステータス
    • キャンセルなど
    • 打ち切り

残念なことに今回の支払いデータは1行が1人のユーザーの生存期間の情報になっていません。

また支払いデータから生存期間の情報を集計できたとしても、観察対象のイベントのステータスの情報が必要です。

そこで、これらのデータを利用して、生存分析用のデータを作成していきます。

生存分析用のデータ作成のステップ

今回は以下のステップで生存分析用のデータを作成していきます。

  1. 顧客ごとの最初の支払い日と最後の支払い日を集計する
  2. 最初の支払い日を月初に揃え、最後の支払い日を月末に揃える
  3. 顧客ステータスを結合する

1. 顧客ごとの最初の支払い日と最後の支払い日の集計

支払いデータから顧客ごとの最初の支払い日と、最後の支払い日を集計していきます。

まず顧客ごとに最初の支払い日を集計します。useridの列ヘッダーメニューから集計(Summarize)を選択します。

値に"date"を選択して、集計関数に最初の日(min)を選択します。

続いて最後の支払い日を計算するために、再度、値に"date"を追加して、集計関数に最後の日(max)を選択します。

後からコホート分析をしたければ、他の列の集計もしておきます。

例えば、国の列を利用して、コホート分析がしたければ、国も集計します。値に"coutnry"を追加し、集計関数に最頻値(mode)を選択することで集計が可能です。

これで顧客ごとに、顧客ごとの最初の支払い日と、最後の支払い日を集計できました。

2. 契約開始日を月初に変更し、契約更新日を月末に変更する

顧客ごとの最初の支払い日と、最後の支払い日を集計することはできましたが、今のままだと最初の1ヶ月で解約したユーザーは、最初の支払い日と最後の支払い日が同じ日となるため、仮に、最後の支払い日から最初の支払い日を引いて生存期間を計算しようとすると、生存期間が0日になってしまいます。

また、そもそも、最後の支払い日は顧客がサービスを解約した日ではなく、今回のような月額サービスの場合、最後の支払いから1ヶ月の間は、顧客はサービスを継続(生存)しているため、顧客の生存期間は最初の支払い日から最後の支払いの間ではなく、最初の支払いから最後に支払った費用の契約が切れるまでということになります。

そこで、上記のように3/15にサービスの購読を開始したものの、翌月はサービスを継続しなかったユーザーを例に、どのようにして、生存期間を計算するための列を作ることができるのかを考えてみます。

まずこのユーザーの最初の支払い日をその月の月初に揃えます。

続いて最後の支払い日をその月の月末に揃えます。

このようにすることで、この顧客のサービスの生存期間(サービスの生存期間)を1ヶ月として捉えることができるようになります。

また複数月に渡ってサービスを購読している上記のような顧客も場合も考えてみましょう。

この場合も先程と同じように、最初の支払い日をその月の月初に揃えて、最後の支払い日その月の月末に揃えることで、生存期間の計算が適切にできるようになります。

ここからは、実際に「最初の支払い日の月初の日」と「最後の支払いの月末の日」を計算していきます。

まずは、「最初の支払い日の月初の日」を計算するために最初の支払い日である"date_min"の列ヘッダメニューから、丸め処理、日付の切り捨て、月を選択します。

計算を作成(Mutate)ダイアログが表示されたら、そのまま実行します。

これで最初の支払い日の月初の日の計算ができました。

続いて、最後の支払い日の月末の日の計算していきます。

"date_max"の列ヘッダーメニューから、丸め処理、日付の切り上げ、月を選択します。

そのまま実行をすると翌月の月初の日が返ってくるのですが、今回は当月の月末の日を返して欲しいので、1日少ない結果が得られるように以下のように、以下の内容を計算ウィンドウに入力し、実行します。

なおdays()関数は日数を返す関数となり、この場合、1日を意味しています。

ceiling_date(date_max, "month") - days(1)

続いて列名を分かりやすい名称に変更していきます。

列ヘッダメニューから列名を変更を選択します。

任意の名前に変更し、実行します。

分かりやすい列名に変更することができました。

3. 顧客の契約ステータスを結合する

生存分析を行うために必要な、観察対象の生存に関する開始時期と終了時期の計算はできましたが、観察対象のイベントのステータスは、まだ集計されたデータにはありません。

そこで、顧客の契約ステータスを、集計したデータフレームに結合していきます。

顧客の現在のステータスを追加するために、useridの列ヘッダーメニューから、結合 (列を追加する /Join)を選択します。

結合ダイアログが表示されたら、結合先データフレームに顧客の契約ステータスを選択し、両方のキー列にuseridを指定し、実行します。

  • 他のデータフレームの列を結合する方法 - Link

生存曲線を描くためのデータを作ることができました。

生存曲線を描く

作成したデータを使って生存曲線を描きたければ、以下にて詳しい方法を紹介していますので、よろしければ、ご参考ください。

  • SaaS アナリティクス・ワークショップ #7 - コホート分析 Part.2 - 生存曲線 - Link

参考

  • SaaS アナリティクス #7 - コホート分析 Part.2 - 生存曲線 - リンク
  • アナリティクス:生存曲線の使い方 - リンク
  • コンバートしてから1か月後の生存率の推移をモニターする方法 - リンク
  • フリーミアムのSaaSやWebサービスのビジネスの顧客のチャーン(離脱)を判別する方法 - リンク