はじめに:勘の配分の限界
EC事業の広告費は、気づけば「去年と同じ配分」「なんとなく調子の良い媒体に厚め」という形で決まっていることが多いものです。
月初に予算会議をしても、最後は担当者の感覚で「リスティングを少し増やそう」「ディスプレイは横ばいでいいか」と落ち着く。これ自体が悪いわけではありません。経験のある担当者の勘は、実際にかなり当たります。
ただ、勘ベースの配分にはいくつか構造的な弱点があります。
- なぜその配分にしたのかを後から説明できない
- 配分を変えたとき、結果が良くなったのか悪くなったのかを切り分けられない
- 担当者が変わると、判断の基準ごと引き継げない
特に困るのは、媒体やキャンペーンが増えてきたときです。3媒体くらいまでは頭の中で管理できますが、検索・ショッピング・ディスプレイ・SNS・アフィリエイトと増え、それぞれに複数キャンペーンがぶら下がると、全体を俯瞰しての判断が難しくなります。
この記事では、過去の広告実績データをBigQueryに集約し、「どの媒体・キャンペーンに、あといくら足すと割に合うのか」を数字で考えるためのフレームワークを整理します。完璧な自動最適化を目指すものではなく、勘に「根拠」を一枚かませるための土台づくりです。
なお、媒体横断でROASを比較する全体像のダッシュボードについては「BigQueryとLooker Studioでチャネル横断のROASダッシュボードをつくる」で扱っています。こちらと合わせて読むと、集計から配分判断までの流れがつながります。
媒体×キャンペーン別の実績ROASをBigQueryで集計する
予算配分を数字で語る出発点は、媒体とキャンペーンの単位で実績を並べることです。
最低限そろえたい指標は次のとおりです。
- 広告費(コスト)
- コンバージョン数
- 売上(コンバージョン価値)
- ROAS(売上 ÷ 広告費)
これらを媒体・キャンペーンごとに集計します。多くのEC事業では、各媒体の管理画面からエクスポートしたデータ、あるいは各媒体のデータ転送機能を使って、BigQueryに広告実績テーブルを持っているケースが増えてきました。
ここでは、媒体名・キャンペーン名・日付・コスト・売上を持つ広告実績テーブルがあると仮定して、月単位で集計する例を示します。
月次の媒体×キャンペーン集計
SELECT
media,
campaign,
FORMAT_DATE('%Y-%m', date) AS month,
SUM(cost) AS cost,
SUM(revenue) AS revenue,
SAFE_DIVIDE(SUM(revenue), SUM(cost)) AS roas
FROM `your_project.ads.ad_performance`
WHERE date BETWEEN DATE_SUB(CURRENT_DATE(), INTERVAL 6 MONTH) AND CURRENT_DATE()
GROUP BY media, campaign, month
ORDER BY month DESC, cost DESC
SAFE_DIVIDE を使っているのは、コストが0の行で割り算がエラーにならないようにするためです。集計時には、こうした細かい防御を入れておくと運用が楽になります。
単月ではなく期間で見る
ROASは月によって振れます。セール月とそうでない月では、同じキャンペーンでも数字がまったく違います。
そのため、配分の判断材料にするときは単月だけを見ないことが大切です。直近数か月の平均と、月ごとのばらつきの両方を見ます。
WITH monthly AS (
SELECT
media,
campaign,
FORMAT_DATE('%Y-%m', date) AS month,
SUM(cost) AS cost,
SUM(revenue) AS revenue
FROM `your_project.ads.ad_performance`
WHERE date BETWEEN DATE_SUB(CURRENT_DATE(), INTERVAL 6 MONTH) AND CURRENT_DATE()
GROUP BY media, campaign, month
)
SELECT
media,
campaign,
COUNT(*) AS active_months,
SUM(cost) AS total_cost,
AVG(SAFE_DIVIDE(revenue, cost)) AS avg_monthly_roas,
STDDEV(SAFE_DIVIDE(revenue, cost)) AS roas_stddev
FROM monthly
GROUP BY media, campaign
HAVING total_cost > 0
ORDER BY total_cost DESC
roas_stddev(ばらつき)が大きいキャンペーンは、平均ROASが高くても安定しているとは限りません。配分を増やすかどうかは、平均とばらつきをセットで見ると判断を誤りにくくなります。
ここまでで、「どの媒体・キャンペーンが、どれだけのコストで、どれくらいのROASを、どれだけ安定して出しているか」という一覧が手に入ります。これが配分を考える土台です。
限界ROAS・頭打ちの考え方で再配分する
実績の一覧が出ても、「ROASが高い順に予算を寄せればいい」とはなりません。ここがEC広告の予算配分でいちばん誤解されやすいところです。
平均ROASと限界ROASは違う
平均ROASは、今までに使った広告費全体に対する売上の比率です。一方で予算配分を考えるときに本当に知りたいのは、「あと1万円足したら、その1万円はどれくらいの売上を生むか」です。これを限界ROASと呼びます。
多くのEC広告では、予算を増やすほど追加分の効率が下がっていきます。最初は買いたい人に届いていたのが、予算を増やすにつれて「そこまで買う気のなかった人」にも配信が広がるためです。これが「頭打ち」です。
つまり、平均ROASが高い媒体でも、すでに予算が頭打ちに近いなら、追加投資の効率(限界ROAS)は低いことがあります。逆に、平均ROASがそこそこでも、まだ伸びる余地がある媒体のほうが、追加分は割に合うことがあります。
過去データから頭打ちの兆候を読む
完璧な限界ROASを求めるのは難しいのですが、過去データから兆候を読むことはできます。
予算を増やした月と、その月のROASの動きを並べてみます。
WITH monthly AS (
SELECT
media,
FORMAT_DATE('%Y-%m', date) AS month,
SUM(cost) AS cost,
SUM(revenue) AS revenue
FROM `your_project.ads.ad_performance`
GROUP BY media, month
)
SELECT
media,
month,
cost,
revenue,
SAFE_DIVIDE(revenue, cost) AS roas,
cost - LAG(cost) OVER (PARTITION BY media ORDER BY month) AS cost_delta,
SAFE_DIVIDE(revenue, cost)
- LAG(SAFE_DIVIDE(revenue, cost)) OVER (PARTITION BY media ORDER BY month) AS roas_delta
FROM monthly
ORDER BY media, month
cost_delta(予算の増減)と roas_delta(ROASの増減)を並べると、傾向が見えてきます。予算を増やした月にROASが大きく下がっている媒体は、頭打ちが近いサインです。逆に、予算を増やしてもROASが落ちていない媒体は、まだ伸びしろがあると考えられます。
これはあくまで傾向の観察であって、厳密な因果ではありません。セールや季節要因も混ざります。それでも、「どの媒体がまだ余裕がありそうか」のあたりをつけるには十分役立ちます。
再配分の基本方針
ここまでの数字をもとにすると、再配分の方針はシンプルに整理できます。
- 限界ROASが目標を上回っていて、まだ頭打ちでない媒体・キャンペーンには予算を足す
- 予算を増やすとROASが大きく落ちる媒体は、現状維持か微減にとどめる
- 平均ROASが目標を継続的に下回っているものは、まず原因を確認してから削る
大事なのは、全体の予算を一度に大きく動かさないことです。たとえば各媒体の予算を月あたり10〜20%程度の範囲で動かし、翌月の数字を見てから次を判断します。小さく動かして観察を重ねるほうが、頭打ちの位置を実データで確かめながら進められます。
なお、キーワード単位まで踏み込んで「本当のROAS」を見たい場合は、「BigQueryでGoogle広告とGA4をつないでキーワード単位の本当のROASを見る」で扱っている考え方が役立ちます。媒体内の配分を詰めるフェーズで合わせて読むと、解像度が一段上がります。
シミュレーションの注意
過去データから「この媒体に予算を移したら、全体の売上はこう変わるはず」というシミュレーションを作りたくなります。考え方の整理には有効ですが、いくつか注意点があります。
第一に、過去のROASがそのまま将来も続くとは限りません。シミュレーションは「過去と同じ条件が続いた場合」の試算です。市場も競合も季節も動くので、計算結果は予測ではなく目安として扱います。
第二に、頭打ちを無視した単純な掛け算は危険です。「ROAS5の媒体に予算を2倍入れたら売上も2倍」という計算は、頭打ちを考慮していません。予算を増やせば限界ROASは下がるのが普通なので、増やした分は割引いて見積もるくらいが安全です。
第三に、媒体どうしは独立していません。検索広告を絞ったら、その需要の一部がショッピングやSNS経由に流れることがあります。媒体ごとに切り分けて足し算した結果が、全体ではそのとおりにならないことは珍しくありません。
第四に、コンバージョンの計測そのものにずれがあります。媒体ごとのアトリビューションの違いや計測の重複があると、媒体別ROASを単純に足すと売上を二重に数えてしまうことがあります。シミュレーションの前に、計測の前提をそろえておくことが欠かせません。
これらをふまえると、シミュレーションは「正解を出す装置」ではなく「仮説を整理する道具」と捉えるのが現実的です。試算で方向性のあたりをつけ、小さく動かして実データで確かめる。この往復を回すことが、結局いちばん確実です。
まとめ
EC広告の予算配分を、勘から「根拠のある勘」へ一段引き上げるための流れを整理しました。
- 媒体×キャンペーン別の実績ROASをBigQueryに集約し、平均とばらつきの両方で見る
- 平均ROASではなく限界ROASと頭打ちの観点で、追加投資が割に合うかを判断する
- 過去データから頭打ちの兆候を読み、予算は小さく動かして観察を重ねる
- シミュレーションは予測ではなく仮説整理の道具として扱い、計測の前提をそろえてから使う
このフレームワークの良いところは、判断の理由が数字として残ることです。なぜこの配分にしたのかを後から説明でき、結果が出たあとに振り返りもできます。担当者が変わっても、基準そのものを引き継げます。
最初から精緻な最適化を目指す必要はありません。まずは媒体別の実績を一枚の表にまとめ、「どこにまだ余裕がありそうか」を眺めるところから始めてみてください。それだけでも、予算会議の議論の質はかなり変わります。