R语言:优雅、卓越的统计分析及绘图环境
文 / 刘思喆
历史
R语言由新西兰奥克兰大学的Ross Ihaka和Robert Gentleman两人共同发明,其词法和语法分别源自Scheme和S语言,一般认为R语言是S语言【注:John Chambers,贝尔实验室,1972】的一种方言。
R是“GNU S”,一个能够自由有效地用于统计计算和绘图的语言和环境,它提供了广泛的统计分析和绘图技术,包括线性和非线性模型、统计检验、时间序列、分类、聚类等方法。我们更倾向于认为R是一个环境,在R环境里实现了很多经典的、现代的统计技术。
1992年,Ross Ihaka(图左)和Robert Gentleman(图右)在奥克兰大学成为同事。后来为了方便教授初等统计课程,二人开发了一种语言;而他们名字的首字母都是R,于是R便成为这门语言的名称。
作为R语言的前身——S语言的代码几乎不需要进行任何修改即可在R语言环境下运行,从这个角度讲两种语言几乎等价。S语言诞生于20世纪70年代由John M. Chambers领导的贝尔实验室统计研究部。它的诞生过程几乎就是现代统计分析方式的演化历程的写照【注:谢益辉,郑冰(2008). R语言的历史背景、发展历程和现状. 1st China R Conference.】。
- 1975-1976年,贝尔实验室统计研究部使用一套文档齐全的Fortran库做统计研究,简称为SCS(Statistical Computing Subroutines)。
- 当时的商业统计软件采用的是批处理方式,一次性输出问题的所有相关信息【注:令人感叹的是,现代商业统计软件依然一成不变地遵循这种低效率的数据分析模式】,在那个时代,这个过程需要几个小时,并且商业软件的程序不能做任何修改。而贝尔实验室的统计学家们需要灵活的交互式数据分析方式,因此SCS在贝尔实验室非常受欢迎。
- 但统计学家们发现使用SCS做统计分析时需要大量的Fortran编程,花在编程上的时间与取得的分析效果相比有些得不偿失。慢慢地,大家达成了一个共识——统计分析不应该需要编写Fortran程序。
- 于是,为了同SCS进行交互,一套完整的高级语言系统——S诞生了。
- S语言的理念,用它的发明者John Chambers的话说就是“to turn ideas into software,quickly and faithfully(快速、准确地把想法转化成软件)”。
1993年,S语言的许可证被MathSoft公司买断,S-PLUS成为其公司的主打数据分析产品。由于S-PLUS继承了S语言的优秀血统,所以被世界各国的统计学家广泛使用。但好景不长,1997年R语言正式成为GNU项目,大量优秀统计学家加入到R语言开发的行列。随着R语言的功能逐渐强大,S-PLUS的用户渐渐地转到了同承一脉的R语言。S语言的发明人之一——John M. Chambers最后也成为R语言的核心团队成员。S-PLUS这款优秀的软件也几经易手,最后花落TIBCO公司,当然,这是后话。
John M. Chambers老爷子一直不遗余力地致力于R语言的发展,至今仍然是活跃的R语言开发者。在2009年第一期《R Journal》上,John M. Chambers是这样定义R语言的:
- an interface to computational procedures of many kinds(各类计算过程的接口);
- interactive, hands-on in real time(具有可交互性,可以实时手动操作);
- functional in its model of programming(函数式编程模式);
- object-oriented,“everythingisanobject”(面向对象,“所有东西都是对象”);
- modular,built from standardized pieces(模块化,由标准化块构建);
- collaborative,aworld-wide,open-source effort(协作性,全球范围的开源力量)。
当然,R语言的这些特点很难在一篇短文里细致地体现出来。下面我将简要描述一下R语言的现状和未来。
现状及应用
R语言在国际和国内的发展差异非常大,国际上R语言已然是专业数据分析领域的标准,但在国内依旧任重而道远,这固然有数据学科地位不高的原因,国人版权概念薄弱以及学术领域相对闭塞的原因也不容忽视。R语言之所以能够被广大的数据分析工作者接受,这其中有诸多原因。
优势及特点
从R语言的发展历史上看,R主要是统计学家为解决数据分析领域的问题而开发的语言,因此R具有一些独特的优势。
- 统计学家和前沿算法(3400+ 扩展包)。
- 开放的源代码(自由且免费),可以部署在任何操作系统,例如Windows、Linux、Mac OS X、BSD、Unix。
- 强大的社区支持。
- 高质量、广泛的统计分析、数据挖掘平台。
- 重复性的分析工作(Sweave = R + LaTeX),借助R语言的强大分析能力+LaTeX完美的排版能力,可以自动生成分析报告。
- 方便的扩展性。
–可通过相应接口连接数据库,例如Oracle、DB2、MySQL。
– 同Python、Java、C、C++等语言进行互调。
–提供API接口均可以调用,例如Google、Twitter、Weibo。
–其他统计软件大部分均可调用R,例如SAS、SPSS、Statistica等。
–甚至一些比较直接的商业应用,例如Oracle R Enterprise、R add-on for Teradata、Sybase RAP等。
荣誉
R语言拥有这么多优势,很大部分原因在于它同样继承了S语言的优秀血统。S语言在1998年被美国计算机协会(ACM)授予了软件系统奖,这是迄今为止众多统计软件中“唯一”被ACM授奖的统计系统。
当时ACM是这样评价S语言的:
- 永久地改变了人们分析、可视化、处理数据的方式;
- 是一个优雅的、被广泛接受的、不朽的软件系统。
我们也可以查询到历年ACM授予软件系统奖的列表,这些优秀的软件系统与我们的生活息息相关:
1983年,Unix
1986年,TeX
1989年,PostScript
1991年,TCP/IP
1995年,World-Wid-Web
1997年,Tcl/Tk
1998年,S
1999年,The Apache Group
2002年,Java
2009年,《纽约时报》发表了题为 “Data Analysts Captivated by R’s Power”的社评,集中讨论了R语言在数据分析领域的发展,并引发了SAS和R用户广泛而激烈的争论。期间,辉瑞公司(Pfizer)非临床数据部的副总监Max Kuhn提到:
- R已成为人们走出学校后必修的第二门外语,并且在R中有太多令人惊奇的代码;
- 可以看看SAS的讨论列表,讨论量下降了很多。接下来的2010年,美国统计协会(American Statistical Association)将第一届 “统计计算及图形奖” 授予R语言,用于表彰其在统计应用和统计研究广泛的影响。
社团及活动
正如前文John M. Chambers所说,R也是一个社区,其线下活动非常活跃。在国际上,欧洲和美国每年会轮值举办一次“useR!”会议,届时来自世界各地的R用户齐聚一堂,讨论R语言的应用与科研方面的成果。
出于对统计计算的特殊考虑,每两年还会举办一次DSC会议(Directions in Statistical Computing),专门讨论R在统计计算方面的应用及理论研究。各大城市也会有相应的RGroup,方便本地的R用户聚会及交流。
在国内,每年会以统计之都【注:Capital of Statistics,是一个致力于传播统计学知识并将其应用于实际领域的网站,成立于2006年,宗旨是中国统计学门户网站、免费统计学服务平台】牵头,在北京和上海举办两次中国R语言会议,至2011年已在中国人民大学、华东师范大学等高校举办了四届R语言会议,历年的演讲主题涉及医药、金融、地理信息、统计图形、数据挖掘、制药、高性能计算、社会学、生物信息学、互联网等多个领域。从2012年起,台北将成为第三个举办中国R语言会议的城市——2012年6月的中华R语言会议台北场已经在筹划当中。
业界的认可
KDnuggets网站每年都会做一些数据分析、数据挖掘方面的专题问卷调查,在2011年8月的数据挖掘领域语言流行度的调查中,R语言位居数据挖掘领域所有语言之首(如下图所示),而紧随其后的SQL、Python、Java则在某一领域具有各自独到的优势。在数据挖掘范畴下,R语言同这些语言相互补足、相得益彰。
根据互联网搜索结果计算的TIOBE编程社区指数(Programming Community Index)【注:TIOBE (2011). http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html.】可能更能代表编程语言的流行度。在2011年12月份排名中,R语言依旧是统计领域中最为流行的语言,位列第24(Ratings 0.522%),而时常被放在一起比较的SAS则排名第31(0.417%)。
虽然KDnuggets网站的调查存在样本有偏的嫌疑,但毕竟代表了某一类人群的偏好,并且排名前五位的语言在各自的领域确有代表性。(数据来源 http://www.kdnuggets.com/2011/08/poll-languages-for-data-mining-analytics.html)
挑战和未来
虽然R语言有诸多优势,但它并不是万能的——它毕竟是统计编程类语言。受到其算法架构的通用性以及速度性能方面的影响,因此其初始设计完全基于单线程和纯粹的内存计算。虽然一般情况下无关R的使用,但在当今大数据条件下,这两个设计思路的劣势逐渐变得愈加刺眼。好在R的一些优秀的扩展性包解决了上述问题,例如:
- snow支持MPI、PVM、nws、Socket通信,解决单线程和内存限制;
- multicore适合大规模计算环境,主要解决单线程问题;
- parallel R 2.14.0版本增加的标准包,整合了snow和multicore功能;
- R + Hadoop在Hadoop集群上运行R代码;
- RHIPE提供了更友好的R代码运行环境,解决单线程和内存限制;
- Segue利用Amazon’s Web Services(EC2)。
这里需要着重提一下parallel包,该包是R核心团队为了解决大数据计算问题而在标准安装程序下新增的功能包
一些误区
很多人认为R语言是GNU开源项目软件,因此软件的使用是“没有任何保证”的。但在美国,R的计算结果被FDA(Food and Drug Administration) 所承认;并且有报告指出与其他商业软件相比,R的Bug数量非常少【注:UCLA (2006). R relative to statistical packages. Technical report, UCLA.】。
R开发的核心团队对于R的新功能持异常谨慎的态度,比如cairographics从2007年开始酝酿,直到上一个大版本(2011年)才引入到R标准安装程序;byte-compile功能更是经历了从1999-2011年近12年的孵化【注:Ripley,B. (2011). The r development process. Technical report,Department of Statistics,University of Oxford.】。从这个角度讲,R语言的代码质量以及运算结果的可信性是完全可以保证的。
当然,这里所说的是R的标准安装程序包,并不代表所有扩展包的质量。毕竟3400+的扩展包质量良莠不齐,虽然不乏一些优秀的包(如Rcpp、RODBC、VGAM、rattle),但必然存在一些扩展包质量不佳的情况。
应用的思考
R语言并不是人人都能接触到的语言,相对要小众很多,有些人即便接触到没准也搞不清楚R到底有什么用途。对于走上这条路的人,经常会有一些应用困难,比如从个人学习角度而言。
- 虽然R语言的设计之初就是避免通过大量编程实现统计算法,但最基本的编程能力还是需要的,因此对于一般非计算机专业的工作者来说无疑提高了难度。
- 还有很多人提到,R语言的学习曲线非常陡峭。但从我多年的使用经验上看,陡峭的学习曲线并不是因为R语言本身,而是隐藏在后面的统计知识很难在短时间内掌握的缘故。
从公司商业应用的角度而言,也存在一些不可回避的问题。
- 首先是人力资源成本如何核算。
- 软件成本问题,由于R是自由软件,可以随时随地下载,因此对于企业来说如何度量成本是一个问题。
- R的技能核定并没有官方或机构标准,简历上“熟练使用R语言”可能没有任何意义。
- 实际上,即便没有上述两个问题,企业想招到R相关的人才也不那么简单。
- 对于大量工作已由其他软件实现(比如用SAS)的公司来讲,转化成本很高。
- 技术支持获取的问题。
结语
R语言虽然诞生于统计社区,服务于数据,但现在随着数据渗透到各行各业,R语言已经远远超过统计范畴,相信不久的将来会有更多的朋友加入到R语言社区。
作者刘思喆,神州数码思特奇首席数据挖掘专家。9年R语言使用经验,《153分钟学会R》作者。