Introducing Offensive Sequences and The Hockey Decision Tree

If you ever work for a hockey team as an analyst, you could be facing two very recurrent questions from the coaching staff. The first one is very practical: How can analytics help us work better and faster? The second one is: What is the real contribution of each player? Meaning beyond the usual on-ice “possession” stats like Corsi or Expected Goals and individual production metrics such as shots taken, scoring chances, expected goals created, zone exits, entries, or even high-danger passes (passes that end or go through the slot). But those events were not yet statistically linked to each other. Finding a way to provide answers to both questions was my goal for the last few months, and the solution was: I needed to split the game in “Sequences”.

Video coaches often break down game tape to highlight certain plays, such as a rush-based attack or a zone exit under pressure. I wanted to do the same and divide a game in as many parts as necessary, or “Sequences”. Roughly, every time the puck changes possession between teams, a new Sequence” begins. That’s about 250 Sequences per game.

Looking at this from the point of view of the team that owns the puck, offensive Sequences extend from the moment a team gets control of the puck and starts moving forward, to the moment she loses it for good, and it must include a shot attempt in the process to have a positive value. How does this work? Let’s say a player gets the puck back in your defensive zone, you try a zone exit but fail. Sequence starts over, there can only be one exit recorded in the Sequence. So he tries another zone exit and succeed, gets into the offensive zone, the team records a couple of shot attempts, loses the puck and if the other teams gets enough control of it to try a zone exit, it means the end of the Sequence.

How does this help? Well, the basic principle is to see the total value of a Sequence. We’re use Expected Goals as our measure of “value”. To do that, we add the Expected Goals of the shot attempts in the Sequence. For example, a Sequence with two shot attempts:

  • A high danger shot: 0.23 Expected Goals
  • A shot from the blue line: 0.01 Expected Goals
  • Total Sequence value: 0.23 + 0.01 = 0.24 Expected Goals


Continue reading

An Introduction to R With Hockey Data

I have written a couple articles over the past few months on using R with hockey data (see here and here), but both of those articles were focused on intermediate techniques and presumed beginner knowledge of R. In contrast, this article is for the complete beginner. We’ll go through the steps of downloading and setting up R and then, with the use of a sample hockey data set, learn the very basics of R for exploring and visualizing data.

One of the wonderful things about using R is that it’s a flexible, growing language, meaning that there are often many different ways to get to the same, correct result. The examples below are meant to be a gentle introduction to different parts of R, but please know that this really only scratches the surface of what’s available.

The code used for this tutorial (which also includes more detail and more examples) is available on our Github here.

Downloading R and Getting Set Up

Continue reading

Lateral Puck Movement in the NZ

Research shows that lateral/”east-west” puck movement in the offensive zone is beneficial to increasing one’s odds of scoring. But I have now heard from people in various positions within the hockey industry on why it might also be useful to generate east-west puck movement in the neutral zone. The theories – focused on lateral passing, lane changes and stretch passes, respectively – all boiled down to one point: When you rush the puck up ice, the defending team will focus on that side, leaving the other side of the ice somewhat more open, so there might be open ice to exploit.

Continue reading

Passing clusters: A Framework to Evaluate a Team’s Breakout

Quick breakouts – trying to move the puck out of your zone right after gaining possession – make up roughly 38% of possessions and account for 22% of all shots and 22.4% of Expected Goals (at least according to my possession and xG definitions). Therefore, understanding what does and does not work when breaking out the puck against present forecheckers is important. There is evidence that passes from the defensive half boards by wingers inside produce more offense than those straight up ice. But the puck is more often recovered elsewhere, so these passes by wingers aren’t the first pass in a possession and are therefore presumably influenced by the previous play. It should be interesting to find out how the inclusion of the pass(es) that came before affects this conclusion.

Continue reading

Exploratory Data Analysis Using Tidyverse

This post assumes beginner knowledge of R.

Welcome to the second article in our series on basic data cleaning and data manipulation! In this article, we’re going to use play-by-play data from two NHL games and answer two questions:

  • which power play unit generated the best shot rate in each game?
  • which defenseman played the most 5v5 minutes in each game?

In the process of doing so, we’ll cover several topics of basic data manipulation in the tidyverse, including using functions, creating joins, grouping and summarizing data, and working with string data.

Continue reading

Combining Manually-Tracked Data with Play-by-Play Data

This post assumes beginner knowledge of R.

If you’ve ever analyzed hockey data, then you’re probably familiar with the NHL’s Real Time Scoring System, which produces what’s more commonly known as play-by-play data. These data are publicly available and allow us to see every event recorded by the NHL in a given game. Shown below are selected details about the first 10 events from two games on February 18, 2019: Tampa Bay at Columbus and Vegas at Colorado.

Continue reading

The Importance of Pressure for a Successful Forecheck

Most of my posts so far have talked about zone exits from the perspective of the team trying to breakout out of their defensive zone. Now, let’s flip the script and discuss the team on the forecheck. This team does not have possession of the puck, but they are in their offensive zone, which is an advantage. So, how can they regain control?

Continue reading

Team Level Zone Exits

From past posts, we have a general sense of the basics of zone exits: zone exits are important because they get you out of your zone and towards an opportunity to score. The key to a successful zone exit is maintaining possession, ideally by avoiding the temptation to dump the puck out.

But so far, we have only looked at zone exits league wide. Most fans care about one particular team more than the rest, but we haven’t looked at team-level results at all. So today, let’s see how each team has performed at zone exits over the past three seasons.

Continue reading

Expected Goals Model with Pre-Shot Movement, Part 3: 2018-2019 Data

Yesterday we looked at the team and skater results from the 2016 – 2018 data that was used to train the xG model. That’s a pretty robust dataset, but it’s unfortunately a bit out of date. People care about this season, and past years are old news. So let’s take a look at the data that Corey Sznajder has tracked for 2018 – 2019 so far.

Continue reading

Expected Goals Model with Pre-Shot Movement, Part 2: Historic Team and Player Results


In the last post, we introduced a new expected goals (xG) model. It incorporates pre-shot movement, which made it more accurate than existing public xG models when predicting which shots would be goals. However, we use xG models for far more than looking at individual shots. By aggregating expected goals at the player and team level, we can get a better sense of how each of them performs.

Continue reading