What wins you a T20 World Cup: The Underlying Numbers 🏏

Sam Iyer-Sequeira
Football Applied
Published in
13 min readJul 3, 2024

In cricket and many sports, surface-level statistics often paint an incomplete picture of a team’s performance. Merely looking at who took the most wickets or scored the most runs doesn’t always reveal how impactful those contributions were or their significance in the broader context of the game.

Total Impact for a player in a match is a numerical value which is the sum of his Batting and Bowling Impacts. These Impacts are calculated based on the context of a batting/bowling performance.

Context is based on an intelligent algorithm that quantifies the pressure on the batter/bowler at every ball of an innings. This is the Pressure Index (PI) value for each ball.

The factors which go into calculating PI include: runs required; overs remaining; quality of batter at the crease and those to follow; quality of bowlers and number of overs left for each; pitch/conditions, and how easy/tough it is for batter/bowlers.

The PI value is always between O and 1. The closer it is to 1, the higher is the pressure on the batter. (The converse is true for the bowler.)

The Batting/Bowling Impact is thus a factor not only of the runs scored/wickets taken/economy rate, but also of the pressure under which these performances happened.

While extra credit for match-winning performances are organically built into the algorithm, it is not unusual for a stand-out performance in a losing cause to be the most Impactful in a match.

In my previous exploration of team performance metrics and the ELO Rating system, I delved into how these tools provide deeper insights into understanding a team’s likelihood of winning. If you’re unfamiliar with ELO Ratings and their role in cricket analysis, I recommend reading the foundational article linked below to grasp their significance in the upcoming discussion.

· Bowling Wins Tournaments
· Analyzing Broader Tournament Trends
Afghanistan’s Dominance and Challenges
Impact of Runs vs. Impact
Bowling Strategies and Impact
The Middle Phase and Bowling Depth
· Bonus: An Appreciation for Jasprit Bumrah
Want to read more?
Sources:

Bowling Wins Tournaments

While batting often wins matches, it’s bowling that truly wins tournaments. However, it’s crucial to analyse bowling performances within their specific contexts rather than in isolation. For instance, a bowler might claim a large share of team wickets, but were those wickets crucial game-changers, or were they primarily lower-order dismissals?

The recent T20 World Cup Final between India and South Africa exemplified this dynamic perfectly. Heinrich Klaasen’s explosive innings almost carried South Africa to victory, dramatically elevating their win probability from 53.05% to a daunting 96.65%. His innings, registering an impact score of 87.18, showcased his ability to dominate under pressure and dictate the game’s tempo.

India, however, responded with a strategic bowling onslaught led by Jasprit Bumrah, Arshdeep Singh, and Hardik Pandya. Their collective effort in the death overs stifled South Africa’s momentum, conceding a mere 14 runs in the crucial phase after Klaasen’s assault. This disciplined bowling display forced South Africa into a position where they needed 16 runs off the final over, effectively shifting the pressure back onto their batting lineup.

Bumrah’s pivotal 18th over was particularly decisive, dismissing Marco Jansen and conceding just 2 runs, sparking a remarkable turnaround that saw India’s win probability soar from 9.31% to 58.91% within six deliveries. Meanwhile, Hardik Pandya’s earlier contributions added to the mounting pressure on South Africa, further tightening the chase.

By the penultimate over, deftly handled by Arshdeep Singh for a mere 4 runs, India’s win probability had surged to 74.31%, effectively neutralizing Klaasen’s heroics. This rapid shift in momentum underscored the game-changing impact of India’s disciplined bowling unit under pressure.

Statistically, Bumrah, Pandya, and Arshdeep emerged as the standout bowlers of the match, surpassing their counterparts with impactful performances. Their ability to execute under pressure and deliver crucial overs defined India’s path to victory in the tournament’s most crucial fixture.

Throughout the competition, India’s bowling depth and strategic acumen were consistently evident. Six Indian players maintained an average impact of over 40 points per game, highlighting their collective contributions across different matches. Hardik Pandya led the charge with an average Total Impact of 55.58 points, showcasing his versatility with both bat and ball. Bumrah, with an unmatched bowling average of 49.80 Impact points, stood out as the tournament’s premier bowler.

India’s strategic emphasis on controlling the game through disciplined bowling, as evidenced by a remarkable 109.52% increase in maiden overs compared to previous tournaments, underscored their ability to dictate tempo and stifle opponents.

The T20 World Cup Final exemplified the pivotal role of bowlers in high-stakes cricket matches. India’s bowlers, spearheaded by Bumrah, Pandya, and Arshdeep, showcased their ability to thrive under pressure and deliver match-winning performances when it mattered most, securing a memorable victory and reaffirming the age-old adage that “bowling wins tournaments.”

While individual statistics like wickets taken can provide insights, it’s the context and impact of those performances that truly define a team’s success in cricket tournaments like the T20 World Cup. India’s strategic bowling depth and impactful performances exemplified how bowling excellence can decisively influence tournament outcomes, setting a benchmark for future competitions.

Analyzing Broader Tournament Trends

Several key statistics from the 2024 T20 World Cup highlight significant trends in the tournament’s dynamics. The record-low overall run rate of 7.09 underscores the bowler-friendly conditions prevalent throughout the event. This statistic indicates that batsmen faced considerable challenges in scoring runs, reflecting on the pitches’ nature and the strategic acumen of bowling attacks across teams.

Additionally, the occurrence of teams winning matches despite scoring 120 or fewer runs in a full 20-over innings happened five times. This statistic emphasizes the crucial role of effective bowling in defending low totals and turning matches in favor of teams with disciplined bowling strategies.

Afghanistan’s Dominance and Challenges

Afghanistan’s performance exemplified bowling dominance with a record of 5 wins and 3 losses. In their victories, Afghanistan’s ability to bowl out opponents in all matches showcased their formidable bowling depth and effectiveness. This trend mirrored Australia’s feat in 2010, highlighting how potent bowling attacks can dictate match outcomes in T20 cricket.

Conversely, Afghanistan’s losses, where they were bowled out in all three matches, revealed vulnerabilities, particularly in their batting lineup’s overreliance on their openers, Gurbaz and Zadran. Despite Gurbaz and Zadran contributing nearly 60% of Afghanistan’s runs, their failures often led to collapses, exposing fragilities in the team’s middle order.

Afghanistan’s overreliance on Gurbaz and Zadran evident by this plot

Impact of Runs vs. Impact

The 2024 T20 World Cup underscored that scoring runs alone does not always guarantee match-winning impacts. A prime example is the contrasting performances of Rohit Sharma and Jos Buttler. Both players contributed significantly to their team’s total runs, yet their impacts varied markedly. Sharma’s innings were pivotal in critical matches, where his ability to score runs under pressure elevated his impact beyond mere statistics. In contrast, Buttler’s runs, often amassed against associate nations, raised questions about the consistency and impact of his performances in more challenging match scenarios.

Bowling Strategies and Impact

Analyzing bowling dynamics revealed that while taking a high percentage of team wickets typically correlates with higher impact per game, the distribution of impact among bowlers is crucial. For instance, Chris Jordan, Jofra Archer, and Adil Rashid all ended with similar wicket tallies.

However, Rashid’s wickets had a significantly higher average impact. This disparity can be attributed to strategic factors such as Rashid’s role in the middle overs, where his ability to control the game and take crucial wickets impacts the course of the match. In contrast, Archer’s aggressive powerplay bowling influences batting strategies by forcing oppositions to adopt riskier approaches early in the innings.

The Middle Phase and Bowling Depth

Beyond the frontline bowlers, the middle overs emerged as a decisive phase in match outcomes. The effectiveness of 3rd, 4th, and 5th bowling options in applying sustained pressure was critical. Teams like India and South Africa showcased this strategy masterfully, relying on bowlers like Tabraiz Shamsi and Keshav Maharaj to excel in these pivotal stages. Their ability to maintain pressure, take key wickets, and control the run rate during critical phases underscored their teams’ unbeaten runs into the final stages of the tournament. This strategic depth in bowling proved crucial in overcoming occasional batting challenges and securing pivotal victories.

The 2024 T20 World Cup reaffirmed the age-old adage that “bowling wins tournaments.” Teams with depth in their bowling attacks, strategic acumen in the middle overs, and the ability to defend low totals consistently outperformed their counterparts. This analysis highlights the nuanced dynamics of T20 cricket, where effective bowling rotations, impactful batting performances, and overall team balance play pivotal roles in securing victories in high-stakes matches. As the sport evolves, these insights into the interplay between batting and bowling will continue to shape strategies and define success in T20 cricket.

Augmented T20 k-factor model

In a dataset with different k-factor, the script defines functions for Elo rating calculation (`calculate_elo_rating`) and determining the K-factor (`determine_k_factor`) based on it’s a group stage match or a knockout match. The K-factor adjustment ensures that knockout matches, where stakes are higher, contribute more significantly to Elo rating changes.

import os
import json
import pandas as pd
import pydash
import plotly.express as px
import plotly.graph_objects as go
from plotly.subplots import make_subplots
import numpy as np
import csv
from mpl_toolkits.mplot3d import Axes3D
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt # plotting
import seaborn as sns

matches = pd.read_csv("/Users/samyukth/Downloads/t2020.csv", index_col=0)
matches.columns
Index(['Date', 'playoff', 'Team1', 'Team2', 'Venue', 'Winner', 'Year',
'Country', 'ELO Rating team 1', 'ELO Rating Team 2', 'EA', 'EB',
'New ELO Team 1', 'New ELO Team 2', 'id.1', 'team1_rating',
'team2_rating', 'team1_newrating', 'team2_newrating', 'team1_expected',
'team2_expected', 'K-factor', 'outcometeam1', 'outcometeam2'],
dtype='object')
unique_teams = pd.concat([matches['Team1'].str.strip(), matches['Team2'].str.strip()]).unique()
# Print unique teams
print(unique_teams)
unique_countries_team1 = matches['Team1'].str.strip().unique()
for country in unique_countries_team1:
if isinstance(country, str):
clean_country = country.strip()
matches.loc[matches['Team1'].str.strip() == country, 'Team1'] = clean_country
print(matches['Team1'].unique())
matches['Team1'] = matches['Team1'].str.strip()
matches_count = {}
for team in unique_teams:
matches_count[team] = ((matches['Team1'].str.strip() == team) | (matches['Team2'].str.strip() == team)).sum()
matches_count_df = pd.DataFrame(list(matches_count.items()), columns=['Team', 'MatchesPlayed'])
matches_count_df = matches_count_df.sort_values(by='MatchesPlayed', ascending=False)
print(matches_count_df)
import pandas as pd
# Read the T20 data
matches = pd.read_csv("/Users/samyukth/Downloads/t2020.csv", index_col=0)
# Function to calculate Elo rating
def calculate_elo_rating(team1_rating, team2_rating, outcome, k_factor):
expected1 = 1 / (1 + 10 ** ((team2_rating - team1_rating) / 400))
elo_change = k_factor * (outcome - expected1)
return expected1, elo_change
# Function to determine K-factor based on playoff value
def determine_k_factor(playoff):
if playoff == 1:
return 10
elif playoff == 2:
return 15
elif playoff == 3:
return 25
elif playoff == 4:
return 35
else:
return 10 # Default K-factor if playoff value is not in the specified range
# Function to update Elo ratings
def update_elo_ratings(matches, elo_ratings):
for index, match in matches.iterrows():
team1 = str(match['Team1']).strip()
team2 = str(match['Team2']).strip()

winner = match['Winner'] if pd.notna(match['Winner']) else ''

if winner.strip() == team1:
outcome_team1 = 1 # Win for team1
outcome_team2 = 0 # Loss for team2
elif winner.strip() == team2:
outcome_team1 = 0 # Loss for team1
outcome_team2 = 1 # Win for team2
else:
outcome_team1 = 0 # Draw
outcome_team2 = 0 # Draw
# Determine K-factor based on playoff value
k_factor = determine_k_factor(match['playoff'])
# Get current Elo ratings
team1_rating = elo_ratings.get(team1, 1000)
team2_rating = elo_ratings.get(team2, 1000)
# Calculate Elo changes and expected outcomes
expected1, elo_change1 = calculate_elo_rating(team1_rating, team2_rating, outcome_team1, k_factor)
expected2, elo_change2 = calculate_elo_rating(team2_rating, team1_rating, outcome_team2, k_factor)
# Update Elo ratings in the dictionary
elo_ratings[team1] += elo_change1
elo_ratings[team2] += elo_change2
# Also update the Elo ratings and expected outcomes in the DataFrame
matches.at[index, 'team1_rating'] = team1_rating
matches.at[index, 'team2_rating'] = team2_rating
matches.at[index, 'team1_newrating'] = elo_ratings[team1]
matches.at[index, 'team2_newrating'] = elo_ratings[team2]
matches.at[index, 'team1_expected'] = expected1
matches.at[index, 'team2_expected'] = expected2
matches.at[index, 'outcometeam1'] = outcome_team1
matches.at[index, 'outcometeam2'] = outcome_team2

return elo_ratings
# Extract unique teams
unique_teams = pd.concat([matches['Team1'], matches['Team2']]).astype(str).str.strip().unique()
# Initialize Elo ratings dictionary
elo_ratings = {team: 1000 for team in unique_teams}
# Initialize Elo ratings columns in the matches DataFrame
matches['team1_rating'] = matches['Team1'].astype(str).map(lambda x: elo_ratings.get(x.strip(), 1000)).astype('float64')
matches['team2_rating'] = matches['Team2'].astype(str).map(lambda x: elo_ratings.get(x.strip(), 1000)).astype('float64')
matches['team1_newrating'] = None
matches['team2_newrating'] = None
matches['team1_expected'] = None
matches['team2_expected'] = None
matches['outcometeam1'] = None
matches['outcometeam2'] = None
# Update Elo ratings based on matches data
elo_ratings = update_elo_ratings(matches, elo_ratings)
# Display updated Elo ratings
for team, rating in elo_ratings.items():
print(f"{team}: {rating}")
# Print the updated DataFrame
print(matches[['id.1', 'Team1', 'Team2', 'team1_rating', 'team2_rating', 'team1_newrating', 'team2_newrating', 'team1_expected', 'team2_expected', 'outcometeam1', 'outcometeam2']])
# Save the updated DataFrame to a CSV file
output_file = 't20eloo5.csv'
matches.to_csv(output_file, index=False)
Oman: 976.3812587527545
Bangladesh: 952.8634998712928
Ireland: 965.3651239277015
Sri Lanka: 981.8646206069699
Scotland: 975.9860437140121
Namibia: 975.0882001158549
Australia: 1057.992357608624
England: 1036.8987806777936
India: 1079.2698628776238
Afghanistan: 975.3412193059294
South Africa: 1034.0110224194202
Pakistan: 1016.4490209766757
West Indies: 980.8495698293474
New Zealand: 1004.055909537729
nan: 850.0
Zimbabwe: 981.6985115884502
Netherlands: 966.2426172039565
Papua New Guinea: 970.2566136715835
#Note: Teams that played less then 7 games total from 2021-2024 in the 3 T20 World Cups were omitted from the data due to small sample size.#

The main function (`update_elo_ratings`) iterates through each match in the t20 DataFrame, determines the outcome (win, loss, or draw) for each team, calculates Elo rating changes using the previously defined functions, and updates the Elo ratings accordingly. It also updates the DataFrame with columns for current and updated Elo ratings, expected outcomes, and match results.

After updating the Elo ratings for all matches, the script prints out the final Elo ratings for each team and displays a subset of the updated DataFrame containing Elo-related columns. Finally, it saves the entire updated DataFrame to a new CSV file for further analysis or reporting purposes.

This script is designed to provide a comprehensive analysis of T20 matches data using Elo ratings, adjusting the ratings dynamically based on match outcomes and playoff significance, thus reflecting the teams’ performance over time accurately.

The comparison of the new Elo ratings to the old ratings for international teams reveals intriguing insights into their recent performances and overall competitiveness. Only India have notably increased their ratings, suggesting strong recent performances that have bolstered their standings, despite England being the only side to have made the semi-finals in all 3 editions of the World Cup. Conversely, teams like Bangladesh and West Indies have shown a sharp drop, depicting their poor performances in the recent T20 editions. This stability suggests these teams ability greatly fluctuate based on confounding factors such as weather or condition, further depicting the unpredictability of the T20 format.

Bonus: An Appreciation for Jasprit Bumrah

Jasprit Bumrah is without a bout the best bowler in the world, and potentially the best white ball seamer of all time. In the 2024 T20 World Cup, Bumrah’s performance was nothing short of exceptional, underscoring his dominance with both the ball and his impact on matches.

Throughout the tournament, Bumrah’s economy rate of 4.17 was unmatched among bowlers who delivered over 100 balls, solidifying his reputation as a bowler who thrives under pressure. Even in his most challenging spell against Australia, he conceded just 29 runs, a testament to his ability to control the game’s tempo.

In terms of Economy and Bowling Average, Bumrah stands alone

What truly sets Bumrah apart is his ability to stifle opposition batsmen with a high dot ball percentage, particularly in crucial phases like the powerplay and death overs. He recorded the highest dot ball percentage in both these phases among teams that advanced to the Super 8s, showcasing his knack for building pressure and creating opportunities for his team.

Statistically, Bumrah’s impact was profound. He boasted the best wicket-to-economy ratio in the tournament, significantly outperforming bowlers who took fewer wickets while conceding more runs per over. This efficiency translated into tangible results on the field, where he not only took crucial wickets but also kept the scoring in check, minimizing boundaries and maintaining a remarkable ratio of wickets to runs conceded.

In terms of sheer numbers, Bumrah’s 15 wickets in 8 innings at an average of 8.26 represented a career-best year in T20 cricket. His ability to consistently break partnerships and control the flow of runs earned him a bowling impact rating of 399.4, the highest of any bowler in the tournament. This metric underscores his immense influence on match outcomes, where his presence often tilted the balance in India’s favor.

Moreover, Bumrah’s performance was characterized by an extraordinary ability to limit boundaries; he conceded fewer boundaries than the number of wickets he took throughout the World Cup. His precise bowling and strategic acumen allowed him to maintain an impressive ratio of wickets to boundaries, ensuring that he not only contained runs but also posed constant threats to opposing batsmen.

In summary, Jasprit Bumrah’s record-breaking performance in the 2024 T20 World Cup solidifies his status as one of cricket’s premier fast bowlers. His unmatched economy rate, prolific wicket-taking ability, and strategic prowess exemplify his impact on the game, making him an indispensable asset for India and a benchmark for bowlers worldwide.

And here’s something to make you laugh:

--

--