数据, 术→技巧

Python市场营销分析包PyMC-Marketing

钱魏Way · · 94 次浏览
!文章内容如有错误或排版问题,请提交反馈,非常感谢!

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 分布直方图。

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) ✅快速收敛(凸优化)

参考资源:

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注