-
Notifications
You must be signed in to change notification settings - Fork 0
/
NFLdata4Fun.Rpres
226 lines (178 loc) · 8.44 KB
/
NFLdata4Fun.Rpres
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
Rでアメフトの次のプレーを 予測する
========================================================
author: Takeshi Sugiyama
date: 2015/12/05
width:1280
height:800
```{r setup, include=FALSE}
require(data.table)
require(rpart)
require(partykit)
require(dplyr)
```
自己紹介
========================================================
杉山 剛(@soogie すーぎー)
- 事務系サラリーマン
- 日頃はSASとExcelにまみれてます
- R歴1年くらいです
- 初心者ですが職場にRを普及すべく初心者向け勉強会開催中
- 趣味はアメフト観戦。日本ではオービックシーガルスのファン
- 以前レザークラフトに凝っていた時にスーパーカブを自分で革張りにしたりしました
これが革張りのスーパーカブ!
========================================================
![](images/kawacub01.jpg)
![](images/kawacub02.jpg)
というのは今日の話とは無関係で...
アメフトシーズン到来
========================================================
- 本場アメリカのプロフットボールリーグ **NFL**
- 2016/2/7 第50回スーパーボウルに向け32チームが激戦中
- 日本の社会人アメフト **Xリーグ**
- 12/14の社会人日本一決定戦 **Japan X BOWL** に向け激戦中
- 1/3には学生日本一との日本一決定戦 **RICE BOWL**
アメフトのルール(超簡略版)
========================================================
- 100ヤード先の敵のゴールエリアにボールを運ぶ
- 4回の攻撃で10ヤード進めなければ攻守交代
- 10ヤード進んだらまた4回の攻撃権を取得
- ボールを投げる(パス)か,抱えて走る(ラン)か
- 4回目の攻撃で10ヤード到達が難しい時はパントで敵陣に蹴り込む
- 負けているときは4回目も通常攻撃をすることもあり(ギャンブルと呼びます)
パスかランか(超簡略版)
========================================================
<br>
- パス:一気に進むことができる代わり,失敗のリスクが大きい
- ラン:ボールを失うことは少ないがなかなか進めない
- 短距離のパスもあるし,ランで数十ヤード進むこともある
- 攻撃側は残りヤード数,点差などを踏まえてプレーを選択
- 守備側は次のプレーを予測
- プレーを予測しながら観戦すると楽しさ倍増
NFLのデータを分析
========================================================
2002年から2012年のNFLのすべてのプレーを集めたデータ (https://github.com/veltman/nflplays)
```{r eval=FALSE}
nfl <- fread("data/nflplays.csv", data.table = FALSE)
```
```{r include=FALSE}
nfl <- fread("data/nflplays.csv", data.table = FALSE)
nfl$RUNorPASS <- with(nfl, ifelse(PLAY_TYPE %like% "RUN.*", "RUN",
ifelse(PLAY_TYPE %like% "PASS.*", "PASS",
ifelse(PLAY_TYPE %like% "PUNT.*", "PUNT", "OTHER"))))
nfl$RUNorPASS <- factor(nfl$RUNorPASS, levels = c("RUN", "PASS", "PUNT", "OTHER"))
nfl$TOGO_LEVEL <- cut(nfl$YARDS_TO_FIRST, breaks = c( -Inf, 2, 5, 10, Inf),
labels = c("0-2", "2-5", "5-10", "10-"), right = FALSE)
nfl$REMAIN_SEC <- nfl$MIN * 60 + nfl$SEC
nfl$DIFF <- nfl$OFF_SCORE - nfl$DEF_SCORE
nfl <- subset(nfl, RUNorPASS != "OTHER" & DOWN >= 1 & DOWN <= 4)
nfl$RUNorPASS <- factor(nfl$RUNorPASS, levels = c("RUN", "PASS", "PUNT"))
```
何回目の攻撃でどんなプレーをしているか
```{r echo=FALSE}
# ftable(nfl[c("DOWN", "RUNorPASS", "TOGO_LEVEL")])
# ftable(nfl[c("TOGO_LEVEL", "DOWN", "RUNorPASS")])
table(nfl[c("DOWN", "RUNorPASS")])
```
※ プレーの種類はもっと多様ですが単純化しています
ロジスティック回帰
========================================================
ランかパスかの2者択一というふうに単純化して,ロジスティック回帰を試みます。
```{r echo=FALSE}
nfl_RorP <- subset(nfl, RUNorPASS == "RUN" | RUNorPASS == "PASS")
nfl_glm <- glm(RUNorPASS ~ DOWN + YARDS_TO_FIRST, family=binomial(link="logit"), data = nfl_RorP)
nfl_glm
```
パス確率の計算
========================================================
ロジスティック回帰の結果より<br>
$$
パスの確率 = \frac{1}{1+e^(-2.09 + 0.73 ダウン + 0.12 残りヤード)}
$$
- ファーストダウン残り10ヤードのときは `r round(1/(1+exp(-(-2.09 + 0.73 * 1 + 0.12 * 10))),2) * 100`パーセント
→ ほぼ五分五分。ややラン
- セカンドダウン残り2ヤードのときは`r round(1/(1+exp(-(-2.09 + 0.73 * 2 + 0.12 * 2))),2) * 100`パーセント
→ パスよりはランで確実に
- サードダウン残り18ヤードのときは`r round(1/(1+exp(-(-2.09 + 0.73 * 3 + 0.12 * 18))),2) * 100`パーセント
→ ランでは無理。パスで起死回生
決定木でもやってみる
========================================================
せっかくなので,第何クオーター(QTR)か,敵との点差(DIFF)も加味して決定木を作ってみます。<br>
勝っているときの第1,2ダウンはランを選びがち。第3ダウンは残り1.5ヤード以上ならパスのようです。
```{r echo=FALSE, eval=FALSE}
nfl_RorP %>%
with(data.frame(RUNorPASS = as.factor(RUNorPASS),
DOWN = as.factor(DOWN),
TOGO_LEVEL,
YARDS_TO_FIRST,
QTR = as.factor(QTR),
DIFF)) %>%
rpart(RUNorPASS ~ DOWN + YARDS_TO_FIRST + QTR + DIFF, data = ., method = "class") %>%
# rpart.plot(type = 1, uniform = TRUE, extra = 1, under = 1, faclen = 0)
as.party() %>%
plot()
```
![](images/tree01.png)
チームの戦略の違いもあります
========================================================
<br>
パスを選択しがち
- パスが得意なQBがいる
- キャッチが得意なワイドレシーバーがいる
<br>
ランを選択しがち
- 突進力のあるランニングバックがいる
- QBの足が速く,ピンチになると自ら走ってしまう
シアトルシーホークスのラッセル・ウィルソンのようにパスがうまくて,自分が走っても速い,手に負えないQBもいます。
```{r eval=FALSE, echo=FALSE}
SF_RorP <- subset(nfl_RorP, OFF == "SF")
SF_glm <- glm(RUNorPASS ~ DOWN + YARDS_TO_FIRST, family=binomial(link="logit"), data = SF_RorP)
SF_RorP %>%
with(data.frame(RUNorPASS = as.factor(RUNorPASS),
DOWN = as.factor(DOWN),
TOGO_LEVEL,
YARDS_TO_FIRST,
QTR = as.factor(QTR),
DIFF)) %>%
rpart(RUNorPASS ~ DOWN + YARDS_TO_FIRST + QTR + DIFF, data = ., method = "class") %>%
# rpart.plot(type = 1, uniform = TRUE, extra = 1, under = 1, faclen = 0)
as.party() %>%
plot()
SEA_RorP <- subset(nfl_RorP, OFF == "SEA")
SEA_glm <- glm(RUNorPASS ~ DOWN + YARDS_TO_FIRST, family=binomial(link="logit"), data = SEA_RorP)
SEA_RorP %>%
with(data.frame(RUNorPASS = as.factor(RUNorPASS),
DOWN = as.factor(DOWN),
TOGO_LEVEL,
YARDS_TO_FIRST,
QTR = as.factor(QTR),
DIFF)) %>%
rpart(RUNorPASS ~ DOWN + YARDS_TO_FIRST + QTR + DIFF, data = ., method = "class") %>%
# rpart.plot(type = 1, uniform = TRUE, extra = 1, under = 1, faclen = 0)
as.party() %>%
plot()
```
サンフランシスコ49ers(2012年当時)
========================================================
<br>
![](images/tree_sf.png)
<br>
パスが得意なQBアレックス・スミスが活躍していた頃です。パスが多めですね
シアトルシーホークス(2012年当時)
========================================================
![](images/tree_sea.png)
<br>
当時はラッセル・ウィルソンはいませんでしたがランの比率が高いのは「ビースト」として知られるランニングバック,マーショーン・リンチのおかげでしょう
結論
========================================================
次のプレーを予測しながら見ると,アメフト観戦がめちゃめちゃ楽しくなるよ!
<div align="center">
<img src=images/seagulls02.jpg>
</div>
Enjoy!!
========================================================
<div align="center">
<img src=images/enjoy.png>
</div>
このプレゼンのファイルと実際に動くRプログラムはこちら
[https://github.com/soogie/NFLdata4Fun](https://github.com/soogie/NFLdata4Fun)
です