library(tidyverse)library(readxl)library(gt)library(scales)# The xlsx must sit in the same folder as this qmd when renderingdata_file <-"JJ_Scrums.xlsx"# Read everything as text - the sheet is four stacked year blocks,# not a tidy table, so we parse it manuallyraw <-read_excel(data_file, col_names =FALSE, col_types ="text")# Year header rows mark the start of each blockyear_rows <-which(raw[[1]] %in%as.character(2023:2026))block_ends <-c(year_rows[-1] -1, nrow(raw))# Pull each block out: column 1 = category, columns 2-16 = the 15 matchesparse_block <-function(s, e) { yr <-as.integer(raw[[1]][s]) raw[seq(s +1, e), ] |>rename(category =1) |>filter(!is.na(category)) |>select(category, 2:16) |>rename_with(~paste0("m", 1:15), .cols =2:16) |>mutate(across(starts_with("m"), as.numeric),year = yr)}scrums <-map2(year_rows, block_ends, parse_block) |>bind_rows() |>pivot_longer(starts_with("m"), names_to ="match", values_to ="count") |>mutate(count =replace_na(count, 0),category =str_trim(category))# Season-level summary. Matches = match columns with at least one# scrum coded, so partial seasons (2026) are handled automaticallyseason_summary <- scrums |>group_by(year) |>summarise(total_scrums =sum(count),matches =n_distinct(match[count >0]),per_match = total_scrums / matches,.groups ="drop" )# Share of season total by categoryshares <- scrums |>group_by(year, category) |>summarise(total =sum(count), .groups ="drop_last") |>mutate(share = total /sum(total)) |>ungroup()# Group the raw Sportscode categories into broader themestheme_lookup <-tribble(~category, ~theme,"Knock On In Phase Play", "Handling in open play","Forward Pass", "Handling in open play","Knock On in Tackle or Turnover", "Handling in open play","Ball Unplayable", "Handling in open play","Crossing", "Handling in open play","Knock On Chasing Own Kick", "Kicking game","Knock On Opp Kick Receiving", "Kicking game","Kicked Dead", "Kicking game","Not Kicked 10m", "Kicking game","Receiving A Restart", "Kicking game","Lineout Not Straight", "Set piece","Lineout Jumper Knock On In The Air", "Set piece","Turnover From Lineout Maul Defence", "Set piece","Lineout Receiver Change", "Set piece","Option From Full Penalty", "Penalty / free-kick option","Option From Half Arm Pen Restart", "Penalty / free-kick option","Choke Tackle", "Defensive pressure","Jackaller Knock On / Rip and Knock On","Defensive pressure","Carried Over Own Try Line", "Defensive pressure","Injury Stoppage", "Other","No Tap From a Tap and Go", "Other")shares <- shares |>left_join(theme_lookup, by ="category")
Introduction
The scrum is rugby’s reset button, but every scrum has a story behind it — a knock-on under pressure, a wobbly lineout throw, a spilled high ball. Over the last four Six Nations championships I have coded the cause of every scrum awarded, building a picture of why scrums happen at Test level and how that picture is shifting.
This report covers the 2023, 2024 and 2025 championships in full, plus the first three rounds of 2026. All data was collected and coded by the author in Hudl Sportscode.
How many scrums are there?
Show code
season_summary |>gt() |>cols_label(year ="Championship",total_scrums ="Scrums",matches ="Matches coded",per_match ="Scrums per match" ) |>fmt_number(columns = per_match, decimals =1) |>tab_source_note("2026 is a partial season; remaining rounds to be added.") |>opt_row_striping()
Table 1
Championship
Scrums
Matches coded
Scrums per match
2023
157
15
10.5
2024
159
15
10.6
2025
153
15
10.2
2026
65
6
10.8
2026 is a partial season; remaining rounds to be added.
Scrum volume has been remarkably stable: roughly 10 to 11 scrums per match in every championship since 2023. Whatever the law makers change around the scrum, the rate at which the game produces them has barely moved.
What has moved is where they come from.
What causes a scrum?
Show code
baseline <- shares |>filter(year <2026) |>group_by(category) |>summarise(total =sum(total), .groups ="drop") |>mutate(share = total /sum(total), period ="2023–25")current <- shares |>filter(year ==2026) |>transmute(category, total, share, period ="2026 (partial)")comparison <-bind_rows(baseline, current) |># order categories by baseline share, largest at the topmutate(category =fct_reorder(category, share,.fun = \(x) max(x[1]), .desc =FALSE))cat_order <- baseline |>arrange(share) |>pull(category)comparison |>mutate(category =factor(category, levels = cat_order)) |>filter(!is.na(category)) |>ggplot(aes(x = share, y = category, colour = period)) +geom_line(aes(group = category), colour ="grey75", linewidth =1) +geom_point(size =3) +scale_x_continuous(labels =percent_format(accuracy =1)) +scale_colour_manual(values =c("2023–25"="grey40","2026 (partial)"="#C8102E")) +labs(x ="Share of all scrums", y =NULL, colour =NULL,title ="Scrum sources, 2026 vs the three-season baseline") +theme_minimal(base_size =12) +theme(legend.position ="top",panel.grid.minor =element_blank())
Figure 1: Scrum sources: 2026 so far vs the 2023–2025 baseline
The headline is no surprise to anyone who watches the game: the knock-on in phase play is the engine room of scrum production, accounting for close to half of all scrums.
Show code
shares |>filter(category =="Knock On In Phase Play") |>ggplot(aes(x =factor(year), y = share)) +geom_col(fill ="#C8102E", width =0.6) +geom_text(aes(label =percent(share, accuracy =0.1)),vjust =-0.5, fontface ="bold") +scale_y_continuous(labels =percent_format(accuracy =1),limits =c(0, 0.58)) +labs(x =NULL, y ="Share of all scrums") +theme_minimal(base_size =12) +theme(panel.grid.major.x =element_blank(),panel.grid.minor =element_blank())
Figure 2: Knock-on in phase play as a share of all scrums, by championship
Worth noting the step change here. In 2023 the phase-play knock-on produced just over a third of scrums (36%). From 2024 onwards it has sat around the 46–49% mark. Teams are playing more phases at higher tempo, defences are getting more aggressive in the collision, and the result is more handling errors in open play.
The law change shows up in the data
In May 2024 World Rugby removed the scrum option from free kicks: from 1 July 2024, a free kick must be tapped or kicked. The 2025 championship was the first Six Nations played under the new law, and the data tells the story perfectly.
Show code
shares |>filter(theme =="Penalty / free-kick option") |>select(year, category, total) |>pivot_wider(names_from = year, values_from = total, values_fill =0) |>gt() |>cols_label(category ="Scrum source") |>tab_spanner(label ="Scrums per championship", columns =-category) |>tab_source_note("Scrum option from a free kick removed from 1 July 2024.") |>opt_row_striping()
Table 2
Scrum source
Scrums per championship
2023
2024
2025
2026
Option From Full Penalty
9
7
2
2
Option From Half Arm Pen Restart
5
5
0
0
Scrum option from a free kick removed from 1 July 2024.
Free-kick scrums went from a steady five per championship to zero overnight, exactly what the law intended. More interesting is the collapse in full-penalty scrum options, from nine in 2023 down to just two in 2025. Even where teams can still choose a scrum, they increasingly don’t.
2026: a kicking-game spike worth watching
Show code
shares |>filter(category %in%c("Knock On Chasing Own Kick","Knock On Opp Kick Receiving")) |>ggplot(aes(x =factor(year), y = share, fill = category)) +geom_col(width =0.65) +scale_y_continuous(labels =percent_format(accuracy =1)) +scale_fill_manual(values =c("Knock On Chasing Own Kick"="#C8102E","Knock On Opp Kick Receiving"="grey45"),labels =c("Chasing own kick", "Receiving opposition kick")) +labs(x =NULL, y ="Share of all scrums", fill =NULL) +theme_minimal(base_size =12) +theme(legend.position ="top",panel.grid.major.x =element_blank(),panel.grid.minor =element_blank())
Figure 3: Scrums caused by kick-chase and kick-receipt knock-ons, share by championship
The early 2026 rounds show a clear spike in scrums coming from the aerial battle. Knock-ons while chasing your own kick are running at around 12% of all scrums so far, roughly double the 5–7% range of the previous three championships. Combined with knock-ons receiving the opposition’s kick, the kicking game is currently producing close to one in five scrums.
It is early in the championship and the sample is small, so treat this with care. But it fits the eye test: more contestable box kicks, more bodies committed to the chase and escort lines, and more 50/50 balls hitting the deck.
The full picture by theme
Show code
theme_shares <- shares |>filter(!is.na(theme)) |>group_by(year, theme) |>summarise(share =sum(share), .groups ="drop") |>mutate(theme =fct_reorder(theme, share, .fun = sum, .desc =TRUE))theme_shares |>ggplot(aes(x =factor(year), y = share, fill = theme)) +geom_col(width =0.65) +scale_y_continuous(labels =percent_format(accuracy =1)) +scale_fill_brewer(palette ="Dark2") +labs(x =NULL, y ="Share of all scrums", fill =NULL) +theme_minimal(base_size =12) +theme(panel.grid.major.x =element_blank(),panel.grid.minor =element_blank())
Figure 4: Scrum sources grouped by theme, share of each championship
Three things stand out from four championships of scrum-source data.
First, the scrum count is stable but its make-up is not. The phase-play knock-on has grown from a third of all scrums to nearly half, which says as much about modern defensive line speed and attacking tempo as it does about handling skills.
Second, law changes leave fingerprints. The removal of the free-kick scrum option in July 2024 shows up instantly and completely in the 2025 data.
Third, the 2026 aerial-contest spike is the one to watch. If kick-chase knock-ons keep producing one scrum in eight through the back half of the championship, the kicking game will have become a meaningfully bigger driver of set-piece opportunities than at any point in this dataset.
Data collected and coded by the author in Hudl Sportscode from all Six Nations matches, 2023–2026. Analysis in R and Quarto.