R语言模拟美式橄榄球比赛数据分析(2):分析和理解美式橄榄球比赛数据

本文使用R语言模拟美式橄榄球比赛数据分析

本文使用R语言模拟美式橄榄球比赛数据,我们将完成以下几部分工作。

  • 获取和清理美式橄榄球比赛数据
  • 分析和理解美式橄榄球比赛数据
  • 构建度量攻防能力的指标
  • 模拟单场由程序决定胜负的比赛
  • 模拟多场由计算决定胜负的比赛

现在我们已经获取并清洗完数据,接下来我们需要理解每个数据域的意义,并利用这些数据挖掘有用的信息。

准备工作

如果你已经完成了上面获取和清洗数据的步骤,就可以进入下面的流程。

处理流程

我们通过下面的步骤进行数据分析和探索。

1.首先,为了方便后续的数据探究,我们将offense和defense两个数据框合并成combined数据框。

combined <- merge(offense, defense, by.x=”Team”, by.y=”Team”)

因为offense和defense数据框中存在相同的列名称,为了避免后面操作的混淆,我们需要为重名的列进行唯一命名。同时,我们会剔除defense中和offense中重复的比赛数量列。

colnames(combined)[2] <- “Games”

colnames(combined)[3] <- “OffPPG”

colnames(combined)[4] <- “OffYPG”

colnames(combined)[5] <- “OffPassYPG”

colnames(combined)[6] <- “OffRushYPG”

combined$G.y <- NULL

colnames(combined)[15] <- “DefPPG”

colnames(combined)[16] <- “DefYPG”

colnames(combined)[17] <- “DefRushYPG”

colnames(combined)[18] <- “DefPassYPG”

2.现在,我们可以开始探究已经预处理过的比赛数据。直方图一直是初步研究数据的最好工具之一,因为它可以通过显示每列数据的分布而分辨偏低、偏高和在正常范围内的数值。首先,我们为每个球队平均每场进攻得分(offensive points per game)创建一个直方图。

hist(combined$OffPPG, breaks=10, main=”Offensive Points Per

Game”, xlab=”Offensive PPG”,ylab=”Number of Teams”)

直方图如下所示。

2016073105

如上图所示,大多数球队平均得分在18到28范围内,但存在平均得分显著高于和低于平均水平的两支球队。所有球队平均进攻得分和标准偏差为23.4和4.36。得分最高的球队得分37.9(高于平均值3.32个标准偏差),得分最低的球队得分15.4(低于平均值1.83个标准偏差)。以上结果可以通过执行下面的命令得到。

mean(combined$OffPP G)

[1] 23.41875

sd(combined$OffPPG)

[1] 4.361373

max(combined$OffPPG

[1] 37.9

min(combined$OffPPG)

[1] 15.4

3.现在我们来观察每个球队对手的平均每场比赛得分(points allowed)是如何分布的。

hist(combined$DefPPG, breaks=10, main=”Defensive Points Per

Game”, xlab=”Defensive PPG”,ylab=”Number of Teams”)

其直方图如下所示。

2016073106

如上图所示,各球队对手的平均得分波动不大,大多数球队分值都处在20至30之间,仅有几个球队因为卓越的防守能力而控制对手的进攻分值在20分之下。

4.我们再创建一个进攻统计量:平均每场比赛的首攻次数(number of first downs per game)。

hist(combined$”1stD/G”, breaks=10, main=”Offensive 1st Downs

Per Game”, xlab=”1st Downs/Game”,ylab=”Number of Teams”)

直方图如下所示。

2016073107

如上图所示,大多数球队的首攻都在17至20之间,而丹佛野马(Denver Broncos)队不仅是球队平均每场进攻得分最高的一支球队,而且拥有非常高的首攻数。简单替换上述代码中的列名,你就可以为combined的各列创建直方图。不妨尝试几次替换,观察是否有新的发现。

5.下面将尝试通过创建条形图来理解combined数据集。条形图和前面所创建的直方图经常容易被混淆。在这里,二者的区别在于,条形图可以刻画出每支球队在不同评价指标上的差异,而直方图却是用来显示出评价指标在不同数值段上的球队数量的分布情况。下面,我们通过创建每场进攻得分(offensive poins)的条形图来详细解读。

ppg <- transform(combined,Team=reorder(Team,combined$OffPPG))

ggplot(ppg,aes(x=Team, y=OffPPG)) +

geom_bar(stat=’identity’,color=”black”,fill=”blue”) +

coord_flip() + labs(x=”Team”,y=”Avg Points per Game”) +

ggtitle(“Avg Points per Game”) + theme(plot.title =

element_text(size=18, face=”bold”))

2016073108

现在我们可以清楚地看到按照每场比赛得分降序排的球队排名。

6.现在让我们再看看每支球队在失守码数(defense yards allowed)上的平均表现,命令如下所示。

ypg <- transform(combined,Team=reorder(Team,-combined$DefYPG))

ggplot(ypg,aes(x=Team, y=DefYPG)) +

geom_bar(stat=’identity’,color=”black”,fill=”blue”) +

coord_flip() + labs(x=”Team”,y=”Avg Yards Allowed per Game”) +

ggtitle(“Avg Yards Allowed per Game”) + theme(plot.title =

element_text(size=18, face=”bold”))

2016073109

上面的条形图显示出Denver Broncos优秀的进攻能力和Seattle seahawks强大的防守能力。我们也可以大致猜到球迷们将会看到的比赛结果。最终,Seattle seahawks凭借牢固的防守能力在超级碗的比赛中完胜Denver Broncos。

读者可以为更多的变量绘制条形图,从而找到更多有助于预测最后比赛结果的线索。

7.最后我们通过散点图来观察两个变量之间的相关性。举例而言,我们可以绘制球队每场平均进攻得分(offensive points)和平均进攻码数(offensive yards)之间的散点图。

ggplot(combined, aes(x=combined$OffYPG, y=combined$OffPPG)) +

geom_point(shape=5, size=2) + geom_smooth() +

labs(x=”Yards per Game”,y=”Points per Game”) +

ggtitle(“Offense Yards vs. Points per Game”) +

theme(plot.title = element_text(size=18, face=”bold”))

执行命令产生的图形如下所示。

2016073110

如上图所示,这两个变量呈现正相关性。当平均进攻码数增加时,平均进攻得分也逐渐上升。我们可以通过以下命令计算二者之间的线性相关系数。

cor(combined$OffYPG,combined$OffPPG) [1] 0.7756408

8.理论上,球队的平均失守码数(defense for yards allowed)和平均失守分值(points allowed per game)之间也应该存在很强的相关性。下面我们通过绘制二者之间的散点图来验证我们的猜想。

ggplot(combined, aes(x=combined$DefYPG, y=combined$DefPPG)) +

geom_point(shape=5, size=2) + geom_smooth() +

labs(x=”Yards Allowed per Game”,y=”Points Alloed per Game”)

+ ggtitle(“Defense Yards vs. Points per Game”) +

theme(plot.title = element_text(size=18, face=”bold”))

2016073111

如上图所示,二者之间确实存在一些正相关性,但是没有两个得分变量之间的相关性强烈。我们也可以计算出它们之间的相关系数。

cor(combined$DefYPG,combined$DefPPG)

[1] 0.6823588

9.我们还需要一个散点图来验证我们的猜想:平均得分是否和球队拥有控球权的时间成正向关系。

ggplot(combined, aes(x=combined$TOP, y=combined$OffPPG)) +

geom_point(shape=5, size=2) + geom_smooth() +

labs(x=”Time of Possession (Seconds)”,y=”Points per Game”) +

ggtitle(“Time of Possession vs. Points per Game”) +

theme(plot.title = element_text(size=18, face=”bold”))

二者之间的散点图和我们的猜想相去甚远。很明显,从进攻效率角度分析,各个球队存在不同的水平,有的可以在短时间内迅速得分,而有些队伍却只能争取到很低的分数。而得分和控球时间之间偏低的相关系数也印证了散点图所传达的信息。

cor(combined$TOP,combined$OffPPG)

[1] 0.2530245

2016073112

工作原理

在绘制直方图时,坐标间隔(break)的数量对于有效表达数据信息非常重要,设定的坐标间隔决定了直方图中柱状条的数量。如果break设置合理,那么直方图能够真正体现不同范围数据的频率间的差别,但如果设置过多,会导致分析的困扰。依据我们以往的经验,初始分析可以设置break使得图中有10列,随后可以根据数据的特性调整。

我们使用ggplot2包来绘制条形图。首先通过transform函数对数据框重新排序,然后利用ggplot2画出排序之后的数据。我们可以修改图形的任意特征,包括轮廓、填充颜色、数据轴样式、图标名称等。同样,ggplot2也可以创建散点图,且任意修改图形的元素。在上面的列子中,我们修改散点图中的点为镂空钻石(shape=5)。

更多内容

ggplot2包的创建者Hadley Wicham在http://docs.ggplot2.org/current/上详细讲解了如何使用ggplot2画出你想要的任何图形。

参考资料

  • ggplot2包可以在 http://docs.ggplot2.org/current/上下载。
  • 美式足球规则可通过http://en.wikipedia.org/wiki/American_football_rules进行查阅。

未完待续~~~

本文摘自《数据科学实战手册(R+Python)》,由人民邮电出版社授权数据分析网发布。

出处:异步社区
链接:http://www.epubit.com.cn/book/details/4237

本文采用「CC BY-SA 4.0 CN」协议转载自互联网、仅供学习交流,内容版权归原作者所有,如涉作品、版权和其他问题请给「我们」留言处理。

(0)
小胖的头像小胖编辑
上一篇 2016-07-30 01:00
下一篇 2016-07-31 06:30

相关文章

关注我们
关注我们
分享本页
返回顶部