The art of the cutback in WSL
Oh hi there. It has been a while since we spoke in this capacity, hasn’t it? There’s no need to be sentimental about it, so let’s just get to it. I have been watching a lot of women’s football and I always try to avoid comparing players, styles and approaches to men’s football. However, I’ve seen an increase over the years of crosses and my feeling was that this wasn’t the same for WSL. Time to find out.
So how am I going to do that? There is an order to how I conduct this analysis:
- Context
- Data
- Methodology
- Code
- Analysis: Manchester United, Chelsea, Arsenal, Manchester City
- Final thoughts
Context
The attacking phases are of vital importance in any game, but what you do with the ball in that final third is of great importance. There are different ways of conducting your attack, but in this case, we look at how players/teams use wide areas to make the most of the attack by making those vital passes in the final phase. This means looking at the cutbacks in order to define two particular things.
The first thing is determining how important passing in the final third is for the wide players. Are they tasked with playing passes from the flanks and is that one of their important assets? The second thing is to determine what kind of striker or attacking midfielders are needed to be at the end of those cutbacks.
The underlying feeling is that in the WSL, many high transitioning football is played and therefore the play is a bit more chaotic, a bit more unstructured. By looking at this, we may determine whether this is a hunch or not.
We will only look at the most attacking successful teams and in this case, these are the teams battling for the title and/or UWCL spots in the 22/23 season in the WSL.
Data
We are looking for one specific metric in event data: Cutbacks. For that, I have collected Opta data and combined them all into a file so that I can have all WSL teams in the file. All data is up to date as of 5 May 2023 and consists of all 12 WSL teams.
It’s a large dataset, but that’s important because we want to plot all the passes of the current season. It’s important to stress that not all teams have played the same number of games, so some of the data might be a little skewed. But in my opinion, it gives a good general view of what the teams in question display on the pitch.
Methodology
I have the data, but how do I make sure this is all ready to be used for the analysis? I have an Excel file or CSV file with all the data and I will use Python to make a data selection, before making a visualisation that will help me in my analysis.
This can also be done with R or Tableau, but this is the preferred method for me as I’m most fluent in this programming language. Automation with large datasets is a lifesaver. Trust me.
I will select the right file, and the right teams and make sure they are only in the final third. You can also see that below in the code used.
Cutbacks
How do the current top 4 perform in the data with cutbacks? But first, what are cutbacks? That’s when “a player in the opposition’s penalty box reaches the byline and passes (cuts) the ball backwards to a team-mate” according to Opta.
We immediately encounter our first problem, it’s not always that easy to recognise in the data when Opta codes it differently than they mean.
What we see here from the cutbacks, especially from the right side, is that Manchester United want to reach the line and then cut back to the penalty spot. This indicated that a player comes in that position on the penalty spot and would love to connect.
Manchester City used their wingers more and wants to go deep. With Hemp and Chloe, they have great weapons and they can utilise that by cutbacks, especially for Bunny Shaw. They do that frequently both on the left and the right.
It seemed like the cutbacks from the left were more striker material and the cutbacks from the right more for attacking midfielders.
Chelsea does like playing cutbacks as well, but in comparison to Manchester City — they like to come into the box a little bit more away from the line. The delivery all goes into the area between the six-yard box and the penalty spot, which is a great zone for Sam Kerr.
From the top 4, Arsenal doesn’t use cutbacks as much, this can be seen in the visual above. With their players, they love to have early crosses and do that from transition, but that’s something we need to look more closely at when analysing the crosses next time.
Final thoughts
The use of cutbacks in football can be a crucial tactic for teams looking to score goals, especially when they have skilled players who can finish inside the box. As seen from the analysis, Manchester United, Manchester City, and Chelsea all utilise cutbacks to varying degrees, with different players being the target depending on the position of the cutback.
Meanwhile, Arsenal appears to rely more on early crosses from transition rather than cutbacks. It’s important to note that while cutbacks can be effective, they also require good delivery from the wingers and precise timing from the players making the runs.
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — —
Code
So, for this particular visualisation, I will share how I use Python to get where I want to be. First of all, you need to load the data.
import pandas as pd
import matplotlib.pyplot as plt
from highlight_text import fig_text
import matplotlib as mpl
from mplsoccer.pitch import Pitch
from mplsoccer.pitch import VerticalPitchfrom matplotlib import patches
import matplotlib.patheffects as path_effects
import numpy as np
from matplotlib.colors import LinearSegmentedColormap
from scipy.ndimage import gaussian_filter
from mplsoccer import Pitch, FontManager
import math
from matplotlib.colors import to_rgba
from scipy.spatial import ConvexHull
from matplotlib.offsetbox import OffsetImage, AnnotationBbox
df1 = pd.read_excel("wsl06052023.xlsx")
As you can see, I’ve imported many things, but you don’t need them all — I’ve been just a bit lazy with removing them. Most important one for loading the data is the last line, where I introduce the excel file used for the analysis.
df1 = df1.loc[(df1['contestantId']=='axwnneoekq2f2yq6r1l704y96')].reset_index()
Here I filter the data for the team I’m looking into. It can be different for any data frame, but my file has these weird names for the clubs.
pitch = VerticalPitch(pitch_type='opta', pad_bottom=0.5, pad_top=5, pitch_color='#242424', line_color='#a6a6a6',
linewidth=1, half=True, goal_type='box', goal_alpha=0.8)
fig, ax = pitch.draw()
figsize=(18, 12)
Then you make the pitch as seen here above. I’m making only half of the pitch available, as cutbacks and crosses are not relevant from our own half.
df1 = df1.loc[df1['x'] > 70]
df1 = df1.loc[df1['endX'] > 70]
for i, x in enumerate(df1['x']):
if 'outcome' in df1.columns and df1['outcome'].iloc[i] == 1 and df1['Cutback'].iloc[i] == 1:
end_x = pd.Series(df1['endX'].iloc[i]).astype(float)
end_y = pd.Series(df1['endY'].iloc[i]).astype(float)
pitch.arrows(df1['x'].iloc[i], df1['y'].iloc[i], end_x, end_y,
width=1.5, zorder=2, headwidth=5, headlength=5, color='#ad993c', ax=ax)
for i, x in enumerate(df1['x']):
if 'outcome' in df1.columns and df1['outcome'].iloc[i] == 0 and df1['Cutback'].iloc[i] == 1:
end_x = pd.Series(df1['endX'].iloc[i]).astype(float)
end_y = pd.Series(df1['endY'].iloc[i]).astype(float)
pitch.arrows(df1['x'].iloc[i], df1['y'].iloc[i], end_x, end_y,
width=1.5, zorder=2, headwidth=5, headlength=5, color='#ba4f45', ax=ax)
And then, we plot everything! Making sure first that it’s only passes in the final third and then plotting the passes that are successful/unsuccessful.
After that we obviously dress it up, so it also looks nice for us when we make the visuals:
# Change the background color to grey-black
fig.set_facecolor('#242424')
ax.set_title("Manchester United - Cutback\n Women's Super League 22/23", fontsize=10, color="w", fontfamily="Andale Mono", fontweight='bold', pad=8)# Define colors for legend labels
colors = {'Successful': '#ad993c', 'Unsuccessful': '#ba4f45'}# Plot the legend outside the pitch
ax.legend(handles=[patches.Patch(facecolor=color) for color in colors.values()],
labels=colors.keys(), labelcolor='w', loc='lower center', bbox_to_anchor=(0.5, -0.28),
ncol=2, frameon=False, fontsize=8)# Add text to the plot
fig.text(0.5, 0.005, "Marc Lamberts", fontsize=8, color="w", ha='center', va='center')
plt.savefig('MUFC Cutback.png', dpi=750, bbox_inches='tight', facecolor='#242424')
Cool! Now you know how to make the visuals, let’s go on to the actual analysis.