サービスのエンゲージメントをDAU/MAU比率で計測、可視化、予測まで5分でやってみた

SaaSのように、サブスクリプションをビジネスモデルとしている会社にとってはリテンション率並びに離脱率は死活的に重要なKPIですが、そうしたリテンション率が下がる、もしくは離脱率が上がって大変な状況になってしまうのを待つのではなく、そういった兆候を早いうちに読み取るために、サービスのエンゲージメントを理解することが非常に重要になります。そして、それを計るためのKPIとしてよく使われるのものに、DAU/MAU (Daily Active User / Monthly Active User)比率というものがあります。これは、1日ごとのアクティブ・ユーザー数を、月ごとのアクティブ・ユーザーの総数で割ったものなのですが、これによって、どれくらいの率のユーザーが日々サービスを使っているかということ、つまりはどれくらいのエンゲージメントがあるのかを計ることができます。

もしこの数字が今月のある日に１（もしくは100%）だったとすると、それは今月のアクティブ・ユーザーのうちの全員がその日にそのサービスを使っていたということになります。そして、それが毎日１だとすると、すべてのアクティブ・ユーザーが毎日使うようなサービスだということになります。GmailだとかFacebookなど、毎日のように使うことが多いサービスはこういった感じになると思います。逆に、一ヶ月に一度しか使わないようなサービスだとするとこの数字ははるかに小さくなるわけです。

もちろんこの数字が大きいとGmailなどのように毎日のように使っているということですから、簡単にはやめられないようなサービスであるということで、自ずとリテンション率が上がるわけです。逆に、この数字が小さいとユーザーからそこまで必要とされてないのかもしれませんし、さらにはそのサービスをキャンセルされることになるかもしれないわけですから、離脱率の上昇につながります。

今日は、このDAU/MAU比率というKPIをデータを加工しながら時系列に沿って計算し、可視化し、さらには向こう３０日間この値がどうなるのかと予測するところまで、サクッとやってみたいと思います。


# ツール
今回もプログラミングなしでデータサイエンスができる[Exploratory](https://exploratory.io/?utm_campaign=blog_dau_mau&utm_medium=blog&utm_source=qiita)を使います。


# データのインポート

まずは、こちらの、[ユーザー・アクセスログのサンプルデータ](https://exploratory.io/data/yosuke/9623371545816771?utm_campaign=blog_dau_mau&utm_medium=blog&utm_source=qiita)をインポートします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/48026/924b27f5-51ad-eaa2-1c33-e193bb09fdae.png)

すると、サマリービューが現れて、このデータには2016年10月17日から、2017年4月13日までのアクセスログが入っていることがわかります。また、ユニーク・ユーザー数は2105人だということもわかります。

まずは、DAUを求めましょう。

１日の、ユニーク・ユーザー数を求めたいので、まずはtimestampの情報を、１日単位にまとめます。timestampのカラムメニューから、"丸め処理" -> "日付の切り捨て" -> "日"を選択します。

<img width="1129" alt="Screen Shot 2017-06-05 at 7.45.36 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/48026/35df2593-ba4b-4a04-faae-ff9bf8896ecc.png">

"新規列を作成"のタブを選び、新規列名をdayとします。計算の部分は、そのままfloor_date(timestamp, "day")で実行します。

<img width="786" alt="Screen Shot 2017-06-05 at 7.50.04 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/48026/767e9bbd-3f80-8fbd-9efe-98fa97652ff2.png">

すると、このように日に丸められた情報が、day列として登録されます。

<img width="1123" alt="Screen Shot 2017-06-05 at 7.52.20 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/48026/e5171a3d-be82-2761-cd37-19b47ef16a88.png">

次に行いたいのが、dayごとの、ユニークユーザー数の計算です。

そのような、「〜ごと」に行う計算は、group_byとsummarizeというコマンドによって実行することが出来ます。

group_byを呼び出すには、カラムメニューから、"グループ化"を選択します。

<img width="703" alt="Screen Shot 2017-06-05 at 9.02.28 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/48026/25562254-2290-619d-3a55-9d2b68563941.png">

そして、user.idの値がいくつあるかが知りたいので、user.idのカラムメニューから、"要約（集計）" -> "n_distince（一意の値）"を選択します。

<img width="1124" alt="Screen Shot 2017-06-05 at 9.06.18 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/48026/0c5ad866-73d5-7f6b-b0ab-f8fa64ce9485.png">

すると、ダイアログが現れるので、新規列名をDAUにします。

<img width="678" alt="Screen Shot 2017-06-05 at 9.09.30 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/48026/0d14f73b-1503-9e6e-8afe-0d9d9790016b.png">

これで、１日に何人のユーザーがアクセスしたかというDAUの値が求められます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/48026/8184b371-640a-f0b1-9a9b-ad0a74dacf7e.png)

次に、同じようにMAUを求めたいのですが、**一ヶ月の間のユニークユーザーの数**をもとめることになるので、DAUを求める前の、ユーザー情報が残ったデータを使う必要があります。

なので、一度、もとのユーザーログのデータに戻ってから、MAUを求めます。しかし、DAUとMAUの比率を最終的には求めたいので、DAUも残しておく必要があります。

このように、同じデータから二つ以上の異なるデータを作成する必要があるときには、ブランチという機能を活用すると便利です。以下の図のように、分析のステップを派生させることができるのです。

<img width="917" alt="Screen Shot 2017-06-05 at 9.34.27 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/48026/981dad00-dd44-091c-fc20-1fab2c8ac78c.png">

では、このブランチの機能を呼び出してみましょう。一番最初のステップの右上のメニューをクリックし、"ブランチの作成"を選択します。

<img width="1125" alt="Screen Shot 2017-06-05 at 9.38.49 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/48026/d4fc22a0-57a6-2343-a8f8-653d125480e4.png">

ブランチの名前は、MAU_dataとしておきます。

<img width="723" alt="Screen Shot 2017-06-05 at 9.40.56 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/48026/c8324a56-07a4-19ff-a2fb-9c5bf3e7bad5.png">

これで、ブランチが作成出来ました。

そこで、DAUを求める時に使った同じ手順を、dayの代わりにmonthでグループ化して実行すると、このようにMAUが計算されます。

<img width="1328" alt="Screen Shot 2017-06-05 at 9.44.28 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/48026/20a50a75-2787-e4a0-a89e-e05cdff494d5.png">

これで、必要な値であるDAUとMAUが揃ったので、計算をしていこうと思います。

# DAU/MAU比率の計算

では、DAU/MAU比率を計算するのに、二つのデータを結合します。

DAU/MAU比率を算出するためには、DAUとMAUの値が同じテーブルの中にある必要があります。そうすることで、DAU/MAU比率が、列同士の計算の結果として算出することが出来るため、簡単だからです。なので、DAUのデータにその月のMAUを結合するために、"day"列の情報を月に揃え、MAUのデータの"month"列と同じ形式にします。

日時の情報を、月初めの日に揃えるのはfloor_dateという関数を使うことで出来ます。それを呼び出すには、"User_Access_Log"のデータフレームに移り、"day"のカラムメニューから、"丸め処理" -> "日付の切り捨て" -> "月" を選択します。

<img width="1330" alt="Screen Shot 2017-06-05 at 9.45.47 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/48026/ce41214b-752a-6e0f-a21a-77d06de41cc9.png">

新しく"month"という列を作成したいので、そこで現れるダイアログで、"新規列を作成"タブを選択し、新規列名に"month"を入力します。

<img width="691" alt="Screen Shot 2017-06-05 at 2.38.01 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/48026/608389b8-cc2b-7d86-737b-6850746940e0.png">

テーブルビューに移ると、このように"day"の情報を、その月初めの日に揃えた列が作成されたことがわかります。

<img width="663" alt="Screen Shot 2017-06-05 at 2.43.56 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/48026/ff15d57c-1ad9-8323-3b39-8d8bbec76890.png">

この月に対応するMAUの値をとってくるために、MAU_dataのデータフレームを結合します。そのような、データの結合にはJoinを使うことが出来ます。monthのカラムメニューから、"結合"を選択します。

<img width="800" alt="Screen Shot 2017-06-05 at 2.46.38 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/48026/15214ba7-83f1-6063-ea16-a8b0892d5395.png">

"month"の列をもとに、"MAU_sample"を結合したいので、結合先データフレームを"MAU_sample"にし、結合元の列と結合先の列を"month"に設定し、実行します。

<img width="808" alt="Screen Shot 2017-06-05 at 9.52.14 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/48026/6ca62227-6e9d-13e0-2f71-b94b4cc0a10d.png">

これで、このようにDAUとMAUを一つのテーブルにまとめることができました。

<img width="560" alt="Screen Shot 2017-06-05 at 2.52.14 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/48026/62b481d1-5925-48d7-9730-35405fcb6566.png">

なので、ここで列同士の計算として、DAU/MAU比率を計算します。そういった、列同士の計算には、mutateが使えます。

DAUのカラムメニューから、データ変形(計算の作成)を選択します。
<img width="1032" alt="Screen Shot 2017-06-05 at 2.54.46 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/48026/31709b11-c80b-5c43-cbaf-ad37d7992e10.png">


DAU/MAU比率を計算した、新しい列が作りたいので、"新規列を作成"のタブを選択します。新規列名は、"ratio"とし、計算は、求めたい指標である"DAU/MAU"とします。

<img width="922" alt="Screen Shot 2017-06-05 at 2.58.45 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/48026/9dd35379-e2f2-68ed-e9b0-370353232c83.png">

すると、DAU/MAU比率が新しい列、"ratio"として作成されます。

<img width="1035" alt="Screen Shot 2017-06-05 at 3.01.30 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/48026/72e8c28e-9562-31fd-16c8-1b2f002775f9.png">

これで、求めたかった指標である、日々のDAU/MAU比率が列として作成されました。

## DAU/MAU比率の可視化

DAU/MAU比率が求まったので、これを一旦、可視化してみます。

このような時系列のデータは、ラインチャートでの可視化が向いています。Vizタブに移り、タイプに"ライン"、X軸に"day"、Y軸に"ratio"をセットします。また、X軸で選んだ、"day"の横のグレーの部分をクリックし、"日に丸める"を選択します。

<img width="1106" alt="Screen Shot 2017-06-05 at 3.03.40 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/48026/83487067-0623-ee88-81b4-75f00ae7c13a.png">

これで、DAU/MAU比率がどう推移してきたかが可視化されました。日によっては、直前の3倍になっているケースもあり、日によって激しく上下することがあるデータのようです。また、ある程度の周期的な上下の変動もあるようです。こういった情報が可視化をすることによって見えてきます。

# 推移の予測

このDAU/MAU比率が、今後どうなっていきそうなのか、ということを知ることができれば、取るべきアクションの意思決定に役立てることが出来ます。例えば、上昇していくような予測なのであれば、そこでどうマネタイズするか考え始めても良いかもしれません。しかし、下落するような予測なのであれば、マネタイズよりも、如何にユーザーの満足度を高め、下落を食い止めるかなどに注力した方がよいかもしれません。

そのような予測をするのに、[Prophet](https://facebookincubator.github.io/prophet/)というFacebookが開発した、強力なアルゴリズムがあります。しかし、使うのはとても簡単です。それを呼び出してみましょう。

左上の "+" ボタンから、"分析を実行" -> "時系列予測を実行"を選択します。

<img width="933" alt="Screen Shot 2017-06-05 at 3.07.48 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/48026/9b5ec834-19c3-c9e5-9075-8d11b539a777.png">

今回、"day"ごとの、"ratio"の値について予測したいので、Date / Time Columnには"day"、Value Columnには"ratio"を指定します。そして、30日分の予測をしてみるのに、Forecasting Time Periodで30を入力します。また、今回のデータは、1年未満のものであるため、年単位の周期性は無いものとします。なので、Return Yearly SeasonalityはFALSEにします。

<img width="1013" alt="Screen Shot 2017-05-25 at 4.21.43 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/48026/82cc4608-3e79-df47-5ff5-7c2da958c45d.png">

これを実行し、テーブルビューに移りますと、いくつか列が作成されているのを確認できます。

<img width="1128" alt="Screen Shot 2017-06-05 at 3.12.19 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/48026/9494513c-abbd-6324-d089-b990377673a1.png">

これによって新しく作成される、"forecasted_value"の列が、このアルゴリズムによって予測される、DAU/MAU比率の推移ということになります。そして、もし実際の値が"forecasted_value_hign"と"forecasted_value_low"の間であれば、それは予測の範囲内だが、それ以上、もしくはそれ以下であれば、想定される以上の変動があったデータということになります。

それを、先程のチャートに追加してみましょう。"forecasted_value"をY軸に追加します。

<img width="898" alt="Screen Shot 2017-06-05 at 3.13.53 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/48026/1c12145e-2f4e-6738-df5a-2b21e1d5f128.png">

このオレンジの線が、Prophetによる予測に基づいた値ということになります。

さらに、この予測値に先程の"forecasted_value_hign"と"forecasted_value_low"の範囲を表示させる事ができます。Y2 Axisの右にあるメニューから、"Range"を選択します。
<img width="411" alt="Screen Shot 2017-06-05 at 3.16.02 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/48026/e96211f1-3f81-a7ce-a824-9ed25612879c.png">

"Show Range"のチェックボックスを選択すると、チャートにオレンジ色で予測の範囲内だと言える幅が表示されます。

<img width="1298" alt="Screen Shot 2017-06-05 at 3.19.35 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/48026/d636c4f9-b657-161c-eca7-81bc856133b6.png">

さらに、今、オレンジの線で見えているような、振れ幅のある予測値ではなく、全体的な傾向として上がっているのか、下がっているのかを見ることも出来ます。
Y軸でさらに、"trend"を選んでください。

<img width="1102" alt="Screen Shot 2017-06-05 at 3.21.54 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/48026/08564971-f103-0892-ec49-5b49513ce2c0.png">


すると、上のように緑の線で、細かい上下の変動を消した形で全体的な傾向を見ることが出来るようになります。すると、1月まで減少傾向だったのが、1月のうちに上昇に転じているといったことがわかります。そこで打った施策が功を奏し、上昇に転じ始めたのかもしれません。

予測に関しても、傾向としては上がっていくという結果が出ているので、リスクをとって大きな変化を起こしていくよりも、どう調子を維持していくのかが大事になってくるかもしれません。

# まとめ

今回は、ユーザーのアクセスログのデータから、ユーザーのエンゲージメントの指標である、DAU/MAU比率を計算し、可視化してみました。さらに、Prophetという予測アルゴリズムを用いて、その指標がどういった傾向で推移してきていて、これからどう変化していきそうなのか、簡単に導きだすことができました。

このように、データから正しいKPIを取得し、どういった傾向になっているのかを見極め、出来るだけ早くサービスの改善に役立てていくというのは、特にスピード感が求められるスタートアップや、新規事業の開発などで非常に有用です。そのために、今回のような手法が活用出来るのではないでしょうか。

# データ分析をさらに学んでみたいという方へ

今月６月に、シリコンバレーのExploratory社によって行われる[データサイエンス・ブートキャンプ](https://exploratory.io/training-jp?utm_campaign=blog_dau_mau&utm_medium=blog&utm_source=qiita)が東京で行われます。本格的に上記のようなデータサイエンスの手法をプログラミングなしで学んでみたい方、そういった手法を日々のビジネスに活かしてみたい方はぜひこの機会に、参加を検討してみてはいかがでしょうか。[こちら](https://exploratory.io/training-jp?utm_campaign=blog_dau_mau&utm_medium=blog&utm_source=qiita)に詳しい情報がありますのでぜひご覧ください。