准备好了吗?现在让我们磨好手里的厨刀并结合六步框架来解决一些简单的数据清洗问题吧。这个例子会用到对公众开放的安然(Enron)公司电子邮件数据集。这是一个非常有名的数据集,当中所有的往来邮件都源自现已停业的安然公司前雇员。作为美国政府调查安然公司账目欺诈的一部分,雇员之间的邮件已被公开并可供任何人下载。来自各个领域的研究人员已经发现,这些邮件有助于研究商务沟通、社交网络等问题。
你可以在维基百科http://en.wikipedia.org/wiki/Enron上阅读更多关于安然公司和导致它破产的金融丑闻。在另外一个页面http://en.wikipedia.org/wiki/Enron_ Corpus上,你可以阅读关于安然公司电子邮件语料库的信息。
在这个例子当中,我们会采用六步框架来解决一个简单的数据科学问题。假设我们需要揭露在某一段时间里安然公司内部电子邮件的使用趋势和特征。先让我们按照日期来对安然雇员之间的往来邮件数量做个统计,然后再通过图形来显示统计出来的数据。
首先,我们需要按照http://www.ahschulz.de/enron-email-data/上面的指南下载一份MySQL版本的安然公司语料库。另一个(备份)源的地址是https://www.cs.purdue.edu/homes/jpfeiff/enron.html。根据指南,我们需要把数据导入到MySQL服务器中一个称为Enron的数据库模式中。导入之后的数据可以通过MySQL命令行界面或是基于网页的PHPMyAdmin工具进行查询。
这是我们的第一个数据统计查询,语句如下:
SELECT date(date) AS dateSent, count(mid) AS numMsg
FROM message
GROUP BY dateSent
ORDER BY dateSent;
从结果中我们马上就会注意到,许多邮件的日期都不正确。比如,很多日期要么早于或晚于公司的存续期(如1979),要么与事实逻辑不符(如0001或2044)。邮件虽旧,但也不至于那么旧!
下表是截取出来的一部分数据片段(完整的结果集长达约1300行)。这些数据的日期格式都是正确的。但是,有些日期值有着明显的错误。
dateSent numMsg
0002-03-05 1
0002-03-07 3
0002-03-08 2
0002-03-12 1
1979-12-31 6
1997-01-01 1
1998-01-04 1
1998-01-05 1
1998-10-30 3
这些错误日期的产生很有可能是由邮件客户端配置不当导致的。这里,我们有三种处理方案可以选择。
什么都不处理:也许,我们可以选择忽略这些错误数据,直接开始构建线性图。但是,最小的错误日期始于0001年,最大的错误日期至2044年结束,所以我们可以想象,最终的线性图时间轴上将有1300个刻度线,每个刻度上面显示着1或者2。光是听起来就没有什么吸引人的地方,也没提供什么有用的信息,所以不处理就等同于数据毫无用处。
修正数据:我们可以尝试算出错误消息对应的正确日期,从而生成正确的数据集来创建图形。
扔掉受影响的邮件:我们可以做出一个明智的决定,放弃那些日期不在预定范围之内的邮件。
为了在选项二和选项三之间做个决断,我们需要先计算一下1999~2002年有多少封邮件会受到影响。为此,我们编写了下面的SQL语句:
SELECT count(*) FROM message
WHERE year(date) < 1998 or year(date) > 2002;
Result: 325
结果显示一共有325封邮件包含日期错误,乍一看确实有点多,但请等一下,实际上这些数据只是占了全部数据量的百分之一。现在需要好好斟酌一下了,或许我们可以手工修复这些日期,但也可以假定不在乎这百分之一的损失。那就干脆扔掉这些数据直接选择第三个方案吧。下面是调整后的查询语句:
SELECT date(date) AS dateSent, count(mid) AS numMsg
FROM message
WHERE year(date) BETWEEN 1998 AND 2002
GROUP BY dateSent
ORDER BY dateSent;
数据清洗完成之后一共生成了1211条结果,每一行都有其对应的邮件数量。下面的内容截取自新的数据结果集:
dateSent numMsg
1998-01-04 1
1998-01-05 1
1998-10-30 3
1998-11-02 1
1998-11-03 1
1998-11-04 4
1998-11-05 1
1998-11-13 2
在新的数据中,1998年1月的两个日期看起来有些问题,因为其他邮件都始于10月,而且10月之后的邮件数量更为规律一些。这很奇怪,同时也反映了另一个问题:我们是否还有必要在x轴上标记每一个日期,即使这一天一封邮件都没有发出?
如果我们的答案是肯定的话,那就需要显示每一个日期,即使它对应的邮件数量是0。这意味着我们需要再做一轮数据清洗工作,生成那些没有邮件往来的日期所对应的数据。
但是请等一下,对于这个问题的处理,我们可以稍微变通一下。是不是真的要在原始数据中加入零数据,其实这取决于我们用什么样的工具来创建图表以及图表的种类。举个例子来说,Google的Spreadsheets就能在初始数据中缺少日期的情况下,在x轴上自动进行零值数据补齐,创建线性图或是条状图。在我们的数据中,这些需要补齐的零值就是1998年所缺失的日期。
下面的三幅图演示了这些工具所呈现的结果,并反映出它们是如何处理日期轴上的零值数据的。请注意,Google Spreadsheets在头部和尾部所展现的长长的零值数据。
干净的数据:数据清洗入门与实践——1.5 入门示例
书名: 干净的数据:数据清洗入门与实践
作者: [美] Megan Squire
出版社: 人民邮电出版社
译者: 任政委
出版年: 2016-5
页数: 200
定价: 49.00元
装帧: 平装
ISBN: 9787115420473