概率统计常用公式与代码实现:贝叶斯、中心极限定理与蒙特卡洛

一、概率统计为什么重要

推荐系统比较点击率,风控系统估计违约率,监控系统判断异常,实验平台评估新版本。它们都不是简单计算平均数,而是在不完整信息下推断总体。

概率描述不确定性,统计从样本推断总体。工程上最重要的习惯是同时报告效果量、区间和假设,而不是只报告一个“显著”或“不显著”。

二、贝叶斯定理

[
P(A|B)=\frac{P(B|A)P(A)}{P(B)}
]

垃圾邮件案例中,即使某个词在垃圾邮件里很常见,也不能直接认为包含该词的邮件一定是垃圾邮件,因为正常邮件基数可能更大。

1
2
3
4
5
6
7
8
9
p_spam = 0.2
p_word_given_spam = 0.8
p_word_given_normal = 0.05
p_word = (
p_word_given_spam * p_spam
+ p_word_given_normal * (1 - p_spam)
)
posterior = p_word_given_spam * p_spam / p_word
print(f"P(spam|word)={posterior:.3f}")

实际分类器通常使用多个词,并在对数空间累加概率,避免大量小数相乘造成下溢。

三、中心极限定理

无论总体分布是否正态,只要样本独立、方差有限,样本均值在样本量足够大时通常趋近正态分布。它是置信区间和许多检验方法的基础。

1
2
3
4
5
6
7
8
9
import numpy as np

rng = np.random.default_rng(42)
population = rng.exponential(scale=2, size=1_000_000)
means = np.array([
rng.choice(population, size=50, replace=False).mean()
for _ in range(5000)
])
print(means.mean(), means.std())

中心极限定理不是说原始数据变正态,而是说“样本均值的分布”趋近正态。重尾、强相关和样本量不足时要谨慎。

四、假设检验与 A/B 测试

A 组 10000 次曝光、点击 1000 次;B 组 10000 次曝光、点击 1050 次。B 的 CTR 从 10% 提升到 10.5%,相对提升 5%,但是否显著要看标准误差。

1
2
3
4
5
6
from statsmodels.stats.proportion import proportions_ztest

counts = [1000, 1050]
observations = [10000, 10000]
z, p = proportions_ztest(counts, observations)
print("z =", z, "p =", p)

p 值小于 0.05 只表示在原假设成立时观察到当前或更极端数据的概率较小,不代表 B 一定更好,也不代表效果足够大。产品决策还要看成本、转化漏斗、长期留存和置信区间。

连续指标可使用 Welch t 检验:

1
2
3
4
5
6
7
8
from scipy.stats import ttest_ind
import numpy as np

rng = np.random.default_rng(1)
a = rng.normal(100, 20, 1000)
b = rng.normal(104, 20, 1000)
stat, p = ttest_ind(a, b, equal_var=False)
print(stat, p)

分类变量频数可以使用卡方检验。若同时比较几十个指标,需要多重比较校正,否则出现假阳性的概率会显著增加。

五、蒙特卡洛估算 PI

在单位正方形内随机取点,落在四分之一圆内的比例约为 π/4:

1
2
3
4
5
6
7
8
9
import numpy as np

rng = np.random.default_rng(42)
n = 1_000_000
points = rng.random((n, 2))
inside = (points[:, 0] ** 2 + points[:, 1] ** 2) <= 1
pi = inside.mean() * 4
error = abs(pi - np.pi)
print(f"pi={pi:.6f}, error={error:.6f}")

误差通常按 (1/\sqrt n) 下降,所以想把误差缩小 10 倍,样本量大约需要增加 100 倍。蒙特卡洛适合高维积分和难以解析求解的问题,但不适合所有简单公式。

六、置信区间

比例的简单近似区间为:

[
\hat p \pm z_{\alpha/2}\sqrt{\frac{\hat p(1-\hat p)}{n}}
]

小样本、接近 0 或 1 时,Wilson 区间通常比普通 Wald 区间更可靠:

1
2
3
4
from statsmodels.stats.proportion import proportion_confint

low, high = proportion_confint(1050, 10000, alpha=0.05, method="wilson")
print(low, high)

“95% 置信区间”不是说这次计算得到的固定区间有 95% 概率包含参数;在频率学派解释中,是说重复抽样构造的区间约有 95% 覆盖真实参数。

七、踩坑记录

不要为了得到显著结果反复查看数据并在某个时间点停止实验。不要在样本不足时过度解释结论。不要把相关性当作因果关系。实验前应登记主要指标、样本量、停止规则和分组方式。

统计显著不等于业务显著。CTR 提升 0.1 个百分点可能在超大样本上显著,却无法覆盖开发和运营成本。

八、小结

常用 API 包括 scipy.stats.ttest_indchi2_contingencynorm.cdfstatsmodels.stats.proportionnumpy.random.Generator。正确流程是:定义问题、明确假设、确定样本量、计算效果量和区间、执行检验、评估实际收益,最后再做决策。


概率统计常用公式与代码实现:贝叶斯、中心极限定理与蒙特卡洛
https://blog.calcguide.tech/2026-08-10-概率统计常用公式与代码实现/
作者
王争气
发布于
2026年8月10日
许可协议