The Cubs Have the Most Horizontal Pitch Movement in Baseball
With a lot of asterisks
Ben Bailey · August 12, 2022 · 3m ·

Baseball Savant provides pitch movement leaderboards for each pitch type. As I was looking through the leaderboards for various pitch types, I noticed that several Cubs pitchers stand out in terms of negative horizontal movement compared to average. For instance, Justin Steele's four-seamer gets the third most cutting movement in the league, and Marcus Stroman and Rowan Wick are also both within the top 20. Having recently read a North Side Bound article about cut-ride, I was curious to see if my observations had any statistical backing.

First, I downloaded a CSV from Baseball Savant of all pitchers a pitcher has thrown at least 50 times this season. I then imported that CSV into my local database and ran a query on it to see the average absolute value of pitch movement per team across both axes. Getting the absolute value is key here so that pitches with a lot of glove-side movement aren't canceled out by those with a lot of arm-side movement.

The results show that the Cubs are the top team in terms of horizontal pitch movement, and sixth in vertical movement.

This is certainly not the most rigorous method of measuring pitching development on an organizational level. Notably, the query could be improved by using a weighted average, since this analysis didn't take into account how often specific pitches were being thrown. It's also not necessarily true that these rankings are correlated with pitching success. It does, however, back up the belief that the Cubs are prioritizing pitchers with outlier horizontal movement.

View the full spreadsheet here. I've included the (messy) SQL query I used to calculate these values below as well as a copy of the full table for posterity.

team_nameavg_abs_vert_movavg_abs_horz_movdiff_horz_rankdiff_vert_rankavg_rank
Angels1.90131.8727302829
Astros2.27742.0830231519
Athletics2.56622.7479285
Blue Jays2.02542.3211142620
Braves3.00912.4782613.5
Brewers2.10292.0638242424
Cardinals2.52122.2138201015
Cubs2.59183.0148163.5
D-backs2.75151.990927315
Dodgers1.62112.2982163023
Giants2.59112.046725716
Guardians2.30002.3055151414.5
Mariners2.05962.473172516
Marlins2.79292.4321925.5
Mets2.20421.9014291924
Nationals1.67212.2410192924
Orioles2.25822.55823169.5
Padres2.20522.0414261822
Phillies2.33242.1000221317.5
Pirates2.12501.9897282325.5
Rangers2.60002.32791359
Rays2.67782.39861047
Red Sox2.34652.1493211216.5
Reds2.17712.500052113
Rockies1.97662.529742715.5
Royals2.23972.3735111714
Tigers2.19722.2903172018.5
Twins2.45002.2852181114.5
White Sox2.17462.3299122217
Yankees2.54312.4722898.5
SELECT
    team_name,
    avg(abs(diff_z::float)) avg_abs_diff_z,
    avg(abs(diff_x::float)) avg_abs_diff_x,
    dense_rank() OVER (ORDER BY avg(abs(diff_x::float)) DESC) AS diff_x_rnk,
    dense_rank() OVER (ORDER BY avg(abs(diff_z::float)) DESC) AS diff_z_rnk,
    (dense_rank() OVER (ORDER BY avg(abs(diff_x::float)) DESC) + dense_rank() OVER (ORDER BY avg(abs(diff_z::float)) DESC)) / 2.0 avg_rnk
FROM
    pitch_movement
GROUP BY
    team_name
ORDER BY
    avg_rnk ASC;

home · about · newsletter