# Cpa Anomaly

> CPA Anomaly Detection (媒体別CPA異常検知)

- Skill: `takumaoshiro/cpa-anomaly` (Agent Skill)
- Install (CLI): `npx skillmds@latest add takumaoshiro/cpa-anomaly`
- Raw SKILL.md: https://api.skillmd.com/api/skills/takumaoshiro/cpa-anomaly/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: takumaoshiro (https://skillmd.com/u/takumaoshiro)
- Updated: 2026-09-22
- Page: https://skillmd.com/skills/takumaoshiro/cpa-anomaly

---

# CPA Anomaly Detection (媒体別CPA異常検知)

> 媒体・キャンペーン・広告グループ単位でCPAの異常値を統計的に検出し、原因ドリルダウンと対応アクションを提示する異常検知スキル

---

## 1. Overview

- **Purpose**: 統計的手法（z-score）を用いてCPAの急騰・急落を自動検知し、影響範囲の特定と根本原因の推定を行う
- **Audience**: 広告運用チーム、パフォーマンスマーケティングマネージャー
- **Frequency**: Daily（日次チェック）/ Ad-hoc（異常検知時の深掘り分析）
- **Time to complete**: 3-8 minutes（データ量・ドリルダウン深度による）

### When to use

日次レポートでCPAの異常変動が検出された場合、またはアラート閾値を超えた際にトリガーする。定常的な日次スキャンとしても利用可能。クリエイティブ疲弊の早期検知、配信アルゴリズム変更の影響把握、LP障害の検出などに活用する。

---

## 2. Input Data

### Required

| Data Source | Format | Description |
|-------------|--------|-------------|
| 過去CPAデータ | CSV / TSV | 過去30日間以上の日次CPA実績（媒体・キャンペーン・広告グループ単位） |
| 当日データ | CSV / TSV | 当日のCPA実績（同粒度） |

### Optional

| Data Source | Format | Description |
|-------------|--------|-------------|
| クリエイティブ実績 | CSV | 広告グループ配下のクリエイティブ別成績（疲弊検知用） |
| 入札変更ログ | CSV / JSON | 入札単価・予算の変更履歴（変更起因の判定用） |
| LP変更履歴 | JSON | ランディングページの更新・障害ログ |
| CPA目標値 | JSON / config | 目標CPAの絶対値（相対評価に加えた絶対判定用） |

### Data Quality Checks

- 過去データが30日間以上の連続日次データであること
- 欠損日がないこと（欠損がある場合は補間方法を明示）
- conversions = 0 の日はCPA算出不可として除外処理を適用
- 同一キャンペーンIDの重複レコードがないこと

---

## 3. Analysis Steps

### Step 1: ベースライン算出
過去30日間のCPAデータから、媒体・キャンペーン・広告グループ各レベルで統計量を算出する。
- 平均CPA（μ）
- 標準偏差（σ）
- 中央値、四分位範囲（IQR）
- トレンド成分（線形回帰の傾き）

### Step 2: z-scoreによる異常検出
当日のCPAに対してz-scoreを算出し、閾値判定を行う。
```
z-score = (CPA_today - μ) / σ
```
- |z| > 2 → Warning（統計的に異常）
- |z| > 3 → Critical（極端な外れ値）
- トレンド補正: 直近7日の傾きを加味した補正z-scoreも算出

### Step 3: 根本原因ドリルダウン
異常が検出された場合、以下の階層で原因を特定する。
1. **媒体レベル**: どの媒体で異常が発生しているか
2. **キャンペーンレベル**: 媒体内のどのキャンペーンが寄与しているか
3. **広告グループレベル**: キャンペーン内のどの広告グループが原因か
4. **クリエイティブレベル**: CTR/CVRの変化からクリエイティブ疲弊を判定

### Step 4: トレンドブレイク検知
移動平均の急変を検知する。
- 3日移動平均 vs 14日移動平均のクロスオーバー
- 前週同曜日との比較（曜日変動の除外）
- 連続上昇/下降日数のカウント

### Step 5: アラート生成とアクション提案
検知結果をセヴェリティ別にソートし、具体的な対応策を提示する。

---

## 4. Output Format

### Summary (top-level)
```
【CPA異常検知サマリー】
  検知日: 2026/04/14
  異常検知数: Critical X件 / Warning X件
  最大影響: {媒体名} / {キャンペーン名} — CPA ¥XX,XXX（z-score: X.XX）
```

### Detail sections
- **アラート一覧テーブル**: セヴェリティ / 媒体 / キャンペーン / 広告グループ / CPA / z-score / 推定原因
- **ドリルダウン結果**: 異常キャンペーンの階層別分析
- **クリエイティブ疲弊検知**: CTR/CVR推移と疲弊判定
- **推奨アクション**: 優先度付きの対応リスト

### Visualizations
- アラート一覧テーブル（セヴェリティ色分け）
- CPA推移チャート（過去30日 + 当日、±2σバンド付き）
- ドリルダウンツリー（媒体→キャンペーン→広告グループ）

---

## 5. Judgment Criteria

| Metric | Good | Warning | Critical |
|--------|------|---------|----------|
| z-score（CPA） | \|z\| < 2 | \|z\| >= 2 | \|z\| >= 3 |
| CTR変化率（7日平均比） | ±10%以内 | -20%超 | -30%超 |
| CVR変化率（7日平均比） | ±10%以内 | -20%超 | -30%超 |
| 連続CPA上昇日数 | 3日以内 | 4-5日連続 | 6日以上連続 |
| クリエイティブ疲弊 | CTR安定 | CTR 7日連続低下 | CTR 30%以上低下 |

### Decision Rules

- z-score > 2 のキャンペーンが検出された場合、Warning としてドリルダウン分析を実施
- z-score > 3 のキャンペーンが検出された場合、Critical として即時対応を促す
- 複数媒体で同時にz-score > 2 の場合、LP障害やタグ不具合の可能性を優先検証
- CTRが7日連続で低下している場合、クリエイティブ疲弊と判定し差し替えを推奨
- CVRのみ急落（CTR正常）の場合、LP側の問題を疑う
- CPA急落（改善方向）の場合も検知し、成功要因の特定を推奨

---

## 6. Examples

### Sample Input
```csv
date,media,campaign,ad_group,impressions,clicks,cost,conversions,cpa
2026-04-14,Google,ブランド_検索,exact_match,12500,890,124000,32,3875
2026-04-14,Google,一般_検索,キーワードA,45000,1200,286000,8,35750
2026-04-14,Yahoo,ディスプレイ,リタゲ_30日,120000,980,156000,3,52000
2026-04-14,Meta,リード獲得,LAL_1%,85000,2100,198000,22,9000

# 過去30日平均（参考）
# Google 一般_検索: μ=18,500, σ=4,200
# Yahoo ディスプレイ リタゲ: μ=22,000, σ=6,500
```

### Sample Output
```
===== CPA異常検知レポート 2026/04/14 =====

【サマリー】
  検知日: 2026/04/14
  異常検知数: Critical 1件 / Warning 1件

【アラート一覧】
  🔴 Critical | Yahoo > ディスプレイ > リタゲ_30日
     CPA: ¥52,000（平均: ¥22,000 / z-score: 4.62）
     推定原因: CVR急落（0.31% → 当日0.25%）
     推奨: LP表示速度・フォーム動作の確認

  🟡 Warning | Google > 一般_検索 > キーワードA
     CPA: ¥35,750（平均: ¥18,500 / z-score: 4.11）
     推定原因: CTR低下（2.8% → 2.67%）+ CVR低下
     推奨: クリエイティブ成績の確認、入札調整の検討

【ドリルダウン: Yahoo ディスプレイ】
  キャンペーン全体 CPA: ¥52,000（+136% vs 平均）
  └ リタゲ_30日: CPA ¥52,000 — z-score 4.62
    ├ CTR: 0.82%（平均 0.85% → ほぼ正常）
    ├ CVR: 0.31%（平均 0.48% → -35.4% ← 主因）
    └ 判定: CVRのみ急落 → LP側の問題を優先確認

【対応アクション（優先順）】
  1. Yahoo リタゲ: LP表示速度・フォーム動作を即時確認
  2. Google 一般検索: クリエイティブ別CTRを確認し低パフォーマンス素材を停止
  3. 全媒体: CVタグの発火状況をGTMで確認
```

---

## 7. Do's and Don'ts

### Do
- 必ず30日以上のヒストリカルデータでベースラインを算出する
- z-score算出時は conversions = 0 の日を適切に除外する
- 複数媒体同時異常の場合はLP/タグなどの共通要因を優先的に疑う
- CPA改善方向（急落）も検知対象とし、成功要因を記録する
- ドリルダウンは必ず媒体→キャンペーン→広告グループの順で実施する
- 曜日変動を考慮する（前週同曜日との比較を含める）

### Don't
- conversions が極小（< 5件/日）のキャンペーンでz-scoreを鵜呑みにしない（サンプルサイズ不足）
- 1日だけの変動で即座に大きな運用変更を推奨しない（2-3日の傾向を確認）
- 全キャンペーンを均等に扱わない（消化額が大きいキャンペーンを優先）
- σ = 0 の場合（過去データが一定値）にz-score算出を行わない（ゼロ除算回避）
- クリエイティブ疲弊とLP障害を混同しない（CTR vs CVR で切り分ける）

---

## 8. Agent Guide

When executing this analysis skill:

```
You are performing CPA Anomaly Detection (媒体別CPA異常検知) analysis.
Key rules:
- Calculate baseline statistics (mean, stddev) from 30+ days of historical CPA data
- Compute z-score for each media/campaign/ad_group: z = (CPA_today - mean) / stddev
- Flag z-score >= 2 as Warning, >= 3 as Critical
- For each anomaly, drill down: media → campaign → ad_group → creative
- Differentiate CTR issues (creative fatigue) from CVR issues (LP/tag problems)
- If multiple media show simultaneous anomalies, prioritize shared root causes (LP, tag, tracking)
- Skip z-score calculation when conversions < 5/day (insufficient sample) or stddev = 0
- Output: summary → alert table (severity-sorted) → drill-down → action recommendations (prioritized)

Refer to the full SKILL.md for thresholds, output format, and detailed steps.
```

