広告主の来月の広告予算を、媒体・キャンペーンごとの過去の成績と季節の動きから見込んで配分の案にし、提案資料の下書きにする
広告主ごとに、媒体・キャンペーン別の過去24か月の成績から、来月の予算をどう分ければ成果がいちばん出そうかを見込みます。配分の案と見込みの幅を表にし、広告主に渡す提案資料の下書きまで作ります。
- 生成AI
- ChatGPT/Claude/Gemini
- 連携・自動化
- Google Apps Script/Make/n8n
- 対象業界
- EC/IT・SaaS/小売/広告
- 対象部門
- マーケティング/営業
- 対象業務
- 書類作成/集計・分析
- 主な課題
- データ分析に時間がかかる/判断に時間がかかる/属人化している
- AIで行う処理
- 予測
- 主な効果
- 判断支援/属人化解消/工数削減
- 導入難易度
- ★★★★☆
- 実装レベル
- 本格構成
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 担当者が各媒体の管理画面に入り、広告主のキャンペーン別・月別の成績をCSVで書き出す
- 媒体ごとに違う列の名前をそろえ、1つのスプレッドシートに貼り付ける
- 前年同月と直近3か月の数字を並べ、キャンペーンごとの獲得単価の動きを見る
- 経験から「このキャンペーンはまだ伸ばせる」「これは頭打ち」と見当を付け、配分の案を作る
- 案の合計が予算の総額に合うよう、端数を手で直す
- 提案資料のスライドに、配分の表と、なぜその配分にしたかの説明を書く
- 上長が見て、広告主へ送る
- 人担当者が各媒体の月別・キャンペーン別のCSVを、広告主ごとのフォルダに置く
- 人広告主から聞いた来月の予算の総額と、外せない条件(止めるキャンペーン、最低限の出稿額)を条件の表に入れる
- 自動毎月15日の朝にスクリプトが動き、CSVを1つの表にそろえ、列の名前と税の扱いを統一する
- 自動データの月数、欠けている月、急な変化がある月を調べ、見込みに使える状態かを判定する
- 自動Gemini API がコード実行の機能で、キャンペーンごとの効き方と季節の動きをあてはめ、来月の見込みの幅を出す
- 自動同じコードで、予算の総額と条件の範囲で配分の案を作る
- 自動スクリプトが配分の合計と条件を検算する
- 自動Gemini API が、配分の案と見込みから提案資料の説明文の下書きを構造化して返す
- 人担当者が配分の案と見込みの幅を確かめ、広告主の事情に合わせて直す
- 人上長が提案資料を確かめ、広告主へ送る
各工程の詳しい説明を読む
- 担当者が各媒体の管理画面に入り、広告主のキャンペーン別・月別の成績をCSVで書き出す
- 媒体ごとに違う列の名前をそろえ、1つのスプレッドシートに貼り付ける
- 前年同月と直近3か月の数字を並べ、キャンペーンごとの獲得単価の動きを見る
- 経験から「このキャンペーンはまだ伸ばせる」「これは頭打ち」と見当を付け、配分の案を作る
- 案の合計が予算の総額に合うよう、端数を手で直す
- 提案資料のスライドに、配分の表と、なぜその配分にしたかの説明を書く
- 上長が見て、広告主へ送る
(a)見込みの立て方が人によって違う。 前年同月を重く見る人、直近の3か月を重く見る人、獲得単価だけを見る人がいます。同じ広告主を担当が替わって引き継ぐと、配分の考え方が月ごとに変わります。 広告主から見ると、説明の筋が毎月違って見えます。
(b)頭打ちが見えない。 獲得単価が安いキャンペーンほど予算を足したくなりますが、予算を倍にしても成果は倍になりません。 過去に予算を増やした月の数字を探せば効き方は分かるのですが、24か月分を30本について見る時間はありません。
(c)季節の動きを数字で入れていない。 学習塾なら春と夏、不動産なら1〜3月、通販なら年末に成果が動きます。担当者は覚えていますが、どれくらい動くかは数字で持っていません。 来月の見込みに季節の分を足すか引くかは、その人の記憶しだいです。
(d)説明の資料が作業の半分を食う。 配分の案ができても、広告主に渡すには「なぜこの配分か」を文章にしなければなりません。数字を見ながら説明を書き、表を作り直す作業が、1社あたり40分かかっています。
- 【人】 担当者が各媒体の月別・キャンペーン別のCSVを、広告主ごとのフォルダに置く
- 【人】 広告主から聞いた来月の予算の総額と、外せない条件(止めるキャンペーン、最低限の出稿額)を条件の表に入れる
- 【自動】 毎月15日の朝にスクリプトが動き、CSVを1つの表にそろえ、列の名前と税の扱いを統一する
- 【自動】 データの月数、欠けている月、急な変化がある月を調べ、見込みに使える状態かを判定する
- 【自動】 Gemini API がコード実行の機能で、キャンペーンごとの効き方と季節の動きをあてはめ、来月の見込みの幅を出す
- 【自動】 同じコードで、予算の総額と条件の範囲で配分の案を作る
- 【自動】 スクリプトが配分の合計と条件を検算する
- 【自動】 Gemini API が、配分の案と見込みから提案資料の説明文の下書きを構造化して返す
- 【人】 担当者が配分の案と見込みの幅を確かめ、広告主の事情に合わせて直す
- 【人】 上長が提案資料を確かめ、広告主へ送る
9番目は省けません。 広告主が来月に新商品を出す、競合が値下げした、といった事情はデータに入っていません。配分の案は「過去の数字だけから言えること」で、そこに広告主の事情を重ねるのは担当者の仕事です。
7番目を、AIではなくスクリプトの検算にしているのは意図してのことです。 配分の合計が予算と1円でもずれていれば、提案として成り立ちません。AIが出した数字を、AIに確かめさせることはしません。
02今回想定するシステム構成
各媒体の管理画面(検索・SNS・ディスプレイ) │ 月別・キャンペーン別のCSVを書き出す ▼ Google ドライブ(広告主ごとのフォルダ)+ 条件の表 │ ▼【トリガー】毎月15日の朝(時間主導型トリガー) Google Apps Script ├──▶ CSVを1つの表にそろえる(列名・税・通貨の統一) ├──▶ データの月数・欠け・急変を確かめる ▼ Gemini API(コード実行) │ ① キャンペーンごとの効き方(予算を足したときの成果の伸び) │ ② 季節の係数 │ ③ 来月の見込みの幅 │ ④ 総額と条件の範囲での配分の案 ▼ Google Apps Script ── 合計と条件の検算 ▼ Gemini API(構造化出力)── 提案資料の説明文の下書き ▼ Google スプレッドシート(配分の案と見込みの一覧) ├──▶【担当者】広告主の事情を重ねて直す └──▶【上長】確かめて広告主へ
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 処理 | Gemini API(コード実行による見込みと配分、説明文の下書き) | Claude API、OpenAI API |
| 連携 | Google Apps Script | Make、n8n |
| 集計 | Google スプレッドシート | BigQuery |
| 保管 | Google ドライブ | SharePoint、Box |
媒体の管理画面には、この構成から何も書き込みません。 配分の案が通っても、予算の設定を変えるのは担当者です。書き込みまで自動にすると、広告主の了承を取る前に予算が動く経路ができてしまいます。
土台になるのは、Gemini API のコード実行の機能です。 モデルが Python のコードを生成して実行し、その結果から学びながら最終的な出力にたどり着く仕組みとされています。実行の環境には numpy、pandas、scikit-learn、scipy などのライブラリが入っており、CSVとテキストのファイルを入力にできます。入力できるファイルの大きさはモデルのトークンの枠で決まります。
制約もはっきりしています。 実行できる言語は Python だけで、コードの実行時間は最大30秒です。コードがエラーになったときは、モデルがコードを作り直すことがあり、それは最大5回までとされています。1回で24か月×30本程度の表をあてはめる計算は、この枠に収まる大きさです。
費用の面では、コード実行を有効にすること自体に追加の料金は無いとされています。生成されたコードと実行結果は出力のトークンとして数えられ、通常の料金で課金されます。
説明文の下書きには、構造化出力を使います。 応答を JSON Schema に沿った形で返させる機能で、enum で値を決まった選択肢に限れます。ただし公式の案内は、出力が文法として正しいJSONであっても、値はアプリケーションの側で必ず検証するよう求めています。
つなぎは Google Apps Script です。 時間主導型のトリガーは、毎分から月1回までの間隔で動かせます。1回の実行は6分までなので、40社を一度に処理せず、5社ずつに分けて続きを次の実行に渡します。
03どうやって実装するのか
処理の起点を決める
毎月15日の朝7時に、時間主導型のトリガーで動かします。 提案の締め切りが20日前後なので、15日に案が出れば担当者が直す時間が3営業日ほど残ります。前月の成績が媒体の側で確定するのを待つ必要もあり、月初には動かしません。
1回の実行は6分までなので、1回で5社を処理し、処理済みの広告主をスプレッドシートの管理表に記録して、次の実行で続きから始めます。 続きの実行は10分おきのトリガーで拾い、未処理の広告主が無くなったらそのトリガーを止めます。40社は8回の実行で終わります。
トリガーは作った人のアカウントで動きます。 担当者が異動するとトリガーごと止まるので、運用部の共有アカウントで作り、その旨を管理表に書いておきます。
CSVの置き忘れに備え、15日の時点でフォルダが空の広告主は処理せず、管理表に「データ未着」と残して担当者へ知らせます。 置かれた時点で手動で1社だけ流せるよう、広告主の番号を指定して動かす関数も用意します。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 成績のCSV | 月、媒体、キャンペーン、費用、表示回数、クリック数、成果の件数、成果の金額 | 各媒体の管理画面から書き出し |
| 条件の表 | 来月の予算の総額、止めるキャンペーン、キャンペーンごとの最低額と上限額、増減の幅の上限 | 担当者が入力 |
| 出来事の表 | 過去の月にあった特別な事情(セール、在庫切れ、計測の不具合、媒体の仕様変更) | 担当者が入力 |
| 列名の対応表 | 媒体ごとの列の名前と、統一後の名前、費用に税が入っているか | 運用部で1回作る |
質を決めるのは、出来事の表です。 在庫切れで2週間止めた月や、計測のタグが外れて成果が0件になった月をそのまま入れると、その月を「予算を減らしたら成果が落ちた月」として学んでしまいます。 出来事の表で、その月を見込みの材料から外します。
条件の表の「増減の幅の上限」は必須にします。 既定は前月比でプラスマイナス30%です。過去に経験したことの無い予算の水準まで、見込みを伸ばさないための枠です。
データの取得方法を決める
媒体のAPIから直接取るのではなく、管理画面から書き出したCSVを使います。 媒体ごとにAPIの使い方も認証も違い、40社分をつなぐ開発は大きくなります。月1回の処理なので、書き出しの手間は1社あたり数分に収まります。
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 月別・キャンペーン別の成績 | 広告主のフォルダのCSV | 効き方と季節の係数のあてはめ |
| 予算の総額と条件 | 条件の表 | 配分の上限・下限と合計 |
| 除外する月 | 出来事の表 | あてはめから外す月の印 |
| 列名と税の扱い | 列名の対応表 | CSVの統一 |
スクリプトはフォルダのCSVを読み、列名の対応表で名前を統一し、費用を税抜きにそろえ、1つの縦長の表(月×キャンペーン)にします。 この表をCSVの文字列にして、Gemini API へ渡します。
キャンペーンの名前は、途中で変わることがあります。 名前ではなく媒体の側のキャンペーンIDで突き合わせ、名前が変わったものは最新の名前に寄せます。
AIへ渡す前に整形する
- 列と単位の統一 … 列名の対応表で名前をそろえ、費用を税抜きの円にそろえます
- 月数の確認 … キャンペーンごとに何か月分のデータがあるかを数えます。13か月未満のものは季節の係数を出さない印を付けます
- 欠けた月の確認 … 途中で配信を止めた月は0ではなく「欠け」として扱います
- 除外する月の印 … 出来事の表に載った月を、あてはめから外す印を付けます
- 急変の検知 … 前月比で成果の単価が3倍以上になった月を一覧にし、出来事の表に載っていないものは担当者に知らせます
- 少なすぎるキャンペーンの束ね … 月の費用が少額で成果が月数件のものは、媒体ごとに1本へまとめて扱います
- 条件の確認 … 最低額の合計が総額を超えていないか、止めるキャンペーンに最低額が入っていないかを確かめます
5番目を軽く見ないでください。 急変のうち多いのは計測の不具合で、数字の上では「急に効かなくなったキャンペーン」に見えます。 そのまま入れると、配分の案がそのキャンペーンから予算を引き上げます。
7番目で矛盾が見つかったら、その広告主は処理しません。 条件が成り立たないまま配分を出しても、担当者が条件を直して出し直すことになるだけです。
AIに処理させる
させるのは、コードを書いて走らせ、次の4つを数字で出すことです。 文章で「伸ばせそう」と書かせることはしません。
| 出すもの | 中身 | 判断できないときの扱い |
|---|---|---|
| 効き方 | キャンペーンごとに、月の費用と成果の件数の関係を、費用を足すほど伸びが鈍る形の式であてはめる | 費用の幅が狭く形が決まらなければ flat とし、配分を動かさない |
| 季節の係数 | 前年と前々年の同じ月の、年平均に対する比 | 13か月未満なら none とし、係数を1にする |
| 来月の見込み | 配分後の費用での成果の件数と、その幅(下限と上限) | 幅が見込みの半分を超えたら wide の印 |
| 配分の案 | 総額と条件の範囲で、追加の1万円あたりの成果が各キャンペーンでそろうように分けた額 | 条件で動かせないものは現状の額のまま |
配分の考え方は、「最後に足した1万円が、どのキャンペーンでも同じくらいの成果を生む」ところを探すことです。 獲得単価の平均が安いところに全部寄せるのではなく、伸びが鈍ってきたところから、まだ伸びるところへ少しずつ移します。 これが第3章の(b)の頭打ちへの答えです。
| させないこと | 理由 |
|---|---|
| 予算の総額を変える提案 | 総額は広告主が決めるもの |
| 過去に経験の無い水準まで費用を伸ばす | 当てはめた式の外側は、根拠が無い |
| 除外した月を勝手に戻す | 出来事の表は担当者の判断 |
| 媒体の仕様変更や競合の動きを推測で足す | データに無い事情を数字に混ぜない |
| 見込みを1つの数字だけで出す | 幅を落とすと、確かさの違いが消える |
2行目がいちばん大事です。 費用を足すほど伸びが鈍る式でも、過去に月50万円までしか出したことの無いキャンペーンに150万円を入れた見込みは、式の外側の当て推量です。 条件の表の「増減の幅の上限」と、過去の最大額の1.3倍のどちらか小さいほうを、配分の上限にします。
指示内容を固定する
あなたは広告の運用担当として、来月の予算の配分の案を作ります。
必ず Python のコードを書いて実行し、数字はすべてコードの実行結果から出してください。
文章で見当を付けた数字を書かないでください。
【入力】
- 成績の表(CSV):month, media, campaign_id, campaign_name, cost, impressions,
clicks, conversions, conversion_value, exclude_flag
- 条件:total_budget, campaign_limits(最低額・上限額), stop_campaigns,
max_change_ratio(前月比の増減の上限)
【手順】
1. exclude_flag が 1 の月をあてはめから外す。
2. キャンペーンごとに、月の cost と conversions の関係を
conversions = a × log(1 + cost / b) の形であてはめる。
cost の最大と最小の比が 1.5 未満のものは形が決まらないので fit_status を flat にする。
3. 季節の係数を、前年と前々年の同じ月の、年平均に対する比の平均で出す。
13か月未満のキャンペーンは seasonality_status を none にし、係数を 1 にする。
4. 来月の見込みを、あてはめた式 × 季節の係数で出す。
残差のばらつきから、見込みの下限と上限も出す。
5. total_budget の範囲で、追加の1万円あたりの成果がそろうように配分する。
- stop_campaigns は 0 円。flat のものは前月の額のまま。
- 各キャンペーンの額は、前月の額 × (1 ± max_change_ratio) と、
過去の最大の月の費用 × 1.3 のうち、より狭い範囲に収める。
- 合計は total_budget と一致させる。1,000円単位で丸め、端数は最も効く1本で調整する。
6. 結果を表にして出す。
【厳守事項】
- 入力に無い事情(新商品、競合、媒体の仕様変更)を推測で数字に入れない。
- total_budget を変える提案をしない。
- 見込みは必ず下限と上限を付ける。1つの数字だけで出さない。
- あてはめができなかったものを、できたものとして扱わない。
- コードがエラーになったときは、その旨と原因を書く。直せなければ数字を出さない。
【成績の表】{csv}
【条件】{constraints}
「数字はすべてコードの実行結果から出す」を最初に置かないと、モデルはコードを走らせる前に「おおむね20%増が妥当」と書き始めることがあります。文章で出た数字と、コードの結果が食い違う提案書が、いちばん困ります。
手順5の「より狭い範囲に収める」は、第7章のAIに何をさせるのかの2行目をそのまま式にしたものです。 言葉で「無理に伸ばさない」と書くより、上限の計算式を渡すほうが確実に守られます。
出力形式を固定する
コード実行の結果を、次の形のJSONで受け取ります。 説明文の下書きは別の呼び出しで、構造化出力で返させます。
{
"client_id": "",
"target_month": "2026-11",
"total_budget": 0,
"campaigns": [
{
"campaign_id": "",
"media": "",
"fit_status": "ok | flat | insufficient",
"seasonality_status": "ok | none",
"seasonal_factor": 1.0,
"last_month_cost": 0,
"proposed_cost": 0,
"change_ratio": 0.0,
"forecast_conversions": { "low": 0, "mid": 0, "high": 0 },
"range_flag": "normal | wide",
"cap_reason": "max_change | history_max | none"
}
],
"allocation_sum": 0,
"code_errors": []
}
1つ目の理由は、検算をスクリプトでできることです。 allocation_sum と total_budget の一致、各キャンペーンの change_ratio が上限の内にあるか、stop_campaigns が0円か、をスクリプトが確かめます。1つでも外れていれば、その広告主の結果は使わず、担当者に回します。
2つ目は、cap_reason で「なぜこの額で止めたか」が読めることです。 担当者が「もっと伸ばせるのでは」と思ったとき、history_max なら過去の最大額で止めた、max_change なら増減の上限で止めた、と分かります。
説明文の下書きは、次の形で返させます。
| 項目 | 中身 |
|---|---|
summary | 配分の要点を3文で |
increase_reasons | 予算を増やすキャンペーンごとの理由 |
decrease_reasons | 減らすキャンペーンごとの理由 |
caveats | wide や none のキャンペーン、除外した月についての注意書き |
tone | enum:standard / conservative |
説明文には、JSONの数字だけを使わせます。 下書きに入った数字がJSONの値と一致するかを、スクリプトが文字列で照らします。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| Google ドライブ | Apps Script から読み取り | 広告主ごとのCSVを読む |
| 条件の表・出来事の表 | スプレッドシートの読み取り | 総額、条件、除外する月 |
| Gemini API | Apps Script から呼び出し | コード実行による見込みと配分、説明文の下書き |
| 配分の一覧 | スプレッドシートへの書き込み | 広告主ごとの案、見込みの幅、注意書き |
| 提案資料 | 担当者が貼り付け | 一覧の表と下書きを資料に移す |
提案資料のスライドへは、自動で書き込みません。 広告主ごとに資料の書式が違い、自動で埋めると書式を直す手間のほうが大きくなります。一覧から表と文章を貼り付けるのは、1社あたり数分です。
媒体の管理画面への書き込みも行いません。 第6章のとおり、予算の設定を変えるのは、広告主の了承を取った後の担当者です。
人が確認する
担当者が見るのは、配分の案のうち次の3つです。
- 前月から大きく動くキャンペーン …
change_ratioがプラスマイナス15%を超えるもの。理由がデータの上で納得できるかを確かめます wideとnoneの印が付いたもの … 見込みが不確かなもの。広告主に出す前に、配分を前月寄りに戻すかを決めます- 広告主の事情 … 新商品、セール、在庫の見通しなど、データに無い事情を重ねて直します
直したら、直した理由を一覧の欄に書きます。 翌月の実績と比べたとき、AIの案と担当者の修正のどちらが当たったかを見るためです。
上長は、提案資料の文章と数字の一致を見ます。 説明文の下書きは数字を照らしてありますが、担当者が直した後に食い違うことがあります。
目標は、1社あたり60分です。 そのうち40分が配分の案の確認と修正、20分が提案資料の仕上げという想定です。新しい広告主や、媒体を入れ替えた広告主は60分を超えます。
例外に対処する
| 起きること | 対応 |
|---|---|
| CSVがフォルダに無い | 処理せず「データ未着」と記録し、担当者へ知らせる |
| 列名が対応表に無い | 処理を止め、列名を一覧に出す。対応表に足してから再実行 |
| 最低額の合計が総額を超える | 条件の矛盾として担当者へ戻す |
| コードの実行が30秒を超える | キャンペーンを媒体ごとに分けて実行し直す |
| コードがエラーのまま終わる | code_errors に記録し、その広告主は手作業に戻す |
| 合計が総額と合わない | 結果を使わず、担当者に回す |
| 新しいキャンペーンで過去のデータが無い | insufficient とし、条件の表の額のまま置く |
| 計測の不具合が疑われる月がある | 急変の一覧に出し、出来事の表への記入を頼む |
| 説明文の数字がJSONと合わない | 下書きを捨て、もう一度生成させる。2回目も合わなければ下書きなし |
4行目と5行目は、ほとんどがデータの大きさの問題です。 30本を超えるキャンペーンを持つ広告主では、媒体ごとに分けて実行し、最後の配分だけを全体で行う形にします。
最後の行で「下書きなし」を選べるようにしておくのが大事です。 数字の合わない説明文を直すより、担当者が一から書くほうが早く、安全です。
記録を残す
- 統一した後の成績の表(広告主ごと・月ごと)
- Gemini API が書いたコードの全文と、その実行結果
- 配分の案のJSONと、検算の結果
- 説明文の下書きと、数字の照合の結果
- 担当者が直した箇所と、その理由
- 翌月の実績と、案・修正後の見込みとの差
2つ目のコードの全文を残すのは、見込みの根拠を後から説明するためです。 広告主から「なぜこの配分だったのか」と聞かれたとき、どの式で、どの月を外して、どう計算したかをそのまま示せます。
最後の行が、この構成を育てる材料です。 3か月分たまると、どのキャンペーンで見込みが外れやすいか、担当者の修正がどちらに寄りがちかが見えます。
保管の期間は、広告主との契約に合わせます。 成績の表とコードは、取引が続くあいだは翌年の季節の係数の材料になります。取引が終わった広告主のデータは、契約で決めた期間を過ぎたらフォルダごと消し、消したことを管理表に残します。
04実装レベルの3段階
最小構成は、40社には使えません。 1社ずつ手で表をそろえるので、確かめるための段階です。 半自動化で、1社180分が100分程度になります。 表の整形と見込みの計算は自動になりますが、説明文と検算が手作業で残ります。本格構成で60分になり、この段階が本記事の想定です。 差が大きいのは、提案資料の説明文を一から書く時間が、下書きの手直しに変わるからです。 段階を飛ばさないでください。 半自動化で2〜3か月回すと、どの広告主の見込みが外れやすいか、出来事の表に何が足りないかが分かります。そこを直してから説明文の下書きまで自動にするほうが、広告主に出す文章の手直しが減ります。
05工数削減シミュレーション
導入後 40件 × 60分 ÷ 60 = 40 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 運用型広告を複数の媒体で回している広告主を数十社持ち、毎月の予算の配分を担当者が前年同月の表と勘で決めている広告代理店やインハウスのマーケティング部門。媒体ごとの成績を月別にCSVで書き出せ、少なくとも13か月分のデータが残っている場合。配分の根拠を広告主に説明する資料づくりに、毎月まとまった時間を取られている場合。
- 媒体が1つだけ、またはキャンペーンが数本で、配分の選択肢がほとんど無い場合。開始から1年未満で季節の動きを見る材料が無い広告主ばかりの場合。テレビ・交通広告など、月ごとの成果を数字で取れない出稿が中心の場合。なお、来月の予算の総額をいくらにするか、配分を広告主にどう約束するかの判断は、この構成では代替できません。
07最小構成で試す方法
- 担当している広告主から、媒体が3つ以上あり、24か月分のデータがある1社を選ぶ
- その広告主の月別・キャンペーン別のCSVを媒体ごとに書き出し、手で1つの表にそろえる
- 先月より前のデータだけを使い、コード実行を有効にした Gemini API を手元から1回呼んでCSVを渡す
- 「キャンペーンごとに費用と成果の関係を伸びが鈍る式であてはめ、季節の係数を掛けて、先月の予算の総額で配分の案と見込みの幅を出してください。数字はコードの実行結果から出してください」と指示する
- 出てきた見込みを、先月の実際の成績と突き合わせる
先月を「答え」として隠して試すのが要点です。 先月の予算と実績はもう分かっているので、見込みの幅に実績が入ったかどうかで、この方法が使えそうかを判断できます。
| 出てきた内容 | 判断 |
|---|---|
| 実績がおおむね見込みの幅に入った | スクリプトでの自動化に進む |
| 幅が広すぎて使えない | 月数が足りないか、除外すべき月が混ざっている |
| 外れたキャンペーンが計測の不具合の月を含んでいた | 出来事の表の整備が先 |
3行目は、多くの広告主で一度は出ます。 失敗ではなく、過去のデータのどこに使えない月があるかが分かったということです。 出来事の表を埋めてから、同じ1社で試し直してください。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 文章で数字を出し、コードの結果と食い違う | 数字はコードの実行結果からのみ、を指示の最初に置く |
| 計測の不具合の月を「効かなくなった月」として学ぶ | 急変の一覧と出来事の表で、その月を外す |
| 過去に無い水準まで予算を伸ばす | 過去の最大額の1.3倍と増減の上限の、狭いほうで止める |
| 季節の係数がデータ1年分だけで決まる | 13か月未満は係数を1にし、none の印を付ける |
| 媒体ごとに費用の税の扱いが違う | 列名の対応表に税の有無を持たせ、税抜きにそろえる |
| キャンペーン名の変更で別物として扱う | キャンペーンIDで突き合わせる |
| 30秒の実行時間を超える | 媒体ごとに分けて実行し、配分だけを全体で行う |
| 6分の実行時間で40社が終わらない | 5社ずつ処理し、続きを次の実行に渡す |
| 配分の合計が総額と合わない | スクリプトで検算し、合わなければ使わない |
| 説明文の数字が配分の案と違う | 数字を照らし、合わなければ下書きを捨てる |
| 担当者の修正が記録されない | 修正の理由の欄を必須にする |
| 見込みを広告主に約束として伝える | 資料には幅を載せ、見込みであることを書く |
上の3行が、この構成の失敗のほとんどです。 どれも、数字がどこから来たかが分からなくなることから起きます。コードの全文を残し、検算をスクリプトで行い、外した月を記録しておけば、後からたどれます。
最後の行も、早いうちに効いてきます。 見込みの真ん中の数字だけを資料に載せると、広告主はそれを目標として受け取ります。外れたときの説明が、削減した時間よりはるかに重くなります。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 広告主ごとの媒体別の費用、成果の件数と金額、キャンペーンの名前(新商品や販促の計画が分かることがある)、来月の予算の総額です。
- 広告主ごとの契約で、データを外部のサービスへ渡してよいかを確かめる … 成果の金額は広告主の売上に近い数字です。守秘の取り決めの中で、生成AIのAPIへ渡すことが許されているかを先に確かめます
- キャンペーンの名前を伏せられるようにする … 名前に未発表の商品名が入っていることがあります。計算に名前は要らないので、IDだけで渡す設計にできます
- 広告主をまたいでデータを混ぜない … 1回の呼び出しには1社分だけを渡します。他社の数字が見込みに混ざると、守秘の問題であり、見込みの誤りでもあります
- 見込みを約束として扱わない … 資料には幅を載せ、過去の数字から出した見込みであり、成果を保証するものではないことを書きます
- 予算の設定を自動で変えない … 媒体の管理画面への書き込みは、広告主の了承を取った後に担当者が行います
- コードと結果を残す … 配分の根拠を広告主に説明できるよう、コードの全文と実行結果を保管します
誤りが起きた場合のリスクは、効かないキャンペーンへ予算を寄せてしまうことと、広告主に見込みを約束してしまうことの2つです。 前者は除外する月の扱いと上限の規則で防ぎ、後者は資料の書き方で防ぎます。どちらも、AIの精度ではなく、数字の出どころを示し続けることで守ります。
10まず何から始めるか
1週目:列名の対応表を作る
運用している媒体ごとに、CSVの列の名前、費用に税が入っているか、通貨の書き方を一覧にします。ここが無いと、どの広告主のデータもそろいません。 運用部で1回作れば、以後は媒体の仕様が変わったときに直すだけです。
2週目:1社で試す
24か月分のデータがある1社を選び、先月を隠してコード実行で見込みと配分を出します。見込みの幅に先月の実績が入ったかを最優先で見ます。
3週目:配分の規則を決める
増減の上限、過去の最大額に対する上限、wide とする幅を運用部で決めます。 あわせて、担当している広告主の出来事の表を埋め始めます。
4週目:スクリプトでCSVの統一から配分の一覧までをつなぐ
フォルダのCSVを読み、統一し、Gemini API を呼んで配分の一覧に書き出すところまで作ります。この時点では説明文の下書きを出さず、配分の案と見込みだけを担当者が見ます。
2か月目: 月次のトリガーで全社を処理し、検算を足します。担当者の修正の理由を記録し始めます。3か月目以降: 説明文の下書きを足し、翌月の実績との突き合わせを始めます。見込みが外れやすいキャンペーンの傾向が見え、配分の規則を1度見直した時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
| Gemini API のコード実行が、モデルに Python のコードを生成・実行させ、結果から学びながら最終の出力に至る仕組みであること。実行できるのは Python だけであること。numpy、pandas、scikit-learn、scipy などのライブラリが使えること。実行時間が最大30秒で、エラー時のコードの作り直しが最大5回であること。CSVとテキストのファイルを入力でき、大きさはモデルのトークンの枠で決まること。有効にすること自体に追加の料金は無く、生成されたコードと実行結果が出力のトークンとして課金されること | Google AI for Developers: Code execution | 2026-10-06 |
構造化出力が JSON Schema に沿った応答を返させる機能で、抽出や分類に向くこと。enum、required、minimum/maximum などが使えること。出力が文法として正しいJSONでも値はアプリケーションで検証するよう求めていること。大きすぎる・深すぎるスキーマは拒否されうること | Google AI for Developers: Structured outputs | 2026-10-06 |
| 時間主導型のトリガーが毎分から月1回までの間隔で動かせること。トリガーは作成者のアカウントで動くこと | Google Apps Script: Installable Triggers | 2026-10-06 |
| スクリプトの実行時間が1回6分までであること。URL Fetch の呼び出し回数と1回あたりの大きさの上限 | Google Apps Script: Quotas for Google Services | 2026-10-06 |
来月の予算の総額と、配分を広告主にどう説明するかは、担当者と広告主で決めてください。 本記事は公式の案内で確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-0570)についてのご相談はこちらから。
