Treasure Data Analytics 第8回 〜Social Gaming Analytics Vol.2: チュートリアルにおけるファンネル分析〜
本記事は移転しました。新サイトにリダイレクトします。
図1:チュートリアルのアクションを表現したファンネルグラフ。入口である step=1 には 8 人の user が流入したのにもかかわらず途中でどんどん離脱していき,出口である step=10 に達した user は user3 のみであることを表しています。また,チュートリアルの出口まで達した user はゲームへの本登録:register が完了したことになります。
今回は図1 のようなチュートリアルアクションに関する分析を行います。前回の続きですのでまだの方は先に前回の記事を読んでおいて下さい。
チュートリアルにはユーザー名登録,アバター選択などいくつものステップを経て登録というコンバージョンに至ります。今回は全 30 のステップを用意し,チュートリアルに入ったユーザーは順番にステップを進んでいくものを想定しています。またチュートリアルを終えた人が本登録: "register" を行う想定となっています。
もちろん入口に入った全てのユーザーが出口まで行ってくれるわけでは無く,途中でどんどん離脱していってしまいます。故にチュートリアルアクションの解析において重要なのは「どのステップが離脱ポイントとなっているか」という部分にあります。ここでは離脱ポイントを見るための解析・可視化手段を併せてファンネル分析と呼ぶことにします。
ファンネル分析を行うにあたって,今回想定されている tutorial ログのフォーマットの一例を以下に記述しておきます。これを行うための fluent_logger や Heroku Addon の説明は第6回を参照してください。
$ td table:tail your_app tutorial { "motivated_by": "invitation", "step": 9, "uid": "01234", "time": 1342110399 } { "motivated_by": "direct_access", "step": 11, "uid": "56789", "time": 1342110413 } { "motivated_by": "direct_access", "step": 12, "uid": "56789", "time": 1342110417 }
このアクションログは "step" という順序を持ったステータスを持ち,ユーザーは必ず入口:step=1 から入り,出口:step=30 に向かって進んでいきます。
また,"motivated_by" はチュートリアルの入口にやってきた動機を表すステータス値で,セグメントとして使用するステータスの例として使用しています。2 種類の値をもち, "invitation" は他ユーザーからのアプリインバイトによってチュートリアルにやってきたユーザー,"direct_access" は他の紹介なしに直接チュートリアルにやってきたユーザーを意味します。
まずはファンネル分析の対象となるアクションのクラスを定義しておきます。これは図1 を言葉で説明した程度の単純なものです。
定義
-----
以下の条件を満たすアクションを「ファンネル分析可能である」と定義する:
- "step" などの順序を持ったステータス(順序ステータスと呼ぶ)を持つ。
- 明示的な「入口」と「出口」が存在し,アクションは必ず入口から出口へ,順序に従って進行する。
- 全てのユーザーはアクションの進行途中で離脱する事ができる。つまり順序ステータス値の増加に伴ってユーザー数(アクセス数)は減少(正しくは単調非増加)する性質を持つ。
-----
ファンネル分析可能なアクションの例は,
- 「イベント」:途中のいくつかの課題(ステップ)を乗り越えながらゴールへの到達を目指す各イベントのステップ毎の到達ユーザー数についてファンネル分析
- 「会員登録」: (1) メールアドレス登録→ (2) 住所登録→ (3) クレジット登録→ (4) 登録完了ページへのコンバージョン の各アクセス数についてファンネル分析
など,いくらでも挙げることができます。
ファンネル分析(全ユーザーに対して)
それでは早速上記の Tutorial アクションログに対して step 毎に集計する Hive クエリを書きましょう。いつものようにサンプルクエリへの gist link を貼っておきます。
step uu prev_uu rate_from_enter rate_from_prev normed_rate_from_prev 1 33,695 33,695 100.00 100.00 0.00 2 32,894 33,695 97.62 97.62 2.44 3 32,375 32,894 96.08 98.42 1.60 4 31,168 32,375 92.50 96.27 3.87 5 27,836 31,168 82.61 89.31 11.97 6 25,335 27,836 75.19 91.02 9.87 7 24,448 25,335 72.56 96.50 3.63 8 23,629 24,448 70.13 96.65 3.47 9 22,819 23,629 67.72 96.57 3.55 10 22,094 22,819 65.57 96.82 3.28 11 21,823 22,094 64.77 98.77 1.24 12 21,388 21,823 63.48 98.01 2.03 13 21,163 21,388 62.81 98.95 1.06 14 20,978 21,163 62.26 99.13 0.88 15 20,817 20,978 61.78 99.23 0.77 16 20,371 20,817 60.46 97.86 2.19 17 11,279 20,371 33.47 55.37 80.62 18 9,147 11,279 27.15 81.10 23.31 19 8,581 9,147 25.47 93.82 6.59 20 8,327 8,581 24.71 97.04 3.05 21 7,706 8,327 22.87 92.53 8.07 22 7,458 7,706 22.13 96.78 3.32 23 6,698 7,458 19.88 89.82 11.34 24 6,472 6,698 19.21 96.62 3.49 25 6,153 6,472 18.26 95.06 5.19 26 5,972 6,153 17.72 97.06 3.03 27 4,272 5,972 12.68 71.53 39.79 28 4,110 4,272 12.20 96.20 3.95 29 3,923 4,110 11.64 95.47 4.75 30 3,653 3,923 10.84 93.12 7.39
Query1.1 から得られる図1のテーブルには次のカラムが含まれています:
- step: チュートリアルステップ(1,2...,30 までの順序を持つ)
- uu: ユニークユーザー数
- uu_prev: 前ステップでのユニークユーザー数
- rate_from_enter: 入口(step=1) の uu と比較して,どれくらいの割合のユーザーが生存しているか
- rate_from_prev: 前ステップ の uu と比較して,どれくらいの割合のユーザーが生存しているか
- normed_rate_from_prev: 前ステップからの離脱人数を prev_uu で割った値(割合)。この値が高ければ高いほど,前ステップからの離脱が激しいといえる
定義の1つであった,uu は順序ステータスである step 数の増加と共に減少している(厳密には増加しない:単調比減少)性質が,結果テーブルより確認することができます。
ここで,uu は絶対的な値であるのに対し,最後 3 つの rate は相対的な値です。ファンネル分析に関して絶対的な値を用いるのか相対的な値を用いるのかに関しては概ね以下の様に分類できます。
- 絶対的な値:先月と今月のチュートリアル比較のように uu の値自身も併せて比較しなければならない場合
- 相対的な値:セグメント毎のチュートリア比較のように uu の値自身は比較対象にならず,離脱状況の相違に興味がある場合
今回紹介する2種のファンネル分析(全体,セグメント別)はともに後者の相対的な値:割合を参照しています。その理由は生存時間分析で用いられる生存曲線とハザード比曲線を模倣して使用しているからです。
早速上記の結果テーブルを可視化してみましょう。
図3:チュートリアルの step を順に並べ,各ステップ生存率を(片側)バーチャートで表したもの。早期 step 4->5, 5->6 で入口 uu の 5% 以上の減少が起こり,中期 step 16->17 で 15% 近い減少が確認できます。また後期 step 26->27 においても顕著な減少が見られます。顕著な減少の原因となっているこれらの step においてはその理由と改善のための解析・アクションを続いて行う必要があります。
図4:図3 のバーチャートを両側に表示したもの。「ファンネル」は元々「じょうご」という意味ですが,この両側バーチャートが必ず下に向かってしぼんでいく形になることからその名前がついています。じょうごの形をより意識すると右の Fusion Chart ライブラリのファンネル図 のようになります。
さて上記の(片側 or 両側)バーチャートの他にもこのファンネル分析可能なクラスの結果の特徴を良く表現する図を紹介します。これらはセグメントで分けた結果を比較する場合に非常に強力な手段となります。
図5:各step において,step=1 の uu を 100 とした場合の割合をプロットし線でつないだ図。入口からの「生存率」を表すこのグラフは生存時間解析の脈略で「生存曲線」と呼ばれており,図5 はそれを模倣したものです。step 16->17 の段差が大きく,この時点で多くが離脱していること,またこの時点で入口の 50% 以上の人が離脱してしまったことが把握しやすくなっています。
図6:今度は 1 つ前の step と比較しての離脱率を元にした図を描いてみます。図6 はその step に至る前に離脱した人数を前 step の uu で割った値をプロットした図です。図5 で段差が大きかった step ほどこの値が大きくなり,注目すべき離脱ポイントであることがわかります。このように離脱ポイントが山の高さで特定できる意味でこの図は有用です。これも生存時間解析の脈略では「ハザード比(直前まで離脱せずに生存していたユーザーが,続く瞬間に離脱する確率)」に基づくプロットを(確率では無いですが)模倣してみたものです。
ファンネル分析(各セグメントに対して)
次は「入口への流入動機」を表すステータス:"motivated_by" の値をセグメントにしたファンネルを見ていくことにしましょう。今回の例では,チュートリアルの参加が,他ユーザーからインバイトされた場合とそうでない場合では,離脱状況・離脱ポイントに違いがあるのかを確認することを目標にします。
motivated_by step uu prev_uu rate_from_enter rate_from_prev normed_rate_from_prev direct_access 1 20,098 20,098 100.0 100.0 0.0 direct_access 2 20,040 20,098 99.7 99.7 0.3 direct_access 3 19,698 20,040 98.0 98.3 1.7 direct_access 4 19,385 19,698 96.5 98.4 1.6 direct_access 5 16,113 19,385 80.2 83.1 20.3 direct_access 6 14,332 16,113 71.3 88.9 12.4 direct_access 7 13,814 14,332 68.7 96.4 3.7 direct_access 8 13,601 13,814 67.7 98.5 1.6 direct_access 9 13,345 13,601 66.4 98.1 1.9 direct_access 10 13,172 13,345 65.5 98.7 1.3 direct_access 11 13,117 13,172 65.3 99.6 0.4 direct_access 12 12,933 13,117 64.3 98.6 1.4 direct_access 13 12,755 12,933 63.5 98.6 1.4 direct_access 14 12,612 12,755 62.8 98.9 1.1 direct_access 15 12,533 12,612 62.4 99.4 0.6 direct_access 16 12,419 12,533 61.8 99.1 0.9 direct_access 17 6,113 12,419 30.4 49.2 103.2 direct_access 18 4,332 6,113 21.6 70.9 41.1 direct_access 19 3,814 4,332 19.0 88.0 13.6 direct_access 20 3,601 3,814 17.9 94.4 5.9 direct_access 21 3,345 3,601 16.6 92.9 7.7 direct_access 22 3,172 3,345 15.8 94.8 5.5 direct_access 23 3,117 3,172 15.5 98.3 1.8 direct_access 24 2,933 3,117 14.6 94.1 6.3 direct_access 25 2,755 2,933 13.7 93.9 6.5 direct_access 26 2,612 2,755 13.0 94.8 5.5 direct_access 27 1,233 2,612 6.1 47.2 111.8 direct_access 28 1,219 1,233 6.1 98.9 1.1 direct_access 29 1,200 1,219 6.0 98.4 1.6 direct_access 30 1,172 1,200 5.8 97.7 2.4
図7:チュートリアルの {"motivated_by": "direct_access"} ユーザーにおける,step ごとの到達ユニークユーザー数をはじめとした集計テーブル。
motivated_by step uu prev_uu rate_from_enter rate_from_prev normed_rate_from_prev invitation 1 13,597 13,597 100.0 100.0 0.0 invitation 2 12,854 13,597 94.5 94.5 5.8 invitation 3 12,677 12,854 93.2 98.6 1.4 invitation 4 11,783 12,677 86.7 92.9 7.6 invitation 5 11,723 11,783 86.2 99.5 0.5 invitation 6 11,003 11,723 80.9 93.9 6.5 invitation 7 10,634 11,003 78.2 96.6 3.5 invitation 8 10,028 10,634 73.8 94.3 6.0 invitation 9 9,474 10,028 69.7 94.5 5.8 invitation 10 8,922 9,474 65.6 94.2 6.2 invitation 11 8,706 8,922 64.0 97.6 2.5 invitation 12 8,455 8,706 62.2 97.1 3.0 invitation 13 8,408 8,455 61.8 99.4 0.6 invitation 14 8,366 8,408 61.5 99.5 0.5 invitation 15 8,284 8,366 60.9 99.0 1.0 invitation 16 7,952 8,284 58.5 96.0 4.2 invitation 17 5,166 7,952 38.0 65.0 53.9 invitation 18 4,815 5,166 35.4 93.2 7.3 invitation 19 4,767 4,815 35.1 99.0 1.0 invitation 20 4,726 4,767 34.8 99.1 0.9 invitation 21 4,361 4,726 32.1 92.3 8.4 invitation 22 4,286 4,361 31.5 98.3 1.7 invitation 23 3,581 4,286 26.3 83.6 19.7 invitation 24 3,539 3,581 26.0 98.8 1.2 invitation 25 3,398 3,539 25.0 96.0 4.2 invitation 26 3,360 3,398 24.7 98.9 1.1 invitation 27 3,039 3,360 22.4 90.4 10.6 invitation 28 2,891 3,039 21.3 95.1 5.1 invitation 29 2,723 2,891 20.0 94.2 6.1 invitation 30 2,481 2,723 18.2 91.1 9.8
図8:チュートリアルの {"motivated_by": "invitation"} ユーザーにおける,step ごとの到達ユニークユーザー数をはじめとした集計テーブル。
図9:実は2 つ以上のファンネルを比較したい場合,図9 のようなメジャーなファンネル図では区別が行いにくいのです。どちらも必ず尻すぼみのじょうごの形となっているので,両者の差の程度が読み取りにくくなっているからです。
図10:そこでチュートリアルにおける擬生存曲線を見てみましょう。2つのセグメントの離脱状況の違いがより鮮明に浮かび上がってきます。例えば,step 16->17 への落差が invitation ユーザーの方が小さく,またその後の生存割合の減少具合も daily_access より小さくて最終的に本登録する(入口からの)割合は大きな違いがある,という事がすぐにわかります。
図11: さらにチュートリアルにおける擬ハザード比曲線を使って離脱インパクトの大きかった step をセグメントごとに確認してみましょう。direct_access の方が step 16->17 の離脱インパクトが大きく,また,step 26->27 においては invitation ユーザーには見られない大きな山がみられます。確かにこの時点では direct_access ユーザーの半数近くがここで離脱してしまっているという大きな離脱ポイントとなっていますが,invitation ではポイントにはなっていません。図6 によってユーザー全体でのファンネル分析でも確認できたこの離脱ポイントは,実は direct_access ユーザーのみによって引き起こされたものであったことがここで判明しました。
最後に
チュートリアルにおけるファンネル分析は他にも週や月といった時間をセグメントに比較するのも有効です。その際には前述した通り各月でのチュートリアル参加人数,離脱人数といった絶対値での比較が可能となります。そういう意味では下のような出発点が揃わない曲線図も加える事ができます。
図12: 絶対値である UU を元に月別の離脱状況を比較するための曲線。今までの生存曲線とは違って初期値 step=1 が異なっている。2012-06 におけるユーザーは 2012-07 のそれより入口にやってユーザー数が多いのにもかかわらず,出口では 2012-07 のユーザー数より少なく,途中でより激しく離脱していることがわかる。
さらにこの解析を進めるためには,各 step におけるユーザーの平均滞在時間を見るのが有効です。チュートリアルのログには各 step,各ユーザーのタイムスタンプがとれているので,ユーザー毎に隣接する step 間でのタイムスタンプの差分をとって集計すれば平均滞在時間がわかります。基本的にチュートリアルはさくさく進むべきものであるものなので,意図せず他より滞在時間の長い step はやや問題があるのかもしれません。次はそいういった部分を掘り下げていくのが良いでしょう。