对于杂乱无章的数据,数据的整理与描述显得尤为重要。本文通过例子介绍频数分布表、直方图,以及箱线图的绘制。
01、直方图和箱线图
对于杂乱无章的数据,数据的整理与描述显得尤为重要。本节通过例子介绍频数分布表、直方图,以及箱线图的绘制。
【例1】下面列出了84个伊特拉斯坎(Etruscan)人男子的头颅的最大宽度(mm),试画出这些数据的“频率直方图”。
解 这些数据杂乱无章,先对它们进行整理。首先引入numpy与pandas,代码如下:
统计数据的最小值与最大值,代码如下:
运行结果如图1所示。
■ 图1
可以看到,所有的数据落在区间[126,158]上,现取区间[124.5,159.5],将其等分为7个小区间,代码如下:
运行结果如图2所示。
■ 图2
统计落在每个区间的数据频数,代码如下:
运行结果如图3所示。
■ 图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表示第一个区间是否包含左端点。
接下来,计算每组的频率以及累计频率,每组频率代码如下:
运行结果如图4所示。
■ 图4
计算累积频率,代码如下:
运行结果如图5所示。
■ 图5
注释/
(1) Series的values属性可获取其值的数组表示形式。
(2) cumsum()用于求累积和。
绘制频数分布表,代码如下:
运行结果如图6所示。
■ 图6
最后,用矩形的面积表示频率,绘制频率直方图,代码如下:
运行结果如图7所示。
■ 图7
也可以同时给出数据的核密度估计曲线,代码如下:
运行结果如图8所示。
■ 图9
或者拟合正态分布,给出估计的概率密度函数,代码如下:
运行结果如图10所示。
■ 图10
注释/
(1) seaborn是基于matplotlib的数据可视化库。它提供了一个高度交互式界面,用于绘制有吸引力和信息丰富的统计图形。
(2) distplot()集合了matplotlib的hist()与seaborn的kdeplot()以及rugplot()。它也可利用scipy库的fit拟合分布,并给出估计的概率密度函数。更多distplot的用法可在jupyter单元格中输入“sns.distplot?”查看。
【例2】设一组容量为18的样本值如下(已经过排序):
求样本分位数:x0.2,x0.25,x0.5。
解求百分位数可使用numpy中的percentile(),也可使用pandas中的quantile()。
使用percentile()求分位数,代码如下:
运行结果如图11所示。
■ 图11
注释/
np.percentile(X,q=[20,25,50])中q指要计算的百分位数或百分位数序列,必须介于0和100(含0和100)。
再来看使用quantile()求分位数,代码如下:
运行结果如图12所示。
■ 图12
注释/
(1) quantile()中分位数的表示形式与percentile()不同。
(2) 不同的软件计算的分位数值可能会有出入,原因是计算分位数值时所采取的算法不同。上述两种方法可通过调整参数interpolation,选取不同的插值方法,默认为线性“linear”,还可选取“lower”“higher”“midpoint”“nearest”来实现。
【例3】以下是已经过排序的8个病人的血压(mmHg)数据,试画出箱线图。
解 代码如下
运行结果如图13所示。
■ 图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个女子的肺活量(已排序)。
试分别画出这两组数据的箱线图。
解 代码如下
运行结果如图14所示。
■ 图14
注释/
箱线图特别适用于比较两个或两个以上数据集的性质,因此,常将几个数据集的箱线图画在同一个数轴上。此时只需将参数x设置成数组序列即可,每一个数组表示一个数据集。
评论(0)