在许多教程或手册中,叙述似乎暗示 R 和 python 作为分析过程的互补组件共存。然而,在我未经训练的眼睛看来,这两种语言似乎都在做同样的事情。
所以我的问题是,这两种语言是否真的有专门的领域,或者是否只是个人偏好使用一种或另一种?
在许多教程或手册中,叙述似乎暗示 R 和 python 作为分析过程的互补组件共存。然而,在我未经训练的眼睛看来,这两种语言似乎都在做同样的事情。
所以我的问题是,这两种语言是否真的有专门的领域,或者是否只是个人偏好使用一种或另一种?
它们是互补的。的确,两者都可以做同样的事情,但大多数语言都可以这样说。每个都有其优点和缺点。普遍的看法似乎是 Python 最适合数据收集和准备,以及文本分析。R 被认为最适合数据分析,因为它首先是一种统计语言。
R为您能想到的任何东西提供了一个大杂烩,但它的主要功能是统计分析——从基本的卡方到因子分析和风险模型,它既简单又健壮。一些统计学界的大腕创建了 R 包,它有一个活跃的社区来帮助你满足你的每一个需求。ggplot2
是数据可视化(图表等)的标准。R 是一种矢量化语言,旨在有效地循环数据。它还将所有数据存储在 RAM 中,这是一把双刃剑 - 它在较小的数据集上很灵活(尽管有些人可能会与我争论),但它不能很好地处理大数据(尽管它有绕过这个的包,例如ff
)。
Python比 R 更容易学习——尤其是对于那些有编程经验的人。R只是……很奇怪。Python 擅长数据检索,是用于网络抓取的语言(具有惊人的beautifulsoup
. Python 以其在字符串解析和文本操作方面的优势而闻名。pandas
是一个用于数据操作、合并、转换等的优秀库,而且速度很快(可能受到 R 的启发)。
当您需要进行一些编程时,Python 非常棒。这并不奇怪,因为它是一种通用语言。然而,R 及其所有扩展都是由统计学家为统计学家构建的。因此,虽然 Python 在许多应用程序中可能更容易、更好、更快,但 R 将成为统计分析的首选平台。
作为同时使用这两种语言的人,我将尝试制定一个答案,触及这两种语言在数据科学/统计/数据分析等方面发挥作用的要点。
数据分析中的工作流程一般包括以下步骤:
99% 的情况下,获取数据的过程归结为查询某种 SQL 或 Impala 数据库:Python和R都有特定的客户端或库,它们可以立即完成这项工作并且同样出色(RImpala
对于RmySQL
R 和MySQLdb
对于 Python工作顺利,没有太多要添加的)。在读取外部 .csv 文件时,Rdata.table
的包提供了使用任何自定义解析选项立即读取庞大而复杂的 .csv 文件的功能,并将结果直接转换为具有列名和行号的数据帧。fread
我们希望将数据存储在某种表中,以便我们可以轻松访问任何单个条目、行或列。
R包提供了无与伦比的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
或其他)。可以轻松实现分组、重命名、排序等操作,在这里,用户也可以使用 Pythonapply
或lambda
. 我个人不喜欢访问条目的语法df[df.iloc(...)]
,但这只是个人喜好,完全没有问题。分组操作的基准仍然比 R 稍差,data.table
但除非您想节省 0.02 秒的编译时间,否则性能上没有太大差异。
R处理字符串的方法是使用允许stringr
任何文本操作、字谜、正则表达式、尾随空格或类似的包。它还可以与解包 JSON 字典并取消列出其元素的 JSON 库结合使用,以便拥有一个最终数据框,其中列名和元素是它们必须的,没有任何非 UTF8 字符或空格在那里。
Python 的 Pandas .str.
在使用正则表达式、尾随或其他方面与它的竞争对手一样好,所以即使在这里也没有太大的品味差异。
在我看来,这就是两种语言之间出现差异的地方。
R到今天为止,拥有一组无与伦比的库,允许用户基本上用一到两行代码做任何他们想做的事情。标准函数或多项式回归在单行中执行,并产生系数易于阅读的输出,并附有相应的置信区间和 p 值分布。同样适用于聚类,同样适用于随机森林模型,同样适用于树状图、主成分分析、奇异值分解、逻辑拟合等等。上述每一项的输出很可能带有一个特定的绘图类,该类生成您刚刚所做的可视化,以及系数和参数的颜色和气泡。假设检验,统计检验,夏皮罗,
Python正试图跟上SciPy
和scikit-learn
. 大多数标准分析和模型也是可用的,但它们的编码时间稍长,阅读起来也不太直观(在我看来)。缺少更复杂的机器,尽管有些可以追溯到现有库的某些组合。我更喜欢在 Python 中而不是在 R 中做的一件事是使用二元语法、三元语法和更高阶的词袋文本分析。
两种语言都有漂亮的绘图工具,ggplot2
最重要的是 R 和相应的 Python 等价物。没什么可竞争的,他们安全可靠地完成了这项工作,尽管我相信,如果你要展示结果,你可能不得不使用其他工具——那里有花哨的彩色设计工具,Python 和 R 都不是为了让与花哨的红色和绿色拖放的观众。R 最近发布了许多对其shiny app
功能的改进,基本上允许它产生交互式输出。我从没想过学习它,但我知道它就在那里,人们很好地使用它。
作为旁注,我想强调这两种语言之间的主要区别在于Python是一种通用编程语言,由计算机科学、可移植性、部署等开发,并用于计算机科学、可移植性、部署等。它的功能很棒,而且学习起来很简单;没有人不喜欢 python。但它是一种编程语言来做编程。
R另一方面,它是由数学家、物理学家、统计学家和数据科学家发明的。如果你来自这样的背景,那么一切都说得通,因为它完美地反映和再现了统计和数学中使用的概念。但是,相反,如果您来自计算机科学背景并想在 R 中模拟 Java 或 C,您将会失望;它没有标准意义上的“对象”(嗯,它有,但不是人们通常认为的那样......),它没有标准意义上的类(嗯,它有,但不是人们通常认为的那样)认为它们是......),它没有“指针”或所有其他计算机科学结构 - 只是因为它不需要它们。最后但是同样重要的:文档和包易于创建和阅读(如果您使用的是 Rstudio);那里有一个庞大而充满激情的社区,谷歌“如何在 R 中插入随机问题”只需要五秒钟,其第一个条目会将您重定向到具有相应代码的问题的解决方案(由其他人完成) , 立刻。
大多数工业公司的基础设施都是用 Python 构建的(或 Python 友好的环境),可以轻松集成 Python 代码(在import myAnalysis
任何地方都可以,基本上完成了)。但是,任何现代技术或服务器或平台也可以轻松运行后台 R 代码而没有任何问题。
Python 是一种通用的编程语言:因此,除了数据分析之外,它还适用于执行许多其他任务。例如,如果我们想在生产服务器中自动化我们的模型执行,那么 python 是一个非常好的选择。其他示例包括连接到硬件/传感器以读取数据、与数据库交互(关系或非结构化数据,如 JSON)、解析数据、网络编程 (TCP/IP)、图形用户界面、与 shell 交互等。(嗯,为什么数据科学家要做这么多与预测模型无关的任务?我认为人们有不同的定义什么是数据科学家?在某些组织中,解析数据并使用仪表板进行描述性分析对于业务来说已经足够了,而数据还不够成熟,无法进行预测模型。另一方面,在许多小公司中,人们可能期望数据科学家做大量的软件工程。了解 python 将使您独立于其他软件工程师。)
R 有很多比 python 或 MATLAB 更好的统计包。通过使用 R,人们可以真正在模型级别而不是实现细节级别进行思考。这是开发统计模型的巨大优势。比如很多人在python中手动实现神经网络;做这样的工作可能无助于理解神经网络为什么工作,但只是按照配方复制其他人的工作来检查它是否有效。如果我们在 R 中工作,我们可以轻松地专注于模型背后的数学,而不是实现细节。
在许多情况下,人们一起使用它们。在 python 中构建软件很容易,而在 R 中构建模型更好。如果我们想在生产中交付模型而不是论文,我们可能需要两者。如果你的公司有很多软件工程师,你可能需要更多的 R。如果你的公司有很多研究科学家,你可能需要更多的 Python。
各行各业的程序员都低估了语言选择的文化程度。像 Node.js 这样的 Web 开发人员。科学家喜欢 Python。作为一名能够同时处理 Javascript 的流动性和 Java 的僵化的多语言软件工程师,我意识到这些语言在彼此的工作中表现不佳并没有任何内在原因——只是大量的软件包、文档、社区、书籍,等围绕他们。
(由于内在原因,一种随机语言比其他语言更好,请参阅此答案即将发表的评论。)
我个人的预测是,Python 是未来的道路,因为它可以做 R 能做的所有事情——或者更确切地说,R 能做的事情已经足够专职程序员正在努力填补空白了——而且它是一种更好的软件工程语言。软件工程是一门涉及以下方面的学科:
坦率地说,Python 更容易学习。
科学家和统计学家将意识到他们是良好软件工程实践的利益相关者,而不是独立且不受打扰的职业。只是我的观点,但证明学术代码脆弱性的论文将支持这一点。
这个答案是我的全部意见 - 但你问了一个非常自以为是的问题,而且由于到目前为止它很受欢迎,我觉得你应该得到一个朴实无华、合理知情(我希望!)的意见作为回应。Python 对 R 的全面争论有一个严肃的论点,当现实本身可能是党派时,我会失职尝试发布无党派的答案。