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 target · 2021

Mean EPA per target, shrunk within position.

Beats raw by
24.4%
lower out-of-sample error
RMSE raw → shrunk
0.38 → 0.29
odd vs. even weeks
Split-half reliability
0.13
how repeatable the raw stat is
Stabilizes at
307
targets to trust the number
shrunkrawthe shrink90% CI
0.00.10.20.30.4TE avg1Dallas GoedertPHI · 77+0.292Dalton SchultzDAL · 106+0.263Travis KelceKC · 134+0.254Mark AndrewsBAL · 158+0.255Hunter HenryNE · 75+0.256Dawson KnoxBUF · 71+0.247Rob GronkowskiTB · 89+0.238Maxx WilliamsARI · 17+0.239John BatesWAS · 25+0.2310Juwan JohnsonNO · 22+0.2211David NjokuCLE · 53+0.2212Pat FreiermuthPIT · 80+0.2213Jimmy GrahamCHI · 24+0.2214Austin HooperCLE · 62+0.2215Will DisslySEA · 26+0.2116Durham SmytheMIA · 41+0.2117C.J. UzomahCIN · 63+0.2118MyCole PruittTEN · 19+0.2119Harrison BryantCLE · 28+0.2120Albert OkwuegbunamDEN · 40+0.2121George KittleSF · 94+0.2122Robert TonyanGB · 29+0.2123Kyle PittsATL · 110+0.2124Nick VannettNO · 15+0.2125Stephen AndersonLAC · 19+0.2026N'Keal HarryNE · 22+0.2027Marcedes LewisGB · 28+0.2028Jack DoyleIND · 45+0.2029Donald ParhamLAC · 28+0.2030Anthony FirkserTEN · 43+0.2031Kylen GransonIND · 15+0.20

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 target · 2021 · full board

EPA per target leaderboard for the 2021 NFL season, shrunk by empirical Bayes with 90% credible intervals, ranked by the shrunk estimate.
#PlayerTeamPostargetsRawShrunk90% interval
1Dallas Goedert◦ provisionalPHITE77+0.69+0.29+0.17+0.42
2Dalton Schultz◦ provisionalDALTE106+0.44+0.26+0.13+0.38
3Travis Kelce◦ provisionalKCTE134+0.38+0.25+0.13+0.37
4Mark Andrews◦ provisionalBALTE158+0.35+0.25+0.13+0.36
5Hunter Henry◦ provisionalNETE75+0.46+0.25+0.12+0.37
6Dawson Knox◦ provisionalBUFTE71+0.47+0.24+0.12+0.37
7Rob Gronkowski◦ provisionalTBTE89+0.37+0.23+0.11+0.36
8Maxx Williams◦ provisionalARITE17+0.89+0.23+0.09+0.37
9John Bates◦ provisionalWASTE25+0.63+0.23+0.09+0.36
10Juwan Johnson◦ provisionalNOTE22+0.66+0.22+0.09+0.36
11David Njoku◦ provisionalCLETE53+0.41+0.22+0.09+0.36
12Pat Freiermuth◦ provisionalPITTE80+0.32+0.22+0.09+0.35
13Jimmy Graham◦ provisionalCHITE24+0.53+0.22+0.08+0.35
14Austin Hooper◦ provisionalCLETE62+0.32+0.22+0.09+0.34
15Will Dissly◦ provisionalSEATE26+0.45+0.21+0.08+0.35
16Durham Smythe◦ provisionalMIATE41+0.37+0.21+0.08+0.35
17C.J. Uzomah◦ provisionalCINTE63+0.31+0.21+0.08+0.34
18MyCole Pruitt◦ provisionalTENTE19+0.52+0.21+0.08+0.35
19Harrison Bryant◦ provisionalCLETE28+0.40+0.21+0.08+0.35
20Albert Okwuegbunam◦ provisionalDENTE40+0.34+0.21+0.08+0.34
21George Kittle◦ provisionalSFTE94+0.26+0.21+0.09+0.33
22Robert Tonyan◦ provisionalGBTE29+0.37+0.21+0.07+0.34
23Kyle Pitts◦ provisionalATLTE110+0.24+0.21+0.08+0.33
24Nick Vannett◦ provisionalNOTE15+0.45+0.21+0.07+0.34
25Stephen Anderson◦ provisionalLACTE19+0.38+0.20+0.07+0.34
26N'Keal Harry◦ provisionalNETE22+0.35+0.20+0.07+0.34
27Marcedes Lewis◦ provisionalGBTE28+0.31+0.20+0.07+0.34
28Jack Doyle◦ provisionalINDTE45+0.26+0.20+0.07+0.33
29Donald Parham◦ provisionalLACTE28+0.26+0.20+0.06+0.33
30Anthony Firkser◦ provisionalTENTE43+0.23+0.20+0.07+0.33
31Geoff Swaim◦ provisionalTENTE40+0.23+0.20+0.06+0.33
32Kylen Granson◦ provisionalINDTE15+0.29+0.20+0.06+0.34
33Tyler Kroft◦ provisionalNYJTE25+0.22+0.20+0.06+0.33
34Kyle Rudolph◦ provisionalNYGTE40+0.21+0.19+0.06+0.33
35Brevin Jordan◦ provisionalHOUTE28+0.21+0.19+0.06+0.33
36Mo Alie-Cox◦ provisionalINDTE45+0.20+0.19+0.06+0.33
37Logan Thomas◦ provisionalWASTE25+0.18+0.19+0.06+0.33
38O.J. Howard◦ provisionalTBTE21+0.18+0.19+0.06+0.33
39Adam Shaheen◦ provisionalMIATE16+0.17+0.19+0.05+0.33
40Tommy Tremble◦ provisionalCARTE36+0.18+0.19+0.06+0.33
41Gerald Everett◦ provisionalSEATE63+0.17+0.19+0.06+0.32
42Blake Bell◦ provisionalKCTE13+0.09+0.19+0.05+0.33
43Eric Ebron◦ provisionalPITTE18+0.10+0.19+0.05+0.33
44Noah Fant◦ provisionalDENTE91+0.17+0.19+0.06+0.31
45Mike Gesicki◦ provisionalMIATE113+0.17+0.19+0.07+0.31
46Drew Sample◦ provisionalCINTE15+0.02+0.19+0.05+0.32
47Eric Saubert◦ provisionalDENTE12-0.04+0.18+0.05+0.32
48Hayden Hurst◦ provisionalATLTE31+0.09+0.18+0.05+0.32
49Brock Wright◦ provisionalDETTE17-0.05+0.18+0.04+0.32
50James O'Shaughnessy◦ provisionalJAXTE35+0.07+0.18+0.05+0.31
51Tyler Conklin◦ provisionalMINTE87+0.13+0.18+0.05+0.30
52Blake Jarwin◦ provisionalDALTE17-0.08+0.18+0.04+0.32
53Darren Waller◦ provisionalLVTE93+0.13+0.18+0.05+0.30
54Ryan Griffin◦ provisionalNYJTE42+0.07+0.18+0.05+0.31
55Dan Arnold◦ provisionalJAXTE53+0.09+0.18+0.05+0.31
56Josiah Deguara◦ provisionalGBTE33+0.02+0.18+0.04+0.31
57Tommy Sweeney◦ provisionalBUFTE12-0.32+0.17+0.04+0.31
58Josh Oliver◦ provisionalBALTE15-0.22+0.17+0.04+0.31
59Zach Gentry◦ provisionalPITTE25-0.10+0.17+0.04+0.31
60Jared Cook◦ provisionalLACTE85+0.07+0.17+0.04+0.29
61Foster Moreau◦ provisionalLVTE44-0.02+0.17+0.03+0.30
62T.J. Hockenson◦ provisionalDETTE86+0.06+0.17+0.04+0.29
63Zach Ertz◦ provisionalARITE113+0.08+0.16+0.04+0.28
64Tyler Higbee◦ provisionalLATE85+0.05+0.16+0.04+0.29
65Cameron Brate◦ provisionalTBTE57-0.04+0.16+0.03+0.29
66Jordan Akins◦ provisionalHOUTE33-0.26+0.15+0.01+0.28
67Ricky Seals-Jones◦ provisionalWASTE51-0.12+0.15+0.02+0.28
68Jacob Hollister◦ provisionalJAXTE15-0.83+0.15+0.01+0.28
69Adam Trautman◦ provisionalNOTE44-0.19+0.15+0.01+0.28
70Pharaoh Brown◦ provisionalHOUTE34-0.31+0.14+0.01+0.28
71Jonnu Smith◦ provisionalNETE45-0.22+0.14+0.01+0.27
72Cole Kmet◦ provisionalCHITE93-0.06+0.13+0.01+0.26
73Ian Thomas◦ provisionalCARTE30-0.53+0.13-0.01+0.26
74Evan Engram◦ provisionalNYGTE73-0.15+0.13+0.00+0.26

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).