# 【Python环境】R vs Python：硬碰硬的数据分析

## 读取CSV文件

R

`nba <- read.csv("nba_2013.csv")`

Python

```import pandas

## 统计球员数量

R

`print(dim(nba))`
`[1] 481  31`

Python

`print(nba.shape)`
`(481, 31)`

## 查看数据的第一行

R

`print(head(nba, 1))`
```      player pos age bref_team_id
1 Quincy Acy  SF  23          TOT
[output truncated]```

Python

`print(nba.head(1))`
```       player pos  age bref_team_id
0  Quincy Acy  SF   23          TOT
[output truncated]```

## 计算每个指标的均值

R

```meanNoNA <- function(values){
mean(values, na.rm=TRUE)
}
sapply(nba, meanNoNA)```
```player NA
pos NAage 26.5093555093555
bref_team_id NA
[output truncated]```

Python

```import numpy
nba_numeric = nba._get_numeric_data()
nba_numeric.apply(numpy,.mean, axis=0)```
```age             26.509356
g               53.253638
gs              25.571726
[output truncated]```

## 绘制成对散点图

R

```library(GGally)
ggpairs(nba[, c("ast", "fg", "trb")])```
```import seaborn as snsimport matplotlib.pyplot as plt
sns.pairplot(nba[["ast", "fg", "trb"]])
plt.show()```

## 对球员聚类

R

```library(cluster)
set.seed(1)
isGoodCol <- function(col){
sum(is.na(col)) == 0 && is.numeric(col)
}
goodCols <- sapply(nba, isGoodCol)
clusters <- kmeans(nba[,goodCols], centers=5)
labels <- clusters\$cluster```

Python

```from sklearn.cluster import KMeans
kmeans_model = KMeans(n_clusters=5, random_state=1)
good_columns = nba._get_numeric_data().dropna(axis=1)
kmeans_model.fit(good_columns)
labels = kmeans_model.labels_```

## 绘制类别图

```nba2d <- prcomp(nba[,goodCols], center=TRUE)
twoColumns <- nba2d\$x[,1:2]
clusplot(twoColumns, labels)```

Python

```from sklearn.decomposition import PCA
pca_2 = PCA(2)
plot_columns = pca_2.fit_transform(good_columns)
plt.scatter(x=plot_columns[:,0], y=plot_columns[:,1], c=labels)
plt.show()```

## 划分训练集和测试集

R

```trainRowCount <- floor(0.8 * nrow(nba))
set.seed(1)
trainIndex <- sample(1:nrow(nba), trainRowCount)
train <- nba[trainIndex,]
test <- nba[-trainIndex,]```

Python

```train = nba.sample(frac=0.8, random_state=1)
test = nba.loc[~nba.index.isin(train.index)]```

## 一元线性回归

R

```fit <- lm(ast ~ fg, data=train)
predictions <- predict(fit, test)```

Python

```from sklearn.linear_model import LinearRegression
lr = LinearRegression()
lr.fit(train[["fg"]], train["ast"])
predictions = lr.predict(test[["fg"]])```

Scikit-learn包含一个线性回归模型，我们可以通过它拟合并生成预测。R依赖于内建函数`lm``predict``predict`根据传递给它拟合模型的不同会表现出不同的行为，它可以被用于各种各样的模型。

## 计算模型统计量

R

`summary(fit)`
```Call:
lm(formula = ast ~ fg, data = train)

Residuals:
Min      1Q  Median      3Q     Max
-228.26  -35.38  -11.45   11.99  559.61
[output truncated]```

Python

```import statsmodels.formula.api as sm
model = sm.ols(formula='ast ~ fga', data=train)
fitted = model.fit()
print(fitted.summary())```
```OLS Regression Results
============================
Dep. Variable:                    ast
R-squared:                       0.568
Model:                            OLS
[output truncated]```

## 拟合一个随机森林模型

R

```library(randomForest)
predictorColumns <- c("age", "mp", "fg", "trb", "stl", "blk")
rf <- randomForest(train[predictorColumns], train\$ast, ntree=100)
predictions <- predict(rf, test[predictorColumns])```

Python

```from sklearn.ensemble import RandomForestRegressor
predictor_columns = ["age", "mp", "fg", "trb", "stl", "blk"]
rf = RandomForestRegressor(n_estimators=100, min_samples_leaf=3)
rf.fit(train[predictor_columns], train["ast"])
predictions = rf.predict(test[predictor_columns])```

## 计算误差

R

`mean((test["ast"] - predictions)^2)`
`4573.86778567462`

Python

```from sklearn.metrics import mean_squared_error
mean_squared_error(test["ast"], predictions)```
`4166.9202475632374`

Python中的scikit-learn库包含我们可以使用的各种误差量度。在R中，可能有一些小的第三方库计算MSE，但是两种语言中手动计算它都很容易。误差的细微差异几乎可以肯定是由于参数调整造成的，并没什么关系。

## 下载一个网页

R

```library(RCurl)
tc <- textConnection(page)
close(tc)```

Python

```import requests

Python中的requests包为所有的请求类型使用统一的API接口，下载网页非常容易。在R中，RCurl提供稍微复杂方法发起请求。两者都把网页下载为字符串类型的数据。注：这在R中的下一步并不是必须，只是为了比较的原因。

## 抽取球员比分

R

```library(rvest)
table <- html_nodes(page, ".stats_table")[3]
rows <- html_nodes(table, "tr")
cells <- html_nodes(rows, "td a")
teams <- html_text(cells)

extractRow <- function(rows, i){
if(i == 1){
return
}
row <- rows[i]
tag <- "td"
if(i == 2){
tag <- "th"
}
items <- html_nodes(row, tag)
html_text(items)
}

scrapeData <- function(team){
teamData <- html_nodes(page, paste("#",team,"_basic", sep=""))
rows <- html_nodes(teamData, "tr")
lapply(seq_along(rows), extractRow, rows=rows)
}

data <- lapply(teams, scrapeData)```

Python

```from bs4 import BeautifulSoupimport re
soup = BeautifulSoup(data, 'html.parser')
box_scores = []for tag in soup.find_all(id=re.compile("[A-Z]{3,}_basic")):
rows = []    for i, row in enumerate(tag.find_all("tr")):
if i == 0:
continue
elif i == 1:
tag = "th"
else:
tag = "td"
row_data = [item.get_text() for item in row.find_all(tag)]
rows.append(row_data)
box_scores.append(rows)```

R代码比Python更复杂，因为它没有一个方便的方式使用正则表达式选择内容，因此我们不得不做额外的处理以从HTML中得到队伍名称。R也不鼓励使用`for`循环，支持沿向量应用函数。我们使用`lapply`做到这一点，但由于需要处理的每一行都因是否是标题而异，需要传递保留项的索引和整个`rows`列表给函数。

## 结论

#### 总体上R有更多的统计支持

R是作为统计语言被构建的，它也显示了这一点。Python中的`statsmodels`和其他软件包提供了统计方法的大部分实现，但是R的生态系统要大的多。

#### 数据分析工作流在两者之间有许多相似之处

R和Python之间有一些互相启发的地方（pandas的Dataframe受到R中dataframe的影响，rvest包来自BeautifulSoup的启发），两者的生态系统都在不断发展壮大，对两种语言中许多共同的任务来说，语法和实现都是非常相似的。

## 总结

0 条评论

• ### 【知识】2017年数据科学Top12的Python库

Python深受数据科学家和数据工程师的喜爱。 ? 本文总结2017年数据科学的Top12的Python库。 核心库 1 numpy 它是最基础库，是众多Py...

• ### 【Python环境】Python Anaconda简介及安装

Python虽然是一门优秀的程序语言，但其拥有出色的数据处理能力，尤其是在数据量巨大的时候，因而也吸引了不少数据分析人员的关注和使用。 Python的数据处理能...

• ### 【Python环境】Python面试题汇总(一)

拿网络上关于Python的面试题汇总了，给出了自认为合理的答案，有些题目不错，可以从中学到点什么，答案如不妥，请指正...... +++++++++++++++...

• ### R语言vs Python：数据分析哪家强？

本文章旨在更客观地看待这两门语言。我们会平行使用Python和R分析一个数据集，展示两种语言在实现相同结果时需要使用什么样的代码。这让我们了解每种语言的优缺点，...

• ### 如何用《玉树芝兰》入门数据科学？

链接起散落的文章，给《玉树芝兰》数据科学系列教程做个导读，帮你更为高效入门数据科学。

• ### 在CentOS7下同时安装、使用Python2.x和Python3.x

一般情况下，各类Linux操作系统是会默认安装Python2.x的，在最新的CentOS7.4版本中，发现系统默认只安装了Python2.x，而且是很多系统组件...

• ### 文科生英语专业出身，Python和爬虫照样玩的溜，所以我们没有理由学不好，其他的大都是借口

先简单自我介绍下，文科生，英语专业，今年大学本科刚毕业。最开始接触编程是在大四前的那个暑假，由于自己性格偏内向，不太喜欢过多的人际交往，想着往技术方向发展，加上...

• ### Python 3.8即将发布，这几个变化你必须知道

【导读】近日， Python 3.8.0b1 版本和 beta 版相继发布， Python 3.8 版的新特征已经基本成型。尽管最终版本的官方发布时间为 10 ...

• ### 麻省理工教授推荐，看这本书的实战指导足够学好Python，经典指导

今天我给你介绍的这本书，也许会让你开始改变这 种想法，因为这本书上的练习和案例以及指导本身就足够学好Python了。

• ### 备战520｜Python花式表白的几种姿势

当然图片你可以随便选择，爱心、玫瑰、钻石都可以，并且关于词云图的绘制方法我们已经讲了很多，比如上面的图就是用Wordcloud制作。唯一的难点就是如何将你们之间...