news 2026/7/5 7:18:08

高斯分布 Python 3.11 实战:5个真实数据集拟合与3种可视化对比

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
高斯分布 Python 3.11 实战:5个真实数据集拟合与3种可视化对比

高斯分布 Python 3.11 实战:5个真实数据集拟合与3种可视化对比

当我们面对一组未知分布的数据时,高斯分布(正态分布)往往是第一个被考虑的模型。这不仅因为它在统计学中的核心地位,更因为自然界中大量现象都遵循或近似这种分布。本文将带你用Python 3.11的最新特性,对五个真实数据集进行高斯分布拟合与检验,并通过三种可视化方法对比分析结果。

1. 环境准备与数据加载

在开始之前,确保你的Python环境已安装以下库:

pip install numpy scipy matplotlib pandas seaborn statsmodels

我们将使用五个经典数据集:

  • 鸢尾花花瓣长度(Iris dataset)
  • 某城市日平均温度(气象数据)
  • 学生考试成绩(模拟数据)
  • 股票日收益率(金融数据)
  • 人类身高分布(人口统计数据)

以鸢尾花数据为例,加载数据并查看基本统计量:

import seaborn as sns iris = sns.load_dataset('iris') setosa_petal = iris[iris['species'] == 'setosa']['petal_length'] print(f"均值: {setosa_petal.mean():.2f}") print(f"标准差: {setosa_petal.std():.2f}") print(f"偏度: {setosa_petal.skew():.2f}")

2. 参数估计与分布拟合

2.1 最大似然估计(MLE)

对于高斯分布,MLE给出的参数估计与样本均值、方差一致:

from scipy.stats import norm mu, sigma = norm.fit(setosa_petal) print(f"MLE估计 - 均值: {mu:.2f}, 标准差: {sigma:.2f}")

2.2 拟合优度检验

Kolmogorov-Smirnov检验可以量化拟合效果:

from scipy.stats import kstest ks_stat, p_value = kstest(setosa_petal, 'norm', args=(mu, sigma)) print(f"KS统计量: {ks_stat:.3f}, p值: {p_value:.3f}")

注意:当p值>0.05时,不能拒绝数据来自高斯分布的原假设

2.3 多数据集对比

下表展示了五个数据集的拟合结果:

数据集样本量均值(μ)标准差(σ)KS统计量p值
鸢尾花花瓣501.460.170.0720.791
城市温度36518.25.30.0420.152
考试成绩20073.512.10.0380.214
股票收益2520.0010.0230.1210.003
身高数据1000170.28.50.0180.482

从结果可见,股票收益率数据明显偏离高斯分布(p=0.003),这与金融数据的"厚尾"特性一致。

3. 可视化对比分析

3.1 直方图与PDF叠加

最直观的方法是叠加理论PDF曲线:

import matplotlib.pyplot as plt import numpy as np plt.figure(figsize=(10,6)) counts, bins, _ = plt.hist(setosa_petal, bins=15, density=True, alpha=0.6) x = np.linspace(bins[0], bins[-1], 100) plt.plot(x, norm.pdf(x, mu, sigma), 'r-', lw=2) plt.title('花瓣长度分布与高斯拟合') plt.xlabel('长度(cm)') plt.ylabel('概率密度')

3.2 Q-Q图检验

分位数-分位数图能更敏感地检测分布偏离:

from statsmodels.graphics.gofplots import qqplot plt.figure(figsize=(10,6)) qqplot(setosa_petal, line='s') plt.title('花瓣长度Q-Q图')

理想的高斯分布应使数据点落在红色参考线上。若出现以下情况需注意:

  • 两端偏离:厚尾或薄尾
  • S型曲线:偏态分布
  • 凸/凹曲线:峰度差异

3.3 箱线图与分布特性

箱线图能直观展示关键分布特征:

plt.figure(figsize=(8,6)) plt.boxplot(setosa_petal, vert=False) plt.title('花瓣长度箱线图') plt.yticks([]) plt.xlabel('长度(cm)')

重点关注:

  • 箱体位置对应四分位数
  • 须线长度反映1.5IQR范围
  • 离群点标识异常值

4. 高级应用与陷阱规避

4.1 数据变换技巧

当数据明显偏离高斯分布时,可尝试:

# 对数变换 log_data = np.log1p(skewed_data) # Box-Cox变换 from scipy.stats import boxcox transformed, _ = boxcox(positive_data)

4.2 混合分布建模

对于多峰数据,考虑高斯混合模型(GMM):

from sklearn.mixture import GaussianMixture gmm = GaussianMixture(n_components=2).fit(data.reshape(-1,1))

4.3 常见误区

  • 忽视样本量影响:小样本KS检验功效低
  • 盲目假设正态性:金融、极端事件数据常非正态
  • 过度依赖p值:结合图形判断更可靠

5. 自动化检验流程

封装一个完整的检验函数:

def gaussian_check(data, name=""): # 参数估计 mu, sigma = norm.fit(data) # 检验 ks_stat, p_val = kstest(data, 'norm', args=(mu, sigma)) skew = stats.skew(data) kurt = stats.kurtosis(data) # 绘图 fig, ax = plt.subplots(1, 3, figsize=(18,5)) # 直方图 ax[0].hist(data, bins=20, density=True, alpha=0.6) x = np.linspace(min(data), max(data), 100) ax[0].plot(x, norm.pdf(x, mu, sigma), 'r-') ax[0].set_title(f'{name}分布拟合') # Q-Q图 qqplot(data, line='s', ax=ax[1]) ax[1].set_title('Q-Q图') # 箱线图 ax[2].boxplot(data, vert=False) ax[2].set_title('箱线图') plt.tight_layout() return { 'mean': mu, 'std': sigma, 'ks_stat': ks_stat, 'p_value': p_val, 'skewness': skew, 'kurtosis': kurt }

实际项目中,发现温度数据和身高数据最容易通过正态性检验,而金融数据即使经过对数变换,仍常表现出明显的峰度和偏度。最实用的建议是:永远先用可视化方法检查数据,再决定合适的建模策略。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/5 7:14:03

Windows桌面焕新之旅:用TranslucentTB打造个性任务栏的完整指南

Windows桌面焕新之旅:用TranslucentTB打造个性任务栏的完整指南 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB 你是否厌倦了…

作者头像 李华
网站建设 2026/7/5 7:12:54

低成本工业控制器按键方案:74HC32与PIC32MZ实现多功能控制

1. 项目背景与核心思路最近在工业控制器项目中遇到一个有趣的挑战:如何在有限的硬件资源下实现多功能控制?传统方案要么需要增加物理按键数量(导致面板臃肿),要么采用昂贵的编码器(成本飙升)。经…

作者头像 李华
网站建设 2026/7/5 7:11:34

3个步骤搞定Zotero中文文献管理:茉莉花插件完全指南

3个步骤搞定Zotero中文文献管理:茉莉花插件完全指南 【免费下载链接】jasminum A Zotero add-on to retrive CNKI meta data. 一个简单的Zotero 插件,用于识别中文元数据 项目地址: https://gitcode.com/gh_mirrors/ja/jasminum 还在为Zotero无法…

作者头像 李华
网站建设 2026/7/5 7:11:29

LTC6903与PIC18LF25K42构建数字控制振荡器系统

1. 项目背景与核心器件选型在嵌入式系统设计中,数字控制振荡器(DCO)是实现精确频率调节的关键模块。LTC6903作为Linear Technology(现属ADI)推出的精密可编程振荡器IC,配合PIC18LF25K42这款低功耗高性能微控制器,能够构建一个灵活可靠的数字控…

作者头像 李华
网站建设 2026/7/5 7:10:54

LTC6903与MKV44F数字控制振荡器设计与实现

1. 项目背景与核心器件选型数字控制振荡器(DCO)在现代电子系统中扮演着关键角色,特别是在需要精确频率调谐的场合。本次项目采用LTC6903可编程振荡器和MKV44F256VLH16微控制器构建一个高灵活性的数字控制振荡系统。LTC6903是Linear Technology(现属ADI)推出的一款低…

作者头像 李华
网站建设 2026/7/5 7:10:18

PUBG罗技鼠标宏压枪脚本:从零开始掌握精准射击的终极指南

PUBG罗技鼠标宏压枪脚本:从零开始掌握精准射击的终极指南 【免费下载链接】logitech-pubg PUBG no recoil script for Logitech gaming mouse / 绝地求生 罗技 鼠标宏 项目地址: https://gitcode.com/gh_mirrors/lo/logitech-pubg 还在为PUBG中难以控制的武器…

作者头像 李华