ディスプレイ広告の設計研究


ディスプレイ広告を設計/実装する際に考慮しないといけないであろうことをまとめてみた。

ここでの議論の対象となるのは、ユーザーの属性を元にターゲティングして広告を出すシステム、Googleで言えばディスプレイ広告、他はFacebookやLinkedIn, Twitter, 最近で言えばGunosy広告といったものを想定する。

Googleの検索連動広告は、ユーザー属性を知らなくても、そのワードを検索したという事実を元に広告を出せば良いので設計が大きく異なるので対象としない。

## 基本設計

ユーザA: 人気があり広告を出したい企業が多い
ユーザB: 人気がなく広告を出したい企業が少ない
企業X: 広告費をたくさん払える
企業Y: 広告予算は限られている

とした時、以下のモデル1とモデル2の2つが考えられる。
実際は、この中間(モデル1よりが多いか)に当たるようなモデルを選択していると考えられる。

### モデル1: インプレッション単価が固定

つまり、人気のあるユーザーAに広告を出すのも、ユーザーBにだすのも同じ値段。企業Xは単価40円、企業Yは単価20円に設定したら、その額でとる。

ただし、XはYに比べて2倍(以上)多く広告が出るようになる。

このモデルは、2倍の価格設定をすると

価格2倍 * 表示頻度2倍 = トータル4倍

の予算を消化することになるのが傷。

更に、倍の予算が出稿頻度を倍にすると仮定すると、
予算が2Xある場合、2Xの予算の広告を出すのではなく、Xの予算の同じ広告を2個出すと

価格1倍 * 表示頻度1倍*2 = トータル2倍

となり、上と比べて半分の値段で同じ表示回数を得ることが出来てしまう。

これを回避するには2倍の価格設定で2倍以上の表示回数を保証するしかないが、こうすると倍の価格設定をすると4倍以上の予算を使うことも保証され結構困った問題になる。


### モデル2: 各ユーザーの単価が固定

つまり、あるユーザAに広告を出すのは予算がいっぱいある企業Xも予算が少ない企業Yも同じ。

その代わりユーザAとユーザーBに出す際の単価が異なり、ユーザーAがユーザBよりも2倍人気があれば、価格も2倍になる。

企業Xが企業Yの2倍の予算を持っていたら、2倍の頻度で出すとすればよく、結果として2倍の価格で提供できる。

デメリットとしては、単価指定できないため、全体予算の入力をターゲットの人数で割って入札単価を測定する形になる。なので、より正確にターゲット人数を推定することが必要。


## 広告枠の価値の問題

特にGoogleの検索連動広告は順位はかなり重要。そのため、1円でも多く払って広告枠の1位を獲得することも納得感がある。

それに対しディスプレイ広告は、ページがあまり変わらないので、毎回同じ表示順位だとユーザー側が飽きるという問題がある。
そのため、高い値段をつけた広告を一番上におくのが常に良いとは限らない。

## インプレッション数の推測

例えば、予算的に120回広告を出せるとした場合、朝120回出しきってしまって、後はもう出さないということではなく、朝、昼、夜とまんべんなく出して日付が回る直前に最後の1回を使うという方が美しいし、一般的に求められていることだと思う。

1日に120回出せるとした場合、1時間に5回、6分に1回ずつ出したらいいと思うのは間違い。アクセスの多い時間と少ない時間があるからだ。
ただ、これの解決は簡単で単純に1200回表示機会があるとしたら、10回に1回出せばいいだけ。時間ではなく回数で考えれば良い。
難しいのは次の2つ。

### ユーザーベースでなく、PVベースで推測しないといけない

広告を配信する企業からしたら、全部で何回ぐらい表示されて、どれくらいの人に見られるのかということは知りたいことだと思う。

ターゲットとなるユーザー数、いわゆるリーチを出すことは、どんなサービスでも割と簡単にできると思う。ただし、それはいわゆるUU(Unique User)と言われるもので、実際に何回表示できるかPV(Page View)とは異なる。
1日に1回そのサイトを見るユーザーもいれば10回の人もいるのである。


何を当たり前なことをいってるんだと思うかもしれないが、技術的に見るとこれは少し厄介。
UUなら、ユーザー情報だけをDBに保存しておけば良いが、PVとなるとアクセス全てをDB(必ずしもSQLというわけではなくデータ格納場所という広い意味)に保存しておかなければならない。
更に配信条件を設定するターゲティング広告だと、そのPV一つ一つに対しどんな属性のユーザーのアクセスだったかということがわかるようにしておかないといけないので結構リソースを使うタスクになる。


### 平日と休日で明らかにトータルPVやユーザー層が異なる

これは本当に厄介で、あまり解決法が見えていない。特にうちのサイトの場合休日はPVが結構落ち、ユーザー層も変わるので、平日と休日で別の設計をしないと目標の予算をうまく使えない。

土日なら、前回の土日を参考にして予測すれば良いが、厄介なのは祝日。連休だとやっぱり行動が変わってくるし、そもそもプログラム的に祝日を組み込むのは結構めんどくさい。祝日は土日を参考に予測していいのかもよくわからないし。連休の存在を考えると、先週を元に今週の推測をするとたまにひどいことになることもわかるが、あまり長期のデータを使うとユーザー層の変化やサイトの成長についていきづらい。

GoogleやFacebookは、1インプレッションあたりの値段を変えるとか、休日は平日に比べてPCのアクセスが落ちてモバイルが増えるらしいので、PCとモバイルの差で調整したりしているのだろうか？？

まぁお金にがめつくなければ、PVが高い側にあわせて予算設計をして、PVが少ない時はその分を諦めるという方法を取ればいいだけなのかも。決めた予算が消化できないのも場合によっては問題だし、美しくないけれど。

広告配信側としては、日毎の予算を入れるのではなく、1週間毎の予算を入れるという設計を好んで皆が使ってくれると嬉しいなと思ったりしているが、やっぱり日毎のほうが好まれるんだろうなぁ。。。


## 予算上限の処理

意外と困るのがこの予算上限の存在。特に以下の2点が難しいポイント

1. 予算を超える前に広告配信を止めること
2. 予算締め切り直前のつじつま合わせ

1回のインプレッションやクリックの単価は、配信時に決まる事が多いため、例えば後30円予算が残っている時に次を出しても大丈夫なのかどうかが決定できなかったりする。
特にクリック課金だと広告配信時とクリックのタイミングがずれるのでより予算オーバーの可能性が上がる。

日単位で予算を設定している場合は、毎日23時ぐらいに、既に予算をオーバーしている広告と、全然予算を消化できていない広告に別れることになる。
そうすると、予算をオーバーしている広告がストップし、その結果、予算を消化できていない広告が頻繁に表示されて辻褄が合うことになるが、広告を見ているユーザーとしてそれで良いのか疑問が残る。


### Google流の解決法

基本的には設定金額Xを使い切ること目指す。
実際は、上振れも下振れもあるが平均的には設定額Xになるはず。

この時、事前に1.2倍まではお金を使うことがあるよということを明記しておき、1.2Xを越えてしまったら、使用額としては1.2Xを超えた値を出しているけれども、オペレーションで1.2Xまでしかお金を請求しないという対応をしている。

### Facebook流の解決法

Facebookは予算Xよりだいぶ低い額を目標額にする。
その値は定かではないが、半分か半分よりちょっと上(0.5X-0.7X)位を目指している感じ。（「予算」などの適当な表現を使うのもポイント。「単価」を設定するという表現にした場合この方法は使えない。）

正規分布を仮定すると2倍になることはほぼないので、ほぼ上限の存在を気にせずに考えることができるようになる。

実際に0.5Xを目指していても、Xの値が小さい場合などは、Xを越えてしまう可能性があるが、その時はXまでしか請求しないようにしているみたい。起こったことがないので詳細不明。
もしかしたら、予算オーバーしたらクリックがあってもなかったことにしてるのかもしれない。



## より良い広告を優遇する措置

よりよい広告だった場合

1. より多く出してあげる
2. より安く出してあげる

の2つが大きく考えられる。

Facebookの場合金額がほぼ固定なので、1.の形になっている気がする。
ただし、それだと、目標の予算がある場合、その予算を超えやすくなる。
その代わり、ユーザーとしてはより良い広告が多く見れるというメリットがある。(実際は、良い広告とはクリックが多いと同義なので、例えばセクシーな女性が入った広告みたいなのが良い広告となりやすく、本当に質が良いとは限らない)

2.だけをすると、単純に目標の予算を下回るし、ユーザーとしても良い広告が悪い広告と同等にしか表示されないので相対的にデメリットになる。

なので、一番頭がいいのは1., 2.の併用で、頻度を上げて値段を下げて、総合的に目標の予算が一致するように設計すると綺麗。
これはちゃんと考えれば結構簡単にできる。

ただし、クリック率が2倍の広告を何倍で優遇するべきなのかは議論がありそう。1倍から2倍の間であることは間違いが無さそうだけど。

こういう場合は、間を取って(相乗平均をとって)ルート2倍にするのがいいんじゃないかと思っている。