Goalie Workload and Fatigue

Intermediate 10 min read 396 views Nov 25, 2025

Goalie Workload and Fatigue

Understanding Goalie Workload and Fatigue is essential for comprehensive goaltending analytics. This metric focuses on goaltender performance, providing insights that extend beyond traditional box score statistics. Modern NHL teams rely heavily on these analytics to inform roster decisions, strategic planning, and in-game adjustments. By combining play-by-play data, tracking information, and statistical modeling, Goalie Workload and Fatigue reveals patterns that help teams gain competitive advantages. This analysis examines save percentage, goals against average, and expected goals saved to provide actionable insights for coaches, general managers, and analysts.

Key Concepts

Understanding Goalie Workload and Fatigue requires mastering several fundamental concepts:

  • Data Collection: Gathering play-by-play data, tracking information, and manual charting to build comprehensive datasets for analysis
  • Statistical Methods: Applying regression analysis, machine learning, and probabilistic models to extract meaningful insights from raw data
  • Contextual Adjustments: Accounting for score effects, zone starts, quality of competition, quality of teammates, and venue effects
  • Rate Metrics: Normalizing statistics per 60 minutes of ice time to enable fair comparisons across players with different usage patterns
  • Relative Performance: Comparing individual metrics to team averages and league benchmarks to identify standout performers

Mathematical Foundation

Per-60 Rate: Metric per 60 = (Event Count / Ice Time in Minutes) × 60

Relative Metric: Relative % = ((Player Rate - Team Average) / Team Average) × 100

Expected Value: xMetric = Σ(Event Probability × Event Value)

Above Replacement: Metric Above Replacement = Player Value - Replacement Level

Python Implementation


import pandas as pd
import numpy as np
from hockey_scraper import scrape_games

def analyze_hockey_metric(data):
    """
    Analyze Goalie Workload and Fatigue metrics

    Parameters:
    -----------
    data : DataFrame
        Play-by-play or aggregated hockey statistics

    Returns:
    --------
    DataFrame with calculated metrics and rates
    """
    # Group by team and player
    results = data.groupby(['team', 'player']).agg({
        'games': 'nunique',
        'toi': 'sum',
        'events': 'sum',
        'xg': 'sum',
        'shots': 'sum',
        'goals': 'sum'
    }).reset_index()

    # Calculate per-60 rates
    results['toi_minutes'] = results['toi'] / 60
    results['metric_per_60'] = (results['events'] / results['toi_minutes']) * 60
    results['xg_per_60'] = (results['xg'] / results['toi_minutes']) * 60

    # Calculate relative metrics
    team_avg = results.groupby('team')['metric_per_60'].mean()
    results['rel_metric'] = results.apply(
        lambda x: ((x['metric_per_60'] - team_avg[x['team']]) /
                   team_avg[x['team']]) * 100,
        axis=1
    )

    return results.sort_values('metric_per_60', ascending=False)

# Example usage
pbp_data = scrape_games('2023-10-01', '2024-04-15')
analysis = analyze_hockey_metric(pbp_data)
print(analysis.head(10))

# Visualization
import matplotlib.pyplot as plt
top_20 = analysis.head(20)
plt.figure(figsize=(12, 6))
plt.barh(top_20['player'], top_20['metric_per_60'])
plt.xlabel('Metric per 60 Minutes')
plt.title('Goalie Workload and Fatigue - Top 20 Players')
plt.tight_layout()
plt.show()

R Implementation


library(hockeyR)
library(tidyverse)

# Analyze Goalie Workload and Fatigue
analyze_metric <- function(pbp_data) {
  results <- pbp_data %>%
    group_by(team = event_team_name, player = event_player_1_name) %>%
    summarise(
      games = n_distinct(game_id),
      toi = sum(time_elapsed, na.rm = TRUE),
      events = n(),
      xg = sum(xg, na.rm = TRUE),
      shots = sum(event_type %in% c('SHOT', 'GOAL'), na.rm = TRUE),
      goals = sum(event_type == 'GOAL', na.rm = TRUE),
      .groups = 'drop'
    ) %>%
    mutate(
      toi_minutes = toi / 60,
      metric_per_60 = (events / toi_minutes) * 60,
      xg_per_60 = (xg / toi_minutes) * 60
    )

  # Calculate relative metrics
  team_avg <- results %>%
    group_by(team) %>%
    summarise(avg_metric = mean(metric_per_60, na.rm = TRUE))

  results <- results %>%
    left_join(team_avg, by = 'team') %>%
    mutate(
      rel_metric = ((metric_per_60 - avg_metric) / avg_metric) * 100
    ) %>%
    arrange(desc(metric_per_60))

  return(results)
}

# Load and analyze
pbp <- load_pbp(2023)
metric_results <- analyze_metric(pbp)

# Visualize
library(ggplot2)
top_20 <- metric_results %>% head(20)

ggplot(top_20, aes(x = reorder(player, metric_per_60), y = metric_per_60)) +
  geom_col(fill = 'steelblue') +
  coord_flip() +
  labs(
    title = 'Goalie Workload and Fatigue - Top 20 Players',
    x = 'Player',
    y = 'Metric per 60 Minutes'
  ) +
  theme_minimal()

print(metric_results)

Practical Applications

Goalie Workload and Fatigue analytics are used extensively by NHL teams to evaluate player performance, inform roster decisions, and develop strategic game plans. Front offices use these metrics in contract negotiations, trade evaluations, and free agent signings to ensure efficient resource allocation. Coaching staffs leverage this information to optimize line combinations, special teams units, and deployment strategies. Scouts integrate these analytics with traditional evaluation to identify undervalued players and prospects. Understanding Goalie Workload and Fatigue helps teams make data-driven decisions that impact both immediate success and long-term team building.

Key Takeaways

  • Advanced metrics like Goalie Workload and Fatigue reveal insights that traditional statistics miss
  • Context is crucial - adjust for competition quality, teammates, zone starts, and score effects
  • Multiple complementary metrics provide more complete evaluations than single statistics
  • Analytics work best when integrated with traditional scouting and coaching expertise
  • Continuous validation ensures metrics remain predictive and valuable for decision-making

Discussion

Have questions or feedback? Join our community discussion on Discord or GitHub Discussions.