Dave Martinez and the Washington Nationals are Burning up the Basepaths to Start the 2024 MLB Season

Last year, the Washington Nationals finished 12th in baseball in stolen bases. This year, they’re 1st. What’s changed? In a word: Davey.

If we look at all managers coaching the same teams in 2023 and 2024, we find that Martinez has changed his approach the most, with his club more than twice as likely to attempt steals of second base. Changes in personnel are surely a factor, but it’s nevertheless remarkable to see an MLB manager change his approach so significantly on a year-over-year basis. I certainly thought it was a noticeable (and notable!) trend to open the season - wanted to write a quick post here to share!

Second Base Steal Attempt Rate by Manager (2023-2024)

Code Reference

The year-over-year data here is visualized in the form of a dumbbell plot, which take just a bit more work to create with ggplot and R than your average chart. As such, I wanted to share the code I wrote to build the chart below!

Import Data

Create managers_2023 and managers_2024 dataframes using the managerial tendencies data from Baseball Reference.

Merge Yearly Dataframes by Manager, Compute YoY Diff

merge the yearly dataframes by manager and team so that we can compute the year-over-year (YoY) change in second base steal attempt rate.

library(tidyverse)

joined_df <- merge(x = managers_2024, y = managers_2023, by = c("Mgr", "Tm"), suffixes = c("_2024", "_2023")) %>%
  mutate(
    sb_rate_2024 = parse_number(sb_second_rate_2024) / 100,
    sb_rate_2023 = parse_number(sb_second_rate_2023) / 100,
    diff = parse_number(sb_second_rate_2024) / 100 - parse_number(sb_second_rate_2023) / 100
  ) %>%
  select("Mgr", "Tm", "sb_rate_2024", "sb_rate_2023", "diff")

Create “Long” Dataframe of Rates and Years

df <- rbind(
  managers_2023 %>% mutate(year = 2023, sb_rate = parse_number(sb_second_rate) / 100),
  managers_2024 %>% mutate(year = 2024, sb_rate = parse_number(sb_second_rate) / 100)
) %>% select("Mgr", "Tm", "year", "sb_rate")

Enrich “Long Dataframe” with YoY Diff Information

chart_df <- merge(x = df, y = joined_df, by = c("Mgr", "Tm"))

Build Chart

  • Plot a point showing sb_rate for each manager and each year
  • Draw a line segment between the 2023 and 2024 rates
  • Order the managers in descending order of the YoY diff
chart_df %>% 
  ggplot(aes(x = reorder(paste0(Mgr, ", ", Tm), diff), y = sb_rate, color = factor(year))) + 
    geom_segment(aes(x = reorder(paste0(Mgr, ", ", Tm), diff), xend = reorder(paste0(Mgr, ", ", Tm), diff), y = sb_rate_2023, yend = sb_rate_2024), color="grey", size = 3.5, alpha = 0.5) +
    geom_point(size = 3) + 
    scale_color_manual(values = c("#69b3a2", "#404080"), name = "Year") + 
    coord_flip() + 
    scale_y_continuous(labels = scales::label_percent(), limits = c(0, 0.25)) +
    theme_minimal() +
    theme(
      legend.background = element_rect(color = NA),
      plot.title = element_text(size = 20, face = "bold"),
      plot.subtitle = element_text(size = 12),
      plot.caption = element_text(colour = "grey60"),
      plot.title.position = "plot"
    ) + 
    labs(
      x = "",
      y = "\nRate of Attempting to Steal Second Base",
      title =  "Davey's Off to the Races in 2024",
      subtitle = "Dave Martinez headlines a trio of managers (along with Matt Quatraro and\nDavid Bell) which have attempted to steal second base in over 15% of their\npotential chances. No manager this millenia has posted a swipe rate over 20% -\ncould Martinez's newfound aggression on the basepaths make him the first?",
      caption = "For managers of the same team in both 2023 and 2024\nSource: Baseball Reference. Data as of: 2024-04-11\nconormclaughlin.net"
    )