营销增长
需要做贝叶斯营销组合建模、预算优化或客户生命周期价值预测时…
适用于有营销时间序列数据或客户交易 RFM 数据,并希望通过贝叶斯概率模型量化渠道贡献、ROAS、预算分配和 CLV 的场景。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
需要做贝叶斯营销组合建模、预算优化或客户特定
解决思路
- 安装基础环境:使用 `conda create -c conda-forge -n marketing_env pymc-marketing` 创建环境并 `conda activate marketing_env`,或执行 `pip install pymc-marketing`。
- Docker 安装:进入 `scripts/docker`,执行 `docker build -t pymc-marketing .`,再运行 `docker run -p 8888:8888 pymc-marketing` 启动 Jupyter 工作流。
- MMM 基本设置:用 pandas 读取 `marketing_data.csv` 并 `parse_dates=['date']`;用 `MMM(adstock=GeometricAdstock(l_max=8), saturation=LogisticSaturation(), date_column='date', channel_columns=['tv','radio','digital','social'], control_columns=['holiday','promotion','temperature'], yearly_seasonality=2)` 初始化;令 `X=data.drop('sales', axis=1)`、`y=data['sales']`,然后 `mmm.fit(X, y)`。
- 选择 Adstock 变换:Geometric 用 `GeometricAdstock(l_max=8, normalize=True)`;Delayed 用 `DelayedAdstock(l_max=12, theta_prior_params={'alpha':2,'beta':1})`;Weibull 用 `WeibullAdstock(l_max=10, mode_prior_params={'mu':2,'sigma':1})`。
- 选择 Saturation 函数:Logistic 用 `LogisticSaturation()`;Michaelis-Menten 用 `MichaelisMentenSaturation()`;Tanh 用 `TanhSaturation()`。
- 配置时间变化效应:设 `time_varying_intercept=True` 并指定 `intercept_m=100` 来建模基线销售趋势;设 `time_varying_media=True` 并指定 `media_m=50` 来建模渠道效率变化。
- 运行模型诊断与可视化:依次调用 `mmm.plot_trace()`、`mmm.plot_components_contributions()`、`mmm.plot_channel_contribution_share_hdi()`、`mmm.plot_posterior_predictive(original_scale=True)`、`mmm.plot_curve()`。
- 做预算优化:调用 `mmm.allocate_budget(total_budget=1_000_000, budget_bounds={'tv':(100_000,500_000),'digital':(50_000,400_000),'radio':(0,200_000)}, num_days=90)`,用 `budget_allocator.allocate()` 查看最优分配,或调用 `mmm.plot_budget_allocation(total_budget=1_000_000, budget_bounds={'tv':(0,500_000),'digital':(0,500_000)})` 可视化。
- 计算 ROAS 与渠道效率:调用 `mmm.compute_mean_roas()`、`mmm.compute_channel_contribution_original_scale()`、`mmm.compute_marginal_roas(spend_grid_size=20)`。
- 用 Lift test 校准:定义 `lift_test_results` DataFrame 包含 `channel`、`lift`、`sigma`;初始化 MMM 后,在 `mmm.fit` 中传入 `prior_fn=lambda model: add_lift_measurements_to_likelihood(model, lift_test_results)`。
- 做样本外预测:准备 `future_data` DataFrame,调用 `mmm.sample_posterior_predictive(X_pred=future_data, extend_idata=True, combined=True)`,再用 `predictions.posterior_predictive['y'].mean(dim=['chain','draw'])` 获取预测均值。
- 切换替代 NUTS 采样器:在 `mmm.fit(X, y, nuts_sampler='numpyro', chains=4, draws=2000)` 中可把 `nuts_sampler` 设为 `'numpyro'`、`'blackjax'`、`'nutpie'` 或 `'pymc'`。
- 构建 Beta-Geometric/NBD CLV 模型:准备含 `customer_id`、`frequency`、`recency`、`T` 的 RFM 数据;用 `BetaGeoModel(data=rfm_data)` 初始化并 `fit()`;用 `expected_num_purchases(t=30, frequency=..., recency=..., T=...)` 预测购买,用 `expected_probability_alive(...)` 预测存活概率。
- 构建 Pareto/NBD 模型:用 `ParetoNBDModel(data=rfm_data)` 初始化并 `fit()`;用 `expected_num_purchases(t=365, frequency=..., recency=..., T=...)` 预测未来购买。
- 构建 Gamma-Gamma 货币价值模型:准备含 `customer_id`、`frequency`、`monetary_value` 的数据;用 `GammaGammaModel(data=monetary_data)` 初始化并 `fit()`;用 `expected_customer_spend(frequency=..., monetary_value=...)` 预测客单,再与交易模型结果相乘得到总 CLV。
- 保存与加载模型:用 `mmm.save('mmm_model.nc')` 保存;用 `MMM.load('mmm_model.nc')` 加载;加载后可继续调用 `sample_posterior_predictive(X_new)`。
- 自定义先验:在 `with mmm.model:` 中用 `mmm.model['beta_channel'] = pm.HalfNormal('beta_channel_custom', sigma=2, shape=2)` 修改渠道系数先验,再执行 `mmm.fit(X, y)`。
- 配置采样器:在 `mmm.fit(X, y, chains=4, draws=3000, tune=2000, target_accept=0.95, random_seed=42)` 中调整链数、抽样数、预热步、接受率和随机种子。
- 排查收敛问题:用 `az.summary(mmm.idata, var_names=['beta_channel','alpha'])` 检查 R-hat 是否小于 1.01;若偏高,增加 `tune=3000, draws=2000`,或根据领域知识使用更强先验。
- 处理拟合时间长:用 `mmm.fit(X, y, nuts_sampler='numpyro')` 加速;测试时减少为 `chains=2, draws=1000, tune=1000`;先用 `mmm.sample_prior_predictive(samples=500)` 做先验预测检查。
- 处理内存问题:拟合时用 `draws=2000, tune=1000`,之后用 `thinned_idata = mmm.idata.sel(draw=slice(None, None, 2))` 对后验样本抽稀。
- 处理数据缩放问题:用 `StandardScaler` 对 `X[['tv','digital','radio']]` 做归一化;预算优化时记得 inverse transform 回原始尺度。
- 执行端到端 MMM 分析:1) 读取 `marketing_data.csv` 并拆分 X/y;2) 用 `GeometricAdstock(l_max=8)`、`LogisticSaturation()` 等初始化 MMM;3) `mmm.fit(X, y, chains=4, draws=2000, tune=2000)`;4) 运行 `plot_trace()` 和 `plot_posterior_predictive(original_scale=True)`;5) 运行 `plot_components_contributions()` 并打印 `compute_mean_roas()`;6) 用 `allocate_budget(...)` 做预算优化并打印 `allocate()`。
- 执行 CLV 预测管道:1) 从交易数据按 `customer_id` 聚合出 recency、frequency(订单数减 1)、monetary(平均收入)和 T;2) 用 `BetaGeoModel` 拟合 `frequency/recency/T`;3) 仅对复购客户用 `GammaGammaModel` 拟合 `frequency/revenue`;4) 用 `expected_num_purchases(t=365, ...)` 乘 `expected_customer_spend(...)` 得到 12 个月 CLV。
- 配置环境变量:按需设置 `os.environ['AWS_ACCESS_KEY_ID']`、`os.environ['AWS_SECRET_ACCESS_KEY']`、`os.environ['MLFLOW_TRACKING_URI']`,并把 `os.environ['PYMC_BACKEND']` 设为 `'jax'` 或 `'numpy'`。
- 使用 Customer Choice Analysis (CSA) 做离散选择建模以理解客户偏好(原文仅列出该能力,未给出具体 API 调用)。
适用边界 · 注意事项
- 没有按时间的渠道投入与业务结果数据,或没有客户交易 RFM 数据时,不适合使用。
- 无法接受贝叶斯 MCMC 拟合的计算成本,或需要毫秒级在线预测时,不适用。
- 未安装 pymc-marketing/PyMC 生态或无法引入该依赖的环境,不适用。