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

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
164
targets to trust the number
shrunkrawthe shrink90% CI
0.00.20.4TE avg1George KittleSF · 94+0.422Mark AndrewsBAL · 69+0.393Jonnu SmithMIA · 111+0.374Tucker KraftGB · 71+0.335Pat FreiermuthPIT · 78+0.326Isaiah LikelyBAL · 58+0.317Mike GesickiCIN · 83+0.308Josh OliverMIN · 28+0.309Noah GrayKC · 49+0.3010Cole KmetCHI · 59+0.3011Foster MoreauNO · 43+0.3012Grant CalcaterraPHI · 30+0.3013Sam LaPortaDET · 83+0.3014Payne DurhamTB · 14+0.2915Trey McBrideARI · 147+0.2916Nate AdkinsDEN · 15+0.2817Zach ErtzWAS · 93+0.2818Dallas GoedertPHI · 52+0.2819Brenton StrangeJAX · 53+0.2820Elijah HigginsARI · 24+0.2721Stone SmarttLAC · 19+0.2722Darnell WashingtonPIT · 25+0.2623Tyler HigbeeLA · 12+0.2624Dawson KnoxBUF · 33+0.2625AJ BarnerSEA · 38+0.2626Mo Alie-CoxIND · 23+0.2627Daniel BellingerNYG · 17+0.2628Ja'Tavion SandersCAR · 43+0.2629Adam TrautmanDEN · 22+0.2530Luke SchoonmakerDAL · 36+0.25

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

EPA per target leaderboard for the 2024 NFL season, shrunk by empirical Bayes with 90% credible intervals, ranked by the shrunk estimate.
#PlayerTeamPostargetsRawShrunk90% interval
1George Kittle◦ provisionalSFTE94+0.72+0.42+0.27+0.57
2Mark Andrews◦ provisionalBALTE69+0.73+0.39+0.24+0.55
3Jonnu Smith◦ provisionalMIATE111+0.54+0.37+0.22+0.51
4Tucker Kraft◦ provisionalGBTE71+0.52+0.33+0.18+0.49
5Pat Freiermuth◦ provisionalPITTE78+0.46+0.32+0.17+0.47
6Isaiah Likely◦ provisionalBALTE58+0.48+0.31+0.15+0.47
7Mike Gesicki◦ provisionalCINTE83+0.41+0.30+0.15+0.46
8Josh Oliver◦ provisionalMINTE28+0.61+0.30+0.13+0.48
9Noah Gray◦ provisionalKCTE49+0.47+0.30+0.14+0.47
10Cole Kmet◦ provisionalCHITE59+0.44+0.30+0.14+0.46
11Foster Moreau◦ provisionalNOTE43+0.46+0.30+0.13+0.46
12Grant Calcaterra◦ provisionalPHITE30+0.53+0.30+0.12+0.47
13Sam LaPorta◦ provisionalDETTE83+0.38+0.30+0.14+0.45
14Payne Durham◦ provisionalTBTE14+0.74+0.29+0.11+0.47
15Trey McBride◦ provisionalARITE147+0.33+0.29+0.15+0.43
16Nate Adkins◦ provisionalDENTE15+0.61+0.28+0.10+0.46
17Zach Ertz◦ provisionalWASTE93+0.33+0.28+0.13+0.43
18Dallas Goedert◦ provisionalPHITE52+0.37+0.28+0.12+0.45
19Brenton Strange◦ provisionalJAXTE53+0.36+0.28+0.12+0.44
20Elijah Higgins◦ provisionalARITE24+0.40+0.27+0.10+0.45
21Stone Smartt◦ provisionalLACTE19+0.39+0.27+0.09+0.44
22Darnell Washington◦ provisionalPITTE25+0.34+0.26+0.09+0.44
23Tyler Higbee◦ provisionalLATE12+0.41+0.26+0.08+0.44
24Dawson Knox◦ provisionalBUFTE33+0.31+0.26+0.09+0.43
25AJ Barner◦ provisionalSEATE38+0.29+0.26+0.09+0.43
26Mo Alie-Cox◦ provisionalINDTE23+0.30+0.26+0.08+0.43
27Daniel Bellinger◦ provisionalNYGTE17+0.31+0.26+0.08+0.44
28Ja'Tavion Sanders◦ provisionalCARTE43+0.27+0.26+0.09+0.42
29Adam Trautman◦ provisionalDENTE22+0.27+0.25+0.08+0.43
30Luke Schoonmaker◦ provisionalDALTE36+0.26+0.25+0.08+0.42
31Hunter Henry◦ provisionalNETE97+0.25+0.25+0.10+0.40
32Juwan Johnson◦ provisionalNOTE68+0.25+0.25+0.09+0.41
33Erick All◦ provisionalCINTE22+0.24+0.25+0.07+0.43
34Josh Whyle◦ provisionalTENTE38+0.24+0.25+0.08+0.42
35Will Dissly◦ provisionalLACTE64+0.24+0.25+0.09+0.41
36Tanner Hudson◦ provisionalCINTE24+0.22+0.25+0.07+0.42
37Drew Sample◦ provisionalCINTE22+0.22+0.25+0.07+0.42
38Cade Stover◦ provisionalHOUTE22+0.21+0.25+0.07+0.42
39Brock Wright◦ provisionalDETTE16+0.19+0.25+0.07+0.43
40Lucas Krull◦ provisionalDENTE23+0.20+0.25+0.07+0.42
41Eric Saubert◦ provisionalSFTE14+0.14+0.24+0.06+0.42
42Julian Hill◦ provisionalMIATE20+0.17+0.24+0.07+0.42
43Austin Hooper◦ provisionalNETE59+0.22+0.24+0.08+0.40
44Johnny Mundt◦ provisionalMINTE27+0.18+0.24+0.07+0.42
45Brevyn Spann-Ford◦ provisionalDALTE14+0.10+0.24+0.06+0.42
46Andrew Ogletree◦ provisionalINDTE14+0.09+0.24+0.06+0.42
47Tommy Tremble◦ provisionalCARTE32+0.16+0.24+0.07+0.41
48Jordan Akins◦ provisionalCLETE58+0.19+0.24+0.07+0.40
49Dalton Kincaid◦ provisionalBUFTE75+0.20+0.24+0.08+0.39
50Nick Vannett◦ provisionalTENTE20+0.09+0.24+0.06+0.41
51Harrison Bryant◦ provisionalLVTE12-0.02+0.23+0.05+0.41
52John Bates◦ provisionalWASTE13-0.05+0.23+0.05+0.41
53Gerald Everett◦ provisionalCHITE13-0.11+0.23+0.05+0.41
54T.J. Hockenson◦ provisionalMINTE62+0.15+0.23+0.07+0.39
55Theo Johnson◦ provisionalNYGTE43+0.11+0.22+0.06+0.39
56Tyler Conklin◦ provisionalNYJTE73+0.15+0.22+0.07+0.38
57Taysom Hill◦ provisionalNOTE31+0.04+0.22+0.05+0.39
58Brock Bowers◦ provisionalLVTE153+0.18+0.22+0.08+0.35
59Cade Otton◦ provisionalTBTE87+0.14+0.22+0.06+0.37
60Davis Allen◦ provisionalLATE13-0.31+0.21+0.03+0.39
61Michael Mayer◦ provisionalLVTE32-0.00+0.21+0.04+0.38
62Noah Fant◦ provisionalSEATE64+0.10+0.21+0.05+0.37
63Colby Parkinson◦ provisionalLATE49+0.07+0.21+0.05+0.37
64Durham Smythe◦ provisionalMIATE17-0.21+0.21+0.03+0.39
65Travis Kelce◦ provisionalKCTE134+0.15+0.21+0.07+0.35
66Jeremy Ruckert◦ provisionalNYJTE28-0.06+0.21+0.03+0.38
67Hayden Hurst◦ provisionalLACTE13-0.37+0.21+0.03+0.39
68Luke Farrell◦ provisionalJAXTE17-0.27+0.20+0.02+0.38
69Kyle Pitts◦ provisionalATLTE74+0.09+0.20+0.05+0.36
70Charlie Woerner◦ provisionalATLTE12-0.48+0.20+0.02+0.38
71Pharaoh Brown◦ provisionalSEATE12-0.54+0.20+0.02+0.38
72Greg Dulcich◦ provisionalNYGTE12-0.63+0.19+0.01+0.37
73Dalton Schultz◦ provisionalHOUTE85+0.04+0.18+0.03+0.33
74Evan Engram◦ provisionalJAXTE67-0.01+0.18+0.02+0.33
75Kylen Granson◦ provisionalINDTE31-0.27+0.17-0.00+0.34
76Chig Okonkwo◦ provisionalTENTE71-0.10+0.15-0.01+0.30
77David Njoku◦ provisionalCLETE99-0.05+0.14-0.01+0.29
78Jake Ferguson◦ provisionalDALTE86-0.15+0.11-0.04+0.27

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