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

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
87
targets to trust the number
shrunkrawthe shrink90% CI
-0.20.00.20.40.6TE avg1Tucker KraftGB · 44+0.482Dalton KincaidBUF · 50+0.463George KittleSF · 69+0.454Sam LaPortaDET · 49+0.445Darren WallerMIA · 35+0.426Colston LovelandCHI · 83+0.427Daniel BellingerNYG · 26+0.408Trey McBrideARI · 170+0.379Brenton StrangeJAX · 60+0.3710Jackson HawesBUF · 19+0.3611Austin HooperNE · 26+0.3512Dallas GoedertPHI · 82+0.3513Hunter HenryNE · 87+0.3514Greg DulcichMIA · 34+0.3415AJ BarnerSEA · 68+0.3316Pat FreiermuthPIT · 54+0.3317Travis KelceKC · 109+0.3218Josh OliverMIN · 20+0.3119Juwan JohnsonNO · 102+0.3120Dalton SchultzHOU · 107+0.3121Adam TrautmanDEN · 23+0.3122John BatesWAS · 16+0.3023Hunter LongJAX · 17+0.3024Dawson KnoxBUF · 50+0.3025Darnell WashingtonPIT · 44+0.2926Ian ThomasLV · 13+0.2827Luke MusgraveGB · 31+0.2828Jake TongesSF · 46+0.2829Charlie KolarBAL · 15+0.2830Terrance FergusonLA · 25+0.27

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

EPA per target leaderboard for the 2025 NFL season, shrunk by empirical Bayes with 90% credible intervals, ranked by the shrunk estimate.
#PlayerTeamPostargetsRawShrunk90% interval
1Tucker Kraft◦ provisionalGBTE44+0.89+0.48+0.26+0.69
2Dalton Kincaid◦ provisionalBUFTE50+0.79+0.46+0.25+0.66
3George Kittle◦ provisionalSFTE69+0.67+0.45+0.25+0.64
4Sam LaPorta◦ provisionalDETTE49+0.74+0.44+0.23+0.65
5Darren Waller◦ provisionalMIATE35+0.81+0.42+0.20+0.64
6Colston Loveland◦ provisionalCHITE83+0.57+0.42+0.23+0.60
7Daniel Bellinger◦ provisionalNYGTE26+0.87+0.40+0.18+0.63
8Trey McBrideARITE170+0.43+0.37+0.22+0.52
9Brenton Strange◦ provisionalJAXTE60+0.52+0.37+0.17+0.57
10Jackson Hawes◦ provisionalBUFTE19+0.78+0.36+0.12+0.59
11Austin Hooper◦ provisionalNETE26+0.65+0.35+0.12+0.58
12Dallas Goedert◦ provisionalPHITE82+0.44+0.35+0.16+0.54
13Hunter HenryNETE87+0.43+0.35+0.16+0.53
14Greg Dulcich◦ provisionalMIATE34+0.52+0.34+0.11+0.56
15AJ Barner◦ provisionalSEATE68+0.41+0.33+0.13+0.52
16Pat Freiermuth◦ provisionalPITTE54+0.43+0.33+0.12+0.53
17Travis KelceKCTE109+0.37+0.32+0.15+0.50
18Josh Oliver◦ provisionalMINTE20+0.53+0.31+0.08+0.55
19Juwan JohnsonNOTE102+0.35+0.31+0.13+0.49
20Dalton SchultzHOUTE107+0.34+0.31+0.13+0.48
21Adam Trautman◦ provisionalDENTE23+0.47+0.31+0.08+0.54
22John Bates◦ provisionalWASTE16+0.49+0.30+0.06+0.54
23Hunter Long◦ provisionalJAXTE17+0.46+0.30+0.06+0.54
24Dawson Knox◦ provisionalBUFTE50+0.35+0.30+0.09+0.50
25Darnell Washington◦ provisionalPITTE44+0.33+0.29+0.08+0.50
26Ian Thomas◦ provisionalLVTE13+0.39+0.28+0.04+0.53
27Luke Musgrave◦ provisionalGBTE31+0.33+0.28+0.06+0.51
28Jake Tonges◦ provisionalSFTE46+0.31+0.28+0.07+0.49
29Charlie Kolar◦ provisionalBALTE15+0.34+0.28+0.04+0.52
30Terrance Ferguson◦ provisionalLATE25+0.30+0.27+0.04+0.50
31Cole Kmet◦ provisionalCHITE49+0.27+0.27+0.06+0.48
32Brock BowersLVTE87+0.27+0.27+0.08+0.45
33Tyler Higbee◦ provisionalLATE36+0.26+0.26+0.04+0.48
34Luke Farrell◦ provisionalSFTE14+0.25+0.26+0.02+0.51
35John FitzPatrick◦ provisionalGBTE15+0.25+0.26+0.02+0.50
36Ben Sinnott◦ provisionalWASTE13+0.25+0.26+0.02+0.51
37Johnny Mundt◦ provisionalJAXTE19+0.21+0.26+0.02+0.49
38Oronde Gadsden II◦ provisionalLACTE69+0.24+0.25+0.06+0.45
39Tommy Tremble◦ provisionalCARTE37+0.22+0.25+0.03+0.47
40Will Dissly◦ provisionalLACTE16+0.17+0.25+0.01+0.49
41Colby Parkinson◦ provisionalLATE56+0.22+0.25+0.05+0.45
42Cade Stover◦ provisionalHOUTE16+0.14+0.25+0.01+0.49
43T.J. Hockenson◦ provisionalMINTE66+0.21+0.24+0.05+0.44
44Luke Schoonmaker◦ provisionalDALTE23+0.16+0.24+0.01+0.47
45Grant Calcaterra◦ provisionalPHITE13+0.07+0.24-0.00+0.48
46Drew Sample◦ provisionalCINTE20+0.13+0.24+0.01+0.48
47Jeremy Ruckert◦ provisionalNYJTE29+0.16+0.24+0.01+0.46
48Davis Allen◦ provisionalLATE33+0.16+0.24+0.02+0.46
49Mitchell Evans◦ provisionalCARTE25+0.13+0.23+0.00+0.46
50Isaiah Likely◦ provisionalBALTE36+0.15+0.23+0.01+0.45
51Kyle PittsATLTE119+0.21+0.23+0.06+0.40
52Ja'Tavion Sanders◦ provisionalCARTE34+0.13+0.23+0.01+0.45
53Julian Hill◦ provisionalMIATE21+0.06+0.22-0.01+0.46
54Brevyn Spann-Ford◦ provisionalDALTE13-0.05+0.22-0.02+0.47
55Jake FergusonDALTE103+0.19+0.22+0.05+0.40
56Taysom Hill◦ provisionalNOTE16-0.03+0.22-0.02+0.46
57Zach Ertz◦ provisionalWASTE73+0.16+0.22+0.03+0.41
58Chig Okonkwo◦ provisionalTENTE79+0.16+0.22+0.03+0.40
59Mason Taylor◦ provisionalNYJTE66+0.15+0.21+0.02+0.41
60Tanner Hudson◦ provisionalCINTE24+0.02+0.21-0.02+0.44
61Mike Gesicki◦ provisionalCINTE43+0.10+0.21-0.00+0.42
62Mo Alie-Cox◦ provisionalINDTE20-0.04+0.21-0.03+0.44
63Theo Johnson◦ provisionalNYGTE74+0.12+0.20+0.01+0.39
64Elijah Higgins◦ provisionalARITE37+0.04+0.20-0.02+0.42
65Brock Wright◦ provisionalDETTE22-0.09+0.19-0.04+0.43
66Tyler WarrenINDTE114+0.14+0.19+0.02+0.36
67Gunnar Helm◦ provisionalTENTE55+0.07+0.19-0.01+0.39
68Jonnu Smith◦ provisionalPITTE55+0.01+0.17-0.04+0.37
69Tanner Conner◦ provisionalMIATE15-0.43+0.16-0.08+0.40
70Evan Engram◦ provisionalDENTE77+0.05+0.16-0.03+0.35
71Mark Andrews◦ provisionalBALTE70+0.02+0.16-0.04+0.35
72Cade Otton◦ provisionalTBTE82+0.04+0.15-0.03+0.34
73David Njoku◦ provisionalCLETE48-0.08+0.14-0.07+0.35
74Noah Gray◦ provisionalKCTE38-0.18+0.13-0.09+0.35
75Harold Fannin Jr.CLETE108+0.01+0.13-0.05+0.30
76Michael Mayer◦ provisionalLVTE50-0.20+0.10-0.11+0.30
77Noah Fant◦ provisionalCINTE41-0.29+0.09-0.13+0.30
78Elijah Arroyo◦ provisionalSEATE26-0.62+0.06-0.17+0.29

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