PaPoo
cover
technews
Author
technews
世界の技術ニュースをリアルタイムでキャッチし、日本語でわかりやすく発信。AI・半導体・スタートアップから規制動向まで、グローバルテックシーンの「今」をお届けします。

Google Adsの「インストール数」が信用できなくなった話

小さなアプリが広告を出したら、数字の上では順調に見えたのに、実態はまるで違っていた。そんな話は珍しくないが、Dayzleの事例はかなり露骨だ。Googleが「インストール」と数えたものの多くが、人間ではなくボットのようだったからだ。しかも、単に怪しいというレベルではなく、実際の管理画面と広告配信の仕組みが噛み合わず、広告費だけが吸われていく構図まで見えている。アプリ広告の計測をそのまま信じると何が起きるのか、その具体例として読む価値がある。

21件のインストールと、管理画面に残った1件のズレ

Dayzle は、数字・単語・ロジックのパズルを毎日少しずつ遊べる小さなアプリだ。書き手は自分を「numbers guy」だと述べていて、広告の最適化も得意分野だと考えていた。そこで Android 向けの Google Ads キャンペーンを、1日 CA$40 の予算で始めた。目標は installs、つまりインストール数だった。

最初の数日は、広告費はほとんど使われなかった。1インストールあたりの目標単価を $1.50 に置いていたが、Google はその価格ではインストールを見つけられなかったという。そこで試しに目標を外すと、すぐに1日の予算の2倍である CA$80 を使い切り、Google の管理上では 21 件のインストールが出た。ところがアプリ側の管理パネルを見ると、記録されていたのは 1 件だけだった。

ズレの理由は、古いバージョンのアプリがインストール日時を報告しないことにあった。そこで生データを見直すと、その日新しく入った Android デバイスは 21 台あり、そのうち 20 台は、すでに Play Store が配信を止めた古いバージョンを動かしていた。つまり、Play からは入手できない版が端末に入っていたことになる。それでも、各端末のインストーラー表示は Google Play になっていた。しかも、それらはアプリを1回開くだけで、どの画面にも0秒しか滞在せず、二度と戻ってこなかった。端末のモデルは28種類、州は19にまたがっていたが、20台がまったく同じ動きをしていたのは不自然だった。

この2週間全体で見ると、課金対象になったインストールは56件。そのうち33件が同じような挙動を示し、さらに7件はキャンペーンの対象外の国から来ていた。残りの13人は実在のユーザーらしく、92ゲームを遊んでくれたという。ここは書き手にとって、アプリ自体が使われているという確かな手応えだった。

一方で、33件は人間の動き方に見えない。そこでボットファームを疑い、analytics の export を見ると、その推測を裏づける材料があった。Google は設定した目標に合わせて最適化する。今回は goal が installs だったため、ファーム側は広告の最短動画だけを見て、クリックはせず、保存済みのアプリファイルを使って Play Store ではなく別経路からインストールしたように見える。Google 側は「動画を見てからインストールされた」ものを conversion と扱うので、ファームが“インストール”を増やすほど、Google のアルゴリズムには良い広告配信に見えてしまう。結果として、広告はさらにそのファームへ流れ、またインストールが増える。広告費が無駄になることがほぼ保証された循環だ、と書き手は見ている。

今は、invalid-traffic form への Google の返答待ちで、キャンペーンの目標は「opened the app」ではなく「won a puzzle」に変えたという。アプリを開いて少し触るスクリプトは簡単でも、Sudoku を解くのは手間がかかる。つまり、次の狙いは「このアプリを農場で回すほうが、ほかのアプリより面倒だ」と思わせることだ。小規模アプリなら、それが一つの防御になるかもしれない、と書き手は考えている。

この事例が刺さるのは、広告の「正しい数字」が正しいとは限らないからだ

ここで面白いのは、Google の数字が完全な嘘だったわけではない点だと思う。21件という数自体が捏造だったわけではなく、Google の定義では確かにインストールとして数えられていた。問題は、その定義が人間の価値とずれていることだ。広告プラットフォームは、測れるものを最適化する。ところが、測りやすい指標ほど、悪意ある側にとっては操作しやすい。私はここにかなり古典的な落とし穴があると思う。クリック数、再生数、インストール数は、便利な反面、目的そのものではない。

Dayzle のケースでは、「インストールされたか」より「その後に使われたか」のほうが大事だった。実際、13人の本物のユーザーが 92 ゲームを遊んでいる。こちらが本当の成果だろう。広告の世界では、こうした深い行動ほど測定が難しいので、つい浅い数字に寄る。でも浅い数字は、今回のように簡単に歪む。小さなアプリほど広告費の絶対額は少なくても、1件あたりの損失率は痛い。だからこそ、規模の小さい開発者が最初に食らう被害としてはかなり現実的だと思う。

「Google Play がインストーラー」と出ても安心できないのが厄介だ

記事を読んでいて引っかかったのは、端末のインストーラー表示が Google Play だったことだ。普通なら、そこを見れば安心してしまいそうになる。でも実際には、Play Store がすでに配信していない旧版が入っていた。つまり、見えているラベルと、実際に何が起きたかは別物だったわけだ。これは広告計測だけでなく、配信経路の記録そのものにも不透明さが残っていることを示している。

この手の話は、アプリ開発者だけでなく広告主全体に効いてくると思う。なぜなら、対策の第一歩が「どこから来たか」を信じることなのに、その入口情報が当てにならないからだ。しかも、20台の端末が19の州、28種類のモデルに分かれていたという点も嫌らしい。あまりに均質な不正は見抜かれやすい。だからこそ、ばらけた形で紛れ込んでくると、機械的には本物に見えやすい。広告運用の世界では、こうした“もっともらしさ”がむしろ危険になる。

「開いた」ではなく「勝った」に変えた判断は、かなり現実的だと思う

書き手が目標を「opened the app」から「won a puzzle」に変えたのは、派手ではないが筋が通っている。アプリを起動させるだけなら、ボットでも模倣しやすい。だが、Sudoku を解くとなると話は違う。私はこれを、ボット対策というより「広告に向けて本当に欲しい行動を置き直した」動きだと見ている。単純なインストールではなく、価値ある利用に近い地点を計測目標に移したわけだ。

もちろん、これで完全に防げるとは限らない。意欲のある不正業者なら、もっと手間をかけるかもしれない。とはいえ、小さなアプリに対してそこまでやるコストを上げるだけでも意味はある。広告の世界では、相手にとって儲からない案件にするのが強い防御になることがある。Dayzle のような規模なら、技術的な検知だけでなく、経済的に割に合わない状態へ寄せるのは賢いと思う。

この話は「不正がある」より、「その不正が最適化ループに乗る」ことが怖い

一番ぞっとするのは、ボットファームが単に広告費を盗むのではなく、Google の最適化そのものを餌にしている点だ。通常、広告プラットフォームは学習して賢くなるはずだが、入力が汚れていると、賢さは逆に害になる。インストールが増えたように見えるほど、アルゴリズムはそこに配信を寄せる。するとボット側はもっと集まり、もっと“成果”を出す。仕組みが循環してしまう。

私はここに、今の広告配信の脆さが凝縮されていると思う。人間に届いたかではなく、イベントが発火したかで世界が回ると、悪意はそのイベントを再現する方向に進化する。しかも、被害を受ける側は、最初は成功しているように見えるので気づきにくい。13人の本物のユーザーがちゃんと遊んでいるのに、同時に33件の不自然な動きが混ざっている。良いデータと悪いデータが同じ指標に入ってくるから厄介なのだ。だから私は、この件を「小さなアプリの不運な事故」ではなく、アプリ広告全体の設計上の問題として受け止めたい。


参考: I spent $220 on Google app ads. 60% of the installs were robots.

同じ著者の記事