Upgrading My Individual Pitch Result Metric
On a personal level, the All-Star break can be declared a success as I’ve made major improvements to my pitch result evaluator, pERA. I was supposed to do dive into it last season, but I spent most of the time dealing with the league’s new rules so this update got pushed off until now. I planned on adding Ball Percentage (Ball%), Called Strikes (CStr%), and StatCast batted ball information. I felt each add would provide a clearer picture of the pitcher’s pitches. I eventually found out I was double counting the same information with Ball% and CStr% and needed to remove one.
The key element of pERA is to grade out each pitch and have a way to value a pitcher who adds or losses a pitch. If the pitcher throws an ineffective change and ditches it, how should the pitcher’s results change? To answer the question, I created pERA
It was almost seven years ago when I created the initial formula that included:
- Swinging Strike Rate: Ability of a pitch to generate swings-and-misses.
- Groundball Rate: If the pitcher is on either end of the groundball spectrum, they can outperform their ERA estimators by generating fieldable contact.
- Walk Rate: I included the walk rate once all the individual pitches were added up. This was a major issue that elevated several pitches that were never near the strike zone.
The overall results have stood the test of time but needed some fine-tuning. Here are the improvements I planned on incorporating.
Called plus Swinging-Strike Rate: All strikes are the same and this improvement catches the starters who paint the corners. The idea came from the work of Alex Fast at Pitcher List.- Fieldable Contact (<-5 degrees, >40 degrees): This addition puts all the fieldable batted balls into one bucket
- Ball%: This addition was huge and I’m a little disappointed I didn’t think of it when I created the initial formula. Some recent work with Ball% was the light bulb I needed to include it.
I had about 95% of this article’s first draft done but found out that I was double counting the same items, Ball% and CStr%. Control pitchers, who could paint the zone, got called strikes and fewer balls. Their fastballs looked elite but weren’t. Called Strike Rate got cut and I just went with Swinging Strike Rate.
With the two additions, I collected a dataset to transform the raw data into something useful. I used pitchers who threw at least 80 IP from 2015 to 2023 (1237 in the sample). I was limited to those seasons because of StatCast’s availability.
With the dataset, I created the following equations.
- K% = SwStr% * 2.1
- BB% = .6846*Ball%-.1695
- ERA = -10.55 * (K%-BB%) + 5.6144
- Weak contact adjustment [46% Weak% is where there is no adjustment] = -3.4904 * Weak% + 1.6142 The weak contact allows a single overall value to be generated without the addition of an individual pitch score because popups and groundball are combined. I might move to a polynomial equation where values on the extreme are weighed more (-297.5 * Weak%^3+418.5 *Weak%^2-198.4*Weak%+31.695).
With the math and background out of the way, it’s time for idiot (failed the first time) checks. Here are the top-10 starters (min 60 IP) and relievers (min 20 IP). Additionally, the top grades for each pitch (link to the full sheet).
Overall pERA
Pitcher | GS | IP | ERA | FIP | xFIP | SIERA | xERA | K%-BB% | pERA |
---|---|---|---|---|---|---|---|---|---|
Spencer Strider | 18 | 104.2 | 3.44 | 2.84 | 2.83 | 2.67 | 3.08 | 31% | 2.34 |
Luis Castillo | 18 | 107.1 | 2.85 | 3.78 | 3.69 | 3.65 | 3.73 | 20% | 2.85 |
Shane McClanahan | 17 | 96.0 | 2.53 | 3.85 | 3.88 | 4.11 | 3.97 | 16% | 2.95 |
Pablo Lopez | 18 | 111.0 | 3.89 | 3.17 | 3.44 | 3.30 | 3.04 | 24% | 3.09 |
Joe Ryan | 18 | 107.0 | 3.70 | 3.50 | 3.60 | 3.32 | 2.88 | 25% | 3.10 |
Jesus Luzardo | 19 | 109.1 | 3.29 | 3.23 | 3.44 | 3.37 | 3.52 | 23% | 3.23 |
Clayton Kershaw | 16 | 95.1 | 2.55 | 3.53 | 3.27 | 3.46 | 3.47 | 21% | 3.28 |
Max Scherzer | 16 | 87.2 | 4.31 | 4.54 | 3.98 | 3.68 | 3.62 | 21% | 3.45 |
Domingo German | 17 | 91.2 | 4.32 | 4.62 | 4.08 | 4.03 | 4.20 | 17% | 3.49 |
Lance Lynn | 18 | 103.0 | 6.03 | 4.81 | 3.74 | 3.73 | 4.50 | 20% | 3.51 |
Pitcher | GS | IP | ERA | FIP | xFIP | SIERA | xERA | K%-BB% | pERA |
---|---|---|---|---|---|---|---|---|---|
Robert Stephenson | 0 | 28.1 | 4.45 | 4.27 | 3.67 | 3.29 | 4.23 | 21% | 1.60 |
Brock Stewart | 0 | 25.2 | 0.70 | 2.46 | 3.39 | 2.99 | 2.44 | 24% | 1.93 |
Felix Bautista | 0 | 42.0 | 1.07 | 1.64 | 1.66 | 1.76 | 1.95 | 39% | 2.04 |
Jordan Romano | 0 | 37.2 | 2.87 | 3.07 | 3.34 | 2.93 | 3.01 | 24% | 2.25 |
Keynan Middleton | 0 | 32.0 | 3.09 | 3.87 | 2.79 | 2.82 | 3.52 | 23% | 2.36 |
David Bednar | 0 | 35.1 | 1.27 | 1.87 | 3.53 | 2.91 | 2.18 | 25% | 2.36 |
Jhoan Duran | 0 | 34.1 | 2.10 | 3.28 | 2.89 | 2.89 | 2.38 | 22% | 2.44 |
Ryan Pressly | 0 | 39.1 | 2.52 | 2.75 | 2.81 | 2.60 | 2.62 | 23% | 2.46 |
Raisel Iglesias | 0 | 26.1 | 3.76 | 3.66 | 3.08 | 2.98 | 3.47 | 23% | 2.56 |
Tanner Scott | 0 | 43.1 | 2.91 | 2.24 | 2.60 | 2.62 | 2.36 | 27% | 2.58 |
Pitcher ERA (min 300 pitches)
Pitcher | IP | pERA | Weak% | SwStr% | Ball% | Cnt |
---|---|---|---|---|---|---|
David Bednar | 35.1 | 1.79 | 43% | 20% | 31% | 314 |
Luis Castillo | 107.1 | 1.99 | 51% | 18% | 31% | 766 |
Paul Sewald | 36.1 | 2.35 | 42% | 16% | 26% | 305 |
Felix Bautista | 42.0 | 2.44 | 36% | 18% | 32% | 493 |
Joe Ryan | 107.0 | 2.51 | 40% | 15% | 24% | 977 |
Pablo Lopez | 111.0 | 2.79 | 34% | 15% | 26% | 604 |
George Kirby | 107.2 | 2.90 | 42% | 14% | 27% | 616 |
Joe Jimenez | 30.2 | 3.15 | 41% | 13% | 28% | 334 |
Ryne Stanek | 30.2 | 3.19 | 48% | 14% | 35% | 369 |
Lance Lynn | 103.0 | 3.24 | 38% | 15% | 33% | 756 |
Pitcher | IP | pERA | Weak% | SwStr% | Ball% | Cnt |
---|---|---|---|---|---|---|
Josh Hader | 33.1 | 3.52 | 43% | 14% | 36% | 441 |
Kyle Finnegan | 37.1 | 3.74 | 41% | 12% | 34% | 362 |
Jason Foley | 38.2 | 3.94 | 53% | 7% | 25% | 404 |
Michael Tonkin | 44.0 | 3.97 | 40% | 10% | 29% | 411 |
Steven Matz | 71.2 | 4.01 | 43% | 11% | 35% | 717 |
Tim Mayza | 30.2 | 4.07 | 54% | 9% | 34% | 349 |
Zack Wheeler | 104.1 | 4.17 | 52% | 7% | 28% | 307 |
George Kirby | 107.2 | 4.20 | 50% | 6% | 27% | 377 |
Brayan Bello | 80.0 | 4.25 | 48% | 7% | 30% | 470 |
Jose Cuas | 36.0 | 4.26 | 45% | 8% | 29% | 329 |
Pitcher | IP | pERA | Weak% | SwStr% | Ball% | Cnt |
---|---|---|---|---|---|---|
Lance Lynn | 103.0 | 2.83 | 42% | 15% | 31% | 474 |
Kenley Jansen | 30.2 | 3.07 | 54% | 12% | 31% | 410 |
Emmanuel Clase | 42.2 | 3.08 | 48% | 13% | 30% | 424 |
Tyler Anderson | 84.0 | 3.14 | 38% | 15% | 34% | 356 |
Shane Bieber | 117.0 | 3.24 | 46% | 14% | 34% | 461 |
Joey Wentz | 71.2 | 3.31 | 40% | 14% | 32% | 329 |
Kodai Senga | 89.2 | 3.51 | 49% | 10% | 27% | 357 |
Clarke Schmidt | 88.0 | 3.64 | 30% | 13% | 30% | 382 |
Colin Rea | 80.1 | 3.80 | 37% | 13% | 36% | 318 |
Nathan Eovaldi | 117.2 | 3.88 | 49% | 10% | 33% | 312 |
Pitcher | IP | pERA | Weak% | SwStr% | Ball% | Cnt |
---|---|---|---|---|---|---|
Spencer Strider | 104.2 | 0.29 | 37% | 29% | 34% | 592 |
Clayton Kershaw | 95.1 | 0.97 | 46% | 22% | 27% | 652 |
Kyle Nelson | 34.2 | 1.13 | 44% | 22% | 30% | 330 |
Braxton Garrett | 92.1 | 1.28 | 29% | 24% | 31% | 390 |
Alexis Diaz | 40.0 | 1.45 | 42% | 22% | 32% | 318 |
Tanner Scott | 43.1 | 1.49 | 40% | 21% | 30% | 363 |
Ronel Blanco | 46.0 | 1.58 | 43% | 22% | 36% | 396 |
Jordan Romano | 37.2 | 1.68 | 38% | 21% | 31% | 324 |
Matt Brash | 36.0 | 1.68 | 40% | 22% | 36% | 317 |
Reid Detmers | 85.2 | 1.75 | 29% | 21% | 29% | 554 |
Pitcher | IP | pERA | Weak% | SwStr% | Ball% | Cnt |
---|---|---|---|---|---|---|
Alex Lange | 36.2 | 1.44 | 42% | 23% | 35% | 366 |
Domingo German | 91.2 | 1.45 | 42% | 20% | 27% | 569 |
Zach Eflin | 102.1 | 2.07 | 40% | 20% | 33% | 424 |
Charlie Morton | 97.0 | 2.43 | 47% | 18% | 36% | 747 |
Pierce Johnson | 34.2 | 2.46 | 30% | 18% | 29% | 342 |
Zac Gallen | 118.1 | 2.79 | 35% | 20% | 43% | 443 |
Aaron Nola | 119.0 | 2.84 | 39% | 16% | 33% | 591 |
Sonny Gray | 99.2 | 3.04 | 37% | 16% | 32% | 322 |
Framber Valdez | 111.0 | 3.05 | 43% | 18% | 42% | 396 |
MacKenzie Gore | 89.2 | 3.11 | 33% | 19% | 40% | 335 |
Pitcher | IP | pERA | Weak% | SwStr% | Ball% | Cnt |
---|---|---|---|---|---|---|
Scott McGough | 46.1 | 1.06 | 48% | 24% | 35% | 318 |
Erik Swanson | 42.2 | 1.33 | 51% | 20% | 29% | 322 |
Nathan Eovaldi | 117.2 | 2.21 | 53% | 18% | 35% | 477 |
Kevin Gausman | 115.2 | 2.64 | 41% | 20% | 43% | 713 |
Joe Ryan | 107.0 | 3.44 | 45% | 13% | 33% | 461 |
Alex Cobb | 89.2 | 3.72 | 44% | 13% | 36% | 534 |
Taijuan Walker | 96.1 | 3.90 | 49% | 13% | 42% | 548 |
Pitcher | IP | pERA | Weak% | SwStr% | Ball% | Cnt |
---|---|---|---|---|---|---|
Blake Snell | 98.0 | 0.46 | 38% | 27% | 33% | 305 |
Shane McClanahan | 96.0 | 0.61 | 44% | 28% | 39% | 367 |
Trevor Richards | 44.2 | 0.89 | 51% | 24% | 34% | 451 |
Jovani Moran | 35.2 | 1.54 | 50% | 23% | 41% | 301 |
Logan Webb | 126.0 | 1.62 | 54% | 17% | 25% | 683 |
Michael Wacha | 85.2 | 1.90 | 42% | 19% | 31% | 444 |
Devin Williams | 33.1 | 2.22 | 45% | 20% | 38% | 305 |
Patrick Sandoval | 85.2 | 2.24 | 42% | 20% | 38% | 393 |
Edward Cabrera | 67.0 | 2.34 | 44% | 19% | 38% | 372 |
Jesus Luzardo | 109.1 | 2.35 | 49% | 18% | 37% | 365 |
Some observations.
- Robert Stephenson (top reliever): The biggest disconnect between his results is the Ball%. Usually, a Ball% of 31% (140 balls in 447pitches) would point to a 1.6 BB/9, not Stephenson’s 4.1 BB/9.
- Lance Lynn shows his face a few times. The biggest issues with Lynn are his curve (5.41 pERA) and change (4.91 pERA). Both have a high Ball% over 50%.
- Few, if any, sinkers are effective compared to other pitches
- Splitters: Just seven guys who feature the pitch but the pitch is effective for all of them. Underutilized option.
Overall, I’m happy with how everything turned out. I feel I’m about 95% finished with a few places to clean up around the edges. In addition to cleaning up the data, here are some areas I could improve on:
- As mentioned above, I could use a different equation for the batted ball adjustment.
- Regress the pERA values. In small samples, extremes show up, so it’s nice to incorporate some regression. One item I am going to immediately is a regress is the batted ball data. With fewer samples than strikes and balls, the batted ball takes longer to stabilize.
- I want/need to dive into a pitcher’s Hard Hit Rate (Exit Velocity based). Every time I’ve tried to incorporate it, I can’t find any correlation once the fieldable data (launch angle) is included.
- I want to run some year-to-year correlations and comparisons. The correlations compare to xFIP and SIERA, but I want a final equation before running all these tests and publishing the results.
- The next step and it will be a major one going forward is how much to weigh a pitcher’s STUFFF (pitch shape-based projections) with the actual results. Should STUFFF be used for three games? A 50/50 mix after five games? This step would then determine how much to adjust season-long projections.
- The pERA values for right and left-handed hitters. How pitchers handle certain hitter-handedness can give an idea of when a pitcher might struggle against certain lineups.
Well, that’s it for this article. What I’d like is any feedback on how it might be improved. I need to nail down these pitch results values before moving to the next step of combining them with STUFFF values.
Jeff, one of the authors of the fantasy baseball guide,The Process, writes for RotoGraphs, The Hardball Times, Rotowire, Baseball America, and BaseballHQ. He has been nominated for two SABR Analytics Research Award for Contemporary Analysis and won it in 2013 in tandem with Bill Petti. He has won four FSWA Awards including on for his Mining the News series. He's won Tout Wars three times, LABR twice, and got his first NFBC Main Event win in 2021. Follow him on Twitter @jeffwzimmerman.
I had to take calculus twice, and only had a couple of courses in statistics. Should have been an English major I suppose. When you figure it out, I eagerly anticipate the prose translation of your long term study.