DARA Agentic MMM — LLM Agent 驱动的营销组合建模:双阶段自动调参与智能归因
Skill-DARA-Agentic-MMM · 15-营销投放分析
causalexperimentoptimizationrecommendationragmulti_agent广告与投放推荐与搜索知识图谱与RAGMAS与智能体工程WF-B 广告优化WF-D 选品扫描WF-F 动态定价
年化 ROI30-60 万
实现难度⭐⭐⭐☆☆
业务视角
适用角色CMO / 营销负责人 · 广告优化师 · CEO
适用平台Amazon + TikTok + Meta + KOL 四渠道 · Prime Day / Black Friday 预算前置
什么情况下用同时跑 Amazon 广告/TikTok/网红投放/邮件,不知道整体预算怎么分配最高效;网红投放花了大钱但不知道带来多少真实 GMV
成功是什么样的建立全渠道营销归因模型(MMM),每个渠道真实 ROI 可量化,大促前做预算优化模拟
业务痛点
1. 解决的问题
某母婴辅食品牌在美国市场同时投放 Amazon Ads、Meta(FB+IG)、TikTok,月均广告预算 $15 万美元,但各渠道的 adstock 效应差异显著(TikTok 内容影响力可持续 2-4 周,Amazon 关键词效果衰减快)
2. 核心算法逻辑
传统 Marketing Mix Modeling(MMM)存在根本性瓶颈:大量人工调参。数据科学家需要手动尝试 adstock(广告滞留)半衰期、saturation(饱和度)参数、季节性先验,一轮完整建模周期通常需要 28 周。
3. 业务应用场景
业务背景:某母婴辅食品牌在美国市场同时投放 Amazon Ads、Meta(FB+IG)、TikTok,月均广告预算 $15 万美元,但各渠道的 adstock 效应差异显著(TikTok 内容影响力可持续 2-4 周,Amazon 关键词效果衰减快)。传统 MMM 用统一的 $\lambda=0.5$ 导致 TikTok 效果被严重低估。
数据要求: - 周级渠道消耗数据:`{week, channel, spend, impressions}` - 对应期间销售额/转化量:`{week, revenue, units_sold}` - 外部控制变量:`{week, seasonality_index, competitor_spend_estimate}`
量化 ROI: - 参数优化准确率提升 22-31%(vs 人工调参基线) - TikTok 预算重配后整体 ROAS 提升 +0.4x($2.1 → $2.5 per dollar) - 建模周期从 6 周压缩至 4 小时
4. 输入数据要求
- 时序长度:≥ 26 周(半年);推荐 52+ 周以覆盖年度季节性
- 渠道数:2-8 个(超过 8 个建议分组)
- 数据粒度:周级;日级数据需先聚合
- 外部变量(可选):节假日指标、竞争对手促销标记
5. 输出结果
- 时序长度:≥ 26 周(半年);推荐 52+ 周以覆盖年度季节性
- 渠道数:2-8 个(超过 8 个建议分组)
- 数据粒度:周级;日级数据需先聚合
- 外部变量(可选):节假日指标、竞争对手促销标记
6. 业务价值 / ROI
30-60 万
7. 代码模板
代码块数量:6 · 路径:未检测到
"""
DARA Agentic MMM
整合 DARA 双阶段架构 + Agentic Bayesian 参数优化 + 自动洞察生成
论文:DARA (arXiv:2601.14711) + MMM 4.0 (Applied Marketing Analytics 2025)
"""
import numpy as np
from dataclasses import dataclass, field
from typing import Dict, List, Optional, Tuple
from scipy.optimize import minimize
from scipy.stats import norm
# ── 1. MMM 核心变换 ──────────────────────────────────────────────────────────
def geometric_adstock(spend: np.ndarray, decay: float, max_lag: int = 8) -> np.ndarray:
"""
Geometric Adstock 变换:x_t_star = x_t + λ * x_{t-1}_star
decay: 衰减系数 λ ∈ [0, 1]
"""
result = np.zeros_like(spend, dtype=float)
for t in range(len(spend)):
result[t] = spend[t]
for lag in range(1, min(t + 1, max_lag + 1)):
result[t] += (decay ** lag) * spend[t - lag]
return result
def hill_saturation(x: np.ndarray, alpha: float, K: float) -> np.ndarray:
"""
Hill 函数饱和变换:f(x) = x^alpha / (x^alpha + K^alpha)
alpha: 曲线斜率(越大S形越明显)
K: 半饱和点(达到最大效果50%时的投入量)
"""
x_safe = np.maximum(x, 1e-10)
return (x_safe ** alpha) / (x_safe ** alpha + K ** alpha)
@dataclass
class ChannelParams:
"""单渠道 MMM 参数"""
name: str
decay: float = 0.5 # adstock 衰减系数
alpha: float = 2.0 # Hill 饱和斜率
K: float = 5000.0 # 半饱和点(预算单位)
coef: float = 1.0 # 渠道系数(待估计)
class MMMModel:
"""
核心 MMM 模型
Sales = baseline + Σ channel_coef * saturation(adstock(spend)) + ε
"""
def __init__(self, channel_params: List[ChannelParams]):
self.channel_params = {p.name: p for p in channel_params}
def transform_channel(self, spend: np.ndarray, params: ChannelParams) -> np.ndarray:
"""adstock → saturation 双重变换"""
adstocked = geometric_adstock(spend, params.decay)
8. 论文来源
- 2601.14711