R和Python在数据科学方面如何互补?


54

在许多教程或手册中,叙述似乎暗示R和python作为分析过程的补充组件共存。但是,对我而言,这两种语言似乎在做同样的事情。

所以我的问题是,这两种语言是否真的有专门的细分市场,还是使用一种或另一种只是个人喜好?


2
这看起来确实不像该线程的副本。这不是关于如何使用Python进行统计,而是关于Python如何补充R(显然,R将用于进行统计分析)。
gung-恢复莫妮卡

4
如果您是10年前的统计学家,则为R。如果您想将代码投入生产或重用,请使用Python。
djechlin


3
由于该问号的流行,并且响应通过标志的请求,我重新打开了它,但将其设为CW。
Scortchi-恢复莫妮卡

1
大多数答案往往会忘记的是,他们正在将Python 语言与GNU-R 实现进行比较。R还拥有其他实现(见韧劲,用Java编写的,微软R打开,这与英特尔MKL,编译FastR焊接工艺评定,等)。这些试图纠正GNU-R(一种更为保守的实现)的某些问题。另外,请记住,R没有正式定义。
Firebug

Answers:


45

它们是互补的。的确,两者都可以做相同的事情,但是对于大多数语言来说都是如此。每个都有其优点和缺点。普遍的看法是,Python最适合用于数据收集和准备以及文本分析。R被认为是最适合数据分析的,因为它首先是一种统计语言。

R有各种各样的软件包供您选择,但它的主要用途是统计分析-从基本的卡方检验到因子分析以及危害模型,它既简单又健壮。统计中的一些知名人士创建了R程序包,并且它有一个活跃的社区来满足您的各种需求。ggplot2是数据可视化(图形等)的标准。R是一种向量化语言,旨在有效地遍历数据。它还将所有数据存储在RAM中,这是一把双刃剑-它在较小的数据集上比较快(尽管有些人可能会与我争论),但是它不能很好地处理大数据(尽管它具有绕过此包的软件包) ,例如ff)。

Python比R更容易学习-特别是对于那些以前有编程经验的人。R只是...很奇怪。Python擅长数据检索,并且是用于Web抓取的语言(令人惊叹的beautifulsoup)。Python以其在字符串解析和文本处理方面的实力而闻名。pandas是用于数据操作,合并,转换等的出色库,并且运行速度很快(可能受R启发)。

当您需要进行一些编程时,Python很棒。这并不奇怪,因为它是通用语言。但是,R及其所有扩展都是由统计学家为统计学家建立的。因此,尽管在许多应用程序中Python可能变得更容易,更好,更快,但R将成为统计分析的首选平台。


13
作为一个既了解又了解的人,我同意这一点。可能会有很多风格上的争论,但是最大的区别是,一旦真正运行因果统计模型的时间到了,Python就会变得不发达。该statsmodels包让你的一些基础知识,但不接近R,塔塔或SAS。机器学习风格分析是一个值得注意的例外,Python的scikitlearn可以很好地匹配机器学习风格分析。对于其他所有方面,我认为可以说Python至少等于R并且通常更好。学习两者绝不是浪费时间。
杰夫

2
我大部分都同意-但会更多地强调问题-R不适用于大型数据集,并且不能很好地处理稀疏数据集(大多数库不支持它)(很多人在此基础上进行机器学习)例如,“单词袋”类型的模型,其中因子/分类变量的基数可能在1000s之内。
seanv507

10
不是在注释线程中启动参数,而是data.tableR中的程序包专门用于围绕大型数据集进行有效的工作,并将插件插入精细的分布式处理中。
明亮的星星,

3
如果您认为Python在数据检索和字符串解析方面比R更好,那么您一直就在错误地使用R。对于“ R不适用于大型数据集,并且不能很好地处理稀疏数据集(大多数库不支持它)”,也是如此
绅士

3
增加了特雷弗(Trevor)的支持data.table;我也很高兴地说这rvest是一个出色的工具,能够处理大多数刮刮任务,比beautifulsoup
MichaelChirico

21

我将尝试使用这两种语言的人来提出一个答案,以解决这两种语言在数据科学/统计/数据分析等方面发挥作用的要点。

数据分析中的工作流程通常包括以下步骤:

  1. 从某种来源(最可能是SQL / noSQL数据库或.csv文件)中获取数据。
  2. 以一种体面且合理的格式(数据帧)解析数据,以便人们可以进行操作并据此进行思考。
  3. 对数据应用一些功能(分组​​,删除,合并,重命名)。
  4. 对数据应用某种模型(回归,聚类,神经网络或任何其他或多或少复杂的理论)。
  5. 向或多或少的技术受众部署/展示结果。

取得资料

在99%的时间内,获取数据的过程都取决于查询某种SQL或Impala数据库:PythonR都有特定的客户端或库,它们可以同时且同样好地完成工作(RImpalaRmySQL对于R和MySQLdbPython工作顺利,没有太多补充)。在读取外部.csv文件时,Rdata.table包提供的功能可以立即读取带有任何自定义解析选项的庞大而复杂的.csv文件,并将结果直接转换为具有列名和行号的数据帧。fread

整理数据框

我们希望将数据存储在某种表中,以便我们可以轻松访问任何单个条目,行或列。

所述řdata.table提供无与伦比的方式来标记,重命名,删除和访问数据。标准语法非常像SQL,就像dt[i, j, fun_by],它应该是这样dt[where_condition, select_column, grouped_by (or the like)];可以在其中以及j子句中放置自定义的用户定义函数,这样您就可以完全自由地操作数据并将任何复杂或复杂的函数应用于组或子集(例如,第i行,第k行且仅当整列的标准偏差为“是”时,才将其求和到第(i-1)行的第(k-2)个元素,并按最后一列进行分组。看看基准测试以及关于SO的另一个令人惊奇的问题。列,行的排序,删除和重命名完成了它们必须要做的事情,并且标准向量化R方法apply, sapply, lapply, ifelse对列和数据帧执行了向量化操作,而没有循环遍历每个元素(请记住,每当您在R中使用循环时,确实做错了)。

Python的反武器是pandas库。最后,它提供了一种结构pd.DataFrame(标准Python缺少,由于某种原因我仍然不知道),该结构将数据按其本身进行处理,即数据帧(而不是某些数据numpy array, numpy list, numpy matrix或其他数据)。诸如分组,重命名,排序等操作很容易实现,在这里,用户也可以使用Python apply或将任何自定义函数应用于分组的数据集或框架的子集lambda。我个人不喜欢df[df.iloc(...)]访问条目的语法,但这只是个人喜好,完全没有问题。分组操作的基准仍然比R稍差一些,data.table但是除非您想节省0.02秒的编译时间,否则性能不会有太大差异。

弦乐

[R的方式来对待字符串是使用stringr,允许任何文本操作,字谜,正则表达式,尾随空格或轻松类似的包。它也可以与JSON库结合使用,这些JSON库解压缩JSON字典并取消列出其元素,从而使人们拥有一个最终的数据框,其中的列名和元素就是它们所必须的,而没有任何非UTF8字符或空白在那里。

Python的Pandas .str.在与正则表达式,尾随或其他方面的竞争中所起的作用相同,因此即使在口味上也没有太大差异。

应用模型

我认为这是两种语言之间出现差异的地方。

[R到今天为止,已经拥有了无与伦比的库集,这些库使用户基本上可以在一到两行代码中完成他们想要的任何事情。标准函数或多项式回归在一线执行,并产生其系数易于读取的输出,以及其对应的置信区间和p值分布。同样,对于聚类,对于随机森林模型,对于树状图,主成分分析,奇异值分解,对数拟合,等等。上面每一个的输出很可能带有一个特定的绘图类,该类生成可视化的可视化内容,并用颜色和气泡表示系数和参数。假设检验,统计检验,Shapiro,

Python试图与SciPyand 保持同步scikit-learn。大多数标准分析和模型也都可用,但它们的编码时间稍长,而读取则不太直观(我认为)。尽管可以追溯到已经存在的库的某些组合,但是缺少更复杂的机器。我更喜欢在Python中而不是在R中做的一件事是使用二元语法,三元语法和更高阶的词袋文本分析。

展示结果

两种语言都有漂亮的绘图工具,首先是R ggplot2,以及相应的Python等效工具。虽然竞争并不多,但它们可以安全可靠地完成工作,尽管我相信,如果要展示结果,您可能必须使用其他工具-那里有许多花哨的色彩缤纷的设计工具,而Python和R都不意味着观众花哨的红色和绿色拖放。R最近发布了对其shiny app功能的许多改进,基本上使它能够产生交互式输出。我从不想学习它,但是我知道它在那里并且人们很好地使用了它。


边注

作为一个旁注,我想强调一下这两种语言之间的主要区别是Python是一种通用编程语言,由计算机科学,可移植性,部署等组成,并由它们制成。它的功能很棒,而且学习起来很简单;没有人不喜欢python。但这是一种进行编程的编程语言。

[R另一方面,它是由数学家,物理学家,统计学家和数据科学家发明并为他们发明的。如果您来自那个背景,那么一切都会非常有意义,因为它完美地反映并重现了统计和数学中使用的概念。但是,如果相反,您是计算机科学背景的,并且想在R中模拟Java或C,您将感到失望。它没有标准意义上的“对象”(嗯,有,但是没有人通常认为的东西...),它没有标准意义上的类(有,但是,但没有通常意义上的类)认为它们是...),它没有“指针”或所有其他计算机科学结构-只是因为它不需要它们。最后但是同样重要的:文档和软件包易于创建和阅读(如果您使用的是Rstudio);那里有一个庞大而充满激情的社区,而Google花费大约五秒钟的时间“如何在R中进行插入随机问题”,其第一项将您重定向到具有相应代码的问题的解决方案(由他人完成) , 立刻。

大多数工业公司的基础架构都使用Python(或Python友好环境)构建,可以轻松集成Python代码(几乎import myAnalysis可以在任何地方完成)。但是,任何现代技术,服务器或平台都可以轻松运行后台R代码,也不会出现任何问题。


8
+6,这是一个很好的答案:详细,准确和平衡。
gung-恢复莫妮卡

+1最佳答案在这里。很好笑,我从Java来到R(尽管不是直接联系),我对此非常满意。我不一定认为在R中执行循环意味着您做错了。我发现自己有时会尝试尝试使用循环来挠头,但找不到解决方法(例如,根据前一行的条件在数据集中创建新的变量值,并从辅助数据集中获取数据)。
Yuval Spiegler '16

如果只有这么多的R包可以在阳光下做任何事情,都是由知道如何进行统计计算/编写可靠且健壮的数值数学软件/知道数值分析等知识的人员编写的。某些R包非常好。很大的R包,甚至是一些著名作者编写的R包,都完全是垃圾-许多用户甚至没有意识到他们正在获取垃圾。哦,它在CRAN中,它必须是好的,或者至少是正确的,或者是可靠的……错误!!!
Mark L. Stone,

“到目前为止,R拥有无与伦比的库集,这些库使用户可以用一到两行代码本质上执行他们想要的任何事情。” 我同意100%,除非获得正确答案是用户想要的事情之一。
Mark L. Stone,

8
@ MarkL.Stone您介意举一个由著名用户编写的标准程序包示例,该程序会产生错误的结果吗?
绅士

15
  • Python是一种通用的编程语言:因此,它除了执行数据分析外,还可以执行许多其他任务。例如,如果我们要在生产服务器中自动化模型执行,那么python是一个很好的选择。其他示例包括连接到硬件/传感器以读取数据,与数据库进行交互(诸如JSON之类的关系或非结构化数据),解析数据,网络编程(TCP / IP),图形用户界面,与Shell进行交互等(嗯,数据科学家为什么要执行这么多与预测模型无关的任务呢?我认为人们有不同的定义什么是数据科学家?在某些组织中,解析数据并使用仪表板进行描述性分析对业务而言足够好,而数据对于进行预测模型而言则不够成熟。另一方面,在许多小型公司中,人们可能希望数据科学家从事大量的软件工程。了解python将使您独立于其他软件工程师。)

  • R有很多统计软件包,它们比python或MATLAB好得多。通过使用R,人们可以真正地在模型级别而不是实现细节级别进行思考。这是开发统计模型的巨大优势。例如,许多人正在python中手动实现神经网络。进行此类工作可能无法帮助您理解神经网络为何起作用,而只是按照配方复制他人的工作以检查其是否起作用。如果我们在R中工作,我们可以轻松地关注模型背后的数学,而不是实现细节。

在许多情况下,人们会一起使用它们。使用python可以轻松构建软件,而使用R可以轻松构建模型。如果我们要在生产环境中交付模型而不是纸质文件,则可能需要两者。如果您的公司有很多软件工程师,则可能需要更多的R。如果您的公司有很多研究科学家,则可能需要更多的python。


2
尼斯的答案,但你写的,而不是“JSON”贾森',并给我一个很好的轻笑
面值

我实际上不是统计学或“机器学习”社区的成员,但我认为高级软件包的可用性在某种程度上是特定于社区的。我可以相信,R代码附带了许多新的最先进的统计技术。但是,当我看到带有(“高级”)代码的计算机视觉/机器学习/神经网络论文时,它们似乎是Matlab或python。
GeoMatt22 2016年

1
+1,用于讨论语言如何影响人们的思维方式。由于R由统计学家为统计学家建立,因此R的巨大优势在于,它如何鼓励建模方面的思考。披露:我精通R,但仅涉足Python。
阿什

嗯...呢scikit-learnscikit-learn.org/stable
军舰

10

各行各业的程序员低估了文化选择了多少语言。像Node.js这样的Web开发人员。科学家喜欢Python。作为一名能够同时处理Javascript的流畅性和Java的刚性的多语言软件工程师,我意识到这些语言对彼此的工作不利并没有任何内在的原因-只是大量的软件包,文档,社区,书籍,等围绕它们。

(出于内在原因,一种随机语言比其他某种语言要好,请参见即将对此答案发表的评论。)

我个人的预测是,Python是未来的方式,因为它可以做的一切R可以-或者说,就够了R可以是专门的程序员正在努力填补空白的-而且是远远更好的软件工程语言。软件工程是一门涉及以下方面的学科:

  • 信任代码的可靠性足以将其投入生产(因此,任何可以实时为用户服务的机器学习模型)
  • 确保您的代码在进行修改和重用时可以继续工作(例如,单元测试框架)
  • 在短短6个月内专注于可读性,以造福他人和自己
  • 高度重视代码组织,以便于进行版本控制,回退到以前的工作版本以及由多方并行开发
  • 偏爱具有更好文档的工具和技术,并且理想情况下,除非您正确使用它们,否则它们根本无法工作(这是Matlab的最大困扰-我在Google上提问,我必须阅读他们相当糟糕的论坛寻找答案)

坦率地说,Python更容易学习。

科学家和统计学家将意识到他们是良好软件工程实践的利益相关者,而不是一个独立且不受干扰的职业。仅根据我的观点,但证明学术规范易碎的论文将支持此观点。

这个答案是我的全部观点-但您提出了一个很自以为是的问题,并且由于到目前为止它已广为接受,所以我认为您应该得到一个朴实无华,合理的(我希望!)观点作为回应。对于Python来说,关于R的争论是很认真的,当现实本身就是党派的时候,我会拒绝发布无党派的答案。


朱莉娅长大后,会不会比Python更好呢?
kjetil b halvorsen 2016年

1
@kjetilbhalvorsen“它长大了”更像是一个“如果”,很难取代一种既定的语言,而您是否愿意使用前沿技术却有可能永远不会被牢固地采用,这基本上是个人选择。IMO,Python现在势头强劲。我对Julia并不是很熟悉,因此这是一个相当普遍的看法。
djechlin '16

1
除了第一个项目符号外,我看不到Python在其他四点上都具有固有的优越性。
Firebug

4
“ Python可以完成R可以做的所有事情”是错误的。“专用程序员正在努力用R填补足够的空白”,这对于世界上的任何事物都是正确的-只要有人在上面做,任何事情都可以做。
绅士

2
@djechlin完全没有。您的可靠性示例是“因此,任何可以实时为用户服务的机器学习模型”。Python的优势在于,它比R更轻松地支持部署,仅此而已。单元测试,可读性,组织和文档不是内在的品质。您可以实现自己的测试,使您的代码更易于阅读,组织和编写R文档,这真的很容易理解。
Firebug

8

我是R用户,但我认为Python是未来(我不认为这是语法)

Python是未来Python
的好处在于,其他人已经提到了更广泛的支持,并且对于程序员来说,逻辑语法也更多。
而且,您可以将分析结果转化为生产系统的能力要简单得多。
也许是因为Python是通用的,而R不是,但当我看到生产化的R管道时,我甚至大为惊讶。
不仅如此,即使对于高级应用程序,Python也在迅速赶上(Scikit-learn,PyBrain,Tensorflow等),而R在如何实现统计方法方面仍然是学术界的通用语言,由于高级专业图书馆的问世。

但是R并不坏,
很多人似乎都喜欢使用“ R的语法不好”这一潮流。
我希望提出R的语法是一件好事!使用R时
,赋值函数,惰性求值,非标准求值和公式具有巨大的好处。
它节省了太多时间,不必担心转义摘要中引用的变量名或如何针对针对什么或查看名称,names()然后通过添加来分配新名称<- c("A", "B", "C")
当人们抱怨R的怪异语法时,他们将其视为一种编程语言,而不是一种数据科学工具。
作为来自R并热爱dplyr的人,相比之下,pandas的语法有点笨拙。
是的,它稍微灵活一些,但是与R中的大多数任务相比,在R中执行简单的命令要花费更多的击键,仅仅是为了满足Python的解析器,而不是表达您的想法。

总结
当然,同时了解这两种知识是很明智的,而Python可以做到这一点,R的特定领域设计选择只是使其在临时工作中更加简单。R的巨大缺点是很难离开它的领域,一旦尝试以可持续的方式实施发现,基本上就必须这样做。


4

如果您将R视为统计工具而不是编程语言,那确实很棒。它比Stata或SPSS具有更大的灵活性,但也可以尽其所能。我在大学期间学习了Stata,R很容易看,因为我已经掌握了统计工具的观点,而不是其他人可能拥有的纯编程语言经验。

我认为当程序员是那些试图学习和理解R的人时,R的挫败感就会加剧。但是对于那些通过统计学背景进入R的人来说,这是一个很好的工具。

如果您已经是一个伟大的程序员,Python就是一个很好的选择。但是对于刚上大学的编程和统计学初学者来说,R是一个更好的选择。实际上,偏爱哪种才更适合您的技能和兴趣。


3

添加到一些先前的答案:

以我的经验,没有什么比使用R的dplyr + tidyr,ggplot和Rmarkdown从原始数据获得可呈现的结果更容易了。Python提供了很多功能,并且我正在越来越多地使用它,但是我肯定喜欢Hadley的软件包结合在一起的方式。


2

Python在科学之外被广泛采用,因此您将从中受益。正如“ R的愤怒指南”所指出的那样,R是由一个社区开发的,该社区必须一阶零软件开发人员。

我要说的是,今天R具有两个主要优点:在某些领域中一些真正成熟的高度专业化的软件包,以及最先进的可复制研究软件包knitr。

Python似乎更适合其他所有内容。

当然,这是该线程中几乎所有内容的一种见解。我对此线程仍然存在感到惊讶。


2

如其他答案所述,Python是一种很好的通用编程语言,而R 作为一种编程语言存在严重缺陷,但具有一组更丰富的数据分析库。近年来,Python通过开发成熟的数据分析库(例如scikit-learn)追赶R,而R永远不会被修复。实际上,我几乎所有内容都使用Python(实际上是Hy),而对于比较深奥的方法(例如分位数回归)(在Python的statsmodels中似乎无法实现)则只使用R。从Python调用R有几种方法。PypeR是一个非常简单的应用程序,以至于它可以在Windows服务器等恶劣环境中工作。

编辑:我鼓励任何想对此进行进一步辩论的人与链接的文章的作者进行讨论,而不是评论此答案。


8
那本Rrgh指南是我曾经读过的关于R的最无知的批评(而且我读了很多)。
Firebug

10
“文档非常糟糕”,这是毫无头绪的。R的强项是它对非编程人员的简便性及其庞大的文档资料。“因为R的名字都是愚蠢的,所以以一种有用的方式来搜索R的东西真的很困难。很抱歉。欢迎使用R!”,这毫无头绪。我从未遇到任何问题,无法找到最晦涩的软件包的文档。“您以怪异的方式将列重命名,然后分配给名称(框架)。您知道这种方法的工作原理和原因吗?请教育我。” c'mmon,他什至没有尝试。
Firebug

8
R比C难谷歌吗?Google很聪明。它了解到您对R语言编程语言感兴趣。R语言经常受到其他语言背景的人的批评。抱歉,它不是替代这些语言而开发的。它是为统计人员开发的。结果,某些设计决策不是最优的,但是说存在严重缺陷则有力。每种编程语言都有其优点和缺点。
罗兰

5
创建一个包实际上非常容易。仅当您(正确)遵守CRAN所执行的规则时,情况才会变得复杂。如果创建软件包,则可以有选择地从软件包中导入。向量回收实际上是一种优势。子集列表和向量之间没有矛盾。其余一些确实可以视为缺陷。
罗兰

6
R很明显有疣,有些不可原谅的“变味”变种(stringsAsFactors)。但是它也具有统计库,该库没有任何其他语言的并行甚至不远程创建这些库所需的编程比我们绝大多数人所要做的更加认真。作为一个笼统的说法,“ R不是严肃的语言”介于无知,绝望,狭och,文盲和酸葡萄之间。我说这是希望R基本上是具有R的库的Python的人。
保罗
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.