打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
R 和 Python (numpy scipy pandas) 用于统计学分析,哪个更好? |

【周则禹的回答(160票)】:

错别字比较多,请谅解~

总的概括:R主要在学术界流行,python(numpy scipy)在工程方便比较实用。

R是S(Splus)的开源版本,或者下一代。发源地在新西兰奥克兰。这个软件的统计背景很浓烈。我这里浓烈的意思是,如果你不熟习统计知识(历史)的话,R的帮助文档看起来是很累的。由统计背景的人开发。R的维护组叫CRAN-R。在生物信息方便,有个叫bioconductor的组织,里面有很多生物信息方面可以用的软件包,他们有一套自己维护package系统。

Python是个综合语言(这里特指指CPython解释器),numpy scipy是数值计算的扩展包,pandas是主要用来做数据处理(numpy依赖),sympy做符号计算(类似mathematica?)此外还有一些不太成熟的包如sciki learn,statistical models。成熟度不如R。但是已经到了可用的水平了。是读计算机的人写的统计包。ipython 更新到1.0以后,功能基本完善,其notebook非常强大(感觉就像mathematica)而且还是基于web,在合作分享方面非常好用。

性能:

大家都说R慢,特别是CS的人。其实这里主要是两点:一个R里面数组的调用都是用复制的,二是Rscript慢。三是处理大数据慢。如果R用的好的话,R是不太慢的。具体来说就是Rscript用的少,多用命令,跑点小数据。这样的话,实际在跑的都是背后的fortran和C库。他们都有快二三十年历史了。可谓异常可靠,优化得不能再优化了(指单线程,如果去看源代码挥发先许多莫名的常数,永用了以后精度高速度快!)。比如一个自己编写一个R脚本,loop套loop的那种,那真是想死的心都会有。外加一点,R处理文本文件很慢!

Python归根揭底还是个有解释器的脚本语言,而且有致命伤——GIL,但python最难能可贵的就是它很容易变得更快。比如pypy,cython,或者直接ctypes挂C库。纯python写个原型,然后就开是不断的profiling和加速吧。很轻易可以达到和C一个数量级的速度,但是写程序、调试的时间少了很多。

并行计算:

R v15 之后有了自带的parallel包,用挺轻松的。不过其实就是不停的fork,或者mpi,内存消耗挺厉害的。parSapply,parApply什么的,真是很好用。

Python虽然有GIL——并行计算的死敌,但是有multiprocessing(fork依赖) ,是可以共享数据的什么的,估计内存消耗方面比R好点,数据零散的话overhead很多。到了MPI的话,mpi4py还是挺好用的。用cython的话结合openmp可以打破GIL,但是过程中不能调用python的对象。

学习曲线:假设什么编程都不会的同学。

R一开始还是很容易上手的,查到基本的命令,包,直接print一下就有结果了。但是如果要自己写算法、优化性能的时候,学习难度陡增。

Python么,挺好学的,绝大多数的帮助文档都比R好了许多。有些包用起来没R方便。总的来说深入吼R陡。

扩展资源:

基本上新的统计方法都会有R的package,安装实用都不麻烦。但是基本上都是搞统计的人写的计算机包。所以效能上可能有问好。比较出名的有两个包的管理网站,cran-r 和bioconductor。 所以搞生化的估计R用起来很方便。

python的统计计算包们比R少,多很年轻,还在不断的开发中。优于是计算机人写的统计包,用起来的时候要多涨个心眼。

画图:

R自带的那些工具就挺好用了,然后还有ggplot这种非常优美的得力工具。

python 有matplotlib,画出来效果感觉比R自带的好一些些,而且界面基于QT,跨平台支持。可能是R用得多了,pyplot用起来还是不太顺手,觉得其各个组建的统一性不高。

IDE:

Rstudio非常不错,提供类matlab环境。(本人过去用vim-r-plugin,现在用emacs + ess。)

windows 下有python(x,y) 还有许多商业的工具。(本人现在的emacs环境还不是很顺手~)

建议:

如果只是处理(小)数据的,用R。结果更可靠,速度可以接受,上手方便,多有现成的命令、程序可以用。

要自己搞个算法、处理大数据、计算量大的,用python。开发效率高,一切尽在掌握。

ps:盲目地用R的包比盲目的地用python的包要更安全。起码R会把你指向一篇论文,而python只是指向一堆代码。R出问题了还有论文作者、审稿人陪葬。

题外话,个人经验:

  • 我首先用python实现了一个统计方法,其中用到了ctypes,multiprocess。
  • 之后一个项目要做方法比较,又用回R,发现一些bioconductor上的包已经默认用parallel了。(但那个包还是很慢,一下子把我所以线程都用掉了,导致整个电脑使用不能,看网页非常卡~)
  • 后来用python pandas做了一些数据整理工作,类似数据库,两三个表来回查、匹配。感觉还是很方便的。虽然这些工作R也能做,但估计会慢点,毕竟几十万行的条目了。
  • 整理好之后开始尝试用python matplotlib画图。pyplot作图的方式和R差异很大,R是一条命令画点东西,pylot是准备好了以后一起出来。pyplot的颜色选择有点蛋疼,默认颜色比较少,之后可用html的颜色,但是名字太长了~。pyplot 的legend比R 好用多了,算是半自动化了。pyplot画出来后可以自由拉升缩放,然后再保存为图片,这点比R好用多了。

【知乎用户的回答(41票)】:

的确,如同@周则禹 在回答中说到的,R是统计学家的东西。

统计学家是一种什么生物呢?

“哈希表?二叉树?链表?这是啥,可以吃吗?”

“循环?递归?没学过,不会!”

所以,在R中没有我们在计算机课上学的各种数据结构(至少不安装扩展包就没有)。如果你写的代码中还用循环来处理数据,而不是用apply、aggregate之类的函数,那么在R圈里会被人嘲笑。如果你的思维还是无法从计算机编程习惯中切换到R的话,那么还是用Python吧。

也是由于上述问题,R完全没有考虑内存优化和算法加速之类的问题(R中不会关心sort函数是用快排还是冒泡实现的),所以数据量一大,计算机的内存就被占光了。不过有关内存和加速的问题已经有了许多的解决方案,例如用ICC编译R源代码链接MKL加速R数值计算,使用扩展包实现内存映射硬盘,等等。这些对于一个经验丰富的码农来说完全不在话下。所以,决定使用R还是Python的关键,就是你是否能够接受R的思想。

在R中,没有变量,只有数据!

没有循环,只有批处理!

没有计算机算法,只有数学模型!

如果决定使用R,那么就必须将自己从数据结构,算法策略这些知识中解脱出来。一个函数就是一个数学模型(回归、假设检验、方差估计),用统计和概率的思路去理解数据挖掘和机器学习的算法。使用R,能够将工作者从习惯的算法中解脱出来,真正去思考模型本身的数学意义,在数学层面去修改算法。忘记我们经常思考的算法复杂度和内存消耗之类的问题,推动机器学习和数据挖掘的关键动力,就是数学模型!

最后总结一下:

R能够用最短的代码实现一个新的统计模型和机器学习模型(前提是对R和扩展库很熟悉),并且每一句代码都有对应的数据和数学意义;因此R适用与建立新模型,新算法,并且对模型进行统计意义的评价。

Python能够让程序员在尽量不受语言细节的干扰下,将一个已经证明成熟和可靠的算法实现出来,并且投入工程应用,开发出实用的决策系统。

对语言的选择其实也是程序员对自我的定位:

是想做科学家,还是工程师。

【过拟合的回答(14票)】:

根据我的使用经验,我认为一般性的科研可以使用numpy工具链做为主力。

首先,在写矩阵计算相关的语句时,numpy的语法几乎能逼近MATLAB的简洁程度,而其他语言相对来说稍微“难看、难写”一些。

其次,当程序不仅仅涉及到科学计算时,用Python就可以大发神威了。比如我自己遇到的一个实际问题:需要对点云进行一些非常复杂的优化操作,之后需要画出三维图且支持一些拉近拉远转视角的操作,并且还要做出一个不错的界面方便调整参数、载入数据等等。看到画三维点云的第一反应就是用OpenGL,但是使用C/C++写那些非常繁杂的数值优化...用MATLAB可以很舒服、很便捷地写出优化部分的代码,但是直接画大规模的三维点云的速度,以及它那令人忧伤的GUI...

那Python就行吗?是的。在数值计算方面,Numpy/Scipy,以及强大的机器学习包scikit.learn,让这个过程十分惬意。在画三维点云方面,PyOpengl包完全就是OpenGL的Python封装,速度非常快,而且语法几乎同OpenGL一样。最后,使用PyQt写出基于Qt的GUI,这至少是一个标准的完备的GUI包,外观功能都不错。最后的最后,这个程序不需改动就可以跨平台运行,只要Linux/Windows用户按照标准过程安装了相应的包就可以使用,不用折腾本地编译之类的事情。

还有一个问题是速度。Windows下使用python(x,y)、Linux下源里默认安装方法的Python链接的都是较慢的Blas/Lapack库,而MATLAB默认链接MKL,所以矩阵计算速度会慢非常多。但是至少在Linux下是很容易让Numpy链接上MKL的,这样的Numpy计算速度与MATLAB几乎相同,所以速度不是严重的问题。也许C++能在循环上秒杀Python,但是如果你涉及到矩阵计算,用的普通的BLAS/LAPACK库,那么在核心的某几步上会慢成渣,从而在总的速度上被Python超越,得不偿失。当然你也可以让C++程序链接上MKL库,但要移植到别的平台又是一番折腾。

最后就是开发环境,个人推荐Eclipse的Pydev,用起来几乎同MATLAB一样,尤其是调试和看变量值方面。

在统计问题方面,用R写起来最舒服,因为包全,这一点Python或者C比不上。而且R也能链接MKL大大加快速度。还有就是,如果你要写统计方面的论文,那论文里的代码用R似乎会“显得”你更“

专业”一些。

上学期有流形学习课,我用scikit.learn包,几乎每次只改一句话就能提交作业(把LLE变成ISOMAP什么的)。还有一门统计学习课,让我深刻感觉到R就是用来写老师布置的ESL后面的那些编程题的,因为那些方法的作者,以及这本书的作者,写的就是R的包。至于大规模计算、实际的大型工程问题,我没有经验,所以不能提供更多信息了。

补充:如果觉得自己链接MKL库编译Numpy和R麻烦的话,Python可以使用Canopy(就是之前的EPD),R可以使用Revolution R,都是一些商业公司帮配置好的完整发行版,链接了MKL库并支持其他一些特性(例如自带IDE等)。前者各平台都有,后者仅限Windows平台。

再补充:之前我写过两篇博文讲链接MKL库的方法。NumPy链接MKL请见Numpy使用MKL库提升计算性能,R链接MKL请见R链接MKL库以显著提升计算速度

【知乎用户的回答(7票)】:

R为比较高等级的语言,R和python, C如今可以进行无缝连接。所以我觉得应该各取其长,用R把python和C连接好,取长补短,不被单一语言限制,才能迎接各种困难。

【肖楠的回答(7票)】:

个人现状:使用 R,学习 Python,关注 Julia。

【茉茉的回答(3票)】:

R。如有可能再接觸下 SAS 更好。

【肖龙飞的回答(2票)】:

如果做数据分析师,那么R就够用了,R中有很多现成的统计、数据挖掘的工具包;

如果是程序员,可以学python,用来做一般化编程python更合适些。

Python (programming language): What are the advantages of using Python over R?

【reverland的回答(2票)】:

先接触R,学习过程就一个蛋疼。后来开始python,从入门开始相比R一路顺手到不行。python不仅仅作为计算而开发,数据分析统计往往又要涉及很多非计算的东西,当时觉得脚本语言做这些乱七八糟的事真方便。

但这回头开始深入R之后,发现R rocks too,R是个很专注的环境,现成的东西太多了。

就国内而言,觉得R的社区比python科学计算社区活跃很多,两者风格也迥异(感觉一个大部分是折腾数据的一个简直都是折腾程序的)。

所以,不是为了写程序就R吧

【克林的回答(2票)】:

我也希望能只选一个而放弃另一个,但是在实际工作中,做不到。

R有着独一无二神一样的的ggplot(只是效率太低,希望dplyr发布后作者能够用它重构ggplot里的数据处理部分,取代plyr),还有data.table (它的语法实在是太精简了)。当然,R最显著的特点就是其语言特性支持超高的信噪比(这里特指数据整洁、分析时,其他时候相反!),同样的功能在R里所占据的字符数比在Python里少了一半以上。比如

R: a[x<2 & a>-3, list(y, z)] # (a 是一个 data.table)Python: a[(a['x']<2) & (a['x']>-3)][['y','z']] # (a 是一个 data frame)

但是,有时候,你需要自己写一些复杂的程序,或者调用一些外部的C, python代码,这个时候就Python 就显示出优势来了。用R写程序极其令人烦躁(很多代码都是为了做些不相干的事情,比如在一个正确的frame里获取一个object的名字 --> 为了能够在使用的时候保持高信噪比,我多次深陷quote, substitute, eval, parent.frame里不能自拔),同时效率也不高(除非你用Rcpp)。

【吴告于的回答(1票)】:

R会慢一些,pandas关键在于提供了两个类dataframe和series,以及许多高层的实现特定功能的函数。具体看你做什么应用。我比较偏向pandas。

【李作刚的回答(1票)】:

目前来看 :

R 在统计方面做得非常好。是因为统计学领域长时间的积累,他又非常完善的各种统计学 package。但在实际操作中,R 单独是做不了事情的。 必须依赖Python 或者 Java 才能完成一个项目。

Python 可以方便的处理除了统计之外的其他事情。但统计这个短板绕不过。短期内也很难达到 R 的成熟。

所以当前的最好的是,用 R 来负责统计分析的核心环节。剩下的交给其他。

从长远来看,如果 Python 能把R 拥有的所有的统计学 package 重写一遍。就没 R 什么事情了。

【林春艾的回答(0票)】:

这个我也比较困惑,但现在想来,先学python相关的科学计算库,这个学起来曲线平缓一点。

【知乎用户的回答(0票)】:

尝试过很多次R,但最终还是Python用着顺手

【废城院长的回答(0票)】:

牵扯到多个平台间的计算 Python 容易点,如果数据都在一个平台,R的library 更丰富些。当然两者也可以互相调用.

【CosmiaFu的回答(0票)】:

为什么不试试两个都用呢?

就像C好还是Python好一样,为什么不试试两个一起用呢?

【林枫的回答(0票)】:

显然

python numpy scipy pandas matplotlib

R不适合集成

【Nextchen的回答(0票)】:

这个是在拉仇恨吗?完全没法比较,演变到最后,就成了程序派别之争了!学习的话,两个都无所谓。如果是生产环境,python 的性能自不必多说,R 近几年在大数据方面也是有长足的进步,SparkR,mpi,hadoop 等等,而且 Google facebook twitter 这些巨头也在关注 R。所以性能现在已经不是 R 的弊端,像 dplyr 这类 R 的包出现,单机的性能也能得到优化。所以说,不用问,试试才知道哪个适合你?

【王双洋的回答(0票)】:

既然题主说到 统计分析,那么我想应该毫无争议的选着R

【你知道我是张三的回答(0票)】:

玩学术理论什么的还是R,工程实践还是python吧。。。。

原文地址:知乎

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
【译】数据科学之5个最佳Python库,为初学者定制的教程
【盘点】深度学习最常用到的20个Python库
金融科技领域最受欢迎的八个Python库
十大最受数据科学欢迎的Python库
从理论到学习时间表:教你正月30天速成Python
Python机器学习库TOP10
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服