Skip to content
CricketTaken

Analysis

Expected goals in hockey explained, and where the model breaks

How expected goals works in hockey, why location tells you less than in football, and the rebounds, screens and goaltending the model cannot see.

By CricketTaken EditorialPublished Analysis18 min read

How this is written and checkedReport an error

A puck goes into the net after a point shot is stopped, kicked out to the top of the crease, whacked at once, saved again, and shovelled in on the third attempt by a player facing the wrong way. The play-by-play file records three shot events. Two of them come from the most dangerous square metre on the ice, so an expected goals model rates them highly and the team's total for the sequence looks enormous. What actually happened was one scramble, lasting under two seconds, in which nobody chose anything.

That is the central difficulty with expected goals in hockey, and it is why the metric that settled quickly into football has had a rougher ride here. The idea travelled well. The sport did not cooperate.

Expected goals began as a way of asking a simple question about a shot: given everything known about it before it was taken, how often has a shot like this gone in? Answer that for every attempt, add the answers up, and you have a description of the chances a team created that does not depend on whether the puck went in. In football that description is close to what a viewer would have said anyway. In hockey it frequently is not, and the gap between the model and the eye is not a bug in one website's code. It comes from what the sport is.

What an expected goals model in hockey actually reads

Start with the inputs, because most arguments about xG are really arguments about what the model can see.

A public model is trained on the league's play-by-play file, which records every unblocked shot attempt as a row: a goal, a shot on goal, or a miss. Blocked attempts are usually excluded, for the unglamorous reason that the recorded coordinate is where the block happened rather than where the shot was taken from. The features are then built out of that row and the rows immediately before it.

The core four are distance to the net, angle to the net, shot type as the scorer classified it, and the strength state. Around them sits a set of context features that do most of the model's interesting work: what the previous event was and how long ago it happened, how far the puck travelled between that event and the shot, whether the puck crossed the centre line of the ice on the way, whether the attempt is a rebound, whether it came off a rush, the score, the period, and how long the shooter has been on the ice.

Everything in that list is derived from two things: a coordinate pair, and the sequence of coordinate pairs before it. No public model built on play-by-play knows where the other nine skaters were standing. It does not know whether the goaltender saw the puck. It does not know whether the shot was aimed or shovelled.

What happens to one shot inside an expected goals model
  1. The attempt is recordedAn official scorer logs a goal, a shot on goal or a miss, with a rink coordinate, a shot type and a timestamp. Blocked attempts are usually dropped, because the coordinate marks the block rather than the shot.
  2. Features are built from the row and its neighboursDistance and angle come from the coordinate. Rebound, rush and pre-shot movement come from comparing this row with the events just before it. Strength state and score come from the game file.
  3. The model returns a probabilityA model trained on many seasons of similar attempts outputs a single number between zero and one: the historical conversion rate of shots with this feature set. That number is the shot's expected goals value.
  4. The probabilities are summedPlayer, line, team and game totals are all additions of those per-shot values. Nothing weights a sequence as a sequence, so three attempts in one scramble are added exactly as three attempts in three periods would be.
  5. Nothing is corrected afterwardsThe model never learns what happened on this particular shot. A tap-in that hits the post and a tap-in that goes in carry identical expected goals, which is the entire purpose of the measure and the reason it will sometimes disagree with the scoreboard for a whole season.

The same path for every attempt. Nothing in it looks at the outcome, which is the point and also the limitation.

Why the shot's location tells you less here than in football

Both sports feed a coordinate into a model. In football, that coordinate is doing enormous work. In hockey it is doing considerably less, and there are three reasons for it.

The first is the geometry of what is being defended. A football goalkeeper covers a fraction of a goal far wider than his reach, so a shot's position changes the size of the target he cannot get to in time. A hockey goaltender in modern equipment, set and square, covers most of the visible net from most shooting positions. What separates a goal from a save is much less often the raw angle and much more often whether he is set, whether he is square, and whether he has picked the puck up at all. None of those three is in the coordinate.

The second is speed. A shot from the point arrives quickly enough that reaction time, rather than geometry, is the binding constraint, and reaction time depends on sight lines. A wrist shot from that same spot with a clear view is close to harmless. The model gives both the same distance and angle, adjusts a little for shot type, and moves on.

The third is that scoring is rarer per attempt than in football, so the base rate the model is fitting is low and flat across large parts of the offensive zone. The area where probability rises steeply is small: the inner slot, the back post, the space either side of the crease. Outside it, most shots sit in a broad band of low, similar values. A metric whose discrimination is concentrated in one small region will be right about that region and vague about everything else.

None of that makes location useless. Shots from the inner slot really do go in far more often than shots from the boards, and a model that captures nothing else still captures that. What it means is that the location term explains less of the variation in hockey than the equivalent term does in the football version of the same metric, and the leftover has to be carried by features that public data holds only in proxy form.

The rebound problem, and why three shots are not three chances

Consider the scramble from the opening again, and now do the arithmetic.

A model scores each attempt independently. It knows the second and third attempts are rebounds, and rebound status is a powerful feature, so it rates them highly. It has no mechanism for saying that the three attempts are one event with one outcome. Summing them treats a sequence in which at most one goal can be scored as though it were three separate opportunities to score three separate goals.

Worked example: one invented scramble, scored three times
Point shot through traffic3%
Rebound at the top of the crease22%
Second rebound, off balance14%
Sum credited to the sequence39%

Invented probabilities in percentage points, chosen to make the arithmetic legible. A model scores each attempt on its own, so the three add to a total no single scramble could ever be worth.

Show the numbers
Worked example: one invented scramble, scored three times
ItemValue
Point shot through traffic3%
Rebound at the top of the crease22%
Second rebound, off balance14%
Sum credited to the sequence39%

Thirty-nine per cent of a goal, for a sequence that could produce at most one. The individual numbers are defensible on their own terms. The total is a category error, and it is baked into every team and player figure published anywhere, because the sum is how the metric is constructed.

This matters more than it first appears, for two reasons.

Teams differ systematically in how many of their attempts are rebounds. A side that crashes the net and plays for second chances generates more of them than one that works the puck for a clean look, so its expected goals total inflates relative to what its actual scoring pattern will support. The bias is not random noise that cancels over a season. It is a stable property of a playing style, which is exactly the thing analytics is supposed to be measuring rather than distorting.

The rebound feature itself is also crude. Public models generally define a rebound by a time threshold, a shot within a second or two of a previous shot. A puck sitting loose in the crease for longer while two players fall over it is not flagged. A puck that ricochets to the far circle and is one-timed back inside the threshold is flagged as a prime rebound when the goaltender had ample time to reset. The threshold is a proxy for whether the goalie was in position, and it is a poor one.

Some models handle this better than others, predicting rebound generation separately and treating a sequence's later attempts more conservatively. None of them, working from play-by-play alone, can solve it properly, because solving it requires knowing where the goaltender was when the second shot came, and that is a tracking question rather than a coordinate question.

Screens, deflections and the traffic no public model can see

The largest hole in hockey xG is not statistical. It is that the data contains one player's position and ignores the other nine.

A shot from the blue line with a screen in front of it and a shot from the blue line into a clear view are, to the model, the same shot. Both get the same distance, the same angle, a shot type of slap or wrist, and the same low probability. In reality they are barely the same activity. One is a scoring attempt built by four players working to occupy a goaltender's eyes. The other is a dump-in with extra steps.

The same applies to deflections. Shot type sometimes records a tip, so the model has partial information, but a tip is a category rather than a measurement. A tip at the top of the crease that changes the puck's line by a few degrees and a tip that changes it by thirty are recorded identically. Whether a defender's stick got a piece of it on the way through is not recorded at all.

This is why the metric systematically undervalues certain kinds of hockey. A team that runs a genuine net-front presence, that screens well, that sets up tips from the point, is generating chances the model reads as perimeter shots. The value is created between the shooter and the goaltender, in a region the data does not describe. A team that takes clean, unscreened shots from a slightly better coordinate is rewarded for shots the goalie saw all the way.

Coaches have understood this for as long as the numbers have been public, and it is a large part of why the metric took longer to gain trust in dressing rooms here than it did in football. The objection was never that shot quality is unmeasurable. It was that the version being measured left out the part they spend practice time on. That objection is fair and it remains partly true. Recent academic work adding shooter and goaltender identity to the model is explicit that the absence of positional data for non-shooters is a limitation it cannot solve.

Shot quality is a re-weighting of shot volume, not a replacement for it

There is a persistent misreading of xG as the metric that replaced shot counting. It did not. It reweighted it.

The predecessors were Corsi and Fenwick, which count shot attempts with and without blocks. Their justification was never that all shots are equal. It was that attempts are frequent enough to stabilise quickly, and that having the puck in the offensive zone is a thing a team can actually control. Expected goals starts from the same attempt list and multiplies each row by a weight. The volume is still the base. If a team takes very few attempts, no weighting saves its total.

That is why xG and attempt share usually agree, and why they are most interesting where they do not.

Worked example: where an invented team's unblocked attempts come from
18%32%50%
  • Inner slot and net front18%
  • Outer slot and faceoff circles32%
  • Point and perimeter50%

An invented distribution used to show the mechanism. Two sides can record identical attempt counts and very different expected goals totals purely from this split.

Show the numbers
Worked example: where an invented team's unblocked attempts come from
ItemValue
Inner slot and net front18%
Outer slot and faceoff circles32%
Point and perimeter50%

Shift ten percentage points from the bottom row to the top and the team's expected goals total moves substantially without a single extra shot being taken. That is the whole claim of shot quality, and it is a real claim. It is also a claim about a small share of a team's attempts, because most shots in hockey come from outside the danger area no matter who is playing.

The practical consequence is that expected goals differentials between competent teams are usually modest, and that a large gap in a single game normally reflects either a genuine mismatch or one or two long stretches of pressure. Reading a small gap as a verdict over-reads the instrument. The metric was built to be summed over long spans, and the further you get from that, the more you are looking at the model's own noise.

Where the two measures part company is where the argument gets useful. A team with strong attempt share and weak expected goals is getting the puck into the zone and doing nothing with it, which is often a zone entry problem rather than a finishing one. A team with the reverse is generating dangerous looks it cannot sustain, usually off the rush, and typically has trouble holding leads.

Why goaltending leaves such a large residual

Every expected goals model, in any sport, produces a residual: the difference between what it expected and what happened. In football that residual is mostly finishing and luck. In hockey it is mostly one person.

Goaltending here is not a modifier at the margin. It is the single largest source of variance in outcomes, and it is the part the model deliberately holds constant. A standard xG value is trained across all goaltenders, so it represents the conversion rate of a shot against a league-average goalie. Every deviation from average, in either direction, lands in the residual.

That is why the same number gets used in two directions at once. Take the expected goals a goaltender faced, subtract the goals he actually conceded, and the difference is goals saved above expected, now the standard public measure of goaltending. It is genuinely useful. It is also, structurally, a measurement of everything the model failed to capture, credited entirely to the goalie.

Hold that sentence up to the earlier sections and the problem is obvious. A goaltender playing behind a team that allows heavy net-front traffic faces shots the model rates by coordinate and he experiences as unsighted. His goals saved above expected will read poorly, and part of that belongs to his defence rather than to him. A goaltender behind a team that clears the crease religiously gets the reverse.

Over one season the effect is meaningful. Across several seasons with different teams it dilutes, which is why goaltending evaluation is one of the few areas of hockey analysis where practitioners are openly cautious about single-season numbers. The residual is large, it is not purely random, and the part of it that is not random is contaminated by the same blind spot as everything else.

There is a further wrinkle that catches people out. Because the model is calibrated on league-average goaltending as it was during the training seasons, a shift in the overall standard of goaltending shows up as a drift between expected and actual goals for everybody at once. Models are periodically retrained partly for this reason, and a retrained model quietly changes historical figures that readers had treated as fixed.

Expected goals for a skater and for a goaltender are not the same number

This is the distinction most often collapsed in discussion, and it matters.

For a skater, expected goals is an attempt at a performance measure. The individual xG on his own shots describes the quality of look he is getting. The team's expected goals for and against while he is on the ice describes the flow of play around him, which is more about role, line-mates and deployment than about him. Both are inputs to an argument rather than a rating, and neither is adjusted for who else was on the ice unless the analyst does that separately.

For a goaltender, expected goals against is not a performance measure at all. It is a workload measure. It says how hard the shots he faced were, given the model's view of hard, and a goalie has almost no influence over it beyond rebound control and puck handling. His performance is the residual, not the input.

So the same three letters mean "chances created" on one side of the ice and "difficulty faced" on the other. The comparison people reach for, a forward with a high xG total set against a goalie with a high xGA total, is not a comparison at all. One is being credited with generating something and the other is being described as having been shot at.

Rebound control is the interesting exception, and it is where the two definitions touch. A goaltender who steers pucks to the corners rather than back into the slot directly reduces the expected goals his team concedes on subsequent attempts, but that reduction shows up as a lower xGA, which the metric treats as workload rather than skill. A genuinely good rebound-controlling goalie is therefore squeezed from both sides: his workload number falls, which lowers the bar he is then measured against, and the saves he never had to make are not counted anywhere.

What calibration means, and what a miscalibrated model looks like
  • A calibrated model
  • A model that overrates the slot
08.817.526.335A calibrated model — 2 per cent bucket: 2%A calibrated model — 5 per cent bucket: 5%A calibrated model — 10 per cent bucket: 10%A calibrated model — 20 per cent bucket: 20%A calibrated model — 35 per cent bucket: 35%A model that overrates the slot — 2 per cent bucket: 2%A model that overrates the slot — 5 per cent bucket: 4%A model that overrates the slot — 10 per cent bucket: 8%A model that overrates the slot — 20 per cent bucket: 15%A model that overrates the slot — 35 per cent bucket: 26%2 per cent bucket5 per cent bucket10 per cent bucket20 per cent bucket35 per cent bucket

A constructed illustration rather than measured data. The horizontal axis is the probability the model assigned to a group of shots; the vertical is how often that group actually produced goals. A model is calibrated when the two match.

Show the numbers
What calibration means, and what a miscalibrated model looks like
ItemA calibrated modelA model that overrates the slot
2 per cent bucket2%2%
5 per cent bucket5%4%
10 per cent bucket10%8%
20 per cent bucket20%15%
35 per cent bucket35%26%

Calibration is the check that matters and the one nobody looks at. A model can rank shots correctly, putting the dangerous ones above the harmless ones in the right order, and still be systematically wrong about the level. The second line in that figure is what a model looks like when it has learned the ordering and overstated the extremes: every team's expected goals total is inflated, every goaltender in the league looks better than average, and the error is invisible unless somebody goes looking for it. Public model builders publish calibration checks precisely because ranking accuracy on its own is not enough.

What has changed recently, and what it fixes

Two developments have moved the ground under this metric, and neither is finished.

The first is tracking. The league's puck and player tracking system has been running across all arenas since the early 2020s, and its public face at NHL EDGE now publishes shot speeds, skating speeds and zone-time figures that were previously unavailable outside clubs. In principle this answers every complaint above: with positions for all ten skaters and the puck at high frequency, a model can know whether a shooting lane was screened, where the goaltender was when the rebound came, and how far he had to travel to get there.

In practice the full stream is not public, the published summaries are not the model inputs, and the expected goals models people quote are still largely built on play-by-play. The gap between what the league can compute internally and what a fan can compute is now much wider than it was, which changes the character of the argument. Club analytics departments are not working under the constraints a public model works under, and a public model that disagrees with a club's internal one may simply be worse informed.

The second is model architecture. Recent public revisions have concentrated on features that proxy for pre-shot movement: how far the puck travelled between the previous event and the shot, how fast that movement was, and whether the play crossed the middle of the ice, which forces a goaltender to move laterally across his crease. This is the cheapest available substitute for tracking data. It captures the most important thing about a chance, whether the goaltender was set, using nothing but the coordinates of two consecutive events.

Alongside that runs a line of work arguing that models should stop treating every shooter and every goaltender as identical. A skill-adjusted model gives a high-volume finisher a different probability from an average one on the same shot, which is a departure from the original design principle that xG describes the chance rather than the player. Reported gains from adding skill are real but modest, and the trade-off is circularity: a model that knows who is shooting is no longer measuring the chance independently of the shooter, so it cannot then be used to argue that a shooter is outperforming his chances. Whether that trade is worth making is genuinely contested among the people who build these models.

The honest summary of the last few years is that the models have improved at what they were already doing and have not yet been rebuilt around the data that would fix what they cannot do. That rebuild is coming, and when it lands the historical numbers will not be comparable with the new ones.

The awkward cases the model has to be told about

A few game states break the model badly enough that every builder handles them by hand, and how they are handled is one of the reasons two sites disagree.

An empty net is the clearest. A shot at an unguarded net from the defensive zone has a conversion rate that has nothing to do with the shot-quality problem the model was built for, and leaving those attempts in the training data drags the coefficients around for every ordinary shot near the blue line. Most public models either exclude empty-net attempts, model them separately, or report totals both with and without them. A team's expected goals for a game can therefore differ between two sites purely because one counted a late scramble at an empty net and the other did not.

Penalty shots and shootout attempts are the same kind of problem in miniature. They are one-on-one events with no defenders, no screens and no rebound, and their conversion rate is far higher than anything in open play. Including them would corrupt the model; excluding them means the metric is silent about a category of goal that decides games.

Three-on-three overtime is harder still, because the game becomes a different sport. Space, rush frequency and shot selection all change, and a model trained mostly on five-on-five hockey is being asked to price attempts that do not resemble its training data. Some models cover it with a game-state feature, which assumes the effect is a simple shift rather than a different relationship altogether.

The pattern in all three is worth holding on to. An expected goals model is not a law of the sport. It is a fitted description of the ordinary case, with the extraordinary cases handled by decisions somebody made, and those decisions are rarely stated alongside the number.

Why a single series is the worst possible place to use this

Playoff hockey is where expected goals gets quoted most and deserves it least.

A series runs to at most seven games. Goals are rare, expected goals per game for a team is a small number, and the sampling noise around it is proportionally large. Everything discussed above then piles on top of the noise: the rebound double-counting, the screen blindness, and a residual dominated by two goaltenders who are, by definition, the two the sport thought good enough to still be playing.

Playoff hockey also changes the inputs. Shot blocking rises, which removes attempts from the model's view entirely because blocked shots are not scored. Net-front traffic rises, which is the model's blind spot. Games go to overtime, adding long stretches of a game state the model sees less of. Referees call less, so the special teams share of the sample falls, and power play shots are among the highest-value attempts in the data.

The result is a metric measuring a smaller, noisier sample of a game that has shifted towards precisely the elements it handles worst. A team can lose a series while winning the expected goals count, and the correct conclusion is often not that it was unlucky but that the model did not see the series.

What xG over a series is legitimately good for is describing shape. If one side generated the bulk of its attempts from the perimeter and the other lived in the slot, that is real, it is visible in the numbers, and it is worth knowing when projecting forwards. What it cannot do is adjudicate. There is no hidden scoreline underneath the real one.

The wider point holds across sports. A model built to be summed over hundreds of events is being asked to rule on a few dozen, and the answer it gives will be confident and thin.

Reading an expected goals number without being fooled by it

Four questions will keep you out of most of the trouble.

Whose model is it? There is no official figure. Public models differ in training span, feature set and treatment of rebounds, and two of them can disagree by a meaningful margin on the same game. A number quoted without a source cannot be checked, which in a sport with several competing public models is a real problem rather than a pedantic one.

How many shots is it built on? Expected goals stabilises faster than goals, which is the whole reason it exists, but it stabilises slowly enough that a handful of games tells you very little. Ask how many attempts sit underneath the figure before treating a gap as a finding.

Does the style of play break the assumptions? A team built on net-front chaos, second chances and tips has its expected goals distorted in both directions at once, inflated by rebound double-counting and deflated by screen blindness. Those two do not cancel in any predictable way. For such a team the number is a weaker description than usual.

Is the residual being blamed on the right person? A gap between expected and actual goals is a fact. The explanation for it is not. Finishing, goaltending, traffic the model could not see and plain variance all land in the same residual, and deciding which one it was requires watching rather than a table. This is where the metric is most often abused, and it is the failure mode to check first.

Used with those four in mind, expected goals in hockey is a good instrument: better than counting shots, honest about what it is, and improving. Used as a verdict, it will confidently tell you the wrong team should have won, and it will do it in decimal places.

More on how the sport is measured, argued about and paid for sits in the ice hockey archive, and the same tools applied to other sports are collected across the wider sports blog.

Common questions

What is expected goals in hockey?

Expected goals is a number attached to every unblocked shot attempt, representing the probability that a shot with those characteristics has historically gone in. Distance, angle, shot type and what happened immediately before the shot are the main inputs. Adding those probabilities up across a game or a season gives a team or player total, which is meant to describe the quality of the chances created rather than whether the puck happened to go in.

Is expected goals more useful than Corsi in hockey?

It is more informative per shot, because it separates a point shot through three bodies from a tap-in at the back post, which Corsi counts identically. It is not automatically more reliable, because the weighting introduces model error on top of counting error, and over short samples the two often tell the same story. The sensible use is both at once: Corsi for how much a team has the puck in the right end, expected goals for what it is doing once it gets there.

Why do different websites give different expected goals numbers for the same game?

Because there is no single official model. Each public site builds its own, trains it on a different span of seasons and picks a different feature set, so a scramble in front of the net can be scored several different ways. Differences of a few tenths of a goal in a single match are normal and say more about the models than about the game.

What is goals saved above expected?

It is the gap between the expected goals a goaltender faced and the goals he actually conceded, and it is the standard public measure of goaltending. If a goalie faces shots worth three expected goals and concedes one, he is credited with two goals saved above expected in that game. Because it inherits every weakness of the underlying model, including its blindness to screens, it is best read over many games rather than one.

Can expected goals tell you who should have won a playoff series?

Not with any confidence. A series is at most seven games, goals are rare events, and the residual between expected and actual is dominated by goaltending and by the traffic no public model can see. Expected goals over a series describes the shape of the play, which is worth knowing, but it is not a hidden scoreline in which the better team is revealed.

Filed under Ice Hockey·nhl · expected goals · analytics · ice hockey · statistics