从零开始的数据分析之旅
数据不是随机出现的——它背后有生成机制。概率分布就是描述这种机制的数学工具。考试成绩服从正态分布,网站访问量服从泊松分布,硬币正反面服从二项分布。理解分布,你就能从样本推断总体,预测未来,量化不确定性。
from scipy import stats
import numpy as np
# 正态分布 N(0,1) — 标准正态
print(f"PDF(x=0): {stats.norm.pdf(0):.4f}") # 0.3989
print(f"CDF(x=0): {stats.norm.cdf(0):.4f}") # 0.5000
# 95%置信区间
print(f"P(-1.96
n次独立实验中成功k次的概率:
# 10次实验,每次成功概率0.3
n, p = 10, 0.3
print(f"P(X=3) = {stats.binom.pmf(3, n, p):.4f}") # 0.2668
print(f"E[X] = {n*p}, Var[X] = {n*p*(1-p)}") # 3.0, 2.1
单位时间内稀有事件发生k次的概率:
lam = 3 # 平均每小时3次
print(f"P(X=3) = {stats.poisson.pmf(3, lam):.4f}") # 0.2240
np.random.seed(42)
for size in [100, 1000, 10000, 100000]:
samples = np.random.binomial(10, 0.3, size)
print(f"n={size:>6d}: 均值={samples.mean():.4f} (理论3.0)")
# n= 100: 均值=2.8200
# n= 10000: 均值=2.9802
# n=100000: 均值=2.9999 → 收敛到理论值!
# 均匀分布 → 样本均值服从正态分布
uniform_samples = np.random.uniform(0, 1, (10000, 30))
means = uniform_samples.mean(axis=1)
print(f"均值={means.mean():.4f}(理论0.5), 标准差={means.std():.4f}(理论0.0527)")
# 均值=0.5005, 标准差=0.0527 → 完美匹配!
import numpy as np
np.random.seed(42)
# 1. 估计pi值
n = 100000
x = np.random.uniform(-1, 1, n)
y = np.random.uniform(-1, 1, n)
inside = (x**2 + y**2) <= 1
pi_est = 4 * inside.mean()
print(f"pi估计: {pi_est:.4f}")
# 2. 蒙特卡洛积分
samples = np.random.uniform(0, 1, 100000)
integral = np.mean(samples**2)
print(f"积分: {integral:.4f} (理论0.3333)")
# 3. 投资组合模拟
returns = np.random.normal(0.08/252, 0.15/np.sqrt(252), (10000,252))
portfolio = 10000 * np.cumprod(1+returns, axis=1)
print(f"VaR(5%): {np.percentile(portfolio[:,-1],5):.0f}")
from scipy import stats
# 正态性检验
stat, p = stats.shapiro(data[:50]) # Shapiro-Wilk
stat, p = stats.kstest(data, 'norm',
args=(data.mean(), data.std())) # K-S
# 拟合分布参数
loc, scale = stats.norm.fit(data)
print(f"拟合: mu={loc:.2f}, sigma={scale:.2f}")
#!/usr/bin/env python3
# 概率分布 — 完整实战
import numpy as np
from scipy import stats
# ============ 正态分布 ============
mu, sigma = 0, 1
print(f"正态 N(0,1): PDF(x=0)={stats.norm.pdf(0):.4f}, CDF(x=0)={stats.norm.cdf(0):.4f}")
print(f"P(-1.966d}: 均值={samples.mean():.4f} (理论3.0)")
# ============ 中心极限定理 ============
uniform_samples = np.random.uniform(0, 1, (10000, 30))
means = uniform_samples.mean(axis=1)
print(f"\nCLT验证: 均值={means.mean():.4f}(理论0.5), 标准差={means.std():.4f}(理论{1/np.sqrt(12*30):.4f})")
# ============ 指数分布 ============
exp_samples = np.random.exponential(2, 10000)
print(f"\n指数 Exp(2): 均值={exp_samples.mean():.3f}(理论2.0), 标准差={exp_samples.std():.3f}(理论2.0)")
print("\n✅ Python验证通过 — 正态/泊松/二项分布模拟")
| 分布 | 参数 | 均值 | 方差 | scipy |
|---|---|---|---|---|
| 正态 | μ, σ | μ | σ² | stats.norm |
| 二项 | n, p | np | np(1-p) | stats.binom |
| 泊松 | λ | λ | λ | stats.poisson |
| 指数 | λ | 1/λ | 1/λ² | stats.expon |
| 均匀 | a, b | (a+b)/2 | (b-a)²/12 | stats.uniform |
| 卡方 | ν | ν | 2ν | stats.chi2 |
# 概率分布速查
from scipy import stats
# 正态分布
stats.norm.pdf(x, mu, sigma) # PDF
stats.norm.cdf(x, mu, sigma) # CDF
stats.norm.ppf(0.95, mu, sigma) # 分位数
# 二项分布
stats.binom.pmf(k, n, p) # PMF
stats.binom.cdf(k, n, p) # CDF
# 泊松分布
stats.poisson.pmf(k, lam) # PMF
# 拟合检验
stats.shapiro(data) # 正态性
stats.kstest(data, 'norm') # K-S检验
stats.norm.fit(data) # 参数估计