Skip to content

概率分布基础

从直觉到公式——理解数据科学中最核心的概率分布


📊 为什么需要概率分布?

现实世界的数据从来不是"确定"的。用户的购买行为、股票的价格波动、机器的故障时间——都是在不确定性中呈现规律。概率分布就是描述这种「不确定性中的规律」的数学语言。

三个核心问题(每个数据工作者都应该能回答):

  1. 我的数据"像"哪种分布?(分布识别)
  2. 给定分布,极端值出现的概率有多大?(尾部概率)
  3. 如何用分布做预测和模拟?(生成模型)

🎲 离散分布

伯努利分布(Bernoulli)

一次"是/否"试验

场景:用户是否点击了广告?
参数:p = 点击概率

P(X=1) = p      (点击)
P(X=0) = 1-p    (不点击)
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 次伯努利试验中成功的次数

场景:100 个用户中,有多少人会转化?(转化率 10%)
参数:n = 100, p = 0.1

P(X=k) = C(n,k) × p^k × (1-p)^(n-k)
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 单

P(X=k) = (λ^k × e^(-λ)) / k!
# λ=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)

数据科学中最重要、也是最被滥用的分布

场景:用户的身高、测量误差、大规模样本的均值
参数:μ = 均值, σ = 标准差

f(x) = (1 / (σ√(2π))) × exp(-(x-μ)² / (2σ²))

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)

等待时间:下一个事件何时发生?

场景:用户下次访问的间隔时间
参数:λ = 速率(平均每天 3 次访问)

f(x) = λ × e^(-λx),  x ≥ 0

无记忆性:已经等了 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 法则

⚠️ 常见陷阱

  1. 盲目假设正态分布 — 90% 的现实数据不是正态的。先画直方图,再做正态性检验。
  2. 忽略重尾 — 正态分布预测「百年一遇的金融风暴」概率几乎为 0,但现实是每 10 年就来一次。
  3. 均值 vs 中位数 — 偏态分布(如收入)用均值会被少数富豪拉高,中位数更能代表"普通人"。

🔗 进阶阅读