贝叶斯统计
问题
什么是贝叶斯统计?贝叶斯定理有哪些实际应用?频率学派和贝叶斯学派有什么区别?
答案
贝叶斯定理
| 术语 | 含义 | 说明 |
|---|---|---|
| 先验概率 | 观测数据前对 A 的信念 | |
| 似然 | 假设 A 为真时观测到 B 的概率 | |
| 后验概率 | 观测到数据 B 后对 A 的更新信念 | |
| 边际似然 | 数据 B 在所有假设下的总概率 |
一句话理解
后验 ∝ 先验 × 似然 —— 根据新数据更新你的信念
经典例子:疾病检测
某疾病患病率 1%(先验),检测灵敏度 99%(真阳性率),假阳性率 5%。一个人检测阳性,实际患病的概率是多少?
贝叶斯疾病检测
# 先验
p_disease = 0.01
p_healthy = 0.99
# 似然
p_positive_given_disease = 0.99 # 灵敏度
p_positive_given_healthy = 0.05 # 假阳性率
# 边际似然 P(阳性)
p_positive = (p_positive_given_disease * p_disease +
p_positive_given_healthy * p_healthy)
# 后验 P(患病|阳性)
p_disease_given_positive = (p_positive_given_disease * p_disease) / p_positive
print(f"检测阳性时,实际患病概率: {p_disease_given_positive:.1%}")
# 结果约 16.7% — 远低于直觉上的 99%!
# 原因:先验概率(1%)太低,大量假阳性稀释了真阳性
频率学派 vs 贝叶斯学派
| 维度 | 频率学派 | 贝叶斯学派 |
|---|---|---|
| 概率的含义 | 长期频率 | 主观信念程度 |
| 参数观点 | 固定但未知 | 随机变量(有分布) |
| 先验信息 | 不使用 | 明确纳入先验 |
| 核心输出 | p 值、置信区间 | 后验分布、可信区间 |
| 样本量要求 | 通常需要大样本 | 小样本也可用(先验帮助) |
| 可解释性 | "95% 的区间会包含真值" | "真值有 95% 概率在此区间" |
贝叶斯在数据分析中的应用
1. A/B 测试的贝叶斯方法
贝叶斯 A/B 测试
import numpy as np
# A 组: 1000 人, 50 转化; B 组: 1000 人, 65 转化
np.random.seed(42)
# 用 Beta 分布作为转化率的后验
# Beta(α + 成功, β + 失败),先验 Beta(1,1) = 均匀分布
a_samples = np.random.beta(1 + 50, 1 + 950, size=100000)
b_samples = np.random.beta(1 + 65, 1 + 935, size=100000)
# B 优于 A 的概率
prob_b_better = (b_samples > a_samples).mean()
print(f"B 优于 A 的概率: {prob_b_better:.1%}")
# B 比 A 提升多少(相对提升)
lift = (b_samples - a_samples) / a_samples
print(f"平均提升: {lift.mean():.1%}")
print(f"提升 95% 可信区间: [{np.percentile(lift, 2.5):.1%}, {np.percentile(lift, 97.5):.1%}]")
贝叶斯 A/B 的优势
- 结果更直观:直接给出 "B 比 A 好的概率"
- 不需要提前确定样本量,可以随时查看结果
- 天然集成先验信息(历史数据)
2. 用户生命周期价值预测
BG/NBD 模型(贝叶斯框架)用于预测用户未来购买次数:
用户 LTV 预测(概念示意)
# lifetimes 库实现了 BG/NBD 模型
from lifetimes import BetaGeoFitter
# 输入 RFM 数据
bgf = BetaGeoFitter()
bgf.fit(
frequency=data['frequency'], # 重复购买次数
recency=data['recency'], # 最近购买距首次的天数
T=data['T'] # 观测期长度
)
# 预测未来 30 天内的预期购买次数
data['predicted_purchases'] = bgf.conditional_expected_number_of_purchases_up_to_time(
30, data['frequency'], data['recency'], data['T']
)
3. 朴素贝叶斯分类
用于文本分类、垃圾邮件过滤等:
朴素贝叶斯文本分类
from sklearn.naive_bayes import MultinomialNB
from sklearn.feature_extraction.text import CountVectorizer
texts = ["优惠券免费领", "明天开会讨论Q2目标", "中奖了快来领取", "本周项目进度更新"]
labels = [1, 0, 1, 0] # 1=垃圾, 0=正常
vec = CountVectorizer()
X = vec.fit_transform(texts)
model = MultinomialNB()
model.fit(X, labels)
# 预测新文本
new = vec.transform(["恭喜获得大奖"])
print(f"垃圾邮件概率: {model.predict_proba(new)[0][1]:.1%}")
贝叶斯更新可视化
每次有新数据,上一轮的后验就变成新一轮的先验 → 持续学习。
常见面试问题
Q1: 贝叶斯 A/B 测试和频率学派有什么区别?
答案:
| 维度 | 频率学派 | 贝叶斯 |
|---|---|---|
| 输出 | p 值(是否显著) | B 优于 A 的概率 |
| 样本量 | 需提前确定 | 可灵活停止 |
| 解读 | "如果没差异,看到这个结果的概率" | "给定数据,B 更好的概率" |
| 先验 | 不使用 | 可纳入历史数据 |
| 可窥探性 | 不可在中途查看(否则 α 膨胀) | 随时可查看 |
Q2: 先验概率怎么选?
答案:
- 无信息先验(不了解时):Beta(1,1) 均匀分布
- 弱信息先验:Beta(2,2) 居中加权
- 经验先验:根据历史数据设定(如上月转化率 5%±2%)
- 样本量足够大时,先验影响很小(数据主导后验)
Q3: 什么是可信区间(Credible Interval)?
答案:
- 贝叶斯中的"可信区间" ≠ 频率学派的"置信区间"
- 95% 可信区间:参数有 95% 的概率落在这个区间内(直接概率解释)
- 这比频率学派的置信区间更直观易懂
- 从后验分布的 2.5% 和 97.5% 分位数得到
Q4: 贝叶斯方法的局限性?
答案:
- 计算复杂:参数多时需 MCMC 等采样方法,耗时
- 先验选择的主观性:不同先验可能得出不同结论
- 学习曲线陡:概念和工具门槛较高
- 沟通难度:业务方可能不习惯概率分布形式的结论