内容简介
本系列将介绍如何在现在工作中用两种最流行的开源平台玩转数据科学。本文先来看一看数据分析过程中的关键步骤 – 探索性数据分析(Exploratory Data Analysis,EDA)。
探索性数据分析发生在数据收集和数据清理之后,而在数据建模和分析结果可视化展现之前。然而,这是一个可反复的过程。做完某种EDA后,我们可以尝试建立一些数据模型或者生成一些可视化结果。同时,根据最新的分析结果我们又可以进行进一步的EDA,等等。所有的这些都是为了更快地找到线索,而不用纠结在数据细节和美观上。EDA的主要目的是为了了解我们的数据,了解它的趋势和质量,同时也是为了检查我们的假设甚至开始构建我们的假设算法。
了解了以上内容,我们将解释如何用描述统计学、基本绘图和数据框来回答一些问题,同时指导我们做进一步的数据分析。
准备数据
我们将继续使用在介绍数据框时已经装载过的相同的数据集。因此你可以接着数据框相关教程继续这个章节。
我们要回答的问题
在任何的数据分析过程中,总有一个或多个问题是我们要回答的。定义这些问题,是整个数据分析过程中最基本也是最重要的一个步骤。因为我们要在我们的结核病数据集中做探索性数据分析,有一些问题需要我们回答:
哪些国家拥有最高传染性结核病发病率?
从1990年到2007年世界结核病的总体趋势是什么?
哪些国家没有符合这个趋势?
还有哪些关于这个疾病的真相可以从我们的数据中得到?
![](/qrcode.jpg)
描述性统计
Python
在Python中,对一个pandas.DataFrame对象的基本的描述性统计方法是describe()。它等同于R语言中data.frame的summary()方法。
这里列出了所有列的统计信息,我们可以用以下方法来访问每个列的汇总信息:
Pandas包中有多得可怕的描述性统计方法。其中一部分已经包含在了我们的summary对象中,但是还有更多的方法不在其中。在接下来的教程中我们将好好的利用它们来更好的了解我们的数据。
例如,我们可以得到西班牙(Spain)每年结核病发病量的变化百分比:
同时从以上结果得到最大值:
也可以对英国(United Kingdom)做同样的操作:
如果我们要了解索引值(year),我们用argmax 方法(或Pandas新版本中的idmax调用方法)如下:
也就是说,1998年和1992年分别是西班牙和英国肺结核发病量增长最糟糕的年。
R
在R语言中基本的描述性统计方法,如我们说过的,是summary()。
这个方法返回一个表格对象,使我们拥有了一个包含各列统计信息的数据框。表格对象有利于我们观察数据,但作为数据框却不利于我们访问和索引数据。基本上,我们是把它当作矩阵,通过坐标位来访问其中的数据。通过这种方法,如果我们要得到第一列,Afghanistan的相关数据,我们该这样做:
有个窍门可以通过列名访问数据,那就是将原始数据框中的列名和which()方法一起使用。我们还可以在结果集上构建一个新的数据框。
R做为一种函数式语言,我们可以对向量使用函数方法例如sum、 mean、 sd等等。记住一个数据框就是一个向量的列表(也就是说各个列都是一个值的向量),如此我们便可以很容易地用这些函数作用于列上。最终我们将这些函数和lapply或sapply一起使用并作用于数据框的多列数据上。
不管怎样,在R语言中有一家族的函数可以作用于列数据或行数据上以直接得到均值或和值。这样做比用apply函数更有效,并且还允许我们将他们不光用在列数据上,更可用在行数据上。例如,你输入‘?colSums’命令,帮助页面会弹出所有这些函数的描述性说明。
比如我们想得到每年的平均病发量,我们只需要一个简单的函数调用:
图表绘制
在这个章节中我们要看一看在Python/Pandas和R中的基本的绘图制表功能。然而,还有其它如ggplot2,这样绘图功能更强大语言包可以选择。ggplot2最初是为R语言创建的,Yhat的人又提供了它的Python语言的实现。
Python
Pandas包中DataFrame对象实现的即时可用的作图方法有3个之多第一个方法是一个基本的线图绘制,作用于索引中的连续变量。当我们用IPython notebook工具绘图时,这第一条线也许我们会用得着:
或者我们可以用箱线图来得到给定连续变量的摘要视图:
还有一个histogram()方法,但是我们现在还不能将它作用于我们这种类型的数据。
R
和ggplot2相比,R语言的基础绘图不是非常精密复杂,但它还是功能强大同时又操作便利的。它的很多数据类型都自定义并实现了plot()方法,可以允许我们简单地调用方法对它们进行绘图。然而并不总是如此便利,更多的情况是我们需要将正确的元素集传给我们的基础绘图函数。
正像之前用Python/Pandas绘制线型图,我们也从基础的线型图绘制开始:
你可以比较出在Pandas中绘制三条连续变量线型图是多么容易,而用R的基础绘图绘制相同的图代码是多么冗长。我们至少需要三个函数调用,先是为了图形和线,然后还有图的标注,等等。R语言的基本绘图的真正用意就是绘制快速而不完善的图。
现在让我们来使用箱线图:
这是一段简短的箱线图代码,我们甚至没有要图的颜色和图例说明。
回答问题
现在让我们开始正真好玩的章节。一旦我们了解了我们的工具(从之前的数据框教程到当下这个教程),我们就可以用它们来回答关于传染性肺结核病在全球的发病率和盛行率的一些问题。
问题:我们想知道,每年,哪个国家存在的、新的传染性肺结核病例最多?
Python
如果我们只是想得到病例最多的国家,我们可以利用apply和argmax函数。记住,默认的,apply作用于列数据(在我们的例子里是国家列),而我们希望它作用于每一年。如此这样,我们需要在使用数据框之前颠倒它的行列位置,或传入参数axis=1。
但是这样做过分简单了。另外,我们要得到的是位于最后四分区的国家。而我们首先要做的是找出全球的总的发病趋势。
全球传染性肺结核发病趋势:
为了探索全球总趋势,我们需要对三个数据集中所有国家的每年的数据分别求和。
现在我们要创建一个新的数据框,里面包含各个之前得到的和集,然后用数据框的plot()方法进行绘图。
看上去全球每十万人中现存病例总数历年来呈整体下降趋势。然而新的病例总数呈上升趋势,虽然2005年后好像有所下降。所以怎么可能在新的病例总数增长的情况下现存病例总数下降呢?其中一个原因可能是我们可以在图中观察到的上升的每十万人的因病死亡人数,但是我们不得不考虑其主要原因是因为人们得到了治疗而恢复了健康。康复率加上死亡率大于新的病发率。总之,看上去新的发病率增加了,而同时我们治愈它们的水平也更好了。我们需要改进预防措施和传染病控制能力。
超出整体趋势的国家
所以之前是全球作为一个整体的总趋势。那么哪些国家呈现不同的趋势呢(更糟糕)?为了找出这些国家,首先我们需要了解每个国家平均年死亡率的分布情况。
我们可以画出这些分布图从而了解这些国家年平均分布情况。
我们要得到那些概率大于四分位间距(IQR、50%)1.5倍的国家。
先得到上限值:
现在我们可以利用这些值来得到从1990年到2007年平均概率大于这些上限值的国家。
我们有多少比例的国家是超出整体趋势的?对于死亡率:
对于存在病率(患病率):
对于新病率(发生率):
现在我们可以用这些指标来对我们原始的数据框做筛选。
这是一个严肃的事情。根据传染性肺结核病的分布,我们有超过全球三分之一的国家在现存病率、新病率和死亡率上超出普遍概率。然而如果我们以四分位间距(IQR)的5倍为上限呢?让我们重复之前的过程。