Home Run Derby Preview 2018 Edition

I love the Home Run Derby. Though initially disappointed by the move to timed scoring rather than the traditional “10 outs” framework, I’ve had an amazing time watching sluggers like Aaron Judge go up against the clock in today’s bracket-style tournament. With no “monster” sluggers like Judge or Stanton in tonight’s Derby, things are a bit more wide open - I think you could make a case for a number of different players tonight.

In anticipation for later tonight, I did a quick-and-dirty analysis of the numbers - keep these in mind as you watch tonight!

Exit Velocity and Launch Angle

Exit Velocity vs Launch Angle

If you’re familiar with the idea of a Production Possibilities Frontier (PPF) in economics, you can very clearly see one emerge for this year’s top hitters. Hoskins, Muncy, Harper, and Baez all occupy different locations on this curve, where they have reached a Pareto-optimal amount of exit velocity and launch angle. The fact that the other hitters fall inside the PPF curve these hitters lie on indicates that they are not as efficient at maximizing the power in their swings.

Power Rankings

Player Aggregate Score
Javier Baez 0.935
Bryce Harper 0.730
Max Muncy 0.409
Kyle Schwarber -0.123
Rhys Hoskins -0.183
Jesus Aguilar -0.259
Freddie Freeman -0.606
Alex Bregman -0.903

Methodology

  • Throughout this analysis, I used each player’s Average Exit Velocity and Average Launch Angle, as I think they are more reliable indicators of a player’s raw power (in a batting power setting) than context-sensitive statistics like Home Runs and Slugging Percentage
  • I used Exit Velocity and Launch Angle statistics from MLB Statcast, which allowed me to select data from only fly balls and line drives (no time for grounders tonight!)
  • I calculated the z-score for each player’s Exit Velocity and Launch Angle, comparing each player against the group average
  • I combined the z-scores, with Exit Velocity weighted 70% and Launch Angle weighted 30%
  • I sorted the list from high to low, with this year’s most likely Derby Champions appearing at the top

The Code

 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
library(readr)
library(ggrepel)
library(tidyverse)
library(RColorBrewer)

derby <- read_csv("savant_data (1).csv")

ggplot(derby, aes(x = launch_speed, y = launch_angle, label = player_name)) + 
  geom_point(aes(colour = cut(derby$score, breaks = 2)), size = 3) + 
  geom_text_repel(size = 3, color = "Black") + 
  labs(
  	title = "Charting the 2018 Home Run Derby Favorites", 
  	subtitle = "Exit velocity and launch angle of fly balls and line drives in 2018", 
  	x = "Avg. Exit Velocity (mph)", 
  	y = "Avg. Launch Angle (Deg.)", 
  	fill = "Contender Status"
  	) + 
  scale_color_manual(
  	name = "Contender Status", 
  	labels = c("Field", "Favorite"), 
  	values = c("Red", "Dodger Blue")
  	) + 
  geom_smooth(
  	color = "Grey", 
  	alpha = 0.2, 
  	data = subset(
  		derby, 
  		player_name == "Rhys Hoskins" | 
  		player_name == "Max Muncy" | 
  		player_name == "Bryce Harper" | 
  		player_name == "Javier Baez"
  	)
  )

colmeans <- colMeans(select(derby, launch_speed, launch_angle))
angle_sd <- sd(derby$launch_angle)
speed_sd <- sd(derby$launch_speed)

derby <- mutate(derby, z_angle = (launch_angle - colmeans[2]) / angle_sd)
derby <- mutate(derby, z_speed = (launch_speed - colmeans[1]) / speed_sd)

arrange(select(mutate(derby, score = z_speed * 0.7 + z_angle * 0.3), player_name, score), desc(score))

derby <- mutate(derby, score = z_speed * 0.7 + z_angle * 0.3)