写
在前面
首先,咳咳,还是日常的开篇抱歉:由于最近大猫沉迷于Ingress无法自拔,所以原定于本期的data.table教程延后一期,咱们继续上次的系列《SAS or R:谁更适合你》,大猫来和小伙伴聊聊“开源”这件事。
SAS和R可谓在统计软件领域非开源与开源的两大代表,SAS至今在大型药企(谁让FDA只认SAS的结果?)、大型金融机构(招商银行信用卡中心就用的SAS,至少曾经如此)、政府机构(统计局、证监会……)等机构仍具有不可撼动的地位。然而在R的支持者看来SAS已经老朽不堪,死在沙滩上是迟早的事。未来SAS和R将会何去何从?两者的关系让大猫想起了微软前CEO鲍莫尔在谈起Linux时说的一句话:
“
开源即毒瘤
但是你看现在后鲍莫尔时代的微软:他把自己的底牌.NET架构开源了,于是诞生了.NET Core;他把Visual Studio简化并开源了,于是有了Visual Studio Code;微软为了让Windows everywhere,于是程序员们发现可以在Visual Studio中开发LINUX程序开发Android应用甚至开发iOS应用了;微软让自己的云品牌Azure拥抱开源,于是Azure开始支持开源的MySQL数据库以及LINUX虚拟机;微软现在是Github上最大的开源项目贡献者,超过了Google;微软高管甚至在苹果的发布会上给苹果站台推荐自己在Office在iPad上是多么好用……在2015年,微软新CEO Nadella说了这样一句话:
“
Microsoft loves Linux.
微软甚至注册了microsoftloveslinux的域名,虽然这个网址现在还是空的。
所以现在人们是怎么评价微软的呢?
“
Microsoft is cool again.
回到我们的话题中来,相信说了这么多大家也知道大猫的观点了,在体验过SAS的完美商业支持与R无所不包的packages之后,大猫认为:如果你的研究任务不是简单的跑跑回归敷衍上司或导师,如果你将来会处理各种各样复杂的数据来源,如果你想紧跟学术研究与业界的最前沿,如果你对于Data Science还有所追求,选择开源吧。
开源有那些优势呢?
另外,大猫最近收到很多同学给公众号后台的留言,大猫也在考虑专门推出几期FAQ来集中回答大家的问题,所以,如果大家有什么问题,可以给大猫留言哦。大猫最近在写毕业论文有点忙,但是尽量会抽空回复~
优
势一:免费
开源软件的优势首先自然是免费啦,然而,这“免费”二字可绝对没听起来那么普通。
就拿大猫自己的经历说吧,当年有篇论文需要做文本挖掘,那时作为坚定的SASor,大猫首先想到的当然是SAS/EM,但大猫学校没有买EM(Enterprise Mining)模块,于是只能通过各种“你懂的”方法去寻找,花了好几天的时间,甚至尝试过把SAS9.2的EM模块移植到9.3中,最后好不容易装上了EM。然而一用大猫傻眼了,原来SAS对于每种语言的text mining模块都单独授权,大猫找到的那个SID连捷克语都有了,就是没有中文,然后对SID文件进行各种hack也没用,当时真是万念俱灰。最后甚至落魄到决定先把中文分词之后转换成带声调的罗马字母与数字组合然后放到EM里面去跑,然而结果还是非常不理想。最后的最后,大猫看到了广为采用的基于JAVA的文本挖掘包WEKA,然后下决心从零开始学JAVA。大猫虽然当时对SAS已经很熟练了,但是对于C/Java/C#/Python之类的Programmatic Language还是一窍不通,可能这是很多经济学研究生普遍存在的问题吧。
当然后来在Weka的使用过程中也不是一帆风顺,最大的问题就在于Java孱弱的性能(我恨JVM!),还有令人头疼的读取文件问题,不过最终还是把问题解决了,虽然方法极其ugly……现在改用Python下面的Scikit-Learn包,感觉很流畅,没出过什么问题。当然大猫也用R的tm包,不过对于多线程的支持上似乎还不及Scikit-learn,大猫以后细说。
优
势二:接口众多
当你连调用OS读取个文件都要用上dos代码并且中断当前的进程,你只能觉得SAS让人累觉不爱
”
开源软件第二大优势,也是大猫更为看重的,是它能够拥有众多接口,也就是说,能够在不脱离自身语言的情况下去调用/交互其它工具(因此使用者就不需要学习新的工具了)。是的,大多数人都希望能够尽可能用已经掌握的工具去处理问题而不是学习新的工具,很可惜,商业性的SAS在这点上先天不足,这尤其体现在如下三点:1)访问操作系统的磁盘管理系统,2)访问网络,3)与其他语言交互。
关于SAS在访问文件中是如何让人抓狂的,大猫举一个很简单的例子。假设大猫希望能够通过代码读取某个文件夹下的特定文件(多么善良正当的需求啊!),这里面涉及到两个问题,一个是访问OS的文件管理系统,一个是用正则表达式选取符合要求的特定文件名。如果是SAS,首先必须使用x command来访问OS的文件,这一步就非常tricky,因为你首先需要了解一些DOS的文件命令,而很多人已经不会DOS了;其次x command会中断当前的SAS进程,而且其界面非常难看,常被作为外貌协会的大猫吐槽;最后,你还需要把获得的文件名存在宏变量中,而SAS的宏语言对初学者而言可能不是那么轻松。但挑战不止如此,获得所有文件的变量名后,你还需要使用正则表达式之类的工具提取出你想要的文件名,而对一个宏变量使用正则表达式,貌似需要先建立一个null数据集,总之前前后后查了N遍必应成功导入文件后,research的思路可能早就没了。
优
势三:http访问与爬虫
其次,SAS对于http的访问也是一大痛点。在SAS那个时代(1970s),人们对于统计软件访问网络的需求并不迫切,然而现在对于网络的访问几乎是统计软件必备的功能。SAS的file命令其实也能访问http,但基于SAS封闭的体系,能够自定义的地方实在太少。大猫最初接触爬虫,苦于不会其他语言,于是就只能用SAS写。记得当时非常自豪地写了一个抓取气象局网站每日PM2.5的爬虫,采用的策略是最笨的先用file命令download所有html文本,然后用正则表达式一个一个找要用的tag,连xpath都没用上(貌似SAS里也没xpath),现在看来二到奶奶家了。当时看SAS/SUGI的文章,说SAS团队有意推出SAS/PIPE模块专门用于爬虫,不知现在有没有出来,反正大猫也不太看好(当时可真是盼星星盼月亮盼它出来啊)。可能有人说我又不是要用SAS去写爬虫,大猫举的这个例子没有意义,但是要知道,你以后越来越多的数据将从网上获得,你的成果也越来越多的会通过网络展现,访问http的能力对于统计软件而言是必备的。
这里说句题外话,貌似看到有专门用R做爬虫的包,大猫对这些包的态度是:估计比SAS要强(大猫没用过),但真的要做爬虫的话,还是用Python或者Java吧。因为爬虫的需求和写论文时的需求很不一样,写论文时,最主要目标是语法简洁明了且性能够用,因而面向对象(object oriented,OO)的设计没什么用,反而增加了思考的障碍,然而爬虫作为一种非常程序化的应用,OO的特点是非常必要的,因而大猫怀疑用R写的爬虫,除了那些trivial的应用场景,究竟能有多少用。
例如,R的爬虫能设置http代理、user agent
cookie、模拟AJAX吗?能写成分布式吗?能利用Redis之类的数据库进行队列管理吗?能高效地写入外部数据库吗?可扩展性与后期维护方便吗?大猫的观点是:如果你真的想好好学爬虫,想抓取一些比较复杂的网站(简单点的网站R应该是可以应付的),而不是为了展示自己的R有多强或者某种虚幻的成就感,越早放弃用R来写越好,否则就会想大猫当年因为用SAS写出一个爬虫而沾沾自喜一样,最终来发现除了浪费了大量时间与获得某种极客的快感外别无所获。
R也是面向对象的,但是R的对象竟然是函数(对R有了解的同学应该听说过R对于函数的dispatch,这个就是体现面向对象特点的地方),和Python之类语言的面向对象思路完全不同。这种设计哲学大猫只能说除了奇葩还是奇葩……
优
优势三:API与交互
Python为什么那么多人喜欢?其“胶水语言”的特点功不可没:Python简单明了、能和任何语言进行交互,谷歌工程师们常常把某种idea先用Python写出来,等测试可行,然后再用C来进行改写提高效率。对于R和SAS也一样,R灵活多样的API为自己带来了大量支持者。
大猫在这里引用Python下最著名的绘图包matplotlib的作者John Hunter(1968-2012)的话,在谈到为什么要开发matplotlib时,Hunter说到:
“
以前,我的所有数据处理工作都是在matlib上完成的,matlib拥有非常强大的绘图能力,我非常喜欢他。然而,当我的工作不断扩展时,我发现matlib封闭的架构使得软件之间的交互非常困难。例如,我希望从SQL数据库中读取数据然后将变量绘制出来,但我发现matlib对SQL数据库并不是那么友好。其次,一些大规模的项目常常需要团队协作以及多个系统协同工作,例如前端的网页与后端的数据库,还有大大小小其他系统,matlib对他们的支持同样让人沮丧。因而,我不得不采用python(python胶水语言的称号很多小伙伴都听过吧?),但是python上又没有matlib上面那么棒的绘图工具,所以我决心自己开发一个。
Hunter的话其实已经说得很明白了,SAS就类似于matlab,在它专精的那个方面,真的很好,然而时代的发展要求我们不得不使用不同的工具完成不同的任务,这时交互性就尤为重要。可能这时有小伙伴说反正我也就是用软件跑跑回归,连数据库都用不着,考虑这么多干什么?其实,大猫当年也是这么想的,但随着你研究的不断深入,你的研究任务将不断复杂化(大猫当年绝逼想不到自己以后研究会要用到爬虫和文本挖掘的那一天),你势必将综合运用多种工具,这时你将会发现你的统计工具如果非常封闭的话是一件多么痛苦的事情。这就好比大猫初一时刚买电脑,正值磁记录技术(垂直记录技术)取得了突破,硬盘容量普遍从原来的20G涨到了40~80G,当时大猫看着80G的磁盘还担心这么多容量该放什么啊,现在想来真是图样图森破。用现在的话说,小姐姐都住不下几个……(这句话删掉
劣
势优化和多线程!
当然大猫也有一说一,开源毕竟也有开源的毛病,就是优化往往不太好,否则微软前CEO鲍莫尔也不会留下“开源即毒瘤”的话了。大猫对此感触最深的一点是同样从MySQL读取5个G的数据,用SAS只要5~10秒左右,而R可能就要好几分钟。而如果是读MongoDB这种比较新的NoSQL数据库,大猫的记录是40GB数据整整读了50个小时!32G内存全部撑爆!这种不堪回首的往事有机会大猫下次和小伙伴们讲……
这是读取MongoDB时大猫笔记本某一刻的资源管理器截图,当时内存还没撑爆,你们感受下:
不过和R语法的巨大优势比起来,这点已经可以忽略了,毕竟导入数据只需要一次,对吧?
下
期预告
下期大猫课堂会向大家带来本系列的倒数第二篇:《SAS or R:爬虫与文本挖掘》。这个话题今天其实已经有涉及到,但是没有进行展开。相信很多小伙伴也对这个话题很感兴趣,敬请期待下期吧!
PS:今天Ingress摸出一个红桶,好开心!
PPS:再次重申!大猫写的文章主要从学术研究角度考虑,求工业界的爸爸们不要来这个小地方踢馆嘤嘤嘤Orz
参
考文献
大猫在人大经济论坛上的原帖请见
http://bbs.pinggu.org/thread-3861040-1-1.html