# r语言和python_r语言和python数据分析

5221℃

r语言和python_硬碰硬的数据分析

```R
Python
import pandas

#### 统计球员数量

```R
print(dim(nba))
[1] 481 31
Python
print(nba.shape)
(481, 31)```

```R
player pos age bref_team_id
1 Quincy Acy SF 23 TOT
[output truncated]
Python
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)
url <-
getURL(url)
tc <- textConnection(page)
close(tc)
Python
import requests
requests.get(url).content```

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更加函数化，Python更面向对象

R包含更多的数据分析内建功能，Python依赖于第三方软件包。

Python拥有“主要的”数据分析包，R拥有由较小的包组成的更大的生态系统

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

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

Python中完成非统计任务通常更加直接

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

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

• 在线沟通，请点我在线咨询

• 咨询热线：
13261671783
客服qq：
3285157825