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 · 2022

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
349
targets to trust the number
shrunkrawthe shrink90% CI
0.00.10.20.3TE avg1Dallas GoedertPHI · 69+0.262Travis KelceKC · 153+0.253George KittleSF · 86+0.234Will DisslySEA · 38+0.235Chig OkonkwoTEN · 47+0.226Austin HooperTEN · 60+0.217Evan EngramJAX · 101+0.218Brock WrightDET · 24+0.219Jordan AkinsHOU · 56+0.2010David NjokuCLE · 80+0.2011Dawson KnoxBUF · 65+0.2012Hayden HurstCIN · 68+0.2013Noah FantSEA · 63+0.2014Noah GrayKC · 34+0.1915C.J. UzomahNYJ · 27+0.1916Donald ParhamLAC · 12+0.1917Mitchell WilcoxCIN · 18+0.1918Joseph FortsonKC · 13+0.1919Jack StollPHI · 14+0.1920Eric TomlinsonDEN · 13+0.1921Adam TrautmanNO · 22+0.1922MyCole PruittATL · 21+0.1923Daniel BellingerNYG · 36+0.1924Mark AndrewsBAL · 114+0.1925Colby ParkinsonSEA · 34+0.1926Jake FergusonDAL · 22+0.1927Juwan JohnsonNO · 65+0.1928Dan ArnoldJAX · 13+0.1929Hunter HenryNE · 59+0.1830Johnny MundtMIN · 21+0.1831Connor HeywardPIT · 17+0.18

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 · 2022 · full board

EPA per target leaderboard for the 2022 NFL season, shrunk by empirical Bayes with 90% credible intervals, ranked by the shrunk estimate.
#PlayerTeamPostargetsRawShrunk90% interval
1Dallas Goedert◦ provisionalPHITE69+0.65+0.26+0.13+0.38
2Travis Kelce◦ provisionalKCTE153+0.43+0.25+0.14+0.36
3George Kittle◦ provisionalSFTE86+0.46+0.23+0.11+0.35
4Will Dissly◦ provisionalSEATE38+0.69+0.23+0.10+0.35
5Chig Okonkwo◦ provisionalTENTE47+0.51+0.22+0.09+0.34
6Austin Hooper◦ provisionalTENTE60+0.44+0.21+0.09+0.34
7Evan Engram◦ provisionalJAXTE101+0.33+0.21+0.09+0.33
8Brock Wright◦ provisionalDETTE24+0.70+0.21+0.08+0.34
9Jordan Akins◦ provisionalHOUTE56+0.38+0.20+0.08+0.33
10David Njoku◦ provisionalCLETE80+0.31+0.20+0.08+0.32
11Dawson Knox◦ provisionalBUFTE65+0.31+0.20+0.08+0.32
12Hayden Hurst◦ provisionalCINTE68+0.30+0.20+0.08+0.32
13Noah Fant◦ provisionalSEATE63+0.30+0.20+0.07+0.32
14Noah Gray◦ provisionalKCTE34+0.38+0.19+0.07+0.32
15C.J. Uzomah◦ provisionalNYJTE27+0.42+0.19+0.07+0.32
16Donald Parham◦ provisionalLACTE12+0.68+0.19+0.06+0.32
17Mitchell Wilcox◦ provisionalCINTE18+0.52+0.19+0.06+0.32
18Joseph Fortson◦ provisionalKCTE13+0.63+0.19+0.06+0.32
19Jack Stoll◦ provisionalPHITE14+0.57+0.19+0.06+0.32
20Eric Tomlinson◦ provisionalDENTE13+0.56+0.19+0.06+0.32
21Adam Trautman◦ provisionalNOTE22+0.39+0.19+0.06+0.32
22MyCole Pruitt◦ provisionalATLTE21+0.39+0.19+0.06+0.32
23Daniel Bellinger◦ provisionalNYGTE36+0.30+0.19+0.06+0.31
24Mark Andrews◦ provisionalBALTE114+0.22+0.19+0.07+0.30
25Colby Parkinson◦ provisionalSEATE34+0.30+0.19+0.06+0.31
26Jake Ferguson◦ provisionalDALTE22+0.36+0.19+0.06+0.32
27Juwan Johnson◦ provisionalNOTE65+0.24+0.19+0.06+0.31
28Dan Arnold◦ provisionalJAXTE13+0.45+0.19+0.06+0.32
29Hunter Henry◦ provisionalNETE59+0.23+0.18+0.06+0.31
30Johnny Mundt◦ provisionalMINTE21+0.26+0.18+0.05+0.31
31Connor Heyward◦ provisionalPITTE17+0.24+0.18+0.05+0.31
32Josiah Deguara◦ provisionalGBTE15+0.23+0.18+0.05+0.31
33Shane Zylstra◦ provisionalDETTE15+0.23+0.18+0.05+0.31
34Trey McBride◦ provisionalARITE39+0.20+0.18+0.05+0.30
35Josh Oliver◦ provisionalBALTE25+0.20+0.18+0.05+0.31
36Taysom Hill◦ provisionalNOTE13+0.20+0.18+0.05+0.31
37Anthony Firkser◦ provisionalATLTE13+0.19+0.18+0.05+0.31
38Tanner Hudson◦ provisionalNYGTE15+0.19+0.18+0.05+0.31
39Teagan Quitoriano◦ provisionalHOUTE14+0.16+0.18+0.05+0.31
40Cole Kmet◦ provisionalCHITE70+0.16+0.17+0.05+0.29
41Foster Moreau◦ provisionalLVTE54+0.16+0.17+0.05+0.30
42Ian Thomas◦ provisionalCARTE30+0.13+0.17+0.05+0.30
43Jelani Woods◦ provisionalINDTE40+0.13+0.17+0.05+0.30
44Darren Waller◦ provisionalLVTE44+0.11+0.17+0.04+0.29
45Zach Ertz◦ provisionalARITE71+0.12+0.17+0.05+0.29
46Durham Smythe◦ provisionalMIATE20-0.04+0.16+0.04+0.29
47Harrison Bryant◦ provisionalCLETE43+0.07+0.16+0.04+0.29
48Geoff Swaim◦ provisionalTENTE16-0.11+0.16+0.03+0.29
49Zach Gentry◦ provisionalPITTE23-0.06+0.16+0.03+0.29
50Albert Okwuegbunam◦ provisionalDENTE18-0.13+0.16+0.03+0.29
51Cade Otton◦ provisionalTBTE65+0.08+0.16+0.04+0.28
52Jonnu Smith◦ provisionalNETE38+0.01+0.16+0.03+0.29
53Pharaoh Brown◦ provisionalCLETE20-0.12+0.16+0.03+0.29
54O.J. Howard◦ provisionalHOUTE23-0.09+0.16+0.03+0.29
55Peyton Hendershot◦ provisionalDALTE16-0.20+0.16+0.03+0.29
56Kyle Pitts◦ provisionalATLTE59+0.06+0.16+0.04+0.28
57Mo Alie-Cox◦ provisionalINDTE28-0.06+0.16+0.03+0.29
58Mike Gesicki◦ provisionalMIATE53+0.04+0.16+0.03+0.28
59John Bates◦ provisionalWASTE22-0.13+0.16+0.03+0.29
60Pat Freiermuth◦ provisionalPITTE98+0.09+0.16+0.04+0.27
61Eric Saubert◦ provisionalDENTE24-0.12+0.16+0.03+0.29
62Robert Tonyan◦ provisionalGBTE67+0.06+0.16+0.04+0.28
63Tommy Tremble◦ provisionalCARTE32-0.05+0.16+0.03+0.28
64Kylen Granson◦ provisionalINDTE40-0.02+0.16+0.03+0.28
65Greg Dulcich◦ provisionalDENTE55+0.01+0.15+0.03+0.28
66Lawrence Cager◦ provisionalNYGTE20-0.26+0.15+0.02+0.28
67Tre' McKitty◦ provisionalLACTE18-0.31+0.15+0.02+0.28
68Irv Smith◦ provisionalMINTE36-0.12+0.15+0.02+0.27
69Tyler Conklin◦ provisionalNYJTE87+0.03+0.15+0.03+0.27
70Gerald Everett◦ provisionalLACTE88+0.03+0.15+0.03+0.26
71Tyler Higbee◦ provisionalLATE108+0.05+0.15+0.03+0.26
72Dalton Schultz◦ provisionalDALTE89-0.00+0.14+0.02+0.26
73T.J. Hockenson◦ provisionalMINTE131+0.04+0.14+0.03+0.25
74Isaiah Likely◦ provisionalBALTE60-0.09+0.14+0.01+0.26
75Logan Thomas◦ provisionalWASTE61-0.14+0.13+0.01+0.25
76Cameron Brate◦ provisionalTBTE38-0.31+0.13+0.00+0.25
77Brevin Jordan◦ provisionalHOUTE28-0.49+0.13-0.00+0.25

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