Python代码实现与可视化)
SciPy 1.13 实战5种概率分布的Python代码实现与可视化指南统计学中的概率分布是数据分析的基石掌握它们的实际应用能让你在数据科学领域游刃有余。本文将带你用Python最新SciPy 1.13版本通过代码实战五种核心概率分布——泊松、卡方、正态、t和F分布。不同于枯燥的理论讲解我们直接从代码入手让你在Jupyter Notebook中边学边练真正理解这些分布的特性和应用场景。1. 环境准备与基础配置在开始之前确保你的Python环境已经安装了必要的库。推荐使用Anaconda创建虚拟环境避免包冲突conda create -n stats_env python3.10 conda activate stats_env pip install scipy1.13 numpy matplotlib seaborn ipykernel提示SciPy 1.13对统计函数进行了优化特别是提高了t分布和F分布计算的数值稳定性。基础导入语句应该放在笔记本开头import numpy as np import matplotlib.pyplot as plt from scipy import stats import seaborn as sns plt.style.use(seaborn-whitegrid) sns.set_palette(husl)2. 泊松分布事件计数的建模利器泊松分布是描述单位时间内随机事件发生次数的离散分布在流量预测、缺陷检测等领域应用广泛。让我们通过代码理解它的特性。核心参数λ (lambda)单位时间/空间内事件的平均发生次数生成泊松分布数据并绘制PMF(概率质量函数)lambda_ 5 # 平均发生率 x np.arange(0, 15) # 可能的事件次数 pmf stats.poisson.pmf(x, lambda_) plt.figure(figsize(10,6)) plt.bar(x, pmf, alpha0.7, edgecolork) plt.title(f泊松分布PMF (λ{lambda_})) plt.xlabel(事件发生次数) plt.ylabel(概率) plt.xticks(x) plt.show()实际应用示例——网站每小时访问量模拟# 生成1000小时的模拟访问量数据 hourly_visits stats.poisson.rvs(mulambda_, size1000) # 绘制分布直方图 plt.figure(figsize(10,6)) sns.histplot(hourly_visits, bins15, kdeFalse, statprobability) plt.title(模拟网站每小时访问量分布) plt.xlabel(访问次数) plt.ylabel(概率) plt.show()泊松分布的关键特性均值与方差相等E(X) Var(X) λ当λ增大时分布趋近正态分布适用于独立事件且事件发生率恒定3. 卡方分布方差分析的基石卡方分布是统计检验的重要工具特别适用于拟合优度检验和独立性检验。它的形状由自由度(df)决定。不同自由度的卡方分布对比dfs [1, 2, 3, 5, 10] # 不同自由度 x np.linspace(0, 20, 500) plt.figure(figsize(10,6)) for df in dfs: plt.plot(x, stats.chi2.pdf(x, df), labelfdf{df}, lw2) plt.title(不同自由度的卡方分布PDF) plt.xlabel(x) plt.ylabel(概率密度) plt.legend() plt.show()卡方检验实际应用——广告点击率的A/B测试# 观察数据两种广告的点击/未点击次数 observed np.array([[100, 120], [130, 150]]) # 执行卡方检验 chi2, p, dof, expected stats.chi2_contingency(observed) print(f卡方统计量: {chi2:.3f}) print(fP值: {p:.4f}) print(f自由度: {dof}) print(期望频数表:\n, expected)卡方分布特性总结特性描述非对称性右偏分布随着df增加逐渐对称取值范围0到正无穷均值等于自由度df方差等于2df4. 正态分布自然界的默认分布正态分布是统计学中最重要的连续分布中心极限定理确保了它在大量场景中的适用性。SciPy提供了完整的正态分布工具集。正态分布的可视化与特性探索mu, sigma 0, 1 # 标准正态分布 x np.linspace(-5, 5, 1000) plt.figure(figsize(12,6)) plt.plot(x, stats.norm.pdf(x, mu, sigma), r-, lw3, labelPDF) plt.plot(x, stats.norm.cdf(x, mu, sigma), b--, lw3, labelCDF) plt.fill_between(x, stats.norm.pdf(x, mu, sigma), where(x -1) (x 1), colorg, alpha0.3, label±1σ (68.27%)) plt.title(标准正态分布PDF与CDF) plt.xlabel(x) plt.ylabel(概率密度/累积概率) plt.legend() plt.grid(True) plt.show()正态分布的实际应用——产品质量控制# 假设某零件长度服从N(10mm, 0.2mm)分布 mean_length 10 std_length 0.2 # 计算合格率(9.6mm-10.4mm) lower, upper 9.6, 10.4 prob stats.norm.cdf(upper, mean_length, std_length) - \ stats.norm.cdf(lower, mean_length, std_length) print(f零件合格概率: {prob*100:.2f}%) # 生成1000个模拟样本 samples stats.norm.rvs(locmean_length, scalestd_length, size1000) # 绘制Q-Q图检验正态性 plt.figure(figsize(10,5)) stats.probplot(samples, distnorm, plotplt) plt.title(零件长度Q-Q图) plt.show()5. t分布小样本的救星当样本量小且总体方差未知时t分布比正态分布更合适。它在假设检验和置信区间估计中扮演关键角色。t分布与正态分布对比x np.linspace(-5, 5, 500) normal_pdf stats.norm.pdf(x) t_pdfs {1: stats.t.pdf(x, 1), 5: stats.t.pdf(x, 5), 30: stats.t.pdf(x, 30)} plt.figure(figsize(10,6)) plt.plot(x, normal_pdf, k-, lw2, label正态分布) for df, pdf in t_pdfs.items(): plt.plot(x, pdf, --, lw2, labelft分布(df{df})) plt.title(t分布与正态分布比较) plt.xlabel(x) plt.ylabel(概率密度) plt.legend() plt.show()t分布的实际应用——小样本均值置信区间# 假设我们有一组小样本数据 sample_data np.array([102, 98, 105, 97, 103, 100, 99, 101, 96, 104]) n len(sample_data) sample_mean np.mean(sample_data) sample_std np.std(sample_data, ddof1) # 样本标准差 # 计算95%置信区间 alpha 0.05 t_critical stats.t.ppf(1-alpha/2, dfn-1) margin_of_error t_critical * (sample_std/np.sqrt(n)) ci_lower sample_mean - margin_of_error ci_upper sample_mean margin_of_error print(f样本均值: {sample_mean:.2f}) print(f95%置信区间: [{ci_lower:.2f}, {ci_upper:.2f}])t分布关键点自由度越小尾部越厚当df30时与正态分布差异可忽略适用于样本量小(n30)、总体方差未知、总体近似正态6. F分布方差比较的标尺F分布主要用于比较两个样本的方差是ANOVA分析和回归分析的基础。它有两个自由度参数分子自由度(dfn)和分母自由度(dfd)。F分布形态探索dfn_values [5, 10, 20] # 分子自由度 dfd_values [10, 20, 30] # 分母自由度 x np.linspace(0.01, 5, 500) plt.figure(figsize(12,6)) for dfn in dfn_values: for dfd in dfd_values: plt.plot(x, stats.f.pdf(x, dfn, dfd), labelfF({dfn},{dfd}), lw2) plt.title(不同自由度组合的F分布) plt.xlabel(F值) plt.ylabel(概率密度) plt.legend(bbox_to_anchor(1.05, 1), locupper left) plt.tight_layout() plt.show()F分布在方差分析(ANOVA)中的应用# 三组实验数据 group1 stats.norm.rvs(loc50, scale10, size30) group2 stats.norm.rvs(loc55, scale10, size30) group3 stats.norm.rvs(loc60, scale10, size30) # 执行单因素ANOVA f_stat, p_value stats.f_oneway(group1, group2, group3) print(fF统计量: {f_stat:.3f}) print(fP值: {p_value:.5f}) if p_value 0.05: print(拒绝原假设组间存在显著差异) else: print(无法拒绝原假设组间无显著差异)F分布特性速查表特性说明定义域(0, ∞)偏态右偏随着dfn和dfd增大趋于对称均值dfd/(dfd-2) (dfd2)众数(dfn-2)/dfn × dfd/(dfd2)7. 高级可视化与综合应用掌握了各分布的基本用法后我们来创建一些高级可视化并展示如何在实际分析中综合运用这些分布。多分布对比可视化x np.linspace(-5, 5, 500) plt.figure(figsize(12,8)) # 正态分布 plt.plot(x, stats.norm.pdf(x), k-, lw3, label正态(0,1)) # t分布(df3) plt.plot(x, stats.t.pdf(x, 3), b--, lw2, labelt(df3)) # 卡方分布(df3) x_chi2 np.linspace(0, 10, 500) plt.plot(x_chi2, stats.chi2.pdf(x_chi2, 3), g-., lw2, label卡方(df3)) # F分布(dfn5, dfd10) x_f np.linspace(0, 5, 500) plt.plot(x_f, stats.f.pdf(x_f, 5, 10), r:, lw2, labelF(5,10)) plt.title(主要概率分布对比) plt.xlabel(x) plt.ylabel(概率密度) plt.legend() plt.grid(True) plt.show()综合案例——假设检验全流程# 案例新教学方法是否提高了学生成绩 # 原假设新方法无效(μ75) # 备择假设新方法有效(μ75) # 样本数据 sample_scores np.array([78, 82, 85, 79, 90, 77, 84, 81, 83, 80]) n len(sample_scores) sample_mean np.mean(sample_scores) sample_std np.std(sample_scores, ddof1) # 计算t统计量 mu0 75 # 原假设均值 t_stat (sample_mean - mu0) / (sample_std/np.sqrt(n)) # 计算p值(单侧检验) p_value 1 - stats.t.cdf(t_stat, dfn-1) print(ft统计量: {t_stat:.3f}) print(fP值: {p_value:.5f}) if p_value 0.05: print(结果显著拒绝原假设新教学方法有效) else: print(结果不显著无法拒绝原假设)在实际数据分析项目中这些分布很少单独使用。一个典型的数据科学工作流可能同时涉及多种分布用正态分布检验数据质量用t分布进行均值比较用F分布分析方差差异用卡方分布检验类别变量关联性用泊松分布建模计数数据