当前位置:首页 > Python > 正文

Python概率分布类型教程:从理论到实践 - 掌握常用概率分布

Python概率分布类型教程

从理论到实践:掌握常见的离散和连续概率分布

概率分布概述

在统计学和数据分析中,概率分布描述了随机变量可能取值的概率规律。Python的scipy.stats库提供了丰富的概率分布函数,帮助我们进行统计分析、建模和预测。

离散概率分布

描述有限或可数无限个可能取值的随机变量。关键概念:

  • 概率质量函数 (PMF)
  • 累积分布函数 (CDF)
  • 期望值和方差

连续概率分布

描述连续随机变量,取值充满一个区间。关键概念:

  • 概率密度函数 (PDF)
  • 累积分布函数 (CDF)
  • 概率计算需要积分

离散概率分布

1. 伯努利分布 (Bernoulli Distribution)

描述单次二元试验(成功/失败)的概率分布,例如抛硬币。

参数: p (成功概率)

概率质量函数: P(X=1) = p, P(X=0) = 1-p

Python实现代码

from scipy.stats import bernoulli
import matplotlib.pyplot as plt

# 创建伯努利分布实例 (p=0.7)
p = 0.7
bernoulli_dist = bernoulli(p)

# 计算概率质量函数
print(f"P(X=0) = {bernoulli_dist.pmf(0):.3f}")  # P(X=0) = 0.300
print(f"P(X=1) = {bernoulli_dist.pmf(1):.3f}")  # P(X=1) = 0.700

# 生成随机样本
samples = bernoulli_dist.rvs(size=1000)

# 可视化
plt.hist(samples, bins=[-0.5, 0.5, 1.5], density=True, alpha=0.7)
plt.xticks([0, 1])
plt.xlabel('结果')
plt.ylabel('概率')
plt.title(f'伯努利分布 (p={p})')
plt.show()

2. 二项分布 (Binomial Distribution)

描述n次独立伯努利试验中成功次数的概率分布。

参数: n (试验次数), p (每次试验成功概率)

概率质量函数: P(X=k) = C(n,k) * p^k * (1-p)^(n-k)

Python实现代码

from scipy.stats import binom
import matplotlib.pyplot as plt
import numpy as np

# 创建二项分布实例 (n=10, p=0.3)
n, p = 10, 0.3
binomial_dist = binom(n, p)

# 计算不同成功次数的概率
k_values = np.arange(0, n+1)
probabilities = binomial_dist.pmf(k_values)

# 可视化
plt.bar(k_values, probabilities)
plt.xlabel('成功次数 (k)')
plt.ylabel('概率 P(X=k)')
plt.title(f'二项分布 (n={n}, p={p})')
plt.show()

# 计算累积概率
print(f"P(X ≤ 3) = {binomial_dist.cdf(3):.4f}")  # P(X ≤ 3) = 0.6496

3. 泊松分布 (Poisson Distribution)

描述单位时间(或空间)内随机事件发生次数的概率分布,适用于事件发生概率小且独立的情况。

参数: λ (单位时间/空间内事件的平均发生率)

概率质量函数: P(X=k) = (λ^k * e^{-λ}) / k!

Python实现代码

from scipy.stats import poisson
import matplotlib.pyplot as plt
import numpy as np

# 创建泊松分布实例 (λ=3)
lambda_ = 3
poisson_dist = poisson(lambda_)

# 计算概率质量函数
k_values = np.arange(0, 15)
probabilities = poisson_dist.pmf(k_values)

# 可视化
plt.bar(k_values, probabilities)
plt.xlabel('事件发生次数 (k)')
plt.ylabel('概率 P(X=k)')
plt.title(f'泊松分布 (λ={lambda_})')
plt.show()

# 计算概率
print(f"P(X=5) = {poisson_dist.pmf(5):.4f}")  # P(X=5) = 0.1008
print(f"P(X ≤ 2) = {poisson_dist.cdf(2):.4f}") # P(X ≤ 2) = 0.4232

连续概率分布

1. 正态分布 (Normal Distribution)

最重要的连续分布,也称为高斯分布,广泛用于自然和社会科学中。

参数: μ (均值), σ (标准差)

概率密度函数: f(x) = (1/(σ√(2π))) * e^(-(x-μ)^2/(2σ^2))

Python实现代码

from scipy.stats import norm
import matplotlib.pyplot as plt
import numpy as np

# 创建正态分布实例 (μ=0, σ=1)
mu, sigma = 0, 1
normal_dist = norm(loc=mu, scale=sigma)

# 生成x值
x = np.linspace(-4, 4, 1000)
pdf = normal_dist.pdf(x)  # 概率密度函数
cdf = normal_dist.cdf(x)  # 累积分布函数

# 可视化PDF
plt.figure(figsize=(10, 4))
plt.subplot(1, 2, 1)
plt.plot(x, pdf, 'b-', linewidth=2)
plt.title(f'正态分布 PDF (μ={mu}, σ={sigma})')
plt.xlabel('x')
plt.ylabel('概率密度')

# 可视化CDF
plt.subplot(1, 2, 2)
plt.plot(x, cdf, 'r-', linewidth=2)
plt.title(f'正态分布 CDF (μ={mu}, σ={sigma})')
plt.xlabel('x')
plt.ylabel('累积概率')
plt.tight_layout()
plt.show()

# 计算概率
print(f"P(-1 ≤ X ≤ 1) = {normal_dist.cdf(1) - normal_dist.cdf(-1):.4f}")  # 0.6827

2. 指数分布 (Exponential Distribution)

描述泊松过程中事件之间时间的概率分布,具有无记忆性。

参数: λ (事件发生率)

概率密度函数: f(x) = λe^(-λx) for x ≥ 0

Python实现代码

from scipy.stats import expon
import matplotlib.pyplot as plt
import numpy as np

# 创建指数分布实例 (λ=0.5)
lambda_ = 0.5
expon_dist = expon(scale=1/lambda_)  # 注意:scale参数是1/λ

# 生成x值
x = np.linspace(0, 10, 1000)
pdf = expon_dist.pdf(x)  # 概率密度函数
cdf = expon_dist.cdf(x)  # 累积分布函数

# 可视化PDF
plt.figure(figsize=(10, 4))
plt.subplot(1, 2, 1)
plt.plot(x, pdf, 'g-', linewidth=2)
plt.title(f'指数分布 PDF (λ={lambda_})')
plt.xlabel('x')
plt.ylabel('概率密度')

# 可视化CDF
plt.subplot(1, 2, 2)
plt.plot(x, cdf, 'm-', linewidth=2)
plt.title(f'指数分布 CDF (λ={lambda_})')
plt.xlabel('x')
plt.ylabel('累积概率')
plt.tight_layout()
plt.show()

# 计算概率
print(f"P(X ≤ 2) = {expon_dist.cdf(2):.4f}")  # P(X ≤ 2) = 0.6321

3. t分布 (Student's t-Distribution)

用于估计正态分布总体均值的小样本情况,尾部比正态分布更厚。

参数: df (自由度)

Python实现代码

from scipy.stats import t
import matplotlib.pyplot as plt
import numpy as np

# 创建t分布实例 (df=5)
df = 5
t_dist = t(df)

# 生成x值
x = np.linspace(-4, 4, 1000)
pdf = t_dist.pdf(x)  # 概率密度函数

# 与标准正态分布比较
normal_pdf = norm.pdf(x)

# 可视化比较
plt.plot(x, pdf, 'b-', label=f't分布 (df={df})')
plt.plot(x, normal_pdf, 'r--', label='标准正态分布')
plt.title('t分布与正态分布比较')
plt.xlabel('x')
plt.ylabel('概率密度')
plt.legend()
plt.show()

# 计算临界值 (95%置信区间)
alpha = 0.05
critical_value = t_dist.ppf(1 - alpha/2)
print(f"95%置信区间的临界值: ±{critical_value:.4f}")

实际应用场景

质量控制

使用二项分布检测产品合格率:

from scipy.stats import binom

# 参数:抽样100件,假设合格率95%
n, p = 100, 0.95
dist = binom(n, p)

# 计算不合格品超过5件的概率
prob = 1 - dist.cdf(95)  # P(X > 95) = 1 - P(X ≤ 95)
print(f"不合格品超过5件的概率: {prob:.4f}")

网站流量分析

使用泊松分布预测访问量:

from scipy.stats import poisson

# 平均每小时访问量:50次
lambda_ = 50
dist = poisson(lambda_)

# 计算一小时内访问量超过60次的概率
prob = 1 - dist.cdf(60)
print(f"访问量超过60次的概率: {prob:.4f}")

金融风险分析

使用正态分布计算投资风险:

from scipy.stats import norm

# 投资回报率:均值8%,标准差15%
mu, sigma = 0.08, 0.15
dist = norm(mu, sigma)

# 计算亏损概率(回报率 < 0)
prob_loss = dist.cdf(0)
print(f"亏损概率: {prob_loss:.4f}")

# 计算回报率超过20%的概率
prob_high_return = 1 - dist.cdf(0.20)
print(f"回报率超过20%的概率: {prob_high_return:.4f}")

总结

关键要点

  • 概率分布是统计学和数据分析的基础工具
  • 离散分布适用于计数数据,连续分布适用于测量数据
  • scipy.stats库提供了全面的概率分布实现
  • 实际应用时需要根据问题特点选择合适的分布
  • 理解分布的参数和特性对正确应用至关重要

分布选择指南

问题类型 推荐分布
二元结果(成功/失败) 伯努利分布
固定试验次数的成功次数 二项分布
单位时间/空间的事件计数 泊松分布
连续测量数据(对称) 正态分布
事件之间的时间间隔 指数分布
小样本均值估计 t分布

深入学习建议

要深入理解概率分布及其应用,建议:

  1. 学习分布背后的数学原理和推导
  2. 练习使用不同参数观察分布形态的变化
  3. 在实际项目中应用概率分布解决问题
  4. 探索其他分布如伽马分布、贝塔分布、卡方分布等
  5. 学习拟合分布和参数估计方法

© 2023 Python概率分布教程 | 使用scipy.stats实现

发表评论