数据科学入门丨选Python还是R


作者 Brian Ray
编译 Mika 本文为 CDA 数据分析师原创作品,转载需授权
对于想入门数据科学的新手来说,选择学Python还是R语言是一个难题,本文对两种语言进行了比较,希望能帮助你做出选择。
我是德勤的数据科学家主管,多年来我一直在使用Python和R语言,并且与Python社区密切合作了15年。本文是我对这两种语言的一些个人看法。
第三种选择

针对这个问题,Studio的首席数据科学家Htley Wickham认为,比起在二者中选其一,更好的选择是让两种语言合作。因此,这也是我提到的第三种选择,我在文本最后部分会探讨。
如何比较R和Python
对于这两种语言,有以下几点值得进行比较:
· 历史:
R和Python的发展历史明显不同,同时有交错的部分。
· 用户群体:
包含许多复杂的社会学人类学因素。
· 性能:
详细比较以及为何难以比较。
· 第三方支持:
模块、代码库、可视化、存储库、组织和开发环境。
· 用例:
根据具体任务和工作类型有不同的选择。
· 是否能同时使用:
在Python中使用R,在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语言的程序员都用R进行相关“科学和数字”研究。可以确定无论程序员的水平如何,这种统计分布都是真实。
这里回到第二个问题,有哪些用户群体。整个科学和数字社区包含几个子群体,当中存在一些重叠。
使用Python或R语言的子群体:
· 深度学习
· 机器学习
· 高级分析
· 预测分析
· 统计
· 探索和数据分析
· 学术科研
· 大量计算研究领域
虽然每个领域几乎都服务于特定群体,但在统计和探索等方面,使用R语言更为普遍。在不久之前进行数据探索时,比起Python,R语言花的时间更少,而且使用Python还需要花时间进行安装。
这一切都被称为Jupyter Notebooks和Anaconda的颠覆性技术所改变。
Jupyter Notebook :增加了在浏览器中编写Python和R代码的能力;
Anaconda :能够轻松安装和管理Python和R。
现在,你可以在友好的环境中启动和运行Python或R,提供开箱即用的报告和分析,这两项技术消除了完成任务和选择喜欢语言间的障碍。Python现在能以独立于平台的方式打包,并且更快地提供快速简单的分析。
社区中影响语言选择的另一个因素是“开源”。不仅仅是开源的库,还有协作社区对开源的影响。讽刺的是,Tensorflow和GNU Scientific Library等开源软件(分别是Apache和GPL)都与Python和R绑定。虽然使用R语言的用户很多,但使用Python的用户中有很多纯粹的Python支持者。另一方面,更多的企业使用R语言,特别是那些有统计学背景的。
最后,关于社区和协作,Github对Python的支持更多。如果看到最近热门的Python包,会发现Tensorflow等项目有超过3.5万的用户收藏。但看到R的热门软件包,Shiny、Stan等的收藏量则低于2千。
性能
这方面不容易进行比较。
原因是需要测试的指标和情况太多。很难在任何一个特定硬件上测试。有些操作通过其中一种语言优化,而不是另一种。
循环
在此之前让我们想想,如何比较Python与R。你真的想在R语言写很多循环吗?毕竟这两种语言的设计意图不太相同。
{
"cells": [
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"%load_ext rpy2.ipython"
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"def do_loop(u1):\n",
"\n",
" # Initialize `usq`\n",
" usq = {}\n",
"\n",
" for i in range(100):\n",
" # i-th element of `u1` squared into `i`-th position of `usq`\n",
" usq[i] = u1[i] * u1[i]\n"
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"%%R\n",
"do_loop <- function(u1) {\n",
" \n",
" # Initialize `usq`\n",
" usq <- 0\n",
"\n",
" for(i in 1:100) {\n",
" # i-th element of `u1` squared into `i`-th position of `usq`\n",
" usq[i] <- u1[i]*u1[i]\n",
" }\n",
"\n",
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
"name": "stdout",
"output_type": "stream",
"text": [
"1.58 ms ± 42.8 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)\n"
"source": [
"%%timeit -n 1000\n",
"%%R\n",
"u1 <- rnorm(100)\n",
"do_loop(u1)"
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
"name": "stdout",
"output_type": "stream",
"text": [
"36.9 µs ± 5.99 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)\n"
"source": [
"%%timeit -n 1000\n",
"u1 = np.random.randn(100)\n",
"do_loop(u1)"
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",