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

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
159
targets to trust the number
shrunkrawthe shrink90% CI
0.00.20.4TE avg1George KittleSF · 90+0.362Isaiah LikelyBAL · 40+0.323Mark AndrewsBAL · 61+0.294Travis KelceKC · 121+0.285Brevin JordanHOU · 21+0.276Durham SmytheMIA · 43+0.267Cole KmetCHI · 90+0.258Sam LaPortaDET · 122+0.259Donald ParhamLAC · 41+0.2510Tucker KraftGB · 40+0.2411Jake FergusonDAL · 102+0.2412Michael MayerLV · 41+0.2413Elijah HigginsARI · 19+0.2314Will MalloryIND · 26+0.2315MyCole PruittATL · 12+0.2316Hunter HenryNE · 61+0.2217Luke FarrellJAX · 15+0.2218Dalton SchultzHOU · 89+0.2219Andrew OgletreeIND · 21+0.2220T.J. HockensonMIN · 127+0.2221Will DisslySEA · 22+0.2222Tyler HigbeeLA · 70+0.2223Austin HooperLV · 32+0.2224Foster MoreauNO · 25+0.2125Mo Alie-CoxIND · 23+0.2126Noah FantSEA · 43+0.2127Daniel BellingerNYG · 28+0.2128Luke MusgraveGB · 46+0.2129Pharaoh BrownNE · 15+0.2130Brock WrightDET · 14+0.2131Josh WhyleTEN · 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 · 2023 · full board

EPA per target leaderboard for the 2023 NFL season, shrunk by empirical Bayes with 90% credible intervals, ranked by the shrunk estimate.
#PlayerTeamPostargetsRawShrunk90% interval
1George Kittle◦ provisionalSFTE90+0.66+0.36+0.21+0.52
2Isaiah Likely◦ provisionalBALTE40+0.80+0.32+0.15+0.49
3Mark Andrews◦ provisionalBALTE61+0.54+0.29+0.13+0.45
4Travis Kelce◦ provisionalKCTE121+0.40+0.28+0.14+0.43
5Brevin Jordan◦ provisionalHOUTE21+0.83+0.27+0.09+0.45
6Durham Smythe◦ provisionalMIATE43+0.51+0.26+0.09+0.43
7Cole Kmet◦ provisionalCHITE90+0.36+0.25+0.10+0.41
8Sam LaPorta◦ provisionalDETTE122+0.33+0.25+0.11+0.40
9Donald Parham◦ provisionalLACTE41+0.45+0.25+0.08+0.42
10Tucker Kraft◦ provisionalGBTE40+0.44+0.24+0.07+0.42
11Jake Ferguson◦ provisionalDALTE102+0.32+0.24+0.09+0.39
12Michael Mayer◦ provisionalLVTE41+0.43+0.24+0.07+0.41
13Elijah Higgins◦ provisionalARITE19+0.54+0.23+0.05+0.41
14Will Mallory◦ provisionalINDTE26+0.45+0.23+0.05+0.41
15MyCole Pruitt◦ provisionalATLTE12+0.69+0.23+0.04+0.41
16Hunter Henry◦ provisionalNETE61+0.30+0.22+0.06+0.39
17Luke Farrell◦ provisionalJAXTE15+0.53+0.22+0.04+0.41
18Dalton Schultz◦ provisionalHOUTE89+0.27+0.22+0.07+0.38
19Andrew Ogletree◦ provisionalINDTE21+0.43+0.22+0.04+0.40
20T.J. Hockenson◦ provisionalMINTE127+0.25+0.22+0.08+0.36
21Will Dissly◦ provisionalSEATE22+0.40+0.22+0.04+0.40
22Tyler Higbee◦ provisionalLATE70+0.27+0.22+0.06+0.38
23Austin Hooper◦ provisionalLVTE32+0.33+0.22+0.04+0.39
24Foster Moreau◦ provisionalNOTE25+0.34+0.21+0.04+0.39
25Mo Alie-Cox◦ provisionalINDTE23+0.33+0.21+0.03+0.39
26Noah Fant◦ provisionalSEATE43+0.27+0.21+0.04+0.38
27Daniel Bellinger◦ provisionalNYGTE28+0.30+0.21+0.03+0.39
28Luke Musgrave◦ provisionalGBTE46+0.26+0.21+0.04+0.38
29Pharaoh Brown◦ provisionalNETE15+0.36+0.21+0.03+0.39
30Brock Wright◦ provisionalDETTE14+0.36+0.21+0.02+0.39
31Tanner Hudson◦ provisionalCINTE50+0.25+0.21+0.04+0.37
32Taysom Hill◦ provisionalNOTE40+0.25+0.21+0.04+0.38
33Colby Parkinson◦ provisionalSEATE34+0.25+0.20+0.03+0.38
34Kylen Granson◦ provisionalINDTE50+0.23+0.20+0.04+0.37
35Josh Whyle◦ provisionalTENTE15+0.25+0.20+0.02+0.38
36Darren Waller◦ provisionalNYGTE74+0.21+0.20+0.04+0.36
37Robert Tonyan◦ provisionalCHITE17+0.22+0.20+0.02+0.38
38Jeremy Ruckert◦ provisionalNYJTE22+0.20+0.20+0.02+0.37
39Pat Freiermuth◦ provisionalPITTE48+0.20+0.20+0.03+0.36
40Dallas Goedert◦ provisionalPHITE83+0.19+0.19+0.04+0.35
41Kyle Pitts◦ provisionalATLTE90+0.19+0.19+0.04+0.35
42Cade Otton◦ provisionalTBTE68+0.19+0.19+0.03+0.35
43Stone Smartt◦ provisionalLACTE21+0.16+0.19+0.01+0.37
44Lucas Krull◦ provisionalDENTE14+0.14+0.19+0.01+0.37
45Josh Oliver◦ provisionalMINTE28+0.15+0.19+0.01+0.36
46Johnny Mundt◦ provisionalMINTE23+0.12+0.19+0.01+0.36
47Mitchell Wilcox◦ provisionalCINTE12+0.02+0.18-0.00+0.37
48Noah Gray◦ provisionalKCTE41+0.13+0.18+0.01+0.35
49Cole Turner◦ provisionalWASTE15-0.00+0.18-0.01+0.36
50Jonnu Smith◦ provisionalATLTE70+0.13+0.17+0.01+0.33
51Dalton Kincaid◦ provisionalBUFTE91+0.14+0.17+0.02+0.33
52Tommy Tremble◦ provisionalCARTE32+0.07+0.17-0.00+0.35
53Drew Sample◦ provisionalCINTE27+0.02+0.17-0.01+0.35
54Gerald Everett◦ provisionalLACTE70+0.11+0.17+0.01+0.33
55Jordan Akins◦ provisionalCLETE23-0.05+0.16-0.01+0.34
56Chig Okonkwo◦ provisionalTENTE77+0.10+0.16+0.01+0.32
57C.J. Uzomah◦ provisionalNYJTE12-0.28+0.16-0.02+0.35
58Stephen Sullivan◦ provisionalCARTE24-0.07+0.16-0.02+0.34
59Adam Trautman◦ provisionalDENTE35-0.03+0.15-0.02+0.33
60Trey McBride◦ provisionalARITE106+0.09+0.15+0.01+0.30
61Luke Schoonmaker◦ provisionalDALTE15-0.30+0.15-0.03+0.34
62Tyler Conklin◦ provisionalNYJTE87+0.07+0.15-0.00+0.31
63Harrison Bryant◦ provisionalCLETE20-0.21+0.15-0.03+0.33
64Hayden Hurst◦ provisionalCARTE32-0.12+0.14-0.03+0.32
65Connor Heyward◦ provisionalPITTE34-0.12+0.14-0.03+0.31
66Evan Engram◦ provisionalJAXTE144+0.07+0.14-0.00+0.27
67Mike Gesicki◦ provisionalNETE46-0.07+0.14-0.03+0.30
68John Bates◦ provisionalWASTE28-0.20+0.14-0.04+0.31
69Juwan Johnson◦ provisionalNOTE59-0.08+0.12-0.04+0.28
70Logan Thomas◦ provisionalWASTE79-0.06+0.11-0.05+0.27
71Dawson Knox◦ provisionalBUFTE37-0.31+0.10-0.07+0.27
72Zach Ertz◦ provisionalARITE43-0.33+0.08-0.09+0.25
73Irv Smith◦ provisionalCINTE26-0.60+0.08-0.09+0.26
74David Njoku◦ provisionalCLETE123-0.09+0.07-0.07+0.21

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