【実装例】Tableauで顧客ランクの持たせ方
Tableauで顧客対してランクを付与してダッシュボードに表示させたいという要望があり、その開発した際のポイントをまとめたいと思います。
このダッシュボードを開発した際に難しかったのでは、キャンペーン開始前の顧客ランクが「新規」のお客様がキャンペーン終了後にどういう行動をとっているかをダッシュボード化したいというところです。
ダッシュボード開発にあたって難しいポイント
例えば週ごとに顧客ランクを持っていて3年分保持するとなると、1顧客あたり52週✕3年分で約150行分の顧客ランクが必要になります。
例えば1000万行あるアクセスログに対して、各時点の顧客ランクを付与しようとすると
1000万✕150 の 15億レコードになってしまいます。
これでは、データソースの抽出もできなくなってしまうのでパフォーマンスが著しく悪くなります。
そこでデータソースの持ち方を工夫しなければならないです。
顧客ランクを文字列カラムとして集約
今回この問題を解決するために生み出したのが、各時点の顧客ランクをつなげて文字列としたカラムを用意するという方法です。
例えば、以下のようになっている場合に
- 現在の顧客ランク 1
- 1週前の顧客ランク 2
- 2週前の顧客ランク 3
顧客ランクのカラムを123という形でランクをつなげてランク文字列として持っておきます。
そうすることでいつどのランクだったかは計算フィールドを使って参照することができ、レコード数も顧客ランクによって増えることはなくなります。
計算フィールドでは、以下のような処理手順になります。
- 「現在 - 対象となる顧客ランクの日付」を週数に変換する
例えば 7/25 - 7/11 = 14日 を週数に変換して2週となる - 上記の顧客ランク文字列から1で計算して週数に現在の週数分の1を加えて左から3番目の文字を取得する
この方法で取得した顧客ランクを絞込み条件に使ったり、顧客ランク別の集計に使ったりできるので、少し複雑な作りになりますがこの方法のデメリットはあまりないかと思います。
まとめ
顧客ランクを時系列で持たせることでデータが増大してしまうところを、ランク文字列という形で対応することにより解決させることができます。
このアイデアは昔のスペックが低いDBの際の設計で使っていたものを流用したものです。
Vizを作る際もそうですが、Tableauの機能でぴったり当てはまるものがない場合に、Tableauの機能を理解した上でアイデアを加えて実現させるというのがポイントなのかと思います。
このアイデアは現状のクラウドのスペックが十分なDBの設計としては良くないと思いますが、Tableauのレコード数を抑える部分においては非常に有効化と思います。
顧客ランクに限らず時系列データを結合させることでデータが増大する場合には、検討するアイデアかと思います。
Discussion