Manchester United Injury Analysis using injurytools

Quantifying the Defensive Crisis with injurytools

William Eyambe

Manchester United FC

The Injury Crisis

A Defensive Crisis

Manchester United’s 2025/26 campaign was heavily impacted by a lack of physical continuity.

  • Previous Performance: Inconsistent results were directly tied to an inability to field a stable defensive line.
  • The Core Issue: High Injury Burden, the combination of high frequency (many knocks) and high severity (long-term absences like Lisandro Martínez).
  • The Result: Tactical compromises that led to increased goals against and dropped points.

The Solution: injurytools

To move from reactive treatment to proactive prevention, we utilize the injurytools R package.

  • Standardization: Centralizes medical and coaching logs into a single injd object.
  • Monitoring: Tracks Incidence Rates (injuries per 1,000 player-hours).
  • Prevention: Identifies high-risk players to inform training load management before a minor knock becomes a major tear.

Load Libraries & Data

library(injurytools)
library(tidyverse)
library(readxl)
library(knitr)

history <- read_excel(
  "Manchester United 25-26 Injury Report - Copy.xlsx",
  sheet = "Injury History 2025-26"
) |>
  mutate(
    `From Date` = as.Date(`From Date`),
    `To Date`   = as.Date(`To Date`)
  )

glimpse(history)
Rows: 31
Columns: 8
$ Position          <chr> "MF", "MF", "MF", "MF", "DF", "DF", "DF", "FW", "FW"…
$ `Player Name`     <chr> "Bruno Fernandes", "Casemiro", "Casemiro", "Casemiro…
$ `Days Out`        <dbl> 11, 12, 4, 2, 26, 59, 2, 27, 2, 30, 13, 2, 8, 58, 21…
$ `From Date`       <date> 2025-12-25, 2025-09-21, 2025-11-19, 2025-12-20, 202…
$ `To Date`         <date> 2026-01-05, 2025-10-03, 2025-11-23, 2025-12-22, 202…
$ `Injury/Ban Type` <chr> "Thigh Injury", "Red Card", "Knock", "Yellow Cards",…
$ `Injury Category` <chr> "Injury", "Suspension", "Injury", "Suspension", "Inj…
$ Severity          <chr> "Moderate", "Moderate", "Minor", "Minor", "Moderate"…

Standardize with injurytools

df_inj <- prepare_inj(
  df_injuries0   = history,
  person_id      = "Player Name",
  date_injured   = "From Date",
  date_recovered = "To Date"
)

head(df_inj)
# A tibble: 6 × 8
  Position person_id    `Days Out` date_injured date_recovered `Injury/Ban Type`
  <chr>    <fct>             <dbl> <date>       <date>         <chr>            
1 MF       Bruno Ferna…         11 2025-12-25   2026-01-05     Thigh Injury     
2 MF       Casemiro             12 2025-09-21   2025-10-03     Red Card         
3 MF       Casemiro              4 2025-11-19   2025-11-23     Knock            
4 MF       Casemiro              2 2025-12-20   2025-12-22     Yellow Cards     
5 DF       Dalot                26 2025-08-31   2025-09-26     Muscle Injury    
6 DF       de Ligt              59 2025-12-14   2026-02-11     Back Injury      
# ℹ 2 more variables: `Injury Category` <chr>, Severity <chr>

Average Days Out by Position

df_inj |>
  group_by(Position) |>
  summarise(Avg_Days_Out = mean(`Days Out`, na.rm = TRUE)) |>
  arrange(desc(Avg_Days_Out))
# A tibble: 4 × 2
  Position Avg_Days_Out
  <chr>           <dbl>
1 DF               45.6
2 FW               17.7
3 MF                9  
4 GK                7  

Injury Severity Breakdown

df_inj |>
  count(Severity) |>
  ggplot(aes(x = reorder(Severity, n), y = n)) +
  geom_col() +
  labs(
    title = "Man Utd 2025/26 — Injuries by Severity",
    x = "Severity",
    y = "Number of Injuries"
  )

Building the injd Object

season_days <- as.numeric(as.Date("2026-05-31") - as.Date("2025-08-01"))

# Estimate minutes played: 38 matches x 90 min, prorated by availability
df_exp_raw <- history |>
  group_by(`Player Name`) |>
  summarise(days_out = sum(`Days Out`, na.rm = TRUE)) |>
  mutate(
    year      = 2025L,
    time_expo = round(pmax(0, (season_days - days_out) / season_days) * 38 * 90)
  )

df_exp <- prepare_exp(df_exposures0 = df_exp_raw,
                      person_id     = "Player Name",
                      date          = "year",
                      time_expo     = "time_expo")

my_injd <- prepare_all(data_exposures = df_exp,
                       data_injuries  = df_inj,
                       exp_unit       = "matches_minutes")

Man Utd 2025/26 Injury Timeline

gg_photo(my_injd,
         title   = "Man Utd 2025/26 — Injury Timeline",
         by_date = "1 month")