"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# CS:GO Analytics Part 1: The Dust2 Round\n",
" \n",
"# A CS:GO Series of a Different Kind\n",
"Most people who know me well would know that I **LOVE** playing Counter Strike: Global Offensive (CS:GO). Specifically, I play only one map: Dust2. Having just completed my first data science competition, I learned the importance of exploratory data analysis (EDA). I assumed that EDA could be done away with. However, this resulted in a low competition score until the very end, when I finally took a closer look at the data. In addition, I'm feeling the buzz from having participated in the competition. Hence, I'm directing my energy toward analysing my favourite game and map. I will be writing a series of posts on CS:GO: \n",
" \n",
"1. **The Dust2 Round:** Exploring the characteristics of Dust2 rounds.\n",
"2. **AWP Battlegrounds:** The most popular AWP angles.\n",
"3. **Rifle Battlegrounds:** The hottest areas for rifle battles.\n",
"4. **Getting Dunked:** Popular \"nade\" (grenade) spots.\n",
"5. **Winning in Dust2:** What contributes to winning rounds on Dust2?\n",
" \n",
"# Decoding CS:GO\n",
"\n",
"## The Basics\n",
"For the uninitiated, CS:GO is a first person shooter (FPS) game. It pits two factions against one another: the Terrorists (T) and Counter-Terrorists (CT). On competitive maps, the T-side is typically required to blow up one of two bomb sites. The CT-side is required to defend the bomb sites by either killing all terrorists or defusing the bomb. Dust2 uses the defusal objective (prefix \"de\", hence de_dust2). Of course, there are other map objectives like Elimination (killing all members of the opposite team) or Hostage Rescue (the CT-side must rescue all hostages). \n",
" \n",
"A CS:GO match is a first-to-16-point 5v5 contest. The first half in a match comprises 15 rounds with each team taking one side (T or CT), and the second half requires teams to swap sides (to CT or T). Winning each round scores one point. Each player starts each half with $1,000, and may allocate those funds to buy equipment in any manner he/she likes. \n",
" \n",
"## The Pistol Round\n",
"Teams start off each match with a **pistol round**, because the starting sum of \\$1,000 is not enough to buy shotguns, SMGs, or rifles. Winning the pistol round is essential, because the winning team would then have money to buy better rifles for the next round, while the losing team would be stuck on pistols. This typically enables the winning team to win the second round as well. The momentum is essential for getting a headstart and building morale. Once the pistol round is over, we go into a relatively \"normal\" phase in the match until the end of the half. In the second half, we have another pistol round due to the swap in sides and a reset in money. \n",
" \n",
"## Money Management\n",
"Teams always buy guns together to maximise their chances of winning a round. If the team as a whole does not have enough money to buy good guns (good being relative to the opponent's existing equipment), they save money in what we call an **Eco** round - they don't buy any equipment at all. Teams *playing against* a team that is Eco-ing is on an **Anti-Eco** round. If teams want to improve their chances of winning with lousy weapons, they might buy minimal equipment like kevlar and grenades in a **Semi-Eco** round. If they wish to try their luck to win a round with without matching their opponents' firepower, they do what we call a **Force Buy**: maxing out the limited amount of money they have to buy inferior weapons. Any other round where both teams are equipped are called **Normal** rounds."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# The Dust2 Round\n",
"In this post, we explore characteristics of Dust2 rounds. Why analyse rounds? Because rounds are the basic scoring units in CS:GO, and they are all that matter. In each round, Ts and CTs thrash it out. Either they eliminate the other team, or the bomb goes off, or the bomb is defused. Once the round is done, it is **Dust**-ed, and the Ts and CTs start again: a new round begins. Winning matches simply require the accumulation of sufficient rounds. If we can understand what factors enable teams to win rounds, we will understand what enables them to win matches. \n",
" \n",
"I use [CS:GO Competitive Matchmaking Data from Kaggle](https://www.kaggle.com/skihikingkevin/csgo-matchmaking-damage) to perform my analyses. This dataset (`esea_meta_demos`) contains 20,225 entries on Dust2 for a total of 804 matches."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"# Import required packages\n",
"import matplotlib as mpl\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"import pandas as pd\n",
"import statsmodels.api as sm\n",
"import warnings\n",
"\n",
"from sklearn.linear_model import LogisticRegression\n",
"from sklearn.preprocessing import LabelEncoder\n",
"\n",
"# Settings\n",
"warnings.filterwarnings('ignore')"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"# Define chunk size\n",
"chunksize = 100000\n",
"\n",
"# Create iterators\n",
"iter_kills1 = pd.read_csv('../esea_master_kills_demos.part1.csv', iterator=True, chunksize=chunksize)\n",
"iter_kills2 = pd.read_csv('../esea_master_kills_demos.part2.csv', iterator=True, chunksize=chunksize)\n",
"\n",
"# Import data\n",
"all_data = pd.concat([pd.read_csv('../esea_meta_demos.part1.csv'),\n",
" pd.read_csv('../esea_meta_demos.part2.csv')], axis=0)\n",
"# Filter\n",
"dust2 = all_data.copy()[all_data['map'] == 'de_dust2'].reset_index(drop=True)\n",
"\n",
"# Extract games\n",
"games = list(dust2.file.unique())\n",
"\n",
"# Drop columns\n",
"dust2 = dust2.drop(['map', 'winner_team'], axis=1)\n",
"\n",
"# Convert file\n",
"dust2['file'] = LabelEncoder().fit_transform(dust2['file'])\n",
"\n",
"# Count number of T-side and CT-side wins\n",
"all_data['t_score'] = (all_data.winner_side == 'Terrorist').astype(int)\n",
"all_data['ct_score'] = (all_data.winner_side == 'CounterTerrorist').astype(int)\n",
"dust2['t_score'] = (dust2.winner_side == 'Terrorist').astype(int)\n",
"dust2['ct_score'] = (dust2.winner_side == 'CounterTerrorist').astype(int)\n",
"\n",
"# Compute round time\n",
"all_data['round_time'] = all_data.end_seconds - all_data.start_seconds\n",
"dust2['round_time'] = dust2.end_seconds - dust2.start_seconds\n",
"\n",
"# Import kills data\n",
"kill_data = pd.concat([chunk[chunk['file'].isin(games)] for chunk in iter_kills1] +\n",
" [chunk[chunk['file'].isin(games)] for chunk in iter_kills2])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Timing\n",
"We begin our analysis with the most limited resource in the game: time. A competitive round in Dust2 lasts 2 minutes and 10 seconds: 15 seconds of freezetime and 1 minute and 55 seconds of play. Of course, teams often achieve the map objectives (elimination or detonation/defusal) within that time. \n",
" \n",
"Dust2 is a relatively fast map. In terms of round time, it was the third but last of all the maps in the dataset, with the shortest being Train at 79 seconds and the longest being Inferno at 90 seconds."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"