“Line chart showing the rise of Major League Baseball home runs per game from 1901 to the present, created using R and ggplot2.”

The Home Run Boom in Baseball — Visualized with R

From the dead-ball era to the launch-angle revolution

Baseball has always evolved, but few trends tell a clearer story of transformation than the rise of the home run.
A century ago, hitting even a handful of home runs in a season was an achievement. Today, it’s an expectation.

Thanks to better training, analytics, and even changes in ball composition, home runs have skyrocketed — literally.
Let’s explore how home runs per game have changed in Major League Baseball (MLB) from 1901 to today, and what that means for the modern game (and even for betting markets 👀).


📊 The Data Story

We’ll use the Lahman Baseball Database — one of the most complete historical baseball datasets — to calculate the number of home runs per game in each MLB season since 1901.

Here’s the R code to reproduce the visualization:

— 1) Packages —

packages <- c(“tidyverse”, “Lahman”, “scales”, “gganimate”, “gifski”)
to_install <- packages[!packages %in% installed.packages()[, “Package”]]
if (length(to_install)) install.packages(to_install, dependencies = TRUE)

library(tidyverse)
library(Lahman)
library(scales)
library(gganimate)
library(gifski)

— 2) Build season-level metrics (HR per game) —

Teams table: HR (team home runs), G (team games). Each game involves 2 teams.

season_hr <- Teams %>%
filter(!is.na(HR), !is.na(G), yearID >= 1901) %>%
group_by(yearID) %>%
summarise(
hr_total = sum(HR, na.rm = TRUE),
games_team_total = sum(G, na.rm = TRUE),
.groups = “drop”
) %>%
mutate(
games_league = games_team_total / 2, # each game counted by two teams
hr_per_game = hr_total / games_league
)

For labels: detect peak and recent year available in Lahman

peak <- season_hr %>% slice_max(hr_per_game, n = 1)
latest_year <- max(season_hr$yearID, na.rm = TRUE)

— 3) Static plot —

p_static <- ggplot(season_hr, aes(yearID, hr_per_game)) +
geom_line(linewidth = 1) +
geom_smooth(se = FALSE, method = “loess”, span = 0.2) +
geom_point(data = peak, aes(yearID, hr_per_game), size = 3) +
ggrepel::geom_text_repel(
data = peak,
aes(label = paste0(“Peak: “, yearID, “\n”, round(hr_per_game, 2), ” HR/game”)),
nudge_y = 0.1, min.segment.length = 0
) +
scale_x_continuous(breaks = pretty_breaks()) +
scale_y_continuous(labels = label_number(accuracy = 0.01)) +
labs(
title = “The Home Run Boom in MLB”,
subtitle = paste0(“League-wide home runs per game, 1901–”, latest_year),
x = “Season”,
y = “Home runs per game (league-wide)”,
caption = “Source: Lahman Baseball Database | Made in R”
) +
theme_minimal(base_size = 13) +
theme(
plot.title = element_text(face = “bold”),
plot.caption = element_text(margin = margin(t = 8))
)

Save static image

ggsave(“mlb_hr_per_game.png”, p_static, width = 10, height = 6.2, dpi = 220)

— 4) Optional: by league (AL vs NL) small multiples —

season_hr_lg <- Teams %>%
filter(!is.na(HR), !is.na(G), yearID >= 1901, !is.na(lgID)) %>%
group_by(yearID, lgID) %>%
summarise(
hr_total = sum(HR, na.rm = TRUE),
games_team_total = sum(G, na.rm = TRUE),
.groups = “drop_last”
) %>%
mutate(games_league = games_team_total / 2,
hr_per_game = hr_total / games_league) %>%
ungroup()

p_facets <- ggplot(season_hr_lg, aes(yearID, hr_per_game)) +
geom_line() +
geom_smooth(se = FALSE, method = “loess”, span = 0.25) +
facet_wrap(~ lgID, nrow = 2) +
labs(
title = “AL vs NL: home runs per game over time”,
subtitle = paste0(“1901–”, latest_year),
x = “Season”,
y = “HR per game”,
caption = “Source: Lahman Baseball Database | Made in R”
) +
theme_minimal(base_size = 12) +
theme(plot.title = element_text(face = “bold”))

ggsave(“mlb_hr_per_game_al_vs_nl.png”, p_facets, width = 10, height = 7, dpi = 220)

— 5) Optional animated line (season build-up) —

p_anim <- ggplot(season_hr, aes(yearID, hr_per_game)) +
geom_line() +
geom_point(size = 1.5) +
labs(
title = “MLB Home Runs per Game — {closest_state}”,
subtitle = paste0(“1901–”, latest_year),
x = “Season”,
y = “HR per game”,
caption = “Source: Lahman Baseball Database | Made in R (gganimate)”
) +
theme_minimal(base_size = 13) +
transition_reveal(yearID)

animate(
p_anim,
width = 900, height = 540,
fps = 30, duration = 12, end_pause = 10,
renderer = gifski_renderer(“mlb_hr_per_game.gif”)
)

— 6) Ready-to-post bullet points (adjust as needed) —

– Home runs per game have trended upward over the long run, with notable surges in recent decades.

– The peak season in the dataset is flagged on the chart.

– AL and NL show broadly similar patterns, with era-specific differences.

– Context matters: ball composition, launch-angle era, and strategic shifts all play a role.

ou’ll get a clean, publication-quality chart like this:

(Insert your generated image mlb_home_run_trend.png here)

🔍 What the Numbers Tell Us

  • 1900s–1910s (Dead-ball era): Home runs were almost mythical. Pitchers dominated, and balls were softer.
  • 1920s–1950s: Enter Babe Ruth and the power era. The home run became a weapon.
  • 1990s–2000s (Steroid Era): Power surged to record highs, crossing 1 HR/game.
  • 2010s–Today: The “launch-angle revolution” and optimized hitting made power the new normal.

By 2019, MLB reached an all-time peak: 1.39 home runs per game — more than six times the rate seen in 1910.


💰 Betting Implications

For sports bettors and modelers, this trend matters:

  • Totals (Over/Under): Books have adjusted — games with more power see higher totals, often 9.0+ runs.
  • Player props: HR lines, slugging props, and “home run to be hit” markets depend heavily on current HR environment.
  • Park factors: Small stadiums (like Yankee Stadium or Great American Ball Park) amplify power numbers even more.

Understanding historical context helps avoid recency bias — home run rates fluctuate, and when the ball or strike zone changes, markets often lag behind.


🧩 The Big Picture

The home run boom has changed baseball strategy.
It’s more entertaining — but also more polarized: strikeouts are up, singles are down, and the game has tilted toward “three true outcomes.”

Whether you love or hate it, power has become baseball’s defining feature.


📈 Conclusion

Home runs tell a story not just about players, but about technology, physics, and data.
From Babe Ruth to Aaron Judge, baseball’s obsession with power reflects how analytics and innovation reshape the game we love.

And for those who bet on baseball?
Knowing the rhythm of power might just be your edge. ⚾💰

Leave a Comment

Your email address will not be published. Required fields are marked *