I have coded up a little machine learning model that grades pitches by their movement and location, and then shows the scores as a predicted xwOBA. So, basically, it looks at each individual pitch (its movement and location) and then looks at the history of pitches most like it and then sees how things usually turn out on those pitches.
So now I have a “predicted xwOBA” number for every pitch thrown. And that lets us do some cool stuff by comparing predicted vs. actual.
Let’s look at a few examples before getting into some application. Here is the model’s choice for worst pitch of the season:
A gross, slow, hanging curveball right into the meat of the strike zone. And Ke’Bryan Hayes let it go.
Here’s the model’s pick for best pitch in the zone:
Painted, high movement sinker up and in to a lefty. Beautifully done.
But no scores are given out unless a pitch is put in play, because there is no actual xwOBA value assigned to a pitch that isn’t put in play (since xwOBA is based on launch angle and exit velocity). So, to show the point, let’s look at the two extremes so far this season.
Here is a pitch from Elvin Rodriguez to Santiago Espinal that had a super high predicted xwOBA of 1.12 (a bad pitch). However, Espinal’s weak popup generated just a .039 xwOBA.
The Espinal is assigned -1.08 for that. On the flipside, here’s a pitch from Chase Dollander to James Wood that the model thought would generate a low xwOBA, but Wood punished it for a homer:
So he gets a +1.89 for that. And then to get a full score, we can take the average of those differentials. I call it xwOBA OE (expected xwOBA over expectation).
It has been added to the dashboard.
Your league leaders:
Aaron Judge .145
Pete Alonso .130
Fernando Tatis Jr. .126
Marcell Ozuna .117
Corbin Carroll .114
Jorge Polanco .103
Oneil Cruz .099
Kyle Tucker .099
Salvador Perez .094
Shohei Ohtani .088
One good way to see if a hitting stat is any good or not is to make sure that Aaron Judge is on top. And he is, so that’s good. Your league’s worst:
Joc Pederson -.136
Kyle Isbel -.132
Alan Roden -.125
Patrick Bailey -.116
Jeimer Candelario -.115
Maxwell Muncy -.096
Michael Massey -.094
Tommy Pham -.090
Taylor Walls -.088
Hunter Renfroe -.088
So this gives you some idea about what hitters are doing with the opportunity given to them.
You can also filter down to just balls put in play on the dashboard with that “Contact” dropdown:
It doesn’t change much, here are the top 20:
Aaron Judge
Corbin Carroll
Oneil Cruz
Fernando Tatis Jr.
Shohei Ohtani
Cal Raleigh
Pete Alonso
Spencer Torkelson
Salvador Perez
Ben Rice
Mike Trout
Jonathan Aranda
Byron Buxton
Marcell Ozuna
Rafael Devers
Jorge Polanco
Dillon Dingler
Freddie Freeman
Seiya Suzuki
James Wood
Bottom 20:
Joc Pederson
Santiago Espinal
Alan Roden
Kyle Isbel
Mookie Betts
Jacob Young
Nolan Arenado
Jeimer Candelario
JJ Bleday
Tommy Pham
Bo Naylor
Joey Ortiz
LaMonte Wade Jr.
Ozzie Albies
Kyle Farmer
Luis Arraez
Ernie Clement
Michael Massey
Nico Hoerner
Trea Turner
A few alarming names there! Those (former?) stud hitters are under-performing big time on contact this year.
Application
I’d mostly use this to evaluate waiver wire hitters. We can look at some the low-owned guys popping up here right now: