Splitters have become the hottest pitch in baseball for pitchers to start throwing. A once obsolete pitch now has a presence is every bullpen and starting rotation to some degree. In the MLB last year of pitchers who threw at least 100 pitches in the season there were 144 of them that threw a splitter. While some like Logan Gilbert and Kevin Guasman rely heavily on it as their key secondary pitch some pitchers only mixed it in a couple times a game if at all. The rise of the splitter came out of nowhere with triple the amount of pitchers throwing the pitch today compared to 2019. I want to see why teams are throwing a lot of splitters and should every pitcher be adopting this new pitch?
Why the splitter
The splitter is unlike any pitch mimicking the release and look of a fastball with much less velocity and a sudden drop close to the plate. The splitter has become a huge success in pitching matchups for that reason. To throw the deceiving splitter mimicking the fastball and getting a pitcher to swing at what they think is one pitch for another has led it to be so successful. Any hitter sitting fastball and reality receiving a splitter is going to have a hard time if any chance at making contact depending on the splitter’s placement.
The splitter was the pitch of this MLB postseason. We saw 3 of the 4 championships series teams have an ace pitcher utilizing a splitter and the most notably being Kevin Gausman who has maybe the best splitter in baseball and others like the Dodgers Yoshinobu Yamamoto, Shohei Ohtani, Mariners Logan Gilbert, Bryce Miller, and Gausman’s teammate rookie phenom Trey Yesavage to name a few notable split finger tossers.
Split Finger Data
The splitter or also referred to as split finger as it is used so much by some pitchers but very little by others. I found some graphs and the data that I coded and cleaned with R to be very telling of some overall strategies and results of how their splitter is hit vs how it looks when thrown.

This is a simple batting average on splitter vs the expected batting average on their splitter. A lot of it checks out and follows the linear regression line in the center. I’m surprised to see some pitchers giving up higher batting averages on splitters than I’d expect like Paul Skenes who gives up a batting average of .277 and xBA of .274. He throws the pitch 13.4% of the time and with his dominant fastball you’d expect he could get more run value out of the pitch than his neutral run value of 0.

This next graph is the hard-hit percentage vs the average velocity of the splitter and it makes sense to follow the line that the harder the pitch is thrown the harder it will be hit especially if you’re not locating it. However, that benefits players who throw it faster as it still gives the hitter less time to square up the pitch and make worse contact. Unfortunately, a lot of MLB pitchers throw a weaker splitter with the average speed being 86.72 MPH. A lot of pitchers with lower average speeds but getting hit harder can be attributed to their location of the pitch. Guys who miss out of the zone even throwing it slower produce a lot weaker contact and get hit softer. You see this in pitchers like Logan Gilbert who throws one of the slower splitters but has good numbers on his pitch and surprisingly to a degree Anthony DeSclafini and Aaron Civale who did not boast the best years from their perspectives.

This graph just shows the break of each pitcher’s splitter based on the amount they move horizontally and amount they move vertically. The typical splitter is going to move a lot more vertically with a little bit of movement horizontally to their pitcher arm side. Some anomalies though on this graph would be Roki Sasaki who’s got seemingly know horizontal break in his splitter and a lot vertically causing it to be one of the fastest dropping in the MLB. Logan Gilbert sits above the pink nonlinear regression line with a high vertical break and only some horizontal break making him an outlier to the pack of pitchers who seem to fit in the far-right corner of this graph.

It’s this graph that we see a real correlation in who we think as of good pitchers and their quality of splitter. With guys like Jhoan Duran, Kevin Gausman, Yoshinobu Yamamoto all being some of the highest when it comes to their splitter run value. At the bottom we see Casey Mize who’s struggled heavily in his MLB career. This graph kind of just shows and or leads us to see who really should or shouldn’t be throwing their current splitter. Guys like Hunter Greene and Joe Ryan who are promising young pitchers have had below par splitters using it only minimally but having a negative run value. While someone like Jhoan Duran and Kevin Gausman this is reaffirming as to the fact that they should keep throwing their splitter as it has been very successful.

Looking at a graph where Logan Gilbert is our dominant pitcher in this one and has been prevalent in a lot of them. Gilbert sits on here with maybe the best put away splitter in the MLB and this is seen with his high whiff and strikeout percentage. This graph overall just shows the success of whiffs and who uses their splitter as put away pitch or more of a setup pitch. Guys like Jhoan Duran and Paul Skenes have fine whiff but a low strikeout percentage likely showing that this isn’t their put away pitch. The truth is that it’s now with Duran using it as a put away 19.5% of the time and Skenes 18.1% of the time while Gilbert and Cruz use it 27.6% of the time and Cruz 35.2% of the time.
My Splitter Pitch Value Statistic
I created a statistic as the ultimate overview of a pitcher’s split finger and the value of their splitter with 100 being a league average splitter. I’m calling Split+ since it’s inspired by wrc+ and here is the statistic,

Overall, this statistic gave me some expected results but also some unexpected results. There is going to be a list of every pitcher below these last paragraphs. I just want to talk about a few standouts. Anthony DeSclafini had the best splitter in the MLB with it having a score of 300. This pitch was effective likely due to the location of the pitch with the main part of the pitch sitting below the strike zone. He threw it to mainly lefties getting third base side horizontal break. He gave up a .071 batting average and .071 slug percentage with lots of weak contact and a 45.2% whiff percentage. Overall, his best pitch and the highlight of his arsenal.
Paul Skenes (66/74) and Hunter Greene (72/74) did not have well performing splitters last year ranking towards the bottom of this data set. I find it interesting that data shows the 2025 Cy Young winner had a bad pitch that he threw 13.6% of the time. This was by far his worst pitch in his repertoire giving up a .277 batting average and .404 slugging percentage with an average exit velocity of 89.6 and only being whiffed on 22.6% of the time. Mainly thrown to left-handed batters the majority of the pitches seemed to land in the bottom left of the strike zone with a stray to the right, meaning when he missed, he missed right throwing the ball over the middle bottom of the plate allowing hitters to tee it up. For Hunter Greene, a very good pitcher last year had thrown this pitch 10.8% of the time being the third most used in his arsenal. His pitch was mainly left over the middle of the bottom part of the strike zone allowing batters to likely tee it up and hit it hard. Which they did with the average exit velocity (91.3 MPH) being higher than the pitches’ original speed (88.4). Batting average allowed was a .310 and a slug of .655 which makes me question why continue to throw the pitch sometimes 10 times a game when it clearly is being hung in the middle part of the lower strike zone.
Split + leaderboard
Rank | First Name | Last Name | Split+
| 1 | Anthony | DeSclafani | 300.84835 |
| 2 | Aaron | Civale | 187.46341 |
| 3 | Emilio | Pagán | 178.29859 |
| 4 | Logan | Gilbert | 164.86398 |
| 5 | Kevin | Gausman | 159.29383 |
| 6 | Jeremiah | Estrada | 149.54791 |
| 7 | Nathan | Eovaldi | 142.05005 |
| 8 | Félix | Bautista | 140.91453 |
| 9 | Carlos | Hernández | 139.35015 |
| 10 | AJ | Smith-Shawver | 138.71169 |
| 11 | Tyler | Phillips | 135.30562 |
| 12 | Reed | Garrett | 135.09688 |
| 13 | Yoshinobu | Yamamoto | 132.78154 |
| 14 | Tony | Gonsolin | 132.07445 |
| 15 | Jhoan | Duran | 131.45649 |
| 16 | Fernando | Cruz | 126.52561 |
| 17 | Eric | Orze | 121.95300 |
| 18 | Seranthony | Domínguez | 121.19652 |
| 19 | Spencer | Schwellenbach | 121.11682 |
| 20 | Cole | Sands | 119.05443 |
| 21 | Zack | Wheeler | 118.69587 |
| 22 | Tobias | Myers | 117.50043 |
| 23 | Yu | Darvish | 116.88954 |
| 24 | Rafael | Montero | 116.75780 |
| 25 | José | Soriano | 112.69498 |
| 26 | Carmen | Mlodzinski | 112.45832 |
| 27 | Hurston | Waldrep | 110.77605 |
| 28 | Lake | Bachar | 110.70538 |
| 29 | Jackson | Rutledge | 105.61597 |
| 30 | Héctor | Neris | 104.77050 |
| 31 | Casey | Mize | 104.46579 |
| 32 | Chris | Martin | 99.59247 |
| 33 | Aroldis | Chapman | 98.81530 |
| 34 | Tyler | Mahle | 97.65277 |
| 35 | Dean | Kremer | 97.17722 |
| 36 | Frankie | Montas | 95.08415 |
| 37 | Zack | Littell | 94.64820 |
| 38 | Mark | Leiter Jr. | 90.86432 |
| 39 | Jeff | Hoffman | 89.95638 |
| 40 | Colin | Rea | 88.89599 |
| 41 | Tayler | Scott | 88.74006 |
| 42 | Shelby | Miller | 88.73922 |
| 43 | Tomoyuki | Sugano | 88.13744 |
| 44 | Shota | Imanaga | 87.61242 |
| 45 | Ryan | Borucki | 87.12895 |
| 46 | Yuki | Matsui | 85.99222 |
| 47 | Joe | Ryan | 85.46603 |
| 48 | Yariel | Rodríguez | 84.98204 |
| 49 | Cade | Smith | 81.65533 |
| 50 | Roki | Sasaki | 81.65463 |
| 51 | Simeon | Woods Richardson | 80.55701 |
| 52 | Kirby | Yates | 79.71892 |
| 53 | Joe | Boyle | 79.20581 |
| 54 | David | Bednar | 79.08627 |
| 55 | Taijuan | Walker | 74.33900 |
| 56 | Bryce | Miller | 73.73180 |
| 57 | Cal | Quantrill | 73.32275 |
| 58 | Brandon | Young | 70.12233 |
| 59 | Kyle | Finnegan | 69.31775 |
| 60 | Grant | Holman | 68.81498 |
| 61 | Scott | Blewett | 65.82864 |
| 62 | Luis | García | 64.26608 |
| 63 | Seth | Halvorsen | 61.85156 |
| 64 | Bowden | Francis | 60.35254 |
| 65 | Tanner | Houck | 60.01564 |
| 66 | Paul | Skenes | 57.52772 |
| 67 | Chris | Bassitt | 57.27356 |
| 68 | Taj | Bradley | 55.10074 |
| 69 | Zach | Agnos | 54.63962 |
| 70 | Ryne | Stanek | 49.14269 |
| 71 | Bradley | Blalock | 46.42967 |
| 72 | Hunter | Greene | 44.35005 |
| 73 | Mitchell | Parker | 36.92171 |
| 74 | Bailey | Falter | 16.05355 |
all code used:
names(pitch_arsenal)[names(pitch_arsenal) == “n_fs”] <- “percent_fs”
rm(pitch_arsenal_1, pitch_arsenal_2, pitch_arsenal_3, active_spin)
View(stats)
View(runs_value)
View(pitch_arsenal_stats)
View(fs_pitch_movement)
View(pitch_arsenal)
pitch_arsenal_stats <- pitch_arsenal_stats %>%
rename(last_first = ‘last_name, first_name’, pitcher = ‘entity_id’)
pitch_arsenal_stats <- pitch_arsenal_stats %>%
rename(last_first = ‘last_name, first_name’, pitcher = ‘player_id’)
merge(pitch_arsenal, pitch_arsenal_stats)
pitch_arsenal <- merge(pitch_arsenal, pitch_arsenal_stats)
View(pitch_arsenal)
rm(pitch_arsenal_stats)
View(stats)
View(runs_value)
View(stats)
View(runs_value)
View(pitch_arsenal)
View(fs_pitch_movement)
stats <- stats %>%
rename(last_first = ‘last_name, first_name’, pitcher = ‘player_id’)
runs_value <- runs_value %>%
rename(last_first = ‘last_name, first_name’, pitcher = ‘player_id’)
pitch_movement <- fs_pitch_movement %>%
rename(last_first = ‘last_name, first_name’, pitcher = ‘pitcher_id’)
rm(fs_pitch_movement)
View(pitch_movement)
View(pitch_movement)
pitch_arsenal <- pitch_arsenal %>%
filter(pitcher %in% stats$pitcher)
pitch_movement <- pitch_movement %>%
filter(pitcher %in% stats$pitcher)
runs_value <- runs_value %>%
filter(pitcher %in% stats$pitcher)
fs_data <- merge(pitch_arsenal, pitch_movement)
rm(pitch_arsenal, pitch_movement)
View(fs_data)
View(fs_data)
View(runs_value)
View(runs_value)
View(stats)
View(stats)
ggplot(fs_data, aes(x = pitch_usage, y = run_value, color = pitcher)) +
geom_point(size = 3) +
labs(
title = “Splitter Pitch Usage vs Splitter Run Value”,
x = “Splitter Pitch Usage”,
y = “Splitter Run Value”,
color = “Pitcher”
) =
theme_minimal()
ggplot(fs_data, aes(x = pitch_usage, y = run_value, color = pitcher)) +
geom_point(size = 3) +
labs(
title = “Splitter Pitch Usage vs Splitter Run Value”,
x = “Splitter Pitch Usage”,
y = “Splitter Run Value”,
color = “Pitcher”
) =
ggplot(fs_data, aes(x = pitch_usage, y = run_value, color = pitcher)) +
geom_point(size = 3) +
labs(
title = “Splitter Pitch Usage vs Splitter Run Value”,
x = “Splitter Pitch Usage”,
y = “Splitter Run Value”,
color = “Pitcher”
)
library(ggplot2)
ggplot(fs_data, aes(x = pitch_usage, y = run_value, color = pitcher)) +
geom_point(size = 3) +
labs(
title = “Splitter Pitch Usage vs Splitter Run Value”,
x = “Splitter Pitch Usage”,
y = “Splitter Run Value”,
color = “Pitcher”
)
theme_minimal()
ggplot(fs_data, aes(x = pitch_usage, y = run_value, color = pitcher)) +
geom_point(size = 3) +
geom_text(aes(label = pitcher), vjust = -0.5, size = 3)
labs(
title = “Splitter Pitch Usage vs Splitter Run Value”,
x = “Splitter Pitch Usage (%)”,
y = “Splitter Run Value”,
color = “Pitcher”
)
theme_minimal()
ggplot(fs_data, aes(x = pitch_usage, y = run_value, color = pitcher)) +
geom_point(size = 3) +
geom_text(aes(label = last_first), vjust = -0.5, size = 3)
labs(
title = “Splitter Pitch Usage vs Splitter Run Value”,
x = “Splitter Pitch Usage (%)”,
y = “Splitter Run Value”,
color = “Pitcher”
)
theme_minimal()
ggplot(fs_data, aes(x = pitch_usage, y = run_value, color = pitcher)) +
geom_point(size = 3) +
geom_text_repel(aes(label = last_first), size = 3, show.legend = F) +
labs(
title = “Splitter Pitch Usage vs Splitter Run Value”,
x = “Splitter Pitch Usage (%)”,
y = “Splitter Run Value”,
color = “Pitcher”
)
library(ggrepel)
install.packages(ggrepel)
install.packages(“ggrepel”)
library(ggrepel)
ggplot(fs_data, aes(x = pitch_usage, y = run_value, color = pitcher)) +
geom_point(size = 3) +
geom_text_repel(aes(label = last_first), size = 3, show.legend = F) +
labs(
title = “Splitter Pitch Usage vs Splitter Run Value”,
x = “Splitter Pitch Usage (%)”,
y = “Splitter Run Value”,
color = “Pitcher”
)
theme_minimal()
library(dplyr)
library(tidyr)
library(stringr)
fs_data <- fs_data %>%
seperate(last_first, into = c(“last_name”, “first_name”), sep = “, “) %>%
mutate(
player_code = str_c(
str_sub(first_name, 1, 1),
str_sub(last_name, 1, 4),
“_”,
team_name_alt,
sep = “”
)
)
fs_data <- fs_data %>%
separate(last_first, into = c(“last_name”, “first_name”), sep = “, “) %>%
mutate(
player_code = str_c(
str_sub(first_name, 1, 1),
str_sub(last_name, 1, 4),
“_”,
team_name_alt,
sep = “”
)
)
ggplot(fs_data, aes(x = pitch_usage, y = run_value, color = pitcher)) +
geom_point(size = 3) +
geom_text_repel(aes(label = player_code), size = 3, show.legend = F) +
labs(
title = “Splitter Pitch Usage vs Splitter Run Value”,
x = “Splitter Pitch Usage (%)”,
y = “Splitter Run Value”,
color = “Pitcher”
)
theme_minimal()
ggplot(fs_data, aes(x = pitch_usage, y = run_value, color = pitcher)) +
geom_point(size = 3) +
geom_text_repel(aes(label = player_code), size = 2, show.legend = F) +
labs(
title = “Splitter Pitch Usage vs Splitter Run Value”,
x = “Splitter Pitch Usage (%)”,
y = “Splitter Run Value”,
color = “Pitcher”
)
theme_minimal()
ggplot(fs_data, aes(x = pitch_usage, y = run_value, color = pitcher)) +
geom_point(size = 2) +
geom_text_repel(aes(label = player_code), size = 3, show.legend = F) +
labs(
title = “Splitter Pitch Usage vs Splitter Run Value”,
x = “Splitter Pitch Usage (%)”,
y = “Splitter Run Value”,
color = “Pitcher”
)
theme_minimal()
ggplot(fs_data, aes(x = pitch_usage, y = run_value, color = red)) +
geom_point(size = 2) +
geom_text_repel(aes(label = player_code), size = 3, show.legend = F) +
labs(
title = “Splitter Pitch Usage vs Splitter Run Value”,
x = “Splitter Pitch Usage (%)”,
y = “Splitter Run Value”,
color = “red”
)
ggplot(fs_data, aes(x = pitch_usage, y = run_value, color = pitcher)) +
geom_point(size = 2) +
geom_text_repel(aes(label = player_code), size = 3, show.legend = F) +
labs(
title = “Splitter Pitch Usage vs Splitter Run Value”,
x = “Splitter Pitch Usage (%)”,
y = “Splitter Run Value”,
color = “red”
)
theme_minimal()
ggplot(fs_data, aes(x = pitch_usage, y = run_value)) +
geom_point(size = 2) +
geom_text_repel(aes(label = player_code), size = 3, show.legend = F) +
labs(
title = “Splitter Pitch Usage vs Splitter Run Value”,
x = “Splitter Pitch Usage (%)”,
y = “Splitter Run Value”
)
theme_minimal()
ggplot(fs_data, aes(x = pitch_usage, y = run_value)) +
geom_point(size = 2, color = “#005C5C”) +
geom_text_repel(aes(label = player_code), size = 3, color = “#005C5C”, show.legend = F) +
labs(
title = “Splitter Pitch Usage vs Splitter Run Value”,
x = “Splitter Pitch Usage (%)”,
y = “Splitter Run Value”
)
theme_minimal()
ggplot(fs_data, aes(x = pitch_usage, y = run_value)) +
geom_point(size = 2, color = “#005C5C”) +
geom_text_repel(aes(label = player_code), size = 3, color = “#005C5C”, show.legend = F) +
geom_vline(xintercept = 0, color = “black”, linewidth = 1) +
labs(
title = “Splitter Pitch Usage vs Splitter Run Value”,
x = “Splitter Pitch Usage (%)”,
y = “Splitter Run Value”
)
theme_minimal()
ggplot(fs_data, aes(x = pitch_usage, y = run_value)) +
geom_point(size = 2, color = “#005C5C”) +
geom_text_repel(aes(label = player_code), size = 3, color = “#005C5C”, show.legend = F) +
geom_hline(xintercept = 0, color = “black”, linewidth = 1) +
labs(
title = “Splitter Pitch Usage vs Splitter Run Value”,
x = “Splitter Pitch Usage (%)”,
y = “Splitter Run Value”
)
ggplot(fs_data, aes(x = pitch_usage, y = run_value)) +
geom_point(size = 2, color = “#005C5C”) +
geom_text_repel(aes(label = player_code), size = 3, color = “#005C5C”, show.legend = F) +
geom_hline(xintercept = 0, color = “black”, linewidth = 1) +
labs(
title = “Splitter Pitch Usage vs Splitter Run Value”,
x = “Splitter Pitch Usage (%)”,
y = “Splitter Run Value”
)
ggplot(fs_data, aes(x = pitch_usage, y = run_value)) +
geom_point(size = 2, color = “#005C5C”) +
geom_text_repel(aes(label = player_code), size = 3, color = “#005C5C”, show.legend = F) +
geom_hline(yintercept = 0, color = “black”, linewidth = 1) +
labs(
title = “Splitter Pitch Usage vs Splitter Run Value”,
x = “Splitter Pitch Usage (%)”,
y = “Splitter Run Value”
)
theme_minimal()
ggplot(fs_data, aes(x = pitch_usage, y = run_value)) +
geom_hline(yintercept = 0, color = “black”, linewidth = 1) +
geom_point(size = 2, color = “#005C5C”) +
geom_text_repel(aes(label = player_code), size = 3, color = “#005C5C”, show.legend = F) +
labs(
title = “Splitter Pitch Usage vs Splitter Run Value”,
x = “Splitter Pitch Usage (%)”,
y = “Splitter Run Value”
)
theme_minimal()
ggplot(fs_data, aes(x = pitch_usage, y = run_value)) +
geom_hline(yintercept = 0, color = “black”, linewidth = 1, alpha = 0.5) +
geom_point(size = 2, color = “#005C5C”) +
geom_text_repel(aes(label = player_code), size = 3, color = “#005C5C”, show.legend = F) +
labs(
title = “Splitter Pitch Usage vs Splitter Run Value”,
x = “Splitter Pitch Usage (%)”,
y = “Splitter Run Value”
)
theme_minimal()
ggplot(fs_data, aes(x = pitch_usage, y = run_value)) +
geom_hline(yintercept = 0, color = “black”, linewidth = 1, alpha = 0.35) +
geom_point(size = 2, color = “#005C5C”) +
geom_text_repel(aes(label = player_code), size = 3, color = “#005C5C”, show.legend = F) +
labs(
title = “Splitter Pitch Usage vs Splitter Run Value”,
x = “Splitter Pitch Usage (%)”,
y = “Splitter Run Value”
)
theme_minimal()
ggplot(fs_data, aes(x = ba, y = est_ba)) +
geom_hline(yintercept = 0, color = “black”, linewidth = 1, alpha = 0.35) +
geom_point(size = 2, color = “#005c5c”) +
geom_text_repel(aes(label = player_code), size = 3, color = “#005c5c”, show.legend = F) +
labs(
title = “Batting Average on Splitter vs Estimated Batting Average on Splitter”,
x = “Batting Average on Splitter”,
y = “Estimated Batting Average on Splitter”
)
theme_minimal()
ggplot(fs_data, aes(x = ba, y = est_ba)) +
geom_hline(yintercept = 0, color = “black”, linewidth = 1, alpha = 0.35) +
geom_point(size = 2, color = “#005c5c”) +
geom_text_repel(aes(label = player_code), size = 3, color = “#005c5c”, show.legend = F) +
scale_x_continuous(labels = number_format(accuracy = 0.001)) +
scale_y_continuous(labels = number_format(accuracy = 0.001)) +
labs(
title = “Batting Average on Splitter vs Estimated Batting Average on Splitter”,
x = “Batting Average on Splitter”,
y = “Estimated Batting Average on Splitter”
)
library(scales)
ggplot(fs_data, aes(x = ba, y = est_ba)) +
geom_hline(yintercept = 0, color = “black”, linewidth = 1, alpha = 0.35) +
geom_point(size = 2, color = “#005c5c”) +
geom_text_repel(aes(label = player_code), size = 3, color = “#005c5c”, show.legend = F) +
scale_x_continuous(labels = number_format(accuracy = 0.001)) +
scale_y_continuous(labels = number_format(accuracy = 0.001)) +
labs(
title = “Batting Average on Splitter vs Estimated Batting Average on Splitter”,
x = “Batting Average on Splitter”,
y = “Estimated Batting Average on Splitter”
)
theme_minimal()
ggplot(fs_data, aes(x = avg_speed, y = hard_hit_percent)) +
geom_hline(yintercept = 0, color = “black”, linewidth = 1, alpha = 0.35) +
geom_point(size = 2, color = “#005c5c”) +
geom_text_repel(aes(label = player_code), size = 3, color = “#005c5c”, show.legend = F) +
labs(
title = “Hard Hit Percent vs Average Splitter Velocity”,
x = “Average Splitter Velocity (MPH)”,
y = “Hard Hit Percent (%)”
)
theme_minimal()
ggplot(fs_data, aes(x = avg_speed, y = hard_hit_percent)) +
geom_hline(yintercept = 0, color = “black”, linewidth = 1, alpha = 0.35) +
geom_smooth(method = “lm”, se = F, color = “red”, linewidth = 1) +
geom_point(size = 2, color = “#005c5c”) +
geom_text_repel(aes(label = player_code), size = 3, color = “#005c5c”, show.legend = F) +
labs(
title = “Hard Hit Percent vs Average Splitter Velocity”,
x = “Average Splitter Velocity (MPH)”,
y = “Hard Hit Percent (%)”
)
theme_minimal()
ggplot(fs_data, aes(x = avg_speed, y = hard_hit_percent)) +
geom_hline(yintercept = 0, color = “black”, linewidth = 1, alpha = 0.35) +
geom_smooth(method = “lm”, se = F, color = “red”, linewidth = 1) +
geom_smooth(method = “loess”, se = F, color = “pink”) +
geom_point(size = 2, color = “#005c5c”) +
geom_text_repel(aes(label = player_code), size = 3, color = “#005c5c”, show.legend = F) +
labs(
title = “Hard Hit Percent vs Average Splitter Velocity”,
x = “Average Splitter Velocity (MPH)”,
y = “Hard Hit Percent (%)”
)
theme_minimal()
ggplot(fs_data, aes(x = avg_speed, y = hard_hit_percent)) +
geom_hline(yintercept = 0, color = “black”, linewidth = 1, alpha = 0.35) +
geom_smooth(method = “loess”, se = F, color = “pink”) +
geom_point(size = 2, color = “#005c5c”) +
geom_text_repel(aes(label = player_code), size = 3, color = “#005c5c”, show.legend = F) +
labs(
title = “Hard Hit Percent vs Average Splitter Velocity”,
x = “Average Splitter Velocity (MPH)”,
y = “Hard Hit Percent (%)”
)
theme_minimal()
ggplot(fs_data, aes(x = pitch_usage, y = run_value)) +
geom_hline(yintercept = 0, color = “black”, linewidth = 1, alpha = 0.35) +
geom_smooth(method = “loess”, se = F, color = “pink”) +
geom_point(size = 2, color = “#005C5C”) +
geom_text_repel(aes(label = player_code), size = 3, color = “#005C5C”, show.legend = F) +
labs(
title = “Splitter Pitch Usage vs Splitter Run Value”,
x = “Splitter Pitch Usage (%)”,
y = “Splitter Run Value”
)
theme_minimal()
ggplot(fs_data, aes(x = ba, y = est_ba)) +
geom_hline(yintercept = 0, color = “black”, linewidth = 1, alpha = 0.35) +
geom_smooth(method = “lm”, se = F, color = “red”)
geom_point(size = 2, color = “#005c5c”) +
geom_text_repel(aes(label = player_code), size = 3, color = “#005c5c”, show.legend = F) +
scale_x_continuous(labels = number_format(accuracy = 0.001)) +
scale_y_continuous(labels = number_format(accuracy = 0.001)) +
labs(
title = “Batting Average on Splitter vs Estimated Batting Average on Splitter”,
x = “Batting Average on Splitter”,
y = “Estimated Batting Average on Splitter”
)
ggplot(fs_data, aes(x = ba, y = est_ba)) +
geom_hline(yintercept = 0, color = “black”, linewidth = 1, alpha = 0.35) +
geom_smooth(method = “lm”, se = F, color = “red”)
geom_point(size = 2, color = “#005c5c”) +
geom_text_repel(aes(label = player_code), size = 3, color = “#005c5c”, show.legend = F) +
scale_x_continuous(labels = number_format(accuracy = 0.001)) +
scale_y_continuous(labels = number_format(accuracy = 0.001)) +
labs(
title = “Batting Average on Splitter vs Estimated Batting Average on Splitter”,
x = “Batting Average on Splitter”,
y = “Estimated Batting Average on Splitter”
)
ggplot(fs_data, aes(x = ba, y = est_ba)) +
geom_hline(yintercept = 0, color = “black”, linewidth = 1, alpha = 0.35) +
geom_smooth(method = “lm”, se = F, color = “red”) +
geom_point(size = 2, color = “#005c5c”) +
geom_text_repel(aes(label = player_code), size = 3, color = “#005c5c”, show.legend = F) +
scale_x_continuous(labels = number_format(accuracy = 0.001)) +
scale_y_continuous(labels = number_format(accuracy = 0.001)) +
labs(
title = “Batting Average on Splitter vs Estimated Batting Average on Splitter”,
x = “Batting Average on Splitter”,
y = “Estimated Batting Average on Splitter”
)
theme_minimal()
ggplot(fs_data, aes(x = ba, y = est_ba)) +
geom_hline(yintercept = 0, color = “black”, linewidth = 1, alpha = 0.35) +
geom_smooth(method = “lm”, se = F, color = “red”) +
geom_smooth(method = “loess”, se = F, color = “pink”) +
geom_point(size = 2, color = “#005c5c”) +
geom_text_repel(aes(label = player_code), size = 3, color = “#005c5c”, show.legend = F) +
scale_x_continuous(labels = number_format(accuracy = 0.001)) +
scale_y_continuous(labels = number_format(accuracy = 0.001)) +
labs(
title = “Batting Average on Splitter vs Estimated Batting Average on Splitter”,
x = “Batting Average on Splitter”,
y = “Estimated Batting Average on Splitter”
)
theme_minimal()
ggplot(fs_data, aes(x = ba, y = est_ba)) +
geom_hline(yintercept = 0, color = “black”, linewidth = 1, alpha = 0.35) +
geom_smooth(method = “lm”, se = F, color = “red”) +
geom_point(size = 2, color = “#005c5c”) +
geom_text_repel(aes(label = player_code), size = 3, color = “#005c5c”, show.legend = F) +
scale_x_continuous(labels = number_format(accuracy = 0.001)) +
scale_y_continuous(labels = number_format(accuracy = 0.001)) +
labs(
title = “Batting Average on Splitter vs Estimated Batting Average on Splitter”,
x = “Batting Average on Splitter”,
y = “Estimated Batting Average on Splitter”
)
theme_minimal()
ggplot(fs_data, aes(x = pitcher_break_x, y = pitcher_break_z)) +
geom_hline(yintercept = 0, color = “black”, linewidth = 1, alpha = 0.35) +
geom_smooth(method = “loess”, se = F, color = “pink”) +
geom_point(size = 2, color = “#005c5c”) +
geom_text_repel(aes(label = player_code), size= 3, color = “#005c5c”, show.legend = F) +
labs(
title = “Splitter Horizontal Break vs Splitter Vertical Break”,
x = “Horizontal Break (in)”,
y = “Vertical Break (in)”
)
theme_minimal()
ggplot(fs_data, aes(x = k_percent, y = whiff_percent)) +
geom_hline(yintercept = 0, color = “black”, linewidth = 1, alpha = 0.35) +
geom_smooth(method = “lm”, se = F, color = “pink”) +
geom_point(size = 2, color = “#005c5c”) +
geom_text_repel(aes(label = player_code), size = 3, color = “#005c5c”, show.legend = F) +
labs(
title = “Splitter Strikeout Percentage vs Splitter Whiff Percentage”,
x = “Splitter Strikeout Percentage (%)”,
y = “Splitter Whiff Percentage (%)”
)
theme_minimal()
ggplot(fs_data, aes(x = k_percent, y = whiff_percent)) +
geom_hline(yintercept = 0, color = “black”, linewidth = 1, alpha = 0.35) +
geom_smooth(method = “lm”, se = F, color = “red”) +
geom_point(size = 2, color = “#005c5c”) +
geom_text_repel(aes(label = player_code), size = 3, color = “#005c5c”, show.legend = F) +
labs(
title = “Splitter Strikeout Percentage vs Splitter Whiff Percentage”,
x = “Splitter Strikeout Percentage (%)”,
y = “Splitter Whiff Percentage (%)”
)
theme_minimal()
q()
load(“~/.RData”)
load(“~/.RData”)
View(stats)
View(stats)
View(runs_value)
View(runs_value)
View(plot_df)
View(plot_df)
View(fs_data)
View(fs_data)
fs_data$’xSplit+’ <- Null
fs_data$’xSplit+’ <- NULL
fs_data$xSplitterPitchValue <- NULL
View(fs_data)
model <- lm(fs_data$`Split+` ~ pitcher_break_x + pitcher_break_z + pitcher_break_z_induced + hard_hit_percent + avg_speed + pitches_per_game, data = fs_data)
summary(model)
View(model)
fs_predicted_data <- predict(model)
fs_data$pred_split_plus <- predict(model)
head(fs_data)
fs_data$pred_split_plus <- predict(model, newdata = fs_data)
fs_data <- fs_data %>%
mutate(
diff = ‘Split+’ – pred_split_plus
)
library(dplyr)
fs_data <- fs_data %>%
mutate(
diff = ‘Split+’ – pred_split_plus
)
fs_data <- fs_data %>%
mutate(
diff = ‘Split+’ – pred_split_plus
)
fs_data <- fs_data %>%
mutate(
diff = Split+ – pred_split_plus
)
fs_data <- fs_data %>%
mutate(
diff = “Split+” – pred_split_plus
)
fs_data$diff <- fs_data$`Split+` – fs_data$pred_split_plus
Leave a Reply