トレジャーデータ(Treasure Data)ブログ

トレジャーデータ(Treasure Data)ブログです。

本サイトは移転しました。新サイトにリダイレクトします。

Treasure Data Analytics 第8回 〜Social Gaming Analytics Vol.2: チュートリアルにおけるファンネル分析〜

本記事は移転しました。新サイトにリダイレクトします。

 

f:id:doryokujin:20120709192849p:plain

図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 を言葉で説明した程度の単純なものです。

定義

-----

以下の条件を満たすアクションを「ファンネル分析可能である」と定義する:

  1. "step" などの順序を持ったステータス(順序ステータスと呼ぶ)を持つ。
  2. 明示的な「入口」と「出口」が存在し,アクションは必ず入口から出口へ,順序に従って進行する。
  3. 全てのユーザーはアクションの進行途中で離脱する事ができる。つまり順序ステータス値の増加に伴ってユーザー数(アクセス数)は減少(正しくは単調非増加)する性質を持つ。

 -----

ファンネル分析可能なアクションの例は,

  • 「イベント」:途中のいくつかの課題(ステップ)を乗り越えながらゴールへの到達を目指す各イベントのステップ毎の到達ユーザー数についてファンネル分析
  • 「会員登録」: (1) メールアドレス登録→ (2) 住所登録→ (3) クレジット登録→ (4) 登録完了ページへのコンバージョン の各アクセス数についてファンネル分析

など,いくらでも挙げることができます。

 

ファンネル分析(全ユーザーに対して)

それでは早速上記の Tutorial アクションログに対して step 毎に集計する Hive クエリを書きましょう。いつものようにサンプルクエリへの gist link を貼っておきます。

Query 1.1

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 
図2:チュートリアルの step ごとの到達ユニークユーザー数をはじめとした集計テーブル。

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種のファンネル分析(全体,セグメント別)はともに後者の相対的な値:割合を参照しています。その理由は生存時間分析で用いられる生存曲線とハザード比曲線を模倣して使用しているからです。

早速上記の結果テーブルを可視化してみましょう。

f:id:doryokujin:20120713004723p:plain

図3:チュートリアルの step を順に並べ,各ステップ生存率を(片側)バーチャートで表したもの。早期 step 4->5, 5->6 で入口 uu の 5% 以上の減少が起こり,中期 step 16->17 で 15% 近い減少が確認できます。また後期 step 26->27 においても顕著な減少が見られます。顕著な減少の原因となっているこれらの step においてはその理由と改善のための解析・アクションを続いて行う必要があります。

f:id:doryokujin:20120713004702p:plainf:id:doryokujin:20120713022042p:plain

図4:図3 のバーチャートを両側に表示したもの。「ファンネル」は元々「じょうご」という意味ですが,この両側バーチャートが必ず下に向かってしぼんでいく形になることからその名前がついています。じょうごの形をより意識すると右の Fusion Chart ライブラリのファンネル図 のようになります。

さて上記の(片側 or 両側)バーチャートの他にもこのファンネル分析可能なクラスの結果の特徴を良く表現する図を紹介します。これらはセグメントで分けた結果を比較する場合に非常に強力な手段となります。

f:id:doryokujin:20120713004821p:plain

図5:各step において,step=1 の uu を 100 とした場合の割合をプロットし線でつないだ図。入口からの「生存率」を表すこのグラフは生存時間解析の脈略で「生存曲線」と呼ばれており,図5 はそれを模倣したものです。step 16->17 の段差が大きく,この時点で多くが離脱していること,またこの時点で入口の 50% 以上の人が離脱してしまったことが把握しやすくなっています。

f:id:doryokujin:20120713004839p:plain 

図6:今度は 1 つ前の step と比較しての離脱率を元にした図を描いてみます。図6 はその step に至る前に離脱した人数を前 step の uu で割った値をプロットした図です。図5 で段差が大きかった step ほどこの値が大きくなり,注目すべき離脱ポイントであることがわかります。このように離脱ポイントが山の高さで特定できる意味でこの図は有用です。これも生存時間解析の脈略では「ハザード比(直前まで離脱せずに生存していたユーザーが,続く瞬間に離脱する確率)」に基づくプロットを(確率では無いですが)模倣してみたものです。

 

ファンネル分析(各セグメントに対して)

次は「入口への流入動機」を表すステータス:"motivated_by" の値をセグメントにしたファンネルを見ていくことにしましょう。今回の例では,チュートリアルの参加が,他ユーザーからインバイトされた場合とそうでない場合では,離脱状況・離脱ポイントに違いがあるのかを確認することを目標にします。

Query 1.2

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 ごとの到達ユニークユーザー数をはじめとした集計テーブル。

f:id:doryokujin:20120713004918p:plain

図9:実は2 つ以上のファンネルを比較したい場合,図9 のようなメジャーなファンネル図では区別が行いにくいのです。どちらも必ず尻すぼみのじょうごの形となっているので,両者の差の程度が読み取りにくくなっているからです。

f:id:doryokujin:20120713004939p:plain

図10:そこでチュートリアルにおける擬生存曲線を見てみましょう。2つのセグメントの離脱状況の違いがより鮮明に浮かび上がってきます。例えば,step 16->17 への落差が invitation ユーザーの方が小さく,またその後の生存割合の減少具合も daily_access より小さくて最終的に本登録する(入口からの)割合は大きな違いがある,という事がすぐにわかります。

f:id:doryokujin:20120713004949p:plain

図11: さらにチュートリアルにおける擬ハザード比曲線を使って離脱インパクトの大きかった step をセグメントごとに確認してみましょう。direct_access の方が step 16->17 の離脱インパクトが大きく,また,step 26->27 においては invitation ユーザーには見られない大きな山がみられます。確かにこの時点では direct_access ユーザーの半数近くがここで離脱してしまっているという大きな離脱ポイントとなっていますが,invitation ではポイントにはなっていません。図6 によってユーザー全体でのファンネル分析でも確認できたこの離脱ポイントは,実は direct_access ユーザーのみによって引き起こされたものであったことがここで判明しました。

 

最後に

チュートリアルにおけるファンネル分析は他にも週や月といった時間をセグメントに比較するのも有効です。その際には前述した通り各月でのチュートリアル参加人数,離脱人数といった絶対値での比較が可能となります。そういう意味では下のような出発点が揃わない曲線図も加える事ができます。

f:id:doryokujin:20120713040616p:plain

図12: 絶対値である UU を元に月別の離脱状況を比較するための曲線。今までの生存曲線とは違って初期値 step=1 が異なっている。2012-06 におけるユーザーは 2012-07 のそれより入口にやってユーザー数が多いのにもかかわらず,出口では 2012-07 のユーザー数より少なく,途中でより激しく離脱していることがわかる。

さらにこの解析を進めるためには,各 step におけるユーザーの平均滞在時間を見るのが有効です。チュートリアルのログには各 step,各ユーザーのタイムスタンプがとれているので,ユーザー毎に隣接する step 間でのタイムスタンプの差分をとって集計すれば平均滞在時間がわかります。基本的にチュートリアルはさくさく進むべきものであるものなので,意図せず他より滞在時間の長い step はやや問題があるのかもしれません。次はそいういった部分を掘り下げていくのが良いでしょう。