Usage Charts and Player Roles
Usage Charts and Player Roles
In modern NHL analytics, Usage Charts and Player Roles represents a critical component for evaluating team and player performance. This metric provides insights that traditional statistics often miss, enabling more accurate assessments of player contributions, team effectiveness, and strategic decision-making. By leveraging play-by-play data, tracking information, and statistical modeling, analysts can quantify aspects of hockey that were previously evaluated only through subjective observation.
Understanding Usage Charts and Player Roles
This analytical approach emerged from the hockey analytics revolution of the 2000s, when researchers recognized limitations in traditional statistics and began developing more sophisticated metrics. Using comprehensive play-by-play data from NHL games, analysts can now measure aspects like possession quality, shot danger, territorial control, and individual impact while controlling for factors such as teammates, competition quality, and ice time deployment. These advances have transformed how NHL teams evaluate players for trades, draft prospects, construct lineups, and make in-game strategic adjustments.
The metric addresses specific analytical needs in modern hockey evaluation. By examining detailed event data and applying statistical methods, teams can identify undervalued players, optimize lineup combinations, and develop strategies that maximize competitive advantages. Organizations like the Carolina Hurricanes, Toronto Maple Leafs, and Tampa Bay Lightning have built successful teams partly through analytics-driven decision making, using these insights to outperform competitors in player acquisition and tactical execution.
Key Components
- Data Collection: Gathering comprehensive play-by-play event data, including shots, passes, zone entries/exits, faceoffs, and tracking information for position and movement patterns.
- Statistical Analysis: Applying appropriate mathematical and statistical methods including regression analysis, machine learning models, and contextual adjustments to derive meaningful insights.
- Context Adjustment: Accounting for critical factors including score effects (trailing teams generate more shots), quality of competition and teammates (WOWY analysis), zone starts, and ice time deployment.
- Validation: Testing metric reliability through reproducibility, predictive power, and alignment with observed performance to ensure analytical conclusions are sound.
- Communication: Presenting findings through effective visualizations, clear explanations, and actionable recommendations that decision-makers can understand and implement.
Mathematical Formula
Metric = (Favorable Events) / (Total Events) × 100
Adjusted Metric = Raw Metric × Context Factor × Quality Adjustment
Per 60 Rate = (Event Count / Time on Ice in Minutes) × 60
These formulas illustrate common calculations in hockey analytics. Percentage-based metrics normalize for different amounts of ice time and team situations. Context factors adjust for score state, venue, and competition quality. Per-60 rates standardize metrics across players with varying ice time, enabling fair comparisons.
Python Implementation
import pandas as pd
import numpy as np
from hockey_scraper import scrape_games
from datetime import datetime
from sklearn.linear_model import LinearRegression
# Load NHL play-by-play data
pbp_data = scrape_games(datetime(2023, 10, 1), datetime(2024, 4, 15))
def calculate_metric(pbp_df, team_name, strength='5x5'):
"""
Calculate the metric for specified team at given strength state.
Parameters:
-----------
pbp_df : DataFrame
Play-by-play data from hockey_scraper
team_name : str
Three-letter team abbreviation (e.g., 'COL', 'TOR')
strength : str
Strength state filter (e.g., '5x5', '5x4', '4x5')
Returns:
--------
dict : Calculated metrics including raw values and contextual adjustments
"""
# Filter data
filtered = pbp_df[
(pbp_df['Strength'] == strength) &
((pbp_df['Home_Team'] == team_name) |
(pbp_df['Away_Team'] == team_name))
]
# Define relevant events
events_for = filtered[filtered['Ev_Team'] == team_name]
events_total = len(filtered)
# Calculate base metrics
event_count = len(events_for)
event_rate = (event_count / events_total * 100) if events_total > 0 else 0
# Time-normalized rate (per 60 minutes)
toi_estimate = len(filtered) / 60 # Rough TOI estimate
rate_per_60 = (event_count / toi_estimate) if toi_estimate > 0 else 0
return {
'team': team_name,
'event_count': event_count,
'event_rate': round(event_rate, 2),
'per_60': round(rate_per_60, 2),
'sample_size': events_total
}
# Calculate for multiple teams
teams = ['COL', 'TOR', 'CAR', 'TBL', 'BOS', 'EDM', 'VGK', 'NYR']
results = []
for team in teams:
result = calculate_metric(pbp_data, team)
results.append(result)
# Create results DataFrame
results_df = pd.DataFrame(results).sort_values('event_rate', ascending=False)
print("\nTeam Metrics (5v5):" )
print(results_df.to_string(index=False))
# Player-level analysis
def analyze_player_impact(pbp_df, player_name):
"""
Analyze individual player impact using on-ice metrics.
"""
# Filter events where player is on ice
player_on = pbp_df[
(pbp_df['p1_name'] == player_name) |
(pbp_df['p2_name'] == player_name) |
(pbp_df['p3_name'] == player_name)
]
# Calculate metrics when player is on ice vs off ice
on_ice_events = len(player_on)
on_ice_metrics = player_on.groupby('Ev_Team').size()
return {
'player': player_name,
'events_on_ice': on_ice_events,
'impact_score': on_ice_events / 100 # Simplified impact measure
}
# Advanced: Regression analysis for predictive modeling
def build_predictive_model(pbp_df):
"""
Build regression model to predict outcomes.
"""
# Prepare features and target
features_df = pbp_df.groupby('game_id').agg({
'Event': 'count',
'Period': 'max'
}).reset_index()
# Build model
X = features_df[['Event', 'Period']]
y = np.random.randint(0, 2, len(features_df)) # Placeholder target
model = LinearRegression()
model.fit(X, y)
return model
# Run predictive model
model = build_predictive_model(pbp_data)
print("\nPredictive model coefficients:", model.coef_)
R Implementation
library(tidyverse)
library(hockeyR)
library(fastRhockey)
# Load play-by-play data
pbp <- load_pbp(2023)
# Calculate team-level metrics
calculate_team_metric <- function(pbp_data, strength = "5v5") {
team_metrics <- pbp_data %>%
filter(strength_state == strength) %>%
group_by(event_team) %>%
summarise(
events = n(),
games = n_distinct(game_id),
goals = sum(event_type == "GOAL", na.rm = TRUE),
.groups = "drop"
) %>%
mutate(
events_per_game = events / games,
goals_per_game = goals / games,
events_per_60 = (events / games) * 60 / 60 # Normalized
) %>%
arrange(desc(events))
return(team_metrics)
}
# Execute analysis
team_results <- calculate_team_metric(pbp)
print(team_results)
# Visualization
ggplot(team_results %>% head(10),
aes(x = reorder(event_team, events), y = events)) +
geom_col(aes(fill = events), show.legend = FALSE) +
scale_fill_gradient(low = "lightblue", high = "darkblue") +
coord_flip() +
labs(
title = "NHL Team Metrics Leaders (5v5)",
subtitle = "2023-24 Season",
x = NULL,
y = "Event Count"
) +
theme_minimal() +
theme(
plot.title = element_text(size = 16, face = "bold"),
panel.grid.minor = element_blank()
)
# Player-level analysis
player_metrics <- pbp %>%
filter(strength_state == "5v5") %>%
filter(!is.na(event_player_1)) %>%
group_by(event_player_1, event_team) %>%
summarise(
events = n(),
games = n_distinct(game_id),
.groups = "drop"
) %>%
mutate(
events_per_game = events / games
) %>%
filter(games >= 10) %>%
arrange(desc(events))
# Advanced regression analysis
library(broom)
regression_model <- lm(goals ~ events + games, data = team_results)
summary(regression_model)
# Tidy model output
model_summary <- tidy(regression_model)
print(model_summary)
NHL Application
NHL organizations integrate this metric into comprehensive player evaluation frameworks, combining it with complementary statistics to form complete performance profiles. Teams use these insights for multiple critical functions: identifying trade targets who excel in this dimension but remain undervalued in traditional markets, evaluating draft prospects\' translatable skills, constructing optimal lineup combinations that maximize team performance, and making informed contract decisions in negotiations and arbitration cases. The metric also informs in-game tactical adjustments, helping coaches deploy personnel strategically.
Modern NHL analytics departments employ teams of analysts who process this data daily, updating dashboards and reports for coaches, scouts, and front office executives. Organizations like Evolving Hockey and Natural Stat Trick make similar metrics publicly available, democratizing access to advanced analytics. This transparency has elevated the overall analytical sophistication across the league, as teams must continuously innovate to maintain competitive advantages through proprietary data sources, novel methodologies, and superior interpretation of existing information.
Interpreting the Results
| Metric Range | Performance Level | Interpretation | Example Context |
|---|---|---|---|
| Top 10% | Elite | Exceptional performance; likely driving team success | Star players, championship-caliber teams |
| 40-60%ile | Average | Typical NHL-level performance; adequate contribution | Middle-six forwards, second-pair defensemen |
| Bottom 20% | Below Average | Struggling performance; may need lineup changes | Players in reduced roles or development needs |
| Extreme Outliers | Unsustainable | Likely influenced by luck; expect regression to mean | Small sample sizes, PDO-driven results |
Key Takeaways
- This metric provides valuable insights into hockey performance that complement traditional statistics, enabling more comprehensive and accurate player and team evaluation.
- Effective application requires understanding context including strength state, score effects, quality of competition and teammates, zone starts, and sample size considerations.
- NHL teams integrate this metric with complementary analytics to inform roster construction, lineup optimization, contract negotiations, and in-game strategic decisions.
- The metric should be interpreted alongside other relevant statistics rather than in isolation, as no single metric captures complete player or team performance.
- Public platforms like Natural Stat Trick and Evolving Hockey provide access to these analytics, while teams develop proprietary variations and methodologies for competitive advantages.