概率分布基础¶
从直觉到公式——理解数据科学中最核心的概率分布
📊 为什么需要概率分布?¶
现实世界的数据从来不是"确定"的。用户的购买行为、股票的价格波动、机器的故障时间——都是在不确定性中呈现规律。概率分布就是描述这种「不确定性中的规律」的数学语言。
三个核心问题(每个数据工作者都应该能回答):
- 我的数据"像"哪种分布?(分布识别)
- 给定分布,极端值出现的概率有多大?(尾部概率)
- 如何用分布做预测和模拟?(生成模型)
🎲 离散分布¶
伯努利分布(Bernoulli)¶
一次"是/否"试验
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
# 模拟 1000 次广告展示,点击率 5%
p = 0.05
clicks = np.random.binomial(n=1, p=p, size=1000)
print(f"模拟点击率: {clicks.mean():.3f} (真实 p={p})")
二项分布(Binomial)¶
n 次伯努利试验中成功的次数
n, p = 100, 0.1
x = np.arange(0, 31)
# PMF:恰好 k 人转化的概率
pmf = stats.binom.pmf(x, n, p)
print(f"期望值: {n*p:.1f} 人")
print(f"≤5 人转化的概率: {stats.binom.cdf(5, n, p):.4f}")
print(f">15 人转化的概率: {1 - stats.binom.cdf(15, n, p):.4f}")
工业应用: - A/B 测试的样本量计算 - 质检中缺陷品数量的建模 - 转化率实验的统计检验
泊松分布(Poisson)¶
单位时间内随机事件发生次数
# λ=20:每小时平均 20 单
lam = 20
x = np.arange(0, 41)
# 恰好 20 单的概率
print(f"P(X=20) = {stats.poisson.pmf(20, lam):.4f}")
# 超过 30 单的概率(可能需要扩容)
print(f"P(X>30) = {1 - stats.poisson.cdf(30, lam):.4f}")
# 95% 的时段订单数区间
print(f"95%区间: [{stats.poisson.ppf(0.025, lam)}, {stats.poisson.ppf(0.975, lam)}]")
工业应用: - 呼叫中心话务量预测 - 网站流量异常检测 - 保险索赔频率建模
📈 连续分布¶
正态分布(Normal / Gaussian)¶
数据科学中最重要、也是最被滥用的分布
68-95-99.7 法则(三个标准差覆盖 99.7% 的数据):
mu, sigma = 170, 10 # 身高 ~ N(170, 10²)
print(f"68% 的人在 [{mu-sigma}, {mu+sigma}] cm")
print(f"95% 的人在 [{mu-2*sigma}, {mu+2*sigma}] cm")
print(f"99.7% 的人在 [{mu-3*sigma}, {mu+3*sigma}] cm")
# 身高 > 190cm 的概率
print(f"P(身高>190) = {1 - stats.norm.cdf(190, mu, sigma):.4f}")
# → 约 2.3%,即每 100 人中有 2-3 人
中心极限定理(CLT):
无论原始分布是什么形状,只要样本量足够大(n ≥ 30),样本均值的分布趋近于正态分布。
这是 A/B 测试和置信区间成立的理论基石。
# 演示:从均匀分布抽样,样本均值的分布却是正态的
np.random.seed(42)
sample_means = []
for _ in range(10000):
sample = np.random.uniform(0, 1, 50) # 均匀分布!
sample_means.append(sample.mean())
# sample_means 的分布 → 近似正态!
print(f"均值分布: mean={np.mean(sample_means):.4f}, std={np.std(sample_means):.4f}")
指数分布(Exponential)¶
等待时间:下一个事件何时发生?
无记忆性:已经等了 10 分钟,接下来还要等多久?——和刚开始等的时候一样长!
lam = 3 # 平均每天 3 次访问
# 下次访问在 1 天内的概率
print(f"P(T≤1) = {stats.expon.cdf(1, scale=1/lam):.4f}")
# 中位数等待时间
print(f"中位等待时间: {stats.expon.median(scale=1/lam):.2f} 天")
工业应用: - 用户生命周期建模 → 流失率估计 - 设备故障时间 → 维修计划 - CLV 建模中 BG-NBD 的基础分布
对数正态分布(Log-normal)¶
乘法过程的结果:收入的增长、文件大小、潜伏期
许多自然和社会现象是"乘法增长"的产物,取对数后服从正态分布。
# 模拟用户消费金额(对数正态)
mu, sigma = 3.0, 0.8 # ln(金额) ~ N(3, 0.8²)
data = np.random.lognormal(mu, sigma, 10000)
print(f"中位数: ¥{np.median(data):.0f}")
print(f"均值: ¥{data.mean():.0f}")
print(f"前 5% 高消费用户的阈值: ¥{np.percentile(data, 95):.0f}")
🎯 快速选择指南¶
| 你的数据是什么? | 考虑分布 | 为什么 |
|---|---|---|
| 是/否事件(一次) | 伯努利 | 单次二元结果 |
| n 次中的成功次数 | 二项 | n 次伯努利的和 |
| 单位时间/空间的事件数 | 泊松 | 稀有事件计数 |
| 自然测量值(身高、体重) | 正态 | CLT + 广泛适用 |
| 等待时间 / 间隔 | 指数 | 无记忆性 |
| 偏态正值(收入、文件大小) | 对数正态 | 乘法增长 |
| 比例 / 概率估计 | Beta | [0,1] 区间 |
| 罕见事件的极端值 | 幂律 / Pareto | 80/20 法则 |
⚠️ 常见陷阱¶
- 盲目假设正态分布 — 90% 的现实数据不是正态的。先画直方图,再做正态性检验。
- 忽略重尾 — 正态分布预测「百年一遇的金融风暴」概率几乎为 0,但现实是每 10 年就来一次。
- 均值 vs 中位数 — 偏态分布(如收入)用均值会被少数富豪拉高,中位数更能代表"普通人"。
🔗 进阶阅读¶
- 描述性统计基础 — 均值、方差、分位数
- 推断统计 —— 假设检验与置信区间
- 贝叶斯统计概念(中英对照)
- 相关案例:CLV 建模 —— BG-NBD 的指数分布应用