広告のクリエイティブごとの日別の成績から効果が落ちてくる時期を見込み、差し替えの時期と次に作る素材の方向の候補を運用担当に出す
配信中の広告クリエイティブごとに、日別の成績の推移から「あと何日で効果が落ちてくるか」を幅で見込みます。制作にかかる日数から逆算した差し替えの時期と、長持ちした過去の素材の傾向から次に作る方向の候補を、運用担当に出します。
- 生成AI
- ChatGPT/Claude/Gemini
- 連携・自動化
- Python
- 対象業界
- EC/不動産/人材/小売/広告
- 対象部門
- マーケティング/営業
- 対象業務
- 集計・分析
- 主な課題
- データ分析に時間がかかる/判断に時間がかかる/属人化している
- AIで行う処理
- 予測
- 主な効果
- 判断支援/工数削減/機会損失防止
- 導入難易度
- ★★★★☆
- 実装レベル
- 本格構成
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 毎週月曜、担当者が広告主ごとに管理画面を開く
- クリエイティブごとに、クリック率、コンバージョン率、獲得単価を先週・先々週と見比べる
- 下がっているものについて、予算や入札を変えていないか、季節の影響かを思い出す
- 差し替えると決めたら、制作の依頼を書き、広告主に確認を取る
- 次に作る素材の方向を、過去に当たった素材を思い出しながら考える
- 結果を週報にまとめ、広告主に送る
- 自動毎朝、媒体のAPIからクリエイティブごとの前日の成績を取り込む
- 人担当者が、予算・入札・ランディングページを変えたら、出来事の記録表に1行書く
- 自動毎週日曜の夜、クリエイティブごとに立ち上がりからの相対のクリック率と、同じ広告主の他のクリエイティブとの比を計算する
- 自動過去のクリエイティブで学習したモデルが、配信中のものが落ち込むまでの日数を幅(早い場合・中央・遅い場合)で見込む
- 自動早い場合の日数と制作の日数を突き合わせ、「今週発注」「来週発注」「まだ不要」「判断保留」に分ける
- 自動「今週発注」のものについて、生成AIが過去の長持ちした素材の傾向から、次に作る方向の候補を3つ書く
- 人月曜に担当者が、「今週発注」と「判断保留」だけを開いて確かめ、発注するかを決める
- 人担当者が、方向の候補を参考に制作の依頼を書き、広告主に確認を取る
各工程の詳しい説明を読む
- 毎週月曜、担当者が広告主ごとに管理画面を開く
- クリエイティブごとに、クリック率、コンバージョン率、獲得単価を先週・先々週と見比べる
- 下がっているものについて、予算や入札を変えていないか、季節の影響かを思い出す
- 差し替えると決めたら、制作の依頼を書き、広告主に確認を取る
- 次に作る素材の方向を、過去に当たった素材を思い出しながら考える
- 結果を週報にまとめ、広告主に送る
(a)落ちてから気づく。 見ているのは先週との比較なので、ゆっくり下がっていくものは、毎週「少し下がった」で見送られます。 気づいたときには立ち上がりの半分になっていることがあります。
(b)3番が担当者の記憶に頼っている。 予算を変えた、入札を変えた、ランディングページを変えた、という出来事がどこにも記録されていないので、成績が下がった理由を担当者が思い出すしかありません。担当が替わると、理由が分からなくなります。
(c)次の素材の方向が勘になる。 「この広告主は人物が写っている画像が長持ちした」という知識は、ベテランの担当者の頭の中にだけあります。
(d)発注が遅れる理由が残らない。 差し替えが遅れても、それが「気づくのが遅れた」のか「制作が遅れた」のか「広告主の確認が遅れた」のかが記録されていません。どこを直せば早くなるのかが、毎回あいまいなまま終わります。
(e)150本を毎週見るのが重い。 1本6分でも、150本で毎週15時間です。丁寧に見るほど、他の運用の作業が押されます。
- 【自動】 毎朝、媒体のAPIからクリエイティブごとの前日の成績を取り込む
- 【人】 担当者が、予算・入札・ランディングページを変えたら、出来事の記録表に1行書く
- 【自動】 毎週日曜の夜、クリエイティブごとに立ち上がりからの相対のクリック率と、同じ広告主の他のクリエイティブとの比を計算する
- 【自動】 過去のクリエイティブで学習したモデルが、配信中のものが落ち込むまでの日数を幅(早い場合・中央・遅い場合)で見込む
- 【自動】 早い場合の日数と制作の日数を突き合わせ、「今週発注」「来週発注」「まだ不要」「判断保留」に分ける
- 【自動】 「今週発注」のものについて、生成AIが過去の長持ちした素材の傾向から、次に作る方向の候補を3つ書く
- 【人】 月曜に担当者が、「今週発注」と「判断保留」だけを開いて確かめ、発注するかを決める
- 【人】 担当者が、方向の候補を参考に制作の依頼を書き、広告主に確認を取る
7番目が、この設計の分かれ目です。人が見るのは150本ではありません。 「まだ不要」と出たものは一覧で件数を見るだけにし、「今週発注」と「判断保留」だけに時間を使います。
2番目の出来事の記録は、人にしか書けません。 予算や入札を変えたことは、媒体のデータからも分かる場合がありますが、「ランディングページを直した」「広告主がテレビCMを流した」は、どこにも残りません。 これが無いと、成績の変化を飽きと取り違えます。
02今回想定するシステム構成
Google 広告 API(GAQL)/ Meta の Insights API ▼【トリガー】毎朝の定時実行 Python ── クリエイティブ別・日別の成績を取り込む ▼ 成績の表(社内のデータベース)+ 出来事の記録表(人が書く) ▼【トリガー】毎週日曜の夜 Python ├──▶ 立ち上がりからの相対のクリック率、他のクリエイティブとの比 ├──▶ HistGradientBoostingRegressor(分位点の損失で3本) │ 落ち込むまでの日数を、早い場合・中央・遅い場合で見込む ├──▶ 制作の日数と突き合わせて4区分 ▼ Claude API ── 「今週発注」の素材について、次の方向の候補 ▼ 運用担当の一覧(週次)
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 実行環境 | Python(pandas、scikit-learn の HistGradientBoostingRegressor・GroupKFold) | R、BigQuery ML |
| 生成AI | Claude API(次に作る素材の方向の候補) | OpenAI API、Gemini API |
| データの取得元 | Google 広告 API、Meta の Insights API | 媒体のレポートのCSV出力 |
| 保存 | 社内のデータベース | 共有フォルダのファイル |
| 結果の出力先 | 運用担当の週次の一覧 | 社内のチャット |
媒体の管理画面には書き込みません。 配信の停止も差し替えも、担当者が管理画面で行います。モデルの見込みで配信を自動で止めると、外れたときに広告主の売上に直接ひびきます。
成績の取り込みは、媒体のAPIから行います。 Google 広告 API では、Google Ads Query Language(GAQL)で、FROM に対象のリソース、SELECT に属性・セグメント・指標を書きます。広告ごとの成績は ad_group_ad のリソースから取り、segments.date で日別に分けます。取り出しは、全件を1つの接続で流す SearchStream と、ページごとに取る Search から選べます。Meta の広告では、Insights API で広告アカウント、キャンペーン、広告セット、広告ごとの成績を取れます。
見込みには、scikit-learn の HistGradientBoostingRegressor を使います。 損失に quantile を選び、quantile の値を変えて3本のモデルを作ると、早い場合・中央・遅い場合の3つの見込みが出せます。欠けた値をそのまま扱え、カテゴリの列(素材の形式、媒体)を指定できるため、クリエイティブごとに取れる指標がそろっていなくても学習できます。
03どうやって実装するのか
処理の起点を決める
取り込みと見込みを分けます。 取り込みは毎朝、前日の成績を媒体のAPIから取って表に足します。見込みは毎週日曜の夜に1回だけ動かし、月曜の朝に一覧を出します。
見込みを毎日にしないのは、日別の成績が揺れるからです。 1日のクリック率は、曜日や配信量で大きく上下します。毎日見込みを出すと、区分が日ごとに「今週発注」と「まだ不要」を行き来し、担当者が信用しなくなります。 週1回、直近7日をならした値で見ます。
取り込みは、前日分だけでなく直近7日分を取り直します。 媒体のコンバージョンは、計上が数日遅れることがあります。直近の数日は取り直して上書きし、確定した値で学習します。
例外として、成績が急に落ちたものは週の途中でも知らせます。 前日のクリック率が、そのクリエイティブの直近14日の中央値の半分を下回り、かつ表示回数が十分にあるときです。これは見込みではなく、起きたことの知らせです。 審査での配信の制限や、リンク切れが原因のことが多いため、担当者に管理画面を見てもらいます。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 日別の成績 | クリエイティブID、日付、表示回数、クリック、費用、コンバージョン | 媒体のAPI |
| クリエイティブの属性 | 媒体、形式(画像・動画・カルーセル)、配信開始日、訴求の軸、人物の有無、尺 | 制作の依頼票(人が付ける) |
| 出来事の記録 | 日付、広告主、出来事の種類(予算・入札・ランディングページ・広告主の施策・審査)、内容 | 出来事の記録表(人が書く) |
| 制作の日数 | 形式ごとの、発注から入稿までの標準の日数 | 制作の担当と決めた表 |
| 終わったクリエイティブの記録 | 配信を止めた日と、止めた理由 | 成績の表と担当者の記録 |
質を決めるのは、クリエイティブの属性と出来事の記録です。 媒体のデータだけでも見込みは出ますが、「訴求の軸」と「人物の有無」が無ければ、次に作る方向の候補が出せません。 属性は、制作の依頼票に欄を足して、発注のときに付けてもらいます。
終わったクリエイティブの記録には、止めた理由を必ず付けます。 「飽き」「キャンペーンの終了」「広告主の都合」「審査」の4つから選ぶ形にします。学習の目的の値を作れるのは、理由が「飽き」で、相対の値が0.7を下回った後に止めたものだけです。 理由の無い記録は、学習から外します。
属性の値は決めた一覧から選ばせます。 訴求の軸なら「価格」「機能」「実績」「季節」「限定」「悩みの解決」のように6〜8個です。自由に書かせると、同じ意味の値がばらばらになり、長持ちした傾向を集計できません。
データの取得方法を決める
| 取るもの | どこから | 方法 |
|---|---|---|
| Google 広告の日別の成績 | Google 広告 API | ad_group_ad を GAQL で問い合わせ、segments.date で日別に取る |
| Meta の広告の日別の成績 | Meta の Insights API | 広告ごとのエンドポイントで、日別の成績を取る |
| 属性 | 制作の依頼票の表 | クリエイティブIDで結合する |
| 出来事 | 出来事の記録表 | 広告主と日付で結合する |
Google 広告の問い合わせの例です。
SELECT
ad_group_ad.ad.id,
ad_group_ad.status,
segments.date,
metrics.impressions,
metrics.clicks,
metrics.cost_micros,
metrics.conversions
FROM ad_group_ad
WHERE segments.date DURING LAST_7_DAYS
媒体ごとに取れる指標の名前と定義は違います。 クリックの数え方、コンバージョンの計上の仕方が媒体で違うため、媒体をまたいで同じ列に入れても、同じ意味にはなりません。 モデルの学習は媒体ごとの列のまま行い、媒体を区別する列を必ず持たせます。
AIへ渡す前に整形する
- 立ち上がりの基準を決める … 配信開始から7日目以降の、最初の7日間のクリック率の中央値を、そのクリエイティブの基準にします。最初の数日は配信が安定しないので外します
- 相対の値を作る … 日ごとのクリック率を基準で割り、7日の移動中央値でならします
- 広告主全体の動きを外す … 同じ広告主・同じ媒体の他のクリエイティブの相対の値の中央値で割ります。全体が下がっているときに、1本だけが飽きたと判定しないためです
- 出来事の印を付ける … 出来事の記録がある日の前後7日に印を付けます
- 表示回数の少ない日を外す … 1日の表示回数が決めた下限に満たない日は、相対の値を計算しません
- 学習の目的の値を作る … 終わったクリエイティブについて、各日から「相対の値が0.7を下回り、そのまま戻らなかった日」までの日数を求めます
- 特徴量を作る … 配信からの日数、累積の表示回数、直近14日の相対の値の傾き、1日あたりの費用、形式、媒体、訴求の軸、人物の有無、出来事の印
3番目が、この構成の要です。 年末や連休のように市場全体のクリック率が動く時期は、すべてのクリエイティブの値が一緒に動きます。他との比にしておけば、その動きが消え、そのクリエイティブだけの落ち込みが残ります。
6番目の「0.7」は、運用チームで決める値です。 「立ち上がりの7割まで下がったら差し替えの対象」という決まりを、過去の差し替えの記録から決めます。値を変えれば、学習し直します。
AIに処理させる
予測のモデルにさせるのは、配信中のクリエイティブが、相対の値0.7を下回るまでの日数を見込むことだけです。
| させること | 方法 | 出すもの |
|---|---|---|
| 落ち込むまでの日数の見込み | HistGradientBoostingRegressor を分位点0.1・0.5・0.9で3本 | 早い場合・中央・遅い場合の日数 |
| 発注の区分 | 早い場合の日数と制作の日数を比べる規則 | 今週発注/来週発注/まだ不要/判断保留 |
| 見込みの確からしさの確認 | 終わったクリエイティブを使った検証 | 媒体・形式ごとの的中の幅 |
学習の骨組みは、次のくらいの短さです。
from sklearn.ensemble import HistGradientBoostingRegressor
from sklearn.model_selection import GroupKFold
models = {}
for name, q in [("early", 0.1), ("mid", 0.5), ("late", 0.9)]:
models[name] = HistGradientBoostingRegressor(
loss="quantile", quantile=q,
categorical_features="from_dtype", # 形式・媒体・訴求の軸
)
cv = GroupKFold(n_splits=5)
for train_idx, test_idx in cv.split(X, y, groups=creative_id):
for m in models.values():
m.fit(X.iloc[train_idx], y.iloc[train_idx])
# 実際の日数が early〜late の間に入った割合と、
# early を下回った割合を、媒体・形式ごとに記録する
検証で見るのは、平均の誤差ではありません。 見るのは2つで、実際の日数が早い場合と遅い場合の間に入った割合と、早い場合の値より先に落ちてしまった割合です。発注は早い場合の値で決めるので、後者が多いと「発注が間に合わない」ことになります。分位点0.1で作っていれば、後者は1割前後に収まるはずです。大きく超える媒体・形式は、見込みを出さずに判断保留に回します。
検証は、クリエイティブ単位で分けます。 scikit-learn の GroupKFold は、同じグループが学習と検証の両方に入らないように分けます。クリエイティブIDをグループにすると、同じクリエイティブの前半で学習して後半を当てる、という甘い検証を避けられます。さらに、配信開始が新しい3か月分を最後の検証に残します。 過去のクリエイティブで学んだことが、新しいものに通じるかを確かめるためです。
区分の規則は次のとおりです。
| 区分 | 条件 |
|---|---|
| 今週発注 | 早い場合の日数 ≦ 制作の日数+7日 |
| 来週発注 | 早い場合の日数 ≦ 制作の日数+14日 |
| まだ不要 | 上のどちらにも当たらない |
| 判断保留 | 配信から14日未満、表示回数が下限に満たない、直近14日に出来事の印がある、遅い場合と早い場合の幅が30日を超える |
生成AIにさせるのは、「今週発注」の素材について、次に作る方向の候補を書くことです。
| させること | 入力 | させないこと |
|---|---|---|
| 方向の候補を3つ | 落ち込んでいる素材の属性、同じ広告主で長持ちした素材と短かった素材の属性の集計 | 広告の文言そのものを書くこと |
| 候補ごとの根拠 | 同上 | 効果を約束すること |
| 避けたほうがよい方向 | 同上 | 集計に無い傾向を足すこと |
文言そのものを書かせないのは、表現の確認が別の工程だからです。 広告の表現は、広告主の確認と、業種によっては法令に照らした確認が要ります。ここで出すのは「どの軸で作るか」の候補までです。
指示内容を固定する
あなたは広告の運用担当を補佐し、次に作るクリエイティブの方向の候補を
出します。根拠は渡した集計だけです。
【入力】
- 差し替え対象の素材の属性
- 同じ広告主で、長持ちした素材(上位)と短かった素材(下位)の属性の集計
(件数、相対の値が0.7を下回るまでの日数の中央値)
【出すもの】
1. 次に作る方向の候補を3つ。各候補に、形式・訴求の軸・人物の有無を書く
2. 各候補の根拠。集計のどの行を見たかを書く
3. 避けたほうがよい方向を1つ
【厳守事項】
- 集計に無い傾向を書かないでください。一般的な広告の知識で補わないでください。
- 集計の件数が5件未満の属性は、根拠に使わず「件数が少ない」と書いてください。
- 広告の文言、見出し、キャッチコピーを書かないでください。
- 「効果が上がります」「長持ちします」と書かないでください。
「過去の集計では日数の中央値が長かった」と、集計の事実として書いてください。
- 属性の値は、渡した一覧の中から選んでください。
- 差し替え対象の素材と同じ組み合わせを候補に入れないでください。
【差し替え対象】{target_attributes}
【属性の集計】{attribute_summary}
【属性の値の一覧】{attribute_vocab}
「件数が5件未満は根拠にしない」を明記します。 過去に1本だけ長持ちした動画があると、生成AIはそれを根拠に「動画が有効」と書きます。1本の偶然を傾向として出すと、制作の予算を誤った方向へ使います。
出力形式を固定する
運用担当の一覧は、クリエイティブ1本を1行にします。
| 列 | 内容 |
|---|---|
| 広告主、媒体、クリエイティブID、形式 | 識別 |
| 配信からの日数、現在の相対の値 | いまの状態 |
| 落ち込むまでの日数(早い・中央・遅い) | 見込み |
| 制作の日数、区分 | 判断の材料 |
| 判断保留の理由 | 保留のときだけ |
| 方向の候補 | 今週発注のときだけ |
方向の候補は、Claude API の構造化出力で次の形で受け取ります。 output_config.format に type: "json_schema" とスキーマを渡すと、スキーマに沿ったJSONで返ります。
{
"creative_id": "",
"candidates": [
{ "format": "image | video | carousel",
"appeal_axis": "",
"has_person": true,
"evidence": "",
"evidence_count": 0 }
],
"avoid": { "appeal_axis": "", "evidence": "" },
"low_sample_note": ""
}
一覧の1行は、たとえば次のようになります。
| 列 | 例 |
|---|---|
| 広告主/媒体/形式 | A社/Meta/画像 |
| 配信からの日数/相対の値 | 24日/0.82 |
| 落ち込むまで(早い・中央・遅い) | 9日・15日・23日 |
| 制作の日数/区分 | 7日/今週発注(9日 ≦ 7日+7日) |
| 方向の候補 | 動画・実績・人物あり(根拠12件)ほか2つ |
区分の欄に、規則の式をそのまま書いておきます。 なぜ今週発注なのかを担当者がその場で読めるようにし、広告主への説明にもそのまま使えるようにするためです。
JSONにする1つ目の理由は、属性の値を一覧と照らせることです。 appeal_axis が一覧に無い値なら、Python の側で弾きます。2つ目は、evidence_count で根拠の件数を後から確かめられることです。 5未満の候補が混ざっていれば、一覧に出す前に外します。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| Google 広告 API | GAQL の問い合わせ(SearchStream) | 広告ごとの日別の成績を読む |
| Meta の Insights API | 広告ごとの成績の取得 | 日別の成績を読む |
| 社内のデータベース | Python から書き込み | 成績、見込み、区分を残す |
| 出来事の記録表・制作の依頼票 | 読み取り | 出来事と属性を結合する |
| Claude API | API呼び出し | 方向の候補をJSONで受け取る |
| 週次の一覧 | 表とチャットへの通知 | 月曜の朝に担当者へ届ける |
媒体のAPIの権限は、読み取りに限ります。 この構成は成績を読むだけで、配信の設定を変える権限を持たせません。 権限の付け方を誤ると、見込みの誤りがそのまま配信の停止につながる経路ができます。
生成AIに渡すのは、属性の集計だけです。 広告主の名前、費用、コンバージョンの数そのものは渡しません。集計は、広告主ごとに Python の側で作ります。
人が確認する
- 「判断保留」を先に見る … 理由が「出来事の印」なら、その出来事が成績に効いたかを担当者が判断します。予算を上げた直後のクリック率の低下は、飽きではなく配信先の広がりのことが多いです
- 「今週発注」を確かめる … 管理画面で直近の推移を見て、見込みに納得できるかを判断します
- 方向の候補を読む … 候補は制作の依頼の下書きの材料です。採るかどうかは担当者が決め、広告主に相談します
- 見込みと違う判断をしたら記録する … 「今週発注」と出たが見送った、など。理由を一言残します
4番目の記録は、0.7の値と区分の規則を見直す材料です。 見送りが続く広告主があれば、その広告主にとっての落ち込みの基準が違う可能性があります。
月に1回、チームで「見込みと実際」を振り返ります。 先月「今週発注」と出たもののうち、実際にいつ落ちたか、見送ったものはどうなったかを並べます。見込みが外れた例を担当者全員で見ると、出来事の記録の書き漏れが見つかることが多いです。 見込みの精度を上げるより先に、記録の漏れを埋めるほうが効きます。
例外に対処する
| 起きること | 対応 |
|---|---|
| 媒体のAPIから取れない日がある | その日を欠けたまま残し、翌日に取り直す。0で埋めない |
| 配信開始から14日未満 | 基準が定まらないので「判断保留」 |
| 表示回数が下限に満たない | 相対の値を計算せず「判断保留」 |
| 出来事の印がある | 「判断保留」とし、担当者が判断する |
| 見込みの幅が30日を超える | 「判断保留」。学習に似たクリエイティブが少ない |
| 新しい形式や新しい媒体 | 過去の学習の材料が無いので、しばらく見込みを出さない |
| 生成AIの候補に一覧外の属性が入る | 候補ごと外す |
| 根拠の件数が5件未満の候補 | 一覧に出さない。全部が外れたら「候補なし」 |
1行目を「0で埋めない」としているのは、0のクリックが成績の急落に見えるからです。 取り込みの失敗を落ち込みと取り違えると、元気なクリエイティブに「今週発注」が出ます。
記録を残す
- 媒体から取り込んだ日別の成績と、取り込んだ日時
- 学習に使ったデータの期間、検証の結果(媒体・形式ごとの的中の幅)
- 毎週の見込み(早い・中央・遅い)と区分
- 生成AIに渡した集計と、返ってきたJSON
- 担当者が見込みと違う判断をした記録と理由
- 配信を止めた日と、止めたときの相対の値
最後の行が、次の学習の材料になります。 配信を止めた時点の値と、見込みの日数を突き合わせると、見込みが早すぎたのか遅すぎたのかが分かります。
発注した日と入稿した日も、同じ表に残します。 制作の日数の表は最初は標準の値で始めますが、実際の日数が分かれば区分の規則に使う値を直せます。第3章の(d)の「どこで遅れたか」も、ここから読めるようになります。
04実装レベルの3段階
半自動化だけでも、1件6分は4分程度になります。 管理画面を開いて見比べる作業が無くなるからです。本格構成で2分になり、これが本記事の想定です。 差が出るのは、「まだ不要」の大半を開かずに済むようになるためです。 半自動化を3か月動かしてから本格構成に進みます。 その間に出来事の記録がたまり、学習の材料に「理由のある落ち込み」と「飽き」の区別が付きます。
05工数削減シミュレーション
導入後 600件 × 2分 ÷ 60 = 20 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 運用型広告を複数の広告主から受託し、配信中のクリエイティブが常時100本を超える広告代理店・インハウスの運用チーム。差し替えの時期を担当者が管理画面を見て決めていて、気づいたときには成績が落ちきっている場合。制作に1〜2週間かかり、落ちてから作り始めると間に合わない場合。過去のクリエイティブの日別の成績を半年分以上ためられる場合。
- 配信中のクリエイティブが数本で、担当者が毎日見られる場合。配信期間が1〜2週間のキャンペーンだけで、効果が落ちる前に配信が終わる場合。過去のクリエイティブの成績が残っておらず、学習の材料が無い場合。なお、どの素材を作るか、広告主に何を提案するかの判断は、この構成では代替しません。
07最小構成で試す方法
- 過去半年に配信を終えたクリエイティブを、1つの媒体から50本選ぶ
- 媒体のレポートから日別の成績を出力し、表にする
- 第7章の前処理の1〜3番を表計算で行い、相対の値の推移をグラフにする
- 相対の値が0.7を下回った日を、本ごとに数える
- その日数が、形式や訴求の軸でどれくらい違うかを見る
ここではモデルを作りません。 落ち込むまでの日数に、形式や訴求の軸で差があるかを確かめます。
| 出てきた内容 | 判断 |
|---|---|
| 形式や訴求の軸で日数に差がある | Python で見込みを作る段階に進む |
| 全部がほぼ同じ日数で落ちる | 見込みは要らない。配信からの日数で差し替えの時期を決めれば足りる |
| 0.7を下回らないまま終わったものが多い | 差し替えが早すぎる。基準の値から見直す |
| 推移が上下して落ち込みの日が決まらない | 前処理の3番が効いていないか、出来事の記録が無い |
2行目が出ることもあります。 その場合、この構成はやりすぎです。「画像は配信から30日で発注」という決まりだけで、目的は果たせます。
50本の選び方にも気をつけます。 成績の良かったものだけを選ぶと、長持ちしたものばかりになり、差が見えません。配信を終えた順に機械的に50本を取り、途中で止めた理由が「飽き」以外のもの(キャンペーンの終了、広告主の都合)は外します。 外した本数も記録しておくと、後で学習の材料を選ぶときの目安になります。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 市場全体の動きを飽きと取り違える | 同じ広告主の他のクリエイティブとの比にする |
| 予算・入札の変更を飽きと取り違える | 出来事の記録表に書き、前後7日を判断保留にする |
| 同じクリエイティブで学習と検証をする | GroupKFold でクリエイティブ単位に分ける |
| 一点の見込みを出す | 分位点で幅を出し、早い場合で発注を決める |
| 区分が毎日入れ替わる | 週1回、7日をならした値で見る |
| 取り込みの失敗を0で埋める | 欠けたまま残し、取り直す |
| 1本の偶然を傾向として出す | 根拠の件数が5件未満は使わない |
| 属性の値がばらばら | 一覧から選ばせる |
| 媒体をまたいで同じ列に入れる | 媒体ごとの定義のまま持ち、媒体の列で区別する |
| 見込みで配信を自動で止める | 止めない。 権限を読み取りに限る |
| コンバージョンの遅れた計上で直近が低く見える | 直近7日を毎日取り直して上書きする |
| 途中で止めたクリエイティブを学習に入れる | 止めた理由が飽き以外のものは外す |
下の2行は、学習の材料の質の問題です。 計上の遅れを取り直さないと、直近の数日がいつも低く見え、すべてのクリエイティブが落ち込み始めているように見えます。 キャンペーンの終了で止めたものを入れると、まだ落ちていないのに「落ちた日」が記録されます。どちらも、見込みが早い側へずれる原因になります。
上の2行が、この構成の失敗のほとんどです。 成績が下がった理由のうち、飽きはその一部にすぎません。他の理由を外す前処理と出来事の記録が、見込みの精度より先に効きます。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 広告主ごとの広告の成績、費用、コンバージョン、クリエイティブの属性です。個人の情報は扱いません。
- 広告主ごとにデータを分ける … 代理店が複数の広告主の成績を1つのデータベースに持つ形になります。集計と方向の候補は広告主の中だけで作り、他社の傾向を混ぜません
- 生成AIに渡す範囲を絞る … 渡すのは属性の集計だけで、広告主の名前や費用は渡しません
- 媒体のAPIの権限を読み取りに限る … 配信の設定を変える権限を持たせません
- 見込みを約束にしない … 広告主への報告で「あと何日で落ちる」と断定しないでください。幅のある見込みとして扱い、判断は担当者が行います
- 媒体のAPIの利用条件を守る … 各媒体の開発者向けの規約と、取得したデータの扱いの決まりを確かめてから取り込みます
- 広告主との契約で、成績のデータの使い道を確かめる … 広告主の成績を使ってモデルを作ることが、運用の受託の範囲に入るかを確かめます。学習は広告主ごとに分けるのか、複数の広告主の傾向をまとめて学ぶのかを、契約と照らして先に決めます
誤りが起きた場合のリスクは、まだ元気なクリエイティブを差し替えてしまうことと、落ちているものを見送ることの2つです。 前者は市場全体の動きや取り込みの失敗の取り違えから、後者は幅の遅い側だけを見ることから起きます。相対の値と早い場合の日数で判断する設計にします。
10まず何から始めるか
1週目:落ち込みの基準を決める
過去の差し替えの記録を見て、「立ち上がりの何割まで下がったら差し替えか」を運用チームで決めます。本記事では0.7を例にしています。
2週目:50本で傾向を見る
1つの媒体の終わったクリエイティブ50本で、落ち込むまでの日数を数えます。形式や訴求の軸で差があるかを確かめます。 差が無ければ、配信日数の決まりで足ります。
3週目:属性と出来事の記録を始める
制作の依頼票に属性の欄を足し、出来事の記録表を作ります。運用チーム全員が、予算と入札を変えたら1行書く決まりにします。
4週目:取り込みを作る
媒体のAPIから日別の成績を毎朝取り込み、相対の値を計算します。
2か月目: 区分の規則だけで週次の一覧を出します。3か月目以降: 学習と検証を行い、幅のある見込みと方向の候補を足します。担当者が月曜に開くのが「今週発注」と「判断保留」だけになった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
Google 広告 API のレポートが GAQL で、FROM に対象のリソース、SELECT に属性・セグメント・指標を書くこと。SearchStream と Search の2つの取り出し方があること。ad_group_ad で広告ごとの成績を取り、segments.date で日別に分けられること | Google Ads API: Reporting overview | 2026-10-07 |
ad_group_ad のリソースで segments.date、metrics.impressions、metrics.clicks、metrics.cost_micros、metrics.conversions などを選べること | Google Ads API: ad_group_ad | 2026-10-07 |
| Meta の Insights API で、広告アカウント・キャンペーン・広告セット・広告ごとの成績を取れること | Meta for Developers: Insights API | 2026-10-07 |
HistGradientBoostingRegressor の損失に quantile があり、quantile の値で分位点を指定できること。欠けた値をそのまま扱えること。カテゴリの列を指定できること | scikit-learn: HistGradientBoostingRegressor | 2026-10-07 |
| GroupKFold で同じグループが学習と検証の両方に入らないこと | scikit-learn: GroupKFold | 2026-10-07 |
Claude の API で output_config.format に type: "json_schema" を渡すと、スキーマに沿ったJSONで応答を受け取れること | Claude API Docs: Structured outputs | 2026-10-07 |
媒体のAPIの利用条件と取得できる指標は、媒体ごとに確かめてください。 本記事は、差し替えの時期を見込む構成例を扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-0840)についてのご相談はこちらから。
