R語言分析NBA球員數據
一個月前寫了一篇「用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:線性分析
我們想知道球員的出手次數和得分是否線性相關、相關的強弱程度,可以把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)
目標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()
目標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()
這裡畫圖的時候遇到了一個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新包