Visualizing Directional Tackle Data

Ashley Evert’s 2006 thesis found that ball carriers had a distinct advantage over defenders forced to tackle with their non-dominant shoulder. Evert’s premise was that rugby players are predominantly stronger with their right shoulders compared to their left. This premise was supported by his analysis of try scoring origination data from the 2003-2005 Super 12 Rugby competition. Per Evert’s analysis, a tackler’s direction of approach is an important predictor of tackle success.

This article describes an approach to visualizing directional tackle data. We use a clock face metaphor to categorize the tackler’s angle of approach. The ball carrier’s running line is always 12 o’clock. The defender’s tracking angle is the clock face number corresponding to the tackler’s angle of approach relative to the ball carrier’s running line. 6 is directly behind the ball carrier. 12 is directly in front, and so on.

In this article we use example data and code to demonstrate tackle visualization by tracking angle.


Visualize team tackles

We begin by visualizing team directional tackle data. First we generate tackle data to simulate a contest. Next we plot made and missed tackles in a bar chart. Then we plot the same data in a polar coordinate chart that visualizes tracking angles.

  1. Load supporting libraries for displaying and manipulating the data.
library(dplyr)
library(ggplot2)
library(tidyr)
  1. Simulate tackle data by generating a random matrix of tackle attempts from each direction.
set.seed(9940)
T <- data.frame(dir = 1:12, att = sample(5:12, 12, replace=TRUE))
head(T, 5)
##   dir att
## 1   1  10
## 2   2   9
## 3   3   8
## 4   4   9
## 5   5  10
  1. Divide the attempts into made and missed tackles. Then calculate the tackle efficiency for each direction. Tackle efficiency is the ratio between made and missed tackles. An efficiency of 1.0 means the team made every tackle from that direction.
T <- T %>% 
  mutate(made = att - ceiling(att*runif(12, 0, .3))) %>% 
  mutate(miss = att - made) %>%
  mutate(eff = round(made/att,2)) 

T$eff[is.nan(T$eff)] <- NA
  1. Calculate cumulative tackle statistics for all directions: attempts, made, and efficiency.
tmade <- sum(T$made)
tatt <- sum(T$att)
eff <- round(tmade/tatt,2)
cat("Attempts:", tatt, "\nMade:", tmade, "\nEfficiency:", eff)
## Attempts: 103 
## Made: 83 
## Efficiency: 0.81
  1. Put the data in long format so we can plot it in a stacked bar chart.
Tl <- T %>% 
  gather(res, count, made:miss) %>% 
  select(dir, res, count)
  1. Visualize team tackle data in a stacked bar chart.
  ggplot(Tl, aes(factor(dir), count, fill=factor(res))) + 
  geom_bar(width=.75, stat="identity") +
  scale_fill_grey(name="Tackle\nResult", start=.5, end=.1) + 
  xlab("Direction") +
  ylab("Tackle Count") +
  ggtitle("Tackle Attempts by Direction")

This chart plots made and missed tackles by direction. The number of tackle attempts in each direction determines bar height.

  1. Visualize the same data in a polar coordinate chart. This chart visually maps the frequency of tackles made and missed to the defender’s tracking angle.
ggplot(Tl, aes(factor(dir), count, fill=factor(res))) + 
  geom_bar(width=1, stat="identity", color="white") + coord_polar() + 
  scale_fill_grey(name="Tackle\nResult", start=.5, end=.1) + 
  theme(axis.ticks=element_blank(), 
        axis.text.y=element_blank(),
        axis.title.y=element_blank(),
        axis.title.x=element_blank()) + 
  ggtitle("Tackle Attempts by Direction")

Interpret results

The polar coordinate and bar charts show the same data. While the latter accurately conveys the information, the former makes it easier to visualize the directional tackle data. Tackle attempt frequency increases as we move from the center of the chart. The different colors represent the number of tackles made and missed in each direction.

The example data reveal that the majority team’s tackle attempts – and tackle completions – were from behind. (dirs 8-5) The team had fewer frontal tackle attempts (dirs 11-1) and completed a lower percentage of them relative to the rear tackles. They were slightly more efficient with left shoulder tackles (dirs 11-7) than right (dirs 5-1). The greater proportion of rear tackle attempts with the left shoulder partially explains the left shoulder dominance. Rear tackles are easier to complete than frontal or lateral tackles.


Visualize player tackles

In this section we apply the same tackle visualization techniques to individual players.

  1. Build a data frame for the team. Each player has a name, number, and position.
names <- c("Sherwood", "Liberman", "Woodman", "Frieden", "Kivell", "Meyer", "Soto", "Steanson", "Hoetger", "Laibowitz", "Christie")
numbers=c("33", "44", "16", "40", "20", "35", "56", "87", "70", "41", "87")
position=c("LB", "DB", "DB", "DL", "LB", "DB", "LB", "LB", "DL", "DL", "DL")
team <- data.frame("name"=names, "number"=numbers, "position"=position)
  1. This code blocks simulates tackles. Each player attempts 0-9 tackles in each direction and completes a percentage of them.
player_tackle_attempts <- matrix(sample(0:9, 132, replace=TRUE), 
                                 ncol=12, nrow=11)
player_tackles_made <- 
  ceiling(player_tackle_attempts-player_tackle_attempts * runif(length(player_tackle_attempts),
                                                              0, .6))
  1. Clean the tackle data: add column/row names and replace NAs with 0s for tackles made.
player_tackles_made[is.na(player_tackles_made)] <- 0
colnames(player_tackle_attempts) <- paste(1:12, "ta", sep="")
colnames(player_tackles_made) <- paste(1:12, "tm", sep="")
  1. Create a tackle efficiency matrix. For each direction, divide tackles made by tackle attempts.
player_tackles <- round(player_tackles_made/player_tackle_attempts,2)
colnames(player_tackles)<-c(1:12)
team_tackles <- cbind(team,player_tackles)
head(team_tackles)
##       name number position    1    2    3    4    5    6    7    8    9  10
## 1 Sherwood     33       LB 0.44  NaN  NaN 1.00  NaN 0.80  NaN 0.67 1.00 0.6
## 2 Liberman     44       DB 1.00 0.67 0.56 0.75 0.71  NaN 0.50 0.78 0.80 1.0
## 3  Woodman     16       DB  NaN 1.00 1.00 1.00 0.67 0.80 0.71 0.43 1.00 1.0
## 4  Frieden     40       DL 1.00 0.67 1.00 0.50 1.00 1.00 0.75 0.60 0.67 NaN
## 5   Kivell     20       LB 1.00  NaN 0.56 1.00 0.78 0.67 0.67 0.57 1.00 1.0
## 6    Meyer     35       DB 0.67 1.00 0.71 0.75 1.00  NaN 0.78 1.00 0.67 0.8
##     11   12
## 1 1.00 0.89
## 2 1.00 0.67
## 3 0.67 1.00
## 4 1.00 1.00
## 5 1.00 0.56
## 6 1.00  NaN
  1. Calculate directional tackle efficiency for each player.
player_eff <- round(apply(player_tackles_made, 1, sum)/apply(player_tackle_attempts, 1, sum),2)
  1. Calculate summary statistics for most efficiency player, and most/least efficient direction for the whole team.
dir_eff <- round(apply(player_tackles_made, 2, sum)/apply(player_tackle_attempts, 2, sum),2)
max_dir <- paste(which.max(dir_eff), "(", max(dir_eff), ")")
min_dir <- paste(which.min(dir_eff), "(", min(dir_eff), ")")
max_player <- paste(names[which.max(player_eff)], ":", max(player_eff))

Most efficient player: Christie : 0.92
Most efficiency direction (all players): 11 ( 0.89 )
Least efficient direction (all players): 8 ( 0.69 )

  1. Specify the location of the background grid prior to visualizing the tackle data.
locations <- matrix(c(2,4,6,8,2,4,6,8,2,4,6,6,6,6,6,4,4,4,4,2,2,2), ncol=2, nrow=11)
circles <- matrix(1.0, ncol=12, nrow=11)
circles[is.nan(player_tackles[,1:12])] <- 0

The spokes of the background circle represent all of the tackle attempts from that direction. No spoke is drawn for directions where no tackles were attempted.

  1. Plot directional player tackle efficiency on top of the background grid. The black spoke length represents the percentage of tackles made in each direction.
stars(circles, radius=TRUE, draw.segments=FALSE, locations=locations,
      labels=paste(numbers, names, player_eff), flip.labels=FALSE, scale=FALSE, len=.75,
      main = bquote("Directional Tackle" ~ epsilon ~ "by Player"))

stars(team_tackles[,c(6:4,15:7)], draw.segments=FALSE, scale=FALSE, 
      radius=TRUE, key.loc=c(8,2), labels=NULL, locations=locations,
      len=.75, lwd=2, add=TRUE, frame.plot=TRUE)

Interpret results

Each chart represents a player. The black spokes plot tackle completion percentage. The gray spokes represent all attempts in each direction. The player made 100% of his tackles in the directions where the black spoke completely covers the gray spoke. Missing spokes mean the player did not attempt any tackles in that direction.

Hoetger, for example, completed most of his frontal tackle attempts. He struggled to complete tackles when chasing the ball carrier from behind. (dirs 4-8) This is a typical tackle profile for a defensive lineman in football.

Soto completed the majority of his tackle attempts in every direction. His tackle profile is almost ideal.

Christie’s profile is typical of a right shoulder dominant tackler. Many excellent tacklers show shoulder dominance. They are adept at using their tracking angle to force ball carriers to their dominant shoulder. Laibowitz also shows right shoulder preference.

Liberman’s profile could indicate a left shoulder dominant tackle forced to attempt right shoulder tackles by positioning or footwork.


Discussion

This article demonstrates how to quantify and visualize directional tackle data from rugby or American football. Coaches can analyze individual players, positions, or the entire team, and apply the results to practice plans, player selections, and game plans.

Classifying tackles by direction reveals:

  1. Tacking angle frequency
  2. Strong/weak angles
  3. Shoulder dominance
  4. Areas for improvement

We used a polar coordinate plot to visualize team tackle attempts and completions by direction. The individual player plots visualize tackle efficiency in each direction. However, the player graph can be used to summarize team tackle efficiency, and the team graph can be used to quantify tackle attempts for individual players. Taken together, these visualization techniques and the accompanying clock face metaphor provide an intuitive framework for analyzing tackle data.

One direction for future work is applying this visualization technique to recorded (rather than simulated) tackle data from actual competitions.