Sports Dashboard

MI Bivariate Poisson + Dixon-Coles + Elo

← Back to Blog
|Research

Penalties Are Random: 486 Team-Seasons Prove Mean Reversion

Penalty frequency is heavily mean-reverting (corr=0.145). High-penalty teams drop 51% in the second half of the season. No table-position effect — penalties are luck-driven for all teams. Always use npxG.

The Question

Do penalties mean-revert? If a team earned 5 penalties in the first half of the season, should we expect fewer in the second half? And does it matter whether they're a top team or a bottom team?

Ted Knutson's framework says penalties are semi-random — they inflate xG for lucky teams. Statswing says always use npxG. But nobody had tested whether the reversion is uniform or stratified by team quality.

What We Found

Penalties are heavily mean-reverting. Overall correlation between first-half and second-half season penalty rates: 0.145 — barely above zero. Essentially random.

GroupFirst-Half RateSecond-Half RateCorrelation
High first-half (>0.3/match)0.3680.179**-51.3% drop**
Low first-half (<0.1/match)0.0370.148**+300% increase**
Top-half teams (by xGD)0.2010.1780.110
Bottom-half teams0.1380.1310.022

486 team-seasons tested across 5 leagues (Big 5, 2020-2024).

The Nuance

The table position hypothesis was partially right but not in the way expected. Top teams DO get more penalties (0.201/match vs 0.138) — they have more possession, more touches in the box, more dribbles that draw fouls. But both halves are equally mean-reverting. Top-half correlation is 0.110, bottom-half is 0.022 (effectively zero). Nobody's penalty count is persistent.

This means: a bottom-half team that earned 5 penalties in 15 matches got lucky. Period. Even a top-half team's penalty count is mostly noise — their higher rate reflects more opportunities, but the specific count in any window is unpredictable.

What This Means

Always use npxG. Penalties add ~0.76 xG each and are awarded semi-randomly. A team's rolling xG is inflated or deflated by penalty luck that will revert. We enriched all match-xg files with npxG data (97% coverage for Understat leagues) and added penalty xG fraction as an enrichment flag on every bet.

The finding also killed the "penalty-inflated xG filter" signal — at a 30% penalty-xG threshold, zero bets trigger (max is 29%). Even at 15%, only 70 bets are affected with zero marginal ROI. Penalties are too rare per team to be a useful filter dimension.

What's Next

npxG data is baked into the pipeline. No further action needed — the finding is already incorporated.