Good offense vs. good defense: which one shows up?
Across 3,716 offense-vs-defense matchups (2016–2025, week 6 on), an offense’s season-to-date EPA per play tracked how it played that week about 2.1 times as closely as the opposing defense’s numbers did (90% interval 1.7 to 2.6). And strength against strength is no special case: the two sides simply add up.
- When a top offense meets a top defense, lean on the offense’s track record. Strong offenses facing strong defenses still averaged +0.033 EPA per play, better than weak offenses facing weak defenses (-0.038).
- Discount hot defensive numbers. A defense’s season-to-date rate is a noisier guide to its next game, so a matchup “against the league’s best defense” moves the expectation less than it sounds.
- Run numbers say the least on both sides. Pass offense and pass defense carry most of what the season so far tells you.
This week’s matchups
What happened when offenses met defenses, 2016–2025
Why the offense’s numbers travel better
Both sides of a matchup come with a season-to-date number: the offense’s EPA per play, and the defense’s EPA per play allowed, each adjusted for the opponents faced so far (how). Put both against what the offense actually did in the next game, and the offense’s number lines up about twice as well: a correlation of 0.29 against 0.14 for the defense’s. Passing shows the same split (0.24 against 0.12, a ratio of 2.0, interval 1.6 to 2.6); running is weak on both sides (0.14 and 0.09).
Neither number is a strong guide to a single game; football games are noisy. But the difference matters when the two point in opposite directions, as they do whenever a good offense meets a good defense. A likely reason, not tested here: a defense’s results depend more on things it doesn’t control from week to week, like the quarterbacks it happens to face and whether the passes it defends are caught or dropped.
No special “strength on strength” effect
It’s tempting to think great-on-great matchups follow their own rules: that an elite defense “neutralizes” an elite offense. In the data they don’t. Adding an offense × defense interaction to a model of both sides changed almost nothing (90% interval for its size: -0.006 to +0.006 EPA per play per standard deviation of each). The grid above shows it plainly: a strong offense facing a strong defense averaged +0.033, close to what the two sides would predict separately, and well above a weak offense against a weak defense (-0.038).
Method, data, and limits
Data. nflverse play-by-play, regular seasons 2016–2025, garbage time removed, with Sparvi’s opponent-adjusted EPA per play (model). Every game from week 6 on gives two matchups (each offense against the other team’s defense): 3,716 in all, from 1,858 games.
The test. The outcome is the offense’s raw EPA per play in that game. The predictors are the offense’s adjusted EPA per play and the defense’s adjusted EPA per play allowed, both through the previous week, so nothing from the game itself is used. The ratio is the offense’s correlation with the outcome divided by the defense’s. A linear fit with both sides standardized gives the same picture (0.067 EPA per play per standard deviation for the offense, 0.032 for the defense). Intervals come from 2,000 bootstrap resamples of games, keeping both matchups of a game together. The grid sorts matchups into thirds on each side; each cell has at least 402 matchups.
What it can’t tell you. These are averages over many games; any one game can go the other way. Season-to-date numbers early in the year rest on few games, which is why the test starts at week 6. Injuries, weather, and quarterback changes aren’t in the ratings. The table of this week’s games shows ratings, not predictions.
Code: nfl/offense_defense/ · Data: nflverse play-by-play (CC-BY 4.0). Sparvi is not affiliated with the NFL or any club.
Model version. NFL opponent adjustment v1.0.0 (experimental: validated before the backtest harness existed; its harness port is pending).