← 返回作品集

📊 预算分配工作台:MMM 才是预算的裁判

宏观 MMM(营销组合模型)+ 微观 MTA(多触点归因)的真实管线:先用饱和响应曲线给每个渠道定价,再在固定总预算下做科学再分配。 本页不是黑箱——用的就是项目里Attributor跑出来的真实模型与真实数字(Ridge α=1000 / γ=1.5 Hill 饱和曲线 / block bootstrap 95% CI)。 Conjura MMM 数据集(93 品牌 · 19 地区 · 132,759 天)|单品牌 913 天|holdout R² 0.419|Durbin-Watson 0.90

① 拖动各渠道预算($)

每个滑块范围 = 该渠道当前花费的 10%–300%(与优化器边界一致)。左侧数值是模型判定的当前最优花费,括号里是它的 block bootstrap 95% 置信区间与"区间/naive 宽度比"。


当前总预算
基线预测收入
γ(Hill 斜率)1.5

①′ 模型给出的最优花费(真实产物)

单品牌 913 天 · block bootstrap(7 日块 × N=200)。⚠️ = 区间下界逼近 0、系数符号不稳定——当前数据不支持对它下结论。

渠道最优花费95% CI宽比

② 模型预测的销售结果

相对基线变化:

③ 边际回报 · 每投 $1 换回 $

饱和曲线在某点的斜率 = 这一块钱的回报。越高越值得加投;当前各渠道都被拉平到 ≈

④ 归因占比 · 收入被谁挣走

本页用 Hill 饱和模型把收入按渠道贡献切分(宏观 MMM 视角)。往下还有微观 MTA 的真实对比。

它在算什么 · 六步流水线(全部在你的浏览器里跑,数据来自项目真实产物)

1原始数据

Conjura MMM 数据集:132,759 行×50 列,93 品牌 19 地区,2019–2024。

2ETL 清洗

Polars 去空值/千分位,去 564 个离群点,构造 adstock 滞后(0.5 衰减)。

3MMM 建模

OLS/Ridge/Lasso 对比,按日期切分 holdout,Ridge 标准化 + CV 选 α=1000,holdout R² 0.419。

4饱和响应

每渠道 Hill 曲线 revenue = coef·S^γ/(S^γ+τ^γ),γ=1.5,τ=当前花费——不是线性,会递减。

5预算优化

scipy SLSQP 在固定总预算约束下求解,把各渠道边际回报拉平到同一点。

6不确定性

block bootstrap 95% CI(913 天×7 日块×N=200),区间比 naive 重采样宽 8.9×——诚实量化决策风险。

方法注释(一句人话版)

饱和 / 递减回报:投入越多,每块钱的回报越低——这是现实,也是 MMM 与"鼓励无脑加投"的本质区别。曲线在 τ(当前花费)处回报率≈1.56,之后快速变平。
为什么重分配收益≈0%:当前分配已把各渠道边际回报拉平到同一点(局部最优),所以挪预算几乎不改变总量——这是项目最诚实的结论,不是 bug。
block bootstrap 为何更宽 8.9×:MMM 残差强自相关(OLS Durbin-Watson=0.90,2.0 才表示无自相关)。naive 按行重采样"假装样本独立",把不确定彻底低估;按 7 天整块重采样才保留自相关结构,给出诚实(更宽)的区间。
⚠️ 别碰 display / shopping:它们的区间下界逼近 0、系数符号不稳定(display 的 OLS 系数 p=0.31 不显著),CI 横跨全档——当前数据不支持对它俩下结论,砍它们很危险,先补数据。
生产代码:src/attributor/mmm_model.py / budget_optimizer.py / budget_uncertainty.py,报告见 reports/

本页为方法演示。曲线在此处锚定"当前分配即最优"(各渠道边际回报相等),底层即项目真实模型;展示数字均来自项目 README 表与 block-bootstrap 结果。

微观 MTA:Shapley vs 移除效应(真实 Criteo 数据)

Criteo 拍卖归因集(30 天,约 1650 万曝光 / 4.5 万转化)。规则模型把 72–76% 记给 other 桶;Shapley 最稳,移除效应能揪出对转化率影响最大的头部 campaign。

CampaignShapley移除效应
洞察campaign_9100693 移除效应 19.4%、campaign_10341182 16.9%——虽然 Shapley 只给 3–4%,但砍掉它们转化率掉得最狠。宏观定预算、微观查洞察,两层互补。