Negative Keyword Safe Guard — 贝叶斯小样本负关键词安全过滤
Skill-Negative-Keyword-Safe-Guard · 13-广告分析
causalexperimentoptimizationrecommendation广告与投放推荐与搜索数据采集与治理WF-B 广告优化WF-D 选品扫描WF-E Review监控
年化 ROI$432(18% → 3.2%无关消耗)
实现难度⭐☆☆☆☆
业务视角
适用角色广告优化师 / 投放负责人 · CMO · 运营负责人
适用平台Amazon PPC(SP/SB/SD)· TikTok Ads · Meta 广告 · 多平台归因
什么情况下用广告账户几十个系列,不知道哪个在真正赚钱;ROAS 看起来好看但实际利润没有提升;预算有限想集中打高价值用户
成功是什么样的每分广告预算有明确 ROI 追踪,砍掉低效渠道后同等预算 ROAS 提升 30-50%
业务痛点
1. 解决的问题
母婴品类广告投放中,自动化广告(Auto Campaign)会将产品匹配到大量搜索词。
2. 核心算法逻辑
母婴品类广告投放中,自动化广告(Auto Campaign)会将产品匹配到大量搜索词。问题在于:某些词虽然包含品类核心词,却属于完全无关流量,例如:
3. 业务应用场景
业务背景:某母婴品牌在 Amazon US 投放 "pacifier" 和 "nipple" 相关自动广告。系统匹配到大量无关流量,30 天广告消耗 $2,400,其中约 18% 归因于无关搜索词。
量化 ROI: - 月节约无效消耗:$432 - ROAS 提升带来的等效价值:$432 × (4.1/3.2 - 1) = +$121 - 合计月均收益:约 $553,全年 $6,636
业务背景:在 Amazon JP 投放"哺乳瓶"(哺乳瓶/ほにゅうびん)相关广告,被匹配到育儿论坛讨论词、二手交易词等无关查询。
4. 输入数据要求
- Amazon:Search Term Report(广告管理后台 → 报告 → 搜索词报告)
- Shopify/Meta:广告词搜索词匹配数据导出
5. 输出结果
- Amazon:Search Term Report(广告管理后台 → 报告 → 搜索词报告)
- Shopify/Meta:广告词搜索词匹配数据导出
6. 业务价值 / ROI
$432(18% → 3.2%无关消耗)
7. 代码模板
代码块数量:5 · 路径:未检测到
"""
Negative Keyword Safe Guard
贝叶斯小样本负关键词安全过滤系统
依赖:numpy, scipy, pandas
测试:python -m pytest test_negative_keyword.py -v
"""
import numpy as np
import pandas as pd
from scipy import stats
from dataclasses import dataclass, field
from typing import List, Tuple, Optional, Dict
@dataclass
class KeywordStats:
"""单个搜索词的统计数据"""
keyword: str
clicks: int
conversions: int
spend: float
impressions: int = 0
@property
def observed_cvr(self) -> float:
return self.conversions / self.clicks if self.clicks > 0 else 0.0
@property
def cpc(self) -> float:
return self.spend / self.clicks if self.clicks > 0 else 0.0
@dataclass
class BayesianCVREstimator:
"""
Beta-Binomial 贝叶斯 CVR 估计器
先验: CVR ~ Beta(α₀, β₀)
后验: CVR | data ~ Beta(α₀ + k, β₀ + n - k)
"""
category_cvr: float = 0.012 # 品类平均 CVR(母婴 Amazon ~1.2%)
prior_strength: float = 20.0 # 先验强度 κ(等效历史样本量)
@property
def alpha0(self) -> float:
return self.category_cvr * self.prior_strength
@property
def beta0(self) -> float:
return (1 - self.category_cvr) * self.prior_strength
def posterior_params(self, clicks: int, conversions: int) -> Tuple[float, float]:
"""计算后验 Beta 分布参数"""
alpha_post = self.alpha0 + conversions
beta_post = self.beta0 + (clicks - conversions)
return alpha_post, beta_post
def posterior_mean(self, clicks: int, conversions: int) -> float:
"""后验期望 CVR(贝叶斯估计)"""
8. 论文来源
- 2210.15459