The shrinkage machine

Every dot is a shooter’s career: left–right is how many non-penalty shots they have taken (log scale), up–down is goals per xG — 1.00 means scoring exactly what the chances were worth. Drag the slider (or press Shrink it) and watch every raw career get pulled toward the population mean of 0.96: thin samples travel far, huge samples barely move. That pull is empirical Bayes.

0%

215 careers, from what happened to what to believe

Goals per xG (y) vs career non-penalty shots (x, log scale) · shrinkage target: population mean 0.96

  • Above average, P ≥ 95% (6 players)
  • Below average, P ≥ 95% (1 player)
  • Indistinguishable from average (208)
Source: Understat career shot logs, 2014–2025 · n = 73,272 non-penalty shots, 215 players · pipeline/model_bayes_finishing.py

The travel distances tell the story. Ruslan Malinovskiy sits at the very top of the raw chart — 1.71 goals per xG, 30 goals from just 17.5 xG — but his 354 shots buy his record only a 25% say against the league prior, so he lands at 1.12. Son Heung-min starts lower, at 1.33, and finishes higher: 784 shots argue louder, and his posterior settles at 1.17 with 90% interval [1.07, 1.29].

Why the model is this brutal: conditional on chance quality, each shot is roughly a coin weighted at its xG. A striker taking 100 shots at the corpus-average 0.13 xG carries ±3.4 goals of pure binomial noise per hundred shots — a “+5 over xG” season is barely 1.5σ. Simulate the whole league with zero finishing skill, 2,000 times over, and the spread of G−xG per 100 shots comes out at SD 1.86 against the observed 2.26 — luck is 67.6% of the variance. The “best finisher” in a completely skill-free league still beats xG by +6.3 goals per 100 shots.

Luck’s share of G−xG variance
67.6%
2,000-run zero-skill simulation
Provably clinical
6 / 215
P(above average) ≥ 95%
Provably not
1 / 215
Calvert-Lewin · P(above avg) = 0.5%
Shots until data beats prior
441
learned τ = 0.142 · median career: 293

The honest leaderboard

Rank players by their posterior goals-per-xG and attach the uncertainty you are owed. Only three careers — Son (interval floor 1.07), Kane (1.01) and De Bruyne (1.01) — keep a 90% credible interval wholly above 1.00. At the other end exactly one player is provably below average: Dominic Calvert-Lewin, raw 0.67, posterior 0.81.

Best and worst 15 finishers by posterior mean

Goals per xG · dot = posterior mean, whisker = 90% credible interval on true skill, open ring = raw career ratio — a noisy outcome, so it can legitimately sit outside the whisker

  • Posterior mean (above avg, P ≥ 95%)
  • Posterior mean (below avg, P ≥ 95%)
  • Posterior mean (uncertain)
  • 90% credible interval
Source: Understat career shot logs, 2014–2025 · n = 73,272 shots, 215 players · pipeline/model_bayes_finishing.py

Read the whiskers, not the dots: Malinovskiy’s interval [0.94, 1.33] still straddles average — a spectacular record on a thin sample earns suspicion, not certainty. Two things trip people up here. The whisker bounds a player’s true skill, not his raw ratio, so the raw ring often sits outside it — that is the shrinkage doing its job, not an error. And “average” means the population mean of 0.96 goals per xG (this corpus scores 4% under its Understat xG), so P(above avg) is the posterior probability true skill clears 0.96 — not 1.00. That is how Sesko can beat his xG by 5.6 goals yet earn only P = 80.5%: 174 shots buy his raw 1.18 a 28% say, leaving a posterior of 1.01 [0.89, 1.14]. The full table below is sortable; every number on this page survives without hovering anything.

All 215 qualified shooters (≥ 100 career non-penalty shots) — click a header to sort
# Player Team League Shots Goals Σ xG Raw G/xG Posterior 90% CI P(above avg) FSAA / 100

FSAA = finishing skill above average: extra goals per 100 corpus-average shots versus an average finisher, computed from the posterior (shrunk) skill, not the raw record. Posterior and CI are on the goals-per-xG ratio scale and describe true skill — the raw ratio is the outcome and can fall outside the CI. “Average” everywhere is the population mean 0.96, not 1.00.

How many shots until we believe you?

The model learned that true finishing skill varies with SD τ = 0.142 log-odds — real, but small. That single number fixes the exchange rate between evidence and belief: a player’s own record gets weight n / (n + 441), so it takes 441 non-penalty shots — four-plus seasons of a starter’s volume — before the data outweighs the prior. The median career here is 293 shots. Only 51 of 215 players clear the bar.

Uncertainty shrinks slowly: the credible interval vs career shots

Width of the 90% credible interval, goals per xG (y) vs non-penalty career shots (x)

  • Theory: posterior CI width at the corpus shot mix
  • The 215 real careers (each player’s actual CI width)
Source: Understat career shot logs, 2014–2025 · n = 73,272 shots, 215 players · pipeline/model_bayes_finishing.py

At 100 shots — one good season — your record carries just 18.5% of the verdict and the interval spans 0.27 goals per xG: consistent with anything from mediocre to elite. At 500 shots the weight is 53.1% (width 0.20); at 1,000, 69.4% (width 0.16). This is why raw G−xG per 100 shots has a split-half reliability of only r = 0.20 — flip a season’s shots into two random halves and one half barely predicts the other. Shrinkage lifts that to 0.25: better, still humble.1

Harry Kane owns the largest sample in the corpus — 1,469 shots, 251 goals, 222.4 xG — which earns his record a 75% say and the tightest positive verdict: posterior 1.08 [1.01, 1.16]. Robert Lewandowski’s 1,458 shots deliver the corpus’s most confident verdict of all, and it is a shrug: raw 0.958, posterior 0.957. The model barely moves him because there is nothing left to move — dead average, precisely measured.

The belief-o-meter

Give a hypothetical shooter a career length and see how the verdict splits between their record and the league prior (τ = 0.142, half-weight at 441 shots).

293
Their record: 40% League prior: 60%

1 Fit separately by shot type, foot shots keep τ = 0.155 while the corpus’s 10,602 headers return τ = 0.000 — zero detectable header-finishing skill. Understat xG also overrates headers for everyone: 0.839 goals per header xG corpus-wide (μhead = -0.264).

Three careers, three verdicts

The same machine, pointed at three famous shot profiles: the mirage, the machine, and the proven exception.

The mirage

Ruslan Malinovskiy

30 goals from 17.5 xG across 354 shots (2019–2025) — a raw 1.71 goals per xG, the highest in the corpus. But his average shot is worth just 0.05 xG: long-range screamers, the noisiest diet in football. The posterior lands at 1.12 [0.94, 1.33] — probably good (P = 95.7%), provably nothing. His record holds 25% of the say.

The machine

Erling Haaland

146 goals on 141.6 xG (651 shots): raw 1.03, posterior 1.00 [0.92, 1.09]. The most feared scorer alive is, per the model, a dead-average finisher. His edge is the diet, not the touch: 0.22 xG per shot — 1.6× the corpus mean of 0.13. He doesn’t beat the chances; he gets better chances than anyone.

The proven exception

Dominic Calvert-Lewin

62 goals on 92.4 xG (518 shots): raw 0.67, posterior 0.81 [0.73, 0.90]. The one shooter in 215 who is below average with ≥ 95% certainty — P(above average) = 0.5%, costing -2.1 goals per 100 average shots. One mitigating fact: 39% of his shots are headers, the shot type where Understat xG runs 16% hot for everyone.

Mini-charts share one scale: goals per xG from 0.5 to 1.8 · ring = raw career ratio, dot + whisker = posterior mean with 90% credible interval · vertical rules mark the population mean 0.96 and 1.00 · Source: Understat, 2014–2025.