公司动态

Python实战:五大统计分布的原理、计算与可视化

📅 2026/7/15 5:27:50
Python实战:五大统计分布的原理、计算与可视化
1. 泊松分布事件计数的利器泊松分布是我在数据分析中最常用的离散分布之一。它特别适合描述单位时间或空间内随机事件发生的次数。比如我去年分析过一个客服中心的来电数据就用泊松分布预测了高峰时段的接线员需求。这个分布的概率质量函数看起来有点吓人 P(Xk) e^(-λ) * λ^k / k! 但其实理解起来很简单λ代表事件发生的平均速率k是我们想计算概率的具体次数。举个实际例子假设某电商平台平均每分钟收到5次下单请求我们想计算下一分钟恰好收到3次订单的概率from scipy.stats import poisson lambda_val 5 # 平均每分钟5单 k 3 # 计算收到3单的概率 prob poisson.pmf(k, lambda_val) print(f每分钟收到{k}单的概率是{prob:.4f})输出结果会显示这个概率大约是0.14。在实际业务中我们可以用这个分布来预测服务器负载、库存需求等场景。可视化不同λ值的泊松分布特别能说明问题import numpy as np import matplotlib.pyplot as plt from scipy.stats import poisson lambdas [1, 4, 10] # 不同的平均发生率 x np.arange(0, 20) # 横坐标范围 plt.figure(figsize(10,6)) for lam in lambdas: plt.plot(x, poisson.pmf(x, lam), o-, labelfλ{lam}) plt.title(不同λ值的泊松分布) plt.xlabel(事件发生次数) plt.ylabel(概率) plt.legend() plt.grid(True) plt.show()这张图会清晰展示随着λ增大分布逐渐右移且变得更加对称。当λ10时泊松分布已经很像正态分布了。2. 卡方分布假设检验的基石卡方分布在统计检验中扮演着关键角色特别是在独立性检验和拟合优度检验中。我第一次真正理解它是在分析用户行为数据时需要检验不同年龄组的购买偏好是否独立。卡方分布的形状完全由自由度决定。自由度越大分布越接近正态分布。下面这段代码展示了不同自由度下的卡方分布形态import numpy as np import matplotlib.pyplot as plt from scipy.stats import chi2 dfs [1, 2, 3, 5, 9] # 不同自由度 x np.linspace(0, 20, 500) plt.figure(figsize(10,6)) for df in dfs: plt.plot(x, chi2.pdf(x, df), labelfdf{df}) plt.title(卡方分布随自由度的变化) plt.xlabel(值) plt.ylabel(概率密度) plt.legend() plt.grid(True) plt.show()实际应用中我们常用卡方检验来分析分类变量的关联性。比如检验广告点击率是否与用户性别有关from scipy.stats import chi2_contingency # 构造列联表行代表性别列代表是否点击 observed np.array([[50, 30], [40, 60]]) chi2_stat, p_value, dof, expected chi2_contingency(observed) print(f卡方统计量{chi2_stat:.2f}) print(fP值{p_value:.4f}) print(f自由度{dof})如果P值小于0.05我们就能拒绝原假设认为性别与点击行为有关联。这个简单的检验帮我发现了不少业务中的关键洞察。3. 正态分布无处不在的钟形曲线正态分布可能是最广为人知的概率分布我在处理连续型数据时几乎每天都会遇到它。比如用户停留时长、商品价格、体温测量值等只要样本量足够大很多数据都近似服从正态分布。正态分布的概率密度函数是经典的钟形曲线 f(x) (1/(σ√(2π))) * e^(-(x-μ)²/(2σ²)) 其中μ是均值σ是标准差。Python中我们可以这样计算和绘制import numpy as np import matplotlib.pyplot as plt from scipy.stats import norm mu, sigma 0, 1 # 标准正态分布 x np.linspace(-5, 5, 1000) pdf norm.pdf(x, mu, sigma) cdf norm.cdf(x, mu, sigma) plt.figure(figsize(12,5)) plt.subplot(1,2,1) plt.plot(x, pdf, r-, lw2) plt.title(概率密度函数(PDF)) plt.grid(True) plt.subplot(1,2,2) plt.plot(x, cdf, b-, lw2) plt.title(累积分布函数(CDF)) plt.grid(True) plt.tight_layout() plt.show()正态分布的一个实用特性是68-95-99.7规则约68%的值落在μ±σ内95%在μ±2σ内99.7%在μ±3σ内。这个特性在异常检测中非常有用# 检测异常值示例 data np.random.normal(100, 15, 1000) # 生成正态分布数据 mean, std np.mean(data), np.std(data) # 找出3σ以外的异常值 lower, upper mean - 3*std, mean 3*std outliers [x for x in data if x lower or x upper] print(f异常值数量{len(outliers)})在实际项目中我经常用这个方法来识别可能的异常交易或系统故障。4. t分布小样本的救星t分布在样本量较小通常小于30时特别有用。我第一次真正需要它是在A/B测试中当样本量不足时用t分布比正态分布更准确。它与正态分布形状相似但尾部更厚这意味着它更可能产生远离均值的值。t分布的形状由自由度决定。自由度越小尾部越厚自由度越大越接近正态分布。下面这段代码展示了这个变化过程from scipy.stats import t import numpy as np import matplotlib.pyplot as plt x np.linspace(-5, 5, 1000) normal norm.pdf(x, 0, 1) # 标准正态分布比较 plt.figure(figsize(10,6)) plt.plot(x, normal, k-, lw2, label正态分布) dfs [1, 2, 5, 30] # 不同自由度 for df in dfs: plt.plot(x, t.pdf(x, df), labelft分布(df{df})) plt.title(t分布与正态分布比较) plt.xlabel(值) plt.ylabel(概率密度) plt.legend() plt.grid(True) plt.show()t分布在计算置信区间和进行t检验时非常关键。比如比较两组用户的平均消费from scipy.stats import ttest_ind # 两组用户消费数据 group1 np.random.normal(100, 15, 20) # 样本量20 group2 np.random.normal(110, 15, 20) t_stat, p_value ttest_ind(group1, group2) print(ft统计量{t_stat:.2f}) print(fP值{p_value:.4f}) # 计算95%置信区间 mean1, mean2 np.mean(group1), np.mean(group2) std1, std2 np.std(group1, ddof1), np.std(group2, ddof1) n1, n2 len(group1), len(group2) # t分布的临界值 t_critical t.ppf(0.975, dfn1n2-2) # 双尾检验 margin t_critical * np.sqrt((std1**2/n1) (std2**2/n2)) ci_lower (mean1 - mean2) - margin ci_upper (mean1 - mean2) margin print(f95%置信区间({ci_lower:.2f}, {ci_upper:.2f}))这个分析能帮助我们判断两组差异是否统计显著以及估计差异的可能范围。5. F分布方差分析的利器F分布主要用于比较两组方差是否相等在方差分析(ANOVA)和回归分析中特别重要。我第一次深入使用F分布是在分析多个营销渠道的效果差异时需要用ANOVA来判断不同渠道的转化率是否有显著区别。F分布有两个自由度参数分子自由度(dfn)和分母自由度(dfd)。下面代码展示了不同参数组合下的F分布形态from scipy.stats import f import numpy as np import matplotlib.pyplot as plt x np.linspace(0.1, 5, 500) # F分布定义在(0, ∞) # 不同自由度组合 params [(5, 10), (10, 10), (10, 5)] plt.figure(figsize(10,6)) for dfn, dfd in params: plt.plot(x, f.pdf(x, dfn, dfd), labelfdfn{dfn}, dfd{dfd}) plt.title(不同自由度组合的F分布) plt.xlabel(值) plt.ylabel(概率密度) plt.legend() plt.grid(True) plt.show()在实际应用中我们可以用F检验来比较两组数据的方差from scipy.stats import f_oneway # 三组实验数据 group1 np.random.normal(50, 10, 30) group2 np.random.normal(55, 10, 30) group3 np.random.normal(60, 10, 30) f_stat, p_value f_oneway(group1, group2, group3) print(fF统计量{f_stat:.2f}) print(fP值{p_value:.4f}) if p_value 0.05: print(各组均值存在显著差异) else: print(不能拒绝各组均值相等的原假设)在回归分析中F检验也用于评估整个模型的显著性。比如在多元线性回归中F检验可以判断所有自变量联合起来是否对因变量有显著影响。