ランダムウォークによる広告効果予測モデル


広告効果の予測モデルを作成する

アトリビューション分析 – マルコフ連鎖モデルの分析方法の続きです。

いくら素敵なアトリビューション分析をしたところで、実際に活用できなければ意味がありません。
小難しい理論を駆使して、アトリビューションモデリングを行い、広告の評価を行っても、「ふーん」で終わってしまうこともよくあります。アトリビューション分析によって、どのようなビジネスインパクトがあるのかを示さない限り、分析をする価値はありません。

以前述べたように、分析には検証型調査と探索型調査の2種類があります。
検証型調査では、アトリビューション効果を踏まえた上での目標設定を行った上で、分析をすることで、目標に対する達成度という視点で評価することができます。
探索型調査において、アトリビューション分析によって分かるようになることはいくつかのパターンがありますが、ビジネスに対するインパクトが大きいのは、「広告効果の予測」ではないかと思います。

広告効果の予測とはどういうことか?一番役に立ちそうな予測は間違いなく、
・「どの広告にいくら投資したら、いくらリターンがあるのか」
ということです。
ただ、広告の価格については、みずものなところがありますので、
・「どの広告からどれだけ流入があれば、何件CVが上がるのか」
について、考えたいと思います。

random_001_R
例えば、「バナー広告からの流入を1万件あげると、CVはどれだけ上がるのか」がわかるということです。流入数さえ分かれば、ある程度の広告価格も推測が着くので、投資対効果も間接的にわかるようになります。

 

ラストクリックによる予測モデル

ラストクリックだけ考えれば、予測モデルは超簡単です。
予想流入数に単純に該当の広告のCVRを掛けるだけです。

(流入数)X CVR = CV数

*過去のデータは当てにならないということもありますが、統計的な分析を行う上では過去のデータに頼らざるを得ません。統計モデルであれば、どのモデルも過去の実績に依存します。逆を言うと、過去のデータがない限り、予測モデルは作れません。これまで起こったことのないことに対する予測については、統計は無力です。

これで良いと言えば良いのですが、純広告のような認知拡大効果が大きそうな広告であったり、価格が高く、すぐにCVしないような商材であれば、ラストクリックのみだと「アシスト効果」が見えなくなってしまいます。アシスト効果を加味した上で広告を評価しましょう、というのがアトリビューション分析ですので、もうちょっと考えてみたいと思います。
*線形回帰による予測モデル
一番シンプルな多変量解析予測モデリングは重回帰分析によるモデル化です。
単純化して数式にすると、

y = a1*x1 + a2*x2 + a3*x3 + a4*x4 + a0

となります。広告モデルに置き換えると、

CV = (流入元Aの係数)*(Aの流入数)+(流入元Bの係数)*(Bの流入数)+(流入元Cの係数)*(Cの流入数)+(流入元Dの係数)*(Dの流入数)+切片
みたいなモデルが作れれば、予測が可能となります。
ただし、このモデルの係数を算出しても恐らく誤差が大きくなりすぎて、使い物にならないモデルになると思います。ロジスティック回帰であるとか、階層ベイジアンモデルなどを使って、モデル化すれば、ある程度役に立つモデルができそうですが、実装がなかなか難しそうな上に、大量のデータを扱うには計算量も大きくなりすぎてしまいます。
なので、もうちょっとシンプルでわかりやすいモデルができれば理想的です。

 

 ランダムウォークによる予測モデル

ここからが本題です。できるだけシンプルで計算量も少ないモデルを作成したいと思います。
以前取り上げたマルコフ連鎖モデルと同じランダムウォークを用いた予測モデル化を検討します。

まず、ログデータを分析して、下記のような遷移行列を作成します(簡単に書きましたが、このデータの作成はすごい大変です。。。後述)。

random_002_R

 

表の見方ですが、表側が流入元、表頭が次回来訪時の流入元もしくはCV/離脱です。
例えば、「ad」から流入した件数が1,132件あって、CVは60件、離脱は675件。次回来訪時に「org」から来た人が300件という見方です。

この表の横%表も作成しておきます。この表は確率を表しているので、「ad」からの「cv」する確率(CVR)は5.30%と読みます。

random_003_R

これらのデータさえできれば、後は簡単です。

・初回ループ

仮に「ad」から5,000件のユーザーを連れてくると仮定します。
その場合、すぐにCVする件数はCVRが5.3%なので、265件となります。
離脱してしまって、2度とサイトに来ない人は59.6%なので、2,981件となります。
残りの1,754件は、再度サイトに来てくれるユーザーです。
このうち、
・また「ad」から来る人は8.8件
・「sem」経由で来る人は282.7件
・「org」経由で来る人は1,325件
・「mail」経由で来る人は265件
となります。

・2回目ループ

この1,754件は、サイトに来たユーザーなので、この人達もCVするかもしれません。
「org」から来た人は1,325件いて、「org」のCVRがは6.01%なので、「ad → org」という流れで、79.6件のCVが生まれます。同様に、他の流入元も足し合わせると、2回目の来訪で全体として、86.9件のCVが発生します。
当然離脱も多く発生して、1,168件が離脱します。残りの499件はCVしなかったけど、またサイトに来てくれるユーザーたちです。

・3回目以降のループ

この499件からはCV22.6件、離脱302件、残り279件はまたループします。と、いうのを繰り返していくと、離脱・CVは次に繰り越さないため、段々とサイトに来る数が収束していきます。もういいや、というくらい数が少なくなったら、ループ終了です。
繰り返した結果は下記のような表となります。

 

random_004_R

 

結果の解釈:このモデルは何を表しているのか?

初回来訪時のCV数(=ラストクリック評価でのCV数)は265件でしたが、このモデルでのCV数合計は386.2件とかなり膨らみます。次回来訪への波及効果によるCV発生が差分である121.2件と解釈できます。
この方法を使えば、簡単にwhat-ifモデルによる予測モデルが構築できます。
例えば、ad 5,000件に加えて、semを2,000件追加すると、ループは下記の表のように変化して、
CV数は482件となります。このように簡易的な予測がすぐにできます。

random_005_R

この予測モデルは論理的にわかりやすく、説明しやすい上に、計算量も少なくてすみます。ちょっと面倒ですが、Excelでも余裕で計算できます。
ただ、Excelで計算すると、対象の流入元の種類が増えた時に大変すぎるので、rubyで実装しました。たくさんループさせてもしょうがないので、10回ループもしくは、1ループあたりのCV数が1件以下になったら、ループ終了としています。

 

 

このモデルでは「ad→sem」や「ad→org」などの流入順序を基に構成されています。この流入順序は「1対のみ」の流入順序です。「ad→sem→org」という複数の遷移情報を持ったデータはこのモデルでは考慮されていません。
例えば、「広告A→広告B→自然検索→CV」という流れを想定したキャンペーンなどを実施した場合は、「広告A→広告B」という流れは評価されていますが、「広告B→自然検索」という流れの時には、事前に広告Aを踏んでいる場合と、広告Aを踏んでいない場合の両方が同じものとして評価されてしまいます。このように複数の施策を組み合わせたキャンペーンを評価する場合には向いていないモデルです。

 

ランダムウォークによる予測モデルの欠点

複数組み合わせのキャンペーンを評価していないという点も欠点といえば、欠点ですが、多くの場合、それほど大きな問題にはならないと思います。このモデルの欠点は、事前に準備しなくてはいけない「遷移行列」を作るのが非常に大変という点です。。。。
流入元情報のデータさえあれば、簡単に作れそうな気がするのですが、なかなか一筋縄ではいきません。
特に、「離脱」の扱いが非常に厄介です。「離脱」の定義をどう置くのか。仮に「3ヶ月サイト来訪なし」を離脱と置くと、3ヶ月前までのデータしか対象にすることができません。直近3ヶ月のデータは再度サイトへ来るかもしれない人も含まれたデータだからです。
その上、3ヶ月以上前のデータを対象にして集計しようとしても、集計期間後のデータをルックアップしないと離脱かどうかの判別ができないため、データ件数が多くなると、処理が大変になります。
直帰率などの代替のデータに係数をかけて離脱とみなす、という方法が現実的かもしれません。

また、「ad→sem」のような流れは、ユーザー(ブラウザ)単位で起きるので、ユーザーレベルでの集約が必要となります。アクセス解析ツールでうまく実装すれば、流入元履歴のデータを取得することができますが、基本的にセッション単位のデータとして集計されて出てくるので、ユーザー単位への集約は必要となります。この作業もかなり大変です。

また、「CVは初回CVだけを対象にするのか」や初回以外も対象にする場合、「一度、CVした人は流入元を一旦クリアするのか」など、離脱以外にも細かなデータ定義が必要となってきて、このデータ定義によって、計算結果も大きく変わってきます。

ランダムウォークによる予測モデル自体はシンプルなのですが、事前作業である遷移行列作りが大変なのが、大きな欠点です。

 

とはいえ、一旦システムを構築してしまえば、後は自動的に遷移行列作りは可能です。
シンプルな予測モデルとしては、結構良さそうな気がするのですが、いかがでしょうか?

 

Leave a Reply