SciPy 1.13 实战5大统计分布Python代码实现与可视化指南统计分布是数据分析与机器学习的基石掌握它们的特性和应用场景能帮助我们更好地理解数据背后的规律。本文将带你用SciPy 1.13版本实现五种核心统计分布——泊松分布、卡方分布、正态分布、t分布和F分布从理论到代码实现再到可视化构建完整的工作流。1. 环境准备与SciPy 1.13新特性在开始前我们需要确保环境配置正确。SciPy 1.13带来了一些数值计算和统计函数的优化特别是在概率分布计算方面性能有所提升。# 安装必要的库 pip install scipy1.13.0 matplotlib numpy pandasSciPy 1.13中与统计分布相关的主要模块是scipy.stats它包含了超过100种连续和离散概率分布。每个分布对象都提供以下常用方法pdf/pmf: 概率密度/质量函数cdf: 累积分布函数ppf: 百分位点函数rvs: 随机变量生成stats: 计算分布的矩均值、方差等import numpy as np import matplotlib.pyplot as plt from scipy import stats # 设置全局绘图样式 plt.style.use(seaborn) plt.rcParams[figure.figsize] (10, 6) plt.rcParams[font.size] 122. 泊松分布计数事件的建模利器泊松分布是描述单位时间或空间内随机事件发生次数的离散概率分布。它有一个关键参数λlambda表示事件的平均发生率。典型应用场景客服中心每小时接到的电话数量网站每分钟的访问量放射性物质单位时间内的衰变次数# 泊松分布参数设置 lambda_values [1, 4, 10] # 不同的λ值 x np.arange(0, 20) # 事件发生次数范围 # 计算并绘制不同λ值的PMF plt.figure() for lam in lambda_values: plt.plot(x, stats.poisson.pmf(x, lam), o-, labelfλ{lam}) plt.title(泊松分布PMF不同λ值) plt.xlabel(事件发生次数(k)) plt.ylabel(概率P(Xk)) plt.legend() plt.grid(True) plt.show()泊松分布的重要性质均值E[X] λ方差Var(X) λ当λ增大时泊松分布逐渐接近正态分布# 泊松分布随机数生成与统计量计算 samples stats.poisson.rvs(mu5, size10000) print(f样本均值: {np.mean(samples):.2f}) print(f样本方差: {np.var(samples):.2f}) # 绘制直方图与理论PMF对比 plt.hist(samples, bins15, densityTrue, alpha0.6, colorg) x np.arange(0, 15) plt.plot(x, stats.poisson.pmf(x, 5), ro-) plt.title(泊松分布随机数直方图与理论PMF对比) plt.show()3. 卡方分布方差分析与假设检验的核心卡方分布是统计学中最重要的分布之一尤其在假设检验和方差分析中广泛应用。它是由独立标准正态随机变量的平方和构成的分布其形状由自由度(df)决定。关键应用场景卡方检验拟合优度检验、独立性检验置信区间估计方差分析# 不同自由度的卡方分布比较 df_values [1, 2, 3, 5, 10] x np.linspace(0, 20, 500) plt.figure() for df in df_values: plt.plot(x, stats.chi2.pdf(x, df), labelfdf{df}) plt.title(卡方分布PDF不同自由度) plt.xlabel(x) plt.ylabel(概率密度) plt.legend() plt.grid(True) plt.show()卡方分布随着自由度增加逐渐接近正态分布。我们可以通过以下代码验证这一性质# 卡方分布的正态近似 df 50 x np.linspace(0, 100, 500) # 理论卡方分布 chi2_pdf stats.chi2.pdf(x, df) # 正态近似 mu, sigma df, np.sqrt(2*df) norm_pdf stats.norm.pdf(x, mu, sigma) plt.plot(x, chi2_pdf, label卡方分布) plt.plot(x, norm_pdf, label正态近似, linestyle--) plt.title(f自由度df{df}时卡方分布的正态近似) plt.legend() plt.show()卡方检验实战示例# 卡方独立性检验示例 observed np.array([[50, 30, 20], [40, 50, 10], [30, 20, 50]]) chi2_stat, p_value, dof, expected stats.chi2_contingency(observed) print(f卡方统计量: {chi2_stat:.2f}) print(fP值: {p_value:.4f}) print(f自由度: {dof}) print(期望频数表:) print(expected)4. 正态分布自然界的普遍规律正态分布高斯分布是最著名的连续概率分布在自然界和社会科学中无处不在。它由两个参数决定均值μ位置参数和标准差σ尺度参数。正态分布的特性对称钟形曲线均值中位数众数68-95-99.7规则# 不同参数的正态分布比较 params [(0, 1), (0, 2), (2, 1)] x np.linspace(-6, 6, 500) plt.figure() for mu, sigma in params: plt.plot(x, stats.norm.pdf(x, mu, sigma), labelfμ{mu}, σ{sigma}) plt.title(正态分布PDF不同参数) plt.xlabel(x) plt.ylabel(概率密度) plt.legend() plt.grid(True) plt.show()正态分布的应用示例# 正态分布的概率计算 mu, sigma 100, 15 # IQ分数分布 # 计算特定区间的概率 prob_less_than_70 stats.norm.cdf(70, mu, sigma) prob_between_85_115 stats.norm.cdf(115, mu, sigma) - stats.norm.cdf(85, mu, sigma) print(fIQ低于70的概率: {prob_less_than_70:.4f}) print(fIQ在85-115之间的概率: {prob_between_85_115:.4f}) # 生成正态随机数并绘制QQ图 samples stats.norm.rvs(locmu, scalesigma, size1000) stats.probplot(samples, distnorm, plotplt) plt.title(正态分布的QQ图) plt.show()5. t分布小样本的统计推断t分布学生t分布在样本量较小且总体方差未知时特别有用。随着自由度增加t分布趋近于标准正态分布。t分布与正态分布比较x np.linspace(-5, 5, 500) plt.plot(x, stats.norm.pdf(x), k-, label标准正态分布) for df in [1, 2, 5, 30]: plt.plot(x, stats.t.pdf(x, df), labelft分布(df{df}), linestyle--) plt.title(t分布与标准正态分布比较) plt.legend() plt.grid(True) plt.show()t检验实战示例# 生成两组数据 group1 stats.norm.rvs(loc50, scale10, size30, random_state1) group2 stats.norm.rvs(loc55, scale10, size30, random_state2) # 独立样本t检验 t_stat, p_value stats.ttest_ind(group1, group2) print(ft统计量: {t_stat:.2f}) print(fP值: {p_value:.4f}) # 可视化两组数据 plt.boxplot([group1, group2], labels[组1, 组2]) plt.title(两组数据分布比较) plt.ylabel(测量值) plt.show()6. F分布方差分析的基石F分布主要用于比较两个方差的比例在方差分析(ANOVA)和回归分析中广泛应用。它有两个自由度参数分子自由度(dfn)和分母自由度(dfd)。F分布可视化# 不同自由度的F分布 dfn_values [1, 5, 10] dfd 20 x np.linspace(0, 5, 500) plt.figure() for dfn in dfn_values: plt.plot(x, stats.f.pdf(x, dfn, dfd), labelfdfn{dfn}, dfd{dfd}) plt.title(F分布PDF不同自由度) plt.xlabel(x) plt.ylabel(概率密度) plt.legend() plt.grid(True) plt.show()ANOVA方差分析示例# 生成三组数据 group1 stats.norm.rvs(loc50, scale10, size30, random_state1) group2 stats.norm.rvs(loc55, scale10, size30, random_state2) group3 stats.norm.rvs(loc60, scale10, size30, random_state3) # 单因素方差分析 f_stat, p_value stats.f_oneway(group1, group2, group3) print(fF统计量: {f_stat:.2f}) print(fP值: {p_value:.4f}) # 可视化三组数据 plt.boxplot([group1, group2, group3], labels[组1, 组2, 组3]) plt.title(三组数据分布比较) plt.ylabel(测量值) plt.show()7. 高级可视化与交互式探索为了更直观地理解这些分布我们可以创建交互式可视化。虽然本文使用静态图表但以下代码展示了如何用Plotly创建交互式分布可视化import plotly.graph_objects as go from plotly.subplots import make_subplots # 创建交互式正态分布可视化 x np.linspace(-4, 4, 200) fig make_subplots(rows1, cols2, subplot_titles(PDF, CDF)) for mu, sigma in [(0, 1), (1, 0.8), (0, 2)]: fig.add_trace( go.Scatter(xx, ystats.norm.pdf(x, mu, sigma), namefμ{mu}, σ{sigma}), row1, col1 ) fig.add_trace( go.Scatter(xx, ystats.norm.cdf(x, mu, sigma), namefμ{mu}, σ{sigma}, showlegendFalse), row1, col2 ) fig.update_layout(height500, width900, title_text正态分布PDF与CDF) fig.show()分布比较雷达图# 五种分布特性比较雷达图 categories [对称性, 尾部厚度, 峰值, 应用频率, 参数数量] fig go.Figure() fig.add_trace(go.Scatterpolar( r[3, 5, 4, 5, 2], thetacategories, filltoself, name正态分布 )) fig.add_trace(go.Scatterpolar( r[1, 5, 5, 4, 1], thetacategories, filltoself, namet分布(df3) )) fig.add_trace(go.Scatterpolar( r[2, 4, 3, 3, 2], thetacategories, filltoself, name卡方分布(df5) )) fig.update_layout( polardict( radialaxisdict( visibleTrue, range[0, 5] )), showlegendTrue, title统计分布特性比较雷达图 ) fig.show()