数据科学实战手册(R+Python)

978-7-115-42675-8
作者: 【美】Tony Ojeda(托尼·奥杰德) Sean Patrick Murphy(肖恩·派特里克·墨菲) Benjamin Bengfort(本杰明·班福特) Abhijit Dasgupta(阿布吉特·达斯古普塔)
译者: 郝智恒
编辑: 王峰松

图书目录:

详情

本书的主要内容有:学习数据科学项目的流程,并使用它来获取、清洗、分析和可视化数据;在多个实战项目中理解数据科学的关键概念;通过一步一步的代码实例来掌握R和Python强大的数据编程能力。无论你是数据科学的新手,还是有经验的专业人士,你都可以从本书提供的89个实际案例中掌握数据科学的关键概念和利用R、Python进行数据编程的能力。

图书摘要

版权信息

书名:数据科学实战手册(R+Python)

ISBN:978-7-115-42675-8

本书由人民邮电出版社发行数字版。版权所有,侵权必究。

您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。

我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。

如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。

• 著    [美] Tony Ojeda Sean Patrick Murphy

         Benjamin Bengfort Abhijit Dasgupta

  译    郝智恒 王佳玮 谢时光 刘梦馨

  责任编辑 王峰松

• 人民邮电出版社出版发行  北京市丰台区成寿寺路11号

  邮编 100164  电子邮件 315@ptpress.com.cn

  网址 http://www.ptpress.com.cn

• 读者服务热线:(010)81055410

  反盗版热线:(010)81055315


Copyright © Packt Publishing 2014. First published in the English language under the title Practical Data Science Cookbook-(9781783980246).

All rights reserved.

本书中文简体字版由Packt Publishing公司授权人民邮电出版社出版。未经出版者书面许可,对本书的任何部分不得以任何方式或任何手段复制和传播。

版权所有,侵权必究。


这本书是基于R和Python的数据科学项目案例集锦。业界的数据分析师、数据挖掘工程师、数据科学家都可以读一读。想要了解实际工作中如何用数据产生价值的在校学生,或者对数据科学感兴趣的人也值得一读。本书最大的优点在于其结构,每一章的每一节内容都是按照“准备工作—处理流程—工作原理”的方式组织,这种组织形式非常适合learn-by-doing。本书的内容涵盖了基于数据科学的所有要素,包括数据采集、处理、清洗、分析、建模、可视化以及数据产品的搭建。案例包含了汽车数据分析、股票市场建模、社交网络分析、推荐系统、地理信息分析,以及Python代码的计算优化。通过手把手的案例解析,令读者知其然并知其所以然。


托尼·奥杰德是一位经验丰富的数据科学家和企业家,在商业流程的最优化方面非常专业,并且对创造和执行创新型数据产品和解决方案非常有经验。他在佛罗里达国际大学获得金融硕士学位,并且在德保罗大学获得了MBA学位。他是社区数据实验室的创始人、华盛顿DC数据社区的联合创始人,致力于对数据科学家的教育提升和组织。

首先,也是最重要的,我想感谢我的合作者,正是他们不知疲倦的工作才有了这本书。我很骄傲我们一起合著了本书。我也期待在未来,我们能和你一起合作更多项目,有更多更好的产出。

我还想感谢我的审稿人,尤其是维尔·沃希思和萨拉·凯丽。他们阅读了本书的每一个章节,并且给了我们很好的反馈。正是因为他们的建议和意见,才有了本书现在的品质。

我还想要感谢我的家人和朋友,感谢他们对我工作的支持和鼓励。

最后,我要感谢我的未婚妻、我人生的伴侣——尼基。感谢她的耐心、理解和陪伴。如果我的个人生活没有现在这么稳定,这样充满爱,我是不会冒险完成各种实验的。感谢她提供的充满爱和支持的氛围。

肖恩·派特里克·莫非在约翰霍普金斯大学的应用物理实验室做了15年的高级科学家,他专注于机器学习、建模和模拟、信号处理以及高性能计算。现在,他是旧金山、纽约和华盛顿DC多家公司的数据顾问。他毕业于约翰霍普金斯大学,并在牛津大学获得MBA学位。他现在是华盛顿DC数据创新见面会的联合组织者,是MD数据科学见面会的联合创始人。同时他也是华盛顿DC数据社区的联合创始人。

本杰明·班福特是一位非常有经验的数据科学家和Python开发者。他曾在军方、业界和学术界工作过8年。他现在在马里兰大学派克学院攻读计算机博士学位,研究元识别和自然语言处理。他拥有北达科塔州立大学的计算机硕士学位,并且在那里教授过本科的计算机科学课程。他是乔治城大学的客座教授,在那里教授数据科学和分析。本杰明曾经在华盛顿DC参加过两次数据科学培训:大规模机器学习和多领域大数据技术应用。他非常感激这些将数据模型以及商业价值融合的课程,他正在将这些新兴组织构建为一个更成熟的组织。

我想要感谢维尔·沃希思,感谢他对我所做的一切无尽的支持。他甚至同意校对我的技术文档,并且增加了我写作部分的可读性。在我的职业生涯中能有他这样的伙伴和朋友,对我来说是至关重要的。我还要感谢我的合著者——托尼和肖恩,感谢他们的努力,才有了这本书。我还要感谢萨拉凯丽,感谢她对我们的建议和新想法。到现在为止,她已经和我们做了非常多的冒险,并且我也希望能够早日阅读她的大作。最后,我要特别感谢我的妻子——杰西,尤其是那些我需要工作到深夜的日子。没有她,我完全不会写出现在的东西。她是一个非常聪明的人,也是我们家的另一个作者。她的作品将会成为经典,每个学生都应该读一读。

阿布吉特·达斯古普塔是在大华盛顿DC-马里兰-佛吉尼亚地区工作的数据顾问,他有着多年的生物制药行业咨询、商业分析、生物信息以及生物工程咨询方面的经验。他拥有华盛顿大学生物统计的博士学位,并且有40多篇被审稿人接收的论文。他对统计机器学习非常感兴趣,并且非常乐于接受有趣和有挑战性的项目。对于如何更新更好地进行数据分析,他是非常有激情参与讨论的。他是华盛顿DC数据社区的成员,并且是华盛顿DC统计编程社群的创始人和联合组织者(华盛顿DC地区R用户组的前身)。


郝智恒:甘肃兰州人士,南开大学概率统计专业毕业。统计之都活跃会员。目前在阿里巴巴商业智能部任职,擅长数据分析和数据挖掘。喜欢用数据探索商业世界的边界。 

王佳玮:黄山脚下长大,香港城大-中科大联合培养博士毕业。现于阿里云大数据孵化器团队搬砖,喜欢数据分析和挖掘在社会各领域的应用。目前正在致力于用数据和算法解决交通拥堵问题。

谢时光:2011年博士毕业于美国弗吉尼亚理工大学工业工程系运筹学专业,毕业后从事数据分析、最优化和决策支持相关工作至今。曾先后在安飞士(Avis)、亚马逊(Amazon.com)、费埃哲(FICO)等行业领先的公司从事从供应链到风险控制等多个应用领域的数据分析科学和优化决策研究工作。

刘梦馨:灵雀云高级软件工程师,专注于容器虚拟化领域,机器学习爱好者,个人博客:http://oilbeater.com

在本书翻译的过程中,来自阿里巴巴商业智能部的李萍、皇甫深龙,以及来自京东搜索推荐部的熊熹、车挣网络数据研发中心的徐浩、华南统计科学研究中心的张晔,来自统计之都社区的李绳、王小宁等人对本书的中文译稿进行了仔细的审阅,并提出了特别多有价值的意见和建议。没有他们,就没有本书的中文版。特别感谢统计之都,这里聚集了一群有情有义的数据人,他们来自世界各地,热心技术交流,乐于分享,通过数据让这个世界变得更美好。


理查德•海茵曼是L-3国家安全方案实验室(NSS)的技术研究员和首席数据科学家(纳斯达克代码:LLL),同时他还是拥有EMC认证的数据科学家,专注于空间统计、数据挖掘和大数据。理查德还是L-3数据策略业务小组的数据科学团队的领导者。L-3 NSS和L-3数据策略小组都是初级大数据和分析服务提供者,总部在华盛顿,为全球客户服务。

理查德是马里兰大学的客座教授,在那里他教授空间分析和统计推断。同时,他是乔治梅森大学的讲师,在那里他教授人口地理分析。他还是2014—2015年的AAAS大数据和分析团体的荣誉成员,是华盛顿大数据委员会成员。

理查德最近出版了《基于R的社会媒体挖掘》(Packt出版社)。他现在对DARPA、DHS、美国军方和Pentagon提供数据分析支持。

萨拉•凯丽是一个初级Python开发者,也是一个有抱负的数据科学家。她现在在马里兰班赛思达的一家初创公司工作,花费了大量时间进行数据吸收和整合。萨拉拥有西雅图大学的硕士学位。她是一个自学成才的程序员。她也鼓励她的学生们规划数学、科学和技术相关的职业生涯。

Liang Shi 2006年毕业于佐治亚大学计算机科学专业,并于2008年拿到同专业的硕士学位。他博士研究的方向是机器学习和人工智能,主要是解决替代模型的优化问题。毕业后,他加入了McAfee的数据挖掘研究团队。他的工作是通过大数据和云计算平台开发机器学习算法来识别网络威胁。之后他加入了微软,作为一名软件工程师,继续开发应用于安全领域的机器学习算法,尤其是针对超大规模、实时的网上广告欺诈识别。2012年,他作为高级研究员重新加入了McAfee(英特尔),主导基于云计算平台和机器学习的网络威胁领域的研究。2014年早些时候,他作为高级数据科学家加入了Pivotal,主要为企业客户进行数据科学项目。他对统计和机器学习模型以及理论都非常熟悉,并且熟悉多种编程语言和分析工具。他已经在杂志和会议上出版了多篇论文,此外还出版了一本书的一章。

维尔•沃希思是一个软件开发者,从移动应用开发到自然语言处理,再到网络安全,都非常有经验。他曾在奥地利教授英文,并且开创了一家教育技术初创公司。之后,他搬到了西海岸,加入了一个大型技术公司,现在正在网络安全领域快乐地工作,他们研发的软件被上千开发者使用。

在空闲时间,他喜欢审校技术书籍、看电影,并且安抚他的狗—是的,它是个好女孩。


我们生活在数据时代。每一年,数据都在大量快速地增长,因此分析数据和从数据中创造价值的需求也比以往任何时候都更为重要。那些知道如何使用数据以及如何用好数据的公司,在后续的竞争中会比那些无法使用数据的公司更有优势。基于此,对于那些具备分析能力,能够从数据中提取有价值的洞见,并且将这些洞见用于实践产生商业价值的人才的需求会放大。

本书提供了多种令读者能够学习如何从数据创造价值的机会。书中所用的数据来自很多不同的项目,而这些项目可以体现出最新的数据科学项目的各种维度。每一章的内容都是独立的,包含了电脑屏幕截图、代码片段、必要的详细解释。我们对处理数据的过程和实际应用特别关注。这些内容都是以循序渐进的方式来安排写作的。

写作本书的目的在于,向读者介绍成为数据科学家的路径,以及向读者展示这些方法是如何应用在多种不同的数据科学项目上的。此外,我们还希望读者在今后自己做项目时,能够很方便地应用我们讲到的方法。在本书中,读者将会学到不同的分析和编程课,而所有的课程中所讲授的概念和技能,都是以实际的项目作为引导,因此读者会更好地理解它们。

第1章,准备你的数据科学环境。本章向读者介绍了数据科学的路径,并且帮助Mac、Windows和Linux操作系统的读者恰当地搭建数据科学环境。

第2章,汽车数据的可视化分析(R)。本章将带领读者对汽车数据进行分析和可视化,从中发现不同时间燃料效率的变化趋势和模式。

第 3 章,模拟美式橄榄球比赛数据(R)。这一章的项目非常有趣且具有娱乐性。本章分析橄榄球球队进攻防守强度的关系,并且模拟比赛,预测哪个球队会取得胜利。

第4章,建模分析股票市场数据(R)。这一章向读者展示如何搭建自己的选股系统,并且使用移动平均法分析股票历史数据。

第5章,就业数据的可视化探索(R)。这一章向读者展示如何从劳动统计局获取雇佣和收入数据,并且用R对不同水平的数据进行空间分析。

第6章,运用税务数据进行应用导向的数据分析(Python)。本章向读者展示如何使用Python将自己的分析从一次性临时的工作转变为可复用的产品化的代码。这些工作都是基于一份收入数据展开。

第7章,运用汽车数据进行可视化分析(Python)是第2章内容的复用,但是这里使用的是强大的编程语言Python。

第8章,社交网络分析(Python),向读者展示如何建立、可视化和分析社交网络。本章所用数据来自于漫画书中的角色关系。

第9章,大规模电影推荐(Python)。本章介绍如何用Python搭建电影推荐系统。

第10章,获取和定位Twitter数据(Python)。这一章向读者展示如何调用Twitter的API获取Twitter用户数据,并绘制用户信息中包含的地理信息数据。

第11章,利用NumPy和SciPy优化数值计算(Python)。本章将带领读者领略如何优化Python代码,从而在处理大数据集时节省时间和金钱。

要阅读本书,你需要一个能够连接到互联网的电脑,并且能够安装本书项目中所需要的开源软件。本书主要用到的软件包括R和Python,这两个编程语言带有大量的免费的包和库。第1章会介绍如何安装这些软件以及它们的包和库。

本书旨在使用能够亲自实践的现实案例,启发那些想要学习数据科学以及数值编程的数据科学家们。无论你是一个全新的数据科学家,还是具有丰富的经验,在学习了数据科学项目的结构、数据科学管道的路径以及本书中展示的示例代码之后都会有所收获。本书是按照循序渐进的方式组织内容的,因此并不需要读者具有太多的编程经验。

我们欢迎读者反馈。请让我们知道你对本书的想法 — 哪些部分你喜欢,哪些部分你不喜欢。对于我们后续开发更多的话题来说,读者反馈是非常重要的。

只需要发送电子邮件到feedback@packtpub.com,并且在邮件标题中提及本书的书名,在邮件中告诉我们你的想法即可。

如果你对某个领域特别专长,并且你也想写本书或者和别人合作写本书,那么请访问我们的作者指南:www.packtpub.com/authors。

作为我们Packt图书的荣誉用户,你可以享受以下权益。

你可以通过你在http://packtpub.com的账户,下载所有Packt图书的代码。如果你是在其他地方购买的本书,你可以在http://www.packtput.com/support上注册,并且通过电子邮件获得代码文件。

我们也提供书中彩图的PDF文件。这些彩图将会帮助你更好地理解本书的内容。你可以在这里下载这些文件:http://www.packtpub.com/sites/default/files/downloads/0246OS_ColorImages.pdf.

尽管我们已经尽量细致地检查本书的内容,以免发生不确切的部分,但是书中的错误依然是难免的。如果你发现我们书中的内容有错,无论是内容的错误,还是代码的错误,请你将错误反馈给我们,我们将非常感激。当你发现任何错误,请通过如下网址来反馈:http://www.packtpub.com/submit-errata。一旦你的勘误信息被确认,那么你提交的信息将被我们接受,并且上传到我们的网站,添加进勘误列表。你可以在http://www.packtpub.com/support上查看所有的勘误信息。

互联网的版权问题一直是个问题。在Packt,我们非常严肃地保护我们的版权。如果你在互联网上遇到我们出版图书的任何盗版版本,无论是什么形式,请将该盗版版本的地址和网站名称反馈给我们。

请将盗版链接发送到copyright@packtpub.com。

我们将非常感谢你对我们的帮助,你的行为能保护我们的作者,从而让他们能够更好地为你提供更多优质的内容。

如果你对我们的图书有任何问题,请通过如下电子邮件联系我们:questions@packtpub.com。我们将尽我们所能帮你解答。


本章涵盖如下内容:

传统意义上的食谱,就是作者擅长的烹饪菜谱,用于帮助读者学习新菜的做法。很多人相信,对于一份食谱而言,它最终的产出就是食谱所对应的菜品本身,而读者在阅读本书时也可以想象是在阅读一份食谱。本书的每一章都会介绍基于不同目标、在不同数据集上使用数据科学管道的各种阶段来完成的实际应用案例,指导读者实践。同时,和做菜的过程一样,最终的产品可以是针对某一个特定数据集的分析应用。

然而,我们希望读者能有一个更广泛的视角。数据科学家是在实践中不断学习的,每一次的迭代和验证假设都可以增进实践者的知识。在本书中,我们使用两种不同的编程语言(R和Python)来对不同的数据集采用多种数据科学管道。希望通过这样的方式,读者可以开始抽象出分析模式,看到一幅更广阔的图景,并且对数据科学这一尚未明确定义的领域有更深刻的认识。

我们同时也希望读者能够知道,不同于传统的烹饪食谱,数据科学的食谱是含混不清的。当主厨开始制作某道菜时,他们是明确知道要使用什么食材,以及成品的品相如何的。然而对于数据科学家而言,情况往往不同。数据科学家往往不知道要处理的数据集是什么样的。数据科学家的菜单是深入挖掘数据的某种可能实现方式,而要开始在这条路上深挖数据,首先你要能够问出对的问题。

如果你是统计学或者数学背景,那么本书提供的建模技术可能不会令你感到兴奋。你应该关注那些更偏重实践的数据科学管道,比如如何加载一个很大的数据集,以及如何使用可扩展工具以及已知算法来实现实际的数据应用、交互式可视化图形展示以及Web应用,而不仅仅是报告或者论文。我们希望这些视角可以扩展你的价值,加深对于数据科学的理解,以及能够更好地在你的领域应用数据科学。

实际的数据科学家会使用丰富多样的工具来完成他们的工作。数据源的搜罗、数据清洗、可视化、建模以及使用各种工具完成大量的任务。如果你问过绝大多数数据工作者,你会知道,这些工具中最重要的部分是对数据进行分析和建模的编程语言。回答哪种编程语言最适合做特定的数据分析和建模,有点像回答世界上哪个宗教是最正确的,当然这不会造成大规模流血事件。

本书中,我们会同时关注两种非常不同的编程语言——R和Python——读者可以选择自己喜欢的。在整个过程中,我们会针对特定任务所适合的编程语言给出一些提示。同时,我们也会对不同编程语言,在同样数据集上使用类似分析方法得出的结果加以比较。

当你学习新的概念和技术时,总要在学习的深度和广度之间做权衡。同样的时间和精力,你到底是应该同时学习 R 和 Python,达到一个中等水平,还是选择其一深入研究?从我们的经验来看,我们强烈推荐你精通掌握一门语言,同时对另一门语言也有一些认知。那么,这是否意味着本书中一些章节你可以跳过呢?显然不是!然而,当你开始阅读本书时,请选择一门语言,并且深入研究,不仅掌握这门语言,并且能流利地使用它。

为了继续本章的内容,请保证你的电脑有足够的空间,可以在合理的时间内下载几个GB的软件。

在开始安装各种软件之前,我们需要对本书中使用的那些在数据分析中可重复的步骤和方法有所了解。

以下五步是数据分析的关键。

1.获取:数据科学管道的第一步是从不同来源获取数据,包含传统数据库、NoSQL、文件、网页抓取、分布式文件存储系统(如Hadoop平台上的HDFS、RESTful API、文本文件),甚至还包括PDF(当然但愿不要是这种形式)。

2.探索和理解:第二步是要理解你要分析的数据,以及要理解数据是如何采集的;这一步经常需要做一些显著性的探索。

3.改写、整合以及处理:这一步往往是数据科学管道中最费时的。数据几乎从来不会是你想要的格式。

4.分析和建模:这一步是比较有意思的,数据科学家会从数据中得到变量之间的统计关系,并且施展他们的机器学习技能来聚类、分类、预测等。

5.交流和实施:在管道的最后一步,我们需要交付我们的结果,而结果需要一定的形式和结构。这些结果有时是交付给自己的,从而开启下一轮的迭代,有时是发送给各种不同的用户的。数据产品可以是一次性的报告,也可以是可扩展的 Web 产品,而这些 Web产品有可能会被成千上万的人使用。

尽管上文提到的五个步骤是有顺序的,但是不要认为每一个项目都会严格地按照上面的顺序线性进行。事实上,敏捷型数据科学家会知道这些过程都是交织在一起的。通常数据探索会让我们知道数据是如何清洗的,清洗之后的数据可以继续做更多的探索和更深入的理解。这两步哪一步优先,是基于你一开始对数据熟悉的程度。如果你使用生产和采集数据的系统工作过,那么数据探索和理解这个阶段也许会非常短,除非系统发生了什么问题。相反,如果你对要处理的数据没有任何背景知识,那么数据探索和理解这个阶段会花费一些时间(其中的很多时间是不用编程的,例如和系统开发者进行沟通)。

下图展示了数据科学管道。

也许你已经得知,数据的改写、整合和处理常常会耗费总项目80%的时间和资源。在一个完美世界中,通常我们可能收到完美的数据,然而,不幸的是,这种情况从来没有发生过。而且数据中存在的问题是不可穷举的。有时,一个数据字典可能会发生改变,也有可能会丢失。在这种情况下,想要理解数据取值的含义,是不可能的。一些数据域中可能存在垃圾,或者一些值已经转到另外的域中。如一个Web产品改版升级,也许会产生一些bug,导致之前的数据无法正常采集,从而导致几百上千行的数据缺失。如果这一步发生问题,那么你分析的数据就会包含这些错误的信息。

最后一步,交流和实施,是非常重要的。但是这一步错综复杂,往往不受重视。请注意,数据科学管道的最后一步,并不是数据可视化,不是做一些炫酷的图形,或者做一些本身就看起来非常复杂的图形展现。相反,数据可视化会和数据一起,成为数据科学家要讲的故事大图中的一部分。更进一步,有一些数据科学家会更加深度地推动他分析结果的落地,因为如果你不去试着用你从数据中发现的知识去说服决策者做出某种决策,那么你的数据科学工作将毫无价值。

R项目的主页上对R的定义是“R是一个用于统计计算和绘图的编程语言和环境”。并且R已经变成了统计分析和数据分析的首选语言。对于本书而言,前半部分都会选择R作为默认的工具。

请确保你的电脑已经连接了网络,因为你可能要下载一个大于200MB的软件。

安装R是很简单的;请执行如下步骤。

1.请访问CRAN(Comprehensive R Archive Network),并且下载你的操作系统所对应的最新版本的R。

截至本书写作的2014年2月,最新版本的R是3.0.2版本。该版本是2013年9月发布的。

2.当你下载好之后,请按照CRAN提供的非常好的指导文档,在你的平台上安装R。对于Windows和Mac用户,只要双击安装包即可。

3.安装好R之后,打开它。你将看到一个类似下图的窗口。

4.你可以就此停止,但是你会错过一款非常出色的R语言的集成开发环境(IDE)——RStudio。访问http://www.rstudio.com/ide/download/下载RStudio,按照网上提供的安装指南来进行安装。

5.安装好之后,请运行RStudio。下面的截图展示了作者个性化配置的RStudio界面,控制台在左上角,编辑器在右上角,当前空间的变量列表在左下角,当前路径在右下角。

R是一种交互式编程语言,最初出现在1993年,是对S统计编程语言的集成。而S语言则是在20世纪70年代诞生于Bell实验室(S-PLUS是S语言的商业版本)。R是专注于统计分析和可视化的领域语言(DSL)。因为拥有开源证书,它有时候又被称为GNU S。当然,你也可以用R做许多并非直接和统计分析相关的工作(如网页爬取)。即便如此,R依然是一个领域语言,并且没有打算成为一门通用语言。

R同时也受到CRAN的支持,CRAN是Comprehensive R Archive Network(http://cran.r- project.org/)的首字母组合。CRAN包含了以往版本的R,并且提供下载。当需要使用旧版的软件做可重复性的分析时,就可以使用旧版本的R。除此之外,CRAN包含了成百上千个可以免费下载的扩展包。事实上,正是因为近几年,很多新的统计算法都是首先集成在R中,才使得R成为多个领域中数据分析开发平台的首选。

RStudio(http://www.rstudio.com/)可以在GNU Affero通用公共许可证V3版下获取。它是开源的,可以免费使用。RStudio公司除了提供R的商业支持之外,也提供了额外的工具和服务。

R有一个数量庞大的扩展包,用以增加其功能。事实上,很多国家的大学统计系中,R都是其默认首选语言。因此,当有新的算法被发明时,R都是第一个用于实现这种算法的语言。更幸运的是,安装新增的R包非常简单,介绍如下。

只要你的R和RStudio已经安装完毕,那你就已经准备好了。

在R中安装新增包非常简单:

1.打开R的交互环境,或者RStudio。

2.假如我们要安装ggplot2,只要输入如下命令,按下回车即可:

install.packages ("ggplot2")

请注意,我们假设,在本书后面的章节,每当我们键入一行文本时,都会在末尾键入回车键。

3.此时,你会在电脑屏幕上看到如下文字。

   trying URL 'http://cran.rstudio.com/bin/macosx/contrib/3.0/ ggplot2_0.9.3.1.tgz'
   Content type 'application/x-gzip' length 2650041 bytes (2.5
   Mb)
   opened URL
   ==================================================
   downloaded 2.5 Mb

   The downloaded binary packages are in
   /var/folders/db/z54jmrxn4y9bjtv8zn_1zlb00000gn/T//Rtmpw0N1dA/
   downloaded_packages

4.也许你已经注意到了,你需要知道包的准确名称,如刚才例子中的ggplot2。访问http://cran.us.r-project.org/web/packages/available_packages_by_name.html,确保你输入的包名是准确的。

5.RStudio提供了安装包更为简单的机制。如果你还没有打开它,那么现在打开RStudio。

6.在菜单上选择Tools,选择Install Packages,则会弹出一个窗口,如下图所示。

7.当你开始键入包名时,RStudio则会自动展示一列可能的包名。这种自动补全功能简化了包的安装过程。更好的是,类似包名的包,或者是和你要安装的包名前几个字母相同的老版本或者新版本的包,你都会看得到。

8.现在我们安装一些新的包,这些包都是我们强烈推荐的。输入如下命令。

install.packages("lubridate")
install.packages("plyr")
install.packages("reshape2")

下载样例代码
如果你在www.packtpub.com拥有一个账户,那么对于所有的Packt图书,都可以下载样例代码。如果你在别处获取了这本书,那么你可以访问www.packtpub.com/support注册之后,通过电子邮件获取。

无论你是使用RStudio的图形界面还是直接使用install.package命令,你做的事情是一样的。你告诉R,针对你目前的R版本,找到一个合适的库来安装。当你使用命令语句来安装包时,R会报告一个在CRAN上找到的包的地址,以及这个包在你的电脑上下载的路径。

R最有力的力量来源是其社区,这里再回顾两个网站。R-bloggers是一个整合了R相关新闻、入门指南的网站,这个网站上目前有超过450篇博客。如果你对R有新的问题,在这里你可以找到很多的信息。此外,Stack Overflow(http://www.stackoverflow.com)是一个很好的问答网站,在这个网站中,使用标签rstat,可以找到很多关于R的问答。

最后,当你的R技能增长之后,你可能希望构建一个R包给别人使用。本书的内容并不包含如何构建R包,但是请记住,R语言的核心正是R社区由用户提交的丰富而广泛的包。

对于我们来说,很幸运的一点是,在大多数Mac OS X版本以及很多Linux的版本(包含最新的Ubuntu和Fedora都安装了Python 2.7或者最新版本)都已经预装了Python。因此,我们在这一步不需要做太多的事,只需要检查是否一切都已经安装好了。

对于本书而言,我们使用Python 2.7.x版本,而不使用Python 3版本。因此,如果你默认安装的是Python 3,那么你要确认你使用的是Python 2.7。

请确保你的网络连接正常,我们可能需要安装一些工具。

请执行以下步骤。

1.打开一个新的窗口,输入如下命令:which python

2.如果你已经安装了Python,那么你可能会看到如下内容:/usr/bin/python

3.接下来,查看你的Python版本python-version。在我的MacBook Air上,看到如下信息:Python 2.7.5

如果你打算使用OS X,那么你可能会因为以下几个原因,从而希望安装一个独立的Python版本。首先,每次苹果升级你的操作系统时,它会删掉你已经安装的Python包,这样你就必须重新安装你已经安装过的包。其次,Python的新版本发布频率会比苹果自身的更新频率要高。因此,如果你需要紧随着Python的更新而更新,那么最好安装自己独立的版本。最后,苹果的Python版本和Python官方的版本有一点不同,其在硬盘上的位置并不似官方Python那样有一个标准。

网上有很多指南可以帮助你在你的Mac上安装Python。我们推荐一个很棒的指南:http://docs.python-guide.org/en/latest/starting/install/osx/

Python现在有两个版本,这一点有点令人困惑。Python 3.0版本和2.5版本在本质上有差异。然而,因为Python在很多操作系统上被广泛使用,因此Python的基础架构准备逐渐向3.0版本迁移,迁移的过程会保留版本回滚的功能。从2.6版本开始,Python 2.x越来越像Python 3。最新的版本是Python 3.4,而且很多人期待到3.5版本Python会统一。不用担心Python 2.x和3.x之间的差异会对你的学习带来不便。尽管本书主要使用2.x版本,但是我们保证本书中的Python代码只需要稍作修改,就可以在2.x和3.x版本之间便捷地迁移。

在Windows下安装Python比较复杂,有三种选择。第一,你可以选择一个标准的Windows版本,然后从python.org(http://www.python.org/download/releases/)下载Python的可执行安装包进行安装。这种方式的潜在问题在于安装路径,有可能配置文件的路径和标准的Python安装路径不一致。很多Python包的安装都会遇到路径问题。此外,很多网上关于Python的教程都不适用于Windows,你需要自己填坑。我们看到很多学生在Windows上安装Python时遇到非常多的问题。除非你是专家,否则我不建议你这样做。

第二个选项是安装一个已经集成好所有科学、数值以及数据相关包的Python预装版本。目前有两个比较合适的预装版本,一家来自Enthought公司,另一家来自Continuum Analytics公司。Enthought提供了配适Windows 32位和64位的Canopy(华盖)版本。这个版本的免费版叫作Canopy Express,其中预装了50多个Python包,包含pandas、Numpy、SciPy、IPython和matplotlib。对于本书的内容来说,这些包已经足够了。Canopy Express还有一个自己的集成开发环境,类似于MATLAB或者RStudio。

Continuum Analytics提供的Anaconda,是一个完全免费的集成Python 2.6、2.7以及3.3版本,包含100多个包,这些包可以做科学计算、数学、工程、数据分析等。Anaconda包含Numpy、Scipy、pandas、Ipython、matplotlib和更多的包。对于本书而言,这些包绰绰有余。

第三个选项,也是最佳选项,就是在Windows上使用一个Linux的虚拟机。可以使用Oracle提供的免费的VirtualBox(https://www.virtualbox.org/wiki/Downloads)。这样你可以选择你喜欢的Linux版本来运行Python。这种方法的缺点是在虚拟机上的操作可能会有延迟,此外你还需要掌握Linux命令行的操作。当然,这也是一个数据科学家应该掌握的。

按照如下方法,使用VirtualBox安装Python。

1.从Oracle软件免费下载VirtualBox:https://www. virtualbox.org/wiki/Downloads

2.参考如下指导,在 Windows 下进行安装:https://www.virtualbox. org/manual/ ch01.html#intro-installing

3.安装好之后,完成指南中1.6开启VirtualBox和1.7 生成你的第一个虚拟机,以及1.8 运行你的虚拟机的部分。

4.当你的虚拟机开始运行,那么就参考在Linux和Mac OS X上安装Python那一章的内容进行Python的安装。

如果你想要安装Continuum Analytics的Anaconda版本,请参考如下步骤。

1.在如下链接下载64位或者32位的版本:http:// continuum.io/downloads

2.参考这份详尽的指南来进行安装:http://docs.continuum. io/anaconda/install.html

对很多读者而言,基于他们不同的经验,他们可以很轻松地选择安装虚拟机或者是安装一个预装的Python版本。然而,如果你对这个选择还有所困惑的话,那么请往下看。如果你之前只使用过Windows操作系统,也不太熟悉命令行操作,那么基于虚拟机的操作对你来说会是一个挑战,这也会极大地丰富你的技能。这需要很多的努力,但是对于成为一名数据科学家而言,是很有用的(请相信我们)。如果你有时间,也有相关的知识,那么最好所有的工作都在虚拟机上执行,这将帮助你更快地成为一名数据科学家,也会帮助你更快地在生产环境部署你的代码。如果你没有时间,或者没有相关知识,那么可以使用备选方案,安装Anaconda版本。很多人也是这样选择的。

在本书后续的内容中,我们往往会首先介绍基于Linux/Mac OS X的Python包的安装方法,其次才会介绍Anaconda的安装。因此,对于Windows用户,我们会假设你要么安装了虚拟机,要么安装了Anaconda版本。如果你选择了其他的环境,那么我们也很赞赏你探索未知的勇气并且祝你好运。Google会常伴你左右。

Python常常被称为“自带电池的”,其自带的包往往不能发挥这个语言在数据分析上的强大功能。在这一节,我们会安装一个被称为SciPy的“兵器库”,包括NumPy、SciPy、pandas、matplotlib和IPython。

我们假设你已经安装了标准的Python。

如果在前一节,你决定安装Anaconda版本(或者Python的其他自带所需库的版本),那么你可以忽略这部分。

为了检查特定的Python包是否被恰当地安装,请打开你的Python解释器,试着载入包。如果成功,则说明包已经成功安装在了你的机器上。为了实现这个操作,你可能需要通过sudo命令来获得机器的根访问权限。

  sudo port install py27-numpy py27-scipy py27-matplotlib py27-
  ipython +notebook py27-pandas py27-sympy py27-nose

以下步骤将帮助你在Linux操作系统中安装Python数据分析库。

1.首先你需要知道你使用的Linux版本。Linux的版本常常决定了你使用的包管理系统,可能包括apt-get、yum以及rpm。

2.打开浏览器,输入http://www.scipy.org/install.html ,这里包含适用于多数操作系统的安装方案。

3.打开shell。

4.如果你在使用Ubuntu或者Debian,则输入如下代码。

   sudo apt-get install build-essential python-dev python-
   setuptools python-numpy python-scipy python-matplotlib ipython
   ipython-notebook python-pandas python-sympy python-nose

5.如果你使用的是Fedora,则输入如下代码。

   sudo yum install numpy scipy python-matplotlib ipython python- 
   pandas sympy python-nose

在你的Macintosh上安装Python数据分析库,有多种选择。

上述方法都会花费一些时间,因为会有大量的文件被安装。

历史上,安装SciPy库曾经非常有挑战,因为安装过程非常繁复,甚至还需要Fortran。因此,我们不建议你自己从源代码进行编译,除非你自己乐于折腾这些内容。

现在,我们要问一个更恰当的问题:我们刚刚都安装了些什么?我们安装了NumPy、SciPy、matplotlib、Ipython、IPython Notebook、pandas、SymPy和nose的最新版本。这些包的描述如下。

在本章中,我们将更深入地讨论上述包。然而,如果我们不提Python IED,肯定会被人认为是玩忽职守的。简单来说,我们推荐在你最喜欢的写程序的文本编辑器中集成Python的IDE,比如来自GitHub的开源的Atom、sublime,或者Ruby程序员最爱的TextMate。Vim和Emacs也是非常棒的选择,因为它们除了功能强大之外,还可以很容易地在远程服务器上被使用(数据科学家经常使用这种工作方式)。这些编辑器都有很多插件,可以提供代码补全、高亮、缩进等功能。如果你一定要选择一个IDE,那么可以试试PyCharm(社区版本是免费的)。你会发现大多数Python IDE比处理数据更适合网页开发。

本书还需要一些其他的Python包。正如R有一个供社区提交构建包的仓库,Python也有一个类似的功能,以Python包指数(PyPI)的形式呈现。截至2014年8月28日,PyPI中包含48 054个包。

在这里,你只要连接到互联网即可。除非特别指出,否则这里的步骤都假设你使用的是操作系统默认的Python版本,而且不是Anaconda。

接下来的步骤将向你展示如何下载Python包,并用命令行进行安装。

1.下载包的源代码,可以将其下载到任何你喜欢的地方。

2.对包进行解压。

3.打开一个控制台。

4.到达源代码的路径。

5.输入如下命令:Python setup.py install

6.如果你需要根访问,输入如下命令:sudo python setup.py install

一种更便捷和简单的方法是使用pip安装。请按照如下步骤执行。

1.首先,检查你的管道是否已经安装好了,打开Python解释器,输入:>>>import pip

2.如果你发现没有错误,说明你的管道已经安装好了,那么你可以直接跳到第5步。如果你看到了报错,那么接下来我们快速地安装一下管道。

3.在你的机器上下载get-pip.py,下载地址:https://raw.github.com/pypa/pip/master/contrib/get-pip.py

4.打开Windows命令行,到达下载路径,输入:python get-pip.py或者sudo python get-pip.py

5.如果管道已经安装好了,那么请保证你现在在系统命令行的提示符下。

6.如果你使用系统默认的Python版本,请输入:pip install networkx或者sudo pip install networkx

7.如果你使用的是Anaconda版本,输入如下命令:conda install networkx

8.现在,让我们试着安装其他的包,比如ggplot,输入:pip install ggplot或者sudo pip install ggplot

安装Python包,你至少有两种不同的方法可选。比较古老的方法是,你下载包的源代码,在你自己的机器上拆包,然后运行带有安装标签的setup.py。如果你想,你也可以在文本编辑器中打开setup.py,看看这里的脚本到底在干什么。基于你当前环境的权限管理,你可能得需要sudo权限。

第二种方法是使用pip安装。这种方法会自动抓取远程库中的包,然后在你本机进行安装。如果这种方法可行,那么我们建议使用这种方法。

管道很有用,所以我们建议读者阅读其在线的指南。特别注意其中非常有用的功能pip freeze > requirements.txt,这个功能可以让你和你的同事交流外部相关的依赖。

最后,conda是管理Anaconda版本Python的管道的替代品。其官方网站的介绍中说道,“它是一个跨平台的Python包的管理器”。Conda的理念非常高端,超越了Python本身。如果你在使用Anaconda,我们强烈建议你继续深入研究conda可以做什么,并且学会使用它,用它代替管道来作为你的包的管理器。

virtualenv是一个变化了的Python工具。你一旦开始使用这个工具,你就会义无反顾地爱上它。virtualenv会生成一个本地的环境,它会在这个环境下安装其自带的Python版本。一旦从shell中激活这个环境,你就可以很方便地用pip install在本地安装包了。

首先,这听起来可能有点奇怪。为什么会有人想要这么做呢?因为这不仅可以帮助你处理涉及跨版本的Python包的依赖关系所带来的问题,而且可以让你能够在不破坏其他重要环节的前提下快速地试验。假设你建立了一个网页应用,用的是包awesom_template的0.8版本,但是你的新数据产品需要这个包的1.2版本。在这种情况下,你该怎么办?如果你使用virtualenv,你可以两者都用。

另外一个例子是,如果你在某台机器上没有管理员权限,那么你该怎么办?你没法用sudo pip install来安装包,因而没法进行数据分析。然而如果有virtualenv,则这些都不是事儿。

虚拟环境是软件开发者们高效协同的开发工具。环境可以保证软件在不同的机器上,以不同的依赖方式运行(比如生产或者开发服务器)。环境同时能够提醒其他开发者,这里有待开发的软件需求。Python的virtualenv保证了软件是在其历史环境中被创建的,可以独立测试、协同部署。

假设你已经完成了前面的步骤,那么现在你已经准备好了。

使用如下步骤,安装和测试虚拟环境。

1.打开一个shell的命令行,输入如下命令:pip install virtualenv或者sudo pip install virtualenv

2.安装完成后,输入virtualenv,则你将会看到如下截屏中的内容。

3.创建一个临时路径,用如下命令转变你当前的路径:mkdir temp cd temp

4.在这个路径下,创建你的第一个虚拟环境,命名为venv: virtualenv venv

5.你将会看到类似如下的文字:New python executable in venv/bin/ pythonInstalling setuptools, pip...done.

6.现在,新的本地的Python版本已经生成了。想要用它,只需要激活这个环境,使用如下代码:source ./venv/bin/activate

7.注意,活动的脚本无法直接执行,需要先用source命令激活。此外,注意你的shell命令提示符可能已经发生了变化,前缀变成了venv,这表明你现在正在虚拟环境下工作。

8.要验证这一点,使用which命令来看看Python的位置:which python你将看到如下输出:/path/to/your/temp/venv/bin/python

9.接下来,安装些什么:pip install flask Flask是一个微型网站框架,用Python写的。这个命令同时会安装很多Flask用到的包。

10.最后,我们验证一下虚拟环境和管道带来的版本控制的力量:pip freeze > requirements.txtcat requirements.txt输出应该如下:Flask==0.10.1 Jinja2==2.7.2 MarkupSafe== 0.19Werkzeug==0.9.4 itsdangerous==0.23 wsgiref==0.1.2

11.请注意,不仅仅包名被捕捉到了,包括包的版本也被捕捉到了。requirements.txt的优美之处在于,如果我们有了一个新的虚拟环境,我们只要简单地输入如下命令,就可以安装列出来的不同版本的Python包了:pip install -r requirements.txt

12.如果你要注销你的虚拟环境,你只需要输入命令:deactivate

virtualenv生成自己的虚拟环境,有自己独立的安装路径,并且可以不依赖操作系统环境进行独立的操作。如果你想试验新的库,使用virtualenv就可以避免污染你系统层面的Python版本。更棒的是,如果你有一个应用刚刚好可以工作,而且你希望就这样了,那么你可以使用virtualenv来让你的应用在它特有的虚拟环境下运行。

virtualenv是一个很不错的工具。对于任何一个Python程序员来说,它都是无价的。然而,我们还是要提醒诸位,为了提升程序性能,Python提供了很多工具来和C对象打通。因此,在你的虚拟环境下安装特定的Python包,比如NumPy和SciPy,需要安装和编译额外的依赖,这是由系统来指定的。比较顺利的时候,这些编译也是非常繁冗的。也就是说,维护一个虚拟环境是非常有必要的。更糟糕的是,如果某些依赖没有安装,那么编译就会失败,而且如同外星语言一般的报错信息,复杂的依赖链条会让你非常困扰。即便是有经验的数据科学家,也会对此产生畏惧。

一个简单的解决方案是,在系统环境下使用包管理器来安装复杂的库。这些工具使用第三方包的预编译格式。如果你在系统环境安装了这些Python包,那么当你初始化一个虚拟环境时,可以用--system-site-packages来做标记。这个标记告诉virtualenv来使用系统已经安装的包,并且设法避免对新增安装包的编译。要在你的环境下使用系统已经安装的包(比如,当你想要使用一个包的新版本),使用pit install -I,在虚拟环境下安装依赖,并且忽视全局的包。当你需要在系统上安装大规模的包,但是同时使用virtualenv来做其他类型开发时,这种技术是比较有效的。

本书剩余的部分,我们将假设你已经安装了virtualenv以及本章提到的工具。因此,我们不会太过强调或者纠结虚拟环境的细节。你只要知道,虚拟环境是一个你可以单独执行本书中所有示例的安全环境。


本章涵盖如下内容。

本书介绍的第一个项目是分析汽车燃料经济数据。我们首先用R对该数据集进行分析。R常常被称为数据科学通用语言,因为它是目前最流行的统计和数据分析语言。在本书前半部分的各个章节中,你将会看到R在数据处理、建模、可视化方面的过人之处,并开发一些有用的脚本,来完成你的分析工作。

本章的“食谱”大致涵盖数据科学管道中的如下步骤。

从流程上讲,数据科学管道是数据科学的骨架。为了精通数据科学,你需要通过应用多种工具和方法来实现这些流程,从而获取经验。这样,在有特定的数据集需要分析时,你将会知道哪些方法和工具是适合的。

本章的目的是引导你完成对于汽车燃料效率数据的分析。你将学到数据科学管道的这些步骤。未来其他项目将要进行数据分析时,你就可以应用这些步骤。将本章视为热身吧,更多的挑战将在后续章节展开。

每一个数据科学的项目都是从数据开始的,本章也并不例外。对于我们的例子而言,我们需要深入研究一个包含燃料效率的数据集,在这个数据集中燃料效率用每英里消耗的燃料加仑数(MPG)来度量。数据集中包含自 1984 年开始记录的美国汽车的相关测量数据。这份数据来自美国能源部和美国环保局。数据集中除了包含燃料效率,还有一些汽车的其他特征。我们可以使用这些特征来对数据做分组汇总统计,从而看到哪个组的汽车燃料利用效率更高,并且我们可以看到这些数据是如何随着时间变化的。这份数据集的最新版本可以在如下地址获取:http://www.fueleconomy.gov/feg/epadata/vehicles.csv.zip。关于这份数据集中各个变量的信息可以在如下地址得到:http://www.fueleconomy. gov/feg/ws/ index.shtml#vehicle。最新的数据是2013年12月4日更新的,本书中使用的数据是2013年12月8日从网站上下载的。

我们推荐你使用随本书代码一起提供的数据集,这样可以保证代码产出的结果和本书展示的一致。

为了完成本章的内容,首先你需要一台可以连接互联网的电脑,电脑上还需要安装一个文本编辑器。

按照如下步骤进行,获取本章后续部分所需的数据。

1.在http://www.fueleconomy.gov/feg/epadata/vehicles.csv.zip网站下载数据。

2.在电脑上用解压工具对vehicles.csv文件进行解压,然后把数据移动到你代码的目录下。

3.花一点时间,用微软的Excel或者Google的Spreadsheet或者某个简单的文本编辑器打开解压后的vehicles.csv文件。逗号分隔(csv)的文件是一种很容易处理的文件,这种文件可以用一些很基础而且免费的工具展示和处理。文件打开后,你可以先看看这份即将要处理的数据,找找感觉。

4.浏览网站http://www.fueleconomy.gov/feg/ws/index.shtml#vehicle

5.选择vehicle下面数据描述的部分,并将它们复制粘贴到你本地的一个文本文件中。不要包含emissions部分。把这份文件存在你的工作目录下,命名为varlabels.txt。这份文件的头5行如下。

   atvtype - type of alternative fuel or advanced technology
   vehicle
   barrels08 - annual petroleum consumption in barrels for
   fuelType1 (1)
   barrelsA08 - annual petroleum consumption in barrels for
   fuelType2 (1)
   charge120 - time to charge an electric vehicle in hours at
   120 V
   charge240 - time to charge an electric vehicle in hours at
   240 V

为了你的方便,这份文件已经包含在本章的代码库中。

一开始的这些部分,没有太多需要解释的。但是要注意的是,我们这里开始的相对比较简单。在一些数据科学项目中,你是无法如此容易地获取和观察数据的。

为完成后续的工作,你需要在电脑上安装一个R的环境(基础的R或者RStudio都可以,但是我们强烈建议你安装强大而免费的RStudio),并且已经在电脑里保存了汽车燃料效率的数据集。请确保你的电脑里已经包含上述本次分析所需要的所有内容。

我们需要连接到互联网,而且我们假设你的平台上已经安装了RStudio,安装的过程在前一章已经提供了。

如果你正在使用RStudio,只需执行以下三步。

1.打开RStudio。

2.在R的命令窗口,安装这个项目需要的R包:install.packages("plyr") install.packages("ggplot2")install.packages("reshape2")

3.载入这些R包:library(plyr) library(ggplot2) library(reshape2)

R的优点在于其社区以及该社区围绕R语言所开发的各种功能的包,这些包对于R社区的所有成员都是可以获取的。目前有4 000多个包,这些包可以令你的数据分析任务变得容易很多。

Hadley Wickham博士是R社区中非常有影响力的成员。他已经产出了一大批优质并且经常被使用的R包。在本章中,你会初步使用他的两大杀器:plyr以及ggplot2。此外,你还会使用第三个包:reshape2plyr用于对数据集进行分裂——合并的分析,本章稍后会解释它是怎么工作的。ggplot2会使复杂数据的可视化变得更容易。

依据前面的指导,你已经安装好了所需的所有原料,现在你可以把数据导入R中,并开始做一些初步的分析,从而对数据的情况有一个初步的感觉。

本章中用到的大多数分析是累加的,也就是说前一段分析的方法或者结论会用在后续的分析中。因此,如果你已经完成了前面的步骤,则你已经有了接下来分析所需要的所有东西。

以下几步会引导你将数据导入R中。

1.首先,将工作路径设定到本地保存了vehicles.csv的路径下:setwd("path")

将路径替换为你电脑中对应的实际文件路径。

2.我们可以直接从zip文件中载入数据,只要你知道zip中压缩的文件名:vehicles <- read.csv(unz("vehicles.csv.zip", "vehicles.csv"), stringsAs Factors = F)

3.为了检查数据是否已经载入,我们可以在R中展现头几行,使用如下代码:head(vehicles)你将会看到数据集的头几行打印在你的屏幕上。

我们也可以使用tail。这个命令将打印数据集的末尾几行,而不是头几行。

4.labels命令给数据集vehicles.csv文件夹的变量贴上标签。注意,labels是一个R的函数。我们可以看到这个数据集的变量名在文件中,并且使用-分割。所以我们读入这个文件时也要设定分隔符为-:labels <- read.table("varlabels.txt", sep = "-", header = FASLE)## Error: line 11 did not have 2 elements

5.居然有错!我们仔细检查一下报错信息,发现文件的第11行包含2个符号。而其他行则有3列。我们需要修改文件读取的方式,从而忽略连字符的影响:labels <- do.call(rbind, strsplit(readLines("varlabels.txt"), "-"))

6.我们用head命令来看数据读入是否奏效。

   head(labels)
        [,1]         [,2]
   [1,] "atvtype" "type of alternative fuel or advanced
   technology vehicle"
   [2,] "barrels08" "annual petroleum consumption in barrels for
   fuelType1 (1)"
   [3,] "barrelsA08" "annual petroleum consumption in barrels for
   fuelType2 (1)"
   [4,] "charge120" "time to charge an electric vehicle in hours
   at 120 V"
   [5,] "charge240" "time to charge an electric vehicle in hours
   at 240 V"

我们解析一下上面第五步相对复杂的语句。

首先,我们一行一行地读取文件里的内容。

x <- readLines("varlabels.txt")

每一行都是用字符“ -”分割。空格是非常重要的,这样我们就不会分割带有连字符的词语了(比如11行)。这使得每一行分裂为两部分,形成一个字符串向量,这些向量存在一个列表中。

y <- strsplit(x, " - ")

现在,我们把这些向量堆在一起,形成一个字符串矩阵,第一列是变量名,第二列是变量的描述。

labels <- do.call(rbind,y)

聪明的读者可能已经注意到read.csv函数的调用中包含参数stringAsFactors = F。R默认会将字符串转为因子。因子是R中定性变量的称呼,可以被认为对数据的标注或者标签。在R的内部,因子是存为整数的,每个整数映射到因子的一个水平。这项技术可以使得老版本R的存储成本降低。

一般而言,定性变量是没有顺序的。下面的代码,我们快速地造出一个例子,将一个有4个值的字符串类型的变量转变成因子,然后进行比较。

colors <- c('green', 'red', 'yellow', 'blue')
colors_factors <- factor(colors)
colors_factors
[1] green red yellow blue
Levels: blue green red yellow
colors_factors[1] > colors_factors[2]
[1] NA
Warning message:
In Ops.factor(colors_factors[1], colors_factors[2]) :
>not meaningful for factors

然而,也存在有顺序的分类变量,在统计学中也被称为序数。序数也是一种分类变量,除了其是有序的之外,和分类变量没有什么区别。分类变量的一个值可以说是大于另外一个值的,但是大多少就难以测量了。

此外,当我们将数据导入R时,我们经常会遇到某一列明明是数值型的,但是其中却夹杂着非数值的情况。在这种情况下,R可能会将这一列当作factor来导入,而导入之后的数据可能已经不是数据科学家原想的那样了。因子和字符之间的转变很平常,但是因子和数值之间的转变则非常诡异。

R可以导入很多类型的数据。在本章中,我们处理的是CSV文件,但是我们也可以直接导入微软Excel文件。CSV文件之所以被选择,是因为它对于任何操作系统都是可用的,而且更便携。此外,R还可以从其他流行的统计软件中导入数据,比如SPSS、Stata和SAS。

现在我们已经在R中导入了汽车燃料效率的数据集,还学习了一点数据导入的细微差异。接下来,将要对数据集进行一些初步分析。这种分析的目的是对数据进行探索,掌握一些R的基本命令。

如果我们已经完成了前面所有的步骤,那么现在我们应该已经有了所有需要的东西。那么继续吧。

接下来的步骤将引导我们进行分析,我们会对数据集计算一些基本的参数。

1.首先,我们看看数据集有多少行。

   nrow(vehicles) 
   ## 34287

2.接下来,我们看看共有多少变量。

   ncol(vehicles) 
   ## 74

3.现在,我们要看看数据集中各列的含义。我们使用name函数:

   > names(vehicles)

结果如下。

幸运的是,很多变量的名字本身就代表了变量的含义。请记住,这些变量更精确的含义描述可以在这里查到:http://www.fueleconomy.gov/feg/ws/index.shtml#vehicle

4.我们看看数据集中包含几年的数据,只需要计算year这一列的不同取值的向量,然后计算这个向量的长度即可。

   length(unique(vehicles[, "year"]))
   ## 31

5.现在,我们可以看到数据集中保存1的数据起始年份,使用maxmin函数。

   first_year <- min(vehicles[, "year"])
   ## 1984
   last_year <- max(vehicles[, "year"])
   ## 2014

注意取决于你下载数据集的时间,last_year的取值可能比2014更大。

6.此外,因为我们可能多次会使用year变量,因此,让我们保证我们有每一年的数据。从1984到2014的列表应该包含31个不同的值。为了测试这一点,我们使用如下命令。

   > length(unique(vehicles$year))
   [1] 31

7.接下来,让我们找出燃料类型都有哪些。

   table(vehicles$fuelType1)
   ##     Diesel      Electricity Midgrade Gasoline
   Natural Gas
   ##       1025        56       41
   57
   ##  Premium Gasoline  Regular Gasoline
   ##                  8521    24587

由此可以看到,大多数数据集中的汽车都使用普通的汽油,第二普遍的燃油类型是较高端的汽油。

8.让我们探索一下这些汽车使用的传动方式。首先,我们把缺失值用NA填补。

   vehicles$trany[vehicles$trany == ""] <- NA

9.现在,trany这一列是文本,我们仅仅关注车辆的传动方式是自动还是手动。因此,我们使用substr函数提取trany的值的前四个字符,然后确定这个是自动还是手动。我们生成一个新的变量:trany2。这个变量取值要么是手动,要么是自动。

   vehicles$trany2 <- ifelse(substr(vehicles$trany, 1, 4) ==
   "Auto", "Auto", "Manual")

10.最后,我们将这个新变量变成因子,然后使用table函数来看不同类型传动方式的记录各有多少。

    vehicles$trany <- as.factor(vehicles$trany)
    table(vehicles$trany2)
    ##    Auto Manual
    ##   22451  11825

我们可以看到自动挡的汽车数量大概是手动挡的两倍。

数据框是R所提供的非常有利的数据类型,本章中我会好好介绍它。数据框允许我们将不同类型的数据(数值型、字符型、逻辑型、因子等)组织在一起。比如用户信息,使用数据框,我们每一行可以保存用户的姓名(字符型)、年龄(数值型)、性别(因子),还有标签标注是否为当前的消费者(布尔型)。如果你很熟悉关系型数据库,那么你应该知道,这和数据库中的表很像。

更多地,我们学习了如何快速地浏览R中的数据。最明显的是,我们使用table函数来观察fuelType1这个变量不同取值所对应的记录数。这个函数其实还有很多其他用途,比如计算交叉列联表等。

with(vehicles, table(sCharger, year))

上面的代码给出的结果如下。

这里,我们看到带或者不带增压充电器的车的数量以及年份的关系(我们由此看到增压充电器似乎最近几年比过去更流行了)。

此外,注意我们使用了with命令。这个命令告诉R使用vehicles数据集作为接下来命令的默认数据集。在这个例子中,接下来将用table函数。因此,我们可以直接用变量sChargeryear,而不必再使用美元符号和数据框名称组合来引用了。

为了提供关于数据导入的一个有深意的故事,我们再仔细看看sChargertCharger。这两列表示这辆车是否包含涡轮增压机或者增压充电器。

我们先看看sCharger。我们看看这个变量的类型,以及都有哪些取值。

> class(vehicles$sCharger)
[1] "character"
> unique(vehicles$sCharger)
[1] ""  "S"

接下来,我们看看tCharger,我们期待结果一致。

> class(vehicles$tCharger)
[1] "logical"
> unique(vehicles$tCharger)
[1]   NA TRUE

然而,我们发现这两个看起来差不多的变量却是不同的数据类型。tCharger是一个逻辑型变量,也被称为布尔型变量。这种变量被用来记录真或假、是或否。而sCharger是字符型。这有时候是错误的。在这个例子中,因为我们可以,所以我们来检查一下原始数据。幸运的是,这个数据保存在一个csv文件中,我们可以使用文本编辑器打开读取它(我们推荐Windows的Notepad或者Unix系统的vi。当然,你可以用你自己喜欢的,比如文本编辑器之类)。当我们打开文件,可以看到sChargertCharger这两列所对应的行要么是空,要么是S或者T。

因此,R读取tCharger这一列的T时把它当作了布尔型变量的值TRUE。这不是一个致命的错误,可能并不一定影响分析。然而,这样的被忽略的程序漏洞可能在随后的分析中带来问题并导致大量的重复劳动。

目前为止,我们已经在R中导入了数据,并且通过一些重要的基本统计量对数据集有了一个初步的基本理解,比如数据集中包含哪些值,以及哪些特征会频繁地出现。在这里,我们将通过了解油耗参数与时间和其他数据点之间存在的关系来继续探索这个数据集。

如果之前的步骤都已经进行了,那么你已经有了接下来所需要的一切。

接下来将使用plyrggplot2来探索数据集。

1.首先,我们看看平均MPG是否随着时间有一个趋势上的变化。为此,我们使用plyr包的ddply函数来操作vehicles数据集,按年份整合,然后对每个组计算highway、city和combine的燃油效率。这个结果将赋值给一个新的数据框:mpgByYr。注意,这是我们的第一个分割-应用的例子。我们将数据框按照年份分割,然后使用均值函数到每一个变量上,再将组合的结果存在一个新的数据框中。

   mpgByYr <- ddply(vehicles, ~year, summarise, avgMPG =
   mean(comb08), avgHghy = mean(highway08), avgCity =
   mean(city08))

2.为了对新的数据框得到一个更好的理解,我们将它传入ggplot函数中,用散点图绘制avgMPGyear之间的关系。此外,我们还会标明我们需要的坐标轴的命名、图的标题,一级加上一个平滑的条件均值,geom_smooth()在图片上增加一个阴影的区域。

   ggplot(mpgByYr, aes(year, avgMPG)) + geom_point() +
   geom_smooth() + xlab("Year") + ylab("Average MPG") +
   ggtitle("All cars")
   ## geom_smooth: method="auto" and size of largest group is
   <1000, so using
   ## loess. Use 'method = x' to change the smoothing method.

上述代码会给你一个如下的图像。

3.基于这个可视化结果,我们或许能得出一个结论:近年来销售的汽车的燃油经济性有了显著的增长。然而,如下数据显示近年来混合动力和非燃油汽车的销量在增加,因此,上述结论还是有一定的误导性。

   table(vehicles$fuelType1)
   ##     Diesel        Electricity Midgrade Gasoline
   Natural Gas
   ##       1025        56                   41
   57
   ## Premium Gasoline Regular Gasoline
   ##      8521       24587

4.我们只看燃油汽车,虽然非燃油汽车数量并不多。为了做这个,我们使用subset函数来生成一个新的数据框:gasCars。这个数据框只包含fuelType1的取值为如下取值的记录。

   gasCars <- subset(vehicles, fuelType1 %in% c("Regular
   Gasoline", "Premium Gasoline", "Midgrade Gasoline") &
   fuelType2 == "" & atvType != "Hybrid")
   mpgByYr_Gas <- ddply(gasCars, ~year, summarise, avgMPG =
   mean(comb08))
   ggplot(mpgByYr_Gas, aes(year, avgMPG)) + geom_point() +
   geom_smooth() + xlab("Year") + ylab("Average MPG") +
   ggtitle("Gasoline cars")
   ## geom_smooth: method="auto" and size of largest group is
   <1000, so using
   ## loess. Use 'method = x' to change the smoothing method.

5.是否近年来大马力的车产量降低了?如果是这样,就可以解释这种增长。首先,我们要明确是否大功率的汽车燃油效率更低。我们注意变量displ,表示引擎的排量,单位为升。现在它还是字符串类型,我们需要把它变为数值型。

   typeof(gasCars$displ)
   ## "character"
   gasCars$displ <- as.numeric(gasCars$displ)
   ggplot(gasCars, aes(displ, comb08)) + geom_point() +
   geom_smooth()

   ## geom_smooth: method="auto" and size of largest group is
   >=1000, so using
   ## gam with formula: y ~ s(x, bs = "cs"). Use 'method = x' to
   change the
   ## smoothing method.
   ## Warning: Removed 2 rows containing missing values
   (stat_smooth).
   ## Warning: Removed 2 rows containing missing values
   (geom_point).

散点图让我们看到,引擎排量和燃油效率变量之间确实是负相关的,也就是说,小的车燃油效率会更高。

6.现在,让我们看看是否近年生产了更多的小车,这样就可以解释燃油效率最近有大幅的提升了。

   avgCarSize <- ddply(gasCars, ~year, summarise, avgDispl =
   mean(displ))
   ggplot(avgCarSize, aes(year, avgDispl)) + geom_point() +
   geom_smooth() + xlab("Year") + ylab("Average engine
   displacement (l)")

   ## geom_smooth: method="auto" and size of largest group is
   <1000, so using
   ## loess. Use 'method = x' to change the smoothing method.
   ## Warning: Removed 1 rows containing missing values
   (stat_smooth).
   ## Warning: Removed 1 rows containing missing values
   (geom_point).

7.从前图,我们可以看到平均的引擎排量在2008年之后有一个显著的下降。为了更好地看到这可能会影响到燃油效率的提升,我们逐年绘制出MPG和排量之间的关系。我们使用ddply函数,生成一个新的数据框byYear,包含每年的平均燃油效率和平均引擎排量。

   byYear <- ddply(gasCars, ~year, summarise, avgMPG =
   mean(comb08), avgDispl = mean(displ))
   > head(byYear)
     year   avgMPG avgDispl
   1 1984 19.12162 3.068449
   2 1985 19.39469       NA
   3 1986 19.32046 3.126514
   4 1987 19.16457 3.096474
   5 1988 19.36761 3.113558
   6 1989 19.14196 3.133393

8.head函数向我们展示了生成的新的数据框,这个数据框包含3列:yearavgMPG以及avgDispl。我们将要使用ggplot2包中分面的功能,在同一张图但是不同的面上来逐年显示平均油耗以及平均排量之间的关系。我们必须分解这个数据框,把一个宽的数据框变成一个长的数据框。

   byYear2 = melt(byYear, id = "year")
   levels(byYear2$variable) <- c("Average MPG", "Avg engine
   displacement")

   head(byYear2)
     year    variable    value
   1 1984 Average MPG 19.12162
   2 1985 Average MPG 19.39469
   3 1986 Average MPG 19.32046
   4 1987 Average MPG 19.16457
   5 1988 Average MPG 19.36761
   6 1989 Average MPG 19.14196

如果我们使用nrow函数,我们可以看到数据框byYear2有62行,而byYear只有31行。byYear中的两列(avgMPGavgDispl)现在溶解在byYear2的一列中(value)。

ggplot(byYear2, aes(year, value)) + geom_point() +
geom_smooth() + facet_wrap(~variable, ncol = 1, scales =
"free_y") + xlab("Year") + ylab("")
## geom_smooth: method="auto" and size of largest group is
<1000, so using
## loess. Use 'method = x' to change the smoothing method.
## geom_smooth: method="auto" and size of largest group is
<1000, so using
## loess. Use 'method = x' to change the smoothing method.
## Warning: Removed 1 rows containing missing values
(stat_smooth).
## Warning: Removed 1 rows containing missing values
(geom_point).

从这个图中,我们看到:

9.我们将这一趋势放到小排量的引擎上,来看看是否自动挡或者手动挡传动比四缸发动的油耗更加高效,以及油耗是如何随时间变化的。

   gasCars4 <- subset(gasCars, cylinders == "4")

   ggplot(gasCars4, aes(factor(year), comb08)) + geom_boxplot()
   + facet_wrap(~trany2, ncol = 1) + theme(axis.text.x = element_
   text(angle = 45)) + labs(x = "Year", y = "MPG")

这一次,ggplot2生成了一个箱线图。这个图帮助展示了每一年值的分布情况(而不只展示像均值这样的单一数值)。

10.接下来,我们来看看每一年手动挡的车的占比情况。

    ggplot(gasCars4, aes(factor(year), fill = factor(trany2))) +
    geom_bar(position = "fill") + labs(x = "Year", y = "Proportion
    of cars", fill = "Transmission") + theme(axis.text.x =
    element_text(angle = 45)) + geom_hline(yintercept = 0.5,
    linetype = 2)

在第9步,我们看到手动传动方式貌似比自动传动方式更有效,并且平均来看,从2008年开始,二者呈现出同样的增长。然而,这里有个很奇怪的事情。最近几年,自动传动的车中有一些非常高效(MPG小于40)的车,而同时,手动传动的车中几乎没有看到同样高效的。而在早几年,这个现象是反过来的。每一年手动挡的车的占比是否有变化?答案是肯定的。这些非常高效的车到底是什么?在下一节,我们将从数据集中探索这些车的制造商以及车的模式。

在这一步中,我们使用了两个非常重要的R包:plyr以及ggplot2,带读者对数据进行了比较详尽的分析。传统的软件开发已经设计了一些通用框架的分析模块,少部分模块正在集成进入数据科学的领域。这其中特别值得注意的是Hadley Wickham博士的分割-应用-合并模式。使用这种策略,我们可以对一个问题进行切割,变成多个小的问题,这些小问题往往更容易处理。当我们完成这种数据整理之后,我们就可以对新的分组的数据进行其他的分析和操作,最后将分析结果整合在一个新的数据结构中。正如你在这一步中所看到的,我们重复地使用这种分割-应用-整合的策略,从不同的角度审视数据。

除了plyr,在这一步我们也倚重ggplot2包。这个包也值得我们专门介绍。目前网上已经有很多针对ggplot2包的很不错的入门介绍,因此我们在这里不做过多介绍。重要的是,你需要理解ggplot2为什么能够让你生成一些非常复杂的统计的可视化,而生成的代码是如此精简。

ggplot2是基于Wilkinson、Anand和Grossman所设计的绘图语法的R的开源版本。这种语法将统计数据可视化进行解构,将数据可视化的过程解构为不同的模块,从而让我们能够更好地理解统计图形是如何绘制的。基于ggplot2,Hadley Wickham继承了这些想法,并且实现了一种分层绘制的方法。这种方法可以让用户非常便捷地使用不同的模块的组合来绘制复杂的可视化图形。比如本章我们绘制的第一幅图,我们绘制了每一年所有车型的平均燃油效率。

ggplot(mpgByYr, aes(year, avgMPG)) + geom_point() + geom_smooth() +
xlab("Year") + ylab("Average MPG") + ggtitle("All cars")

为了生成这个图形,首先告诉ggplot我们所要使用的数据框为mpgByYr,然后告诉ggplot2哪个变量会映射在图像中进行绘制。在本例中,aes(year, avgMPG)明确指定了年份被映射到横轴,平均MPG将映射到纵轴。Geompoint()告诉这个包,我们是通过点的方式绘制图形,而geomsmooth()则在图中加上一个阴影区域,来展示平滑的均值,并且加上一个置信度为0.95的置信区间。最后,xlab()ylab()以及ggtitle()函数在这幅图中加上标签、标题等。这样,我们就生成了一幅比较复杂并且品质相当不错、可以直接出版的图形,而所使用的代码只是寥寥数行。而ggplot2能做的远不止这些。

同样,你也需要注意ggplot2这种绘图语法并没有告诉你如何最佳地展现你的数据,这种语法只是提供了一种便捷的展现数据的工具。如果你对可视化感性,还想要更多的建议,那么我们强烈推荐你去看Edward Tufte的工作。他著有很多数据可视化方面的书籍,比如《定量信息的可视化呈现》(The Visual Display of Quantitative Information, Graphics Press USA)。此外,ggplot2并不能做动态的数据可视化。

基于上一节遗留的问题,我们继续对数据集进行更深入的分析。

如果你已经完成了前述的所有工作,那么你已经准备好了。

接下来我们将研究汽车的生产商和型号是如何随时间改变的。

1.让我们看看生产商和车型随时间的变化如何影响燃油的效率。首先,我们看看美国这些年不同的车型和生产商出现的频次,然后将注意力放在四缸发动的车上。

   carsMake <- ddply(gasCars4, ~year, summarise, numberOfMakes =
   length(unique(make)))

   ggplot(carsMake, aes(year, numberOfMakes)) + geom_point() +
   labs(x = "Year", y = "Number of available makes") + ggtitle("Four
   cylinder cars")

我们看到生产商数量有一个明显的下降,而在最近几年又有小幅上升。

2.我们可以看看每一年的生产商吗?我们发现,在这段时间内,每年只有12个制造四缸发动机汽车的制造商。

   uniqMakes <- dlply(gasCars4, ~year, function(x)
   unique(x$make))
   commonMakes <- Reduce(intersect, uniqMakes)
   commonMakes
   ##   [1] "Ford"  "Honda"   "Toyota"  "Volkswagen"
   "Chevrolet"
   ##   [6] "Chrysler" "Nissan"  "Dodge"   "Mazda"
   "Mitsubishi"
   ##  [11] "Subaru"  "Jeep"

3.这些制造商每年生产出来的汽车的燃油效率如何?我们看到大多数制造商的燃油效率在逐年提升,有一些制造商在最近5年在燃油效率上有一个飞速的提升。

   carsCommonMakes4 <- subset(gasCars4, make %in% commonMakes)
   avgMPG_commonMakes <- ddply(carsCommonMakes4, ~year + make,
   summarise, avgMPG = mean(comb08))

   ggplot(avgMPG_commonMakes, aes(year, avgMPG)) + geom_line() +
   facet_wrap(~make, nrow = 3)

在第二步,我们看到一个很有趣的魔法,只需要几行代码就做了很多的工作。这正是R在解决问题上的优美,这种优美表现在对复杂问题的精练表述上。然而,如果你不熟悉R强大的库,那么你可能会觉得R代码太过难以理解。

代码的第一行,我们使用dlply(注意,不是ddply)来操作gasCars4数据框,按照年来分割数据集,然后对每一块的make变量应用一个函数。对每一年,计算出独立的制造商列表,然后dlply返回每一年的列表。dlply输入一个数据框(data frame)返回一个列表(list),而ddply输入一个数据框(data frame)返回一个数据框(data frame)。

uniqMakes <- dlply(gasCars4, ~year, function(x) unique(x$make))
commonMakes <- Reduce(intersect, uniqMakes)
commonMakes

第二行代码更加有趣。使用Reduce函数来做更高阶的排序。这个Reduce函数和map reduce编程中的reduce过程的想法是一样的,而map reduce是Google提出的基于Hadoop的编程模式。从某种角度来讲,R是一个函数式编程语言,其核心包含一些高阶的函数。所谓高阶函数,是指其输入是其他的函数。在这行代码中,我们将intersect函数作为输入赋值给Reduce函数,这个函数将会对数据集uniqMakes的每一个元素求交集,而这个数据集是我们之前已经生成的每一年不同制造商的列表。最终,结果放在一个新的列表中,这个列表展现了每一年都会出现的制造商。

虽然代码只有短短的两行,但是解释它是如何工作的却花了两个段落。

本章最后一幅图展现了ggplot2非凡的分面绘图能力。代码中加入+ facet_wrap (~make, nrow = 3)告诉ggplot2我们想要对坐标系进行分割,将每一个制造商的数据绘制在一个子图上,展现在不同的行。这种数据可视化的技术很强大,使得我们可以将制造商本身作为变量来看不同制造商之间的模式差别。

在我们的第一个数据科学的项目里,我们保证事情是简单的。这个数据集本身很小——只有12 MB左右,易于存储,个人笔记本电脑就可以处理。我们使用R导入数据集,检查了数据集的一部分(而不是全部),对数据进行了汇总。之后我们对数据进行了探索,设置了很多问题,然后用两个关键的包plyr以及ggplot2来处理数据,对数据进行可视化。在这个数据科学项目中,最终的结果就是给出了我们对数据的总结,并用ggplot2对数据进行了可视化。


相关图书

精通 Power Query
精通 Power Query
机器学习与数据挖掘
机器学习与数据挖掘
Power BI 零售数据分析实战
Power BI 零售数据分析实战
数以达理:量化研发管理指南
数以达理:量化研发管理指南
精通Excel数据统计与分析
精通Excel数据统计与分析
科学知识图谱:工具、方法与应用
科学知识图谱:工具、方法与应用

相关文章

相关课程