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

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
172
targets to trust the number
shrunkrawthe shrink90% CI
0.00.20.4TE avg1Rob GronkowskiNE · 106+0.372Hunter HenryLAC · 62+0.283Travis KelceKC · 122+0.274Trey BurtonPHI · 32+0.235Coby FleenerNO · 30+0.236Jared CookLV · 86+0.227Nick O'LearyBUF · 32+0.218O.J. HowardTB · 39+0.219David MorganMIN · 12+0.2010Cameron BrateTB · 77+0.2011Levine ToiloloATL · 14+0.2012Jordan MatthewsBUF · 36+0.2013Ed DicksonCAR · 49+0.2014Adam ShaheenCHI · 14+0.2015Rhett EllisonNYG · 32+0.2016Garrett CelekSF · 33+0.1917Zach ErtzPHI · 111+0.1918Tyler KroftCIN · 62+0.1919Darren FellsDET · 26+0.1920Nick VannettSEA · 15+0.1821Kyle RudolphMIN · 81+0.1822George KittleSF · 63+0.1823Richard RodgersGB · 19+0.1824James O'Shaughnes…JAX · 24+0.1825Marcedes LewisJAX · 49+0.1726Jason WittenDAL · 87+0.1727Austin TraylorDEN · 13+0.1728Jordan ReedWAS · 35+0.1729Jesse JamesPIT · 63+0.1730C.J. UzomahCIN · 15+0.1731Ryan GriffinHOU · 27+0.1732Brandon WilliamsIND · 17+0.16

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

EPA per target leaderboard for the 2017 NFL season, shrunk by empirical Bayes with 90% credible intervals, ranked by the shrunk estimate.
#PlayerTeamPostargetsRawShrunk90% interval
1Rob Gronkowski◦ provisionalNETE106+0.70+0.37+0.22+0.52
2Hunter Henry◦ provisionalLACTE62+0.63+0.28+0.12+0.45
3Travis Kelce◦ provisionalKCTE122+0.43+0.27+0.13+0.42
4Trey Burton◦ provisionalPHITE32+0.62+0.23+0.06+0.41
5Coby Fleener◦ provisionalNOTE30+0.61+0.23+0.05+0.40
6Jared Cook◦ provisionalLVTE86+0.33+0.22+0.06+0.37
7Nick O'Leary◦ provisionalBUFTE32+0.50+0.21+0.04+0.39
8O.J. Howard◦ provisionalTBTE39+0.44+0.21+0.04+0.38
9David Morgan◦ provisionalMINTE12+0.79+0.20+0.02+0.39
10Cameron Brate◦ provisionalTBTE77+0.29+0.20+0.04+0.36
11Levine Toilolo◦ provisionalATLTE14+0.69+0.20+0.02+0.38
12Jordan Matthews◦ provisionalBUFTE36+0.38+0.20+0.03+0.37
13Ed Dickson◦ provisionalCARTE49+0.33+0.20+0.03+0.37
14Adam Shaheen◦ provisionalCHITE14+0.66+0.20+0.02+0.38
15Rhett Ellison◦ provisionalNYGTE32+0.39+0.20+0.02+0.37
16Garrett Celek◦ provisionalSFTE33+0.36+0.19+0.02+0.37
17Zach Ertz◦ provisionalPHITE111+0.24+0.19+0.04+0.34
18Tyler Kroft◦ provisionalCINTE62+0.28+0.19+0.03+0.35
19Darren Fells◦ provisionalDETTE26+0.39+0.19+0.01+0.37
20Nick Vannett◦ provisionalSEATE15+0.39+0.18-0.00+0.36
21Kyle Rudolph◦ provisionalMINTE81+0.21+0.18+0.02+0.33
22George Kittle◦ provisionalSFTE63+0.22+0.18+0.02+0.34
23Richard Rodgers◦ provisionalGBTE19+0.32+0.18-0.00+0.36
24James O'Shaughnessy◦ provisionalJAXTE24+0.29+0.18-0.00+0.35
25Marcedes Lewis◦ provisionalJAXTE49+0.22+0.17+0.01+0.34
26Jason Witten◦ provisionalDALTE87+0.20+0.17+0.02+0.33
27Austin Traylor◦ provisionalDENTE13+0.33+0.17-0.01+0.36
28Jordan Reed◦ provisionalWASTE35+0.23+0.17+0.00+0.35
29Jesse James◦ provisionalPITTE63+0.19+0.17+0.01+0.33
30C.J. Uzomah◦ provisionalCINTE15+0.24+0.17-0.01+0.35
31Ryan Griffin◦ provisionalHOUTE27+0.20+0.17-0.01+0.34
32Brandon Williams◦ provisionalINDTE17+0.20+0.16-0.02+0.35
33Daniel Brown◦ provisionalCHITE20+0.19+0.16-0.02+0.34
34Virgil Green◦ provisionalDENTE22+0.15+0.16-0.02+0.34
35Vernon Davis◦ provisionalWASTE69+0.15+0.16-0.00+0.32
36Demetrius Harris◦ provisionalKCTE36+0.15+0.16-0.01+0.33
37Vance McDonald◦ provisionalPITTE24+0.14+0.16-0.02+0.34
38Brent Celek◦ provisionalPHITE24+0.12+0.16-0.02+0.33
39Ricky Seals-Jones◦ provisionalARITE28+0.13+0.16-0.02+0.33
40Benjamin Watson◦ provisionalBALTE80+0.14+0.15-0.00+0.31
41Nick Boyle◦ provisionalBALTE38+0.12+0.15-0.02+0.33
42Troy Niklas◦ provisionalARITE23+0.08+0.15-0.03+0.33
43Niles Paul◦ provisionalWASTE19+0.06+0.15-0.03+0.33
44Charles Clay◦ provisionalBUFTE74+0.12+0.15-0.01+0.31
45Clive Walford◦ provisionalLVTE13-0.10+0.14-0.04+0.33
46Eric Ebron◦ provisionalDETTE86+0.09+0.14-0.02+0.29
47Dwayne Allen◦ provisionalNETE22-0.05+0.14-0.04+0.32
48Antonio Gates◦ provisionalLACTE53+0.06+0.14-0.03+0.30
49Tyler Higbee◦ provisionalLATE45+0.03+0.13-0.04+0.30
50Austin Hooper◦ provisionalATLTE65+0.06+0.13-0.03+0.29
51Jermaine Gresham◦ provisionalARITE46+0.02+0.13-0.04+0.30
52David Njoku◦ provisionalCLETE60+0.05+0.13-0.03+0.30
53Maxx Williams◦ provisionalBALTE18-0.16+0.13-0.05+0.31
54Martellus Bennett◦ provisionalNETE44+0.00+0.13-0.04+0.30
55Gerald Everett◦ provisionalLATE32-0.05+0.13-0.05+0.30
56Jeff Heuerman◦ provisionalDENTE18-0.21+0.13-0.05+0.31
57Luke Willson◦ provisionalSEATE22-0.20+0.12-0.06+0.30
58C.J. Fiedorowicz◦ provisionalHOUTE22-0.22+0.12-0.06+0.30
59Dion Sims◦ provisionalCHITE29-0.15+0.12-0.06+0.29
60Jonnu Smith◦ provisionalTENTE30-0.16+0.11-0.06+0.29
61Zach Miller◦ provisionalCHITE35-0.13+0.11-0.06+0.28
62Evan Engram◦ provisionalNYGTE115+0.04+0.11-0.04+0.26
63Anthony Fasano◦ provisionalMIATE16-0.47+0.11-0.07+0.29
64Jack Doyle◦ provisionalINDTE109+0.02+0.11-0.04+0.26
65Ross Travis◦ provisionalINDTE17-0.45+0.11-0.07+0.29
66Jimmy Graham◦ provisionalSEATE98+0.01+0.11-0.05+0.26
67Seth DeValve◦ provisionalCLETE58-0.06+0.10-0.06+0.27
68Delanie Walker◦ provisionalTENTE111+0.01+0.10-0.04+0.25
69Julius Thomas◦ provisionalMIATE62-0.07+0.10-0.06+0.26
70Darrell Daniels◦ provisionalINDTE13-0.75+0.10-0.09+0.28
71A.J. Derby◦ provisionalMIATE40-0.18+0.10-0.07+0.27
72Greg Olsen◦ provisionalCARTE38-0.21+0.09-0.08+0.27
73Austin Seferian-Jenkins◦ provisionalNYJTE74-0.10+0.08-0.08+0.24
74Stephen Anderson◦ provisionalHOUTE52-0.19+0.08-0.09+0.25
75Josh Hill◦ provisionalNOTE22-0.63+0.07-0.11+0.25
76Lance Kendricks◦ provisionalGBTE35-0.48+0.05-0.12+0.23

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