投稿

8月, 2026の投稿を表示しています

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.na...

Google広告の曜日・時間帯別CPAをPythonで集計

イメージ
自動入札に任せているのに、曜日や時間帯でCPAがぶれる。そう感じる運用者は多い。Google広告の管理画面は曜日と時間帯を同時に見られず、168コマ(7曜日×24時間)の全体像がつかみにくい。ここではGoogle Ads APIとPythonで168コマを一括取得し、CPAの穴を見つけて入札調整へ落とすまでの手順を、実装でつまずく点も含めて示す。今日から自分のアカウントで再現できる。 自動入札の時代でも曜日・時間帯分析が効く理由 tCPAやコンバージョン最大化を使っていても、曜日・時間帯の分析は無駄にならない。理由は2つある。1つは、自動入札は過去データを学習するため、CVが薄い深夜帯に配信予算が漏れている期間が発生しうること。もう1つは、広告のスケジュール(ad schedule)による入札単価調整が、自動入札と併用できる場面が残っていることだ。 管理画面でも曜日別・時間帯別は見られるが、両者の掛け合わせは1画面に出ない。0-7時の日曜だけCPAが2倍、といった コマ単位の異常 は、168コマを一枚の表にして初めて見える。APIで取れば、この掛け合わせを一度に抜き出せる。 Google Ads APIで168コマを一括取得するGAQL Google Ads APIは、UI と違って1つのクエリに複数のセグメントを指定できる。曜日(segments.day_of_week)と時間帯(segments.hour)を同時に指定すれば、campaign リソースから168コマ分の行が返る。セグメントの仕様は公式のフィールド一覧(developers.google.com/google-ads/api/fields/v22/segments)で確認できる。 この記事で一番のアセットが次のGAQLだ。ブックマークして、campaign を ad_group に変えるなど自分の粒度に書き換えて使ってほしい。 SELECT campaign.name, segments.day_of_week, segments.hour, metrics.cost_micros, metrics.conversions, metrics.clicks FROM campaign WHERE segments.date DURING LAST_30_DAYS これを GoogleAdsServi...

Meta広告の重複をPythonで検知して分かった3つ

イメージ
Meta広告のCPAが下がらない。予算を足しても配信が伸びない。その原因が、実は自分の広告セット同士の「オーディエンス重複」にある場合は多い。同じユーザー層を複数の広告セットで狙うと、Metaのオークションで自社の広告が競合し、CPMが上がる。この記事では、広告マネージャの手動確認ではなく、Marketing APIとPythonで重複を検知する手順をまとめた。実運用で詰まった点も添える。 なぜ広告セットの重複がCPAを押し上げるのか オーディエンス重複とは、複数の広告セットが同一ユーザーを配信対象に含む状態を指す。重複率が高いと、Metaのオークションで自社の広告セット同士が入札を奪い合う。結果、CPMが上がりCPAも連動して悪化する。特にカスタムオーディエンスと類似オーディエンスを併用する構成で起きやすい。 広告マネージャにも「オーディエンスの重複を表示」機能はある。ただし手動で2つずつ選ぶ方式で、広告セットが10個を超えると現実的に回らない。運用規模が大きいほど、APIで一括取得して機械的に判定する価値が出る。手動確認の限界は Meta広告レポートをPythonで自動化する実装手順 でも触れたとおりだ。 Marketing APIで広告セットのtargetingを取得する 重複判定の入口は、各広告セットの配信条件(targeting)をAPIで取ることだ。エンドポイントは広告アカウント配下の adsets で、fields に name と targeting を指定する。1行で書くと GET https://graph.facebook.com/v20.0/act_アカウントID/adsets?fields=name,targeting,effective_status&access_token=トークン を叩けば、各広告セットのJSONが返る。 targetingの中で重複判定に効くキーは4つある。(1)geo_locations(地域)(2)age_min と age_max(年齢帯)(3)genders(性別)(4)custom_audiences と flexible_spec 内の interests(カスタム客層・興味関心)。特にcustom_audiencesのIDが複数の広告セットで一致していれば、それは明確な重複シグ...