Google広告の機会損失をPythonで可視化する実装
Google広告で「まだ伸ばせるはずなのに配信が頭打ち」と感じる場面は多い。その正体はたいてい機会損失、つまり出せたはずのインプレッションを取りこぼしている状態だ。管理画面でも数値は見えるが、複数アカウントを横断して毎日追うのは現実的でない。この記事では、インプレッションシェアをPythonで取得し、予算とランクどちらが原因かを自動で切り分ける実装を示す。読み終えれば、機会損失の可視化を定時実行に載せる下地ができる。
インプレッションシェアが機会損失を映す理由
インプレッションシェア(IS)は、出せたはずの表示回数のうち実際に出せた割合を示す。ISが60%なら、残り40%は何らかの理由で取りこぼしたことになる。つまりISは「配信の伸びしろ」を数値化した指標だ。運用者が本当に知りたいのは割合そのものより、失った40%の内訳である。
Google広告はこの内訳を2つに分けて提供する。予算不足で失った分と、広告ランク不足で失った分だ。前者は予算を積めば回収でき、後者は入札や品質の改善が要る。打ち手がまったく異なるため、混ぜて見てはいけない。
3つの指標で損失原因を切り分ける
Google Ads APIには機会損失を切り分ける3指標がある。search_impression_share(取れた割合)、search_budget_lost_impression_share(予算で失った割合)、search_rank_lost_impression_share(ランクで失った割合)だ。この3つはおおよそ「IS+予算ロス+ランクロス≒100%」の関係になる。合計がほぼ100%に収まるので、内訳の検算にも使える。
判断はシンプルだ。予算ロスが大きいキャンペーンは、予算を積めば素直に配信が伸びる見込みが高い。ランクロスが大きいなら、入札引き上げか広告文・品質スコアの改善が先だ。数値で原因を特定してから動くので、感覚頼みの増額を避けられる。この切り分けの実データ運用は広告の日予算を自動計算するPython実装と組み合わせると効いてくる。
PythonとGoogle Ads APIで取得する手順
取得はGAQL(Google Ads Query Language)で書く。キャンペーン単位なら次の一行で3指標がまとめて取れる。SELECT campaign.name, metrics.search_impression_share, metrics.search_budget_lost_impression_share, metrics.search_rank_lost_impression_share FROM campaign WHERE segments.date DURING LAST_30_DAYS —— これを google-ads ライブラリの GoogleAdsService.search に渡すだけでよい。返り値の各指標は0〜1の小数なので、100倍して%表示に直す。
手順は3段だ。(1)認証情報(developer_token・OAuthのrefresh_token・customer_id)を用意する。(2)上のGAQLを文字列で組み、customer_idを指定してsearchを実行する。(3)行ごとにcampaign.nameと3指標を取り出し、予算ロスの降順で並べる。並べ替えまで入れると、朝いちばんに「今日いちばん取りこぼしているキャンペーン」が先頭に来る。APIの初回接続でつまずくならGoogle広告APIをPythonで動かす手順と初回の壁を先に読むと早い。
この手順の完全版(認証コードとロスト率の判定ロジックつき)はnoteの実践ガイドにまとめている。
つまずいた「Selectable With」制約と対処
実装で最初に詰まるのがフィールドの同時取得制約だ。search_budget_lost_impression_share は、公式が定める「Selectable With」の一覧に載ったフィールドとしか同じSELECTに並べられない。無関係な指標やセグメントを一緒に入れると、クエリがエラーで弾かれるか、値が0で返る。管理画面と数字が合わない、という相談の多くはこれが原因だ。
対処は2つある。まずインプレッションシェア系の3指標は、余計な指標を混ぜず単独のクエリで取ること。次に、日別の推移が欲しいときだけ segments.date を足し、それ以外のセグメントは別クエリに分けること。公式のフィールドリファレンス(developers.google.com のfields/campaign)で「Selectable With」を確認してから列を足すと、この0埋まり事故を避けられる。
取得データから打ち手を決める
数値が出たら判断表に落とす。予算ロスが10%を超え、かつ目標CPA内で回っているキャンペーンは増額の第一候補だ。逆にランクロスが20%を超えるなら、増額しても表示が伸びにくいので入札か品質を先に触る。この2軸で毎日仕分ければ、限られた予算を伸びしろの大きい枠に寄せられる。
ブックマークして、自分の環境に合わせて書き換えて使ってほしい。判定チェックリストは次の通り。(1)予算ロス>10%かつCPA目標内→増額候補、(2)ランクロス>20%→入札・品質改善が先、(3)IS>90%→伸びしろ小・現状維持、(4)3指標の合計が100%から大きくずれる→クエリのSelectable With制約を疑う。
取得した機会損失をクライアント共有用のレポートにまとめる段では、資料作成を時短できるAIツールも併用したい。以下が使える。
まとめ
機会損失は「取れなかった割合」で終わらせず、予算ロスとランクロスに切り分けてはじめて打ち手に変わる。Google Ads APIの3指標をPythonで毎日取れば、増額すべき枠と入札を直すべき枠が自動で並ぶ。まずは1アカウントで上のGAQLを流し、Selectable With制約に注意しながら数字を管理画面と照合するところから始めるとよい。
実務でそのまま使いたい人へ
本記事の手法の完全版(実際のコード・テンプレート・つまずき対処つき)は、運営者のnote(note.com/ryo_ai_hack)で公開している。実データに基づく実践ガイドをまとめて読める。

コメント
コメントを投稿