Post hoc, ergo propter hoc.
"After it therefore because of it. It means one thing follows the other, therefore it was caused by the other. But it's not always true. In fact, it's hardly ever true." - President Josiah Bartlet
The name
We arrived at this title for three reasons.
The fallacy. Post hoc ergo propter hoc is the error of mistaking sequence for cause. A player's shooting percentage climbs and we call him a finisher. A team wins and we credit the system. Hockey is a silly, low-scoring, high-variance sport played on a slippery surface on knife boots. This all makes it unusually good at producing convincing stories about noise. Breaking the barrier between correlation and causation requires a collaboration between statisticians, reporters, schematic experts, video analysts, etc. We hope to facilitate that conversation.
The newspaper. In order to facilitate that conversation, we need a megaphone. Over the past 20 years, the NHL media has slowly but surely embraced analytics. But the more esoteric the stats, the less likely they are to be discussed. A stat nobody can read is a stat nobody can use, and a stat nobody uses does not improve anyone's understanding of the game. So this is built like a paper: a front page, a beat, standing furniture, and a methods section in the back for anyone who wants to check our work. We hold ourselves accountable, respect the sources of our data, and embrace the duty to inform.
The posts. Hockey has goal posts. Okay this one's admittedly more half-baked, but it's true nonetheless and things are always better in threes.
The premise
Most hockey stats measure what already happened. And we need that. But most public analysis assumes that if a player has a high WAR, that means they caused the impact rather than experienced the impact, and the latter is often a better description. So what we want to do is drown you in context.
The metrics we built ourselves, because we could not find them elsewhere: shift-level success measured against an opportunity-adjusted league baseline, a classifier that infers whether a shift was meant to attack or defend, a Net Rating that respects position and pace, and an expected-goals model fit separately for each era of shot data: pre-2010, pre-tracking, and the puck-tracking years, rather than one model asked to span them all.
The pledge
This site has two authors: a person, and a model that writes most of the code and a fair amount of the prose. What follows binds both of us. Where the site falls short of it, that is a bug, and we would like to hear about it.
Tap any line for the fuller reasoning behind it.
Sequence isn't cause. That's the whole point of the name — a stat has to actually explain why teams win, not just happen before they do.
A player's shooting percentage climbs and we call him a finisher; a team wins and we credit the system — that is the exact mistake we are named after. A number earns its place here by explaining or predicting outcomes, never by simply preceding them.
We say how sure we are. A count is a fact. A model is a guess, and we tell you how good a guess it is — never dressed up as more certain than it looks.
A goal, a hit, a minute of ice time happened, and we print it as a number. A model's estimate did not happen; it was inferred, and it has to predict real outcomes, not just correlate with them, and its totals have to match reality, not only its rankings. A good prior plus a small sample is still a small sample — an input to judgment, not a substitute for it. (One exception we admit rather than hide: expected goals is printed as a single number, not a range, because the whole field runs on it as an input and a range in every column would make the tables unreadable. Its uncertainty lives in the methods instead.)
Everything traces back to real plays. Every number breaks down to the actual shifts and shots behind it, and we say where it came from.
Any metric we publish can be filtered down to the shifts and events that produced it. A black box is tolerated only when it has demonstrably earned its opacity, and even then the inputs stay open. Every parameter in a model is measured from data or credited to a source, and the writeup says which — a coefficient nobody can account for is a guess wearing a decimal point.
Built for fans first. This is for people watching games, not for showing off math. Want the why behind a model? It is in the methods section, or just ask.
The “Post” in the name is the point — analytics in a vacuum help nobody. The audience is fans, the media who carry numbers to fans, and coaches and scouts whose expertise is practical and schematic rather than quantitative. If they cannot read it, we have not finished it.
We own our mistakes. When something we built turns out wrong, we say so and keep the record.
A metric we have killed stays documented, with the evidence that killed it. A model we have changed is a new version, and the change is written down — the archive is part of the record. And nothing ships in the first place without showing what it adds over a simpler alternative; “interesting” is not a reason to publish something.
How to read the site
The Skaters, Goalies and Teams pages are sortable tables with presets — a few curated views we think are worth your time, rather than a hundred columns you have to assemble yourself. The PH Pro tab is where the newer work lives. The Glossary & Methods tab carries definitions and long-form writeups for everything we publish, including the things we no longer do.
One convention worth learning early: expected-goals columns are labelled by what has been adjusted for. xGF(sh) accounts for who was shooting, xGF(sv) for who was in net, and xGF(sh+sv) for both. Unlabelled xGF is the raw shot-quality model with no talent adjustment at all. Every variant also carries that season's league-wide scoring environment, so the naming only changes with the talent adjustment, not with era. Which one you want depends entirely on the question you are asking, and the glossary walks through it.
Sources
Play-by-play, shift charts and boxscores are scraped from the NHL's public APIs at NHL.com. 21,910 games, 2009–10 through 2025–26, feed the models. Where we lean on, compare against, or are otherwise indebted to prior public work — Dom Luszczyszyn's Net Rating, Evolving-Hockey's xG framing, the puck-tracking shot-location discussion led by the analyst C.J. Turtoro (no relation), HockeyStats, Natural Stat Trick, HockeyViz, and Corey Sznajder's hand-tracked All Three Zones data — we say so in the relevant writeup.
Contact
Mistakes, disagreements and pull-no-punches feedback are all welcome; the second kind is the most useful. The fastest route is the email address listed on the Glossary page.