xJawn NHL expected goals

← Blog

Blocked shots, part 1: the case for the shot that never arrived

A quarter of all shot attempts never reach the net, and most xG models throw them away. Why they belong — the shooter's-eye argument — and the data problem that keeps everyone else from using them.

Watch enough hockey and you stop seeing them. Roughly 28% of all shot attempts never reach the net because a defender got a shin pad, a skate, a glove in the way. The play-by-play calls it a blocked shot, the broadcast moves on — and most public expected-goals models quietly move on too: they are fit on unblocked attempts only, and a blocked shot contributes nothing to anybody's xG.

Our model scores every attempt, blocked ones included, and lately that choice has stopped being a detail. The newest version of our model is increasingly built around blocked shots — so this series is the case for that, in three parts. This post argues why blocked shots belong in xG at all, and names the data problem that keeps most models from using them. Part 2, coming shortly, shows how we recover the piece of data the league does not record. Part 3 shows the new joint model turning shot-blocking itself into a measurable player skill.

The shooter's-eye argument

Expected goals is a claim about the moment of release: given where and how this attempt was taken, what is the chance it becomes a goal? Stated that way, the case for blocked shots nearly makes itself. At the moment the puck leaves the stick, whether it will be blocked is unknown — to the shooter, to the goalie, to the defender lunging into the lane. Up until that instant, a shot that is about to be blocked and a shot that is about to arrive are the same event: same spot, same look, same danger. The block is something that happens to the attempt afterward.

A block, in other words, is an outcome, not a precondition. It is one of the ways an attempt dies — alongside missing the net, hitting a post, being saved — and like the save, it is partly the product of defensive work. Score only unblocked attempts and you have conditioned your universe on something the defense did after release. Two things quietly go wrong:

  • Real pressure vanishes by defensive decree. Whether an attempt counts toward a team's ledger becomes a decision made by the opposing shot-blockers. A team that generates forty attempts against a shot-eating defense did not generate less danger than the same forty against a passive one — but a blocked-shots-excluded model says it did, and credits the difference to nobody.
  • The survivors are a biased sample. Blocks are anything but random: a long shot has a long path through traffic, and on forwards' shots we measure the block rate rising roughly 25-fold from the closest origins to the farthest (part 2 has the figure). Filter out the blocked attempts and the unblocked remainder is a systematically distorted picture of what the offense actually created.

And the block itself is information. Somebody chose to stand in the lane and got a piece — a deliberate, repeatable defensive act, and the only one the league writes down against individual attempts. Part 3 is about what happens when a model finally gets to treat it that way.

The precedent — credit where it is due

None of this is our insight. Micah Blake McCurdy of HockeyViz has been building xG models that score every attempt for years, and his Magnus family goes further: it decomposes a shot's fate into layers — is it blocked, is it on target, does it go in — and measures who influences each layer. That layered picture is the direct motivation for the nested structure of our own models. Our original v1 canonical model was a cascade of exactly that shape — P(through) × P(on net | through) × P(goal | on net) — and the new joint model in part 3 puts the cascade back at the center of the whole system. Our designs are inspired by Magnus rather than ported from it — the representations, the data, and the fitting machinery are ours, and where we borrow a mechanism we say so — but the thesis that a blocked shot is a real event carrying real information was his, argued early and convincingly.

So if they are useful, why doesn't everyone use them?

Because of a data problem the league has never fixed: the NHL does not record where a blocked shot came from. The play-by-play logs a blocked shot at the position of the blocker — where the attempt died, not where it was born. For the other 72% of attempts the recorded location is the shooter's; for blocks it is a different thing entirely, wearing the same column name.

Animated tracking clip of one real blocked shot: the puck sits on a defenseman's stick at the blue line, flies toward the net, and dies at the gray X where the play-by-play recorded the block, 12 feet from the net. A green marker shows the extracted release point 52 feet out.
One real blocked shot, from the league's own tracking (more on this data in part 2). The play-by-play recorded it as a 12-foot attempt from the slot — the gray ✕, where the blocker stood. Watch the puck: it leaves the defenseman's stick at the blue line, 52 feet out (green). The recorded location and the true origin are not even in the same zone of danger.

The gap is large, systematic, and lands almost entirely on one position. A defenseman's blocked shot is typically recorded around 28 feet from the net; the true origins sit around 52 feet — the point shot swallowed in the slot is the canonical case. Feed the recorded coordinates to a model and every blocked point shot is priced like a slot chance. The model learns, in effect, that defensemen constantly shoot from twelve feet and almost never score from there — and that distortion flows downstream into shot maps, team profiles, and any player rating built on top.

So a modeler is stuck between two bad options: drop blocked shots and lose 28% of all attempts along with the selection bias that filtering creates, or keep them at their recorded locations and poison the same 28% with coordinates that measure the wrong thing. The only way out is to answer the question the league didn't: where did this attempt actually come from? That is an imputation problem, it turns out to be a tractable one, and it is part 2 — coming shortly.

Deeper reading