Python漫游数学王国 | 直方图和箱线图

简介: 对于杂乱无章的数据,数据的整理与描述显得尤为重要。本文通过例子介绍频数分布表、直方图,以及箱线图的绘制。

640.jpg


对于杂乱无章的数据,数据的整理与描述显得尤为重要。本文通过例子介绍频数分布表、直方图,以及箱线图的绘制。

01、直方图和箱线图

对于杂乱无章的数据,数据的整理与描述显得尤为重要。本节通过例子介绍频数分布表、直方图,以及箱线图的绘制。
【例1】下面列出了84个伊特拉斯坎(Etruscan)人男子的头颅的最大宽度(mm),试画出这些数据的“频率直方图”。

640.png


解 这些数据杂乱无章,先对它们进行整理。首先引入numpy与pandas,代码如下:

640.png


统计数据的最小值与最大值,代码如下:

640.png


运行结果如图1所示。

640.png


■ 图1


可以看到,所有的数据落在区间[126,158]上,现取区间[124.5,159.5],将其等分为7个小区间,代码如下:

640.png


运行结果如图2所示。

640.png


■ 图2


统计落在每个区间的数据频数,代码如下:

640.png


运行结果如图3所示。

640.png


■ 图3


注释/

cut()函数用于将数据进行离散化,即将连续的变量放入离散区间。cut(x, bins,right: bool = True, labels=None, retbins: bool = False,precision: int = 3, include_lowest: bool = False, duplicates: str = 'raise')中参数x是待离散化的一维数组;bins可以是整数,表示将x的范围划分为多少个等距的区间,也可以是一个序列,表示划分的区间端点;right表示是否包含右端点,默认为True;labels表示是否用标签代替返回的区间;precision表示区间端点值的精度;include_lowest表示第一个区间是否包含左端点。
接下来,计算每组的频率以及累计频率,每组频率代码如下:

640.png


运行结果如图4所示。

640.png


■ 图4


计算累积频率,代码如下:

640.png


运行结果如图5所示。

640.png


■ 图5

注释/
(1) Series的values属性可获取其值的数组表示形式。

(2) cumsum()用于求累积和。
绘制频数分布表,代码如下:

640.png


运行结果如图6所示。

640.png


■ 图6

最后,用矩形的面积表示频率,绘制频率直方图,代码如下:

640.png

运行结果如图7所示。

640.png


■ 图7

也可以同时给出数据的核密度估计曲线,代码如下:

640.png


运行结果如图8所示。

640.png


■ 图9

或者拟合正态分布,给出估计的概率密度函数,代码如下:

640.png


运行结果如图10所示。

640.png


■ 图10

注释/
(1) seaborn是基于matplotlib的数据可视化库。它提供了一个高度交互式界面,用于绘制有吸引力和信息丰富的统计图形。

(2) distplot()集合了matplotlib的hist()与seaborn的kdeplot()以及rugplot()。它也可利用scipy库的fit拟合分布,并给出估计的概率密度函数。更多distplot的用法可在jupyter单元格中输入“sns.distplot?”查看。
【例2】设一组容量为18的样本值如下(已经过排序):

640.png


求样本分位数:x0.2,x0.25,x0.5。

解求百分位数可使用numpy中的percentile(),也可使用pandas中的quantile()。

使用percentile()求分位数,代码如下:

640.png


运行结果如图11所示。

640.png


■ 图11

注释/
np.percentile(X,q=[20,25,50])中q指要计算的百分位数或百分位数序列,必须介于0和100(含0和100)。
再来看使用quantile()求分位数,代码如下:

640.png


运行结果如图12所示。

640.png


■ 图12


注释/

(1) quantile()中分位数的表示形式与percentile()不同。

(2) 不同的软件计算的分位数值可能会有出入,原因是计算分位数值时所采取的算法不同。上述两种方法可通过调整参数interpolation,选取不同的插值方法,默认为线性“linear”,还可选取“lower”“higher”“midpoint”“nearest”来实现。

【例3】以下是已经过排序的8个病人的血压(mmHg)数据,试画出箱线图。

640.png


解 代码如下

640.png


运行结果如图13所示。

640.png


■ 图13

注释/
(1) boxplot()用于绘制箱线图,它由五个数值点组成:最小值,下四分位数,中位数,上四分位数,最大值。下四分位数、中位数、上四分位数组成一个“带有隔间的盒子”,也可以往盒子里面加入平均值。箱子两侧的延伸线称为“胡须”,揭示数据的范围,“胡须”外部的点称为离群点。

(2) boxplot()参数众多,这里截取一部分来看:plt.boxplot(x,notch=None,sym=None,vert=None,whis=None,positions=None,widths=None,patch_artist=None,meanline=None,showmeans=None,showcaps=None,showbox=None,showfliers=None,labels=None,)中参数x指定要绘制箱线图的数据,可以是一个数组,或一个数组序列;notch表示是否取凹口的形式展现箱线图,默认非凹口;sym用于指定异常点的形状;vert表示是否将箱线图垂直摆放,默认为垂直摆放;whis指定上下须与上下四分位的距离,默认为1.5倍的四分位间距;positions指定箱线图的位置,默认为[0,1,2,…];widths指定箱线图的宽度;patch_artist表示是否填充箱体的颜色;meanline表示是否用线的形式表示均值,默认用点来表示;showmeans表示是否显示均值,默认不显示;showcaps表示是否显示箱线图顶端和末端的两条线,默认显示;showbox表示是否显示箱线图的箱体,默认显示;showfliers表示是否显示离群值,默认显示;labels为箱线图添加标签,类似于图例的作用。
【例4】下面给出了25个男子和25个女子的肺活量(已排序)。

640.png


试分别画出这两组数据的箱线图。
解 代码如下

640.png


运行结果如图14所示。

640.png


■ 图14

注释/

箱线图特别适用于比较两个或两个以上数据集的性质,因此,常将几个数据集的箱线图画在同一个数轴上。此时只需将参数x设置成数组序列即可,每一个数组表示一个数据集。

目录
相关文章
|
3月前
|
存储 算法 数据挖掘
python 数学+减治、下一个排列法、DFS回溯法实现:第 k 个排列【LeetCode 题目 60】
python 数学+减治、下一个排列法、DFS回溯法实现:第 k 个排列【LeetCode 题目 60】
|
2月前
|
自然语言处理 程序员 编译器
`pylatex`是一个Python库,用于生成LaTeX文档。LaTeX是一种用于高质量排版和打印的文档准备系统,特别适用于科学、技术和数学文档。
`pylatex`是一个Python库,用于生成LaTeX文档。LaTeX是一种用于高质量排版和打印的文档准备系统,特别适用于科学、技术和数学文档。
|
4月前
|
存储 算法 决策智能
Python 数学应用(三)(3)
Python 数学应用(三)
55 2
Python 数学应用(三)(3)
|
3月前
|
Python
Python学习笔记之Matplotlib模块入门(直线图、折线图、曲线图、散点图、柱状图、饼状图、直方图、等高线图和三维图的绘制)-2
Python学习笔记之Matplotlib模块入门(直线图、折线图、曲线图、散点图、柱状图、饼状图、直方图、等高线图和三维图的绘制)
|
3月前
|
数据可视化 开发者 Python
Python学习笔记之Matplotlib模块入门(直线图、折线图、曲线图、散点图、柱状图、饼状图、直方图、等高线图和三维图的绘制)-1
Python学习笔记之Matplotlib模块入门(直线图、折线图、曲线图、散点图、柱状图、饼状图、直方图、等高线图和三维图的绘制)
|
4月前
|
消息中间件 Kafka Python
Python 数学应用(四)(3)
Python 数学应用(四)
48 5
|
4月前
|
分布式计算 调度 异构计算
Python 数学应用(四)(4)
Python 数学应用(四)
241 4
|
4月前
|
存储 消息中间件 Kafka
Python 数学应用(四)(1)
Python 数学应用(四)
38 2
|
4月前
|
机器学习/深度学习 存储 算法
Python 数学应用(三)(4)
Python 数学应用(三)
55 2
|
4月前
|
存储 传感器 数据可视化
Python 数学应用(四)(2)
Python 数学应用(四)
34 0
Python 数学应用(四)(2)