本文使用R语言模拟美式橄榄球比赛数据,我们将完成以下几部分工作。
- 获取和清理美式橄榄球比赛数据
- 分析和理解美式橄榄球比赛数据
- 构建度量攻防能力的指标
- 模拟单场由程序决定胜负的比赛
- 模拟多场由计算决定胜负的比赛
基于我们前面计算的联赛中每支球队的攻防能力指标,我们可以模拟球队间的比赛,并判定最后的胜者。理论上,最终获胜的队伍是拥有最强攻防指标的队伍。所以,为了对比球队之间的能力差值,我们会计算比赛一方的进攻能力和另一方的防守能力的差值,以及这一方的防守能力和另一方进攻能力的差值。模拟比赛的基本思路是比赛双方中自身进攻能力和对手防守能力之间差值较大的队伍将获得比赛的胜利。
准备工作
既然我们已经计算出了每支队伍的进攻和防守能力指标,可以继续我们的模拟比赛工作了。
处理流程
我们将依照下面的流程完成单场比赛的模拟。
1.现在我们可以开始模拟单场比赛了。首先,我们需要选择两支参赛的队伍。为了方便起见,我们称这两支球队分别为主队和客队。
home_team <- “Chicago Bears”
away_team <- “New Orleans Saints”
你可以通过键入完整的队名来选择任何你希望参赛的球队。
2.现在,我们整合前面所计算的球队的攻防能力指数。
off_game <- subset(offense,Team==home_team |
Team==away_team)[,c(1,15,16,19)]
def_game <- subset(defense,Team==home_team |
Team==away_team)[,c(1,14,15,18)]
game <- merge(off_game,def_game,by.x=”Team”,by.y=”Team”)
上面的命令帮我们从offense和defense数据框中抽取主客队的攻防指标,然后通过merge函数将攻防指标合并到一个变量game中。
game数据框中存储的数据如下所示。
我们注意到Chicago Bears的DRushStrength为零,这意味着Chicago Bears相比于联赛中其他球队,在截断对手冲球进攻上能力最弱。
3.基于汇总的参赛双方数据,我们现在可以通过比较两者的攻防能力指标来决定理论上应该胜出的队伍。首先,我们计算主客队在传球能力上进攻和防守的差别,具体的计算方法是用一方的进攻传球能力减去另一方的防守进攻传球能力。这样,我们可以度量球队在传球上的有效值。
game$Net_Pass[game$Team==home_team] <-
game$OPassStrength[game$Team==home_team] –
game$DPassStrength[game$Team==away_team]
game$Net_Pass[game$Team==away_team] <-
game$OPassStrength[game$Team==away_team] –
game$DPassStrength[game$Team==home_team]
此时,game数据框应该如下所示。
我们注意到,从Net_Pass列可以看出,Chicago Bears在传球博弈能力上因为New Orleans Saints比较强大的防守传球能力而处于弱势。从数据来看,New Orleans在比赛中倾向于表现出更佳的传球能力。
4.上面我们计算了双方在传球能力上的差别,我们现在比较两支球队在冲球能力以及总能力上的差别。
game$Net_Rush[game$Team==home_team] <-
game$ORushStrength[game$Team==home_team] –
game$DRushStrength[game$Team==away_team]
game$Net_Rush[game$Team==away_team] <-
game$ORushStrength[game$Team==away_team] –
game$DRushStrength[game$Team==home_team]
game$Net_Total[game$Team==home_team] <-
game$OffStrength[game$Team==home_team] –
game$DefStrength[game$Team==away_team]
game$Net_Total[game$Team==away_team] <-
game$OffStrength[game$Team==away_team] –
game$DefStrength[game$Team==home_team]
经过上面的计算,game数据框如下所示。
我们发现,Chicago Bears不仅在传球能力上而且在冲击能力上也处于劣势,从而总体能力比New Orleans Saints更差一些。在这场虚拟比赛中,我们预计New Orleans Sanits会获得最后的胜利。
5.因为球队的总能力表现是基于传球、冲击和总体能力初始差值得到的,我们需要重写Net_Total 列。然后,通过比较两支球队的Net_Total,给出虚拟球赛中最终能够获胜的球队。
game$Net_Total <- game$Net_Pass + game$Net_Rush +
game$Net_Total
if(game$Net_Total[game$Team==home_team] >=
game$Net_Total[game$Team==away_team]){
winner <- home_team
loser <- away_team
}else{
winner <- away_team
loser <- home_team
}
print(paste(winner, “beat”, loser))
[1] “New Orleans Saints beat Chicago Bears”
工作原理
在单场比赛模拟过程中,我们使用了下面R语言函数和命令。其中subset函数允许我们通过限定数据框中某个属性的取值而对整个数据框进行过滤筛选,这种筛选操作和数据库中依据选取准则抽取我们需要的数据非常相似。为了仅仅抽取我们所限定的主队和客队的相关数据,我们利用subset来筛选off_game和def_game而得到主队和客队的数据。
为了方便更改主队和客队的属性值,我们使用了条件赋值。通过在数据属性后添加由中括号包含的条件赋值语句,可以选择符合条件的属性值进行修改。
data_frame$changing_field[condition] <- value_replacing_it
在决定比赛的胜出者部分,我们应用了条件语句(if和else)。R中的条件语句功能和其他编程语言、数据库,甚至电子制表软件中的条件语句类似,它的一般结构如下。
if(some condition){
what you want to happen if condition is true
}else{
what you want to happen if condition is false
}
未完待续~~~
本文摘自《数据科学实战手册(R+Python)》,由人民邮电出版社授权数据分析网发布。
本文采用「CC BY-SA 4.0 CN」协议转载自互联网、仅供学习交流,内容版权归原作者所有,如涉作品、版权和其他问题请给「我们」留言处理。