Meta広告の疲労を自動検知するPython実装【保存版】
Meta広告のクリエイティブは、配信して数日で効果が落ちる。同じ人に何度も表示されると飽きられ、CTRが静かに下がっていく。これがクリエイティブ疲労だ。運用者の悩みは「気づくのが遅れること」にある。管理画面を毎日見ても、数字のブレか本物の疲労かは判断しづらい。そこで有効なのが、フリークエンシー・CTR・CPMの3指標をPythonで毎日自動チェックし、閾値を割った瞬間にSlackへ飛ばす仕組みだ。この記事では、Meta Marketing APIから指標を取り、疲労を定量判定するまでの実装を手順で示す。
クリエイティブ疲労はなぜ検知が遅れるのか
疲労の主犯はフリークエンシーだ。同じユーザーへの表示回数が増えるほど、反応は鈍る。目安として、フリークエンシーが3〜4を超えると疲弊の予兆とされる。ただし単独では判断できない。数字は日々ブレるからだ。
現場で使える基準は「CTR低下」と「CPM上昇」の同時発生だ。この2つが揃ったとき、疲弊がオークションの非効率にまで波及したサインになる。逆に言えば、フリークエンシーだけを見て差し替えると、まだ効くクリエイティブを早期に捨ててしまう。判定ロジックの設計は現場の指標解説とも整合する。
人の目で毎日これを追うのは非効率だ。3指標の複合条件は、コードに落とすほうが速く正確になる。
疲労を定義する3つの指標と閾値
検知ロジックは、次の3条件をANDで結ぶ。1つでも欠けたら「疲労ではない」と判定する。過検知を防ぐための設計だ。
- フリークエンシー:直近7日で3.0を超えている
- CTR減衰:直近7日のCTRが、過去ピークから25%以上低下
- CPM上昇:直近7日のCPMが、基準期間から10%以上上昇
閾値は媒体や商材で動く。BtoBの狭い配信面ならフリークエンシーは早く上がるため、3.0でなく2.5を採る場合もある。まず上の初期値で回し、誤検知の頻度を見て自分の口座に合わせて調整するのが実務的だ。この閾値表はブックマークして、自分の環境に合わせて書き換えて使ってほしい。
重要なのは「ピークからの相対低下」で見る点だ。CTRの絶対値は業種で桁が違う。だが「自分の過去最高から何%落ちたか」なら、どの口座でも同じ物差しになる。
Meta APIから指標を取るPython実装
データ取得はMeta Marketing APIのinsightsエンドポイントを使う。検証はGraph API v21.0で行った。ad単位で time_increment=1 を指定し、日別の frequency・ctr・cpm・impressions を取る。フィールド名は公式リファレンス(developers.facebook.com/docs/marketing-api)で確認できる。
実装で最初に詰まったのは frequency の扱いだ。frequency は campaign や adset の集計単位だと期間全体の平均が返り、日別の推移が潰れる。ad単位かつ time_increment=1 で取らないと、疲労の立ち上がりを捉えられない。ここは公式ドキュメントに明記がなく、レスポンスを見て気づいた点だ。
取得手順は次の流れになる。(1)各adの過去28日を time_increment=1 で取得(2)pandasで日別テーブルに整形(3)直近7日と過去ピークを比較して差分を算出(4)3条件のAND判定。取得の骨格自体はMeta広告レポートのPython自動化と同じ構造なので、既にレポート取得を組んでいれば流用できる。この手順の完全版はnoteの実践ガイドにまとめている。
疲労スコアの計算とSlack通知
判定結果は、3条件をすべて満たしたadだけをアラート対象にする。通知文面には ad名・フリークエンシー・CTR低下率・CPM上昇率を入れる。数字を添えると、差し替え判断がその場でできるからだ。
コピペして使える判定ロジックの骨格はこうだ。まず ctr_drop = (peak_ctr - recent_ctr) / peak_ctr で低下率を出す。次に cpm_up = (recent_cpm - base_cpm) / base_cpm で上昇率を出す。そして if freq > 3.0 and ctr_drop > 0.25 and cpm_up > 0.10 で疲労と判定する。この3行の条件式が検知の核だ。ブックマークして自分の閾値に書き換えて使ってほしい。
通知先はSlack Incoming Webhookが手軽だ。判定でTrueになったadのリストをまとめ、1日1回POSTする。この通知の土台は広告の消化異常をSlackに自動通知する実装と共通で、疲労判定を条件式として足すだけで済む。launchdやcronで毎朝9時に回せば、管理画面を開く前に「今日差し替えるべきad」が手元に届く。
本記事で紹介した仕組みを含め、AIツールで運用を効率化するなら以下も使える。
まとめ
クリエイティブ疲労は、フリークエンシー単独では誤検知する。フリークエンシー3.0超・CTRのピーク比25%低下・CPM10%上昇の3条件をANDで結び、Pythonで毎日判定するのが正確だ。判定コードは3行の条件式に集約でき、既存のレポート取得やSlack通知に足すだけで動く。まずは初期閾値で1週間回し、誤検知を見ながら自分の口座に合わせて調整してほしい。次の一手は、検知したadの差し替えを半自動化することだ。
実務でそのまま使いたい人へ
本記事の手法の完全版(実際のコード・テンプレート・つまずき対処つき)は、運営者のnote(note.com/ryo_ai_hack)で公開している。実データに基づく実践ガイドをまとめて読める。

コメント
コメントを投稿