第 1 章 探索性数据分析

第 1 章 探索性数据分析

在过去的一个世纪中,统计学作为一门学科得到了长足的发展。概率论是统计学的数学基础,它基于托马斯 • 贝叶斯、皮埃尔 • 西蒙 • 拉普拉斯和卡尔 • 高斯等人的工作,在 17 世纪至 19 世纪期间形成并发展。与概率论的纯理论本质不同,统计学是一门应用科学,关注的是数据的分析和建模。现代统计学是一门严谨的科学,其根源可上溯至 19 世纪末的弗朗西斯 • 高尔顿和卡尔 • 皮尔逊。20 世纪初,罗纳德 • 艾尔默 • 费希尔成为现代统计学的先驱之一,他提出了实验设计法最大似然估计等重要概念。不少其他统计学概念在很大程度上也深深地植根于数据科学中。本书的主要目标就是帮助你理解这些概念,并阐明这些概念在数据科学和大数据的背景下是否依然重要。

本章的重点是探索数据,这是所有数据科学项目的第一步。探索性数据分析(EDA)是统计学中一个相对新的领域。经典统计学几乎只注重推断,即从小样本得出关于整体数据的结论,这往往是一个复杂的过程。1962 年,约翰 • 图基(图 1-1)发表了一篇著名的论文“The Future of Data Analysis”,由此引发了对统计学的重构。在论文中,图基提出了他称之为数据分析的一门新学科,并将统计推断包括于其中,由此建立了与工程和计算机科学界的联系[他提出了术语比特软件,其中“比特”(bit)是“二进制数字”(binary digit)的缩写]。出乎意料的是,这一初始理念被延续了下来,并成为了数据科学的基础之一。图基编著并在 1977 年出版了 Exploratory Data Analysis 一书,该书开创了探索性数据分析这一研究领域,现已成为一本经典图书。

{%}

图 1-1:约翰 • 图基,著名统计学家,他在 50 多年前提出的理论构成了数据科学的基础

随着计算能力和数据分析软件可用性的提高,探索性数据分析的发展已远超其最初的范围。该学科的主要驱动力来自于新技术的快速发展、更多及更大规模的可访问数据,以及定量分析在多个学科中更广泛的应用。斯坦福大学统计学教授戴维 • 多诺霍曾撰写过一篇很好的文章,文中将数据科学的起源追溯为图基在数据分析领域所做的开创性工作。多诺霍教授在本科期间曾得到图基的指导,该文是他基于自己在美国新泽西州普林斯顿召开的图基教授百年纪念研讨会上的演讲 1 而撰写的。

1Donoho, David.“50 Years of Data Science”(2015).

1.1 结构化数据的组成

数据的来源非常丰富,例如传感器的测量值、事件、文本、图像和视频等,并且物联网正在涌出大量信息流。这些数据大多是非结构化的。例如,图像由一系列像素点组成,每个像素包括了红、绿、蓝三原色信息;文本是单词和非单词字符的序列,常以章节、子章节等形式组织在一起;点击流是用户在 App 或 Web 页面上的动作序列。事实上,如何将大量的原始数据转化为可操作的信息,这才是数据科学所面对的主要挑战。要使用本书中介绍的统计学概念,就必须将非结构化的原始数据结构化(就像是从关系型数据库中取出的数据那样),或者出于研究目的采集数据。

主要术语

连续型数据

  数据可在一个区间内取任何值。

  同义词:区间数据、浮点型数据、数值数据

离散型数据

  数据只能取整数,例如计数。

  同义词:整数型数据、计数型数据

分类型数据

  数据只能从特定集合中取值,表示一系列可能的分类。

  同义词:枚举数据、列举数据、因子数据、标称数据、多分支数据

二元数据

  一种特殊的分类数据,数据值只能从两个值中取其一(例如 0 或1,True 或 False)。

  同义词:二分数据、逻辑型数据、指示器数据、布尔型数据

有序数据

  具有明确排序的分类数据。

  同义词:有序因子数据

结构化数据有两种基本类型,即数值型数据和分类数据。数值型数据有连续型离散型两种形式。风速、持续时间等是连续型数据,而某一事件的发生次数则是离散型数据。分类数据只能取一系列固定的值,例如,电视屏幕的类型可以是等离子体、LCD 或 LED 等,美国各州的名称包括阿拉巴马州、阿拉斯加州等。二元数据是一种重要且特殊的分类数据,该类数据的取值只在两者中择其一,例如 0 或 1、是或否、True 或 False 等。有序数据是另一种有用的分类数据,该类数据是按分类排序的,例如数值排序(1、2、3、4 或 5)。

我们为什么要关心数据类型的分类呢?事实表明,在数据分析和预测建模中,数据类型对于确定可视化类型、数据分析或统计模型是非常重要的。R 和 Python 等数据科学软件也使用数据类型去改进计算性能。更重要的是,变量的数据类型决定了软件处理变量计算的方法。

对此,软件工程师和数据库编程人员可能会产生疑问:为什么我们在数据分析中也需要了解分类数据有序数据呢?毕竟,分类数据只是一组文本值(或数值),数据的内部表示会被后台的数据库自动处理。但是,相比于文本表示,将数据显式地标识为分类数据的确具有如下优点。

  • 如果我们明确输入的是分类数据,那么软件就可以据此确定统计过程的工作方式,例如图表生成或模型拟合。具体到 R 和 Python 中,有序数据可用 ordered.factor 表示,这样用户指定的顺序就能保持在图、表和模型中。
  • 可以优化存储和索引,如同在关系型数据库中那样。
  • 限定了给定分类变量在软件中的可能取值,例如枚举类型。

第三个优点可能会导致一些令人意想不到的行为。R 语言的数据导入函数(例如 read.csv)默认将一列文本自动转换为因子(factor)。随后操作该列数据时,会假定所允许的值局限于先前已导入的值。此时赋值一个新的文本值,将会触发警告,并生成 NA(即缺失值)。

本节要点

  • 在软件中,数据通常按类型分类。
  • 数据类型包括连续型数据、离散型数据、分类数据(其中包括二进制数据)和有序数据。
  • 数据分类为软件指明了数据的处理方式。

拓展阅读

  • 数据类型有时会令人困惑,因为各类型间会有一些重叠,而且不同软件的数据分类可能各有不同。R Tutorial 网站给出了 R 语言使用的分类方式。
  • 数据库有更详细的数据分类方式,其中考虑了精度级别、固定长度或可变长度字段等因素。参见 W3Schools 的 SQL 指南。

1.2 矩形数据

矩形数据对象是数据科学分析中的典型引用结构,矩形数据对象包括电子表格、数据库表等。

主要术语

数据框

  电子表格等矩形数据是统计和机器学习模型中的基本数据结构。

数据特征

  通常称数据表中的一列为一个特征

  同义词:属性、输入、预测因子、变量

结果

  不少数据科学项目涉及对结果的预测,常见的结果为“是”或“否”(例如表1-1中的“拍卖是否竞价?”)。特征有时在实验或研究中用于预测结果

  同义词:因变量、响应、目标、输出

记录

  通常称数据表中的一行为一条记录

  同义词:事例、例子、实例、观察、模式、样本

矩形数据本质上是一个二维矩阵,其中行表示记录(事例),列表示特征(变量)。数据通常并非一开始就是矩阵形式的。例如,文本等非结构化数据必须先经处理和操作,才能表示为矩形数据形式的一系列特征(参见 1.1 节)。对于很多数据分析和建模任务,存储在关系型数据库中的数据必须先被抽取出来,并置于一张表中。

表 1-1 显示了测量数据或计数数据(例如“持续时间”和“成交价”)及分类数据(例如“分类”和“货币”)。如上所述,二元变量(例如“是”或“否”,0 或 1)是一种特殊的分类数据。表 1-1 的最右一列是一个指标变量,表示拍卖是否进行了竞价。

表1-1:一种常见的数据格式

分类

货币

卖家评级

持续时间

终止日期

成交价

开拍价

是否竞价

音乐 / 电影 / 游戏

美元

3249

5

周一

0.01

0.01

0

音乐 / 电影 / 游戏

美元

3249

5

周一

0.01

0.01

0

汽车

美元

3115

7

周二

0.01

0.01

0

汽车

美元

3115

7

周二

0.01

0.01

0

汽车

美元

3115

7

周二

0.01

0.01

0

汽车

美元

3115

7

周二

0.01

0.01

0

汽车

美元

3115

7

周二

0.01

0.01

1

汽车

美元

3115

7

周二

0.01

0.01

1

1.2.1 数据框和索引

传统数据库表会指定一列或多个列为索引。索引可以极大地提高某些 SQL 查询的效率。在带有 pandas 数据分析库的 Python 中,基本的矩形数据结构是 DataFrame 对象,并且在默认情况下,Python 会根据 DataFrame 对象中行的次序,自动建立一个整数索引。pandas 数据分析库支持设置多级或层次索引,以提高特定操作的效率。

在 R 语言中,基本的矩形数据结构是 data.frame 对象。data.frame 隐含有基于行次序的整数索引。虽然用户可以使用 row.names 属性创建自定义键值,但是 R 语言的原生 data.frame 并不支持自定义索引或多级索引。data.tabledplyr 这两个新的 R 包解决了这一缺陷,因而得到了广泛的使用。它们都支持多级索引,可以显著提高 data.frame 的使用效率。

 术语上的差异

矩形数据的术语可能令人困惑。对于同一事物,统计学家和数据科学家使用了不同的术语。统计学家在模型中使用预测变量去预测一个响应因变量,而数据科学家使用特征去预测目标。还有一个同义词尤其令人困惑。对于一行数据,计算机科学家使用样本这一术语;而对于统计学家,一个样本意味着一个行的集合。

1.2.2 非矩形数据结构

除了矩形数据之外,还有一些其他类型的数据。

时序数据记录了对同一变量的连续测量值。它是统计预测方法的原始输入数据,也是物联网设备所生成的数据的关键组成部分。

空间数据结构用于地图和定位分析,它比矩形数据结构更为复杂和多变。在对象表示中,空间数据关注的是对象(例如一所房子)及其空间坐标。与之形成对比的是,字段视图关注空间中的小单元及相关的度量值(例如像素点的亮度)。

图形(或网络)数据结构用于表示物理上的、社交网络上的和抽象的关系。例如,Facebook 或 LinkedIn 等社交网络图表示了人们在网络上的相互联系;由道路连接在一起的分布汇聚点构成了一个物理网络的例子。图形结构对于某些类型的问题十分有用,例如网络优化和推荐系统。

在数据科学中,每种数据类型都有其独特的方法论。本书关注的是矩形数据,它是预测建模的基本构件。

 统计学中的图形

在计算机科学和信息技术中,图形通常指对实体间关联情况的描述及底层的数据结构。在统计学中,图形用于指代各种绘图和可视化结果,而不仅仅是指实体间的关联情况。这一术语只用于指代可视化,而非数据结构。

 

本节要点

  • 矩阵是数据科学中的基本数据结构。在矩阵中,行是记录,列是变量(特征)。
  • 术语中会存在一些令人困惑之处。在与数据科学相关的各学科中,例如统计学、计算机科学和信息技术等,存在着一系列的同义词。

1.2.3 拓展阅读

  • R 语言中数据框的相关文档。
  • Python 数据框的相关文档。

1.3 位置估计

变量表示了测量数据或计数数据,一个变量的取值可能会数以千计。探索数据的一个基本步骤,就是获得每个特征(变量)的“典型值”。典型值是对数据最常出现位置的估计,即数据的集中趋势。

主要术语

均值

  所有数据值之和除以数值的个数。

  同义词:平均值

加权均值

  各数值乘以相应的权重值,然后加总求和,再除以权重的总和。

  同义词:加权平均值

中位数

  使得数据集中分别有一半数据位于该值之上和之下。

  同义词:第 50 百分位数

加权中位数

  使得排序数据集中分别有一半的权重之和位于该值之上和之下。

切尾均值

  在数据集剔除一定数量的极值后,再求均值。

  同义词:截尾均值

稳健

  对极值不敏感。

  同义词:耐抗性

离群值

  与大部分数据值差异很大的数据值。

  同义词:极值

乍一看,总结数据是一件十分简单的事情,对数据取均值即可(参见 1.3.1 节)。事实上,虽然均值易于计算,也便于使用,但在一般情况下,均值并非是对中心值的最好度量。因此,统计学家研究并提出了一些估计量,用于替代均值。

 度量和估计量

统计学家通常使用估计量(estimate)一词表示从手头已有数据计算得到的值,用于描述所看到的数据情况与确切的(或理论上为真的)状态之间的差异。数据科学家和商业分析师更倾向于称这些由计算得到的值为度量(metric)。这一术语上的差异,反映了统计学家和数据科学家在方法上的不同。统计学的核心在于如何解释不确定度,而数据科学则关注如何解决一个具体的商业或企业目标。因此,统计学家使用估计量,而数据科学家使用度量。

1.3.1 均值

均值,又称平均值,是最基本的位置估计量。均值等于所有值的总和除以值的个数。例如,集合 {3, 5, 1, 2} 的均值是 (3 + 5 + 1 + 2)/4 = 11/4 = 2.75。一般使用符号 \bar{x}(读作“x 拔”)表示总体中一个样本的均值。给定 n 个数据值:x_1,x_2,\cdots,x_N,均值的计算公式为:

均值 ={\bar x}=\frac{\sum^n_i x_i}{n}

 通常使用 N(或者 n)表示记录值或观测值的总数。在统计学中,如果我们指的是总体,则使用大写字母 N;如果指的是总体中的一个样本,则使用小写字母 n。但是在数据科学中,这一区别无关紧要,因此两种表示方式均可。

切尾均值是均值的一个变体。计算切尾均值时,需要在一个有序数据集的两端上去除一定数量的值,再计算剩余数值的均值。如果使用 x_{(1)},x_{(2)},\cdots,x_{(n)} 表示一个有序数据集,其中 x_{(1)} 是最小值,x_{(n)} 是最大值,那么去除 p 个最大值和 p 个最小值的切尾均值的计算公式为:

切尾均值 ={\bar x}=\frac{\sum^{n-p}_{i=p+1}x_{(i)}}{n-2p}

切尾均值消除了极值对均值的影响。举个例子,在国际跳水比赛中,会有五名裁判打分,一名选手的最终得分需要去除其中的最高分和最低分,取余下三名裁判打分的均值 2。这确保了裁判难以操纵选手的得分,因为每名裁判可能会偏向自己国家的选手。切尾均值得到了广泛使用。相对于普通的均值,人们在很多情况下更倾向于使用切尾均值。1.3.2 节将对此做出详细的介绍。

2“Diving.”Wikipedia: The Free Encyclopedia. Wikimedia Foundation, Inc. 10 Mar 2016. Web. 19 Mar 2016.

另一种均值是加权均值。在计算加权均值时,要将每个值 x_i 乘以一个权重值 w_i,并将加权值的总和除以权重的总和。计算公式为:

加权均值 ={\bar x}_w=\frac{\sum^n_{i=1}w_ix_i}{\sum^n_i w_i}

使用加权均值,主要是出于以下两个方面的考虑。

  • 一些值本质上要比其他的值更为多变,因此需要对多变的观测值赋予较低的权重。例如,如果我们需要对来自多个传感器的数据计算均值,但是其中一个传感器的数据不是很准确,那么我们可对该传感器的数据赋予较低的权重。
  • 所采集的数据可能并未准确地表示我们想要测量的不同群组。例如,受限于在线实验的开展方式,我们得到的数据集可能并未准确地反映出不同用户群组的情况。为了修正这一问题,我们可对未准确表示的群组赋予较高的权重。

1.3.2 中位数和稳健估计量

中位数是位于有序数据集中间位置处的数值。如果数值的个数为偶数,那么中位数实际上是位于中间位置处的两个值的均值。不同于使用所有观测值计算得到的均值,中位数仅取决于有序数据集中间位置处的值。尽管看上去中位数的计算方法存在一些弊端,但是考虑到均值对数据更敏感,因此在不少实际应用中,中位数依然是更好的位置度量。例如,我们想要了解西雅图华盛顿湖周边地区普通家庭的收入情况。在比较麦地那地区和温德米尔地区时,使用均值会产生迥异的结果,因为比尔 • 盖茨就生活在麦地那地区。如果使用中位数,那么统计结果完全不会受比尔 • 盖茨的影响。处于中间位置的观测值不会有变化。

有时我们需要计算加权中位数,这与使用加权均值的原因相同。和计算中位数一样,我们首先不考虑每个数值所关联的权重,对数据集排序。加权中位数并不是取有序数据集中间位置处的值,而是取可以使有序数据集上下两部分的权重总和相同的值。和中位数一样,加权中位数也对离群值不敏感。

离群值

我们称中位数为一种对位置的稳健估计量,因为它不会受离群值(极端情况)的影响,而离群值会使结果产生偏差。离群值是距离数据集中其他所有值都很远的值。尽管在各种数据汇总和绘图中对离群值给出了一些惯例表示(参见 1.5.1 节),但是对离群值的准确定义还是摆脱不了主观性。离群值本身并不一定是无效的或错误的数据(如上例中比尔 • 盖茨的收入),但往往是由数据的错误所导致的,例如,混淆了数据的计量单位(混用了千米与米),或是传感器的读数不准确。如果离群值是由不准确的数据导致的,这时使用均值就会给出糟糕的位置估计,而使用中位数的估计则依然有效。无论是哪种情况,我们都应找出离群值,而且它们通常也值得进一步研究。

 异常检测

在普通的数据分析中,离群值有时富含信息,有时则令人头疼。而异常检测则不同,它所关注的就是离群值,而其余大部分数据则用于定义“正常”的情况,即如何测定异常。

中位数并非唯一的稳健位置估计量。事实上,为了消除离群值的影响,也广泛地使用了切尾均值。例如,除非数据集的规模很小,否则通常我们会将数据集的开头和结尾各舍弃 10%,以使数据集免受离群值的影响。切尾均值可以看作一种在中位数和均值之间的折中方案。它对数据集中的极值非常稳健,同时在计算位置估计量时使用了更多的数据。

 其他稳健的位置估计量

统计学家还提出了很多其他的位置估计量,主要目的在于提供比均值更稳健、更高效的估计量。其中更高效是指,能够更好地分辨数据集中的微小位置差异。这些估计量通常适用于小规模的数据集,而对于大规模乃至中等规模的数据集,它们并不能提供更多的帮助。

1.3.3 位置估计的例子:人口和谋杀率

表 1-2 显示了一个数据集的前几行数据,其中包含了美国各州的人口数量和谋杀率,单位为每年每十万人中被谋杀的人数。

表1-2:data.frame中的几行数据,列出了美国各州的人口数量和谋杀率

 

人口

谋杀率

1

阿拉巴马州

4 779 736

5.7

2

阿拉斯加州

710 231

5.6

3

亚利桑那州

6 392 017

4.7

4

阿肯色州

2 915 918

5.6

5

加利福尼亚州

37 253 956

4.4

6

科罗拉多州

5 029 196

2.8

7

康涅狄格州

3 574 097

2.4

8

特拉华州

897 934

5.8

下面使用 R 语言计算美国各州人口的均值、切尾均值和中位数。

> state <- read.csv(file="/Users/andrewbruce1/book/state.csv")
> mean(state[["Population"]])
[1] 6162876
> mean(state[["Population"]], trim=0.1)
[1] 4783697
> median(state[["Population"]])
[1] 4436370

我们看到,均值大于切尾均值,而切尾均值大于中位数。

这是因为,切尾均值分别去除了最大的和最小的五个州(trim=0.1 表示在最大端和最小端分别去除 10% 的数据)。如果要计算美国的平均谋杀率,那么需要使用加权均值或中位数,这两个度量考虑了各州的人口差异。R 语言并未提供计算加权中位数的函数,因此我们需要安装额外的软件包,比如 matrixStats。代码如下。

> weighted.mean(state[["Murder.Rate"]], w=state[["Population"]])
[1] 4.445834
> library("matrixStats")
> weightedMedian(state[["Murder.Rate"]], w=state[["Population"]])
[1] 4.4

在本例中,加权中位数和中位数大体相同。

本节要点

  • 均值是一种基本的位置度量,但是对极值(离群值)敏感。
  • 其他一些度量更为稳健,例如中位数和切尾均值。

1.3.4 拓展阅读

  • 对于计算基本的位置度量,美国普度大学的 Michael Levine 提供了一些有用的课程讲义。
  • 约翰 • 图基的经典著作 Exploratory Data Analysis 至今依然广为阅读。

1.4 变异性估计

位置只是总结特性的一个维度,另一个维度是变异性(variability),也称离差(dispersion),它测量了数据值是紧密聚集的还是发散的。变异性是统计学的一个核心概念,统计学关注如何测量变异性,如何降低变异性,如何识别真实变异性中的随机性,如何识别真实变异性的各种来源,以及如何在存在变异性的情况下做出决策。

主要术语

偏差

  位置的观测值与估计值间的直接差异。

  同义词:误差、残差

方差

  对于 n 个数据值,方差是对距离均值的偏差平方后求和,再除以 n-1。

  同义词:均方误差

标准偏差

  方差的平方根。

  同义词: L2 范数、欧几里得范数

平均绝对偏差

  对数据值与均值间偏差的绝对值计算均值。

  同义词:L1 范数、曼哈顿范数

中位数绝对偏差

  数据值与中位数间绝对偏差的均值。

极差

  数据集中最大值和最小值间的差值。

顺序统计量

  基于从大到小排序的数据值的度量。

  同义词:秩

百分位数

  表示一个数据集中,P% 的值小于或等于第 P 百分位数,(100−P)% 的值大于或等于第P 百分位数。

  同义词:四分位数

四分位距

  第75 百分位数和第25 百分位数间的差值。

  同义词:四分位差

正如对位置有均值、中位数等多种不同的测定方式,变异性也有多种不同的测定方式。

1.4.1 标准偏差及相关估计值

使用最广泛的变异性估计量基于位置估计值和观测数据值间的差异或偏差。给定一个数据集 {1, 4, 4},其均值是 3,中位数是 4。各个数据与均值的偏差分别为:1-3 = -2,4-3 = 1,4-3 = 1。这些偏差值说明了数据围绕中心值的分散程度。

一种测量变异性的方法是,估计这些偏差的一个典型值。然而,对这些偏差值本身取均值是无法给出更多信息的,因为负的偏差值将会抵消正的偏差值。事实上,相对于均值的偏差值的总和为零。一种简单的方法是对均值偏差的绝对值取均值。在上例中,各偏差的绝对值分别是 2、1 和 1,它们的均值为 (2 + 1 + 1)/3 = 1.33。这就是平均绝对偏差,计算公式为:

平均绝对偏差 =\frac{\sum^n_{i=1}|x_i-{\bar x}|}{n}

其中 {\bar x} 是样本的均值。

最广为人知的变异性估计量是方差标准偏差,它们基于偏差的平方。方差是偏差平方值的均值,而标准偏差是方差的平方根。

方差 =s^2=\frac{\sum(x-{\bar x})^2}{n-1}

标准偏差 =s=\sqrt{\frac{\sum(x-{\bar x})^2}{n-1}}

标准偏差比方差更易于理解,因为它具有与原始数据相同的尺度。然而,考虑到标准偏差的计算公式相对更复杂,并且不太直观,大家可能会奇怪,为什么统计学中更愿意使用标准偏差,而不是平均绝对偏差。这是由于标准偏差在统计学理论中的领导地位。从数学角度来看,使用平方值要比使用绝对值更方便,尤其是对于统计模型。

自由度是 n,还是 n−1 ?

在统计学书籍中,总是存在这样一个讨论:计算方差时的被除数为什么是 n−1,而不是 n ?这一讨论引出了自由度的概念。计算结果的差别并不大,这是因为通常 n 总是足够大,以至于除以 n 或除以 n−1 时,结果并不会有很大的差别。如果你关注这一问题,我们在此解释一下原因。这是基于你想要根据样本估计总体这一前提。

如果在方差公式中使用了直观的除数 n,那么就会低估方差的真实值和总体的标准偏差。这被称为有偏估计。但是,如果除以 n−1 而不是 n,这时标准偏差就是无偏估计

要完整地解释为什么使用 n 会导致有偏估计,这就涉及自由度的概念。自由度考虑了计算估计量中的限制个数。在这种情况下,自由度是 n−1,因为其中有一个限制:标准偏差依赖于计算样本的均值。对于很多问题而言,数据科学家并不需要担心自由度的问题。但是在某些情况下,自由度十分重要(参见 6.1.5 节)。

无论方差、标准偏差,还是平均绝对偏差,它们对离群值和极值都是不稳健的(参见 1.3.2 节)。其中,方差和标准偏差对离群值尤为敏感,因为它们基于偏差的平方值。

中位数绝对偏差(MAD)是一种稳健的变异性估计量。中位数绝对偏差的计算公式为:

{\rm MAD}= 中位数 (|x_1-m|,|x_2-m|,\cdots,|x_n-m|)

其中,m 是中位数。和中位数一样,中位数绝对偏差也不受极值的影响。我们可以参考切尾均值的计算方法(参见 1.3.1 节),计算切尾标准偏差。

 即使数据符合正态分布,方差、标准偏差、平均绝对偏差以及中位数绝对偏差这四者也并非是等价的估计量。事实上,标准偏差总是大于平均绝对偏差,而平均绝对偏差总是大于中位数绝对偏差。有时,中位数绝对偏差会乘上一个常数比例因子(通常使用 1.4826),使得在正态分布下,中位数绝对偏差与标准偏差具有相同的尺度。

1.4.2 基于百分位数的估计量

另一种估计离差的方法基于对有序数据分布情况的查看。基于有序数据的统计量被称为顺序统计量,其中最基本的测量是极差,即数据的最大值与最小值之间的差值。知道最大值和最小值本身也是十分有用的,这有助于识别离群值。但是极差对离群值非常敏感,对于测量数据的离差并非十分有用。

为避免对离群值敏感,我们可以删除有序数据两端的值,然后再查看数据的极差。正式表述为,此估计量基于百分位数间的差异。在一个数据集中,第 P 百分位数表明,至少有 P% 的值小于或等于该值,而 (100-P)% 的值大于或等于该值。例如,如果要找到第 80 百分位数,我们首先对数据进行排序,然后从最小值开始,按照从小到大的顺序数出其中 80% 的数值。注意,中位数等同于第 50 百分位数。百分位数在本质上等同于四分位数,而四分位数是根据分数做索引的,因此 0.8 四分位数等同于第 80 百分位数。

变异性的一种常用测量方法第 25 百分位数和第 75 百分位数间的差值,称为四分位距(IQR)。下面给出一个例子,对于数据集 {3, 1, 5, 3, 6, 7, 2, 9},我们在排序后得到 {1, 2, 3, 3, 5, 6, 7, 9}。其中第 25 百分位数是 2.5,第 75 百分位数是 6.5,因此四分位距就是 6.5-2.5 = 4。不同软件在计算方法上可能会稍有差异,并给出不同的答案(参见本节末给出的知识点),但是差异通常很小。

对于规模非常大的数据集,准确计算百分位数的成本很高,因为需要对所有的数据做排序。在机器学习和统计软件中,使用了一些特殊的算法 3,这些算法可以快速计算出一个近似的百分位数,并有一定的准确度。

3Zhang, Qi and Wang, Wei. 19th International Conference on Scientific and Statistical Database Management, IEEE Computer Society (2007).

 四分位距的准确定义

如果一个数据集中的数值个数是偶数(即 n 是偶数),那么根据上面的定义,百分位数不是唯一的。事实上,我们可以取任意一个位于顺序统计量 x_{(j)}x_{(j+1)} 间的值,只要 j 满足:

100\times\frac{j}{n}\leqslant P<100\times\frac{j+1}{n}

正式的表述是,百分位数是一种加权平均:

百分位数 (P)=(1-w)x_{(j)}+wx_{(j+1)}

其中,权重值 w 介于 0 和 1 之间。不同的统计软件选取 w 的方法略有不同。R 语言的 quantile 函数提供了 9 种计算百分位数的方法。除非数据集的规模很小,否则通常我们不需要操心百分位数的准确计算方法。

1.4.3 例子:美国各州人口的变异性估计量

本例的数据集中包括了美国各州的人口数量和谋杀率。表 1-3 显示了该数据集的前几行数据。

表1-3:data.frame的几行数据,显示了按州统计的人口数量和谋杀率

 

人口

谋杀率

1

阿拉巴马州

4 779 736

5.7

2

阿拉斯加州

710 231

5.6

3

亚利桑那州

6 392 017

4.7

4

阿肯色州

2 915 918

5.6

5

加利福尼亚州

37 253 956

4.4

6

科罗拉多州

5 029 196

2.8

7

康涅狄格州

3 574 097

2.4

8

特拉华州

897 934

5.8

下面使用 R 语言自带的函数计算标准偏差、四分位距和中位数绝对偏差。通过下面的计算,我们得到了美国各州人口数据的变异性估计量。

> sd(state[["Population"]])
[1] 6848235
> IQR(state[["Population"]])
[1] 4847308
> mad(state[["Population"]])
[1] 3849870

可以看到,标准偏差几乎是中位数绝对偏差的两倍(在 R 语言中,默认将中位数绝对偏差的规模调整到与均值一样)。这并不奇怪,因为标准偏差对离群值敏感。

本节要点

  • 方差和标准偏差是日常最广为使用的变异性统计量。
  • 方差和标准偏差都对离群值敏感。
  • 更稳健的度量包括偏离均值(百分位数、四分位距)的平均(中位数)绝对偏差。

1.4.4 拓展阅读

  • David Lane 的在线统计学资源中有一节介绍了百分位数。
  • Kevin Davenport 在 R-Bloggers 上撰写了一篇有用的文章,介绍了距离中位数的各种偏差以及它们的稳健性。

1.5 探索数据分布

前文介绍的各种估计量都是通过将数据总结为单一数值,去描述数据的位置或变异性。这些估计量可用于探索数据的整体分布情况。

主要术语

箱线图

  图基提出的一种绘图,是一种快速可视化数据分布情况的方法。

  同义词:箱形图、箱须图

频数表

  将数值型数据的计数情况置于一组间隔(组距)中。 直方图

  对频数表的绘图,其中 x 轴是组距,y 轴是计数(或比例)。

密度图

  直方图的平滑表示,通常基于某种核密度估计。

1.5.1 百分位数和箱线图

在 1.4.2 节中,我们介绍了如何使用百分位数测量数据的分布情况。百分位数对于总结整体分布也十分有用。报告中经常会用到四分位数(即第 25 百分位数、第 50 百分位数和第 75 百分位数)和十分位数(即第 10 百分位数、第 20 百分位数……第 90 百分位数)。在总结数据尾部情况(外延范围)时,百分位数尤为有用。在大众文化中,也有百分之一阵营(one-percenter)的说法,它指的是拥有 99% 的财富的富人。

表 1-4 中列出了美国一些州的谋杀率的百分位数。在 R 语言中,可使用 quantile 函数生成百分位数。

quantile(state[["Murder.Rate"]], p=c(.05, .25, .5, .75, .95))
   5%   25%   50%   75%   95%
1.600 2.425 4.000 5.550 6.510

表1-4:按州谋杀率的百分位数

5%25%50%75%95%
1.602.424.005.556.51

上例中,中位数为每十万人中有四名谋杀犯,但是其中存在一些变异性。第 5 百分位数是 1.60,第 95 百分位数是 6.51。

箱线图是由图基提出的一种快速可视化绘图 4,它基于百分位数可视化数据的分布。图 1-2 显示了按州划分人口的箱线图,它是由下面的 R 命令生成的。

4Tukey, John W. Exploratory Data Analysis. Pearson (1977). ISBN:978-0-201-07616-5.

boxplot(state[["Population"]]/1000000, ylab="Population (millions)")

图 1-2:美国各州人口的箱线图

箱子的顶部和底部分别是第 75 百分位数和第 25 百分位数。箱内的水平线表示的是中位数。图中的虚线称为(whisker)。须从最大值一直延伸到最小值,显示了数据的极差。箱线图有多种变体,具体细节可参考“R 文档:boxplot 函数”5 等资料。在默认情况下,该 R 函数会扩展须到箱子外的最远点,但不会超过四分位距的 1.5 倍。其他软件可能会采用不同的规则。在须外的所有数据绘制为单个点。

5R Core Team.“R: A Language and Environment for Statistical Computing,”R Foundation for Statistical Computing (2015).

1.5.2 频数表和直方图

变量的频数表将该变量的极差均匀地分割为多个等距分段,并给出落在每个分段中的数值个数。在 R 语言中,可使用下面命令计算美国人口按州分布的频数表,结果显示在表 1-5 中。

breaks <- seq(from=min(state[["Population"]]),
                to=max(state[["Population"]]), length=11)
pop_freq <- cut(state[["Population"]], breaks=breaks,
                right=TRUE, include.lowest = TRUE)
table(pop_freq)

表1-5:美国人口按州分布的频数表

组距编号

组距范围

计数

州名

1

563 626 ~ 4 232 658

24

怀俄明州、佛蒙特州、北达科他州、阿拉斯加州、南达科他州、特拉华州、蒙大拿州、罗得岛州、新罕布什尔州、缅因州、夏威夷州、爱达荷州、内布拉斯加州、西弗吉尼亚州、新墨西哥州、内华达州、犹他州、堪萨斯州、阿肯色州、密西西比州、爱荷华州、康涅狄格州、俄克拉荷马州、俄勒冈州

2

4 232 659 ~ 7 901 691

14

肯塔基州、路易斯安那州、南卡罗来纳州、阿拉巴马州、科罗拉多州、明尼苏达州、威斯康辛州、马里兰州、密苏里州、田纳西州、亚利桑那州、印第安纳州、马萨诸塞州、华盛顿州

3

7 901 692 ~ 11 570 724

6

弗吉尼亚州、新泽西州、北卡罗来纳州、乔治亚州、密歇根州、俄亥俄州

4

11 570 725 ~ 15 239 757

2

宾夕法尼亚州、伊利诺伊州

5

15 239 758 ~ 18 908 790

1

佛罗里达州

6

18 908 791 ~ 22 577 823

1

纽约州

7

22 577 824 ~ 26 246 856

1

得克萨斯州

8

26 246 857 ~ 29 915 889

0

 

9

29 915 890 ~ 33 584 922

0

 

10

33 584 923 ~ 37 253 956

1

加利福尼亚州

根据 2010 年的人口普查,美国人口最少的州是怀俄明州,563 626 人;人口最多的州是加利福尼亚州,37 253 956 人。极差为 37 253 956-563 626 = 36 690 330。我们必须将极差划分为大小相等的组距,假定为 10 个组距。这样,每个组距的宽度为 3 669 033。第一个组距的范围是从 563 626 到 4 232 658。最后一个组距的范围是从 33 584 923 到 37 253 956,其中只有加利福尼亚一个州。加利福尼亚州之前的两个组距是空的,直到得克萨斯州。添加空组距也是有必要的;空组距中没有值,这一事实是很有价值的信息。尝试不同大小的组距也是非常有用的。如果组距过大,那么就会隐藏掉分布的一些重要特性。如果组距过小,那么结果就会过于颗粒化,失去查看整体图的能力。

 频数表和百分位数都是通过创建组距总结数据。一般情况下,四分位数和十分位数在每个组距中具有相同的计数,但是每个组距的大小不同,我们称之为等计数组距。与之相对,如果频数表在每个组距中的计数不同,我们称之为等规模组距。

直方图是频数表的一种可视化方法,其中 x 轴为组距,y 轴为数据的计数。在 R 语言中,要创建对应于表 1-5 的直方图,可使用指定了 breaks 参数的 hist 函数,命令如下。

hist(state[["Population"]], breaks=breaks)

图 1-3 显示了上面命令生成的直方图。一般说来,在绘制直方图时应注意以下几点。

  • 空组距也应包括在直方图中。
  • 各组距是等宽的。
  • 组距的数量(或组距的大小)取决于用户。
  • 各条块相互紧挨着,条块间没有任何空隙,除非存在空组距。

图 1-3:美国各州人口的直方图

 统计学中的矩(moment)

在统计学理论中,位置和变异性分别称为分布的一阶矩二阶矩,而分布的三阶矩和四阶矩分别被称为偏度峰度。偏度显示了数据是偏向较小的值还是偏向较大的值,峰度则显示了数据中具有极值的倾向性。通常情况下,我们并不使用度量去测定偏度和峰度,而是通过图 1-2 和图 1-3 这样的可视化方法发现它们。

1.5.3 密度估计

密度图与直方图有关,它用一条连续的线显示数据值的分布情况。我们可以将密度图看作由直方图平滑得到的,尽管它通常是使用一种核密度估计量 6 从数据中直接计算得到的。图 1-4 将密度估计情况显示在直方图上。在 R 语言中,可以使用 density 函数计算密度估计。

6Duang, Tarn.“An introduction to kernel density estimation”(2001).

hist(state[["Murder.Rate"]], freq=FALSE)
lines(density(state[["Murder.Rate"]]), lwd=3, col="blue")

图 1-4:美国各州谋杀率的密度图

与图 1-3 中的直方图相比,图 1-4 的不同之处在于 y 轴的尺度。密度图相当于按比例而非按计数绘制直方图。因此在 R 语言中,我们需要指定参数 freq=FALSE

 密度估计

密度估计是一个很宽泛的话题,在统计学研究中具有悠久的历史。事实上,已有二十多个 R 包提供了计算密度估计的函数。Henry Deng 和 Hadley Wickham 在“Density estimation in R”7 一文中对 R 包进行了综述,其中特别推荐了 ASH 和 KernSmooth。对于许多数据科学问题,完全不必操心各种类型的密度估计,R 语言的基本函数就完全够用了。

本节要点

  • 频数直方图在 y 轴上绘制频数计数,在 x 轴上绘制变量值。它提供了对数据分布的概览。
  • 频数表是直方图中频数计数的表格形式。
  • 在箱线图中,箱子的顶部和底部分别表示第 75 百分位数和第 25 百分位数。箱线图也提供了数据分布的基本情况。多个箱线图通常是并排展示的,以便于比较分布情况。
  • 密度图是直方图的一种平滑表示。它需要一个基于数据估计绘图的函数(当然也可以做多个估计)。

7Deng, H. and Wickham, H.“Density estimation in R”(2011).

1.5.4 拓展阅读

  • 美国纽约州立大学奥斯威戈分校的一位教授给出了创建箱线图的步骤。
  • Henry Deng 和 Hadley Wickham 在其论文“Density estimation in R”中介绍了如何在 R 语言中实现密度估计。
  • R-Bloggers 网站提供了一篇关于 R 语言中直方图的有用文章,其中介绍了如何选取箱子大小等元素。
  • R-Bloggers 网站还提供了一些介绍 R 语言中箱线图的类似文章。

1.6 探索二元数据和分类数据

使用基本的比例或百分比,我们就能了解分类数据的情况。

主要术语

众数

  数据集中出现次数最多的类别或值。

期望值

  如果类别可以与一个数值相关联,可以根据类别的出现概率计算一个平均值。

条形图

  在绘图中,以条形表示每个类别出现的频数或占比情况。

饼图

  在绘图中,圆饼中的一个扇形部分表示每个类别出现的频数或占比情况。

总结二元变量的情况,或总结只有几个类别的分类变量,是非常容易实现的,我们只需计算出数据中 1 的比例,或是重要类别出现的比例。例如,表 1-6 给出了按延迟原因分类的航班延迟的百分比,数据来自于美国达拉斯沃斯堡机场自 2010 年以来的延迟数据。延迟原因可分类为:航空公司管理原因、流量控制(ATC)系统延误、天气原因、安全原因以及到港航班延迟。

表1-6:美国达拉斯沃斯堡机场的航班延迟百分比,按延迟原因分类

航空公司管理原因

ATC

天气原因

安全原因

到港航班延迟

23.02

30.40

4.03

0.12

42.43

条形图是在各大媒体上常用的一种可视化工具,它可显示单个分类变量的总体情况。在条形图中,x 轴列出类别,y 轴表示频数或比例。图 1-5 显示了美国达拉斯沃斯堡机场每年按延迟原因分类的航班延迟情况,它是使用 R 语言的函数 barplot 生成的。

barplot(as.matrix(dfw)/6, cex.axis=.5)

图 1-5:美国达拉斯沃斯堡机场航班延迟原因的条形图

注意,虽然条形图非常类似于直方图,但两者间存在一些差异。在条形图中,x 轴表示因子变量的不同类别,而在直方图中,x 轴以数值度量的形式表示某个变量的值。另外,在直方图中,通常各个条形是相互紧挨着显示的,条形间的间隔表示了数据中未出现的值;而在条形图中,各个条形的显示是相互独立的。

饼图是条形图的一种替代形式。统计学家和数据可视化专业人员通常不使用饼图。在他们看来,饼图在视觉上缺乏信息量 8

8Few, Stephen.“Save the Pies for Dessert.”Visual Intelligence Newsletter, Perceptual Edge (2007).

 如何将数值型数据转换为分类数据

在 1.5.2 节中,我们通过对数据创建组距,生成了频数表。这同时也将数值型数据转换为排序的因子。就此而言,直方图和条形图是类似的,除非条形图中 x 轴上的类别不是有序的。将数值型数据转换为分类数据是非常重要的,它是数据分析中的一个重要步骤。该转换降低了数据的复杂度和规模,并有助于发现特征间的关系,尤其是在分析的初始阶段。

1.6.1 众数

众数指数据中出现最频繁的一个或一组数值。例如,美国达拉斯沃斯堡机场延迟原因的众数是“到港航班延迟”。再比如,基督教是美国绝大部分地区宗教信仰倾向的众数。众数是分类数据的一个基本汇总统计量,通常不用于数值型数据。

1.6.2 期望值

分类数据还有一个特殊类型,即数据类别可以表示成(或映射到)同一尺度的离散值。例如,新兴云技术的服务商提供了两种服务,一种服务的费用为每月 300 美元,另一种为每月 50 美元。服务商会举办免费的网络研讨会,以发现一些潜在的用户。来自企业的数据表明,有 5% 的研讨会参与者将会注册每月 300 美元的服务,15% 的参与者会注册每月 50 美元的服务,另外 80% 的人将不会注册任何服务。这样,我们可以将数据总结为一个期望值,估计企业的营业收入。期望值是一种加权均值,权重使用的是类别出现的概率。

期望值的计算方法如下。

(1) 输出值乘以其出现的概率。

(2) 将这些值加起来。

就上面给出的云服务例子而言,与会者支付服务费的期望值是每月 22.5 美元,计算过程如下。

期望值 = 0.05×300 + 0.15×50 + 0.80×0 = 22.5

期望值实际上是一种加权均值,其中加入了未来期望和概率权重的概念,所使用的概率通常是根据主观判断得到的。期望值是商业估值和资金预算中的一个基本概念,例如,一次新收购在未来 5 年中利润的期望值,或者一个诊所的新患者管理软件在节约开支上的期望值。

本节要点

  • 分类数据通常按比例总结,可以使用条形图将它可视化。
  • 类别用于表示不同类型的事物(例如苹果和橘子,男性和女性)、因子变量的等级(例如低、中和高),或由组距分隔的数值型数据。
  • 期望值是对每个数值与该数值出现概率的乘积求和,通常用于总结因子变量的等级。

1.6.3 拓展阅读

只有了解误导性图,统计学课程才是完备的。误导性图通常涉及条形图和饼图。

1.7 相关性

无论是在数据科学还是研究中,很多建模项目的探索性数据分析都要检查预测因子之间的相关性,以及预测因子和目标变量之间的相关性。给定变量 XY,它们均有测量数据。如果变量 X 的高值随变量 Y 的高值的变化而变化,并且 X 的低值随 Y 的低值的变化而变化,那么我们称 XY 是正相关的。如果 X 的高值随 Y 的低值的变化而变化,反之亦然,那么我们称变量 XY 是负相关的。

主要术语

相关系数

  一种用于测量数值变量间相关程度的度量,取值范围在 −1 到 +1 之间。

相关矩阵

  将变量在一个表格中按行和列显示,表格中每个单元格的值是对应变量间的相关性。

散点图

  在绘图中,x 轴显示一个变量的值,y 轴显示另一个变量的值。

考虑下面两个变量 v1 和 v2。它们是完全相关的,因为每个变量中的观测值都是按从小到大排列的。

\begin{aligned}&{\rm v}1:{1,2,3\}\\&{\rm v}2:\{4,5,6\}\end{aligned}

向量点积是 4 + 10 + 18 = 32。现在我们尝试将其中一个变量中的观测值随机重排,然后重新计算二者的点积,所得到的值永远不会大于 32。因此,我们可以将向量点积作为一个度量,即做任意次随机排序后,向量点积都不会大于 32。(事实上,这一理念是与基于重抽样的估计密切相关的,参见 3.1 节。)尽管如此,该度量值并非很有意义,除非用于重抽样分布。

点积的一种标准化变体就是相关系数,该度量更为有用。对于两个总是保持同一尺度的变量,相关系数给出了两者间相关性的估计值。在计算皮尔逊相关系数时,要将变量 v1 的平均偏差乘以变量 v2 的平均偏差,再除以标准偏差之积,计算公式如下。

r=\frac{\sum^N_{i=1}(x_i-{\bar x})(y_i-{\bar y})}{(n-1)s_xs_y}

注意,公式中使用的除数是 n-1,而不是 n。具体细节参见 1.4.1 节中关于“自由度是 n ,还是 n-1 ?”的讨论。相关系数的值总是位于 +1(完全正相关)和 -1(完全负相关)之间。0 表示没有相关性。

变量的相关性可以是非线性的。在这种情况下,相关系数就不再是一种有用的度量。比如,税率和收入增加之间的关系。当税率由零开始增加时,收入也在增加。但是税率一旦达到一定高的水平并逼近 100% 时,这时避税增加了,而税收则实际下降了。

表 1-7 被称为相关矩阵,它显示了自 2012 年 7 月到 2015 年 6 月间的电信类股票每日收益间的相关性。从中可以看到,股票 Verizon(VZ)与 ATT(T)间的相关性最高,而与通信基础设施运营企业 Level Three(LVLT)间的相关性最低。需要注意的是,相关矩阵的对角线元素为 1(即一支股票与其自身的相关性是 1),并且对角线上下对称位置的信息是冗余的。

表1-7:电信类股票收益间的相关性

 

T

CTL

FTR

VZ

LVLT

T

1.000

0.475

0.328

0.678

0.279

CTL

0.475

1.000

0.420

0.417

0.287

FTR

0.328

0.420

1.000

0.287

0.260

VZ

0.678

0.417

0.287

1.000

0.242

LVLT

0.279

0.287

0.260

0.242

1.000

通常,我们会用绘图展示表 1-7 这样的相关性表,实现对多个变量间关系的可视化。图 1-6 显示了主要 ETF(交易所交易资金)每日收益间的相关性。使用 R 语言中的 corrplot 软件包,很容易创建这样的绘图。命令如下。

etfs <- sp500_px[row.names(sp500_px)>"2012-07-01",
                 sp500_sym[sp500_sym$sector=="etf", 'symbol']]
library(corrplot)
corrplot(cor(etfs), method = "ellipse")

图 1-6:ETF 每日收益间的相关性

标准普尔 500 指数(SPY)和道琼斯指数(DIA)的 ETF 具有很高的相关性。类似地,主要由技术企业组成的 QQQ 和 XLK 指数是正相关的。保守 ETF,例如金价追踪指数(GLD)、原油价格指数(USO)或市场波动指数(VXX),倾向于与其他 ETF 负相关。椭圆的长轴方向显示了两个变量是正相关的还是负相关的:椭圆长轴方向偏右,为正相关;椭圆长轴方向偏左,为负相关。椭圆的阴影和宽度显示了关联的强度,更细长并且颜色更深的椭圆,对应于更强的相关性。

与平均值和标准偏差一样,相关系数同样对数据离群值敏感。对于经典的相关系数,有的软件包提供了一些稳健的替代方法。例如,R 语言的 cor 函数具有 trim 参数 9,设置类似于截尾均值的计算 10

9原文即是如此。事实上,R 的 cor 函数并不提供 trim 参数。在 R 中,有多种方法实现对离群值稳健的相关性计算。一种是通过设置 cor 函数的 method 参数,method = "spearman"method = "kendall",原因参见本节知识点“其他相关性估计量”。另一种方法是使用其他 R 软件包提供的函数,例如,robust 软件包的 covRob 函数、MASS 软件包的 rlm 函数等。——译者注

10R Core Team.“R: A Language and Environment for Statistical Computing,”R Foundation for Statistical Computing (2015).

 其他相关性估计量

统计学家早就提出了其他类型的相关系数,例如斯皮尔曼秩相关系数(Spearman's rho)、肯德尔秩相关系数(Kendall's tau)等基于数据秩的相关系数。由于这些估计量操作的是秩,而非数据值,所以它们对离群值稳健,并可以处理特定类型的非线性。但是在探索性数据分析中,数据科学家通常会坚持使用皮尔逊相关系数及其一些稳健的替代者。多数情况下,基于秩的估计量适用于小规模的数据集以及特定的假设检验。

1.7.1 散点图

散点图是一种可视化两个测量数据变量间关系的标准方法。在散点图中,x 轴表示一个变量,y 轴表示另一个变量,图中的每个点对应于一条记录。图 1-7 显示了股票 ATT 和 Verizon 日收益的绘图,用下面的 R 命令生成。

plot(telecom$T, telecom$VZ, xlab="T", ylab="VZ")

从图中可以看到,两支股票的日收益具有强正相关性。在大部分交易日中,两支股票都保持同步涨跌。但还有少数几个交易日,其中一支股票明显下跌而另一支股票上涨,或是相反。

图 1-7:股票 ATT 和 Verizon 日收益的散点图

本节要点

  • 相关系数测量了两个变量间相互关联的程度。

  • 如果变量 v1 的高值随变量 v2 的高值的变化而变化,那么 v1 和 v2 是正相关的。

  • 如果变量 v1 的高值与变量 v2 的低值的变化相关联,那么 v1 和 v2 是负相关的。

  • 相关系数是一种标准化的度量,因此其值的范围处于-1(完全负相关)和+1(完全正相关)之间。

  • 如果相关系数为0,那么表示两个变量间没有相关性。但是注意,数据的随机排列将会随机生成正的或负的相关系数。

1.7.2 拓展阅读

David Freedman、Robert Pisani 和 Roger Purves 合著的 Statistics(第 4 版)对相关性进行了很好的介绍。

1.8 探索两个及以上变量

上面介绍的估计量都是我们熟知的,比如均值和方差。计算这些估计量时,我们一次仅查看一个变量,这被称为单变量分析。而相关性分析(参见 1.7 节)是比较两个变量间关系的一种重要方法,这是双变量分析。本节将介绍一些包含两个及以上变量的估计量及绘图,即多变量分析

主要术语

列联表

  一种对两个或两个以上分类变量做计数的表格。

六边形图

  一种用于两个数值变量的绘图,图中使用六边形表示记录的组距。

等势线图

  一种类似于地形图的绘图,显示了两个数值型变量的密度情况。

小提琴图

  一种类似于箱线图的绘图,但是显示的是密度估计量。

与单变量分析一样,双变量分析不仅计算汇总统计量,而且生成可视化的展示。双变量或多变量分析的适用类型取决于数据本身,即数据是数值型数据还是分类数据。

1.8.1 六边形图和等势线(适用于两个数值型变量)

散点图适用于绘制数据量不大的数值型数据,六边形图和等势线也可以绘制数值型数据间的关系。图 1-7 显示了股票日收益的绘图,其中仅包括 750 个数据点。对于具有成千上万乃至上百万条记录的数据集,散点图会过于密集,因此我们需要另一种方式去可视化数据间的关系。为了解释这个问题,我们以数据集 kc_tax 为例。该数据集包括了对华盛顿州金县(King County)房屋的纳税评估值。为了重点关注数据中的主要部分,我们使用了 subset 函数,去除了数据集中价格非常高并且面积特别小或特别大的房屋。命令如下。

kc_tax0 <- subset(kc_tax, TaxAssessedValue < 750000 & SqFtTotLiving>100 &
                  SqFtTotLiving<3500)
nrow(kc_tax0)
[1] 432693

图 1-8 是六边形图,它显示了金县的房屋面积(平方英尺)与纳税评估值间的关系。六边形图绘制的并非数据点,这样会导致图中显示成一片黑云,我们将记录分组为六边形的组距,并用不同的颜色绘制各个六边形,以显示每组中的记录数。在图中可清晰地看到,房屋面积(平方英尺)和纳税评估值间是正相关的。图中值得关注的一个特征是,在主要云上,隐含有另一片云。这片云所表示的房屋虽然与主要云所表示的房屋具有相同的面积,但是纳税评估值更高。

图 1-8 的绘图是使用 R 语言的 ggplot2 软件包生成的。该软件包是由 Hadley Wickham 研发的 11。目前有多个新软件库提供了数据的深层探索性可视化分析功能,ggplot2 就是其中之一,参见 1.8.4 节。

11Wickham, Hadley. ggplot2: Elegant Graphics for Data Analysis. Springer-Verlag New York (2009). ISBN: 978-0-387-98140-6.

ggplot(kc_tax0, (aes(x=SqFtTotLiving, y=TaxAssessedValue))) +
  stat_binhex(colour="white") +
  theme_bw() +
  scale_fill_gradient(low="white", high="black") +
  labs(x="Finished Square Feet", y="Tax Assessed Value")

图 1-8:纳税评估值与房屋面积的六边形图

图 1-9 是在散点图上绘制了一个等势线图,可视化了两个数值型变量之间的关系。等势线在本质上就是两个变量的地形图。每条等势线表示特定的密度值,并随着接近“顶峰”而增大。图 1-9 显示了类似于图 1-8 中的信息,即在主峰的“北侧”存在第二个峰。图 1-9 也是使用 ggplot2 创建的,其中使用了自带的 geom_density2d 函数。

ggplot(kc_tax0, aes(SqFtTotLiving, TaxAssessedValue)) +
  theme_bw() +
  geom_point( alpha=0.1) +
  geom_density2d(colour="white") +
  labs(x="Finished Square Feet", y="Tax Assessed Value")

图 1-9:纳税评估值与房屋面积间关系的等势线图

还有其他一些类型的图表,比如热力图等,也可显示两个数值型变量间的关系。热力图、六边形图和等势线图所给出的都是二维密度的可视化表示。它们本质上对应的是直方图和密度图。

1.8.2 两个分类变量

对于总结两个分类变量,列联表十分有用,它是一种按分类进行计数的表。表 1-8 显示了一个列联表,它表示了个人信贷等级与贷款情况之间的关系。数据来自美国 P2P 借贷业务的引领者 Lending Club 公司。信贷等级从 A(高等级)到 G(低等级)不等,贷款情况包括付清流动延期销账(预期无法收回剩余贷款)。该表显示了计数情况和按行的百分比情况。与低信贷等级贷款相比,高信贷等级贷款的延期或销账的百分比非常低。列联表中可以只统计计数的情况,也可以包括列百分比和总百分比。最常用的列联表创建工具可能是 Excel 中的数据透视表。在 R 语言中,可以使用 descr 软件包中的 CrossTable 函数生成列联表。例如,表 1-8 是使用下面的代码生成的。

library(descr)
x_tab <- CrossTable(lc_loans$grade, lc_loans$status,
                    prop.c=FALSE, prop.chisq=FALSE, prop.t=FALSE)

表1-8:信贷等级和贷款状态的列联表

信贷等级

付清

流动

延期

销账

合计

A

20 715

52 058

494

1588

74 855

 

0.277

0.695

0.007

0.021

0.161

B

31 782

97 601

2149

5384

136 916

 

0.232

0.713

0.016

0.039

0.294

C

23 773

92 444

2895

6163

125 275

 

0.190

0.738

0.023

0.049

0.269

D

14 036

55 287

2421

5131

76 875

 

0.183

0.719

0.031

0.067

0.165

E

6089

25 344

1421

2898

35 752

 

0.170

0.709

0.040

0.081

0.077

F

2376

8675

621

1556

13 228

 

0.180

0.656

0.047

0.118

0.028

G

655

2042

206

419

3322

 

0.197

0.615

0.062

0.126

0.007

合计

99 426

333 451

10 207

23 139

466 223

1.8.3 分类数据和数值型数据

一些数值型数据是根据分类变量进行分组的。要可视化地比较此类数据的分布情况,一种简单的方式是使用箱线图(参见 1.5.1 节)。例如,我们可能想要查看各航空公司航班延误的百分比。图 1-10 显示了在一个月内由于航空公司原因所导致航班延误的百分比。

boxplot(pct_carrier_delay ~ airline, data=airline_stats, ylim=c(0, 50))

图 1-10:由于航空公司原因所导致航班延误百分比的箱线图

从图中可以看到,阿拉斯加航空公司(Alaska)脱颖而出,延迟最少,而美国航空公司(American)的延迟最多。美国航空公司的下四分位数要高于阿拉斯加航空公司的上四分位数。

小提琴图是箱线图的一种增强表示,最早是由 Hintze 和 Nelson 提出的 12。它以 y 轴为密度,绘制密度估计量的情况。绘图中对密度做镜像并反转(即核密度函数),并填充所生成的形状,由此生成了一个类似小提琴的图形。小提琴图的优点是可以显示分布的细微之处,而这种细微之处在箱线图中是难以察觉的。另一方面,箱线图能更清楚地显示数据中的离群值。可使用 ggplot2 软件包中的 geom_violin 函数创建小提琴图,命令如下。

12Hintze, J. and Nelson,“R. Violin Plots: A Box Plot-Density Trace Synergism.”The American Statistician 52.2 (May 1998): 181–184.

ggplot(data=airline_stats, aes(airline, pct_carrier_delay)) +
  ylim(0, 50) +
  geom_violin() +
  labs(x="", y="Daily % of Delayed Flights")

生成的图如图 1-11 所示。小提琴图显示阿拉斯加航空公司的分布聚集于 0 附近,美国达美航空公司(Delta)稍逊之。如果使用箱线图,这一现象并不明显。如果在绘图命令中添加 geom_boxplot 函数,那么就可以组合显示小提琴图和箱线图。如果使用了适当的颜色,那么显示效果会更好。

图 1-11:由于航空公司原因所导致航空延误的百分比,图中组合显示了箱线图和小提琴图

1.8.4 多个变量的可视化

比较两个变量所用的图表类型,例如散点图、六边形图和箱线图,完全可以通过条件(conditioning)这一概念扩展到多个变量。例如,前面的图 1-8 中显示了房屋面积(单位:平方英尺)和纳税评估值之间的关系。我们发现,一些房屋的每平方英尺纳税评估值看上去更高。进一步研究后,图 1-12 根据邮政编码分别绘制了数据,以比较地段对纳税评估值的影响。从这样的图形中,我们可以更清晰地看到,一些地区(如邮编 98112 和 98105)的纳税评估值比其他地区(如邮编 98108 和 98057)更高。正是这种差异性导致了在图 1-8 中观察到的聚类情况。

我们使用 ggplot2 以及分组(facet)的概念创建了图 1-12。分组也被称为条件变量,在本例中就是邮政编码。

ggplot(subset(kc_tax0, ZipCode %in% c(98188, 98105, 98108, 98126)),
         aes(x=SqFtTotLiving, y=TaxAssessedValue)) +
  stat_binhex(colour="white") +
  theme_bw() +
  scale_fill_gradient( low="white", high="blue") +
  labs(x="Finished Square Feet", y="Tax Assessed Value") +
  facet_wrap("ZipCode")

图 1-12:根据邮政编码分组绘制纳税评估值与房屋面积的关系

“条件变量”这一概念最早出现在图形系统的格子图中。它是由贝尔实验室的里克 • 贝克尔、比尔 • 克利夫兰等人提出的 13。现在这一理念已扩展到各种现代图形系统中,包括 R 语言的 lattice14ggplot2 软件包,以及 Python 的 Seaborn15Bokeh16 模块。条件变量也是 Tableau 和 Spotfire 等商业智能平台的组成部分。随着计算能力的提升,现代可视化平台早已超越了探索性数据分析最初的低水平。但是多年前提出的关键理念和工具依然是这些系统的基础。

13Becker, R., Cleveland, W, Shyu, M. and Kaluzny, S.“A Tour of Trellis Graphics”(1996).

14Sarkar, Deepayan. Lattice: Multivariate Data Visualization with R. Springer (2008). ISBN 978-0-387-75968-5.

15“Seaborn: statistical data visualization”(2015).

16Bokeh Development Team.“Bokeh: Python library for interactive visualization”(2014).

本节要点

  • 六边形图和等势线图是有用的工具,它们支持以图形方式同时查看两个数值型变量,不会受数据规模的影响。
  • 列联表是一种查看两个分类变量计数情况的标准工具。
  • 箱线图和小提琴图允许根据分类变量绘制数值型变量。

1.8.5 拓展阅读

  • Benjamin Baumer、Daniel Kaplan 和 Nicholas Horton 合著的 Modern Data Science with R 一书对“图形的语法”(grammar for graphics,即 ggplot 软件包名中的“gg”)进行了很好的介绍。
  • Hadley Wickham 撰写的《ggplot2:数据分析与图形艺术》一书提供了一些很好的资源。Hadley Wickham 是 ggplot2 的创建者。
  • Josef Fruehwald 提供了 ggplot2 指南的 Web 资源。

1.9 小结

约翰 • 图基开创了探索性数据分析。随着探索性数据分析的发展,由统计学所确立的基础业已成为数据科学领域的先导。对于任意基于数据的项目,最重要的第一步都是查看数据,这正是探索性数据分析的关键理念所在。通过总结并可视化数据,我们可以对项目获得有价值的洞悉和理解。

本章回顾了一些基本概念,从位置估计和变异性估计等简单度量,到图 1-12 这样的探索多个变量间关系的复杂展示。借助开源社区提供的多种技术和工具集,并结合 R 和 Python 等语言的表达能力,我们得以建立丰富多样的数据探索和分析方式。探索性分析应成为所有数据科学项目的基石。

目录