6.5 箱线图

箱线图(又称盒须图)通过绘制连续型变量的五数总括,即最小值、下四分位数(第25百分位数)、中位数(第50百分位数)、上四分位数(第75百分位数)以及最大值,描述了连续型变量的分布。箱线图能够显示出可能为离群点(范围±1.5*IQR以外的值,IQR表示四分位距,即上四分位数与下四分位数的差值)的观测。例如:

  1. boxplot(mtcars$mpg, main="Box plot", ylab="Miles per Gallon")

生成了如图6-11所示的图形。为了图解各个组成部分,我手工添加了标注。

默认情况下,两条须的延伸极限不会超过盒型各端加1.5倍四分位距的范围。此范围以外的值将以点来表示(在这里没有画出)。

举例来说,在我们的车型样本中,每加仑汽油行驶英里数的中位数是19.2,50%的值都落在了15.3和22.8之间,最小值为10.4,最大值为33.9。我是如何从图中如此精确地读出了这些值呢?执行boxplot.stats(mtcars$mpg)即可输出用于构建图形的统计量(换句话说,我作弊了)。图中似乎不存在离群点,而且略微正偏(上侧的须较下侧的须更长)。

6.5 箱线图 - 图1

图6-11 含手工标注的箱线图

6.5.1 使用并列箱线图进行跨组比较

箱线图可以展示单个变量或分组变量。使用格式为:

  1. boxplot(formula, data=dataframe)

其中的formula是一个公式,dataframe代表提供数据的数据框(或列表)。一个示例公式为y ~ A,这将为类别型变量A的每个值并列地生成数值型变量y的箱线图。公式y ~ A*B则将为类别型变量AB所有水平的两两组合生成数值型变量y的箱线图。

添加参数varwidth=TRUE将使箱线图的宽度与其样本大小的平方根成正比。参数horizontal=TRUE可以反转坐标轴的方向。

在以下代码中,我们使用并列箱线图重新研究了四缸、六缸、八缸发动机对每加仑汽油行驶的英里数的影响。结果如图6-12所示。

  1. boxplot(mpg ~ cyl, data=mtcars,
  2. main="Car Mileage Data",
  3. xlab="Number of Cylinders",
  4. ylab="Miles Per Gallon")

6.5 箱线图 - 图2

图6-12 不同汽缸数量车型油耗的箱线图

在图6-12中可以看到不同组间油耗的区别非常明显。同时也可以发现,六缸车型的每加仑汽油行驶的英里数分布较其他两类车型更为均匀。与六缸和八缸车型相比,四缸车型的每加仑汽油行驶的英里数散布最广(且正偏)。在八缸组还有一个离群点。

箱线图灵活多变,通过添加notch=TRUE,可以得到含凹槽的箱线图。若两个箱的凹槽互不重叠,则表明它们的中位数有显著差异(Chambers et al., 1983, p. 62)。以下代码将为我们的车型油耗示例创建一幅含凹槽的箱线图:

  1. boxplot(mpg ~ cyl, data=mtcars,
  2. notch=TRUE,
  3. varwidth=TRUE,
  4. col="red",
  5. main="Car Mileage Data",
  6. xlab="Number of Cylinders",
  7. ylab="Miles Per Gallon")

参数col以红色填充了箱线图,而varwidth=TRUE则使箱线图的宽度与它们各自的样本大小成正比。

在图6-13中可以看到,四缸、六缸、八缸车型的油耗中位数是不同的。随着汽缸数的减少,油耗明显降低。

最后,你可以为多个分组因子绘制箱线图。代码清单6-9为不同缸数和不同变速箱类型的车型绘制了每加仑汽油行驶英里数的箱线图。同样地,这里使用参数col为箱线图进行了着色。请注意颜色的循环使用。在本例中,共有六幅箱线图和两种指定的颜色,所以颜色将重复使用三次。

6.5 箱线图 - 图3

图6-13 不同汽缸数量车型油耗的含凹槽箱线图

代码清单6-9 两个交叉因子的箱线图

  1. mtcars$cyl.f <- factor(mtcars$cyl, # 创建汽缸数量的因子
  2. levels=c(4,6,8),
  3. labels=c("4","6","8"))
  4. mtcars$am.f <- factor(mtcars$am, # 创建变速箱类型的因子
  5. levels=c(0,1),
  6. labels=c("auto", "standard"))
  7. boxplot(mpg ~ am.f *cyl.f, # 生成箱线图
  8. data=mtcars,
  9. varwidth=TRUE,
  10. col=c("gold","darkgreen"),
  11. main="MPG Distribution by Auto Type",
  12. xlab="Auto Type")

图形如图6-14所示。

图6-14再一次清晰地显示出油耗随着缸数的下降而减少。对于四缸和六缸车型,标准变速箱(standard)的油耗更高。但是对于八缸车型,油耗似乎没有差别。你也可以从箱线图的宽度看出,四缸标准变速箱的车型和八缸自动变速箱的车型在数据集中最常见。

6.5 箱线图 - 图4

图6-14 不同变速箱类型和汽缸数量车型的箱线图(另见彩插图6-14)

6.5.2 小提琴图

在结束箱线图的讨论之前,有必要研究一种称为小提琴图(violin plot)的箱线图变种。小提琴图是箱线图与核密度图的结合。你可以使用vioplot包中的vioplot()函数绘制它。请在第一次使用之前先安装vioplot包。

vioplot()函数的使用格式为:

  1. Vioplot(x1,x2,…,names=,col=)

其中x1, x2, …表示要绘制的一个或多个数值向量(将为每个向量绘制一幅小提琴图)。参数names是小提琴图中标签的字符向量,而col是一个为每幅小提琴图指定颜色的向量。

代码清单6-10中给出了一个示例。

代码清单6-10 小提琴图

  1. library(vioplot)
  2. x1 <- mtcars$mpg[mtcars$cyl==4]
  3. x2 <- mtcars$mpg[mtcars$cyl==6]
  4. x3 <- mtcars$mpg[mtcars$cyl==8]
  5. vioplot(x1, x2, x3,
  6. names=c("4 cyl", "6 cyl", "8 cyl"),
  7. col="gold")
  8. title("Violin Plots of Miles Per Gallon")

注意 vioplot()函数要求你将要绘制的不同组分离到不同的变量中。结果如图6-15所示。

6.5 箱线图 - 图5

图6-15 汽缸数量和每加仑汽油行驶英里数的小提琴图

小提琴图基本上是核密度图以镜像方式在箱线图上的叠加。在图中,白点是中位数,黑色盒型的范围是下四分位点到上四分位点,细黑线表示须。外部形状即为核密度估计。小提琴图还没有真正地流行起来。同样,这可能也是由于普遍缺乏方便好用的软件导致的。时间会证明一切。

我们将以点图结束本章。与之前看到的图形不同,点图绘制变量中的所有值。