Python SciPy 1.13 实战:8种常见分布的期望与方差快速计算
在数据分析和统计建模中,概率分布是描述随机变量行为的核心工具。传统教材中繁琐的数学推导往往让初学者望而生畏,而Python的SciPy库则提供了直接计算分布参数的便捷方式。本文将演示如何用SciPy 1.13快速计算8种常见概率分布的期望和方差,并通过可视化对比不同参数的影响。
1. 环境准备与基础概念
首先确保已安装最新版SciPy库。通过Anaconda或pip安装后,导入必要模块:
import numpy as np
import scipy.stats as stats
import matplotlib.pyplot as plt
期望
(均值)反映随机变量的集中趋势,
方差
衡量数据的离散程度。SciPy中所有分布对象都提供
.mean()
和
.var()
方法直接获取这两个参数。例如正态分布:
norm_dist = stats.norm(loc=0, scale=1) # 标准正态分布
print(f"期望: {norm_dist.mean():.2f}, 方差: {norm_dist.var():.2f}")
注意:部分分布(如柯西分布)的期望或方差可能不存在,此时调用会返回nan
2. 离散型分布计算
2.1 二项分布
描述n次独立伯努利试验的成功次数,参数为试验次数n和成功概率p:
n, p = 10, 0.3
binom_dist = stats.binom(n, p)
print(f"二项分布: 期望={binom_dist.mean():.1f}, 方差={binom_dist.var():.2f}")
2.2 泊松分布
描述单位时间/空间内事件发生次数,参数λ表示平均发生率:
lambda_ = 5
poisson_dist = stats.poisson(lambda_)
print(f"泊松分布: 期望={poisson_dist.mean()}, 方差={poisson_dist.var()}")
离散分布对比表:
| 分布类型 | 参数 | 期望公式 | 方差公式 | SciPy计算结果示例 |
|---|---|---|---|---|
| 二项分布 | n=10, p=0.3 | n*p | n p (1-p) | 期望=3.0, 方差=2.1 |
| 泊松分布 | λ=5 | λ | λ | 期望=5.0, 方差=5.0 |
| 几何分布 | p=0.2 | 1/p | (1-p)/p² | 期望=5.0, 方差=20.0 |
3. 连续型分布计算
3.1 正态分布
最常用的连续分布,参数μ为均值,σ为标准差:
mu, sigma = 0, 1
norm_dist = stats.norm(loc=mu, scale=sigma)
print(f"正态分布: 期望={norm_dist.mean()}, 方差={norm_dist.var()}")
3.2 指数分布
描述泊松过程中事件间隔时间,参数λ为发生率:
lambda_ = 0.5
expon_dist = stats.expon(scale=1/lambda_)
print(f"指数分布: 期望={expon_dist.mean():.2f}, 方差={expon_dist.var():.2f}")
连续分布特性对比:
x = np.linspace(0, 5, 500)
distributions = {
"正态(0,1)": stats.norm(0, 1),
"指数(0.5)": stats.expon(scale=2),
"伽玛(2,1)": stats.gamma(a=2)
}
plt.figure(figsize=(10,6))
for name, dist in distributions.items():
plt.plot(x, dist.pdf(x), label=f"{name} 方差={dist.var():.2f}")
plt.legend()
plt.title("连续分布方差对比")
4. 参数影响分析
通过交互式控件观察参数变化对分布形态和统计量的影响:
from ipywidgets import interact
@interact
def plot_distribution(mu=(0, 5, 0.5), sigma=(0.1, 2, 0.1)):
dist = stats.norm(mu, sigma)
x = np.linspace(mu-4*sigma, mu+4*sigma, 200)
plt.plot(x, dist.pdf(x))
plt.axvline(dist.mean(), color='r', linestyle='--', label=f'期望={dist.mean():.2f}')
plt.fill_between(x, dist.pdf(x), alpha=0.3)
plt.title(f"正态分布(μ={mu},σ={sigma}) 方差={dist.var():.2f}")
plt.legend()
关键发现:
- 正态分布的σ增大时,曲线更扁平,方差增大
- 指数分布的λ增大时,曲线更陡峭,方差减小
- 二项分布当p接近0.5时方差达到最大
5. 工程应用实例
金融领域常用正态分布计算风险价值(VaR):
def calculate_var(mean, std, confidence=0.95):
return stats.norm(mean, std).ppf(1-confidence)
portfolio_mean, portfolio_std = 0.001, 0.02
print(f"日风险价值(95%置信度): {calculate_var(portfolio_mean, portfolio_std):.2%}")
可靠性工程中使用指数分布分析设备故障间隔:
mtbf = 1000 # 平均故障间隔时间(小时)
failure_rate = 1/mtbf
prob_1year = stats.expon(scale=mtbf).cdf(365*24)
print(f"一年内发生故障的概率: {prob_1year:.1%}")
6. 高级技巧与异常处理
部分分布需要特殊参数化方式。例如伽玛分布有两种常见参数化形式:
# SciPy使用形状参数a和尺度参数scale
shape, scale = 2, 3
gamma_dist = stats.gamma(a=shape, scale=scale)
print(f"伽玛分布: 期望={shape*scale}, SciPy计算:{gamma_dist.mean()}")
当遇到无限方差的情况(如柯西分布)时:
try:
cauchy_dist = stats.cauchy()
print(cauchy_dist.var()) # 将输出nan
except Exception as e:
print(f"异常捕获: {str(e)}")
7. 完整代码示例
以下Jupyter Notebook代码块整合了所有分布计算:
# 8种分布参数计算表
dist_params = [
("二项", stats.binom(n=10, p=0.3)),
("泊松", stats.poisson(mu=5)),
("几何", stats.geom(p=0.2)),
("正态", stats.norm(loc=0, scale=1)),
("指数", stats.expon(scale=2)),
("伽玛", stats.gamma(a=2, scale=1)),
("均匀", stats.uniform(loc=0, scale=10)),
("贝塔", stats.beta(a=2, b=5))
]
results = []
for name, dist in dist_params:
try:
results.append([name, dist.mean(), dist.var()])
except:
results.append([name, "不存在", "不存在"])
import pandas as pd
pd.DataFrame(results, columns=["分布", "期望", "方差"])
8. 可视化对比分析
最后通过子图展示各分布形态与统计量关系:
fig, axes = plt.subplots(2, 4, figsize=(16,8))
for (name, dist), ax in zip(dist_params, axes.ravel()):
if hasattr(dist, 'pmf'):
x = np.arange(dist.ppf(0.01), dist.ppf(0.99))
ax.bar(x, dist.pmf(x), width=0.2)
else:
x = np.linspace(dist.ppf(0.01), dist.ppf(0.99), 100)
ax.plot(x, dist.pdf(x))
ax.set_title(f"{name}\n期望={dist.mean():.2f} 方差={dist.var():.2f}")
plt.tight_layout()
通过实际编码可见,SciPy将复杂的概率统计计算简化为直观的方法调用。这种实践导向的学习方式比纯理论推导更能帮助数据科学初学者建立直觉理解。

390

被折叠的 条评论
为什么被折叠?



