The three big takeaways
Three patterns run through the seasons: the home run rate changed more than anything else, strikeouts rose along with it, and a ballpark can shape a team's pitching as much as its pitchers do.
The home run rate climbed from to of plate appearances, peaking at in
The home run rate is home runs divided by plate appearances, which adjusts for seasons of different lengths (1981, 1994, 1995 and 2020 were shortened). It was in and in , and the high point was in . It was not a straight climb: the rate fell to in the , then rose in every decade after that, reaching in the . Of everything in this data, this is the biggest change in how the game is played.
Switch the chart to home runs per team to see raw totals, or to decades to see the shape of the climb.
Explore home run rate in the dashboardAs home runs rose, so did strikeouts: the two rates moved together (correlation )
The home run rate went from to of plate appearances while the strikeout rate went from to . Across the seasons the two rates are strongly related, with a correlation of (1 would mean they always rise and fall together), and by decade it is . Both fell in the and both rose in every decade after that.
They do not move in lockstep every year (the correlation of year-to-year changes is only ), so this is a long-run pattern, not a rule for any single season. The likely link is how hitters swing: swinging for the fences produces more home runs and more misses, which is the trade-off behind the three true outcomes below. This data shows that the two rise together; it cannot, by itself, prove why.
Explore strikeout rate in the dashboardThe have the highest ERA of any franchise, , in the most hitter-friendly ballpark
Where a team plays can matter as much as who pitches for it. The ' pitchers have the highest ERA of any franchise, against for the whole league. Their home, in Denver, sits about a mile above sea level, where the thin air lets fly balls carry farther. Lahman's park factor measures this effect (100 is a neutral park, and anything above 100 favors hitters): the average over seasons, far above the next highest, the at , and the lowest, the at . rated in , the most extreme single season.
Across all franchises, a higher park factor goes with a higher ERA (correlation ). Take the out and the link is weaker (), which means Colorado is an extreme case, not just the top of a smooth trend. Park factors come from Lahman's Teams table and end in ; ERA covers every season through .
Explore franchise pitching in the pitching dashboardMore on hitting
The same seasons, one stat at a time. Every rate is computed from totals, and each finding links to a matching view in the hitting dashboard.
Strikeouts rose from to of plate appearances
In , of all plate appearances ended in a strikeout. In it was . The highest single season was at .
Explore strikeout rate in the dashboardBatting average ranged from in to in
Batting average is total hits divided by total at-bats for the whole league each season. The lowest season was () and the highest was (). Use the switch to compare on-base percentage, slugging and OPS over the same years.
Explore batting average in the dashboardThree true outcomes went from to of plate appearances
A "three true outcome" is a home run, a walk or a strikeout: a plate appearance the fielders never touch. Combined, they were of plate appearances in and in . The stacked chart shows how much each of the three contributes.
Explore three true outcomes in the dashboardStolen bases per team peaked at in
Dividing total stolen bases by the number of franchises active that season gives steals per team. The peak was in . In it was . Shortened seasons appear as dips in this chart because it counts totals rather than rates.
Explore stolen bases in the dashboardFrom 1973 to 2021 the AL's OPS averaged versus the NL
The American League adopted the designated hitter in 1973. The National League did not until 2022, so NL pitchers kept batting. From 1973 through 2021, the AL's OPS minus the NL's OPS averaged per season. Before 1973 the gap averaged , and since 2022 it has averaged . The shaded band marks the years only one league used the DH.
Explore AL vs. NL in the dashboardThe hit the most home runs:
Summing every home run hit by batters on each franchise's roster puts the first with . Franchises that joined later, through expansion, have had fewer seasons to add up totals, so the switch shows home runs per plate appearance as a fairer comparison.
Explore franchise home runs in the dashboardhad the highest OPS of any position at
Each player-season is assigned the position where the player played the most games that season. Among position players, produced the highest OPS () and the lowest (). Pitchers batting posted .
Explore OPS by position in the dashboardLeft-handed hitters took of plate appearances in the and in the
Batting hand comes from each player's record in the People table. Left-handed batters took of plate appearances in the and in the . Switch hitters took and over the same decades.
Explore batting hand in the dashboardTriples per 600 plate appearances went from to
Per 600 plate appearances (about a full season for a regular), hitters averaged triples in the and in the . Doubles went from to .
Explore doubles and triples in the dashboardPitching
The same seasons from the pitcher's side. Every rate below is computed from totals (total earned runs and total innings, never an average of pitchers' ERAs), and the pitching dashboard lets you filter and re-cut the same numbers.
Strikeouts per 9 innings rose from to
A pitcher who worked 9 innings in struck out batters on average. By the figure was , and it peaked at in . Walks per 9 innings moved much less, from to . This is the pitching side of the rise in hitters' strikeout rate above.
Explore strikeouts per 9 in the pitching dashboardLeague ERA bottomed at in and peaked at in
ERA is earned runs allowed per 9 innings for the whole league. The low point, in , is the "Year of the Pitcher"; the mound was lowered and the strike zone shrunk the next season. The high point was in . From 1973 to 2021 the AL's ERA averaged runs per 9 innings compared with the NL, the years only the AL used a designated hitter.
Explore ERA by league in the pitching dashboardComplete games per team fell from to
A complete game means one pitcher finishes what he started. Dividing all complete games by the number of franchises active that season gives complete games per team. It was in and in . The average team now finishes fewer than one a season.
Explore complete games in the pitching dashboardStarters' innings per start fell from to
Counting only pitchers who started at least half the games they appeared in, the average start lasted innings in and in . That is about fewer innings each time a starter takes the ball.
Explore innings by role in the pitching dashboardRelievers threw of innings in the , up from in the
A pitcher is a reliever if he started fewer than half the games he pitched in for a team that season. Relievers' share of all innings was in the , dipped to in the , and reached in the . Shorter starts and the rise of the bullpen are two sides of the same change.
Explore starters vs. relievers in the pitching dashboardHead to head
The same data can answer a different question: how did one hitter do against one pitcher? The Matchups page has every hitter-pitcher pairing from to , players and pairs in all, each with a season-by-season line, chart and table. Start from a hitter or a pitcher, or try one of these:
Barry Bonds vs. Greg Maddux Derek Jeter vs. Pedro Martinez Pete Rose vs. Phil Niekro Mike Trout vs. Clayton Kershaw
Open the Matchups pageTeam by team
Two interactive tables. Pick any season and franchise to see who contributed.
See who contributed to any team's season
Every player who batted for a franchise in a given season, with the counting stats and rates they personally put up. Sort any column; the bottom row is the team's total for that season, computed the same way as the rest of this report (totals, not an average of averages).
Loading player rows…
See who pitched for any team's season
Every pitcher who threw for a franchise in a given season, with the pitching line he personally put up. Sort any column; the bottom row is the team's total for that season, computed the same way as the rest of this report (ERA and the other rates come from team totals, not an average of the pitchers' rates). Innings use baseball notation, so 200.1 means 200 innings and one out.
Loading pitcher rows…
About the data
Source
The Lahman Baseball Database, compiled by Sean Lahman and maintained with SABR. It is free to download as CSV files. This project uses six of its tables: Batting, Pitching, People, Fielding, Teams and TeamsFranchises, from the 2025 release (covering 1871–2025, released January 2026). The 2026 regular season comes from MLB's public Stats API, and the Matchups tab uses Retrosheet play-by-play files; both are described below.
What one row is
One row is one player's batting line for one team in one season (a "stint"). A player traded mid-season has one row per team. The file used by the site has rows and columns covering seasons (–) and franchises.
Pitching table
The pitching half uses a sixth Lahman table, Pitching. One pitching row is one pitcher's line for one team in one season (a "stint"), the same grain as the batting rows. The file has rows and columns covering the same seasons and franchises. Seasons before are excluded ( rows) and row with no batters faced is dropped. A pitcher is a starter for a given team and season if he started at least half of his games, otherwise a reliever. Innings are stored as outs and divided by 3, so no rounding enters the totals. Holds are not recorded in the Lahman data, so saves are the only late-inning count shown.
Correlations and park factors
The "correlation" in the home run, strikeout and ballpark findings is the Pearson correlation coefficient: 1 means two numbers always rise and fall together, 0 means no linear relationship, and negative numbers mean they move in opposite directions. The home run and strikeout correlation uses the league-wide rates for each of the seasons (and, separately, for each decade and for each year-to-year change). The ballpark finding uses each franchise's average park factor from the Lahman Teams table (BPF, where 100 is a neutral park and a higher number favors hitters) for franchises, and compares it with the franchise's ERA and home runs allowed per 9 innings. Lahman publishes park factors through , so the 2026 season is not in the park averages. A correlation shows that two things move together, not that one causes the other.
The 2026 season
Lahman publishes a season only after it ends, so its 2025 release stops at 2025. The 2026 regular season, which ended September 27, was added from MLB's public Stats API by scripts/fetch_mlb_2026.py (fetched UTC). That is hitting lines and pitching lines, one per player and team, cleaned with the same rules as every other season ( hitting lines with no plate appearances are dropped). Each MLB player is matched to his Lahman playerID by birth date and name, so careers continue across the two sources: of players matched, and the rest, mostly 2026 debuts, keep an MLB id. Primary position is the position with the most games, with left, center and right field combined as Outfield, as in Lahman. Postseason games are not included in any season. As a check, the player rows were summed by team and compared with MLB's own published team totals: of comparisons match exactly, and the only differences are in , because a team's earned runs are not always the sum of its pitchers' earned runs.
Matchup data (Matchups tab)
Hitter-versus-pitcher results are not in Lahman, which only has season totals. From through they come from Retrosheet's play-by-play event files, read by scripts/build_matchups.py. Every plate appearance is classified from its play record (single, double, triple, home run, walk, hit by pitch, strikeout, sacrifice, or other out) and credited to the pitcher who was on the mound according to that game's lineup and substitution records. Retrosheet has not published 2026 yet, so that season comes from MLB's own play-by-play feeds (scripts/fetch_mlb_2026_pa.py): completed regular-season games and plate appearances, with players matched to the same ids as the older seasons. Every pairing is kept, with no minimum number of plate appearances: players, hitter-pitcher pairs and plate appearances in season rows. Because that is too much to load at once, the page keeps one small file per hitter and one per pitcher and loads the one you pick. Season totals built this way are within of this site's hitting file from 1970 on. Retrosheet is missing some 1960s games, so those seasons run up to low. As a check, each player-season was compared with the hitting and pitching files: hits, home runs, walks and strikeouts match exactly for of hitter-seasons and of pitcher-seasons; most misses are a single walk, because official scoring can charge a walk to the pitcher who started the count. The information used here was obtained free of charge from and is copyrighted by Retrosheet. Interested parties may contact Retrosheet at 20 Sunset Rd., Newark, DE 19711.
Rows dropped and cleaning
Seasons before are excluded ( rows) to keep the study to the modern era. Rows with zero plate appearances are dropped ( rows) because those players never batted. Any missing counting stat is treated as zero; in this release cells were missing, so no values changed. Team codes are mapped to franchises so that, for example, the Montreal Expos and Washington Nationals count as one group. rows have no fielding record and are labeled "DH / pinch hitter."
How every number is computed
All rates are computed from totals (for example, total hits divided by total at-bats), not as an average of individual players' rates. The same formulas run in scripts/prep_data.py and in the dashboard.
| Measure | Formula |
|---|---|
| Plate appearances (PA) | AB + BB + HBP + SF + SH |
| Batting average | H ÷ AB |
| On-base percentage | (H + BB + HBP) ÷ (AB + BB + HBP + SF) |
| Slugging percentage | (H + 2B + 2×3B + 3×HR) ÷ AB |
| OPS | OBP + SLG |
| Strikeout, walk, home run rate | SO ÷ PA, BB ÷ PA, HR ÷ PA |
| Three true outcomes rate | (HR + BB + SO) ÷ PA |
| Stolen bases per team | Season SB ÷ number of franchises with at least one row that season |
| Per 600 PA | Total ÷ PA × 600 |
| League OPS gap | Mean across seasons of (AL OPS − NL OPS) |
| Innings pitched (IP) | Outs recorded ÷ 3 |
| ERA | 9 × earned runs ÷ IP |
| WHIP | (BB + H) ÷ IP |
| Strikeouts, walks, home runs per 9 | 9 × (SO, BB or HR) ÷ IP |
| Pitcher strikeout and walk rate | SO ÷ batters faced, BB ÷ batters faced |
| Complete games per team | Season CG ÷ number of franchises with at least one pitching row that season |
| Innings per start | Innings of pitchers classed as starters ÷ their games started |
| Reliever share of innings | Innings of pitchers classed as relievers ÷ all innings |
| Home runs per team | Season HR ÷ number of franchises with at least one row that season |
| Rates by decade (home run, strikeout) | The decade's total HR (or SO) ÷ the decade's total PA, not an average of season rates |
| Share of plate appearances by batting hand | PA by left-handed, right-handed or switch hitters in the decade ÷ all PA in the decade |
| Franchise home run total and rate | Sum of HR across the franchise's rows; HR ÷ PA across the same rows |
| League ERA gap (AL − NL) | Mean across seasons of (AL ERA − NL ERA), each from league totals |
| Franchise ERA and strikeouts per 9 | From the franchise's total ER, SO and IP over all its seasons, not an average of seasons |
| Team table totals | Sums of the pitchers' (or hitters') rows; every rate in the bottom row is recomputed from those sums |
| Primary position | Fielding position with the most games for that player, team and season |