渋谷駅前で働くデータサイエンティストのブログ

元祖「六本木で働くデータサイエンティスト」です / 道玄坂→銀座→東京→六本木→渋谷駅前

意外と見極めにくい「CVR向上に最も貢献する行動パターン」

割とどこの現場でもやっている分析として「CVR向上に最も貢献する行動パターン」の同定・抽出というのがあると思うんですが、これって簡単なようで意外と難しいポイントがゴロゴロしてるんですよね。


例えばユーザー行動ログDBからソシャゲのイベントA, B, C...をやったかやらないかをフラグとしたテーブルを抽出し、CVのラベルとして「1週間以内に課金したorしない」*1みたいなのを与えて、

UserID Event A Event B Event C Event D ... CV
1001 1 0 1 1 ... Yes
1002 1 1 1 0 ... Yes
... ... ... ... ... ... ...
10X4 0 1 0 0 ... No
10X5 0 0 0 1 ... No
... ... ... ... ... ... ...


というような生データ*2を得ているものとここでは仮定します。ここから、CVR向上に最も貢献する行動パターンを突き止める!という課題を考えてみましょう。

アクション率で比較するor機械学習で比較する


どうやってもいいと思うんですが、僕がやったことのあるパターンを2つご紹介。


アクション率

こちらは割と簡単で、普通にExcelでもやれますし、DB上でもクエリをきちんと書けばすぐ出せます*3。それぞれのイベントごとのフラグ数の総和を計算した上で、CV = Yesの群とCV = Noの群に分けて、それぞれの群のUU数で割ったものがアクション率。このアクション率同士の差を例えば「アクション率{Yes} - アクション率{No}」のようにして求めて、プラスならCVR増加に、マイナスならCVR低下に寄与すると判定する、というものです。


例えばですが、上の例で言えば

Event A Event B Event C Event D ...
Yes 60% 30% 45% 20% ...
No 20% 70% 55% 50% ...
差分 40% -40% -10% -30% ...


みたいな結果が得られます。ここで一番下の行の「アクション率の差分」がプラスかマイナスか?そしてそのボリュームがどれくらいか?で、それぞれのイベントがCVR向上に貢献するかどうかを測れる*4、というわけです。


機械学習

やり方次第ですが、Rとかを使えばものすごーく簡単です。とりあえずロジスティック回帰とか*5で良いと思います(やり方は以前の記事1 or 以前の記事2あたりを参照)。ここではexp(coefficients)して個々の変数予測重要度を出し、元のcoefficientsの「符号」からCVR増加(正)or減少(負)に寄与したとみなすことにしましょう。


すると、例えばですが

Event A Event B Event C Event D ...
変数予測重要度 25.0 -15.0 10.0 -7.5 ...


みたいな結果が得られます。これの値が大きければそれだけCVR増加に寄与するし、小さければ(そして負であれば)CVR減少に寄与してしまう、ということが言えるわけです。


あれ?アクション率による結果と機械学習による結果とが食い違う?


ところで先ほどの例を見て、変だと思いませんでしたか? 単なる仮想上のデータではありますが、

Event A Event B Event C Event D ...
アクション率差分 40% -40% -10% -30% ...
変数予測重要度 25.0 -15.0 10.0 -7.5 ...


Event Cの評価が逆になってますね。こんなことあり得るのか???と思う人も多いでしょうが、実際にアクション率差分と機械学習で出した変数予測重要度とが食い違うということはあり得るんです。


実は「組み合わせ」が問題


何でそんな矛盾が生じるのかというと、この手の行動パターンの選択肢が多い状況下での分類では往々にして「組み合わせ」がCVを分ける要因になっているからです。


上記の例だと、例えば"Event C"は"Event B"とともにプレイしたユーザーの場合はCVRが低くなるとか、もっと複雑に言えば"Event B"は(上の例では省略した)"Event E", "Event H"とともにプレイしたユーザーの場合はものすごくCVRが下がるとか。なのに、"Event B, E, H"とともにプレイしていないユーザーの場合ではCVRがものすごく高い、とか。。。


そこで全体数として「悪い方の組み合わせ」が「良い方の組み合わせ」を上回っている場合に、一方で「良い方の組み合わせ」の方がCVRで大きく優れていたりすると、アクション率の差分ではマイナスなのに機械学習で出した変数予測重要度ではプラスになるということがあり得る、というわけです。


これはものすごくややこしい話ですが、変数(ここでは分析対象のイベント)が増えれば増えるほど起こり得る面倒な問題です。


「組み合わせ」を調べるには?


ところが、この「組み合わせ」を調べようとすると結構労力が要ります。たかだか5変数ぐらいなら全パターン調べても何とかなるでしょうが、これが50変数とかあったらお手上げ*6ですよねぇ。。。


考え方は色々ありますが、僕の場合はアソシエーション分析(バスケット分析、association rules)を用いることに決めています。やり方としては、通常のアソシエーション分析のトランザクションデータに、さらにCVを識別するダミー変数を足してやるという感じです。その上で↓こんな感じの


f:id:TJO:20130610151829p:plain


以前の記事でやったようなグラフ構造への可視化を行った上で、具体的に「CV = Yesのノード」と「CV = Noのノード」と、上記のようなややこしいノード(今回の例では"Event C")とがどういう関係性にあるかを調べるというものです。


ここから先は僕もまだ模索中なので何とも言えないんですが、ベタにFruchterman-Reingoldアルゴリズムで描画するのが良いかなー、と思ってます。何となく。


おわりに


もちろんここで僕が提示した方法論が全てというわけではないです。「組み合わせ」の問題を解決するにはもっと良い方法がきっとあるんじゃないかと思いますので、気前の良い方はぜひ僕に教えて下さい(笑)。


後は、やっぱり単純に「組み合わせ」を表現するための何か良い数理モデルないかなー、というところですかね。現状ではグラフ理論とかグラフィカルモデルとかが良さげなんですが、もっと勉強しなきゃいけないんでしょうなぁ。。。

*1:ソーシャルなら「翌週も来た(定着)or来ない(離脱)」でもいいし、広告なら「資料請求したorしない」とか

*2:素性(そせい)ベクトル+分類ラベル、というパターンですね

*3:Hiveだと多少テクニカルですがそこは我慢

*4:裏を返すとマイナスのものは「避けるべき」ということになる

*5:別にSVMでもランダムフォレストでも良いけど、「向き」が取れる必要がある

*6:試しに「組み合わせの数」の計算で算出してみると。。。