数字显微镜下的林书豪

February 18, 2012
By

This post was kindly contributed by 数据科学与R语言 - go there to comment and to read the full post.


现在网络上最为炙手可热的人物恐怕就是NBA新星林书豪(Jeremy Lin)了,但是俗话说:不怕不识货,就怕货比货。这位初生牛犊与其它NBA巨星相比,到底有多么优秀?还有多少差距?还是让数字来说话吧。首先从这里下载2011-2012NBA赛季的球员数据,该数据中共有四百位球员,取得分最多的前一百位球员,将其数据拷贝到Excel中,并将林同学的数据添加在最后,删除了所属球队和排名之后我们得到了一个CSV数据文件。数据中的变量说明附后。

第一步:我们先画出这些变量的相关系数图,以剔除一些冗余的变量,从下图可看到深兰色方块即表示两组数据间有较强正相关,那么我们只需取其中一组数据即可,例如TRB(篮板总数)就可以代替ORB/DRB/BUK。由此我们提取MP/FGA/FGP/X3PP/FT/FTP/TRB/AST/STL/PF/TOV/PTS这12个变量作进一步处理。

第二步:分别绘制这些变量的箱线图,并观察林同学在一百位NBA球员中的位置。但需要注意的是,林同学作为崭露头角的新星,上场时间较少。为了公平的比较在单位时间内的各项指标,需要将一些指标按上场时间进行平均化处理。例如将总得分数除以出场时间,但其它一些指标如进球率则保留不变。
上面的箱线图中红色的点即代表林书豪,可观察到他在助攻(AST.MP)和得分能力(PTS.MP)方面表现优秀,在得球机会(FGA>MP)和命中率(FTP)方面亦属上佳,三分球命中率(X3PP)和罚球命中率(FGP)则属下乘,而且失误(TOV.MP)数字也相当的多。那么蓝色的点,你知道是代表哪一位球员吗?那就是目前的得分王科比。仔细比较一下吧。

第三步:上面对各指标分别进行了一维的比较,下面用多维标度分析方法,将多维空间的对象简化到低维空间进行定位和分析。提取前两维绘制成散点图如下。其中红色点表示是林同学的位置,而蓝色点则是总得分排名前十位的球员。从图上可以似乎得到令人吃惊的结论,那就是林同学几乎可与这十位巨星球员归为一类了。
结语:对篮球和数字感兴趣的同学可以作进一步的研究。但有几点需要注意的是:1、表面的数字不一定代表球员能力,原因正如笔者在体育数据挖掘一文中所说的;2、林同学上场时间还不多,样本太少,不一定具有代表性;3、上面是将林同学和一百位NBA球员进行比较,合适的作法还应该将他与打同一位置的球员加以比对。但这个数据中并未包含此信息。

R代码:
#读取CSV数据文件
data <- read.csv('d:/nba.csv',sep=',')
summary(data)
#绘制变量间的相关系数图
library(corrgram)
corrgram(data[,c(-1,-2)])
#将几个指标除以上场时间,再合成为新的数据
temple.data <- sapply(data[c('FGA','FT','TRB','AST','STL','PF','TOV','PTS')],function(x) x/data['MP'])
newdata1 <- cbind(data[c('FGP','X3PP','FTP')],as.data.frame(temple.data))
#对数据进行融合以方便ggplot2绘图
library(reshape)
newdata2 <- melt(newdata1)
library(ggplot2)
#提取林书豪与科比的数据
lindata<-melt(newdata1[101,])
kobedata <-melt(newdata1[1,])
#构建ggplot图层的基本数据层
p <- ggplot(data=newdata2,aes(x=variable,y=value))
#添加箱线图和点图
p + geom_boxplot()+
geom_point(data=lindata,colour='red',size=3)+
geom_point(data=kobedata,colour='blue',size=3)+
coord_flip()
#加载MASS包进行MDS分析
library(MASS)
nba.mds <- isoMDS(dist(newdata1))
#提取前两维数据
x = nba.mds$points[,1]
y = nba.mds$points[,2]
mds.data <-data.frame(x,y,player=data$Player)
lin.data <- mds.data[101,]
topten.data <- mds.data[1:10,]
#绘制散点图
g <- ggplot(data=mds.data,aes(x,y))
g + geom_point()+
geom_point(data=lin.data,color='red',size=4)+
geom_point(data=topten.data,color='blue',size=3)+
geom_text(size=4,data=topten.data,aes(label=player),hjust=1,vjust=0,alpha=0.5)

变量说明:
G:出场次数
GS:先发次数
MP:上场时间
FG:投中次数
FGA:投篮次数
FGP:命中率
3P:3分命中次数
3PA:3分投篮次数
3PP:3分命中率
FT:罚球命中次数
FTA:罚球次数
FTP:罚球命中率
ORB:进攻篮板
DRB:防守篮板
TRB:总篮板
AST:助攻
STL:盗球
BLK:封盖
TOV:失误
PF:个人犯规
PTS:总得分
变量名后加.MP的表示以上场时间进行了平均处理。

Tags: ,

Comments are closed.