PyMC-Marketing简介
PyMC-Marketing是一个基于PyMC(一个用于贝叶斯统计建模的Python库)构建的开源工具包,专门用于解决市场营销领域的数据分析与建模任务。它提供了一套高效、灵活的模型和工具,帮助市场营销从业者、数据科学家和研究人员更好地分析客户行为、预测营销活动效果、优化预算分配等。
核心功能与特点
- 贝叶斯统计建模:
- 基于PyMC的概率编程框架,支持贝叶斯方法建模,能够量化不确定性并提供更鲁棒的预测。
- 适用于市场营销中的归因分析、客户生命周期价值预测、媒体组合建模(Media Mix Modeling, MMM)等任务。
- 预置的营销模型:
- 提供多种经典营销模型的实现,例如:
- Beta-Geometric/NBD模型:用于客户流失分析和生命周期价值预测。
- 媒体组合模型(MMM):分析不同营销渠道(如广告、社交媒体)对销售或转化的贡献。
- 归因模型:解决多触点归因问题,量化不同营销触点对转化的影响。
- 生存分析模型:预测客户留存率和流失风险。
- 易用性与灵活性:
- 提供高层API,简化贝叶斯模型的构建和推断过程。
- 支持自定义模型扩展,满足复杂业务场景需求。
- 可视化与解释性:
- 内置可视化工具,帮助用户理解模型结果(如后验分布、参数重要性)。
- 支持生成报告和业务洞见,方便与非技术人员沟通。
- 提供多种经典营销模型的实现,例如:
优势
- 不确定性量化:贝叶斯方法提供参数和预测的置信区间,辅助风险决策。
- 适应复杂场景:支持时间序列、非线性效应、饱和效应(如广告投放的边际递减)。
- 开源与社区支持:由PyMC社区维护,持续更新并集成最新贝叶斯方法。
适用场景
- 广告效果评估与预算分配
- 客户细分与留存策略优化
- 多渠道归因分析
- 长期客户价值预测
- 营销活动ROI分析
媒体组合模型 Media Mix Modeling
在媒体组合模型的文章中已经介绍过了PyMC-Marketing。这里再做一些简单的补充。PyMC-Marketing中的Media Mix Models (MMM)是用于量化不同营销渠道(如电视广告、数字广告、线下活动等)对业务目标(如销售额、转化率)的贡献的核心工具。它基于贝叶斯统计框架,能够灵活建模复杂的市场动态,帮助优化广告预算分配并量化不确定性。
MMM的核心目标
- 归因分析:量化每个营销渠道对目标变量(如销售额)的贡献。
- 预算优化:确定在不同渠道上的最佳资金分配,以最大化ROI。
- 预测与场景模拟:预测不同预算分配策略下的业务结果。
MMM的核心模块
PyMC-Marketing的MMM包含以下核心模块:
广告渠道贡献函数
饱和效应(Saturation Effect)
采用Hill函数建模广告支出的边际收益递减:
$$\text{Contribution}_i=\beta_i\cdot\frac{X_i^{\alpha_i}}{X_i^{\alpha_i}+S_i^{\alpha_i}}$$
- $X_i$: 第$i$个渠道的广告支出
- $\beta_i$: 渠道$i$的最大贡献(当$X_i\to\infty$时)
- $S_i$: 半饱和点(贡献达到$\beta_i/2$时的支出)
- $\alpha_i$: 形状参数,控制曲线陡峭程度($\alpha>0$)。
滞后效应(Carryover Effect)
广告效果随时间衰减,使用几何衰减核函数:
$$\text{AdjustedSpend}_i(t)=\sum_{k=0}^{L}X_i(t-k)\cdot\lambda_i^k$$
- $X_i(t-k)$: 时间$t-k$时渠道$i$的支出
- $\lambda_i$: 衰减率($0<\lambda_i<1$)
- $L$: 最大滞后窗口(如$L=4$表示效果持续4个时间单位)。
总销售额模型
整合所有渠道贡献、基线销售和噪声:
$$\text{Sales}(t)=\text{Baseline}(t)+\sum_{i=1}^{N}\text{Contribution}_i(t)+\epsilon(t)$$
基线销售(Baseline)
$$\text{Baseline}(t)=\beta_0+\beta_{\text{trend}}\cdot t+\beta_{\text{seasonality}}\cdot\text{Seasonality}(t)+\sum_{j=1}^{M}\gamma_j\cdot C_j(t)$$
- $\beta_0$: 截距项
- $\beta_{\text{trend}}$: 时间趋势系数
- $\text{Seasonality}(t)$: 季节性因子(如傅里叶级数)
- $C_j(t)$: 第$j$个控制变量(如促销、节假日)
- $\gamma_j$: 控制变量系数。
噪声项
假设观测噪声服从正态分布:
$$\epsilon(t)\sim\mathcal{N}(0,\sigma^2)$$
或针对计数数据使用负二项分布:
$$\text{Sales}(t)\sim\text{NegativeBinomial}(\mu(t),\phi)$$
- $\mu(t)$: 预测均值(即$\text{Baseline}(t)+\sum\text{Contribution}_i(t)$)
- $\phi$: 离散参数(控制方差)。
预算优化与ROAS
渠道贡献的边际效应
对渠道$i$的支出求偏导,计算边际收益:
$$\frac{\partial\text{Sales}}{\partial X_i}=\beta_i\cdot\frac{\alpha_i S_i^{\alpha_i} X_i^{\alpha_i-1}}{(X_i^{\alpha_i}+S_i^{\alpha_i})^2}$$
投资回报率(ROAS)短期ROAS(忽略滞后效应):
$$\text{ROAS}_i=\frac{\Delta\text{Sales}}{\Delta X_i}=\beta_i\cdot\frac{\alpha_i S_i^{\alpha_i} X_i^{\alpha_i-1}}{(X_i^{\alpha_i}+S_i^{\alpha_i})^2}$$
长期ROAS(考虑滞后效应):
$$\text{ROAS}_i^{\text{long-term}}=\frac{\beta_i}{1-\lambda_i}\cdot\frac{\alpha_i S_i^{\alpha_i} X_i^{\alpha_i-1}}{(X_i^{\alpha_i}+S_i^{\alpha_i})^2}$$
完整模型公式(整合版)
$$\text{Sales}(t)=\beta_0+\beta_{\text{trend}} t+\beta_{\text{seasonality}}\text{Seasonality}(t)+\sum_{j=1}^{M}\gamma_j C_j(t)+\sum_{i=1}^{N}\left(\beta_i\cdot\frac{X_i(t)^{\alpha_i}}{X_i(t)^{\alpha_i}+S_i^{\alpha_i}}\cdot\sum_{k=0}^{L}\lambda_i^k X_i(t-k)\right)+\epsilon(t)$$
符号说明
符号 | 含义 |
$X_i(t)$ | 渠道i在时间t的支出 |
$\beta_i$ | 渠道i的饱和效应系数 |
$\lambda_i$ | 渠道i的滞后衰减率 |
$L$ | 广告效果的最大滞后窗口长度 |
$\epsilon(t)$ | 时间t的观测噪声 |
MMM的实现特点
- 贝叶斯推断:
- 使用PyMC的概率编程能力,通过马尔可夫链蒙特卡洛(MCMC)或变分推断(VI)估计参数后验分布。
- 输出参数的不确定性区间(如94% HPD),避免过拟合。
- 灵活的函数配置:
- 支持自定义饱和函数(如Hill、AdStock)、滞后核函数(如几何衰减、指数衰减)。
- 协变量整合:
- 可加入外部变量(如经济指标、竞品活动)作为控制变量。
MMM的使用步骤
数据准备
数据需包含:
- 时间序列的目标变量(如每日/周销售额)。
- 各营销渠道的支出(如TV、Digital、Radio)。
- 可选:季节性标签、价格、促销活动等协变量。
示例数据格式:
Date | Sales | TV_Spend | Digital_Spend | Radio_Spend | Holiday |
2023-01-01 | 100 | 500 | 200 | 150 | 1 |
2023-01-08 | 120 | 600 | 250 | 100 | 0 |
模型初始化
from pymc_marketing.mmm import MediaMixModel model = MediaMixModel( data=df, media_channels=["TV_Spend", "Digital_Spend", "Radio_Spend"], target_column="Sales", date_column="Date", # 可选配置 adstock_max_lag=4, # 广告效果最长滞后4个时间单位 saturation_function="hill", # 使用Hill函数建模饱和效应 control_features=["Holiday"] # 控制变量 )
模型拟合
model.fit( chains=4, # MCMC链数 draws=1000, # 每链采样次数 tune=1000 # 预热迭代次数 )
结果分析
参数后验分布:
print(model.summary()) # 输出参数均值、标准差、HPD区间
可视化:
model.plot_components() # 各渠道贡献分解 model.plot_posterior_predictive() # 后验预测检查 model.plot_contribution_curves() # 广告支出与贡献的非线性关系
预算优化
# 定义预算约束(如总预算不变) scenario_budgets = { "TV_Spend": [500, 600, 700], # 不同TV预算方案 "Digital_Spend": [200, 250, 300], "Radio_Spend": [100, 150, 200] } # 预测各方案的销售额 predictions = model.predict( future_data=scenario_budgets, calculate_roas=True # 计算投资回报率 ) # 找出最优分配 optimal_budget = predictions.loc[predictions["Sales"].idxmax()]
MMM的适用场景
优势
- 不确定性量化:提供参数和预测的置信区间,辅助风险决策。
- 非线性效应建模:更真实地反映广告的边际收益递减和长期效果。
- 灵活扩展:支持自定义核函数、协变量和分层模型(如分地区建模)。
适用场景
- 多渠道广告效果归因。
- 长期广告策略优化(如预算跨季度分配)。
- 新产品上市的营销模拟。
MMM的进阶功能
- 分层模型(Hierarchical Modeling):分地区/产品线建模,捕捉异质性。
- 动态时间效应:随时间变化的广告效果(如Random Walk建模)。
- ROAS计算:自动生成渠道投资回报率(Return on Ad Spend)。
客户生命周期价值 Customer Lifetime Value
PyMC-Marketing 的CLV(Customer Lifetime Value)模块提供了一套基于贝叶斯统计的模型,用于预测客户生命周期价值、分析客户流失行为以及评估客户细分策略。
CLV 的核心模型
以下是 PyMC-Marketing 中 CLV 模块支持的核心模型及其基本原理、适用场景和核心公式的详细介绍:
beta_geo(Beta-Geometric/NBD 模型)
全称:Beta-Geometric Negative Binomial Distribution Model
用途:建模非合约制(non-contractual)客户群体的交易行为,预测未来交易次数和客户流失概率。
核心假设:
- 客户活跃期间交易频率服从泊松过程(参数$\lambda$)。
- 客户流失概率服从几何分布(参数$\mu$)。
- 客户异质性通过Beta 分布($\alpha,\beta$)和Gamma 分布($r,\alpha$)建模。
公式:
$$\begin{aligned}\text{交易次数}&\sim\text{Poisson}(\lambda)\\\text{存活概率}&\sim\text{Beta}(a,b)\\\lambda&\sim\text{Gamma}(r,\alpha)\\\end{aligned}$$
适用场景:
- 预测客户在未来时间段内的交易次数(如电商、零售)。
- 评估客户流失风险(如多久后客户不再活跃)。
beta_geo_beta_binom(Beta-Geometric/Beta-Binomial 模型)
用途:建模离散时间下的客户交易行为,适用于固定时间间隔(如月度/季度)的预测。
核心假设:
- 客户在固定时间窗口内的交易次数服从Beta-Binomial 分布。
- 客户存活概率服从Beta-Geometric 分布。
公式:
$$\begin{aligned}\text{交易次数}&\sim\text{Beta-Binomial}(n,\alpha,\beta)\\\text{存活概率}&\sim\text{Beta-Geometric}(\theta)\\\end{aligned}$$
适用场景:
- 数据采集为固定时间间隔(如月度报告)。
- 需要简化连续时间模型的计算复杂性。
gamma_gamma(Gamma-Gamma 模型)
用途:预测客户的未来平均交易价值(Average Transaction Value, ATV)。
核心假设:
- 单次交易金额服从Gamma 分布(参数$p,\nu$)。
- 客户间的价值异质性通过Gamma 分布(参数$q,\gamma$)建模。
公式:
$$\begin{aligned}\text{交易金额}&\sim\text{Gamma}(p,\nu)\\\nu&\sim\text{Gamma}(q,\gamma)\\\end{aligned}$$
适用场景:
- 在已知交易频率的情况下,预测客户未来的消费金额。
- 结合 beta_geo 或 pareto_nbd 计算完整 CLV(交易次数×交易金额)。
modified_beta_geo(Modified Beta-Geometric/NBD 模型,MBG/NBD)
用途:改进 BG/NBD 模型,更灵活地建模客户活跃度衰减。
改进点:引入额外的参数$\theta$,允许客户活跃度的衰减速度随时间变化。
公式:
$$\text{存活概率}\propto\frac{\Gamma(a+b)}{\Gamma(a)\Gamma(b)}\cdot\frac{\theta^{t}}{(1+\theta)^{a+b+t}}$$
适用场景:客户活跃度随时间非线性衰减(如订阅制产品的试用期后流失率突增)。
pareto_nbd(Pareto/NBD 模型)
用途:结合 Pareto 分布和 NBD(Negative Binomial Distribution)建模客户交易和流失行为。
核心假设:
- 客户交易频率服从 Poisson 分布(参数$\lambda$)。
- 客户流失时间服从 Pareto 分布(参数$m,\alpha$)。
公式:
$$\begin{aligned}\text{交易次数}&\sim\text{Poisson}(\lambda)\\\text{流失时间}&\sim\text{Pareto}(m,\alpha)\\\end{aligned}$$
适用场景:
- 高价值客户的长尾分布建模(如奢侈品、B2B 客户)。
- 需要捕捉客户流失时间的厚尾特征。
shifted_beta_geo(Shifted Beta-Geometric 模型,SBG)
用途:建模客户首次购买后的重复购买行为。
核心假设:
- 客户在首次购买后的存活概率服从Shifted Beta-Geometric 分布。
- 交易次数服从几何分布。
公式:
$$\text{存活概率}\sim\text{Beta-Geometric}(\alpha,\beta)\quad\text{(从首次购买后开始计算)}$$
适用场景:客户首次购买后的复购行为预测(如 SaaS 试用期后的付费转化)。
模型对比与选择建议
模型 | 适用场景 | 输出目标 |
beta_geo (BG/NBD) | 非合约制客户的交易频率预测 | 未来交易次数、流失概率 |
gamma_gamma | 客户未来交易金额预测 | 平均交易价值(ATV) |
pareto_nbd | 高价值客户的长尾分布建模 | 高精度 CLV(结合交易金额) |
shifted_beta_geo | 首次购买后的复购行为分析 | 复购概率、生命周期长度 |
modified_beta_geo | 非线性客户活跃度衰减 | 改进的流失概率预测 |
beta_geo_beta_binom | 离散时间下的交易预测 | 简化版交易次数预测 |
CLV 的核心功能
- 贝叶斯推断:
- 通过 MCMC(如 NUTS)或变分推断(ADVI)估计参数后验分布。
- 输出参数的不确定性区间(如 94% HPD),避免传统极大似然估计的过拟合问题。
- 灵活的数据输入:
- 支持 RFMT 数据格式(Recency, Frequency, Monetary, Time),即:
- Recency:客户最近一次交易距今的时间。
- Frequency:历史交易次数。
- Monetary:历史交易总金额。
- Time:客户首次交易至今的时间。
- 预测与场景模拟:
- 预测未来交易次数、客户流失概率、CLV 的期望值及分布。
- 支持不同客户分群的对比(如高价值 vs 低价值客户)。
- 可视化工具:
- 后验参数分布图、轨迹图(Trace Plot)。
- 客户生存曲线、CLV 分布直方图。
- 支持 RFMT 数据格式(Recency, Frequency, Monetary, Time),即:
CLV 的使用步骤
数据准备
数据需包含客户级别的 RFMT 指标,例如:
CustomerID | Recency | Frequency | Monetary | Time |
001 | 30 | 5 | 500 | 365 |
002 | 90 | 2 | 200 | 400 |
模型初始化
from pymc_marketing.clv import BetaGeoModel, GammaGammaModel # 初始化 BG/NBD 模型(预测交易次数) bg_model = BetaGeoModel( data=df, customer_id_col="CustomerID", frequency_col="Frequency", recency_col="Recency", T_col="Time" ) # 初始化 Gamma-Gamma 模型(预测平均交易价值) gg_model = GammaGammaModel( data=df, customer_id_col="CustomerID", frequency_col="Frequency", monetary_value_col="Monetary" )
模型拟合
# 拟合 BG/NBD 模型 bg_model.fit( chains=4, # MCMC 链数 draws=1000, # 采样次数 tune=1000 # 预热迭代 ) # 拟合 Gamma-Gamma 模型 gg_model.fit()
预测与结果分析
# 预测未来 12 个月的交易次数和存活概率 future_transactions = bg_model.predict( future_periods=12, data=df # 输入客户数据 ) # 预测平均交易价值 predicted_atv = gg_model.predict(data=df) # 计算 CLV(假设折现率 10%) clv = future_transactions * predicted_atv / (1 + 0.1)
可视化
# 绘制客户生存曲线 bg_model.plot_survival_function(customer_ids=[1, 2, 3]) # 绘制参数后验分布 bg_model.plot_posterior_distributions()
CLV 的适用场景
- 优势
- 不确定性量化:提供 CLV 预测的置信区间,辅助风险决策。
- 客户细分:识别高价值客户与流失风险客户。
- 动态更新:贝叶斯模型支持在线学习,随新数据更新参数。
- 适用场景
- 客户留存策略优化(如精准营销)。
- 预算分配(优先投资高 CLV 客户群体)。
- 评估客户获取成本(CAC)与 CLV 的平衡。
客户选择模型 CustomerChoice
PyMC-Marketing 的CustomerChoice 模块 提供了一套基于贝叶斯统计的模型,用于建模客户在多选项场景下的选择行为(如选择不同产品、品牌或服务)。该模块结合了离散选择模型的经典理论与现代贝叶斯推断的优势,支持灵活的参数设置和不确定性量化。
核心模型与理论
多项式 Logit 模型(Multinomial Logit, MNL)
用途:建模客户在多个互斥选项中的选择概率。
公式:
$$P(y_i=j)=\frac{e^{V_{ij}}}{\sum_{k=1}^Je^{V_{ik}}}$$
- $V_{ij}=\beta_jX_i$:客户 $i$ 选择选项 $j$ 的效用。
- $X_i$:客户特征或选项属性(如价格、品牌)。
- $\beta_j$:选项 $j$ 的效用系数(需估计)。
特点:
- 假设选项间满足独立性(IIA 假设)。
- 适用于选项无显著相关性时的选择预测(如不同品类的产品选择)。
混合 Logit 模型(Mixed Logit)
用途:允许效用系数 \(\beta_j\) 随客户异质性变化,突破 IIA 假设限制。
公式:
$$P(y_i=j)=\int\frac{e^{\beta_iX_{ij}}}{\sum_{k=1}^Je^{\beta_iX_{ik}}}f(\beta_i|\theta)d\beta_i$$
- $\beta_i\sim\mathcal{N}(\mu,\Sigma)$:客户个体效用系数的分布。
- $\theta=(\mu,\Sigma)$:超参数(均值和协方差矩阵)。
特点:
- 捕捉客户异质性(如价格敏感度差异)。
- 适用于市场细分和个性化策略分析。
嵌套 Logit 模型(Nested Logit)
用途:处理选项间的相关性(如品牌下的不同产品)。
公式:
$$P(y_i = j) = \frac{e^{V_{ij}/\lambda_g} \left( \sum_{k \in G_g} e^{V_{ik}/\lambda_g} \right)^{\lambda_g – 1}}{\sum_{g=1}^G \left( \sum_{k \in G_g} e^{V_{ik}/\lambda_g} \right)^{\lambda_g}}$$
- $G_g$:选项的分组(嵌套结构)。
- $\lambda_g$:分组内的相关性参数($0<\lambda_g\leq1$)。
特点:
- 通过分组缓解 IIA 假设问题。
- 适用于存在层级结构的选择场景(如先选品牌,再选型号)。
核心功能与优势
贝叶斯推断
- 参数估计:使用 MCMC(如 NUTS)或变分推断(ADVI)估计后验分布。
- 不确定性量化:输出参数置信区间,支持风险敏感的决策分析。
- 灵活先验:允许自定义先验分布(如稀疏先验用于特征选择)。
数据输入格式
要求数据:每一行代表一个客户选择事件,包含:
- 客户特征:如年龄、收入。
- 选项属性:如价格、促销标签。
- 选择结果:客户最终选择的选项(类别变量)。
示例数据:
CustomerID | Option | Price | Promotion | Choice |
001 | A | 10 | 1 | 0 |
001 | B | 15 | 0 | 1 |
预测与场景模拟
- 选择概率预测:给定新数据,预测客户选择各选项的概率。
- 政策评估:模拟价格调整、促销活动对选择行为的影响。
# 模拟价格下降10%后的选择概率变化 new_data = data.copy() new_data["Price"] = new_data["Price"] * 0.9 predicted_probs = model.predict(new_data)
使用步骤与代码示例
数据准备
import pandas as pd from pymc_marketing.choice import MultinomialLogit # 示例数据:客户在选项A和B之间的选择 data = pd.DataFrame({ "CustomerID": [1, 1, 2, 2], "Option": ["A", "B", "A", "B"], "Price": [10, 15, 10, 15], "Promotion": [1, 0, 0, 1], "Choice": [0, 1, 1, 0] # 客户1选B,客户2选A })
模型初始化
model = MultinomialLogit( data = data, choice_column = "Choice", alternative_column = "Option", features = ["Price", "Promotion"], customer_id_col = "CustomerID" )
模型拟合
model.fit( chains = 4, draws = 2000, tune = 1000, target_accept = 0.9 )
结果分析
# 查看效用系数后验分布 print(model.summary()) # 绘制参数后验分布图 model.plot_posteriors()
预测新数据
new_data = pd.DataFrame({ "CustomerID": [3, 3], "Option": ["A", "B"], "Price": [12, 18], "Promotion": [1, 0], "Choice": [0, 0] # 真实值未知,仅用于预测 }) predicted_choice = model.predict(new_data) print("选择概率:\n", predicted_choice)
适用场景与案例
定价策略优化
- 问题:如何设置价格以最大化客户选择高利润产品的概率?
- 方法:使用混合Logit模型分析价格敏感度的异质性,模拟不同定价下的选择概率。
促销效果评估
- 问题:促销活动是否显著提升客户选择目标品牌的概率?
- 方法:通过MNL模型估计促销变量的效用系数,计算促销带来的概率提升。
产品组合设计
- 问题:新增产品选项是否会影响现有产品的市场份额?
- 方法:用嵌套Logit模型模拟新选项加入后的市场结构变化。
与传统方法的对比
特性 | PyMC-Marketing(贝叶斯) | 传统最大似然估计(MLE) |
不确定性量化 | ✅提供参数后验分布和置信区间 | ❌仅提供点估计和渐近标准误 |
小样本表现 | ✅通过先验信息提升稳定性 | ❌易过拟合或估计不准 |
模型灵活性 | ✅支持复杂先验和层次结构 | ❌受限似然函数形式 |
计算效率 | ⚠️较慢(依赖MCMC) | ✅快速收敛(凸优化) |
参考资源: