NFL · Empirical Bayes

True-Talent Leaderboards

A raw single-season rate is a noisy guess at a player’s real ability, and the noise is worst for the smallest samples — so a naïve leaderboard is topped by whoever got lucky in the fewest tries. This one shrinks every rate toward its position-group prior by how much the sample can be trusted, and shows a 90% credible interval instead of a point. Toggle raw vs. shrunk to watch the flukes fall back to the pack.

EPA per dropback · 2024

Mean QB EPA per dropback.

Beats raw by
14.9%
lower out-of-sample error
RMSE raw → shrunk
0.17 → 0.14
odd vs. even weeks
Split-half reliability
0.47
how repeatable the raw stat is
Stabilizes at
157
dropbacks to trust the number
shrunkrawthe shrink90% CI
-0.4-0.20.00.20.4avg1Lamar JacksonBAL · 494+0.282Jared GoffDET · 568+0.243Josh AllenBUF · 497+0.214Tua TagovailoaMIA · 421+0.165Baker MayfieldTB · 612+0.166Joe BurrowCIN · 701+0.147Brock PurdySF · 482+0.138Marcus MariotaWAS · 47+0.139Derek CarrNO · 290+0.1210Jordan LoveGB · 442+0.1211Justin HerbertLAC · 545+0.1112Tanner McKeePHI · 47+0.1113Jayden DanielsWAS · 528+0.1014Malik WillisGB · 63+0.1015Joe Milton IIINE · 29+0.1016Patrick MahomesKC · 617+0.1017Kyler MurrayARI · 570+0.1018Tyrod TaylorNYJ · 25+0.1019Mitchell TrubiskyBUF · 26+0.0920Jalen HurtsPHI · 399+0.0821Michael Penix Jr.ATL · 109+0.0822Sam DarnoldMIN · 593+0.0823Joshua DobbsSF · 48+0.0624Matthew StaffordLA · 546+0.0625Bo NixDEN · 591+0.0626Kenny PickettPHI · 46+0.0527Kirk CousinsATL · 478+0.0428Jimmy GaroppoloLA · 45+0.0429Justin FieldsPIT · 177+0.0430Geno SmithSEA · 629+0.04

Each row is a player: the solid dot is the shrunk estimate, the hollow dot the raw rate, joined by the red pull of regression; the grey bar is the 90% credible interval. A hollow shrunk dot means the sample is below the stabilization line — the number is mostly the position prior. Switch to Raw rank and watch the small-sample names climb.

EPA per dropback · 2024 · full board

EPA per dropback leaderboard for the 2024 NFL season, shrunk by empirical Bayes with 90% credible intervals, ranked by the shrunk estimate.
#PlayerTeamPosdropbacksRawShrunk90% interval
1Lamar JacksonBALQB494+0.35+0.28+0.18+0.38
2Jared GoffDETQB568+0.30+0.24+0.15+0.34
3Josh AllenBUFQB497+0.26+0.21+0.11+0.31
4Tua TagovailoaMIAQB421+0.20+0.16+0.05+0.27
5Baker MayfieldTBQB612+0.19+0.16+0.07+0.25
6Joe BurrowCINQB701+0.17+0.14+0.06+0.23
7Brock PurdySFQB482+0.16+0.13+0.03+0.23
8Marcus Mariota◦ provisionalWASQB47+0.41+0.13-0.05+0.31
9Derek CarrNOQB290+0.16+0.12+0.00+0.24
10Jordan LoveGBQB442+0.14+0.12+0.01+0.22
11Justin HerbertLACQB545+0.13+0.11+0.02+0.21
12Tanner McKee◦ provisionalPHIQB47+0.31+0.11-0.07+0.29
13Jayden DanielsWASQB528+0.12+0.10+0.00+0.20
14Malik Willis◦ provisionalGBQB63+0.24+0.10-0.07+0.27
15Joe Milton III◦ provisionalNEQB29+0.41+0.10-0.09+0.29
16Patrick MahomesKCQB617+0.11+0.10+0.01+0.19
17Kyler MurrayARIQB570+0.11+0.10+0.00+0.19
18Tyrod Taylor◦ provisionalNYJQB25+0.44+0.10-0.09+0.29
19Mitchell Trubisky◦ provisionalBUFQB26+0.37+0.09-0.10+0.28
20Jalen HurtsPHIQB399+0.10+0.08-0.02+0.19
21Michael Penix Jr.◦ provisionalATLQB109+0.13+0.08-0.08+0.24
22Sam DarnoldMINQB593+0.08+0.08-0.02+0.17
23Joshua Dobbs◦ provisionalSFQB48+0.13+0.06-0.12+0.24
24Matthew StaffordLAQB546+0.06+0.06-0.04+0.15
25Bo NixDENQB591+0.06+0.06-0.04+0.15
26Kenny Pickett◦ provisionalPHIQB46+0.07+0.05-0.13+0.23
27Kirk CousinsATLQB478+0.05+0.04-0.06+0.15
28Jimmy Garoppolo◦ provisionalLAQB45+0.05+0.04-0.14+0.23
29Justin FieldsPITQB177+0.04+0.04-0.10+0.18
30Geno SmithSEAQB629+0.04+0.04-0.05+0.13
31Trevor LawrenceJAXQB305+0.02+0.03-0.09+0.15
32Aaron RodgersNYJQB627+0.02+0.02-0.07+0.11
33Aidan O'ConnellLVQB254+0.01+0.02-0.10+0.15
34Joe FlaccoINDQB267+0.01+0.02-0.10+0.15
35Mason RudolphTENQB237-0.01+0.01-0.11+0.14
36Russell WilsonPITQB368-0.01+0.01-0.10+0.12
37Davis Mills◦ provisionalHOUQB38-0.14+0.01-0.18+0.19
38Mac JonesJAXQB279-0.01+0.01-0.11+0.13
39Tommy DeVito◦ provisionalNYGQB50-0.16-0.01-0.18+0.17
40Dak PrescottDALQB307-0.03-0.01-0.12+0.11
41Trey Lance◦ provisionalDALQB45-0.19-0.01-0.19+0.17
42C.J. StroudHOUQB583-0.02-0.01-0.10+0.09
43Brandon Allen◦ provisionalSFQB32-0.39-0.03-0.22+0.16
44Bryce YoungCARQB414-0.06-0.03-0.14+0.07
45Cooper RushDALQB321-0.07-0.03-0.15+0.08
46Tim Boyle◦ provisionalNYGQB51-0.28-0.04-0.21+0.14
47Drake MayeNEQB374-0.07-0.04-0.15+0.08
48Andy DaltonCARQB168-0.11-0.04-0.18+0.10
49Jameis WinstonCLEQB326-0.08-0.04-0.15+0.08
50Jake Haener◦ provisionalNOQB45-0.33-0.04-0.22+0.14
51Skylar Thompson◦ provisionalMIAQB39-0.40-0.04-0.23+0.14
52Tyler Huntley◦ provisionalMIAQB149-0.14-0.04-0.19+0.10
53Caleb WilliamsCHIQB636-0.08-0.05-0.14+0.04
54Bailey Zappe◦ provisionalCLEQB32-0.53-0.05-0.24+0.13
55Daniel JonesNYGQB371-0.10-0.06-0.17+0.06
56Desmond Ridder◦ provisionalLVQB94-0.23-0.06-0.22+0.10
57Anthony RichardsonINDQB277-0.14-0.07-0.20+0.05
58Gardner MinshewLVQB333-0.14-0.08-0.20+0.04
59Jacoby BrissettNEQB179-0.21-0.09-0.23+0.05
60Drew LockNYGQB193-0.21-0.10-0.24+0.04
61Will LevisTENQB344-0.19-0.12-0.23-0.00
62Deshaun WatsonCLEQB250-0.25-0.13-0.26-0.01
63Spencer RattlerNOQB250-0.30-0.17-0.30-0.04
64Dorian Thompson-Robinson◦ provisionalCLEQB126-0.56-0.23-0.38-0.07

How the shrinkage works

Two estimators

Rate stats (completion %, success rate, catch rate) use a beta-binomial model: a Beta(α, β) prior fit by marginal likelihood over each position group, then a Beta posterior per player. Per-play averages (EPA, CPOE, yards) use a normal-normal model with DerSimonian–Laird between-player variance. Both pull each player toward their group by exactly how thin their sample is.

Does it help? & the fine print

The trust panel’s numbers come from a leakage-free odd/even-week holdout: fit on odd weeks, predict even-week raw. Shrinkage lowers out-of-sample error for every stat. Priors are fit per season and per position (WR and TE separately), so a TE’s baseline isn’t a skill. Regular season only, 2016–2025. Rushing and receiving efficiency are heavily scheme-driven — read the wide bands as the honesty they are.

Source: nflverse play-by-play. Counted and computed deterministically — never modeled by a language model. Built by build_nfl_leaderboards.py (byte-reproducible).