Contextualizing Pressing — Possession Recovery Before Interruption

Here’s another stat you won’t find on FBref

Chun Hang
7 min readMar 2, 2024

Written by Lee Chun Hang (@chunhang7 on X and IG)

Writer’s Note: Open to football analytics opportunities. Freelance or part-time. DM on socials or email me at leechunhang04@gmail.com to connect!

Let’s Talk About Pressing

Pressing has now become so prevalent in the modern game that everybody talks about it — Your social league team probably implemented it, your mate probably shared Tifo videos of De Zerbi ‘baiting the press’ with you, even you have probably cranked up the ‘Trigger Press’ meter to ‘Much More Often’ on FM (we’ve all done it).

Credit: Football Manager

Yet despite the interest, traditional statistics still struggle to contextualize pressing structures and effectiveness, which highlights a significant gap between our interest and quantification.

Hold on, What About PPDA?

Yes, Passes per Defensive Action (PPDA) is a popular metric for assessing pressures. However, it’s heavily misused as a guide towards a team’s pressing intensity when used in isolation.

This is mainly due to its omission of the duration of possession in its calculation. PPDA overlooks the varying duration between ball possession and ball recovery from opponents, consequently failing to contextualize the effectiveness of the press. For instance, it may assign the same PPDA to scenarios with varying possession durations, thus providing incomplete insights into defensive performance.

Besides, PPDA primarily reflects a team’s defensive intensity in the attacking third. This means that possession-oriented teams tend to have healthier PPDA values, as their defensive actions occur further up the pitch due to the advanced location of their gameplay, even in the absence of a pressing strategy.

Redefining Pressures

While PPDA calculations remain relevant for understanding pressing styles, they should be supplemented with a different metric that contextualizes pressing intensity.

Instead of using successful passes as part of the formula, focusing on unsuccessful passes as a trigger point could provide insights into how a press is coordinated. It is from this logic that the inspiration arises to quantify and contextualize pressing via Possession Recovery Before Interruption (PRBI).

Breaking Down PRBI

In essence, Possession Recovery Before Interruption refers to the instances where a team successfully regains possession (3) after losing possession (2), occurring prior to any breaks-in-play (1).

1. Breaks-In-Play: This is where we draw the line between “Possession Recovery” and “Pressing”. By applying this filter, we focus on successful recoveries made within a specific phase of play before the ball exits the field or a foul is committed. This approach ensures that only recoveries leading to immediate control are considered, removing instances where possession is lost via set pieces.

Moreover, it provides a more accurate measure of the time required for possession recovery by excluding stoppages from interruptions. Thus, providing insight into the speed and efficiency of the recovery. Therefore, any possession that is recovered via set-pieces are discarded in this metric as possession was not directly regained.

By focusing on the duration of possession recovery phases before the breaks-in-play, the metric evaluates how quickly and effectively a team transitions from a defensive to an attacking phase of play.

#Break in play
df['Break'] = np.where(((df['GoalKick'].shift(-1)==True) | (df['FreekickTaken'].shift(-1)==True) |
(df['CornerTaken'].shift(-1)==True) | (df['ThrowIn'].shift(-1)==True) |
(df['type_displayName'] == 'End')),1,0)

2. Losing Possession: Before the ball is recovered, it must first be lost. Thus, we look at instances where a team loses possession through dispossessions or turnovers during open play, such as unsuccessful passes, getting tackled while dribbling, or having shots blocked.

It’s important to note that possession must be surrendered to opponents directly for it to be considered a “Possession Loss.”

#Unsuccessful Passes
df['UP'] = np.where((df['type_displayName'] == 'Pass') & (df['outcomeType_displayName'] == 'Unsuccessful') &
(df['teamId'].shift(-1) != df['teamId']) &
(df['endY'] > 0) & (df['endY'] < 80) & (df['endX'] > 0) & (df['endX'] < 120),1,0)
#Dispossessed
df['DP'] = np.where((df['type_displayName'] == 'Dispossessed') &
(df['outcomeType_displayName'].shift(-1) == 'Successful') & (df['Tackle_OoB'].shift(-1) == 0),1,0)

#TakeOns
df['TO'] = np.where((df['type_displayName'] == 'TakeOn') & (df['outcomeType_displayName'] == 'Unsuccessful') &
(df['Tackle_OoB'].shift(-1) == 0) & (df['teamId'].shift(-1) != df['teamId']) ,1,0)

#SavedShot
df['SS'] = np.where((df['type_displayName'] == 'SavedShot') & (df['type_displayName'].shift(-1) == 'BallRecovery') &
(df['teamId'].shift(-1) != df['teamId']),1,0)

#Loose Possession
df['L_P'] = np.where(((df['UP']==1) | (df['DP']==1) | (df['TO']==1) | (df['SS']==1)),1,0)

3. Regains Possession: From the moment the ball is lost, we track the duration it takes for the recovery to occur. Again, the goal is to identify instances where the team loses possession but subsequently regains it before a break in play occurs.

Possession can be regained through various means, including successful defensive interventions like interceptions & successful tackles, or successful passes that disrupt the opponent’s flow of play.

By analyzing the duration and success rate of these possession recovery events, we can understand the team’s ability to maintain control of the ball during uninterrupted phases of play, and also the pressing intensity of the defending side.

#Filter for team
team_df = df[df['teamId'] == team].reset_index(drop=True)

# Initialize a list to store DataFrames of possession recovery events
possession_recovery_dfs = []

# Initialize lists to store start and end of possession phases
start_times = []
end_times = []
start_names = []
end_names = []
start_x = []
end_x = []
start_y = []
end_y = []

#List of relevant actions
list1 = ['Pass', 'Tackle', 'BallRecovery', 'Interception', 'TakeOn', 'BlockedPass', 'KeeperPickup', 'KeeperSweeper']

# Iterate through DataFrame to find start times of possession phases
for index, row in team_df.iterrows():
if row['L_P'] == 1 and row['Break'] == 0 and row['SP'] == 0:
start_time = row['newsecond']
start_name = row['playername']
start_x_coord = row['x']
start_y_coord = row['y']
end_time = None
end_name = None
end_x_coord = None
end_y_coord = None

next_index = index + 1
while next_index < len(team_df):
next_row = team_df.iloc[next_index]
if next_row['type_displayName'] in list1 and next_row['outcomeType_displayName'] == 'Successful' and next_row['Break'] == 0:
end_time = next_row['newsecond']
end_name = next_row['playername']
end_x_coord = next_row['x']
end_y_coord = next_row['y']
break
elif next_row['Break'] == 1:
# If there's a break in play, stop searching for possession recovery events
end_time = None
break
else:
end_time = None
break
next_index += 1

# Record start and end of possession phase
start_times.append(start_time)
end_times.append(end_time)
start_names.append(start_name)
end_names.append(end_name)
start_x.append(start_x_coord)
end_x.append(end_x_coord)
start_y.append(start_y_coord)
end_y.append(end_y_coord)

# Add the record where possession is regained to possession_recovery_dfs
if end_time is not None:
possession_recovery_dfs.append(pd.DataFrame(next_row).transpose())

Matchday Example: Chelsea vs Liverpool (EFL Cup Final)

Now, to gain a deeper understanding of how PRBI can be applied, let’s utilize a graphic designed for the Chelsea vs Liverpool EFL Cup Final. By breaking down the details of this graphic, we can discern how information can be derived effectively.

Credit: Author @chunhang7 on X

1. Possession Lost: Chelsea mainly lost possession in the final third of the pitch, but concerning was the high volume of dispossession occurring in the left half-space of their own half.

2. Possession Recovered: Despite losing possession higher up the pitch, Chelsea found themselves recovering lost possession deep inside their own half, and sometimes even inside their own penalty box. On one hand, we can applaud the great penalty box defending from Disasi. On the other hand, it shows a weak rest-defense structure where much of Liverpool’s recovery finds its way into dangerous zones.

3. Metrics: This tabulation of statistics offers insight into the number of times possession is lost and how many are recovered. Chelsea’s recovery rate stands at 58.26%, a respectable amount given that they recover over half of their lost possession. Interestingly, they take, on average, 15 seconds to recover possession, which is 3 seconds longer than Liverpool. Considering Chelsea lose possession high up the pitch and only retrieve it deep in their own half, that’s a great deal of distance to cover in order to recover the ball.

4. Lost & Recovered: Enzo Fernandez and Ben Chilwell lost a total of 35 possessions throughout the game. Knowing both players mainly operate on the left, we now understand who is responsible for the concentrated volume of possession lost from the first visual discussed. At the same time, Petrovic and Disasi were both responsible for 16 recovered possessions during the final, highlighting their importance with their commands inside the box.

PR BI-BYE: tired

PRBI is intended to complement statistics such as PPDA and Area-Specific Tackles, providing context for the intensity of pressing and its effectiveness in helping teams regain possession. Importantly, it offers a fresh perspective on a nuanced aspect of football, especially when the quantification of pressing is very difficult to pin down.

Image Credit: FMBlog

Yet with a touch of creativity, we can flip the script and consider ball recoveries as a proxy for effective pressing. Maybe only then, can we unveil more tactical insight into Klopp’s Gegenpressing and emulate it on FM.

Written by Lee Chun Hang (@chunhang7)

Once again, if you’re looking for a freelance football analyst, I am available for hire.

--

--

Chun Hang

Football Data Analyst | More Vizzes on Twitter @chunhang7