Archive for February, 2017

Basic Machine Learning With R (Part 2)

(For part 1 of this series, click here)

Last time, we learned how to run a machine-learning algorithm in just a few lines of R code. But how can we apply that to actual baseball data? Well, first we have to get some baseball data. There are lots of great places to get some — Bill Petti’s post I linked to last time has some great resources — but heck, we’re on FanGraphs, so let’s get the data from here.

You probably know this, but it took forever for me to learn it — you can make custom leaderboards here at FanGraphs and export them to CSV. This is an amazing resource for machine learning, because the data is nice and clean, and in a very user-friendly format. So we’ll do that to run our model, which today will be to try to predict pitcher WAR from the other counting stats. I’m going to use this custom leaderboard (if you’ve never made a custom leaderboard before, play around there a bit to see how you can customize things). If you click on “Export Data” on that page you can download the CSV that we’ll be using for the rest of this post.

View post on

Let’s load this data into R. Just like last time, all the code presented here is on my GitHub. Reading CSVs is super easy — assuming you named your file “leaderboard.csv”, it’s just this:

pitcherData <- read.csv('leaderboard.csv',fileEncoding = "UTF-8-BOM")

Normally you wouldn’t need the “fileEncoding” bit, but for whatever reason FanGraphs CSVs use a particularly annoying character encoding. You may also need to use the full path to the file if your working directory is not where the file is.

Let’s take a look at our data. Remember the “head” function we used last time? Let’s change it up and use the “str” function this time.

> str(pitcherData)
'data.frame':	594 obs. of  16 variables:
 $ Season  : int  2015 2015 2014 2013 2015 2016 2014 2014 2013 2014 ...
 $ Name    : Factor w/ 231 levels "A.J. Burnett",..: 230 94 47 ...
 $ Team    : Factor w/ 31 levels "- - -","Angels",..: 11 9 11  ...
 $ W       : int  19 22 21 16 16 16 15 12 12 20 ...
 $ L       : int  3 6 3 9 7 8 6 4 6 9 ...
 $ G       : int  32 33 27 33 33 31 34 26 28 34 ...
 $ GS      : int  32 33 27 33 33 30 34 26 28 34 ...
 $ IP      : num  222 229 198 236 232 ...
 $ H       : int  148 150 139 164 163 142 170 129 111 169 ...
 $ R       : int  43 52 42 55 62 53 68 48 47 69 ...
 $ ER      : int  41 45 39 48 55 45 56 42 42 61 ...
 $ HR      : int  14 10 9 11 15 15 16 13 10 22 ...
 $ BB      : int  40 48 31 52 42 44 46 39 58 65 ...
 $ SO      : int  200 236 239 232 301 170 248 208 187 242 ...
 $ WAR     : num  5.8 7.3 7.6 7.1 8.6 4.5 6.1 5.2 4.1 4.6 ...
 $ playerid: int  1943 4153 2036 2036 2036 12049 4772 10603 ...

Sometimes the CSV needs cleaning up, but this one is not so bad. Other than “Name” and “Team”, everything shows as a numeric data type, which isn’t always the case. For completeness, I want to mention that if a column that was actually numeric showed up as a factor variable (this happens A LOT), you would convert it in the following way:

pitcherData$WAR <- as.numeric(as.character(pitcherData$WAR))

Now, which of these potential features should we use to build our model? One quick way to explore good possibilities is by running a correlation analysis:

cor(subset(pitcherData, select=-c(Season,Name,Team,playerid)))

Note that in this line, we’ve removed the columns that are either non-numeric or are totally uninteresting to us. The “WAR” column in the result is the one we’re after — it looks like this:

W    0.50990268
L   -0.36354081
G    0.09764845
GS   0.20699173
IP   0.59004342
H   -0.06260448
R   -0.48937468
ER  -0.50046647
HR  -0.47068461
BB  -0.24500566
SO   0.74995296
WAR  1.00000000

Let’s take a first crack at this prediction with the columns that show the most correlation (both positive and negative): Wins, Losses, Innings Pitched, Earned Runs, Home Runs, Walks, and Strikeouts.

goodColumns <- c('W','L','IP','ER','HR','BB','SO','WAR')
inTrain <- createDataPartition(pitcherData$WAR,p=0.7,list=FALSE)
training <- data[inTrain,goodColumns]
testing <- data[-inTrain,goodColumns]

You should recognize this setup from what we did last time. The only difference here is that we’re choosing which columns to keep; with the iris data set we didn’t need to do that. Now we are ready to run our model, but which algorithm do we choose? Lots of ink has been spilled about which is the best model to use in any given scenario, but most of that discussion is wasted. As far as I’m concerned, there are only two things you need to weigh:

  1. how *interpretable* you want the model to be
  2. how *accurate* you want the model to be

If you want interpretability, you probably want linear regression (for regression problems) and decision trees or logistic regression (for classification problems). If you don’t care about other people being able to make heads or tails out of your results, but you want something that is likely to work well, my two favorite algorithms are boosting and random forests (these two can do both regression and classification). Rule of thumb: start with the interpretable ones. If they work okay, then there may be no need to go to something fancy. In our case, there already is a black-box algorithm for computing pitcher WAR, so we don’t really need another one. Let’s try for interpretability.

We’re also going to add one other wrinkle: cross-validation. I won’t say too much about it here except that in general you’ll get better results if you add the “trainControl” stuff. If you’re interested, please do read about it on Wikipedia.

method = 'lm' # linear regression
ctrl <- trainControl(method = 'repeatedcv',number = 10, repeats = 10)
modelFit <- train(WAR ~ ., method=method, data=training, trControl=ctrl)

Did it work? Was it any good? One nice quick way to tell is to look at the summary.

> summary(modelFit)

lm(formula = .outcome ~ ., data = dat)

     Min       1Q   Median       3Q      Max 
-1.38711 -0.30398  0.01603  0.31073  1.34957 

              Estimate Std. Error t value Pr(>|t|)    
(Intercept) -0.6927921  0.2735966  -2.532  0.01171 *  
W            0.0166766  0.0101921   1.636  0.10256    
L           -0.0336223  0.0113979  -2.950  0.00336 ** 
IP           0.0211533  0.0017859  11.845  < 2e-16 ***
ER           0.0047654  0.0026371   1.807  0.07149 .  
HR          -0.1260508  0.0048609 -25.931  < 2e-16 ***
BB          -0.0363923  0.0017416 -20.896  < 2e-16 ***
SO           0.0239269  0.0008243  29.027  < 2e-16 ***
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.4728 on 410 degrees of freedom
Multiple R-squared:  0.9113,	Adjusted R-squared:  0.9097 
F-statistic: 601.5 on 7 and 410 DF,  p-value: < 2.2e-16

Whoa, that’s actually really good. The adjusted R-squared is over 0.9, which is fantastic. We also get something else nice out of this, which is the significance of each variable, helpfully indicated by a 0-3 star system. We have four variables that were three-stars; what would happen if we built our model with just those features? It would certainly be simpler; let’s see if it’s anywhere near as good.

> model2 <- train(WAR ~ IP + HR + BB + SO, method=method, data=training, trControl=ctrl)
> summary(model2)

lm(formula = .outcome ~ ., data = dat)

     Min       1Q   Median       3Q      Max 
-1.32227 -0.27779 -0.00839  0.30686  1.35129 

              Estimate Std. Error t value Pr(>|t|)    
(Intercept) -0.8074825  0.2696911  -2.994  0.00292 ** 
IP           0.0228243  0.0015400  14.821  < 2e-16 ***
HR          -0.1253022  0.0039635 -31.614  < 2e-16 ***
BB          -0.0366801  0.0015888 -23.086  < 2e-16 ***
SO           0.0241239  0.0007626  31.633  < 2e-16 ***
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.4829 on 413 degrees of freedom
Multiple R-squared:  0.9067,	Adjusted R-squared:  0.9058 
F-statistic:  1004 on 4 and 413 DF,  p-value: < 2.2e-16

Awesome! The results still look really good. But of course, we need to be concerned about overfitting, so we can’t be 100% sure this is a decent model until we evaluate it on our test set. Let’s do that now:

# Apply to test set
predicted2 <- predict(model2,newdata=testing)
# R-squared
cor(testing$WAR,predicted2)^2 # 0.9108492
# Plot the predicted values vs. actuals

View post on

Fantastic! This is as good as we could have expected from this, and now we have an interpretable version of pitcher WAR, specifically,

WAR = -0.8 + 0.02 * IP + -0.13 * HR + -0.04 * BB + 0.02 * K

Most of the time, machine learning does not come out as nice as it has in this post and the last one, so don’t expect miracles every time out. But you can occasionally get some really cool results if you know what you’re doing, and at this point, you kind of do! I have a few ideas about what to write about for part 3 (likely the final part), but if there’s something you really would like to know how to do, hit me up in the comments.

dSCORE: Pitcher Evaluation by Stuff

Confession: fantasy baseball is life.

Second confession: the chance that I actually turn out to be a sabermetrician is <1%.

That being said, driven purely by competition and a need to have a leg up on the established vets in a 20-team, hyper-deep fantasy league, I had an idea to see if I could build a set of formulas that attempted to quantify a pitcher’s “true-talent level” by the performance of each pitch in his arsenal. Along with one of my buddies in the league who happens to be (much) better at numbers than yours truly, dSCORE was born.

dSCORE (“Dominance Score”) is designed as a luck-independent analysis (similar to FIP) — showing a pitcher might be overperforming/underperforming based on the quality of the pitches he throws. It analyzes each pitch at a pitcher’s disposal using outcome metrics (K-BB%, Hard/Soft%, contact metrics, swinging strikes, weighted pitch values), with each metric weighted by importance to success. For relievers, missing bats, limiting hard contact, and one to two premium pitches are better indicators of success; starting pitchers with a better overall arsenal plus contact and baserunner management tend to have more success. We designed dSCORE as a way to make early identification of possible high-leverage relievers or closers, as well as stripping out as much luck as possible to view a pitcher from as pure a talent point of view as possible.

We’ve finalized our evaluations of MLB relievers, so I’ll be going over those below. I’ll post our findings on starting pitchers as soon as we finish up that part — but you’ll be able to see the work in process in this Google Sheets link that also shows the finalized rankings for relievers.

Top Performing RP by Arsenal, 2016
Rank Name Team dSCORE
1 Aroldis Chapman Yankees 87
2 Andrew Miller Indians 86
3 Edwin Diaz Mariners 82
4 Carl Edwards Jr. Cubs 78
5 Dellin Betances Yankees 63
6 Ken Giles Astros 63
7 Zach Britton Orioles 61
8 Danny Duffy Royals 61
9 Kenley Jansen Dodgers 61
10 Seung Hwan Oh Cardinals 58
11 Luis Avilan Dodgers 57
12 Kelvin Herrera Royals 57
13 Pedro Strop Cubs 57
14 Grant Dayton Dodgers 52
15 Kyle Barraclough Marlins 50
16 Hector Neris Phillies 49
17 Christopher Devenski Astros 48
18 Boone Logan White Sox 46
19 Matt Bush Rangers 46
20 Luke Gregerson Astros 45
21 Roberto Osuna Blue Jays 44
22 Shawn Kelley Mariners 44
22 Alex Colome Rays 44
24 Bruce Rondon Tigers 43
25 Nate Jones White Sox 43

Any reliever list that’s headed up by Chapman and Miller should be on the right track. Danny Duffy shows up, even though he spent most of the summer in the starting rotation. I guess that shows just how good he was even in a starting role!

We had built the alpha version of this algorithm right as guys like Edwin Diaz and Carl Edwards Jr. were starting to get national helium as breakout talents. Even in our alpha version, they made the top 10, which was about as much of a proof-of-concept as could be asked for. Other possible impact guys identified include Grant Dayton (#14), Matt Bush (#19), Josh Smoker (#26), Dario Alvarez (#28), Michael Feliz (#29) and Pedro Baez (#30).

Since I led with the results, here’s how we got them. For relievers, we took these stats:

Set 1: K-BB%

Set 2: Hard%, Soft%

Set 3: Contact%, O-Contact%, Z-Contact%, SwStk%

Set 4: vPitch,

Set 5: wPitch Set 6: Pitch-X and Pitch-Z (where “Pitch” includes FA, FT, SL, CU, CH, FS for all of the above)

…and threw them in a weighting blender. I’ve already touched on the fact that relievers operate on a different set of ideal success indicators than starters, so for relievers we resolved on weights of 25% for Set 1, 10% for Set 2, 25% for Set 3, 10% for Set 4, 20% for set 5 and 10% for Set 6. Sum up the final weighted values, and you get each pitcher’s dSCORE. Before we weighted each arsenal, though, we compared each metric to the league mean, and gave it a numerical value based on how it stacked up to that mean. The higher the value, the better that pitch performed.

What the algorithm rolls out is an interesting, somewhat top-heavy curve that would be nice to paste in here if I could get media to upload, but I seem to be rather poor at life, so that didn’t happen — BUT it’s on the Sum tab in the link above. Adjusting the weightings obviously skews the results and therefore introduces a touch of bias, but it also has some interesting side effects when searching for players that are heavily affected by certain outcomes (e.g. someone that misses bats but the rest of the package is iffy). One last oddity/weakness we noticed was that pitchers with multiple plus-to-elite pitches got a boost in our rating system. The reason that could be an issue is guys like Kenley Jansen, who rely on a single dominant pitch, can get buried more than they deserve.

Basic Machine Learning With R (Part 1)

You’ve heard of machine learning. How could you not have? It’s absolutely everywhere, and baseball is no exception. It’s how Gameday knows how to tell a fastball from a cutter and how the advanced pitch-framing metrics are computed. The math behind these algorithms can go from the fairly mundane (linear regression) to seriously complicated (neural networks), but good news! Someone else has wrapped up all the complex stuff for you. All you need is a basic understanding of how to approach these problems and some rudimentary programming knowledge. That’s where this article comes in. So if you like the idea of predicting whether a batted ball will become a home run or predicting time spent on the DL, this post is for you.

We’re going to use R and RStudio to do the heavy lifting for us, so you’ll have to download them (they’re free!). The download process is fairly painless and well-documented all over the internet. If I were you, I’d start with this article. I highly recommend reading at least the beginning of that article; it not only has an intro to getting started with R, but information on getting baseball-related data, as well as some other indispensable links. Once you’ve finished downloading RStudio and reading that article head back here and we’ll get started! (If you don’t want to download anything for now you can run the code from this first part on R-Fiddle — though you’ll want to download R in the long run if you get serious.)

Let’s start with some basic machine-learning concepts. We’ll stick to supervised learning, of which there are two main varieties: regression and classification. To know what type of learning you want, you need to know what problem you’re trying to solve. If you’re trying to predict a number — say, how many home runs a batter will hit or how many games a team will win — you’ll want to run a regression. If you’re trying to predict an outcome — maybe if a player will make the Hall of Fame or if a team will make the playoffs — you’d run a classification. These classification algorithms can also give you probabilities for each outcome, instead of just a binary yes/no answer (so you can give a probability that a player will make the Hall of Fame, say).

Okay, so the first thing to do is figure out what problem you want to solve. The second part is figuring out what goes into the prediction. The variables that go into the prediction are called “features,” and feature selection is one of the most important parts of creating a machine-learning algorithm. To predict how many home runs a batter will hit, do you want to look at how many triples he’s hit? Maybe you look at plate appearances, or K%, or handedness … you can go on and on, so choose wisely.

Enough theory for now — let’s look at a specific example using some real-life R code and the famous “iris” data set. This code and all subsequent code will be available on my GitHub.

inTrain <- createDataPartition(iris$Species,p=0.7,list=FALSE)
training <- iris[inTrain,]
model <- train(Species~.,data=training,method='rf')

Believe it or not, in those five lines of code we have run a very sophisticated machine-learning model on a subset of the iris data set! Let’s take a more in-depth look at what happened here.


This first line loads the iris data set into a data frame — a variable type in R that looks a lot like an Excel spreadsheet or CSV file. The data is organized into columns and each column has a name. That first command loaded our data into a variable called “iris.” Let’s actually take a look at it; the “head” function in R shows the first five rows of the dataset — type


into the console.

> head(iris)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa

As you hopefully read in the Wikipedia page, this data set consists of various measurements of three related species of flowers. The problem we’re trying to solve here is to figure out, given the measurements of a flower, which species it belongs to. Loading the data is a good first step.


If you’ve been running this code while reading this post, you may have gotten the following error when you got here:

Error in library(caret) : there is no package called 'caret'

This is because, unlike the iris data set, the “caret” library doesn’t ship with R. That’s too bad, because the caret library is the reason we’re using R in the first place, but fear not! Installing missing packages is dead easy, with just the following command


or, if you have a little time and want to ensure that you don’t run into any issues down the road:

install.packages("caret", dependencies = c("Depends", "Suggests"))

The latter command installs a bunch more stuff than just the bare minimum, and it takes a while, but it might be worth it if you’re planning on doing a lot with this package. Note: you should be planning to do a lot with it — this library is a catch-all for a bunch of machine-learning tools and makes complicated processes look really easy (again, see above: five lines of code!).

inTrain <- createDataPartition(iris$Species,p=0.7,list=FALSE)

We never want to train our model on the whole data set, a concept I’ll get into more a little later. For now, just know that this line of code randomly selects 70% of our data set to use to train the model. Note also R’s “<-” notation for assigning a value to a variable.

training <- iris[inTrain,]

Whereas the previous line chose which rows we’d use to train our model, this line actually creates the training data set. The “training” variable now has 105 randomly selected rows from the original iris data set (you can again use the “head” function to look at the top 5).

model <- train(Species~.,data=training,method='rf')

This line of code runs the actual model! The “train” function is the model-building one. “Species~.” means we want to predict the “Species” column from all the others. “data=training” means the data set we want to use is the one we assigned to the “training” variable earlier. And “method=’rf'” means we will use the very powerful and very popular random-forest method to do our classification. If, while running this command, R tells you it needs to install something, go ahead and do it. R will run its magic and create a model for you!

Now, of course, a model is no good unless we can apply it to data that the model hasn’t seen before, so let’s do that now. Remember earlier when we only took 70% of the data set to train our model? We’ll now run our model on the other 30% to see how good it was.

# Create the test set to evaluate the model
# Note that "-inTrain" with the minus sign pulls everything NOT in the training set
testing <- iris[-inTrain,]
# Run the model on the test set
predicted <- predict(model,newdata=testing)
# Determine the model accuracy
accuracy <- sum(predicted == testing$Species)/length(predicted)
# Print the model accuracy

Pretty good, right? You should get a very high accuracy doing this, likely over 95%*. And it was pretty easy to do! If you want some homework, type the following command and familiarize yourself with all its output by Googling any words you don’t know:

confusionMatrix(predicted, testing$Species)

*I can’t be sure because of the randomness that goes into both choosing the training set and building the model.

Congratulations! You now know how to do some machine learning, but there’s so much more to do. Next time we’ll actually play around with some baseball data and explore some deeper concepts. In the meantime, play around with the code above to get familiar with R and RStudio. Also, if there’s anything you’d specifically like to see, leave me a comment and I’ll try to get to it.

Exploring Relief Pitcher Usage Via the Inning-Score Matrix

Relief pitching has gotten a lot of attention across baseball in the past few seasons, both in traditional and analytical circles. This has come into particular focus in the past two World Series, which saw the Royals’ three-headed monster effectively reducing games to six innings in 2015, and a near over-reliance on relief aces by each manager this past October. It came to a head this offseason, when Aroldis Chapman signed the largest contract in history for a relief pitcher. Teams are more willing than ever to invest in their bullpens.

At the same time, analytical fans have long argued for a change in the way top-tier relievers are used – why not use your best pitcher in the most critical moments of the game, regardless of inning? For the most part, however, managers have appeared largely reluctant to stray from traditional bullpen roles: The closer gets the 9th inning with the lead, the setup man gets the 8th, and so forth. This might be in part due to managerial philosophy, or in part due to the fact that relievers are, in fact, human beings who value continuity and routine in their roles.

That’s the general narrative, but we can also quantify relief-pitching roles by looking at the circumstances when a pitcher comes into the game. One basic tool for this is the inning/score matrix found at the bottom of a player’s “Game Log” page at Baseball-Reference. The vertical axis denotes the inning in which the pitcher entered the game, while the horizontal axis measures the score differential (+1 indicating a 1-run lead, -1 indicating a 1-run deficit).


From this, we can tell that Andrew Miller was largely used in the 7th through 9th innings to protect a lead. This leaves a lot to be desired, however, both visually and in terms of the data itself. Namely:

  • Starts are included in this data. This doesn’t matter for Miller, but skews things quite a bit if we only care about bullpen usage for a player who switched from bullpen to rotation, such as Dylan Bundy.
  • Data is aggregated for innings 1-4 and 10+, and for score differentials of 4+. In Miller’s case, those two games in the far left column of the above chart actually represent games where his team was down seven runs. This is important if we want to calculate summary statistics (more on this in a bit).
  • Appearances are aggregated for an entire year, regardless of team. This is a big issue for Miller, who split his time between the Yankees and Indians last year, as there is no easy way to discern how his usage changed upon being traded from one to the other.

To address these issues, I’ve collected appearance data for all pitchers making at least 20 relief appearances for a single team in 2016. We can then construct an inning/score matrix which is specific by team and includes only relief appearances. Additionally, we can calculate summary statistics (mean and variance) for the statistics associated with their relief appearances, including: score and inning when they entered the game, days rest prior to the appearance, batters faced, and average Leverage Index during the appearance. This gives insight into the way the manager decided to use that pitcher: Was there a typical inning or score situation where he was called upon? Was he usually asked to face one batter, or go multiple innings? Was his role highly specific or more fluid?

So let’s start there – and in particular, let’s see if we can identify some relievers who had very rigid roles, or roles that simply stood out from the crowd. To start, here are the relievers who had the lowest variance by inning in 2016.


No surprise here: Most teams reserve their closers for the 9th inning, and rarely deviate from that formula. What you have is a list of guys who were closers for the vast majority of their time with the listed team in 2016, with one very notable exception. Prior to being traded over to Toronto, Joaquin Benoit made 26 appearances for Seattle – 25 of which were in the 8th inning! The next-most rigid role by inning, excluding the 9th inning “closer” role, was Addison Reed, who racked up 63 appearances in the 8th inning for the Mets, but was also given 17 appearances in either the 7th or 9th. In short, Benoit’s role with the Mariners was shockingly inning-specific. I’ve also included the variance of the score differential, which shows that score seemed to have no bearing on whether Benoit was coming into the game. The 8th inning was his, whether the team really needed him there or not.


Speaking of variance in score differential, there’s a name at the top of that list which is quite interesting, too.


Here we mostly see a collection of accomplished setup men and closers who are coming in to protect 1-2 run leads in highly-defined roles (low variance by inning). We also see Matt Strahm, a young lefty who quietly made a fantastic two-month debut for a Royals team that was mostly out of the playoff picture, and a guy who Paul Sporer mentioned as someone who might be in line for a closer’s role soon. Strahm’s great numbers – 13 hits and 0 home runs surrendered in 22.0 innings, to go with 30 strikeouts – went under the radar, but Ned Yost certainly trusted Strahm with a fairly high-leverage role in the 6th and 7th innings rather quickly. With Wade Davis and Greg Holland both out of the picture, it’s not unreasonable to think Strahm will move into a later-game role, if the Royals opt not to try him in the rotation instead.


This next leaderboard, sorted by average batters faced per appearance, either exemplifies Bruce Bochy’s quick hook, or the fact that the Giants bullpen was a dumpster fire, or perhaps both.


This is a list mostly reserved for lefty specialists: The top 13 names on the list are left-handed. Occupying the 14th spot is Sergio Romo, which is notable because he’s right-handed, and also because he’s the fourth Giants pitcher on the list. The Giants take up four of the top 14 spots!

While they never did quite figure out the right configuration (or simply never had enough high-quality arms at their disposal), certainly one could question why Will Smith appears here; the Giants traded for Smith who was, by all accounts, an effective and important part of the Brewers’ pen. The Giants not only used him (on average) in lower-leverage situations, but they also used him in shorter outings, and with less regard for the score of the game.


Dave Cameron used different data to come to the same conclusion several months ago. Very strange, considering that they had not just one, but two guys who already fit the lefty-specialist role in Javier Lopez and Josh Osich. Smith is back in San Francisco for the 2017 season, and it will be interesting to track whether his usage returns to the high-leverage setup role that he occupied in Milwaukee.

This is a taste of how this data can be used to pick out unique bullpens and bullpen roles. My hope is that a deeper, more mathematical review of the data can produce insights on how bullpens are structured: Perhaps certain teams are ahead of the curve (or just different) in this regard, or perhaps the data will show that there is a trend toward greater flexibility over the past few seasons. Certainly, if teams are spending more than ever on their bullpens, it stands to reason that they should be thinking more than ever about how to manage them, too.

Maximizing the Minor Leagues

Throughout each level of the minor leagues, a lot of time and effort is devoted to travel. A more productive model would be for an entire level playing in one location. Spring training’s Grapefruit and Cactus Leagues are a great example. Like spring training, the goal of the minor leagues is to develop, not to win. In this system, players would have more time to work on strength, durability, and skill development. This system could be in effect until the prospect reaches Double-A. At that level, players could start assimilating themselves to playing ball all over the map. However, this is merely a pipe dream. The more realistic option to improving the minor leagues would be to raise each player’s salary.

In 2014, three ex-minor-league baseball players filed a lawsuit against Major League Baseball, commissioner Bud Selig and their former teams in U.S. District Court in California. Sports Illustrated attorney and sports law expert, Michael McCann, explained their case.

“The lawsuit portrays minor league players as members of the working poor, and that’s backed up by data. Most earn between $3,000 and $7,500 for a five-month season. As a point of comparison, fast food workers typically earn between $15,000 and $18,000 a year, or about two or three times what minor league players make. Some minor leaguers, particularly those with families, hold other jobs during the offseason and occasionally during the season. While the minimum salary in Major League Baseball is $500,000, many minor league players earn less than the federal poverty level, which is $11,490 for a single person and $23,550 for a family of four….

The three players suing baseball also stress that minor league salaries have effectively declined in recent decades. According to the complaint, while big league salaries have risen by more than 2,000 percent since 1976, minor league salaries have increased by just 75 percent during that time. When taking into account inflation, minor leaguers actually earn less than they did in 1976.”

Like many big corporations, MLB teams would never increase minor-league salary just because it is the right thing to do. What’s in it for them? Think about it like this.


At point A, when the average MiLB player has a wage set at W2, the player will take Q2 hours out of the day to work toward baseball. As you can see, there is room to improve, as point B is optimal. Accomplishing point B would mean increasing a player’s salary to W1. In turn, players could afford to take Q1 hours out of the day toward baseball. With most minor-league players needing to find work in the offseason or even during the baseball season, a raise in salary would give them the opportunity to be full-time baseball players. These prospects would spend more time mastering their craft, speeding up the developmental process.

With a season as long as 162 games, there is no telling how much depth could be needed in a given year. Just ask the Mets. That’s why it is important to maximize the development in a team’s farm system. At the end of the day, this is merely a marginal benefit. It will not take an organization’s farm system from worst to first. However, it only takes one player that unexpectedly steps up in September to alter a playoff race, proving worth to the investment.

Hardball Retrospective – What Might Have Been – The “Original” 2008 Mariners

In “Hardball Retrospective: Evaluating Scouting and Development Outcomes for the Modern-Era Franchises”, I placed every ballplayer in the modern era (from 1901-present) on their original team. I calculated revised standings for every season based entirely on the performance of each team’s “original” players. I discuss every team’s “original” players and seasons at length along with organizational performance with respect to the Amateur Draft (or First-Year Player Draft), amateur free agent signings and other methods of player acquisition.  Season standings, WAR and Win Shares totals for the “original” teams are compared against the “actual” team results to assess each franchise’s scouting, development and general management skills.

Expanding on my research for the book, the following series of articles will reveal the teams with the biggest single-season difference in the WAR and Win Shares for the “Original” vs. “Actual” rosters for every Major League organization. “Hardball Retrospective” is available in digital format on Amazon, Barnes and Noble, GooglePlay, iTunes and KoboBooks. The paperback edition is available on Amazon, Barnes and Noble and CreateSpace. Supplemental Statistics, Charts and Graphs along with a discussion forum are offered at

Don Daglow (Intellivision World Series Major League Baseball, Earl Weaver Baseball, Tony LaRussa Baseball) contributed the foreword for Hardball Retrospective. The foreword and preview of my book are accessible here.


OWAR – Wins Above Replacement for players on “original” teams

OWS – Win Shares for players on “original” teams

OPW% – Pythagorean Won-Loss record for the “original” teams

AWAR – Wins Above Replacement for players on “actual” teams

AWS – Win Shares for players on “actual” teams

APW% – Pythagorean Won-Loss record for the “actual” teams



The 2008 Seattle Mariners 

OWAR: 41.0     OWS: 251     OPW%: .519     (84-78)

AWAR: 21.3      AWS: 183     APW%: .377     (61-101)

WARdiff: 19.7                        WSdiff: 68  

The “Original” 2008 Mariners finished a few percentage points behind the Athletics for the AL West crown but out-gunned the “Actual” M’s by a 23-game margin. Alex Rodriguez (.302/35/103) paced the Junior Circuit with a .573 SLG. Raul Ibanez (.293/23/110) established career-highs with 186 base hits and 43 two-base knocks.  Ichiro Suzuki nabbed 43 bags in 47 attempts and batted .310, topping the League with 213 safeties. Jose Lopez socked 41 doubles and 17 long balls while posting personal-bests with 191 hits and a .297 BA. Adrian Beltre clubbed 25 four-baggers and earned his second Gold Glove Award for the “Actuals”.

Ken Griffey Jr. ranked seventh in the center field charts according to “The New Bill James Historical Baseball Abstract” top 100 player rankings. “Original” Mariners chronicled in the “NBJHBA” top 100 ratings include Alex Rodriguez (17th-SS) and Omar Vizquel (61st-SS).


  Original 2008 Mariners                           Actual 2008 Mariners


Raul Ibanez LF 1.77 19.64 Raul Ibanez LF 1.77 19.64
Ichiro Suzuki CF/RF 3.36 19.48 Jeremy Reed CF -0.18 4.19
Shin-Soo Choo RF 2.86 14.97 Ichiro Suzuki RF 3.36 19.48
Ken Griffey, Jr. DH/RF 0 13.1 Jose Vidro DH -1.34 1.53
Bryan LaHair 1B -0.42 1.66 Richie Sexson 1B 0.06 4.43
Jose Lopez 2B 2.73 18.55 Jose Lopez 2B 2.73 18.55
Asdrubal Cabrera SS/2B 1.85 11.92 Yuniesky Betancourt SS 0.2 8.69
Alex Rodriguez 3B 4.99 27.21 Adrian Beltre 3B 2.45 16.09
Jason Varitek C 0.7 8.74 Kenji Johjima C -0.01 6.1
David Ortiz DH 1.37 12.01 Willie Bloomquist CF 0.15 3.92
Ramon Vazquez 3B 1.05 9.63 Miguel Cairo 1B -0.64 3.17
Adam Jones CF 1 9.12 Jeff Clement C -0.36 2.88
Yuniesky Betancourt SS 0.2 8.69 Jamie Burke C -0.16 1.89
Greg Dobbs 3B 0.7 7.22 Bryan LaHair 1B -0.42 1.66
Kenji Johjima C -0.01 6.1 Luis Valbuena 2B 0.15 1.19
Omar Vizquel SS -0.22 3.94 Wladimir Balentien RF -1.18 1.09
Willie Bloomquist CF 0.15 3.92 Greg Norton DH 0.21 0.99
Jeff Clement C -0.36 2.88 Brad Wilkerson RF -0.13 0.6
Luis Valbuena 2B 0.15 1.19 Rob Johnson C -0.3 0.35
Wladimir Balentien RF -1.18 1.09 Matt Tuiasosopo 3B -0.28 0.32
Chris Snelling 0.16 0.58 Mike Morse RF 0.03 0.28
Rob Johnson C -0.3 0.35 Tug Hulett DH -0.2 0.16
T. J. Bohn LF 0.05 0.34 Charlton Jimerson LF -0.03 0
Matt Tuiasosopo 3B -0.28 0.32
Jose L. Cruz LF -0.34 0.17

Derek Lowe and Gil Meche compiled identical records (14-11) while starting 34 games apiece. “King” Felix Hernandez contributed nine victories with an ERA of 3.45 in his third full season in the Major Leagues. Brian Fuentes accrued 30 saves while fashioning an ERA of 2.73 along with a 1.101 WHIP. “T-Rex” whiffed 82 batsmen in 62.2 innings pitched.

  Original 2008 Mariners                        Actual 2008 Mariners 

Derek Lowe SP 4.16 15.69 Felix Hernandez SP 3.99 13.45
Gil Meche SP 3.7 13.81 Ryan Rowland-Smith SP 2.1 8.39
Felix Hernandez SP 3.99 13.45 Erik Bedard SP 1.24 5.4
Ryan Rowland-Smith SP 2.1 8.39 Jarrod Washburn SP 0.7 5.11
Joel Pineiro SP -0.39 3.75 R. A. Dickey SP 0.2 3.28
Brian Fuentes RP 1.88 11.8 Brandon Morrow SW 1.09 7.19
Matt Thornton RP 1.95 9.41 Roy Corcoran RP 0.71 6.7
Ryan Franklin RP 0.52 7.47 J. J. Putz RP 0.4 5.24
Brandon Morrow SW 1.09 7.19 Sean Green RP -0.56 3.59
George Sherrill RP 0.03 6.43 Arthur Rhodes RP 0.48 3.03
Aquilino Lopez RP 0.93 6.13 Cesar Jimenez RP 0.66 2.28
Damaso Marte RP 0.52 6.02 Randy Messenger RP 0.19 0.84
J. J. Putz RP 0.4 5.24 Mark Lowe RP -1.11 0.68
Cha-Seung Baek SP 0.56 3.67 Cha-Seung Baek SW -0.11 0.56
Mike Hampton SP 0.34 2.32 Jake Woods RP -0.3 0.05
Cesar Jimenez RP 0.66 2.28 Miguel Batista SP -1.89 0
Ron Villone RP -0.13 1.94 Ryan Feierabend SP -0.88 0
Rafael Soriano RP 0.28 1.78 Eric O’Flaherty RP -1.07 0
Shawn Estes SP 0.03 0.88 Carlos Silva SP -1.91 0
Mark Lowe RP -1.11 0.68 Justin Thomas RP -0.07 0
Scott Patterson RP 0.22 0.43 Jared Wells RP -0.31 0
Kameron Mickolio RP -0.09 0.08
Ryan Feierabend SP -0.88 0
Eric O’Flaherty RP -1.07 0
Justin Thomas RP -0.07 0


Notable Transactions

Alex Rodriguez 

October 30, 2000: Granted Free Agency.

January 26, 2001: Signed as a Free Agent with the Texas Rangers.

February 16, 2004: Traded by the Texas Rangers with cash to the New York Yankees for a player to be named later and Alfonso Soriano. The New York Yankees sent Joaquin Arias (April 23, 2004) to the Texas Rangers to complete the trade.

October 29, 2007: Granted Free Agency.

December 13, 2007: Signed as a Free Agent with the New York Yankees. 

Derek Lowe

July 31, 1997: Traded by the Seattle Mariners with Jason Varitek to the Boston Red Sox for Heathcliff Slocumb.

November 1, 2004: Granted Free Agency.

January 11, 2005: Signed as a Free Agent with the Los Angeles Dodgers.

Shin-Soo Choo

July 26, 2006: Traded by the Seattle Mariners with a player to be named later to the Cleveland Indians for Ben Broussard and cash. The Seattle Mariners sent Shawn Nottingham (minors) (August 24, 2006) to the Cleveland Indians to complete the trade. 

Gil Meche

October 31, 2006: Granted Free Agency.

December 13, 2006: Signed as a Free Agent with the Kansas City Royals.

Ken Griffey Jr. 

February 10, 2000: Traded by the Seattle Mariners to the Cincinnati Reds for Jake Meyer (minors), Mike Cameron, Antonio Perez and Brett Tomko. 

David Ortiz 

September 13, 1996: the Seattle Mariners sent David Ortiz to the Minnesota Twins to complete an earlier deal made on August 29, 1996. August 29, 1996: The Seattle Mariners sent a player to be named later to the Minnesota Twins for Dave Hollins.

December 16, 2002: Released by the Minnesota Twins.

January 22, 2003: Signed as a Free Agent with the Boston Red Sox.

Honorable Mention

The 1999 Seattle Mariners 

OWAR: 46.4     OWS: 296     OPW%: .549     (89-73)

AWAR: 33.8      AWS: 237     APW%: .488     (79-83)

WARdiff: 12.6                        WSdiff: 59  

The “Original” 1999 Mariners secured the American League Western Division title by six games over the Rangers. The “Actuals” placed third, sixteen games behind Texas. Ken Griffey Jr. (.285/48/134) paced the circuit in home runs, tallied 123 runs and collected his tenth Gold Glove Award. Edgar Martinez (.337/24/86) topped the League with a .447 OBP. Alex Rodriguez (.285/42/111) swiped 21 bags and scored 110 runs. Slick-fielding shortstop Omar Vizquel posted career-highs in batting average (.333), runs scored (112) and base hits (191) while stealing successfully on 42 of 51 attempts. Tino Martinez clubbed 28 four-baggers and plated 105 baserunners. Bret Boone tagged 38 doubles and surpassed the century mark in runs. Jason Varitek drilled 39 two-base knocks and swatted 20 big-flies during his first full campaign.

Mike Hampton (22-4, 2.90) placed runner-up in the Cy Young Award balloting. Derek Lowe notched 15 saves in 74 relief appearances. Dave Burba contributed a 15-9 record and set personal-bests with 34 starts and 220 innings pitched.

On Deck

What Might Have Been – The “Original” 1993 Angels

References and Resources

Baseball America – Executive Database


James, Bill. The New Bill James Historical Baseball Abstract. New York, NY.: The Free Press, 2001. Print.

James, Bill, with Jim Henzler. Win Shares. Morton Grove, Ill.: STATS, 2002. Print.

Retrosheet – Transactions Database

The information used here was obtained free of charge from and is copyrighted by Retrosheet. Interested parties may contact Retrosheet at “”.

Seamheads – Baseball Gauge

Sean Lahman Baseball Archive

The St. Louis Cardinals Have a Type

This series will cover various trends I’ve observed major-league baseball teams following. Some trends will be analytical while others will be more…”conceptual.” Trends may span a season, or even several, it doesn’t matter, I don’t want to limit myself out of the box. Ideally, I’d like to cover all 30 teams, but I also don’t want to expect too much of myself out of the box, either. After all, I don’t have Francisco Lindor’s smile to pull it off.

Image result for francisco lindor trips on bat gif

Maybe that kind of thinking is limiting — not the part about Lindor’s smile (though in a weird way it does tie in), but maybe I like to undertake something with the caveat that I might not follow through because of experience, mine or others (see Stevens, Sufjan — 50 states project). Or maybe I don’t want to underestimate the extent of my laziness. Or maybe I’m just a glass-half-empty kind of guy…

And maybe all of this relates to my face.

From Wikipedia: “Physiognomy is the assessment of a person’s character or personality from his or her outer appearance, especially the face.”

It’s no secret that we’re all judged on our outer appearance. Some studies have shown it even relates to how well we’re paid. A predisposition towards handsome exists in baseball, too. It’s in the old scouting maxim, “the good face,” which essentially is the baseball colloquialism for “hottie.” But it can also refer to the potential presence of naturally-elevated levels of testosterone, as a strong jaw and well-defined cheekbones are sometimes indicative of the hormone.

Hogwash! Right? Well, have you ever wondered what it would be like to look like Brad Pitt and thought about how differently people would react to you? Now, I’m not talking about a matter of right or wrong, but people would generally respond more positively to you, both socially and professionally, and that does have an impact on confidence, which plays a massive, albeit intangible role in a baseball player’s on-field success.

But, come on. With all the advanced methodology we have to evaluate players, isn’t the “The Good Face” adage a thing of the past? I’m sure it’s probably lost some of its weight in the player-evaluation process, but it hasn’t disappeared. In fact, in the evaluation process used by (arguably) the most successful team of this decade, it’s very much alive. In recent memory, there have been enough handsome doppelgangers in their mix to wonder if the “Cardinal way” isn’t some iron-clad philosophy the organization established to allow them to get the most out of their young players, but that it might just be a certain type of guy!

You’re at FanGraphs, and so I assume you’re a savvy individual and that you know a ruse when you read one, but I want to qualify this writing by saying that this proposition is roughly ~0.0000000000000001% serious. Okay, so essentially, there are six archetypes for Cardinals players’ faces.

  1. The Wain-Os


Pseudoscience says: “If you have an oval face shape, you always know the right things to say.”


2. The Kozmakazies


Pseudoscience says: “If you have a square-shaped face, you are gung-ho and a total go-getter.”


3. The DesCarpenSons


Pseudoscience says: “You value logic and you’re a really good thinker. Plus, you’re an awesome planner.”

4. The Lynnburger


5. The Ambiguous Pham


Pseudoscience says: “If you have a diamond face shape, you’re a control freak. You’re very detail-oriented…”

6. We Don’t Want No Scruggs


Pseudoscience says: See the Wain-Os

Yes, it helps they’re in the same uniform, and yes, I very obviously cherry-picked some of those, but aren’t you still a little floored? The variation here rivals the lack of distinguishability featured among the male contestants on the Bachelorette.

So isn’t this proof of old-school scouting at work? What gives with all the talk of the Cardinals’ cutting-edge front office — are they just masquerading with the hiring of NASA data analysts and organizational philosophies? Or have they truly married the new school and old school? Maybe there is something to building a roster of similar-looking players that prevents “fault lines” from forming.

Or maybe…

Think back to the hacking scandal of 2015. The Cardinals’ new Director of Scouting, Christopher Correa, hacked the Astros’ database for information on players regarding the draft, bonuses, and trade talks. Keep in mind, he was working for the Cardinals, not a brand-new expansion team; he could’ve hired anyone he wanted to work for him. He could’ve had his own NASA data analyst, just like Jeff Luhnow had done before him. I know that in the minds of these men, there’s a lot at stake, and so they look for any competitive advantage they can, but this scenario feels like it’s the smartest kid in class copying off the other smartest kid in class on a math test.

So what did Jeff Luhnow have access to that Correa didn’t?!

It was one file, actually. A file buried deep within the infrastructure of the Astros’ database. A file called “Stardust” (Yes, like in Rogue One). Allow me to explain.

This is daughter Luhnow. Her name and age are unknown (Jeff did not respond to my tweets), but my wife estimates her to be 19 in this photo. If we work off that number, she’s at least 20 now, and that means she’s probably been able to identify boys she thinks are cute for around 15 years, which lines up perfectly with when her dad was hired by the Cardinals in 2003.

Imagine it, “it’s easy if you try;” one day, a five-year-old daughter Luhnow wandered into her dad’s office and climbed up onto his lap while he was looking at some files of some players he was targeting to acquire. Mostly just talking to himself, Jeff explained the pros and cons of each player to his daughter and showed her their pictures. When he got to a young pitcher in the Atlanta Braves’ farm system, she put her hands to her mouth and giggled. “What’s so funny?” Jeff asked his suddenly-bashful daughter. Her face was nuzzled in her dad’s chest, so the words were a bit muffled, but Jeff heard them clear as day. “He’s cute,” she responded.

It was a strange moment for Jeff — he wrestled back the protective instincts welling up inside him, but as he looked at the picture of the lanky, young right-handed pitcher, he realized that she wasn’t wrong. Adam Wainwright was handsome in an awkward, President’s son kind of way.

While this was the deciding factor for Jeff, he was thrilled that he wouldn’t have to admit that to his bosses, because Wainwright was also a top-100 prospect. So the Cardinals sent J.D. Drew and Eli Marrero to the Braves for Wainwright, Jason Marquis, and Ray King (an admittedly motley crew).

Jeff remembered that moment and would, from time to time, call his daughter into his office and gauge her reactions to the players he’d show her. Eventually, however, he didn’t need to call her in anymore. Daughter Luhnow liked baseball, and liked looking at the pictures of the young men; it was like reading a Teen Beat magazine with her dad!

Before I go any further, I want to note that this is one of those conceptual pieces I referred to in the intro, and that the parts about daughter Luhnow are entirely fictitious. There are also no underlying misogynistic themes at play here. I believe a woman could run a major-league baseball team as well as any man — I just think the idea of a team as renowned and successful as the Cardinals being run on the lustful whims of a teenage girl is really funny.

So the way I see it, she had her own Excel spreadsheet where she could rate the features of potential acquisitions on the same 20 – 80 scale as scouts. She could comb through high-school, college, minor-league, and major-league rosters and highlight her favorite guys by coming up with an overall score.

This authoritative list, while completely undisclosed until now, has unwittingly been at the center of a couple of controversies. It is what ultimately drove the wedge between Walt Jocketty and the Cardinals, and also, as previously mentioned, is the holy grail that Christopher Correa was in search of when he hacked the Astros’ database — and what he is currently serving a 46-month jail sentence for.

About the moves that Correa made without the elusive “Stardust” file. He had an idea of her type of guy based on previous transactions, and he was able to make some quality, daughter-Luhnow-inspired acquisitions. Of course, that’s hardly a silver lining. Try explaining to your cell mate that you’re in prison for hacking into someone else’s computer for a list of cute, young men (some of which are still in high school!).

You get it. You’re on board. The Cardinals’ success has largely been driven by a teenager’s romantic fantasies. Okay, maybe not. Regardless, I still have a hard time telling the difference between Adam Wainwright and Michael Wacha and I want to see if you are any better. Here are eight pictures of the two Cardinal pitchers, four of each; in the comments section, please attempt to sequence these correctly, and that’s it. This is what happens in the doldrums of the offseason!



The Mets’ Suboptimal Outfield

Consider the current payrolls of two teams:

Team            Payroll          MLB Rank

Team A      $133.7M                9

Team B      $133.3M               10

You, being a reader of some intellectual attainment, have probably divined that one of these teams is the New York Mets. That would be Team A. Team B is the Seattle Mariners. As we enter 2017, just under eight years after Bernie Madoff’s guilty plea, the Mets still have the payroll of a team playing the 18th-largest city in America; four of NYC’s five boroughs have more people.

Mets’ GM Sandy Alderson has assembled a team that is essentially the anti-Cubs: the Mets’ core is their young, cost-controlled pitching staff, which was the best in the majors last year according to FIP-. Supporting the staff is a cast of position players that produce roughly MLB-average offense (16th last year in wRC+) and defense (15th in UZR/150). The Mets payroll is upside-down, heavily invested in the modestly effective position players, while the outstanding pitchers mostly throw for food. The most expensive pitcher on their roster is Addison Reed, at $7.75M. At Mets prices, for the coming year, that would buy you around one-third of Yoenis Cespedes or David Wright.

The Alderson formula has produced three years of 80+ win teams from 2014-2016 (82, 89, and 87, according to Pythagoras). But clouds are gathering. Seven of the eight starting position players on opening day will be at least 30 years old. Even the young pitching is less young than you might think. Matt Harvey will be 28, and Jacob deGrom already is. The pitchers’ long war with soft tissue has intensified: After last season, Steven Matz finally donated his bone spurs to science, but worryingly is planning to throw slower in 2017. Perhaps necessity will beget virtue, but Matz’ room for error may decline with his average velo. Noah Syndergaard still has his bone spurs, and Zack Wheeler may never start another major-league game. And so on.

Which brings us to today’s topic, which is focused on the Mets’ peculiar outfield, and their especially peculiar decision to give Jay Bruce most of the starts in right. The Mets’ failure to move Bruce in the offseason has been well-chronicled. Bruce had seemed to get his career back on track with 402 blistering plate appearances with the Reds in 2016, and the Mets jumped at the chance to get him in exchange for two pieces deemed expendable (Dilson Herrera and Max Wotell). Bruce cratered in New York, posting the second-worst ISO and wOBA of his career (if you were to consider his time in New York to be a separate season). After that performance, Met fans would have traded Bruce for a traffic jam in Fort Lee, but Alderson wanted more.

You can see Alderson’s logic: Having traded two prospects away (Herrera has exceeded his rookie eligibility, but he’s still only 22), Alderson now wanted two prospects back. As the Forbes article linked above noted, this misread the market. But it also misread Jay Bruce. In 2016, Bruce’s combined wRC+ was 111, good for 14th in the majors out of 21 right-field qualifiers. Bruce’s career wRC+ is 107 — so, far from being an anomaly, last year taken as a whole was simply Jay being Jay. Alderson paid for those 402 tantalizing plate appearances with the Reds in 2016, rather than considering Bruce’s entire body of work. Right field is an offensive position, and Bruce’s offensive contributions are modest. On a playoff team, he’s probably better suited to a bench role.

Steamer projects Bruce to regress to a wRC+ of 97 this year, while the man Bruce will effectively bump from the lineup, Michael Conforto, is projected to achieve 113. It’s possible the Mets’ internal projection system gives Bruce a much better prognosis; it’s likely the other 29 teams’ systems don’t think much of Bruce, or he wouldn’t still be a Met. Steamer thinks Conforto is worth about 0.7 wins more than Bruce, with Bruce getting over 100 more plate appearances. Giving Conforto the everyday role (or at least the everyday role against northpaws) and reducing Bruce’s playing time could be worth a win or so to the Mets.

How important is that win? Extremely, it would seem. As noted above, the Mets have assembled a team capable of getting into the playoffs, but not likely to overwhelm the competition. In this sense the Mets aren’t like the Cubs at all; the Cubs were assembled to crush their competition in the regular season, while the Mets plan is to squeeze into the playoffs and then say a number of Hail Marys that can only be expressed in scientific notation. The Cubs could have afforded to start Jay Bruce in right last year, and in fact they started someone worse (offensively, at least) and still broke a century-old curse. The Phillies could afford to start Jay Bruce in right in 2017 (and indeed wanted him, though not at Alderson’s price), because wins in 2017 will likely mean little to them. For a team like the Phillies, with some money to spend and no plans to win this year, Bruce would be useful cannon fodder — someone to run out there most days who allows them to keep their more valuable prospects in the minors.

The Mets are in a far different position than either of these teams, neither certain to dominate nor certain to fold. FanGraphs projects the Mets to win 83 games this year, which would put them just outside the second wild-card spot. I think that exact total may be a little pessimistic, but focus on their overall position in the league rather than the specific number. Four teams are projected to have between 82 and 88 wins (the Mets, Cards, Pirates, and Giants); it is fairly easy to imagine any two of them being the wild cards.

Moreover, the Mets are in win-now mode. As noted above, this is an old roster, and there’s not a lot of help on the way. The Mets have just two players in MLB’s top 100 prospects, though one of them is Amed Rosario, who could solve the Mets’ shortstop problems for a decade. With a Seattle-size payroll, and two long-term contracts (Cespedes and Wright) destined to get ever more albatrossy as the months tick by, the Mets need to scrape for every win they can now. The fragility of the Mets’ starters, who are unquestionably the team’s strength, gives the task further urgency.

Seen in this light, the decision to play Bruce seems to be an unforced error. The Mets have three options here:

  • Use Bruce as a bench player: This fits Bruce’s current skills. He can be an effective left-handed pinch-hitter, and play three corner spots in a pinch. It is admittedly difficult to pay a player $13M to spit seeds for six innings, but as noted above, the Mets need to win right away, and Bruce can help them do that.
  • Pay some other team to make Bruce go away: The Mets asking price for Bruce over the winter was too high: They wanted prospects in exchange for paying none of his salary, and Alderson now knows that was unrealistic. But the Mets might be able to get another franchise to take perhaps half of his salary in exchange for a low-A player with some upside; high-velocity relievers with arm or control problems are sometimes the currency of exchange in trades like this. And it’s difficult to believe that the relatively cash-strapped Mets could find no good use for $7M.
  • Start Bruce to enhance his trade value: This seems to be what Alderson has in mind: hope that Bruce gets hot like he did last year, and then flip him for at least the two prospects that it cost to get him in the first place. This kind of stock-market baseball makes sense only if the wins don’t matter, but every win will matter for the Mets this year.

The Mets have an interesting team. A lot of people would actually like them if they weren’t the New York Mets. In piloting this intriguing but surprisingly cost-constrained franchise, the usually sure-handed Alderson shouldn’t compound his initial error in acquiring Bruce by misusing him now that he’s here.

The Worst Pitch in Baseball

Quick thought experiment for you: what’s the worst pitch a pitcher can throw? You might say “one that results in a home run” but I disagree. Even in batting practice, hitters don’t hit home runs all the time, right? In fact, let’s quantify it — according to Baseball Savant there were 806 middle-middle fastballs between 82 and 88 MPH thrown in 2016. Here are the results of those pitches:

2016 Grooved Fastballs
Result Count Probability
Strike 296 36.7%
Ball 1 0.1%
Out 191 23.7%
Single 49 6.1%
Double 17 2.1%
Triple 4 0.5%
Home Run 36 4.5%
Foul 212 26.3%
SOURCE: Baseball Savant

So 86% of the time, we have a neutral or positive result for the pitcher, and the remaining 14% something bad happens. Not great, but when a pitcher *does* give up a homer on one of these pitches, there wasn’t really more than a 5% chance of that happening.

No, for my money, the worst thing a pitcher can do is to throw an 0-2 pitch that has a high probability of hitting a batter. The pitcher has a huge built-in advantage on 0-2, and by throwing this pitch he throws it all away and gives the batter a free base (or, at best, runs the count to 1-2). But everyone makes mistakes.

That’s Clayton Kershaw, hitting the very first batter he saw in 2015 with an 0-2 pitch. Here’s Vin Scully, apparently unwilling to believe Kershaw could make such a mistake, calling the pitch:

Strike two pitch on the way, in the dirt, check swing, and it might have hit him on the foot, and I believe it did. So Wil Myers, grazed by a pitch on an 0-2 count, hit on the foot and awarded first base. So Myers…and actually, he got it on his right knee when you look at the replay.

I was expecting more of a reaction from Kershaw — for reference, check out this reaction to throwing Freddie Freeman a sub-optimal pitch — but we didn’t get one. I wouldn’t worry about him, though — he’s since thrown 437 pitches on 0-2 counts without hitting a batter.

Kershaw is pretty good at avoiding this kind of mistake, but the true champion of 0-2 HBP avoidance is Yovani Gallardo*, who has thrown well over 1,200 0-2 pitches in his career without hitting a batter once. Looking at a heat map of his 0-2 pitches to right-handers (via Baseball Savant), you can see why — it’s hard to hit a batter when you’re (rightly) burying the pitch in the opposite batter’s box.

*Honorable mention: Mat Latos, who has thrown nearly as many 0-2 pitches as Gallardo without hitting a batter

Of course, 0-2 HBPs are fairly rare events, so it shouldn’t be too surprising to find that a few pitchers have managed to avoid them entirely. In fact, most pitchers are well under 1% of batters hit on 0-2 pitches. To get a global overview of how all pitchers did, let’s look at a scatter plot of average 0-2 velocity versus percent of HBPs in such counts over the past three years (click through for an interactive version):

I think one of these data points sticks out a bit to you.

I hate to pick on the guy, but that’s Nick Franklin, throwing the only 0-2 pitch of his life, and hitting Danny Espinosa when a strikeout would have (mercifully) ended the top of the ninth of this game against the Nationals. Interestingly, Franklin was much more demonstrative than Kershaw was, clapping his hands together and then swiping at the ball when it came back from the umpire. He probably knew that was his best opportunity to record a strikeout in the big leagues, and instead he gave his man a free base. Kevin Cash! Give this man another chance to redeem himself. He doesn’t want to be this kind of outlier forever.