P3RF Hockey ADVANCED STATS
Advanced Stats
Shot-based analytics — expected goals, shot-attempt differentials, danger zones, in-game win probability — built and modelled from play-by-play data we ingest ourselves.
Skaters
Individual shot volume, ixG, points/60, faceoff%, giveaways/takeaways per-60
Goalies
Save%, expected goals against, Goals Saved Above Expected (GSAx)
Teams
Corsi/Fenwick, expected goals share, PDO
Methodology
Everything here is built from the NHL's own public play-by-play feed, ingested and modelled ourselves. Both models are ordinary logistic regressions fitted on that data — no black box, and every claim below is checked against the same data it was fitted on.
- Expected goals (xG) is the probability a given unblocked shot becomes a goal, from its distance and angle to the net, whether it came off a rebound, the shot type and the strength situation. Because it's a fitted model rather than a stack of multiplied adjustments, the expected goals it produces add up: summed over every shot in the database, total xG equals the actual number of goals scored. An earlier version multiplied separately-estimated factors together, which double-counted everything they had in common (rebounds happen close to the net, so distance had already accounted for most of the rebound effect) and overstated the league's goals by 13.7%.
- Danger zones: Low <8% goal probability, Medium 8–20%, High ≥20%. Those thresholds are only meaningful if the model behind them is honest about its own numbers, which is why the calibration above matters.
- Rebounds are shots taken within 3 seconds of a shot the goalie saved. A shot soon after a teammate's miss is a second chance off the boards, not a rebound.
- Corsi = all shot attempts (goals + shots on goal + missed shots + blocked shots). Fenwick = the same, excluding blocked shots. Both measure puck-possession pressure, independent of whether the shots go in.
- Win probability is a second fitted model, trained on 30-second samples of every ingested game and labelled with whether the home team won. Beyond score and time remaining it sees man advantage (and how long is left on it), an empty net, recent shot quality, and each team's season-long strength. It's trained from the home side only, so it carries real home-ice advantage — about 54% at a tied opening faceoff.
- Shootouts are excluded from every shot statistic. Shootout attempts arrive in the feed looking like ordinary shots, but a skills competition to award one standings point isn't part of the run of play, and counting it inflated goals, Corsi and shooting percentage alike.
- Regular season and playoffs are reported separately, regular season by default, because blending them produces season lines that match no other source.
- Blocked shots get no xG. The NHL feed records where a shot was blocked, not where it was released from — and the same goes for the roughly 4% of attempts logged from outside the offensive zone, whose coordinates point at the shooter's own net.
- Coordinates only exist in the NHL's feed from the 2009–10 season on; earlier seasons have no play-by-play detail to build any of this from.
- These are individual stats, not on-ice stats — there's no shift-by-shift data behind this, so there's no per-skater Corsi% "while on the ice". Team-level Corsi/Fenwick/xG are shown instead, which only need to know which team took a shot, not who was on the ice for it.