這篇文章旨在更客觀地看待這兩門語言。我們會平行使用Python和R分析一個數據集,展示兩種語言在實現相同結果時需要使用什麼樣的代碼。這讓我們了解每種語言的優缺點,而不是猜想。在Dataquest,我們教授兩種語言,並認為兩者在數據科學工具箱中都佔據各自的地位。
我們將會分析一個NBA數據集,包含運動員和他們在2013-2014賽季的表現,可以在這裡下載這個數據集。我們展示Python和R的代碼,同時做出一些解釋和討論。事不宜遲,現在就開始這場硬碰硬的對決吧!
讀取CSV文件R
nba <- read.csv("nba_2013.csv")
Python
import pandasnba = pandas.read_csv("nba_2013.csv")
上面的代碼分別在兩種語言中將包含2013-2014賽季NBA球員的數據的nba_2013.csv文件加載為變量nba。Python中實際的唯一不同是需要加載pandas庫以使用Dataframe。Dataframe在R和Python中都可用,它是一個二維數組(矩陣),其中每列都可以是不同的數據類型。在完成這一步後,csv文件在兩種語言中都加載為dataframe。
統計球員數量R
print(dim(nba))
[1] 481 31
Python
print(nba.shape)
(481, 31)
兩者分別輸出球員數量和數據列數量。我們有481行,或者說球員,和31列關於球員的數據。
查看數據的第一行R
print(head(nba, 1))
player pos age bref_team_id1 Quincy Acy SF 23 TOT[output truncated]
Python
print(nba.head(1))
player pos age bref_team_id0 Quincy Acy SF 23 TOT[output truncated]
它們幾乎完全相同。兩種語言都列印出數據的第一行,語法也非常類似。Python在這裡更面向對象一些,head是dataframe對象的一個方法,而R具有一個單獨的head函數。當開始使用這些語言做分析時,這是一個共同的主題,可以看到Python更加面向對象而R更函數化。
計算每個指標的均值讓我們為每個指標計算均值。如你所見,數據列以類似fg(field goals made)和ast(assists)的名稱命名。它們都是球員的賽季統計指標。如果想得到指標的完整說明,參閱這裡。
R
meanNoNA <- function(values){ mean(values, na.rm=TRUE)}sapply(nba, meanNoNA)
player NApos NAage 26.5093555093555bref_team_id NA[output truncated]
Python
import numpynba_numeric = nba._get_numeric_data()nba_numeric.apply(numpy,.mean, axis=0)
age 26.509356g 53.253638gs 25.571726[output truncated]
這裡有一些明顯的分歧。在兩種方法中,我們均在dataframe的列上應用了一個函數。在python中,如果我們在非數值列(例如球員姓名)上應用函數,會返回一個錯誤。要避免這種情況,我們只有在取平均值之前選擇數值列。
在R中,對字符串列求均值會得到NA——not available(不可用)。然而,我們在取均值時需要確實忽略NA(因此需要構建我們自己的函數)。否則類似x3p.這樣的一些列的均值將會為NA,這一列代表三分球的比例。有些球員沒有投出三分球,他們的百分比就是缺失的。如果我們直接使用R中的mean函數,就會得到NA,除非我們指定na.rm=TRUE,在計算均值時忽略缺失值。
繪製成對散點圖一個探索數據的常用方法是查看列與列之間有多相關。我們將會比較ast,fg和trb。
R
library(GGally)ggpairs(nba[, c("ast", "fg", "trb")])
import seaborn as snsimport matplotlib.pyplot as pltsns.pairplot(nba[["ast", "fg", "trb"]])plt.show()
我們會得到非常相似的兩張圖,但是可以看到R的數據科學生態中有許多較小的軟體包(GGally是最常用的R繪圖包ggplot2的輔助包)和更多的通用可視化軟體包。在Python中,matplotlib是主要的繪圖包,seaborn是一個廣泛用於matplotlib上的圖層。Python中的可視化通常只有一種蛀牙哦的方法完成某件事,而R中可能有許多包支持不同的方法(例如,至少有半打繪製成對散點圖的包)。
另一個很好探索數據的方式是生成類別圖。這將會顯示哪些球員更相似。
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 KMeanskmeans_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_
為了正確的聚類,我們移除了所有非數值列,以及包含缺失值的列。在R中,我們在每一列上應用一個函數,如果該列包含任何缺失值或不是數值,則刪除它。接下來我們使用cluster包實施k-means聚類,在數據中發現5個簇。通過set.seed設置隨機種子以使結果可復現。
在Python中,我們使用了主要的Python機器學習包scikit-learn擬合k-means模型並得到類別標籤。數據準備的過程和R非常類似,但是用到了get_numeric_data和dropna方法。
繪製類別圖我們現在可以按類別繪製球員分布圖以發現模式。首先使用PCA將數據降至2維,然後畫圖,用不同標記或深淺的點標誌類別。
nba2d <- prcomp(nba[,goodCols], center=TRUE)twoColumns <- nba2d$x[,1:2]clusplot(twoColumns, labels)
Python
from sklearn.decomposition import PCApca_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中,我們通過聚類庫中的函數clusplot函數繪圖,使用內建函數pccomp實行PCA。
在Python中,我們使用scikit-learn庫中的PCA類,使用matplotlib創建圖形。
(未完待續)來源:數據分析網
原文地址:http://www.afenxi.com/post/8975
《橫掃offer---程式設計師招聘真題詳解700題》,開點工作室著,清華大學出版社出版,天貓、京東等各大網上書店及實體書店均已開始發售。