R語言分析NBA球員數據

NBA的比賽數據真的很適合做數據分析、數據可視化方面的練習,建議大家在kaggle上下載原數據自己試一試NBA shot logs | Kaggle。

一個月前寫了一篇「用R語言進行NBA賽況分析」用R語言進行NBA賽況分析 - 知乎專欄,這篇算是續篇,進一步發掘一些更有價值的數據,沒看過上一篇的朋友建議先看一下上一篇文章,了解數據原的大概內容。

設立目標:

數據預處理:

本次分析還要用到我們上一篇中用過的幾個工具包,和自定義的兩個函數,所以先載入相應代碼(具體參見用R語言進行NBA賽況分析 - 知乎專欄):

#載入包 library(dplyr) library(magrittr) library(ggplot2) library(ggthemes) library(reshape2)#定義函數,用於計算後面每位球員的2分球命中次數two_get<-function(x){ count<-length(x) n<-0 for(i in 1:count){ if(x[i]==2) n<-n+1 } return(n)}#定義函數,用於計算後面每位球員的3分球命中次數three_get<-function(x){ count<-length(x) n<-0 for(i in 1:count){ if(x[i]==3) n<-n+1 } return(n)}

本次分析要針對128069條的所有觀測,分析的對象是所有球員,所以首先將12萬條數據根據不同球員進行分組統計,得到我們想要的變數:

#統計每位球員的投籃次數、命中次數、總得分、1分2分3分命中次數by_name<-group_by(shot_logs,player_name)%>% summarise(count=n(), made_num=sum(FGM), points=sum(FGM*PTS_TYPE), three_pts_num=three_get(as.numeric(PTS)), two_pts_num=two_get(as.numeric(PTS)), one_pts_num=made_num-two_pts_num-three_pts_num)

看來數據里不包括罰籃(1分球)......

目標1:線性分析

我們想知道球員的出手次數和得分是否線性相關、相關的強弱程度,可以把count變數作為自變數,points變數作為因變數,用lm()函數做一個簡單的一元線性回歸:

> revelant<-lm(by_name$points~by_name$count,data = by_name)#用summary()函數得到相關參數> summary(revelant)Call:lm(formula = by_name$points ~ by_name$count, data = by_name)Residuals: Min 1Q Median 3Q Max -125.019 -22.961 -3.369 17.396 169.290 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 0.11594 5.41983 0.021 0.983 by_name$count 0.99706 0.01062 93.876 <2e-16 ***---Signif. codes: 0 『***』 0.001 『**』 0.01 『*』 0.05 『.』 0.1 『 』 1Residual standard error: 40.86 on 279 degrees of freedomMultiple R-squared: 0.9693, Adjusted R-squared: 0.9692 F-statistic: 8813 on 1 and 279 DF, p-value: < 2.2e-16#用plot()函數繪製圖形> plot(by_name$count,by_name$points,+ xlab = "count",ylab = "points")> abline(revelant)

根據summary()函數得到的參數我們可以看到,兩個變數之間的相關係數是0.997,P值為2e-16遠遠小於0.05,而R-squared判定係數為0.969(表示回歸直線可解釋96.9%的總變差),說明兩者顯著相關,從圖上也可以看出其相關性非常好,散點基本落在直線兩側,這也說明教練對於球員上場的安排情況十分合理,不存在投籃次數過多而得分較少或者得分很高但是投籃機會卻很少的情況。

目標2:

查看總得分前五名的球員和出手次數前五名的球員:

#得分前五by_name.1<-by_name[order(-by_name$points),]by_name.1<-by_name.1[1:5,]

#出手次數前五by_name.2<-by_name[order(-by_name$count),]by_name.2<-by_name.2[1:5,]

目標3:

得分前五名的球員在不同距離的投籃和命中情況:

#從數據原中挑出前五名球員的完整數據data.1<-filter(shot_logs, player_name=="mnta ellis"| player_name=="lebron james"| player_name=="klay thompson"| player_name=="james harden"| player_name=="stephen curry")#根據不同球員的投籃次數和命中次數繪製分面直方圖ggplot(data=data.1,aes(SHOT_DIST,fill=factor(FGM)))+ geom_histogram()+ facet_grid(.~player_name)+ theme_few()

可以根據圖形猜測一下,stephen curry(庫里)的表現相對來說是比較穩定的,而lebron james(詹姆斯)則在三分線內表現較好,下面我們用更直觀的方式來檢驗我們的猜測。

目標4:

得分前五名的球員命中的2分球和3分球所佔比例:

#只留下命中的數據data.2<-filter(data.1,data.1$FGM==1)#根據得分情況繪製堆疊圖ggplot(data = data.2,aes(x=player_name,fill=factor(PTS)))+ geom_bar()+ theme_few()

看以看到的確是stephen curry(庫里)的三分和二分比例最協調,而lebron james(詹姆斯)二分命中次數更多一些。

這裡畫圖的時候遇到了一個BUG......本來的想法是直接統計出五個球員三分的命中次數添加到五條觀測里,再進行繪圖,但是嘗試了半天好像畫圖時沒辦法實現,最後只能根據名字篩出全部數據,然後利用ggplot繪圖時自帶的count功能進行繪製。

目標5:

密度圖表示得分前五名的球員命中次數隨距離變化情況,實際上就是把目標3里直方圖的藍色部分畫的平滑一些,這樣更便於觀察,但是沒有添加顏色,所以美觀度看起來就差了一些:

ggplot(data=data.2,aes(x=SHOT_DIST))+ geom_density()+ facet_grid(player_name~.)+ theme_few()

比賽數據還有很多值得分析的地方,強烈建議大家自己動手試一試,同時還可以鍛煉數據思維。
推薦閱讀:

我為什麼開始學習數據分析
Learn R | GBDT of Data Mining(四)
精選 | 2017年10月份R新包

TAG:R编程语言 | 数据分析 | 数据可视化 |