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

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
120
targets to trust the number
shrunkrawthe shrink90% CI
-0.20.00.20.40.6TE avg1Mark AndrewsBAL · 50+0.392George KittleSF · 138+0.363Travis KelceKC · 151+0.364Levine ToiloloDET · 24+0.335Anthony FirkserTEN · 20+0.336Ed DicksonSEA · 13+0.327O.J. HowardTB · 48+0.328Jesse JamesPIT · 40+0.329Greg OlsenCAR · 38+0.3110Jordan MatthewsPHI · 28+0.3111Rob GronkowskiNE · 72+0.3112Tyler HigbeeLA · 34+0.3013Vernon DavisWAS · 37+0.3014Darren FellsCLE · 12+0.3015Benjamin WatsonNO · 46+0.2916Blake JarwinDAL · 36+0.2917Maxx WilliamsBAL · 17+0.2918Vance McDonaldPIT · 72+0.2919Luke StockerTEN · 21+0.2920Austin HooperATL · 90+0.2821Jordan AkinsHOU · 25+0.2822Tyler EifertCIN · 19+0.2723Eric EbronIND · 110+0.2724Will DisslySEA · 14+0.2725Rhett EllisonNYG · 35+0.2726Evan EngramNYG · 65+0.2627Virgil GreenLAC · 27+0.2628Kyle RudolphMIN · 84+0.2629Jared CookLV · 101+0.2530Lance KendricksGB · 25+0.24

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

EPA per target leaderboard for the 2018 NFL season, shrunk by empirical Bayes with 90% credible intervals, ranked by the shrunk estimate.
#PlayerTeamPostargetsRawShrunk90% interval
1Mark Andrews◦ provisionalBALTE50+0.78+0.39+0.19+0.59
2George KittleSFTE138+0.47+0.36+0.20+0.52
3Travis KelceKCTE151+0.46+0.36+0.20+0.52
4Levine Toilolo◦ provisionalDETTE24+0.83+0.33+0.12+0.55
5Anthony Firkser◦ provisionalTENTE20+0.92+0.33+0.11+0.55
6Ed Dickson◦ provisionalSEATE13+1.11+0.32+0.10+0.54
7O.J. Howard◦ provisionalTBTE48+0.53+0.32+0.12+0.52
8Jesse James◦ provisionalPITTE40+0.56+0.32+0.11+0.52
9Greg Olsen◦ provisionalCARTE38+0.57+0.31+0.11+0.52
10Jordan Matthews◦ provisionalPHITE28+0.63+0.31+0.10+0.52
11Rob Gronkowski◦ provisionalNETE72+0.43+0.31+0.12+0.49
12Tyler Higbee◦ provisionalLATE34+0.55+0.30+0.10+0.51
13Vernon Davis◦ provisionalWASTE37+0.51+0.30+0.09+0.50
14Darren Fells◦ provisionalCLETE12+0.94+0.30+0.07+0.52
15Benjamin Watson◦ provisionalNOTE46+0.45+0.29+0.09+0.49
16Blake Jarwin◦ provisionalDALTE36+0.48+0.29+0.08+0.50
17Maxx Williams◦ provisionalBALTE17+0.69+0.29+0.07+0.51
18Vance McDonald◦ provisionalPITTE72+0.38+0.29+0.10+0.47
19Luke Stocker◦ provisionalTENTE21+0.61+0.29+0.07+0.51
20Austin Hooper◦ provisionalATLTE90+0.34+0.28+0.10+0.46
21Jordan Akins◦ provisionalHOUTE25+0.49+0.28+0.06+0.49
22Tyler Eifert◦ provisionalCINTE19+0.52+0.27+0.05+0.49
23Eric Ebron◦ provisionalINDTE110+0.31+0.27+0.10+0.44
24Will Dissly◦ provisionalSEATE14+0.59+0.27+0.05+0.49
25Rhett Ellison◦ provisionalNYGTE35+0.39+0.27+0.06+0.47
26Evan Engram◦ provisionalNYGTE65+0.32+0.26+0.07+0.45
27Virgil Green◦ provisionalLACTE27+0.38+0.26+0.05+0.47
28Kyle Rudolph◦ provisionalMINTE84+0.29+0.26+0.08+0.44
29Jared Cook◦ provisionalLVTE101+0.27+0.25+0.08+0.42
30Lance Kendricks◦ provisionalGBTE25+0.30+0.24+0.03+0.46
31C.J. Uzomah◦ provisionalCINTE64+0.26+0.24+0.05+0.43
32Dallas Goedert◦ provisionalPHITE44+0.27+0.24+0.04+0.44
33Chris Herndon◦ provisionalNYJTE56+0.25+0.24+0.04+0.43
34Nick Vannett◦ provisionalSEATE43+0.25+0.24+0.03+0.44
35Josh Hill◦ provisionalNOTE24+0.25+0.24+0.02+0.45
36Gerald Everett◦ provisionalLATE51+0.23+0.23+0.04+0.43
37Jermaine Gresham◦ provisionalARITE12+0.22+0.23+0.01+0.46
38Mo Alie-Cox◦ provisionalINDTE13+0.22+0.23+0.01+0.45
39Dalton Schultz◦ provisionalDALTE17+0.22+0.23+0.01+0.45
40Matt LaCosse◦ provisionalDENTE37+0.22+0.23+0.02+0.44
41Jonnu Smith◦ provisionalTENTE30+0.21+0.23+0.02+0.44
42Niles Paul◦ provisionalJAXTE13+0.15+0.22+0.00+0.45
43Hayden Hurst◦ provisionalBALTE23+0.17+0.22+0.01+0.44
44Geoff Swaim◦ provisionalDALTE32+0.18+0.22+0.01+0.43
45Logan Thomas◦ provisionalBUFTE17+0.12+0.22-0.00+0.44
46Jordan Leggett◦ provisionalNYJTE25+0.15+0.22+0.00+0.43
47Trey Burton◦ provisionalCHITE77+0.19+0.22+0.03+0.40
48Antonio Gates◦ provisionalLACTE48+0.12+0.20+0.00+0.40
49Jimmy Graham◦ provisionalGBTE89+0.16+0.20+0.02+0.38
50Demetrius Harris◦ provisionalKCTE25+0.03+0.20-0.01+0.41
51Derek Carrier◦ provisionalLVTE12-0.15+0.20-0.03+0.42
52Dan Arnold◦ provisionalNOTE19-0.03+0.20-0.02+0.42
53Cameron Brate◦ provisionalTBTE49+0.10+0.19-0.00+0.39
54Austin Seferian-Jenkins◦ provisionalJAXTE19-0.10+0.19-0.03+0.41
55Jack Doyle◦ provisionalINDTE33+0.02+0.19-0.02+0.40
56Ryan Griffin◦ provisionalHOUTE43+0.02+0.18-0.03+0.38
57Zach ErtzPHITE156+0.12+0.17+0.02+0.33
58Ian Thomas◦ provisionalCARTE49-0.02+0.16-0.04+0.36
59James O'Shaughnessy◦ provisionalJAXTE38-0.11+0.15-0.05+0.36
60Jake Butt◦ provisionalDENTE13-0.60+0.15-0.07+0.37
61David Njoku◦ provisionalCLETE88+0.04+0.15-0.03+0.33
62Eric Tomlinson◦ provisionalNYJTE14-0.56+0.15-0.07+0.37
63Nick Boyle◦ provisionalBALTE37-0.13+0.15-0.06+0.35
64Luke Willson◦ provisionalDETTE19-0.42+0.14-0.07+0.36
65Jeff Heuerman◦ provisionalDENTE48-0.10+0.14-0.06+0.34
66Scott Simonson◦ provisionalNYGTE14-0.71+0.14-0.09+0.36
67Mike Gesicki◦ provisionalMIATE32-0.24+0.13-0.08+0.34
68Jordan Reed◦ provisionalWASTE84-0.01+0.13-0.05+0.31
69Michael Roberts◦ provisionalDETTE20-0.49+0.13-0.09+0.35
70Charles Clay◦ provisionalBUFTE36-0.43+0.08-0.12+0.29
71Jason Croom◦ provisionalBUFTE35-0.53+0.06-0.14+0.27
72Ricky Seals-Jones◦ provisionalARITE69-0.38+0.01-0.18+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).