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

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
121
targets to trust the number
shrunkrawthe shrink90% CI
0.00.20.40.6TE avg1Travis KelceKC · 118+0.412Rob GronkowskiNE · 38+0.393Hunter HenryLAC · 54+0.354Martellus BennettNE · 73+0.345Erik SwoopeIND · 22+0.346Cameron BrateTB · 81+0.337Levine ToiloloATL · 19+0.328Tyler EifertCIN · 47+0.319Dwayne AllenIND · 53+0.3010Jimmy GrahamSEA · 95+0.3011Austin HooperATL · 28+0.2912Eric EbronDET · 85+0.2913Gary BarnidgeCLE · 83+0.2814Jordan ReedWAS · 90+0.2715Vance McDonaldSF · 45+0.2616MarQueis GrayMIA · 17+0.2617Zach MillerCHI · 64+0.2618Neal SterlingJAX · 16+0.2519Anthony FasanoTEN · 14+0.2520Stephen AndersonHOU · 16+0.2521Jared CookGB · 51+0.2522Dion SimsMIA · 35+0.2523Darren FellsARI · 18+0.2524Nick O'LearyBUF · 15+0.2425Daniel BrownCHI · 20+0.2426Seth DeValveCLE · 12+0.2427Zach ErtzPHI · 106+0.2428Ben KoyackJAX · 24+0.2329Jeff HeuermanDEN · 17+0.2330Jason WittenDAL · 95+0.2331Austin Seferian-J…NYJ · 20+0.23

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

EPA per target leaderboard for the 2016 NFL season, shrunk by empirical Bayes with 90% credible intervals, ranked by the shrunk estimate.
#PlayerTeamPostargetsRawShrunk90% interval
1Travis Kelce◦ provisionalKCTE118+0.60+0.41+0.25+0.57
2Rob Gronkowski◦ provisionalNETE38+0.93+0.39+0.20+0.58
3Hunter Henry◦ provisionalLACTE54+0.64+0.35+0.17+0.54
4Martellus Bennett◦ provisionalNETE73+0.53+0.34+0.17+0.51
5Erik Swoope◦ provisionalINDTE22+0.96+0.34+0.14+0.54
6Cameron Brate◦ provisionalTBTE81+0.50+0.33+0.17+0.50
7Levine Toilolo◦ provisionalATLTE19+0.93+0.32+0.12+0.53
8Tyler Eifert◦ provisionalCINTE47+0.53+0.31+0.12+0.50
9Dwayne Allen◦ provisionalINDTE53+0.47+0.30+0.12+0.48
10Jimmy Graham◦ provisionalSEATE95+0.39+0.30+0.13+0.46
11Austin Hooper◦ provisionalATLTE28+0.58+0.29+0.09+0.49
12Eric Ebron◦ provisionalDETTE85+0.39+0.29+0.12+0.46
13Gary Barnidge◦ provisionalCLETE83+0.35+0.28+0.11+0.45
14Jordan Reed◦ provisionalWASTE90+0.33+0.27+0.10+0.44
15Vance McDonald◦ provisionalSFTE45+0.37+0.26+0.08+0.45
16MarQueis Gray◦ provisionalMIATE17+0.49+0.26+0.05+0.46
17Zach Miller◦ provisionalCHITE64+0.32+0.26+0.08+0.43
18Neal Sterling◦ provisionalJAXTE16+0.47+0.25+0.05+0.46
19Anthony Fasano◦ provisionalTENTE14+0.49+0.25+0.05+0.46
20Stephen Anderson◦ provisionalHOUTE16+0.46+0.25+0.05+0.46
21Jared Cook◦ provisionalGBTE51+0.30+0.25+0.06+0.43
22Dion Sims◦ provisionalMIATE35+0.33+0.25+0.05+0.44
23Darren Fells◦ provisionalARITE18+0.38+0.25+0.04+0.45
24Nick O'Leary◦ provisionalBUFTE15+0.41+0.24+0.04+0.45
25Daniel Brown◦ provisionalCHITE20+0.36+0.24+0.04+0.45
26Seth DeValve◦ provisionalCLETE12+0.41+0.24+0.03+0.45
27Zach Ertz◦ provisionalPHITE106+0.25+0.24+0.08+0.40
28Ben Koyack◦ provisionalJAXTE24+0.29+0.23+0.03+0.44
29Jeff Heuerman◦ provisionalDENTE17+0.31+0.23+0.03+0.44
30Jason Witten◦ provisionalDALTE95+0.24+0.23+0.07+0.39
31Jordan Matthews◦ provisionalPHITE119+0.24+0.23+0.07+0.39
32Austin Seferian-Jenkins◦ provisionalNYJTE20+0.25+0.23+0.03+0.43
33Ladarius Green◦ provisionalPITTE35+0.24+0.23+0.04+0.42
34Kyle RudolphMINTE133+0.23+0.23+0.08+0.38
35Mychal Rivera◦ provisionalLVTE25+0.24+0.23+0.03+0.43
36Delanie Walker◦ provisionalTENTE102+0.23+0.23+0.06+0.39
37Jerell Adams◦ provisionalNYGTE21+0.23+0.23+0.02+0.43
38Virgil Green◦ provisionalDENTE37+0.22+0.22+0.03+0.42
39Brandon Myers◦ provisionalTBTE15+0.20+0.22+0.02+0.43
40Jack Doyle◦ provisionalINDTE75+0.22+0.22+0.05+0.39
41A.J. Derby◦ provisionalDENTE20+0.19+0.22+0.02+0.42
42Luke Willson◦ provisionalSEATE21+0.19+0.22+0.02+0.42
43Charles Clay◦ provisionalBUFTE87+0.20+0.22+0.05+0.38
44Vernon Davis◦ provisionalWASTE59+0.19+0.21+0.04+0.39
45Clive Walford◦ provisionalLVTE52+0.19+0.21+0.03+0.40
46Brent Celek◦ provisionalPHITE19+0.13+0.21+0.01+0.42
47Tyler Kroft◦ provisionalCINTE12+0.05+0.21+0.00+0.42
48Josh Hill◦ provisionalNOTE22+0.12+0.21+0.01+0.41
49Jacob Tamme◦ provisionalATLTE31+0.12+0.20+0.01+0.40
50David Johnson◦ provisionalPITTE12-0.01+0.20-0.01+0.41
51Greg OlsenCARTE132+0.18+0.20+0.05+0.35
52John Phillips◦ provisionalNOTE15+0.01+0.20-0.01+0.41
53Jermaine Gresham◦ provisionalARITE61+0.15+0.20+0.02+0.38
54Garrett Celek◦ provisionalSFTE50+0.13+0.20+0.01+0.38
55Crockett Gillmore◦ provisionalBALTE14-0.03+0.20-0.01+0.41
56Richard Rodgers◦ provisionalGBTE47+0.11+0.19+0.01+0.38
57Xavier Grimble◦ provisionalPITTE21-0.01+0.19-0.01+0.39
58Coby Fleener◦ provisionalNOTE82+0.14+0.19+0.02+0.36
59C.J. Uzomah◦ provisionalCINTE38+0.07+0.19-0.00+0.38
60C.J. Fiedorowicz◦ provisionalHOUTE89+0.14+0.19+0.02+0.35
61Antonio Gates◦ provisionalLACTE94+0.13+0.18+0.02+0.35
62Marcedes Lewis◦ provisionalJAXTE30-0.01+0.18-0.02+0.37
63Rhett Ellison◦ provisionalMINTE14-0.25+0.18-0.03+0.38
64Ed Dickson◦ provisionalCARTE19-0.16+0.17-0.03+0.38
65Demetrius Harris◦ provisionalKCTE32-0.02+0.17-0.02+0.37
66Darren Waller◦ provisionalBALTE17-0.21+0.17-0.03+0.38
67Trey Burton◦ provisionalPHITE60+0.06+0.17-0.01+0.35
68Julius Thomas◦ provisionalJAXTE51+0.03+0.17-0.02+0.35
69Ryan Griffin◦ provisionalHOUTE74-0.00+0.14-0.03+0.31
70Jesse James◦ provisionalPITTE61-0.06+0.13-0.05+0.31
71Lance Kendricks◦ provisionalLATE87-0.11+0.08-0.08+0.25
72Larry Donnell◦ provisionalNYGTE22-0.71+0.08-0.12+0.28
73Will Tye◦ provisionalNYGTE70-0.17+0.08-0.10+0.25
74Tyler Higbee◦ provisionalLATE29-0.56+0.07-0.12+0.27
75Dennis PittaBALTE121-0.13+0.04-0.11+0.20

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