Intro

On November 1st 2025, the Toronto Blue Jays and Los Angeles Dodgers played one of the most memorable Game 7s in World Series history, a tense 11-inning battle that ended with the Dodgers defending their title 5-4. With both starters on short leashes and every bullpen arm available, pitching change decisions became the defining strategic thread of the night. This analysis uses Statcast pitch-level data to quantify the win probability impact of each pitching change, examining what game state each manager was responding to and whether the decision ultimately helped or hurt their team’s chances of winning.

Methodology

Pitching changes were identified by detecting shifts in the active pitcher across consecutive plate appearances using Statcast pitch-level data for Game 7 of the 2025 World Series. For each change, win probability added (WPA) was calculated as the difference between the batting team’s win probability at the moment a pitcher entered and the win probability at the moment they were relieved (or the end of the game, for the final pitcher on each side). WPA values were inverted where necessary so that a positive value always reflects a pitcher helping his own team’s chances of winning, regardless of which team was on the mound.

Analysis

# Win probability flow chart for TOR with vertical dashed lines
# marking each pitching change, colored by team
ggplot() +
  # WP flow line using every pitch in ws_game7 — gray so it doesn't
  # clash with the team colored pitching change lines
  geom_line(
    data = ws_game7,
    aes(x = pitch_seq, y = home_win_exp),
    color = "gray30",
    linewidth = 0.8
  ) +
  # Horizontal reference line at 50% win probability
  geom_hline(
    yintercept = 0.5,
    #linetype = "dashed",
    color = "gray50"
  ) +
  # Vertical lines marking each pitching change colored by team
  geom_vline(
    data = pitching_changes,
    aes(xintercept = pitch_seq, color = pitching_team),
    linetype = "dashed",
    linewidth = 0.5,
    key_glyph = "rect"
  ) +
  # TOR powder blue, LAD navy
  scale_color_manual(values = c("TOR" = "#7DBDE8", "LAD" = "#134A8E")) +
  scale_y_continuous(
    labels = scales::percent_format(),
    limits = c(0, 1)
  ) +
  labs(
    title = "2025 World Series Game 7 — Win Probability Flow",
    subtitle = "Toronto Blue Jays vs Los Angeles Dodgers | Nov 1, 2025",
    x = "Pitch",
    y = "TOR Win Probability",
    color = "Pitching Team Change"
  ) +
  theme_minimal()

Toronto started Game 7 with the pitching match up edge, and the win probability chart reflects that early dominance. The Blue Jays built and sustained a win probability above 75% through the first six innings, largely weathering the early bullpen transitions forced by Scherzer’s departure. The real story in this chart is the late game collapse. From pitch 250 onward, Toronto’s win probability falls almost continuously as the Dodgers’ bullpen transitions prove far more stabilizing than Toronto’s. The vertical lines tell you when each decision was made. The following bar chart below tells you whether those decisions worked.

# WPA bar chart showing each pitcher's impact ordered chronologically
# Positive bars mean the pitcher helped his team, negative means he hurt
pitching_changes %>%
  # Create a label combining pitcher name and inning for the x axis
  mutate(
    pitcher_label = paste0(pitcher_name, "\n(Inn. ", inning, ")"),
    # Factor with levels in chronological order so bars don't reorder
    pitcher_label = factor(pitcher_label, levels = pitcher_label)
  ) %>%
  ggplot(aes(x = pitcher_label, y = pitching_team_wpa, fill = pitching_team)) +
  geom_col() +
  # Reference line at zero — above helped, below hurt
  geom_hline(yintercept = 0, color = "gray30", linewidth = 0.5) +
  # TOR powder blue, LAD navy
  scale_fill_manual(values = c("TOR" = "#7DBDE8", "LAD" = "#134A8E")) +
  scale_y_continuous(labels = scales::percent_format()) +
  labs(
    title = "Pitching Change Impact — 2025 World Series Game 7",
    subtitle = "WPA measures win probability added by each pitcher after entering",
    x = NULL,
    y = "Win Probability Added (Pitching Team)",
    fill = "Pitching Team"
  ) +
  theme_minimal() +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1, size = 7)
  )

The numbers make clear that the pitching change decisions in the final three innings decided this game. Yoshinobu Yamamoto’s entry in the 9th produced the single largest win probability swing of the night at 33.6 points in the Dodgers’ favor, a staggering turnaround considering Toronto still held a 69.6% win probability when he took the mound. On the other side, Jeff Hoffman and Shane Bieber combined to surrender 65 percentage points of win probability across the 8th and 11th innings, turning what looked like a Toronto victory into a Dodgers championship. The middle innings were largely a wash for both bullpens, which makes the late inning management all the more decisive. The table below breaks down exactly what situation each pitcher walked into.

pitching_changes %>%
  mutate(
    inning_label = paste(inning_topbot, inning),
    score        = paste0(pitching_team, " ", fld_score, " - ", bat_score),
    entry_wp     = scales::percent(bat_win_exp, accuracy = 1),
    wpa_label    = paste0(ifelse(pitching_team_wpa > 0, "+", ""),
                          scales::percent(pitching_team_wpa, accuracy = 1))
  ) %>%
  select(
    Inning       = inning_label,
    Team         = pitching_team,
    In_to_Pitch  = pitcher_name,
    Pitcher_Being_Replaced  = prev_pitcher_name,
    Score        = score,
    Outs         = outs_when_up,
    base_state = base_state,
    entry_wp   = entry_wp,
    WPA          = wpa_label
  )
## # A tibble: 11 × 9
##    Inning Team  In_to_Pitch        Pitcher_Being_Replaced Score  Outs base_state
##    <chr>  <chr> <chr>              <chr>                  <chr> <dbl> <chr>     
##  1 Bot 3  LAD   Justin Wrobleski   Shohei Ohtani          LAD …     1 Bases Emp…
##  2 Bot 4  LAD   Tyler Glasnow      Justin Wrobleski       LAD …     2 Runners o…
##  3 Top 5  TOR   Louis Varland      Max Scherzer           TOR …     1 Runner on…
##  4 Top 6  TOR   Chris Bassitt      Louis Varland          TOR …     0 Bases Emp…
##  5 Top 7  TOR   Trey Yesavage      Chris Bassitt          TOR …     0 Bases Emp…
##  6 Bot 7  LAD   Emmet Sheehan      Tyler Glasnow          LAD …     0 Bases Emp…
##  7 Top 8  TOR   Jeff Hoffman       Trey Yesavage          TOR …     2 Bases Emp…
##  8 Bot 8  LAD   Blake Snell        Emmet Sheehan          LAD …     0 Runner on…
##  9 Bot 9  LAD   Yoshinobu Yamamoto Blake Snell            LAD …     1 Runners o…
## 10 Top 10 TOR   Seranthony Domíng… Jeff Hoffman           TOR …     0 Bases Emp…
## 11 Top 11 TOR   Shane Bieber       Seranthony Domínguez   TOR …     0 Bases Emp…
## # ℹ 2 more variables: entry_wp <chr>, WPA <chr>

Looking at the situations each pitcher inherited, what stands out is how often both managers made changes with the bases empty and a relatively clean slate. The highest leverage entries were Yamamoto walking into a tied game in the 9th with runners on first and second, and Bieber entering the 11th in a coin flip game. Yamamoto rose to the moment. Bieber did not. For a pitching coach reviewing this game, the broader takeaway is straightforward. Toronto’s late inning arms were not ready for the moment when it arrived, while Dave Roberts correctly identified Yamamoto as the one pitcher who could change the game and deployed him at exactly the right time.

Conclusion

This single game makes clear how decisive bullpen management can be in elimination baseball. A natural next step is to examine whether these patterns held across the entire 2025 World Series, not just Game 7, to see whether Toronto’s late inning struggles and the Dodgers’ bullpen discipline were a one game anomaly or a series-long trend.

Data Sources

Pitch-level data sourced from Baseball Savant. Pitcher identification sourced from the MLB Stats API.