整理数据制作 直方图,箱须图,概率密度估计(KDE)图

1.导入库和设置
import math
import numpy as np
import matplotlib.mlab as mlab
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif']=['SimHei'] # 设置中文字体,作用设置 matplotlib 使用中文字体显示文本

rcParams:matplotlib 的配置参数字典,用于控制图表的各种默认设置

'font.sans-serif':指定无衬线字体族

['SimHei']:字体列表,SimHei 是 Windows 系统自带的中文字体"黑体"

plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题

'axes.unicode_minus':控制坐标轴负号的显示方式

False:使用 ASCII 的减号 -,而不是 Unicode 的负号

2.数据准备
z = [6.0, 5.9, 3.5 , 2.9 , 8.7 , 7.9 , 7.1 , 5.0 , 5.2 , 3.9,
3.7, 6.1, 5.8, 4.1, 5.8, 6.4, 3.8, 4.9, 5.7, 5.5,
6.9, 4.0 , 4.8, 5.1, 4.3, 5.4, 6.8 , 5.9, 6.9, 5.4,
2.4, 4.9, 7.2, 4.2 , 6.2 , 5.8 , 3.8 , 6.2 , 5.7 , 6.8,
3.4 , 5.0 , 5.2, 5.3 , 3.0, 3.6, 3.8, 5.8, 4.9, 3.7]

3.直方图
low = min(z) # 最小值 = 2.4
high = max(z) # 最大值 = 8.7
bins = [i for i in range(math.floor(low), math.ceil(high)+1)] # 创建分组区间 [2,3,4,5,6,7,8,9]

plt.hist(z, bins, weights=np.zeros_like(z)+1./len(z)) # 绘制频率直方图

基础参数:z:输入的数据数组,bins:直方图的分组区间(如 [2,3,4,5,6,7,8,9])

解释第三个参数:

逐步分解:

len(z) 数据总个数,比如50

1./len(z) 1/50 = 0.02,每个数据点的权重

np.zeros_like(z) 创建与z形状相同的全0数组

np.zeros_like(z)+1./len(z) 每个元素都变成 0.02

plt.legend() #显示图例,在这里没有,因为上一行代码plt.hist没有设置label
plt.title(u'频率直方图') #u 前缀表示这是一个 Unicode 字符串
plt.show()

4.箱须图
plt.boxplot(z) #箱须图需要的五个关键统计量都会自动计算:最小值(排除异常值后),第一四分位数 (Q1),中位数 (Q2),第三四分位数 (Q3),最大值(排除异常值后),异常值(基于 IQR 自动识别)
plt.title(u'销售金额箱须图')
plt.show()

5.正态概率分布图
z = np.array(z)
u = z.mean() # 计算均值
var = z.var() # 计算方差
sigma = math.sqrt(var) # 计算标准差

生成正态分布曲线数据

xx = np.linspace(u-3sigma, u+3sigma, num=100)

参数解释:u-3sigma:均值减去 3 倍标准差,u+3sigma:均值加上 3 倍标准差,num=100:生成 100 个等间距点,u±3*sigma 覆盖了99.73% 的数据,能够完整展示正态分布的主要特征。

yy = [np.exp(-(x-u)2/(2*sigma2))/(sigmamath.sqrt(2math.pi)) for x in xx]

f(x) = (1 / (σ√(2π))) * e^(-(x-μ)²/(2σ²))

plt.plot(xx, yy)
plt.title(u'正态概率分布图')
plt.show()

解答疑惑:
-(1)为什么要导入数学库import math # 导入数学库

代码中使用到的 math 函数:

math.floor(low) # 向下取整,用于确定直方图的最小边界
math.ceil(high) # 向上取整,用于确定直方图的最大边界
math.sqrt(var) # 开平方根,计算标准差
math.pi # 圆周率 π,用于正态分布公式
math.sqrt(2*math.pi) # 计算 2π 的平方根
-(2)为什么要导入数学库import numpy as np
numpy 是 Python 中最重要的科学计算库,提供了高效的数组操作和数学函数。

1. 将普通列表转为numpy数组,便于数学运算

z = np.array(z)

2. 计算统计量(比手动计算方便得多)

u = z.mean() # 平均值
var = z.var() # 方差

3. 创建权重数组,用于直方图频率计算

weights=np.zeros_like(z)+1./len(z)

相当于创建了一个数组,每个元素都是 1/数据个数

这样直方图显示的是频率而不是计数

4. 生成平滑的x坐标点,用于绘制正态分布曲线

xx = np.linspace(u-3sigma, u+3sigma, num=100)

在 [均值-3标准差, 均值+3标准差] 范围内生成100个等间距点

5. 计算正态分布概率密度函数

np.exp(-(x-u)2/(2*sigma2)) # 计算e的幂次

posted @ 2025-10-05 12:22  JY鲸鱼儿  阅读(4)  评论(0)    收藏  举报