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的幂次