坎德人的小包包

欧剃,游荡的坎德人,在他的旅途中收集了许许多多有趣的东西。

发表日期:2018-08-15

聊聊用 Python 和/或 R 搞数据科学的异同

—— 应读者要求,今天跟大家分享一篇数据科学的干货文章。无论你是纠结于该选 Python 还是 R 的初学者,还是你在犹豫某个项目用哪种语言来分析更好,希望这篇...

作者:Brian Ray


应读者要求,今天跟大家分享一篇数据科学的干货文章。无论你是纠结于该选 Python 还是 R的初学者,还是你在犹豫某个项目用哪种语言来分析更好,希望这篇文章能给你一点小小的帮助。

免责声明(并不是):我目前就职于全球雇佣数据科学家最多的企业之一(Deloitte),负责管理一批数据科学家。一二十年前我就给人提供 R 和 Python 语言的咨询服务。我并没有特别信仰哪种编程语言,但近15年来,我一直和 Python 社区有着密切的联系。那么,下面这篇文章就是我个人的观点。


Python?R?并非只能二选一!

在撰写本文之前,RStudio 的首席数据科学家 Hadley Wickham 在社交网络上给我发了个回复(见上图)。在他的启发下,我也意识到,R 和 Python 并不是你死我活的关系,完全可以相互协作嘛。这个点子一直在我脑海里徘徊,我将在文章的末尾讲讲这个做法。

那么,让我们开始吧!

语言发展的历史

简单地来说:

ABC语言 -> 发明 Python (1989年,作者 Guido van Rossum)-> Python 2 (2000年) -> Python 3 (2008年)

Fortan 语言 -> S 语言(贝尔实验室)-> 发明 R (1991年,作者 Ross Ihaka 和 Robert Gentleman) -> R 1.0.0 (2000年) -> R 3.0.2 (2013年)

社区活跃情况

在比较 Python 与 R 语言的用户群时,请先记住一点:

只有 50% 的 Python 用户和 R 语言的用户重叠。

这是假设所有的 R 语言用户都把这个编程语言用于“科学及数学计算”。同时,我们断定不管是哪个水平段的程序员,他们的使用场景分布也大致符合上图的规律。

想了解更多 Python 语言的“八卦”,可以点击这里看看另一篇问卷结果分析文章。

如果我们打算只对比科学和数学计算的用户群,那么,我们就要面临第二个问题:具体是哪些用户呢?

在庞大的科学和数学计算群体中,还存在各种不同的子社群,它们之间虽然有些重叠,但总体来说,他们和 Python 与 R 的关系还是差别挺大的。

以下是一些依赖 Python 和 R 语言的子社群:

  • 深度学习(Deep Learning)
  • 机器学习(Machine Learning)
  • 高级分析(Advanced Analytics)
  • 预测分析(Predictive Analytics)
  • 统计学(Statistics)
  • 数据探索和分析(Exploration and Data Analysis)
  • 学术与科学研究(Academic Scientific Research)

…以及数不胜数的各类科学计算领域研究项目。

由于每个领域都有自成一体的社区,你可能会发现在统计学和数据探索等方面,R 语言更为流行一些。在不久之前,用 R 语言设计运行并完成一些相当有意义的数据探索,花的时间比安装 Python 并完成类似的数据探索任务要少得多。

但自从 Jupyter Notebooks 和 Anaconda 横空出世,一切都变得不一样了。

注:Jupyter Notebooks 让用户可以在浏览器里编写运行 Python 或 R 代码;Anaconda 提供了一个简单方便的 Python 或 R 语言的包管理工具。

从此,你拥有了一套即开即用的,适合提供数据分析与报告的编程环境。曾经横亘在技术任务和编程语言之间的环境壁垒被打破了。Python 终于有了一套不依赖于某个平台的数据分析环境。

另外一个对选语言有着重大影响的社区因素,就是“开源”。这指的不单是那些开源的代码库,还有共同合作为开源贡献力量的整个社区群体。目前许多开源授权的开发软件都同时有 Python 和 R 语言的绑定(比如 Tensorflow 和 GNU 科学库,分别采用了 Apache 和 GPL 的开源授权协议)。然而讽刺的是,未采用 GPL 授权的 Python 在开源界获得的支持似乎大大超过采用了 GPL 授权的 R 语言 —— 后者因为其在统计分析方面的重大作用,获得了许多来自私营企业(特别是有统计学背景的企业)的支持。

最后,考虑到社区协作,就不能不提到全球最大的“同性交友社区” —— Github。Github 上目前 Python 项目获得的关注可是远超 R 语言。比如,Tensorflow 这样广受关注的 Python 项目,已获得了超过 3.5 万个星。而另一方面,最受关注的 R 语言项目,比如 Shiny 、 Stan 等,一般也很少能超过 2 千个星。

运行速度

运行速度方面其实不具有可比性。因为不同的编程语言的使用场景完全不同,度量指标也难以统一。此外,不同语言对某些操作的优化程度也不尽相同,甚至在不同的硬件上跑出的结果也可能会大相径庭。这种比较实在是吃力不讨好 —— 就算你做的再详尽,也不可能涵盖到每一个细节,然后某个语言的脑残粉就会跳出来喷的你满地找牙。不过,管他呢,反正我也不打算搞什么严谨的测试。

来个简单粗暴的循环比赛吧

在实际开始前,让我们再稍稍暂停一下。你看,我们是要拿 Python 来和 R 做对比,但你真的会拿 R 来搞一大堆循环吗?这两个语言在设计用法上就不是这样搞的吧?

不过为了满足大家的好奇心,我还是运行了一下下面的代码:


Python 的运行时间是 0.000037 秒,而 R 是 0.00158 秒

让我检查一下:包括载入和运行时间在内,R 的实际运行时间在 0.238 秒,Python 在 0.147 秒。不过我要再次强调,这不是一个很科学的测试。

这个测试有点过分简单粗暴了。没错,跑循环 Python 看起来快很多,但这真的有用吗?

对数据科学家来说,哪种速度才是最重要的?近年来,Python 和 R 更多地被用作指令语言,而常用的数据分析和处理工作都由第三方库完成(比如 Python 基本上强烈依赖 Pandas 库)。于是,我们的讨论话题其实就变成哪个语言能更好更快地利用第三方库资源来完成任务——这个比较起来才有意义。

第三方库支持

包管理工具

Python 有 PyPI,R 有 CRAN,Anaconda 这个神器,两者都能用。

CRAN 采用它的发行版内置的 install.packages 命令来安装所需的第三方库。到目前为止,CRAN 上已经有大约 1.2 万个第三方包,其中大约一半多一点是数据科学方向的,也就是大概6000多个吧。

PyPi 上的包数量差不多有 CRAN 的十倍还多:14.1万个,其中含有“科学”或“工程”类标签的包大约有3700多个。此外还有一些可以用作数据分析或科学计算使用的包,因为未标上标签,所以未被我们统计在内。

所以,基本上不管你用哪种语言,都不太可能发生不得不重复造轮子的情况。没错,如果你用 PyPi 搜索“Random Forest”(随机森林,一种机器学习算法),你可能会发现它给你返回了 170 个项目,不过这些结果里的软件包似乎并不相同啦。

所以,虽然 Python 的第三方包数量比 R 多出了十倍,实际可用的科学计算和数据科学库其实跟 R 差不多——甚至还略少一点。

第三方库的可用性是相当重要的。毕竟如果什么都得靠自己从底层开始写,这可太挫折了。同样的,如果你用你喜欢的语言搞出了什么特别好用的玩意,希望你也能将它回馈给开源社区。

数据分析的速度才是关键

那么,我们就用 R 和 Python 上最具代表性的 DataFrames 和 Pandas 库,来代表两门语言进行一场比试吧。

我们的实验方法如下:用两种语言分别对同一个数据集执行数据探索,测量并对比每一个分步骤的执行时间。测试结果如下:


Python 在大部分的任务中的速度都比较快。

测试脚本的源代码可以在这里下载

正如上面显示的,Python + Pandas 比 R 自带的 DataFrames 快了不少。请注意,这并不意味着 Python 运行库速度很快。Pandas 基本上是基于 Numpy,而后者是用 C 写的。

绘制个可视化看看!

实际上,这就变成了 ggplot2 和 matplotlib 的对决。声明:matplotlib 的作者,是我在整个 Python 社区里最尊敬的人,也是教我学 Python 的导师,John D. Hunter。

那么,在我看来,Matplotlib 就像一只 800 磅重的大猩猩,壮实、扩展性好,但你若要想自定义调教它,可以是可以,不过得花上好多精力去学习和理解。当然,你若要想自定义 ggplot,也不是啥容易的事,有些人甚至会说这玩意更难调。

但是,如果你也跟我一样喜欢漂亮的图形,也不需要任何自定义的话,R 就是我的首选。如果你需要做出比 Matplotlib 更漂亮的东西,或是需要可交互的功能的话,那你应该试试 bokeh 。类似的,在 R 语言下,你可以试试 ShinnyR ,它提供了你在寻找的那些交互功能。

我们就不能好好相处吗?

对,也许有人会问,为啥我们不能同时利用这两个语言呢?

对,在有那么几种情况下,你确实可以把两种语言混在一起用。比如:

  • 你所在的公司或者机构允许你这么玩。
  • 你能方便快捷地搭建和维护这样的工作环境。
  • 你不需要迁移代码到别的系统上去。
  • 你并不打算拿这一团混沌的代码去祸害其他小朋友。

如果你已经打定主意这么干,下面有几种方法你可以试试:

  • Python 封装的 R 语言包,比如 rpy2、pyRserve、Rpython 等(rpy2的插件能让你在 Jupyter notebook 里写 R 代码)
  • R 语言的其他实现,比如 rPython、PythonInR、reticulate、 rJython、 SnakeCharmR 以及 XRPython 等(这里有一个关于 reticulate 的介绍)
  • 直接在 Jupyter Notebook 里把它们混着用,比如下面这样:

上面这样处理完之后,我们就可以把 pandas 的 dataframe 对象传给 ggplot2,它将会通过 rpy2 插件自动转换成一个 R 语言的 Dataframe。(需要传入 -i df 开关参数)

以上脚本的源代码见此处

谁更爱用 R,谁更爱 Python ?

数据科学云服务 Kaggle 上有人写了一个项目,用来预测一个分析师更爱用 R 还是 Python。根据观测到的数据,他提出了几个有趣的结论:

  • 如果你接下来的一年内考虑迁移到 Linux,你更有可能是 Python 用户。
  • 如果你学的是统计学,那你更可能用 R,而如果你学的是计算机科学,那基本 Python 没跑了。
  • 如果你比较年轻(比如18-24岁),你更可能用 Python。
  • 如果你参加代码大赛,你更可能用 Python。
  • 如果你接下来想要弄个机器人什么的,你更可能用 Python。
  • 如果你接下来想要学 SQL,你更可能用 R。
  • 如果你习惯用微软的 Office,你更可能是 R 语言的用户。
  • 如果你想要搞个树莓派,你更可能用 Python。
  • 如果你是个全日制学生,你更可能用 Python。
  • 如果你用敏捷方法,你更可能用 Python。
  • 如果你对人工智能表示担心,而不是兴奋,那你很有可能用 R 语言。

关于选择倾向

当我和著名的 Googler 兼 Stack Overflow 大佬 Alex Martelli 合作时,他曾跟我解释过,为啥 Google 初创时只用那几种他们官方支持的语言。即使在 Google 这样充满自由创新精神的地方,似乎还是有这样一些限制的。有些选择是由整个公司的倾向所决定的。

但对于一个企业,一个社团来说,总得有人做第一个吃螃蟹的人。比如我就认识那个在Deloitte(德勤)里第一个用 R 的家伙,他现在还没跳槽,已经是首席数据科学家了。

因此,我个人的总体建议是(划重点),跟随自己内心的喜好,正视自己的选择,在团队里做到最好,并热爱自己的事业。

另外,给初入行数据科学领域的新人一点忠告。虽然我从来就不是一个唯工具优先论者,但如果你需要处理一些很重要的东西,倘若不经过认真分析,随便乱选一个工具,可不是什么明智的事情。

没错,错误是难免的。然而,每一个设计良好的数据科学项目,都给未来的数据科学家留下了一些空间。试着利用这些项目,学习、尝试,提升自己,保持开放的心态,拥抱多样性吧。

最后,我承认,我主要还是依赖 Python,不过我也在不断学习关于 R 语言的知识,不管有没有和 Python 一起,这两门语言都值得你花时间了解一下。


你更喜欢哪门语言,又是为什么呢?欢迎在下面给我留言!

(本文已投稿给「优达学城」并发表。 原作: Brian Ray 译者:欧剃 转载请保留此信息)

编译来源: https://blog.usejournal.com/python-vs-and-r-for-data-science-833b48ccc91d

标签:UdacityTranslatePythonData-Science

Powered by Jekyll on Github.io
2022 © 欧剃