Tableauのリレーションシップを使ってCPM分析を作る(2023/12/16リレーションシップ勉強会)

CPM分析(顧客ポートフォリオマネジメント)という分析手法はご存じでしょうか?

CPM分析とは

CPM分析は「にんにく卵黄」などの健康食品を作っている「やずや株式会社」が提唱した分析手法です。

顧客ごとに初回購入日と最終購入日との経過日数、最終購入日からの経過日数、累計購入金額、の3つで分ける手法です。(具体的な内容は以下のURLを参照ください)

CPM分析を最新データ時点で集計することは簡単なのですが、月ごとの経過を追うのはちょっとしたテクニックが必要です。

本来はDB側で処理をして、Tableauでは素早く表示させることが望ましいですが、DB側での処理ができない場合や、DB側の負荷を増やしたくない場合はTableau側で何とかするしかありません。

そこで、リレーションシップを使って月ごとのCPM分析を行う方法を紹介します!

使うデータ

サンプルスーパーストアのデータを元にして、CPM分析で集計する月のワークシートを追加したExcelデータを使います。

追加したテーブルは以下のようなデータで、サンプルスーパーストアが持っている日付の各月1日時点の日付のテーブルです。

CPM用日付のテーブル

これを以下のようにリレーションシップします。

リレーションシップのつなぎ方

注文テーブルのオーダー日に、CPM用日付を < でリレーションシップします。※ここがポイント!

このリレーションシップでは、CPM用日付が 2023/1/1 を指定した場合、
注文テーブルは2023/1/1より前の全データを参照することになります。

CPM用日付は1か月ごとのデータなので、1月ごとの累計値が集計できるようになります!

列にCPM用日付、行にオーダー日(月)を設定したワークシートです。
CPM用日付よりも前の日を参照できていることが分かります。

リレーションシップの確認

では、累計購入金額、初回購入日からの経過日数、最終購入日からの経過日数を計算するフィールドを作ります。

//累計購入金額 
{fixed [顧客 Id],[Cpm用日付]:sum([売上])}

//在籍期間(初めて買ってから最後の購入まで何日経過したか)
{fixed [顧客 Id],[Cpm用日付]:datediff('day',min([オーダー日]),max([オーダー日]))}

//離脱期間(最後の購入から何日経過したか)
{fixed [顧客 Id],[Cpm用日付]:datediff('day',max([オーダー日]),max([Cpm用日付]))}

顧客を分ける基準は紹介したURLを参考にします。
4つのパラメータを作ります。

https://web-keiei.com/staff-blog/web-dev/yazuya-cpm/
//離脱の判定
[離脱期間] >= [離脱の日数]

//顧客の分け方
if
[在籍期間] = 0 then '初回'
elseif
[在籍期間] < [よちよち客の閾値] then 'よちよち'
elseif
[累計購入金額] >= [購入金額の閾値] and [在籍期間] >= [優良客の閾値] then '優良'
elseif
[累計購入金額] >= [購入金額の閾値] and [在籍期間] >= [よちよち客の閾値] then '流行'
else 'コツコツ'
end

正しく計算できているかどうか、Tableauの集計結果とExcelの結果が一致しているか確認しましょう。

TableauではFixedで使っている粒度と同じフィールドを置いて確認します。
顧客IDは量が多いので、1つに絞っています。

検算用データ
Excelで検算

この検証が面倒ですが、これをやらないと自信をもって数字が合っていることが説明できないので重要です!
(Excelのシート[検算用シート]をご確認ください)

最終的に作成したグラフは以下です。
時系列でどの顧客グループが増えているのか、減っているのかが分かりますね!

CPM分析 会員の推移

特徴的なのは、優良の会員で離脱が増えていたが、2023年9月から減少傾向になっているところです。

サマリされていないデータを使うメリットは、カテゴリ別などにドリルダウンしやすいことです。

以下はランクごとにサブカテゴリの売上ランキングを集計したものです。
初回購入では電話機がよく売れているので、電話機を軸に新規獲得キャンペーンをする、という対策が考えられます。

ランクごとの数字

データの集計が遅い場合

一方、データの量が多いと速度が出なくなる場合があります。

そんな時はCPM日付をフィルターする計算フィールドを作成し、CPM日付をデータソースフィルターで減らすと速度が出やすくなります。

リレーションシップはデータソースフィルターの後に行われるため、データソースフィルターを入れるとjoinの量が減り、集計速度が速くなる場合があります。

コンテキストフィルターを使っても早くなる場合があるので、試行錯誤してみてください!

(どうにも動きが遅くなる場合はDB側で集計しましょう)

まとめ

リレーションシップとFixedを掛け合わせて使うと、このようなデータ集計が可能になります。(もしかすると本来のリレーションシップの使い方とは違うのかもしれない)

もちろん結合でも同じことは再現可能ですが、DBの負荷がかかるのでリソースとの相談ですね!

ダッシュボードは以下にパブリッシュしたので、中身が気になる人は確認してください!


この記事が気に入ったらサポートをしてみませんか?