nhl_players <- read_csv("http://bcdanl.github.io/data/nhl_players.csv")Hockey
Explore the data on a map
Explore the project data by location. Select a location for details.
Loading the map…
Data
On-page tables preview a sample of rows. Download the files to analyze the complete datasets.
The following lists data frames about NHL:
Updated October 6, 2026. MoneyPuck provides regular-season skater statistics for 2014–15 through 2026–27 and team game logs for 2023–24 through 2026–27. The latest game is October 5, 2026. The 2026–27 season is partial. season and year identify the starting year, so 2026 means 2026–27.
Each download already combines the earlier teaching records and the newer seasons in one CSV. Use season to choose years. The player file retains every player-team-season-situation key from the earlier 2024 snapshot; updated source statistics take precedence for overlapping keys.
nhl_players: Regular-season NHL skater statistics by player, team, season, and situation.nhl_games: Team game logs, including regular-season and playoff games; useplayoffGameto separate them.Data Source: MoneyPuck
- There is a great website that makes a ton of hockey data available for download called MoneyPuck.
- Almost all of their data are available as a .csv or a .zip file.
- The downloads below combine current public CSV files, including historical statistics recalculated by MoneyPuck’s current models. Credit MoneyPuck.com when presenting results. The source permits non-commercial use and ad-hoc journalistic use.
Salary Data Source: PuckPedia. The four salary columns retain the existing snapshot for matching 2014–2023 records. They are not verified salaries for each historical season. Newly added rows have blank salary fields; do not interpret a blank as zero or use these columns for current salary comparisons.
NHL Players (nhl_players)
nhl_players: NHL non-goalie player data- A data frame with 58,070 observations and 159 variables. Five situations can appear for each player-team-season. Filter
situation == "all"for overall season statistics, orsituation == "5on5"for even-strength comparisons.
- A data frame with 58,070 observations and 159 variables. Five situations can appear for each player-team-season. Filter
NHL Game Logs (nhl_games)
nhl_games: NHL Game Logs- A data frame with 42,350 observations and 111 variables.
seasonis newly included. Five situations appear per team-game; filtersituation == "all"to count each team-game once. A game appears once for each of its two teams. - Player-statistic variable descriptions (CSV)
- A data frame with 42,350 observations and 111 variables.
nhl_games <- read_csv("http://bcdanl.github.io/data/nhl_games.csv")Hockey Metrics
Corsi and Fenwick Metrics
Corsi and Fenwick are two of the earliest advanced analytics used to measure player effectiveness in hockey. For over a century, traditional metrics such as goals, assists, and penalty minutes were the main tools for evaluating players. The plus-minus rating, which tracks the number of goals scored by a player’s team minus the goals allowed while they are on the ice, added some depth. However, this metric has a significant flaw: it often reflects the quality of a player’s teammates. For instance, a lower-skilled player might have a great plus-minus rating simply by playing alongside scoring superstars like Auston Matthews or Sidney Crosby.
Corsi and Fenwick provide a more nuanced measure of effectiveness. Corsi calculates the difference in shot attempts (shots on goal, missed shots, and blocked shots) by a player’s team versus their opponents while the player is on the ice. Fenwick is similar but excludes blocked shots. Both metrics are typically applied to specific game situations, such as:
- 5-on-5 (Even Strength): The most common game state, where each team has five skaters on the ice, excluding goalies. Corsi and Fenwick in this situation are considered the most reliable indicators of player performance since it minimizes the influence of special teams.
- 5-on-4 (Power Play): A situation where the player’s team has a one-man advantage due to an opponent’s penalty. Metrics in this scenario provide insight into how effectively a player contributes to creating offensive opportunities.
- 4-on-5 (Penalty Kill): A situation where the player’s team is at a one-man disadvantage. Here, Corsi and Fenwick can help measure a player’s ability to limit opponent shot attempts and maintain defensive stability.
- Other Situations: Includes rarer scenarios like 4-on-4, 3-on-3 overtime, or 6-on-5 when a team pulls its goalie for an extra attacker. Metrics in these cases are less common but still useful for specific analyses.
- All Situations: Aggregates data from every possible game state, offering a broader view of a player’s performance but often less precise for evaluating specific roles or responsibilities.
While these metrics are often expressed as raw differences, they can also be analyzed as percentages. For instance, we can calculate a player’s Corsi percentage by dividing the Corsi “for” (shot attempts by the player’s team) by the sum of the Corsi “for” and Corsi “against” (shot attempts by the opposing team). This provides a clearer picture of a player’s overall effectiveness on the ice.
Time on Ice by Position
It is rare for skaters to play even half of a game, unlike goalkeepers, who generally play the entire match. For this analysis, we will focus on skaters and exclude goalkeepers. Managing a team effectively requires ensuring players are not overly fatigued, especially during the final minutes of a game or during stretches with multiple games and minimal rest. To address this, we use the “time on ice” (TOI) metric. TOI varies by position. NHL teams typically have four offensive lines (left wing, center, right wing) but only three defensive pairs. As a result, defensemen tend to play more minutes both in individual games and throughout the season. Special situations such as power plays or penalty kills can also affect TOI distribution. For instance:
- Power Plays (5-on-4): Offensive players on the power play units often have increased TOI in these scenarios to maximize scoring opportunities.
- Penalty Kills (4-on-5): Defensive players and penalty kill specialists tend to play more minutes during penalties to mitigate scoring threats.
- Overtime (3-on-3): In regular-season overtime, top players are typically deployed for longer shifts due to the fast-paced and open nature of play.
Understanding TOI in these different contexts helps coaches optimize player utilization and prevent fatigue over the course of a game or season.
General Terms Description
- Expected Goals
- The sum of the probabilities of unblocked shot attempts being goals.
- For example, a rebound shot in the slot may be worth 0.5 expected goals, while a shot from the blueline while short handed may be worth 0.01 expected goals.
- The expected value of each shot attempt is calculated by the MoneyPuck Expected Goals model.
- Expected goals is commonly abbreviated as “
xGoals”. Blocked shot attempts are valued at 0xGoals. - See more here: http://moneypuck.com/about.htm#shotModel
- Score Adjusted
- Adjusts metrics to gives more credit to away teams and teams with large leads.
- Flurry Adjusted
I_F- “Individual For”.
- For stats credited to an individual.
- For example,
I_F_goalsis the number of goals a player has scored
OnIce_F- “On-ice For”.
- Every player on the ice on the team doing the event receives credit.
OnIce_F_goalsis the number of goals the player’s team has scored while that player is on the ice, regardless of if they were the one who scored the goal or not.
OnIce_A- “On-ice Against”.
- Every opposing team’s players on the ice on receives credit.
OnIce_A_goalsis the number of goals the player’s team has given up while the player is on the ice
OffIce_F- “Off-ice For”.
- Every player on the bench of the team doing the event receives “credit”.
OffIce_F_goalsis the number of goals the player’s team has scored while that player is on the bench.
OffIce_A- “Off-ice Against”.
- Every player on the opposing team’s bench of the team doing the event receives “credit”.
OffIce_A_goalsis the number of goals the player’s team has given up while that player is on the bench.
- Low Danger Shots
- Unblocked Shot attempts with a < 8% probability of being a goal. Low danger shots accounts for ~75% of shots and ~33% of goals
- Medium Danger Shots
- Unblocked Shot attempts with between >=8% but less than 20% probability of being a goal.
- Medium danger shots account for ~20% of shots and ~33% of goals
- High Danger Shots
- Unblocked Shot attempts with >= 20% probability of being a goal.
- High danger shots account for ~5% of shots and ~33% of goals
- Created Expected Goals
