Case Study 02: Fatigue Detection and Substitution Timing

Overview

One of the highest-value applications of tracking data in professional soccer is fatigue detection: identifying when a player's physical output has declined to a point where a substitution would benefit the team. Coaches have traditionally relied on intuition, visible signs of fatigue (hands on knees, slower recovery runs), and pre-planned substitution strategies. Tracking data offers the potential to objectify this decision.

In this case study we build a fatigue detection and substitution recommendation system using synthetic tracking data. The system monitors real-time physical metrics, compares them to each player's baseline, and generates substitution alerts when performance drops below critical thresholds.

Objectives

  1. Establish per-player baseline physical profiles from the first half.
  2. Monitor rolling work rate, HSRD, and sprint frequency in real time during the second half.
  3. Detect transient and progressive fatigue episodes.
  4. Compute the Acute-to-Chronic Workload Ratio (ACWR) using a 28-day training history.
  5. Generate substitution recommendations with timing and priority.

Data and Setup

Match data: Synthetic 25 Hz tracking data for 11 home-team players over 95 minutes. Each player's trajectory is generated with realistic speed distributions calibrated by position.

Training data: A 28-day history of daily total distance and HSRD for the same 11 players, simulating a typical in-season training cycle (4 training sessions per week plus 1 match).

Step 1: First-Half Baseline Profiling

For each player, we compute the following first-half metrics:

Metric Definition
Mean work rate Total distance / 45 minutes (m/min)
Mean HSRD rate High-speed distance / 45 minutes (m/min)
Sprint frequency Sprints per 5-minute interval
Peak speed Maximum instantaneous speed achieved
Acceleration count Number of accelerations > 3 m/s$^2$

These form each player's individual baseline. Second-half performance is evaluated relative to this baseline rather than a fixed threshold, accommodating positional and individual differences.

def compute_first_half_baseline(player_tracking, fps=25):
    """Compute per-player physical baselines from first-half data."""
    # See code/case-study-code.py for full implementation

Sample first-half baselines:

Position Work Rate (m/min) HSRD Rate (m/min) Sprint Freq (/5min)
CM 128.5 10.2 1.8
CB 105.3 4.1 0.9
Winger 118.7 13.5 2.4
Striker 112.0 11.8 2.1

Step 2: Real-Time Fatigue Monitoring

During the second half, we compute 5-minute rolling windows for each metric and compare to the first-half baseline:

$$ \text{Fatigue Ratio}(t) = \frac{M_{\text{rolling}}(t)}{M_{\text{baseline}}} $$

A fatigue ratio below 0.80 for any single metric, or below 0.85 for two or more metrics simultaneously, triggers a fatigue alert.

Progressive Fatigue Detection

We track the cumulative fatigue ratio over time:

  • Minutes 45--60: Most players maintain 90--100% of baseline.
  • Minutes 60--75: Central midfielders typically drop to 82--88%.
  • Minutes 75--90: Full-backs and wingers show the steepest declines, often reaching 70--78% of baseline HSRD.

Transient Fatigue Detection

Transient fatigue episodes --- temporary performance dips following intense passages --- are detected by identifying periods where the 1-minute rolling work rate drops below 70% of the match average for at least 3 consecutive minutes, preceded by a high-intensity period (above 130% of average for at least 1 minute).

In our simulated match, we detect 7 transient fatigue episodes, with an average duration of 3.8 minutes and an average recovery time of 4.2 minutes.

Step 3: ACWR Analysis

Using the 28-day training history, we compute each player's ACWR:

$$ \text{ACWR} = \frac{W_{\text{acute (7 days)}}}{W_{\text{chronic (28 days)}}} $$

Player ACWR (Total Distance) ACWR (HSRD) Risk Zone
CM (starter) 1.15 1.22 Moderate
CB (starter) 0.95 0.88 Optimal
LW (starter) 1.35 1.48 Elevated
RB (starter) 1.08 1.12 Optimal

The left winger's ACWR of 1.48 for HSRD places them in the elevated risk zone (>1.3). This player should be monitored closely for early fatigue signs and considered for a planned substitution around minute 65.

Step 4: Substitution Recommendation Algorithm

The recommendation system combines real-time fatigue metrics with ACWR context:

def recommend_substitutions(fatigue_data, acwr_data, current_minute):
    """Generate prioritised substitution recommendations."""
    # See code/case-study-code.py for full implementation

Decision logic:

  1. Immediate substitution (priority 1): Fatigue ratio < 0.70 for work rate OR < 0.65 for HSRD.
  2. Recommended substitution (priority 2): Fatigue ratio < 0.80 for 10+ minutes AND ACWR > 1.3.
  3. Monitor closely (priority 3): Fatigue ratio < 0.85 for any metric OR ACWR > 1.2.

Match Timeline of Recommendations

Minute Player Priority Reason
62 LW 3 HSRD ratio at 0.84, ACWR = 1.48
68 LW 2 HSRD ratio at 0.76, sustained for 6 min
72 CM 3 Work rate ratio at 0.83
74 LW 1 HSRD ratio at 0.62
78 CM 2 Work rate ratio at 0.78, 6 min below threshold
83 RB 3 Sprint frequency at 0.82

The system would have recommended substituting the LW by minute 68 (priority 2). Waiting until minute 74 (when the alert escalates to priority 1) risks both reduced team performance and increased injury probability.

Step 5: Validation

To validate the system, we compare substitution recommendations against two benchmarks:

  1. Actual substitution timing (typical Bundesliga pattern): Most managers make their first substitution between minutes 55--65. Our system aligns well, with the first priority-2 alert at minute 68.

  2. Post-match physical output: Players who were flagged by the system but not substituted covered 18% less HSRD in their remaining minutes compared to their first-half rate. Players who were substituted at the recommended time were replaced by fresh players who achieved 95% of the starter's first-half HSRD rate.

Tactical Insights

  1. Position-specific fatigue patterns: Central midfielders show the earliest decline in total work rate, while wingers show the earliest decline in HSRD. This suggests different substitution strategies for different positions.

  2. Match-state effects: When trailing, players temporarily increase work rate (by ~8%), masking fatigue. The HSRD ratio is more resistant to this motivational effect and thus a more reliable fatigue indicator.

  3. Five-substitute rule impact: The expanded substitution allowance in modern football makes data-driven substitution timing more valuable, as coaches have more opportunities to act on fatigue alerts.

Code Reference

The full implementation of this case study is provided in code/case-study-code.py (Section 2), including baseline profiling, rolling fatigue monitoring, ACWR computation, and the substitution recommendation algorithm.

Discussion Questions

  1. How would you account for tactical changes (e.g., switching from a high press to a low block) that deliberately reduce physical output but do not indicate fatigue?
  2. Should the fatigue model treat all speed zones equally, or should high-intensity metrics receive more weight? Justify your answer physiologically.
  3. A player's ACWR for HSRD is 1.45 but their in-match fatigue ratio is 0.92 at halftime. How would you reconcile these conflicting signals in your substitution recommendation?