← Research

Opponent tiers: production against the best and worst defenders (and defence against the best offence)

Producer: opponent_tiers.py (2026-09-04). 5v5, 2011-12 → 2025-26. Every constant-lineup segment credits each skater with seconds, xGF and xGA keyed by the mean PRIOR-season rating of the five opponents (EV defence for def, EV offence for off; dpair = the opposing defencemen's EV defence only). Tiers are season TOI-weighted quartiles: Q1 weakest opposition, Q4 strongest.

1. League gradient

keytieropp quality (NG/82)TOI sharexGF/60xGA/60
defQ1-1.0426%2.5832.458
defQ2-0.2425%2.4282.360
defQ3+0.2725%2.3132.338
defQ4+0.9724%2.1582.339
dpairQ1-1.3326%2.5312.394
dpairQ2-0.3126%2.4212.376
dpairQ3+0.3624%2.3372.362
dpairQ4+1.2824%2.1982.368
offQ1-0.9526%2.3222.039
offQ2-0.1725%2.3762.253
offQ3+0.4524%2.3912.465
offQ4+1.4324%2.4162.772

2. Is beating good defenders a skill? Year-over-year persistence

Player-seasons need ≥60 min in BOTH Q1 and Q4. slope_xgf = own xGF/60 vs Q4 − vs Q1 (offence against tough defence); slope_xga = own xGA/60 vs Q4 − vs Q1 (defence against tough offence). The _all rows are the ordinary season rates for comparison.

keyposstatn pairsr (yoy)SD
defFslope_xgf4410+0.0060.454
defFslope_xga4410+0.0530.457
defFslope_net4410+0.0470.662
defFxgf60_all4410+0.6630.376
defFxga60_all4410+0.5290.301
defFnet60_all4410+0.5330.435
defDslope_xgf2513+0.0270.410
defDslope_xga2513+0.0480.412
defDslope_net2513+0.0380.596
defDxgf60_all2513+0.5660.302
defDxga60_all2513+0.5460.285
defDnet60_all2513+0.4680.384
defallslope_xgf6923+0.0140.437
defallslope_xga6923+0.0510.439
defallslope_net6923+0.0440.636
defallxgf60_all6923+0.6340.349
defallxga60_all6923+0.5360.294
defallnet60_all6923+0.5110.415
offFslope_xgf4601+0.0440.459
offFslope_xga4601+0.0440.467
offFslope_net4601+0.0490.672
offFxgf60_all4601+0.6570.375
offFxga60_all4601+0.5260.303
offFnet60_all4601+0.5290.436
offDslope_xgf2533+0.0830.428
offDslope_xga2533+0.0650.439
offDslope_net2533+0.0860.624
offDxgf60_all2533+0.5590.301
offDxga60_all2533+0.5450.286
offDnet60_all2533+0.4610.384
offallslope_xgf7134+0.0620.448
offallslope_xga7134+0.0520.456
offallslope_net7134+0.0630.653
offallxgf60_all7134+0.6290.348
offallxga60_all7134+0.5330.296
offallnet60_all7134+0.5070.416
dpairFslope_xgf4620+0.0030.460
dpairFslope_xga4620+0.0070.455
dpairFslope_net4620+0.0200.672
dpairFxgf60_all4620+0.6650.379
dpairFxga60_all4620+0.5290.303
dpairFnet60_all4620+0.5350.437
dpairDslope_xgf2594+0.0250.413
dpairDslope_xga2594-0.0000.404
dpairDslope_net2594+0.0290.601
dpairDxgf60_all2594+0.5670.303
dpairDxga60_all2594+0.5460.286
dpairDnet60_all2594+0.4690.385
dpairallslope_xgf7214+0.0110.441
dpairallslope_xga7214+0.0050.436
dpairallslope_net7214+0.0230.644
dpairallxgf60_all7214+0.6370.351
dpairallxga60_all7214+0.5360.296
dpairallnet60_all7214+0.5130.417

Career split-half (odd vs even seasons, ≥3 qualifying seasons on each side)

keyposstatplayersr
defFslope_xgf417+0.089
defFslope_net417+0.111
defFxgf60_all417+0.883
offDslope_xga230+0.245
offDslope_net230+0.262
offDxga60_all230+0.719
dpairFslope_xgf434+0.015

3. Leaderboards (shrunk toward league mean by the single-season persistence; ≥300 min in the thinner tier)

With r(yoy) ≈ 0.01–0.07 the shrinkage constant is enormous and every shrunk value collapses onto the league mean: the raw slope column is what a season-by-season fan would quote, and the shrunk column is what the evidence supports. The leaderboards are kept to make that point.

Forwards: xGF/60 vs Q4 defenders minus vs Q1 (top = holds up best; bottom = feasts on weak)

Playerseasonstier minslopeshrunk
Leon Draisaitl122,962-0.049-0.312
Adam Lowry122,256+0.020-0.315
Matty Beniers41,095+0.196-0.335
Kyle Okposo132,661-0.131-0.338
Charlie Coyle142,847-0.159-0.342
Blake Wheeler122,901-0.168-0.343
Brandon Tanev101,474-0.023-0.347
Jordan Eberle143,110-0.198-0.348
David Perron152,942-0.204-0.352
Eric Staal112,375-0.170-0.352
Anthony Mantha91,754-0.113-0.353
Nicolas Deslauriers91,143+0.011-0.354
Jean-Gabriel Pageau122,328-0.175-0.354
Frans Nielsen91,755-0.131-0.356
Sidney Crosby143,309-0.243-0.358
Mikko Rantanen102,426-0.203-0.358
Nick Cousins101,752-0.143-0.358
Nikolay Kulemin61,185-0.041-0.359
Cal Clutterbuck131,979-0.171-0.359
Tomas Plekanec71,544-0.120-0.359
Alex Galchenyuk91,582-0.136-0.361
Corey Perry142,705-0.229-0.361
Gustav Nyquist122,517-0.221-0.361
Anders Lee132,698-0.232-0.362
Craig Smith142,652-0.230-0.362
Robert Thomas71,522-0.948-0.483
James van Riemsdyk152,872-0.668-0.468
Zack Kassian111,650-0.799-0.465
Jamie Benn153,489-0.600-0.459
Brayden Schenn153,282-0.607-0.458
Trevor Zegras4983-0.948-0.457
Alex Killorn142,732-0.634-0.457
Lucas Raymond51,214-0.854-0.457
Sebastian Aho102,057-0.684-0.456
Trevor Moore71,203-0.843-0.456
Ivan Barbashev91,880-0.704-0.455
Pavel Buchnevich101,946-0.694-0.455
Garnet Hathaway91,253-0.792-0.451
Aleksander Barkov122,420-0.626-0.451
Jason Pominville81,800-0.686-0.451
Cam Atkinson112,129-0.648-0.450
Andrei Svechnikov81,506-0.718-0.448
Calle Jarnkrok112,074-0.638-0.447
Travis Konecny102,111-0.633-0.447
Tyler Bozak101,880-0.651-0.446
Ryan Kesler71,631-0.678-0.446
Timo Meier102,081-0.625-0.445
Nick Bjugstad122,171-0.616-0.445
Brad Boyes5858-0.864-0.443
Mika Zibanejad142,850-0.569-0.443

Defencemen: xGA/60 vs Q4 offence minus vs Q1 (top = most negative = best vs elite)

Playerseasonstier minslopeshrunk
Ryan Ellis91,871+0.234+0.550
TJ Brodie143,620+0.404+0.559
Mark Giordano133,101+0.379+0.560
Torey Krug112,571+0.417+0.594
Aaron Ekblad122,826+0.447+0.601
Jon Merrill122,031+0.390+0.602
Justin Schultz122,601+0.439+0.603
Brady Skjei102,956+0.466+0.607
Shea Theodore102,260+0.430+0.610
Jonathan Ericsson81,684+0.374+0.611
Marc Methot71,615+0.366+0.612
Hampus Lindholm123,183+0.519+0.628
Brent Seabrook92,393+0.486+0.630
Erik Karlsson154,613+0.556+0.630
Alexei Emelin71,594+0.419+0.631
Brent Burns154,252+0.563+0.638
Haydn Fleury8882+0.278+0.638
Colin Miller101,634+0.449+0.640
Dmitry Orlov133,758+0.561+0.643
Jay Bouwmeester92,493+0.525+0.645
Justin Holl61,231+0.410+0.647
Nick Jensen102,532+0.532+0.647
Calvin de Haan122,357+0.524+0.647
Brandon Davidson3444+0.014+0.650
Johnny Oduya71,745+0.492+0.651
Nikita Zadorov122,816+1.096+0.911
Braden Schneider51,255+1.261+0.892
Jani Hakanpää4887+1.339+0.876
Vladislav Gavrikov72,112+1.051+0.868
Jackson LaCombe3887+1.298+0.866
Drew Helleson2388+1.799+0.860
Marcus Pettersson82,248+1.019+0.859
Pavel Mintyukov3654+1.404+0.858
Jan Rutta81,426+1.096+0.854
Patrick Wiercioch5762+1.287+0.850
Matt Bartkowski4768+1.281+0.850
Nicolas Hague61,305+1.102+0.849
Mark Stuart61,055+1.156+0.848
Neal Pionk92,308+0.987+0.847
Nikita Zaitsev81,696+1.035+0.846
Tyson Barrie122,789+0.958+0.844
Adam Boqvist5617+1.321+0.839
Alexandre Carrier61,329+1.059+0.837
Gustav Lindstrom3407+1.560+0.837
Noah Hanifin113,011+0.934+0.837
Erik Brannstrom6842+1.185+0.837
Henri Jokiharju81,734+1.004+0.836
Rasmus Dahlin82,476+0.954+0.836
Jakob Chychrun102,446+0.950+0.834
Bowen Byram61,375+1.040+0.834

Caveats