版权声明
R和Ruby数据分析之旅
Copyright 2012 by O’Reilly Media, Inc.
Simplified Chinese Edition, jointly published by O’Reilly Media, Inc. and Posts & Telecom Press, 2013. Authorized translation of the English edition, 2013 O’Reilly Media, Inc., the owner of all rights to publish and sell the same.
All rights reserved including the rights of reproduction in whole or in part in any form.
本书中文简体版由O’Reilly Media, Inc.授权人民邮电出版社出版。未经出版者书面许可,对本书的任何部分不得以任何方式复制或抄袭。
版权所有,侵权必究。
内容提要
这是一本十分特别、充满趣味和奇思妙想的编程及数据分析的书籍。在作者的带领下,读者将学会使用Ruby和R这两个强有力的编程工具,对现实生活中的一些问题进行探索,尝试发现一些事物运行的模式、规律,通过数据的获取、建模和分析找出解决方案。
本书开篇分别对Ruby和R语言做了从零开始、简明扼要的介绍,包括安装、开发环境的使用、基本语法和重要特性。这为后面的探究工作打下坚实的基础。
探索之旅包括6个部分,其中包括处理办公室的卫生间安排问题,考查简单的市场经济体系的运行状况,挖掘特定用户的电子邮件行为模式,用音频和视频两种不同方法来测定自己的心率,模拟鸟儿结群飞行的场景,最后通过人工营造一个具备进食、生殖和进化特性的种群,来看其在现实世界中的一些影子。
阅读本书,读者不但能学到Ruby和R的基本知识和技巧,更能学会如何借助编程来对现实生活中的问题进行建模和模拟,特别是怎样对数据进行集成、处理和分析。相信读过本书之后,读者将有能力和意愿去开启自己的探索和发现之旅。
O'Reilly Media,Inc.介绍
关于作者
Sau Sheong Chang从事软件开发工作已超过17年,至今仍是一个激情四射的程序员。他主要开发网络应用程序,近来则涉足数据相关的和云相关的系统。他在Ruby编程领域已经活跃了6年,使用R语言也超过了1年。他在当地的开发者社区非常活跃,且在许多技术会议上发表过演讲,尤其是Ruby领域的会议。
他已经出版过两本书,一本是2008年的Ruby on Rails Mashup Project,另一本是2010年的Cloning Internet Applications with Ruby,两本书都由Packt Publishing出版。Sau Sheong Chang是新加坡惠普实验室的应用研究主管,专注于云计算、大规模数据和城市化。他以前曾在一家知名的网络游戏公司做过一段时间的首席技术官,也曾在Yahoo!东南亚做过一段工程主管。更多详细信息可以在www.saush.com/profile上找到。
封面介绍
本书封面上的动物是冠海豹,这是一种生活在北大西洋的有鳍哺乳动物。它的学名Cystophora cristata在希腊语中是“气囊携带者”的意思,这是因其4岁左右时会在雄性头上长出可充气膨胀的冠子而得名。这冠子被用于求偶,也可以用来威胁竞争对手或敌人——冠海豹是所有海豹中最具侵略性的种类之一。当处于未充气状态时,气囊会从前额垂到两眼之间。雄性冠海豹在一个鼻孔里还有第二个气囊,可以通过关闭另一个鼻孔的瓣膜来充气。
与雄性相比,雌性冠海豹外貌不那么有特色,个头也较小:它们差不多有2.1m长,200kg重,雄性则平均长2.4m,重约300kg。然而,雌雄两性都拥有银色的皮毛,其中夹杂着不规则的暗斑。与其他半水生的哺乳动物一样,它们拥有光滑的带爪的蹼,可以有效地在水中移动,而在陆地上就比较笨拙了。
冠海豹经常迁徙,它们会用整年的时间,独自穿越相当长的距离,以寻找食物。仅在深冬和夏季会回到繁殖地,前者是为了交配,后者则为了换毛。它们在水中猎食,能够下潜到61m深,并在水下停留将近1小时。它们的日常食谱根据所在地不同而变化,但通常包括鱼类、乌贼、虾类、章鱼和蚌类。
在出生后的前14个月里,冠海豹幼仔皮毛是蓝灰色,腹部则是苍白色,这使它们获得了“蓝背”的昵称。它们的哺乳期平均仅4天,在哺乳动物中是最短的。然而,在此期间,幼仔的体重几乎会增加一倍,每天增重达4.5~6.8kg——它们的母乳的脂肪比例高达60%~70%。
封面图片源自Riverside Natural History一书。
译者序
我曾经涉猎过数以百计的程序设计书籍,从Programming Ruby这样的语言经典,到《代码大全》这样的风格指南。但在接触本书之前,从未想到过编程书可以像这样别具一格、妙趣横生。我也曾做过多种不同类型的程序设计工作,从编程竞赛中的算法题,到大型的Web项目,抑或是电子游戏。但在接触本书之前,从未想到过程序设计可以像书中这样,用来对我们日常生活的方方面面进行探索。
当你遇到一层办公楼中卫生间的安排问题时,你可能想到用数学建模方法去解决。当你想要验证亚当·斯密的市场经济运行规律是否有效时,你可能会想到通过理论和事实进行推演。当你想要测定自己的心跳时,你可能会用手表加数数的方法,或是求助于精密的电子仪器。但你是否想过,这些问题可以通过简单的编程工作,得到相当有效的解决?本书的作者将带领你借助Ruby和R这两种流行的、强大的(而且是免费的)编程语言,开启一段激动人心的探索之旅,寻求诸如前述的、不同领域问题的答案,并发现其中的规律和模式。在阅读和实践书中所讲的内容时,你不仅仅是一名程序员,更像是一位探险家(作者本人在引言中也如是说),向看似平淡无奇的,却充满未知的世界发起挑战!
作为读者,你不需要有过任何的编程经验,作者将带你从头开始学习Ruby和R语言的基本知识和特性。尽管由于篇幅所限,本书不能涵盖两种语言的一切内容(要完成这一任务,本书篇幅再翻几倍也不见得够),但已经足够你了解它们的精华所在。而在后面的探索之旅中,你更会学到从发现问题、建模、模拟,到收集和处理数据、分析结果、得出结论这一整套的研究事物的方法。你将学会用不同的视角来看待世界,并发现其中的规律和乐趣,成为一名名副其实的探索者。
非常高兴能与我的好朋友刘熙合作,承担本书的翻译工作。特别是有幸将这样一本精彩的书籍作为我的首本译著,实在是激动人心。这里要对原作者Sau Sheong Chang博士表达深深的敬意,并对给予我们这一美妙工作机会的人民邮电出版社,特别是责任编辑杨海玲女士,表示诚挚的感谢。
由于水平所限,译文中如有疏漏及不足之处,还请不吝批评指正。欢迎随时联系我们,我的邮箱:MerryMoney88@gmail.com。
真的很怀念对照着iPad上的电子版原著,在我相伴多年的HP(恰好是作者就职的公司)笔记本上一句句敲打和改订译文的那些日日夜夜。
钱昊
2012年11月8日于海淀朱房
译者简介
钱昊 毕业于北京大学计算机系,从小热爱程序设计,熟悉多种编程语言,曾有过使用Ruby进行大型Web项目开发的经验,并对翻译工作有着浓厚的兴趣。
刘熙 在北京大学元培学院完成本科学习后,又进入北京大学工学院攻读硕士学位,同时在微软Bing部门工作,主攻数据挖掘方向,已有过两本译著。
两人从小学奥数班就相识,一路同学到中学、大学,志趣相投。本书的翻译堪称两人一次重要而难忘的合作经历。
本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。
前言
嗨!探险家们!
要用一些大无畏的探险家——比如斐迪南·麦哲伦(Ferdinand Magellan)、詹姆斯·库克(James Cook)、罗尔德·阿蒙森(Roald Amundsen)——和我这样的人比较,是一件挺困难的事。这些探险家乘风破浪,披荆斩棘,直面未知的险境,去发现新的世界(至少对他们当时所处的文明来讲算“新”)。而迄今为止,我运动方面最大的成就大概就是完成了10公里的慈善短程马拉松——而且是用走的。
过去的那些探索者在发现了未知的地区、宣示所有权的时候,可真是风光。克里斯托弗·哥伦布(Christopher Columbus)只需要从欧洲一直向西航行,就能发现两块完整的大陆。可我们今天的选择就少多了。地球上已经没有多少未被发现的大陆板块了,即使是海洋中最深的地方——马里亚纳海沟,也已经被人征服了。
但是,我的确也是一位探险家,而且将要阅读这本书的你也是。尽管已知的现实世界已经被人征服得差不多了(见图0-1),未知的世界却依然傲视着我们。
我们大家生来都具有一种为这身边的世界感到吃惊而诧异的感觉。但是,随着我们渐渐成长,渐渐厌倦,很多人失去了这种感觉。我认为,这其中的部分原因是,我们其实对周遭的世界理解得还不够,因此也就漠不关心。按一下遥控器,电视机就开了——这是怎么做到的呢?当我们第一次提这样的问题时,很可能会招来白眼,或是闪一边儿去的手势。只要能看到下一季的《美国偶像》,谁在乎这种问题呢?于是别人的这种反应也就很快变成了我们自己的反应。
那么,在这本书里,我将带你走过蜿蜒的路途,找回那个原始而本真的你。我们会再次发现魔力的存在。在全书结束的时候,很有可能你将从我们停下的地方继续进发,继续探索你自己的征程。
数据,数据,遍地都是数据
在我们生命的每一分每一秒,我们都深陷于数据的泥沼之中。我这话并不是隐喻,也绝非在单纯地夸大大数据的存在。
其实,我们周遭的数据极其之多,我们的眼睛已经进化得能够在每毫秒这么短的时间内切断一会儿与环境的联系。在一种称作“扫视掩蔽”的现象中,随着眼球的快速转动(即扫视),大脑会暂停一会儿,以消除投射到视网膜上的模糊图像。模糊图像的用处不太大,所以大脑就丢弃它们,使我们在扫视时有效地失明(我们自己意识不到)。
我们今天处理数据的方式和这种扫视掩蔽效应有很多相似之处。数据来得实在太快太频繁,我们常常将它们屏蔽掉。周围有很多数据可以供我们提取并分析,找出问题的答案,但问题就在于,应该怎么做到。
在(遥远的)过去,拥有利用数据与学识来破解秘密的技巧的总是那些天才,只有运气好的极少数人才有机会偶然发现答案。现在再也不是这样了。尽管智力仍然是一个先决条件,但由于计算机和程序设计的出现,如今,在提炼信息的道路上,我们可以从无聊、烦琐、重复性的数据处理中脱离出来了。
只是,我们还并没有做到。
无论如何,至少对于大多数人来说,的确没有。只有科学家和数学家们例外,他们早就紧紧掌握了能使他们更高效地工作的工具。如果你是来自上述这两大人群,那你可能已经充分利用了计算机的威力。
可是,对于程序员和其他很多人来说,他们最开始编写计算机程序只不过是为了给业务提供工具,或者是辅助改善业务流程。所有这些,都是为了利用计算机来降低成本,增加收入,提高效率。在很多职业程序员看来,编程只是个差使,枯燥乏味,不用动脑,养家糊口而已。我们其实已经忘记,在探索发现中,计算机的前景多么广阔,程序设计的威力多么强大。
探索世界
这本书正是为了要试图找回发现的美妙和神奇。我希望这本书能够揭示一些你之前不知道或不了解的事情。我还希望它能够帮助你,通过我们每天触手可及的世界去发现新大陆。最后,我更希望,你能够通过它获取探索的能力,用程序设计和数据分析去发现新鲜事物。
尽管在这本书里,我们所要探索的仍是现实世界,但更多情况下并不是这样。要在位和字节之间探索整个世界有点困难。因此,如果我们无法探索我们所生存的这个世界,那我们就要尝试其他的——换言之,我们要使用模拟(simulation)。
模拟是用来探索我们无法控制的事物的一种好办法。我们每时每刻都在做着模拟。在我们小的时候,我们自己总是创造出假想的世界并且活在其中。借由此,我们也能够更好地去理解现实世界。我们至今仍然在做着模拟,通过神奇的电视(尤其是电视连续剧)和电影——我们会把荧幕上的角色视作真实的。且不论是好是坏,至少像电视机这样的模拟手段的确影响了我们的现实生活,甚至还会影响我们的梦境。例如,由美国心理学会所开展的一项调查显示,60多岁的人中(在彩色电视机尚未流行的年代成长起来),约20%会回想起他们做过的梦是鲜亮生动的。而30岁以下的人中,有80%确信他们的梦境是彩色的1。
在这本书里,我们会通过模拟来创建实验,分离变量,并提出假设来解释实验结果。对于我所描述的实验,或者我所提出的假设,你可能同意,也可能反对,但这些都不重要。通过我们共同走过的这段旅程,我真正希望你获得的,是能认识到,编程所能够解决的远远不止商业活动而已。我希望能够达到的是,你最终可以设计出你自己的实验,实现它们,并发现你自己的新世界。
收拾行囊
我们将通过程序设计和数据分析来进行这场宏伟的探险。那么,你需要准备些什么呢?当然要准备些工具了,这也正是接下来两章的主题。可用的工具并不仅有这些,但在这本书中我们只用这些。
我们要用到的这两种工具就是Ruby和R。我之所以选择它们,是有着特定的目的的。一方面,Ruby很好学,也很好读,特别适合用易读的代码来解释一些概念。我会用Ruby来进行模拟和预处理,得到数据。另一方面,R则见长于分析数据,以及生成可视化的图表。
尽管要欣赏这本书的话,你并不需要一定会使用Ruby和R进行编程,但我会假定你具备一些对编程的基本理解。具体地说,我会假定你修过计算机科学或相关方面的课程,或者是使用过任何一种编程语言进行过一些简单的程序设计。
在这两章之后,其他每一章都或多或少是相对独立的。每一章都会就一个思想开展探索,从对现存问题的理解开始,接下来尝试去回答它,通过模拟或一些处理来获取数据,然后就要分析数据,并基于分析得出一些结论。
要探索的思想来自于不同的领域,从经济学到进化论,从医疗保健到工作环境设计(具体场景是找出办公室卫生间的合理数量)。某些思想显得很宏大,而某些思想则非常私人化。之所以选择如此多元的思想,正是为了展示,对探索可能性的限制其实只来自于我们自己创造力的贫乏。
每一章在一开始的时候都显得规模不大,但我们会逐层地增加复杂性,以将其核心的思想具体化。实验会围绕着基本思想进行,而最终所得出的假设、结论和结果都具有一定的偶然性。比如,对于我的结论和对结果的阐释,你可能同意或者反对。但就这本书而言,探索的过程要比结果更为重要。
一切就绪,让我们就此出发!祝愿你愉快地体验接下来的两章,并享受之后的探索——勇敢地探索吧!
本书的排版约定
本书使用如下排版约定。
- 楷体:用以表示新术语。
- 等宽代码字体:用于程序清单,以及段落中引用的程序元素,如变量或函数名、数据库、数据类型、环境变量、语句和关键字。
- 加粗的等宽代码字体:展示命令或其他应该由用户输入的文本,也用于代码清单中强调的部分。
- 斜的等宽代码字体:展示应该用用户所提供的值或根据上下文确定的值来替换的文本。
这个图标表示一个提示、建议或者一般的注记。
这个图标表示一个警告或警示。
代码示例的使用
本书的目标是帮助你完成工作。一般而言,你可以在自己的程序和文档中使用本书中的代码,如果你要复制的不是核心代码,则无须取得我们的许可。例如,你可以在程序中使用本书中的多个代码块,无须获取我们许可。但是,要销售或分发来源于O’Reilly图书中的示例的光盘则需要取得我们的许可。通过引用本书中的示例代码来回答问题时,不需要事先获得我们的许可。但是,如果你的产品文档中融合了本书中的大量示例代码,则需要取得我们的许可。
在引用本书中的代码示例时,如果能列出本书的属性信息是最好不过了。属性信息通常包括书名、作者、出版社和ISBN。例如:“Exploring Everyday Things with R and Ruby by Sau Sheong Chang (O’Reilly). Copyright 2012 Sau Sheong Chang, 978-1-449-31515-3.”
在使用书中的代码时,如果不确定是否属于合理使用,或是否超出了我们的许可,请通过permissions@oreilly.com与我们联系。
我们的联系方式
如果你想就本书发表评论或有任何疑问,敬请联系出版社。
美国:
O’Reilly Media Inc.
1005 Gravenstein Highway North
Sebastopol, CA 95472
中国:
北京市西城区西直门南大街2号成铭大厦C座807室(100035)
奥莱利技术咨询(北京)有限公司
我们还为本书建立了一个网页,其中包含了勘误表、示例和其他额外的信息。你可以通过如下地址访问该网页:
http://oreil.ly/everyday-things-r-ruby
关于本书的技术性问题或建议,请发邮件到:
bookquestions@oreilly.com
欢迎登录我们的网站(http://www.oreilly.com),查看更多我们的书籍、课程、会议和最新动态等信息。
我们的其他联系方式如下。
Facebook:http://facebook.com/oreilly
Twitter:http://twitter.com/oreillymedia
YouTube:http://www.youtube.com/oreillymedia
致谢
在这部分里,我要感谢所有帮助过我的人,正是因为有了他们的帮助才使我能够创作出你现在手里捧着的这本书。多年来我了解到,写书绝不是一项仅靠作者就能够完成的工作,而需要作者、专业的团队、一批审阅人和支持者共同协作。我想感谢以下所有人,排名不分先后。
- 感谢Mike Hendrickson能够接受这样一本与众不同的程序设计图书。我最初递交撰写这本书的计划书时,其实只是误打误撞,没有想到竟然真的会被接受。
- 感谢Andy Oram如此耐心地对待一位初次与O’Reilly合作的作者,他安排了一次次的Skype通话,跨越了半个地球。他每周二都早早地起床与我通话交流。
- 感谢Kristen Borg、Rachel Monaghan和整个编辑团队,他们为这本书做出了极其专业、了不起的工作。
- 感谢Jeremy Leipzig、Ivan Tan、Patrick Haller和Judith Myerson,他们帮助审阅了这本书,提出了非常好的建议。尤其是Patrick Haller,我在邮件里跟他纠缠不休地讨论他对我的R脚本所提出的建议。谢谢你,Patrick!
- 感谢Rully Santosa、Chen Way Yen、Ng Tze Yang、Kelvin Teh、George Goh和其他所有惠普实验室新加坡应用研究团队的同仁。他们给我提供了无数的建议,和他们的讨论激发了我无数的新思想。尤其要感谢Rully、Way Yen和George对第6章的反馈!
- 感谢Ruby社区,尤其是Singapore Ruby Brigade,我在其中遇到很多好朋友,我们在利用Ruby探索世界方面都有着共同的兴趣。这是个非常棒的社区,我非常喜欢高效人士Andy Croll组织的年度RedDotRuby大会。
最后,我想把这本书献给我的家人,无论我做什么,他们都是我的灵感和动力之源。谢谢我的爱妻Wooi Ying再一次(已经是第三次了)地耐心对待我的工作,感谢她理解我为什么想要搞懂所有事物。谢谢我将满十岁的儿子Kai Wen,我希望这本书能够激励你成为一名眼界开阔的探险家,正如我自己的一生一样。
1 Okada, Hitoshi, Kazuo Mastsuoka, and Takao Hatakeyama, “Life Span Differences in Color Dreaming”, Dreaming 21, no 3.(2011), 213-220.
本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。
目录
第1章 握住探险之鞭——认识Ruby
1.1 Ruby
1.2 Shoes
1.3 小结
第2章 走进《黑客帝国》—认识R
第3章 探讨办公室与卫生间问题
第4章 当一回经济学家
第5章 对自己的电子邮件进行挖掘
第6章 测一测我们的心脏
第7章 模拟结群飞行的鸟
第8章 是什么让世界运行不止