来源:
我们会得到非常相似的两张图,但是可以看到R的数据科学生态中有许多较小的软件包(GGally是最常用的R绘图包ggplot2的辅助包)和更多的通用可视化软件包。在Python中,matplotlib是主要的绘图包,seaborn是一个广泛用于matplotlib上的图层。Python中的可视化通常只有一种蛀牙哦的方法完成某件事,而R中可能有许多包支持不同的方法(例如,至少有半打绘制成对散点图的包)。
对球员聚类
另一个很好探索数据的方式是生成类别图。这将会显示哪些球员更相似。
为了正确的聚类,我们移除了所有非数值列,以及包含缺失值的列。在R中,我们在每一列上应用一个函数,如果该列包含任何缺失值或不是数值,则删除它。接下来我们使用cluster包实施k-means聚类,在数据中发现5个簇。通过设置随机种子以使结果可复现。
在Python中,我们使用了主要的Python机器学习包scikit-learn拟合k-means模型并得到类别标签。数据准备的过程和R非常类似,但是用到了和方法。
绘制类别图
我们现在可以按类别绘制球员分布图以发现模式。首先使用PCA将数据降至2维,然后画图,用不同标记或深浅的点标志类别。
在R中,我们通过聚类库中的函数函数绘图,使用内建函数实行PCA。
在Python中,我们使用scikit-learn库中的PCA类,使用matplotlib创建图形。
划分训练集和测试集
如果我们希望进行监督性机器学习,将数据划分为训练集和测试集是一个避免过拟合的好办法。
你能注意到R有更多的数据分析内建函数,例如,和,这些函数在Python中通过第三方库被调用(,,)。在Python中,最新版本的pandas包含一个方法,返回对原始dataframe确定比例的随机抽样,这使得代码更加简洁。在R中,有很多包可以使抽样更容易,但是没有一个比使用内置函数更简洁。在两个例子中,我们都设置了随机种子以保证结果的可重复性。
一元线性回归
假设我们希望通过球员的得分预测其助攻次数。
Scikit-learn包含一个线性回归模型,我们可以通过它拟合并生成预测。R依赖于内建函数和。根据传递给它拟合模型的不同会表现出不同的行为,它可以被用于各种各样的模型。
计算模型统计量
如果希望得到类似R平方值这样的模型统计量,在Python中需要比R多做一点。在R中,我们可以使用内建函数得到模型信息。在Python中,我们需要使用statsmodels包,这个包包含许多统计模型的Python实现。我们得到类似的结果,总体来说在Python中进行统计分析稍有点困难,一些R中存在的统计方法也没有存在于Python。
拟合一个随机森林模型
一元线性回归表现的不错,但是我们怀疑数据中可能存在非线性。因此,我们想要拟合一个随机森林模型。
这里主要的区别是R需要使用randomForest库实现算法,而Python中的scikit-learn直接内建其中。scikit-learn为许多不同的机器学习算法提供了统一的交互接口,在Python中每种算法通常只有一个主要的实现。而R中有许多包含单个算法较小的包,一般访问的方法并不一致。这导致算法更加的多样化(很多算法有多个实现,还有那些新问世的算法),但是只有一小部分是可用的。
计算误差
现在已经拟合了两个模型,下面让我们计算误差,使用MSE
Python中的scikit-learn库包含我们可以使用的各种误差量度。在R中,可能有一些小的第三方库计算MSE,但是两种语言中手动计算它都很容易。误差的细微差异几乎可以肯定是由于参数调整造成的,并没什么关系。
下载一个网页
现在已经有了2013-2014赛季的NBA球员数据,让我们抓取一些额外数据补充它。为了节省时间,在这里看一场NBA总决赛的比分。
Python中的requests包为所有的请求类型使用统一的API接口,下载网页非常容易。在R中,RCurl提供稍微复杂方法发起请求。两者都把网页下载为字符串类型的数据。注:这在R中的下一步并不是必须,只是为了比较的原因。
抽取球员比分
现在我们已经下载了网页,需要处理它以抽取球员比分。
)[]rows-html_nodes(table,)cells-html_nodes(rows,)teams-html_text(cells)extractRow-function(rows,i){
if(i==){
return}row-rows[i]tag-if(i==){tag-}items-html_nodes(row,tag)html_text(items)}scrapeData-function(team){teamData-html_nodes(page,paste(,team,,sep=))rows-html_nodes(teamData,)lapply(seq_along(rows),extractRow,rows=rows)}data-lapply(teams,scrapeData)
pile()):rows=[]fori,rowinenumerate(tag.find_all()):
ifi==:
continueelifi==:tag=else:row_data=[item.get_text()foriteminrow.find_all(tag)]rows.append(row_data)box_scores.append(rows)
这将创建一个包含两个列表的列表,第一个是的比分,第二个是的比分。两个都有标题,以及每个球员和他们的比赛统计。我们现在不会将其转换为更多的训练数据,但是如果需要把它们加入dataframe,转换可以很容易地完成。
R代码比Python更复杂,因为它没有一个方便的方式使用正则表达式选择内容,因此我们不得不做额外的处理以从HTML中得到队伍名称。R也不鼓励使用循环,支持沿向量应用函数。我们使用做到这一点,但由于需要处理的每一行都因是否是标题而异,需要传递保留项的索引和整个列表给函数。
我们使用,一个广泛使用的新R网络抓取包实现抽取数据,注意这里可以直接传递url给rvest,因此上一步在R中并不是必须的。
在Python中,我们使用了BeautifulSoup,一个最常用的web抓取包。它让我们可以在标签间循环,并以一种直接的方式构建列表的列表。
结论
我们已经看到了如何使用R和Python分析一个数据集。还有很多任务没有深入,例如保存和分享分析结果,测试,确保生产就绪,以及构建更多的可视化。我们会在近期继续探讨这些,从而得到更明确的结论。现在,下面是一些能够得到的:
R更加函数化,Python更面向对象
就像我们在,和其他函数中看到的那样,R用函数完成大部分工作。对比Python中的`LinearRegression类,还有dataframe的sample方法。
R包含更多的数据分析内建功能,Python依赖于第三方软件包。
当我们查看汇总统计量时,在R中可以直接使用内建函数,但是Python中必须依靠statsmodels包。dataframe是R内置的结构,而在Python中由包引入。
Python拥有“主要的”数据分析包,R拥有由较小的包组成的更大的生态系统
在Python中,我们可以使用scikit-learn完成线性回归,随机森林和许多其他任务。它提供了一致的API,并很好的维护。在R中,我们有多种多样的包,但是也更加碎片化和不一致(线性回归是内置的,是单独的包,等等)。
总体上R有更多的统计支持
R是作为统计语言被构建的,它也显示了这一点。Python中的和其他软件包提供了统计方法的大部分实现,但是R的生态系统要大的多。
Python中完成非统计任务通常更加直接
有了类似BeautifulSoup和request这样良好维护的软件包,Python中的网页抓取远易于R。这种说法也适于我们还未关注的其他任务,例如保存数据库,部署web服务器或运行复杂的工作流。
数据分析工作流在两者之间有许多相似之处
R和Python之间有一些互相启发的地方(pandas的Dataframe受到R中dataframe的影响,rvest包来自BeautifulSoup的启发),两者的生态系统都在不断发展壮大,对两种语言中许多共同的任务来说,语法和实现都是非常相似的。
总结
在Dataquest,我们首先教授Python,但是最近也加入了R的课程。我们看到这两种语言是互补的,虽然Python在更多领域更强大,但R是一种高效的语言。它可以作为Python在数据探索和统计等领域的补充,或者你惟一的数据分析工具。正如本文中所显示的,两种语言有许多相似的语法和实现方法,你不能在一个或另一个,或者两者中出错。
回复下列数字即可获得相应干货下载:
:一百多篇大数据文档下载!
:超全数据分析资料免费下载!(包括SQL,R语言,SPSS,SAS,python,数据分析和数据挖掘)
:清华大学数据科学院讲座内容集锦免费下载!
:20G!超全数据分析视频教程免费下载!(包括R语言,SPSS,统计学基础,excel,数据挖掘,医学统计)
:Python超全资料分享!
设置首页-搜狗输入法-支付中心-搜狐招聘-广告服务-客服中心-联系方式-保护隐私权-AboutSOHU-公司介绍-网站地图-全部新闻-全部博文
搜狐不良信息举报邮箱:
推荐: