Tableauでシミュレーションを作って施策の成功率を上げていきたい

こんにちは!

システム本部データプラットフォームグループ(DPG)でエンジニアとなりました新卒のたけしと申します。 なんやかんや配属されて2カ月となりました。

今回は、データ視覚化ツールTableau(タブロー)についてちょっと便利な使い方についてお話ししようと思います。

システム本部データプラットフォームグループ(DPG)について

データと名前が冠する通りにデータに関するお仕事をやる部署になっております。

お仕事を大きく2つに分けざっくり説明すると、

  • データを管理するお仕事
    • 各事業部が保有するデータ(ユーザー情報だったりサービスを運営するにあたってとても大事なデータの類)をDWHに移行するようなお仕事
  • データを分析するお仕事
    • 各事業部のデータをもとに分析し、施策の指標だったりデータを分析した結果から次の施策につながるようなフィードバックをするお仕事

となります。 部署は私を含めて5人で構成される少数部署となっており、いち早く戦力になるべく私も日々ひぃひぃ言いながらお仕事に励んでいます。

今回はデータを分析するお仕事にまつわる話になります。

Tableauについて

Tableauは、データの様々な要素を軸として切り替えながら視覚化できるとても便利なBIツールです。

Business Intelligence and Analytics Software

弊社ではTableauを使って分析結果を視覚化し、それを事業部のプロデューサーさんが見ながら施策を考えたりサービスの現状を把握したりというような利用をしております。

Tableauでレポートを作成するにはTableau Desktopが必要となりますが、シミュレーションを行うには無料のTableau Readerでも可能となります。

Tableauには予測機能がありますが、今回行う内容はこの機能ではできない内容となります!

本題

現状のサービスの状況を知るにあたって、何らかの数値の予測をすることは往々にしてあると思います。

例えばMonthly Active User(MAU)だったり粗利だったりの推定をして、来年にMAUを○○に上げたいので登録者数を増やす施策をうとう!とかはよくある話なのかなと思います。

MAUを上げるために登録者数を増やす施策を行う際に、登録者数をどのくらい増やしたらMAUはどの程度増えるのか?ということを登録者数を変えてシミュレーションしながら施策を考えたくなりますよね?

RやPythonだと登録者数を変えながら推定されたMAUの予測値を見ていけばいいのですが、前述したように実際数字を見て決めるプロデューサーさんはTableauのグラフなどを見て判断します。 そこでそういった構築したモデルによる予測シミュレーションをTableauで手軽にできるようにしてみよう、というのが今回の内容となります。

実際に簡単な例を出しながら書いていこうかと思います。 今回は完全に架空のWeBサービスのMAUの推移データを作成して試します。 MAUは基本的に指数分布っぽく推移するので、指数分布を元にMAUの推移データを作りました。

このWebサービスの設定としてはMAUはずっと上がりトレンドにあるが、さらにMAUを増やしたいので登録者を流入させるような施策を今後行おうとしているような感じです。

架空のWebサービスデータ

生データはこんな感じのデータになります。

経過月数 登録年月 MAU 登録者数 経過年月 MONTH
2 1 2013-01-01 6538 10883 2013-01-01 1
3 2 2013-01-01 4430 10883 2013-02-01 2
4 3 2013-01-01 4072 10883 2013-03-01 3
5 4 2013-01-01 2185 10883 2013-04-01 4
6 5 2013-01-01 1849 10883 2013-05-01 5
7 6 2013-01-01 1441 10883 2013-06-01 6

このような各月のMAU推移データが2013年1月~2016年5月の登録年月単位であります。

これをTableauを使ってグラフにしてみるとこんな感じになりますね。

f:id:tkr911:20160613222425p:plain

縦軸がMAUとなっており横軸が年月になっております。

いい感じに上昇トレンドにあることがわかります。 また、ぱっと見た感じ季節でMAUは変化しているように見えますね。 特に3月に大きなピークがありますね、あと9月付近にも少しピークがあるように見えます。

推定

それでは実際に上のデータを線形回帰を使って推定してあげます。 回帰式は以下の様な単純な形で行います。

今回は推定する際に季節でMAUが変わっていそうなので何月なのかという変数を入れてます。 またMAUは時間が経過するごとに減少していくので登録してから経過した月数を変数として追加します。

{ \displaystyle
MAU_t = w_0 \times 登録者数_t + w_1 \times 経過月数  + 月
}

ここでtは登録年月になります。

推定結果は話の筋でないので省きますが、登録者数からMAUを推定できそうなモデルを構築できたとします!! (RやPythonとか使えばすぐ驚くほど簡単にできますよ!)

Tableauによる表現

ではMAUの推移をTableauを使って予測し、グラフに表示してみます。

予測値の計算は計算フィールドを用いて行います。 計算フィールドはTableauに読み込まれたデータセットの数値を組み合わせて新たな系列を作るような機能だったりします。

if文だったり簡単な関数は実装されているのでとても便利な機能です。 計算フィールドのよくある使い方はif文を使って、既存の系列を大きく2つに分けたり(例えばユーザーの登録年で新規ユーザーと既存ユーザーに分ける)します。

ではこの計算フィールドに今回求められた登録者数に対する重みや季節に対する重みを入力します。

まずはとりあえず動くようにただ書いてみます(あとですっきりしますよ!!)

f:id:tkr911:20160614085339p:plain

(上の画像は計算フィールドの一部ですが、if文連打でとても辛かったです)

今回シミュレーションで変えていきたい登録者数はパラメータとして作成し、計算フィールド内で呼び出してあります。

。 2016年12月までのMAUの予測をやってみます。

f:id:tkr911:20160614085446g:plain

青色が観測値、オレンジ色でプロットされているのが予測値となっています

パラメータを変えることで2016年6月~12月の予測値が変わっていることが確認できます。

一応やりたいことはできましたが、計算フィールドの再利用性が一切なくちょっとつらい感じですね。

もうちょっと続くんじゃ

無事目的を達成できましたが、現状のままだとMAUの推定モデルが更新されるたびに計算フィールドを更新しなければなりません。

そんなの面倒だしやりたくないですよね、特に季節要因の重みなんて更新することを考えただけで闇を抱えそうですよね。

そういうわけでそこら辺もいい感じにしていきましょう。

まずは重みのデータを出力し別のデータソースとして読み込ませてあげましょう、各月の重みなので何月なのかというカラムももたせます。

MONTH MONTH_WEIGHT
1 7.22
2 7.24
3 7.42
4 7.19
5 7.24
6 7.23

こんな感じですね。

この形式から察しの良い方は気付いたかもしれないですが、Tableauではデータソース同士で結合(いわいるjoin)できるのです。

f:id:tkr911:20160614085717p:plain

こんな感じですね、2つのデータソースをMONTHで結合してあげます。

ここまでできたら計算フィールドを修正していきましょう。 重みが月で結合されているのでとてもシンプルになります。

f:id:tkr911:20160614085722p:plain

あの悲しみを背負った計算フィールドはこんなにさっぱりできました!

これでモデルが更新されたとしても、重みのデータソースを更新してあげればすぐに対応することが可能になります。

今回は登録者数にかかる重みや経過月数にかかる重みは定数で与えていますが、そこも上手くデータソースを結合することでいい感じにできます。

最後に

数値を変えるだけで簡単にシミュレーションできるので、プロデューサーさんの施策も大成功間違いなしですね!

ちなみに今回作成したTableauのワークブックは以下のURLからブラウザ上で操作できるのでぜひ試してみてください!

public.tableau.com