-
Notifications
You must be signed in to change notification settings - Fork 7
/
ps4.html
739 lines (664 loc) · 28.9 KB
/
ps4.html
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
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="generator" content="pandoc" />
<meta http-equiv="X-UA-Compatible" content="IE=EDGE" />
<title>Problem Set 4</title>
<script src="site_libs/header-attrs-2.27/header-attrs.js"></script>
<script src="site_libs/jquery-3.6.0/jquery-3.6.0.min.js"></script>
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link href="site_libs/bootstrap-3.3.5/css/cerulean.min.css" rel="stylesheet" />
<script src="site_libs/bootstrap-3.3.5/js/bootstrap.min.js"></script>
<script src="site_libs/bootstrap-3.3.5/shim/html5shiv.min.js"></script>
<script src="site_libs/bootstrap-3.3.5/shim/respond.min.js"></script>
<style>h1 {font-size: 34px;}
h1.title {font-size: 38px;}
h2 {font-size: 30px;}
h3 {font-size: 24px;}
h4 {font-size: 18px;}
h5 {font-size: 16px;}
h6 {font-size: 12px;}
code {color: inherit; background-color: rgba(0, 0, 0, 0.04);}
pre:not([class]) { background-color: white }</style>
<script src="site_libs/navigation-1.1/tabsets.js"></script>
<link href="site_libs/font-awesome-6.4.0/css/all.min.css" rel="stylesheet" />
<link href="site_libs/font-awesome-6.4.0/css/v4-shims.min.css" rel="stylesheet" />
<style type="text/css">
code{white-space: pre-wrap;}
span.smallcaps{font-variant: small-caps;}
span.underline{text-decoration: underline;}
div.column{display: inline-block; vertical-align: top; width: 50%;}
div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
ul.task-list{list-style: none;}
</style>
<style type="text/css">
code {
white-space: pre;
}
.sourceCode {
overflow: visible;
}
</style>
<style type="text/css" data-origin="pandoc">
pre > code.sourceCode { white-space: pre; position: relative; }
pre > code.sourceCode > span { line-height: 1.25; }
pre > code.sourceCode > span:empty { height: 1.2em; }
.sourceCode { overflow: visible; }
code.sourceCode > span { color: inherit; text-decoration: inherit; }
div.sourceCode { margin: 1em 0; }
pre.sourceCode { margin: 0; }
@media screen {
div.sourceCode { overflow: auto; }
}
@media print {
pre > code.sourceCode { white-space: pre-wrap; }
pre > code.sourceCode > span { text-indent: -5em; padding-left: 5em; }
}
pre.numberSource code
{ counter-reset: source-line 0; }
pre.numberSource code > span
{ position: relative; left: -4em; counter-increment: source-line; }
pre.numberSource code > span > a:first-child::before
{ content: counter(source-line);
position: relative; left: -1em; text-align: right; vertical-align: baseline;
border: none; display: inline-block;
-webkit-touch-callout: none; -webkit-user-select: none;
-khtml-user-select: none; -moz-user-select: none;
-ms-user-select: none; user-select: none;
padding: 0 4px; width: 4em;
color: #aaaaaa;
}
pre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa; padding-left: 4px; }
div.sourceCode
{ background-color: #f8f8f8; }
@media screen {
pre > code.sourceCode > span > a:first-child::before { text-decoration: underline; }
}
code span.al { color: #ef2929; } /* Alert */
code span.an { color: #8f5902; font-weight: bold; font-style: italic; } /* Annotation */
code span.at { color: #204a87; } /* Attribute */
code span.bn { color: #0000cf; } /* BaseN */
code span.cf { color: #204a87; font-weight: bold; } /* ControlFlow */
code span.ch { color: #4e9a06; } /* Char */
code span.cn { color: #8f5902; } /* Constant */
code span.co { color: #8f5902; font-style: italic; } /* Comment */
code span.cv { color: #8f5902; font-weight: bold; font-style: italic; } /* CommentVar */
code span.do { color: #8f5902; font-weight: bold; font-style: italic; } /* Documentation */
code span.dt { color: #204a87; } /* DataType */
code span.dv { color: #0000cf; } /* DecVal */
code span.er { color: #a40000; font-weight: bold; } /* Error */
code span.ex { } /* Extension */
code span.fl { color: #0000cf; } /* Float */
code span.fu { color: #204a87; font-weight: bold; } /* Function */
code span.im { } /* Import */
code span.in { color: #8f5902; font-weight: bold; font-style: italic; } /* Information */
code span.kw { color: #204a87; font-weight: bold; } /* Keyword */
code span.op { color: #ce5c00; font-weight: bold; } /* Operator */
code span.ot { color: #8f5902; } /* Other */
code span.pp { color: #8f5902; font-style: italic; } /* Preprocessor */
code span.sc { color: #ce5c00; font-weight: bold; } /* SpecialChar */
code span.ss { color: #4e9a06; } /* SpecialString */
code span.st { color: #4e9a06; } /* String */
code span.va { color: #000000; } /* Variable */
code span.vs { color: #4e9a06; } /* VerbatimString */
code span.wa { color: #8f5902; font-weight: bold; font-style: italic; } /* Warning */
</style>
<script>
// apply pandoc div.sourceCode style to pre.sourceCode instead
(function() {
var sheets = document.styleSheets;
for (var i = 0; i < sheets.length; i++) {
if (sheets[i].ownerNode.dataset["origin"] !== "pandoc") continue;
try { var rules = sheets[i].cssRules; } catch (e) { continue; }
var j = 0;
while (j < rules.length) {
var rule = rules[j];
// check if there is a div.sourceCode rule
if (rule.type !== rule.STYLE_RULE || rule.selectorText !== "div.sourceCode") {
j++;
continue;
}
var style = rule.style.cssText;
// check if color or background-color is set
if (rule.style.color === '' && rule.style.backgroundColor === '') {
j++;
continue;
}
// replace div.sourceCode by a pre.sourceCode rule
sheets[i].deleteRule(j);
sheets[i].insertRule('pre.sourceCode{' + style + '}', j);
}
}
})();
</script>
<style type = "text/css">
.main-container {
max-width: 940px;
margin-left: auto;
margin-right: auto;
}
img {
max-width:100%;
}
.tabbed-pane {
padding-top: 12px;
}
.html-widget {
margin-bottom: 20px;
}
button.code-folding-btn:focus {
outline: none;
}
summary {
display: list-item;
}
details > summary > p:only-child {
display: inline;
}
pre code {
padding: 0;
}
</style>
<style type="text/css">
.dropdown-submenu {
position: relative;
}
.dropdown-submenu>.dropdown-menu {
top: 0;
left: 100%;
margin-top: -6px;
margin-left: -1px;
border-radius: 0 6px 6px 6px;
}
.dropdown-submenu:hover>.dropdown-menu {
display: block;
}
.dropdown-submenu>a:after {
display: block;
content: " ";
float: right;
width: 0;
height: 0;
border-color: transparent;
border-style: solid;
border-width: 5px 0 5px 5px;
border-left-color: #cccccc;
margin-top: 5px;
margin-right: -10px;
}
.dropdown-submenu:hover>a:after {
border-left-color: #adb5bd;
}
.dropdown-submenu.pull-left {
float: none;
}
.dropdown-submenu.pull-left>.dropdown-menu {
left: -100%;
margin-left: 10px;
border-radius: 6px 0 6px 6px;
}
</style>
<script type="text/javascript">
// manage active state of menu based on current page
$(document).ready(function () {
// active menu anchor
href = window.location.pathname
href = href.substr(href.lastIndexOf('/') + 1)
if (href === "")
href = "index.html";
var menuAnchor = $('a[href="' + href + '"]');
// mark the anchor link active (and if it's in a dropdown, also mark that active)
var dropdown = menuAnchor.closest('li.dropdown');
if (window.bootstrap) { // Bootstrap 4+
menuAnchor.addClass('active');
dropdown.find('> .dropdown-toggle').addClass('active');
} else { // Bootstrap 3
menuAnchor.parent().addClass('active');
dropdown.addClass('active');
}
// Navbar adjustments
var navHeight = $(".navbar").first().height() + 15;
var style = document.createElement('style');
var pt = "padding-top: " + navHeight + "px; ";
var mt = "margin-top: -" + navHeight + "px; ";
var css = "";
// offset scroll position for anchor links (for fixed navbar)
for (var i = 1; i <= 6; i++) {
css += ".section h" + i + "{ " + pt + mt + "}\n";
}
style.innerHTML = "body {" + pt + "padding-bottom: 40px; }\n" + css;
document.head.appendChild(style);
});
</script>
<!-- tabsets -->
<style type="text/css">
.tabset-dropdown > .nav-tabs {
display: inline-table;
max-height: 500px;
min-height: 44px;
overflow-y: auto;
border: 1px solid #ddd;
border-radius: 4px;
}
.tabset-dropdown > .nav-tabs > li.active:before, .tabset-dropdown > .nav-tabs.nav-tabs-open:before {
content: "\e259";
font-family: 'Glyphicons Halflings';
display: inline-block;
padding: 10px;
border-right: 1px solid #ddd;
}
.tabset-dropdown > .nav-tabs.nav-tabs-open > li.active:before {
content: "\e258";
font-family: 'Glyphicons Halflings';
border: none;
}
.tabset-dropdown > .nav-tabs > li.active {
display: block;
}
.tabset-dropdown > .nav-tabs > li > a,
.tabset-dropdown > .nav-tabs > li > a:focus,
.tabset-dropdown > .nav-tabs > li > a:hover {
border: none;
display: inline-block;
border-radius: 4px;
background-color: transparent;
}
.tabset-dropdown > .nav-tabs.nav-tabs-open > li {
display: block;
float: none;
}
.tabset-dropdown > .nav-tabs > li {
display: none;
}
</style>
<!-- code folding -->
</head>
<body>
<div class="container-fluid main-container">
<div class="navbar navbar-default navbar-fixed-top" role="navigation">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-bs-toggle="collapse" data-target="#navbar" data-bs-target="#navbar">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="index.html"><img id="logo" style="width: 200px;" src="figures/WMA_logo.png" /></a>
</div>
<div id="navbar" class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li>
<a href="index.html">
<span class="fa fa-home"></span>
Home
</a>
</li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false">
<span class="fa fa-sign-in"></span>
Get Started
<span class="caret"></span>
</a>
<ul class="dropdown-menu" role="menu">
<li>
<a href="lecture0.html">Lecture 0</a>
</li>
<li>
<a href="ps0.html">Problem Set 0</a>
</li>
</ul>
</li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false">
<span class="fa fa-institution"></span>
Academy
<span class="caret"></span>
</a>
<ul class="dropdown-menu" role="menu">
<li>
<a href="lecture1.html">Lecture 1</a>
</li>
<li>
<a href="lecture2.html">Lecture 2</a>
</li>
<li>
<a href="lecture3.html">Lecture 3</a>
</li>
<li>
<a href="lecture4.html">Lecture 4</a>
</li>
<li>
<a href="lecture5.html">Lecture 5</a>
</li>
<li>
<a href="lecture5a.html">Lecture 5a</a>
</li>
<li>
<a href="lecture6.html">Lecture 6</a>
</li>
<li>
<a href="lecture7.html">Lecture 7</a>
</li>
<li>
<a href="lecture8.html">Lecture 8</a>
</li>
<li class="divider"></li>
<li>
<a href="ps1.html">Problem Set 1</a>
</li>
<li>
<a href="ps2.html">Problem Set 2</a>
</li>
<li>
<a href="ps3.html">Problem Set 3</a>
</li>
<li>
<a href="ps4.html">Problem Set 4</a>
</li>
<li>
<a href="ps5.html">Problem Set 5</a>
</li>
<li>
<a href="ps6.html">Problem Set 6</a>
</li>
<li class="divider"></li>
<li>
<a href="lecture_nflfastR.html">nflfastR Lecture</a>
</li>
<li>
<a href="psX.html">Problem Set X</a>
</li>
</ul>
</li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false">
<span class="fa fa-dribbble"></span>
Training Camp
<span class="caret"></span>
</a>
<ul class="dropdown-menu" role="menu">
<li>
<a href="tc_lecture1.html">Lecture 1</a>
</li>
<li>
<a href="tc_lecture2.html">Lecture 2</a>
</li>
<li>
<a href="tc_lecture3.html">Lecture 3</a>
</li>
<li>
<a href="tc_lecture4.html">Lecture 4</a>
</li>
<li>
<a href="tc_lecture5.html">Lecture 5</a>
</li>
<li class="divider"></li>
<li>
<a href="tc_ps1.html">Problem Set 1</a>
</li>
<li>
<a href="tc_ps2.html">Problem Set 2</a>
</li>
<li>
<a href="tc_ps3.html">Problem Set 3</a>
</li>
<li class="divider"></li>
<li>
<a href="tc_lecture_data_sources.html">Data Sources Lecture</a>
</li>
</ul>
</li>
</ul>
<ul class="nav navbar-nav navbar-right">
</ul>
</div><!--/.nav-collapse -->
</div><!--/.container -->
</div><!--/.navbar -->
<div id="header">
<h1 class="title toc-ignore">Problem Set 4</h1>
</div>
<div id="visualizing-the-strike-zone" class="section level2">
<h2>Visualizing the Strike Zone</h2>
<p>In this part, we will continue to use heatmaps (introduced briefly in
<a href="lecture2.html">Lecture 2</a>) to explore the strike zone in
baseball. We will focus on data collected by PITCHf/x. At a high-level,
PITCHf/x consists of a set of cameras installed at every ballpark which
tracks the motion of each pitch. For more information about the system,
check out this <a
href="http://baseball.physics.illinois.edu/FastPFXGuide.pdf">article by
Mike Fast</a> The data collected by PITCHf/x is then transmitted to the
MLB Gameday application along with contextual information about the
pitch. The dataset we’ll be using contains the measurements from the
PITCHf/x system recorded in 2015.</p>
<ol style="list-style-type: decimal">
<li><p>Download <a href="data/pitchfx_2015.csv">pitchfx_2015.csv</a> to
your “data” folder. Read the CSV file into a tbl called
<code>pitches</code> using the <code>read_csv</code> function.</p>
<p>The columns are:</p>
<ul>
<li><code>Description</code>: Records the outcome of the pitch (Called
Strike, Swinging Strike, Foul, etc.)</li>
<li><code>X</code> and <code>Z</code>: the horizontal and vertical
coordinates of the pitch in inches. Note that the center of home plate
corresponds to <code>X = 0</code>.
<ul>
<li>Note that the <code>X</code> coordinate are recorded from the
catcher’s perspective, with negative values on the left and positive
values on the right. In this coordinate system, a right-handed batter
will line up to the left (i.e. negative <code>X</code> values).</li>
</ul></li>
<li><code>COUNT</code>: The ball-strike count for each pitch</li>
<li><code>P_HAND</code> and <code>B_HAND</code>: the handedness of the
batter and pitcher.
<p/></li>
</ul></li>
<li><p>To visualize the strike zone, we are going to want to filter out
only the called strikes and balls. Moreover, it will be helpful to
convert the Description to numeric values (1 for called strikes, 0 for
balls). Use the pipe operator, <code>filter()</code>,
<code>mutate()</code>, and <code>case_when()</code> to create a new tbl
<code>called_pitches</code> containing only the called strike and balls
and that includes a new column “Call” whose value is 0 for balls and 1
for called strike.</p></li>
<li><p>To get started, we will create a plot and then add to it
sequentially:</p></li>
</ol>
<div class="sourceCode" id="cb1"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb1-1"><a href="#cb1-1" tabindex="-1"></a>g <span class="ot"><-</span> <span class="fu">ggplot</span>(<span class="at">data =</span> called_pitches)</span></code></pre></div>
<ol start="4" style="list-style-type: decimal">
<li>To estimate the probability of a called strike given the pitch
location, we will use a strategy similar to what we used to make
heatmaps in <a href="lecture2.html">Lecture 2</a>. Essentially, we
divide the plane into several small rectangular bins and compute the
proportion of called strikes within each bin. To compute this, we use
the <code>stat_summary_2d()</code> function, which takes three
aesthetics:
<ul>
<li>x: variable on the horizontal axis</li>
<li>y: variable on vertical axis</li>
<li>z: variable that is passed to the summary function.</li>
</ul>
By default, <code>stat_summary_2d()</code> divides the plane into
rectangles based on the aesthetics x and y, and then computes the
average value of z for observations in the bin. We can add this layer to
our plot <code>g</code> as follows and obtain the following plot.</li>
</ol>
<div class="sourceCode" id="cb2"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb2-1"><a href="#cb2-1" tabindex="-1"></a>g <span class="ot"><-</span> g <span class="sc">+</span> <span class="fu">stat_summary_2d</span>(<span class="at">mapping =</span> <span class="fu">aes</span>(<span class="at">x =</span> X, <span class="at">y =</span> Z, <span class="at">z =</span> Call))</span>
<span id="cb2-2"><a href="#cb2-2" tabindex="-1"></a>g</span></code></pre></div>
<p><img src="ps4_files/figure-html/pt1%20q4-1.png" width="672" style="display: block; margin: auto;" /></p>
<ol start="5" style="list-style-type: decimal">
<li>You’ll notice in the plot above that <code>stat_summary_2d()</code>
has added a legend to our plot. However, the title of the legend is a
somewhat non-informative. Moreover, the color scheme does not
distinguish between different values particularly well. We can change
both the title of the legend and the color scheme inside a function
called <code>scale_fill_distiller</code>. Don’t worry too much about
what this function means for now; we will cover it in more depth in <a
href="lecture5.html">Lecture 5</a>.</li>
</ol>
<div class="sourceCode" id="cb3"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb3-1"><a href="#cb3-1" tabindex="-1"></a>g <span class="ot"><-</span> g <span class="sc">+</span> <span class="fu">scale_fill_distiller</span>(<span class="st">"P(Called Strike)"</span>, <span class="at">palette =</span> <span class="st">"RdBu"</span>)</span>
<span id="cb3-2"><a href="#cb3-2" tabindex="-1"></a>g</span></code></pre></div>
<p><img src="ps4_files/figure-html/pt1%20q5-1.png" width="672" style="display: block; margin: auto;" /></p>
<ol start="6" style="list-style-type: decimal">
<li>According to the official rule book, the strike zone is a
rectangular region that spans the width of home plate and extends
vertically from the batter’s knee to the middle of his chest. From the
plot above, we see that the region in which the strike zone probability
is higher than 90% is definitely not rectangular. To better visualize
the discrepancy, we can add another layer to plot which delimits an
approximation of the rule book strike zone. The code below does just
that. The <code>xmin</code> and <code>xmax</code> arguments give the
horizontal limits of the strike zone (in this case, the coordinates of
the edges of the strike zone) and the <code>ymin</code> and
<code>ymax</code> arguments are the average vertical limits measured by
PITCHf/x. <strong>Note: these values were pre-computed using a much
larger dataset</strong></li>
</ol>
<div class="sourceCode" id="cb4"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb4-1"><a href="#cb4-1" tabindex="-1"></a>g <span class="ot"><-</span> g <span class="sc">+</span> <span class="fu">annotate</span>(<span class="st">"rect"</span>, <span class="at">xmin =</span> <span class="sc">-</span><span class="fl">8.5</span>, <span class="at">xmax =</span> <span class="fl">8.5</span>, <span class="at">ymin =</span> <span class="dv">19</span>, <span class="at">ymax =</span> <span class="fl">41.5</span>, <span class="at">alpha =</span> <span class="dv">0</span>, <span class="at">color =</span> <span class="st">"black"</span>)</span>
<span id="cb4-2"><a href="#cb4-2" tabindex="-1"></a>g</span></code></pre></div>
<p><img src="ps4_files/figure-html/pt1%20q6-1.png" width="672" style="display: block; margin: auto;" /></p>
<ul>
<li>We can additionally make the plot a bit more attractive visually as
follows:</li>
</ul>
<div class="sourceCode" id="cb5"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb5-1"><a href="#cb5-1" tabindex="-1"></a>g <span class="ot"><-</span> g <span class="sc">+</span> <span class="fu">theme_classic</span>() <span class="sc">+</span> </span>
<span id="cb5-2"><a href="#cb5-2" tabindex="-1"></a> <span class="fu">theme</span>(<span class="at">axis.title.x =</span> <span class="fu">element_blank</span>(), </span>
<span id="cb5-3"><a href="#cb5-3" tabindex="-1"></a> <span class="at">axis.title.y =</span> <span class="fu">element_blank</span>()) <span class="sc">+</span> </span>
<span id="cb5-4"><a href="#cb5-4" tabindex="-1"></a> <span class="fu">labs</span>(<span class="at">title =</span> <span class="st">"Estimated Strike Zone"</span>)</span>
<span id="cb5-5"><a href="#cb5-5" tabindex="-1"></a>g</span></code></pre></div>
<p><img src="ps4_files/figure-html/pt1%20q7-1.png" width="672" style="display: block; margin: auto;" /></p>
</div>
<div id="nba-team-shooting-statistics" class="section level2">
<h2>NBA Team Shooting Statistics</h2>
<p>The file “nba_boxscore.csv” lists detailed box score information
about every NBA player in every season ranging from 1996–97 season and
2015-16 season. We will look at team shooting statistics over this
20-season span.</p>
<ol style="list-style-type: decimal">
<li>Load the data into a tbl called <code>raw_boxscore</code>.</li>
</ol>
<ul>
<li>The column “Tm” lists the team on which each player played. We can
look at the relative frequencies of the teams using the
<code>table()</code> function. This function takes a vector and returns
the frequencies of each unique value.</li>
</ul>
<div class="sourceCode" id="cb6"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb6-1"><a href="#cb6-1" tabindex="-1"></a>raw_boxscore <span class="sc">%>%</span> <span class="fu">select</span>(Tm) <span class="sc">%>%</span> <span class="fu">table</span>()</span></code></pre></div>
<pre><code>## .
## ATL BOS BRK CHA CHH CHI CHO CLE DAL DEN DET GSW HOU IND LAC LAL MEM MIA MIL MIN NJN NOH NOK NOP NYK OKC
## 347 350 72 183 101 335 34 359 356 354 321 355 359 319 347 319 271 348 337 328 298 161 34 63 345 144
## ORL PHI PHO POR SAC SAS SEA TOR TOT UTA VAN WAS WSB
## 340 352 348 338 332 342 195 366 1047 309 80 333 15</code></pre>
<ul>
<li>Looking at the list of teams you may see a few that you don’t
recognize. For instance, there are 15 players listed as playing on
“WSB”. We can use <code>filter()</code> to take a closer look at these
players.</li>
</ul>
<div class="sourceCode" id="cb8"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb8-1"><a href="#cb8-1" tabindex="-1"></a>raw_boxscore <span class="sc">%>%</span> <span class="fu">filter</span>(Tm <span class="sc">==</span> <span class="st">"WSB"</span>)</span></code></pre></div>
<pre><code>## # A tibble: 15 × 22
## Season Player Pos Age Tm G GS MP FGM FGA TPM TPA FTM FTA ORB DRB AST STL BLK TOV PF
## <dbl> <chr> <chr> <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1997 Ashraf A… PF 25 WSB 31 0 144 12 40 1 1 15 28 19 33 3 7 3 10 29
## 2 1997 Calbert … SG 25 WSB 79 79 2411 369 730 4 30 95 137 70 198 114 77 18 94 226
## 3 1997 Matt Fish C 27 WSB 5 0 7 1 3 0 0 0 0 1 4 0 0 0 2 2
## 4 1997 Harvey G… PF 31 WSB 78 25 1604 129 314 28 89 30 39 63 193 68 46 48 30 167
## 5 1997 Juwan Ho… SF 23 WSB 82 82 3324 638 1313 0 2 294 389 202 450 311 93 23 246 259
## 6 1997 Jaren Ja… SG 29 WSB 75 0 1133 134 329 53 158 53 69 31 101 65 45 16 60 131
## 7 1997 Tim Legl… SG 30 WSB 15 0 182 15 48 8 29 6 7 0 21 7 3 5 9 21
## 8 1997 Gheorghe… C 25 WSB 73 69 1849 327 541 0 0 123 199 141 340 29 43 96 117 230
## 9 1997 Tracy Mu… SF 25 WSB 82 1 1814 288 678 106 300 135 161 84 169 78 69 19 86 150
## 10 1997 Gaylon N… SG 27 WSB 1 0 6 1 3 0 1 0 0 0 1 0 1 0 1 0
## 11 1997 Rod Stri… PG 30 WSB 82 81 2997 515 1105 13 77 367 497 95 240 727 143 14 270 166
## 12 1997 Ben Wall… PF 22 WSB 34 0 197 16 46 0 0 6 20 25 33 2 8 11 18 27
## 13 1997 Chris We… PF 23 WSB 72 72 2806 604 1167 60 151 177 313 238 505 331 122 137 230 258
## 14 1997 Chris Wh… PG 25 WSB 82 1 1117 139 330 58 163 94 113 13 91 182 49 4 68 100
## 15 1997 Lorenzo … C 27 WSB 19 0 264 20 31 0 0 5 7 28 41 4 6 8 18 49
## # … with 1 more variable: PTS <dbl></code></pre>
<ul>
<li><p>These fifteen players during the 1996-97 season on the Washington
Bullets, which was renamed the Washington Wizards at the end of that
season.There are a few other examples: VAN refers to the Vancouver
Grizzlies who moved to Memphis and CHH refers to the original Charlotte
Hornets franchise, which ultimately relocated to New Orleans.</p></li>
<li><p>One of the teams listed is “TOT”. This does not refer any
specific team. Instead these rows record the <em>total</em> statistics
recorded by a player if he played for multiple teams in a single season.
For the purposes of understanding how team shooting statistics changed
over time, we will not want to include these rows in our
analysis.</p></li>
</ul>
<ol start="2" style="list-style-type: decimal">
<li><p>Use <code>filter()</code>, <code>group_by()</code>,
<code>summarize()</code>, and <code>mutate()</code> to create a new tbl
called <code>team_boxscore</code> that does the following:</p>
<ul>
<li>removes the rows corresponding to player totals
(i.e. <code>Tm == "TOT"</code>)</li>
<li>groups the tbl according to Season and Tm. <strong>Note: it is
important to group on season first and team second </strong></li>
<li>Computes the total number of made and attempted field goals, three
pointers, and free throws, along with points scored by each team in each
season.</li>
<li>Adds a column for team field goal percentage (FGP), three point
percentage (TPP), and free throw percentages (FTP).</li>
<li>Ungroup the resulting tbl
<p/></li>
</ul></li>
<li><p>Use <code>filter()</code> to create a new tbl called
<code>reduced_boxscore</code> that pulls out the rows of
<code>team_boxscore</code> corresponding to the following teams: BOS,
CLE, DAL, DET, GSW, LAL, MIA, and SAS. Then create a plot of these
teams’ three point percentage in each season. Be sure to color the
points according to the team (<em>Hint</em>: to map the <code>Tm</code>
variable to the points as colors, use the <code>color =</code> argument
within the <code>aes</code> function. We will learn more about this in
<a href="lecture5.html">Lecture 5</a>). What patterns do you
notice?</p></li>
</ol>
</div>
<div id="work-with-new-data" class="section level2">
<h2>Work with new data</h2>
<p>Once you finish reviewing the material from earlier this week, we’d
like you to use some of the tools we introduced in <a
href="lecture4.html">Lecture 4</a> to read in new data into R. Then,
using the skills you’ve learned in the first four lectures, we’d like to
you do some type of analysis with this data. It doesn’t need to be
sophisticated – even making a few interesting visualizations or
computing some interesting summaries is enough. We just want you to get
some practice working with some data that you’ve collected
yourselves!</p>
</div>
</div>
<script>
// add bootstrap table styles to pandoc tables
function bootstrapStylePandocTables() {
$('tr.odd').parent('tbody').parent('table').addClass('table table-condensed');
}
$(document).ready(function () {
bootstrapStylePandocTables();
});
</script>
<!-- tabsets -->
<script>
$(document).ready(function () {
window.buildTabsets("TOC");
});
$(document).ready(function () {
$('.tabset-dropdown > .nav-tabs > li').click(function () {
$(this).parent().toggleClass('nav-tabs-open');
});
});
</script>
<!-- code folding -->
<!-- dynamically load mathjax for compatibility with self-contained -->
<script>
(function () {
var script = document.createElement("script");
script.type = "text/javascript";
script.src = "https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML";
document.getElementsByTagName("head")[0].appendChild(script);
})();
</script>
</body>
</html>