Python 数据可视化:绘制箱线图、饼图和直方图

上一课介绍了柱形图和条形图,本课将介绍另外几种统计图表。

1.6.1 箱线图

Box Plot 有多种翻译,盒须图、盒式图、盒状图或箱线图、箱形图等,不管什么名称,它的基本结构是这样的:

image

这种图是由美国著名统计学家约翰·图基(John Tukey)于 1977 年发明的,它能显示出一组数据的上限、下限、中位数及上下四分位数。

  • 中位数:由矩形箱子中的线表示。中位数常用于度量数据的中心,一半观测值小于等于该值,而另一半则大于等于该值。
  • 四分位间距框:四分位间距框表示中间 50% 的数据,即上图中的矩形框,它的上下边之间的距离表示“上四分位数 Q3”和“下四分位数 Q1”的差(Q3-Q1)。
  • 须和上限、下限:由矩形框向两侧延伸的线段,线段的终点分别称为“上限”和“下限”。
  • 异常值:超出“上限”和“下限”范围的值。

为了更深入理解箱线图的含义,假设有这样一组数据:[1, 3, 5, 8, 10,11, 16, 98 ],共有 8 个数字。

首先要计算箱线图中的“四分位数”,注意不是 4 个数:

  • Q1 = 第 1 四分位数、下四分位数,即第 25 百分位数,Q1 的位置 =
    image.png
  • Q2 = 第 2 四分位数、中位数,即第 50 百分位数,Q2 的位置 =
    image.png
  • Q3 = 第 3 四分位数、上四分位数,即第 75 百分位数,Q3 的位置 =
    image.png

对于已经排序的数据 [1, 3, 5, 8, 10,11, 16, 98 ],下四分位数(Q1)的位置是数列中从小到大第 2.25 个数,当然是不存在这个数字的——如果是第 2 个或者第 3 个,则存在。但是,可以用下面的原则,计算出此位置的数值。

四分位数等于与该位置两侧的两个整数的加权平均数,此权重取决于相对两侧整数的距离远近,距离越近,权重越大,距离越远,权重越小,权数之和等于 1。

根据这个原则,可以分别计算本例中数列的 3 个四分位数。

image
  • Q1 = 3 × 0.75 + 5 × 0.25 = 3.5
  • Q2 = 8 × 0.5 + 10 × 0.5 = 9
  • Q3 = 11 × 0.25 + 16 × 0.75 = 14.75

在此计算基础上,还可以进一步计算四分位间距和上限、下限的数值。

  • 四分位间距:IQR = Q3 - Q1 = 11.25
  • 上限 = Q3 + 1.5 × IQR = 14.75 + 1.5 × 11.25 = 31.625
  • 下限 = Q1 - 1.5 × IQR = 3.3 - 1.5 × 11.25 = ﹣13.375

注意:凡是落在上下限以外的数据,都是离群值。上述计算中,并没有把离群值剔除,因此导致下限出现了负数。下面我们要使用 Matplotlib 中的专有方法绘制箱线图,该方法会把离群值剔除之后计算。

先看一个简单示例,了解基本的流程。

%matplotlib inline
import matplotlib.pyplot as plt

fig,ax = plt.subplots(1, 2)
data = [1, 5, 9, 2]
ax[0].boxplot([data]) 
ax[0].grid(True)
ax[1].boxplot([data], showmeans=True)    # 显示平均值
ax[1].grid(True)

输出结果:

image

这里绘制了两张箱线图,一张没有显示平均值,另外一张显示了平均值,所使用的方法就是 boxplot,其完整参数列表为:

plt.boxplot(x, notch=None, sym=None, vert=None, whis=None, positions=None, widths=None, patch_artist=None, bootstrap=None, usermedians=None, conf_intervals=None, meanline=None, showmeans=None, showcaps=None, showbox=None, showfliers=None, boxprops=None, labels=None, flierprops=None, medianprops=None, meanprops=None, capprops=None, whiskerprops=None, manage_xticks=True, autorange=False, zorder=None, *, data=None)

参数很多,不要担心记忆问题,更别担心理解问题。首先很多参数都是可以“望文生义”的,再有,与以前所使用的其他方法(函数)的参数含义也大同小异。

  • notch:默认为 None,如果为 True,则意味着绘制有凹槽的箱线图。
  plt.boxplot([2,4,6,8,10], notch=True)
  plt.grid(1)

输出结果:

image

所谓的“凹槽”,不是简单形状的改变,左右折线的上限区间表示了数据分布的置信区间,横线依然是上限和下限。

  • vert:设置箱线图是竖直还是水平,默认为 True,如果设置为 False,则水平。
  • bootstrap:这个参数与前面的 notch 配合,用于设置置信区间。

你可能感兴趣的:(Python 数据可视化:绘制箱线图、饼图和直方图)