chicago-crime-analysis/crimes.ipynb

723 lines
154 KiB
Plaintext
Raw Permalink Normal View History

2023-10-04 18:01:03 +00:00
{
"cells": [
{
"cell_type": "markdown",
"id": "e52e43de",
"metadata": {},
"source": [
"### Imports"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import geoplot as gplt\n",
"import geopandas as gpd\n",
"import geoplot.crs as gcrs\n",
"import pandas as pd\n",
"import matplotlib as mpl\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np"
]
},
{
"cell_type": "markdown",
"id": "733941c8",
"metadata": {},
"source": [
"### Data Ingest"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "1edc840b",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/tmp/ipykernel_17408/2120724538.py:2: UserWarning: Could not infer format, so each element will be parsed individually, falling back to `dateutil`. To ensure parsing is consistent and as-expected, please specify a format.\n",
" orgdata = pd.read_csv(\n"
]
}
],
"source": [
"# read raw data\n",
"orgdata = pd.read_csv(\n",
" \"data/crimes.csv\", \n",
" usecols=[\"DATE OF OCCURRENCE\", \"FBI CD\", \"beat_num\"],\n",
" parse_dates=[\"DATE OF OCCURRENCE\"]\n",
")\n"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "ba2a1ef5",
"metadata": {},
"outputs": [],
"source": [
"\n",
"# filter for trailing twelve months and only violent crime\n",
"data = orgdata[\n",
" (orgdata[\"DATE OF OCCURRENCE\"] > \"2022-09-13 00:00:00\") &\n",
" (orgdata[\"FBI CD\"].isin([\"01A\", \"02\", \"03\", \"04A\", \"04B\"]))]\n",
"\n",
"# get shapefile for CPD beats\n",
"types = {\n",
" \"beat\": int,\n",
" \"beat_num\": int,\n",
" \"district\": int,\n",
" \"sector\": int,\n",
"}\n",
"beats = gpd.read_file(\"maps/geo_export_cf56fcdf-4e4b-485b-83b8-f76287821f6a.shp\").astype(types)"
]
},
{
"cell_type": "markdown",
"id": "12b1398e",
"metadata": {},
"source": [
"#### Verification"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "86b9b04d",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>DATE OF OCCURRENCE</th>\n",
" <th>beat_num</th>\n",
" <th>FBI CD</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>79</th>\n",
" <td>2022-12-28 10:00:00</td>\n",
" <td>1214</td>\n",
" <td>04B</td>\n",
" </tr>\n",
" <tr>\n",
" <th>92</th>\n",
" <td>2022-10-25 13:00:00</td>\n",
" <td>1722</td>\n",
" <td>02</td>\n",
" </tr>\n",
" <tr>\n",
" <th>109</th>\n",
" <td>2023-08-31 19:00:00</td>\n",
" <td>833</td>\n",
" <td>04B</td>\n",
" </tr>\n",
" <tr>\n",
" <th>170</th>\n",
" <td>2022-11-26 06:15:00</td>\n",
" <td>113</td>\n",
" <td>03</td>\n",
" </tr>\n",
" <tr>\n",
" <th>188</th>\n",
" <td>2022-12-08 15:38:00</td>\n",
" <td>1834</td>\n",
" <td>01A</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>256904</th>\n",
" <td>2023-02-04 12:29:00</td>\n",
" <td>2234</td>\n",
" <td>03</td>\n",
" </tr>\n",
" <tr>\n",
" <th>256913</th>\n",
" <td>2023-03-22 10:47:00</td>\n",
" <td>731</td>\n",
" <td>04B</td>\n",
" </tr>\n",
" <tr>\n",
" <th>256925</th>\n",
" <td>2022-11-12 18:35:00</td>\n",
" <td>512</td>\n",
" <td>04B</td>\n",
" </tr>\n",
" <tr>\n",
" <th>256931</th>\n",
" <td>2023-07-31 00:00:00</td>\n",
" <td>312</td>\n",
" <td>04B</td>\n",
" </tr>\n",
" <tr>\n",
" <th>256933</th>\n",
" <td>2023-06-18 01:05:00</td>\n",
" <td>1824</td>\n",
" <td>04B</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>27466 rows × 3 columns</p>\n",
"</div>"
],
"text/plain": [
" DATE OF OCCURRENCE beat_num FBI CD\n",
"79 2022-12-28 10:00:00 1214 04B\n",
"92 2022-10-25 13:00:00 1722 02\n",
"109 2023-08-31 19:00:00 833 04B\n",
"170 2022-11-26 06:15:00 113 03\n",
"188 2022-12-08 15:38:00 1834 01A\n",
"... ... ... ...\n",
"256904 2023-02-04 12:29:00 2234 03\n",
"256913 2023-03-22 10:47:00 731 04B\n",
"256925 2022-11-12 18:35:00 512 04B\n",
"256931 2023-07-31 00:00:00 312 04B\n",
"256933 2023-06-18 01:05:00 1824 04B\n",
"\n",
"[27466 rows x 3 columns]"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "b6a224a5",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"<class 'pandas.core.frame.DataFrame'>\n",
"Index: 27466 entries, 79 to 256933\n",
"Data columns (total 3 columns):\n",
" # Column Non-Null Count Dtype \n",
"--- ------ -------------- ----- \n",
" 0 DATE OF OCCURRENCE 27466 non-null datetime64[ns]\n",
" 1 beat_num 27466 non-null int64 \n",
" 2 FBI CD 27466 non-null object \n",
"dtypes: datetime64[ns](1), int64(1), object(1)\n",
"memory usage: 858.3+ KB\n"
]
}
],
"source": [
"\n",
"data.info()\n",
" "
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "efa37cbb",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"<class 'geopandas.geodataframe.GeoDataFrame'>\n",
"RangeIndex: 277 entries, 0 to 276\n",
"Data columns (total 5 columns):\n",
" # Column Non-Null Count Dtype \n",
"--- ------ -------------- ----- \n",
" 0 beat 277 non-null int64 \n",
" 1 beat_num 277 non-null int64 \n",
" 2 district 277 non-null int64 \n",
" 3 sector 277 non-null int64 \n",
" 4 geometry 277 non-null geometry\n",
"dtypes: geometry(1), int64(4)\n",
"memory usage: 10.9 KB\n"
]
}
],
"source": [
"beats.info()"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "a51e67e8",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<Axes: >"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"beats.plot(legend=False)"
]
},
{
"cell_type": "markdown",
"id": "c57e8c5b",
"metadata": {},
"source": [
"### Processing"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "b109d5a8",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"<class 'pandas.core.frame.DataFrame'>\n",
"RangeIndex: 274 entries, 0 to 273\n",
"Data columns (total 2 columns):\n",
" # Column Non-Null Count Dtype\n",
"--- ------ -------------- -----\n",
" 0 beat_num 274 non-null int64\n",
" 1 count 274 non-null int64\n",
"dtypes: int64(2)\n",
"memory usage: 4.4 KB\n"
]
}
],
"source": [
"# count number of occurrances in each beat\n",
"per_beat = data[\"beat_num\"].value_counts().reset_index(name=\"count\")\n",
"per_beat.info()"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "8ce4d34a",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>beat</th>\n",
" <th>beat_num</th>\n",
" <th>district</th>\n",
" <th>sector</th>\n",
" <th>geometry</th>\n",
" <th>count</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1</td>\n",
" <td>1713</td>\n",
" <td>17</td>\n",
" <td>1</td>\n",
" <td>POLYGON ((-87.70473 41.97577, -87.70472 41.975...</td>\n",
" <td>47</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>5</td>\n",
" <td>1651</td>\n",
" <td>16</td>\n",
" <td>5</td>\n",
" <td>POLYGON ((-87.90684 41.97656, -87.91070 41.975...</td>\n",
" <td>12</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>1</td>\n",
" <td>1914</td>\n",
" <td>19</td>\n",
" <td>1</td>\n",
" <td>POLYGON ((-87.64492 41.96973, -87.64431 41.969...</td>\n",
" <td>103</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>1</td>\n",
" <td>1915</td>\n",
" <td>19</td>\n",
" <td>1</td>\n",
" <td>POLYGON ((-87.63724 41.96599, -87.63644 41.965...</td>\n",
" <td>55</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>1</td>\n",
" <td>1913</td>\n",
" <td>19</td>\n",
" <td>1</td>\n",
" <td>POLYGON ((-87.65967 41.96903, -87.65967 41.968...</td>\n",
" <td>67</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" beat beat_num district sector \\\n",
"0 1 1713 17 1 \n",
"1 5 1651 16 5 \n",
"2 1 1914 19 1 \n",
"3 1 1915 19 1 \n",
"4 1 1913 19 1 \n",
"\n",
" geometry count \n",
"0 POLYGON ((-87.70473 41.97577, -87.70472 41.975... 47 \n",
"1 POLYGON ((-87.90684 41.97656, -87.91070 41.975... 12 \n",
"2 POLYGON ((-87.64492 41.96973, -87.64431 41.969... 103 \n",
"3 POLYGON ((-87.63724 41.96599, -87.63644 41.965... 55 \n",
"4 POLYGON ((-87.65967 41.96903, -87.65967 41.968... 67 "
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# merge shapefile and beat data\n",
"beat_map = beats.merge(per_beat, on=\"beat_num\")\n",
"beat_map.head()"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "bffd054d",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>beat</th>\n",
" <th>beat_num</th>\n",
" <th>district</th>\n",
" <th>sector</th>\n",
" <th>geometry</th>\n",
" <th>count</th>\n",
" <th>deviations</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1</td>\n",
" <td>1713</td>\n",
" <td>17</td>\n",
" <td>1</td>\n",
" <td>POLYGON ((-87.70473 41.97577, -87.70472 41.975...</td>\n",
" <td>47</td>\n",
" <td>-53.240876</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>5</td>\n",
" <td>1651</td>\n",
" <td>16</td>\n",
" <td>5</td>\n",
" <td>POLYGON ((-87.90684 41.97656, -87.91070 41.975...</td>\n",
" <td>12</td>\n",
" <td>-88.240876</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>1</td>\n",
" <td>1914</td>\n",
" <td>19</td>\n",
" <td>1</td>\n",
" <td>POLYGON ((-87.64492 41.96973, -87.64431 41.969...</td>\n",
" <td>103</td>\n",
" <td>2.759124</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>1</td>\n",
" <td>1915</td>\n",
" <td>19</td>\n",
" <td>1</td>\n",
" <td>POLYGON ((-87.63724 41.96599, -87.63644 41.965...</td>\n",
" <td>55</td>\n",
" <td>-45.240876</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>1</td>\n",
" <td>1913</td>\n",
" <td>19</td>\n",
" <td>1</td>\n",
" <td>POLYGON ((-87.65967 41.96903, -87.65967 41.968...</td>\n",
" <td>67</td>\n",
" <td>-33.240876</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>269</th>\n",
" <td>1</td>\n",
" <td>314</td>\n",
" <td>3</td>\n",
" <td>1</td>\n",
" <td>POLYGON ((-87.58879 41.78612, -87.58844 41.786...</td>\n",
" <td>79</td>\n",
" <td>-21.240876</td>\n",
" </tr>\n",
" <tr>\n",
" <th>270</th>\n",
" <td>2</td>\n",
" <td>825</td>\n",
" <td>8</td>\n",
" <td>2</td>\n",
" <td>POLYGON ((-87.67917 41.78656, -87.67912 41.784...</td>\n",
" <td>129</td>\n",
" <td>28.759124</td>\n",
" </tr>\n",
" <tr>\n",
" <th>271</th>\n",
" <td>1</td>\n",
" <td>313</td>\n",
" <td>3</td>\n",
" <td>1</td>\n",
" <td>POLYGON ((-87.60854 41.78583, -87.60808 41.785...</td>\n",
" <td>98</td>\n",
" <td>-2.240876</td>\n",
" </tr>\n",
" <tr>\n",
" <th>272</th>\n",
" <td>2</td>\n",
" <td>823</td>\n",
" <td>8</td>\n",
" <td>2</td>\n",
" <td>POLYGON ((-87.69354 41.78458, -87.69354 41.784...</td>\n",
" <td>185</td>\n",
" <td>84.759124</td>\n",
" </tr>\n",
" <tr>\n",
" <th>273</th>\n",
" <td>1</td>\n",
" <td>312</td>\n",
" <td>3</td>\n",
" <td>1</td>\n",
" <td>POLYGON ((-87.60431 41.78043, -87.60400 41.780...</td>\n",
" <td>148</td>\n",
" <td>47.759124</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>274 rows × 7 columns</p>\n",
"</div>"
],
"text/plain": [
" beat beat_num district sector \\\n",
"0 1 1713 17 1 \n",
"1 5 1651 16 5 \n",
"2 1 1914 19 1 \n",
"3 1 1915 19 1 \n",
"4 1 1913 19 1 \n",
".. ... ... ... ... \n",
"269 1 314 3 1 \n",
"270 2 825 8 2 \n",
"271 1 313 3 1 \n",
"272 2 823 8 2 \n",
"273 1 312 3 1 \n",
"\n",
" geometry count deviations \n",
"0 POLYGON ((-87.70473 41.97577, -87.70472 41.975... 47 -53.240876 \n",
"1 POLYGON ((-87.90684 41.97656, -87.91070 41.975... 12 -88.240876 \n",
"2 POLYGON ((-87.64492 41.96973, -87.64431 41.969... 103 2.759124 \n",
"3 POLYGON ((-87.63724 41.96599, -87.63644 41.965... 55 -45.240876 \n",
"4 POLYGON ((-87.65967 41.96903, -87.65967 41.968... 67 -33.240876 \n",
".. ... ... ... \n",
"269 POLYGON ((-87.58879 41.78612, -87.58844 41.786... 79 -21.240876 \n",
"270 POLYGON ((-87.67917 41.78656, -87.67912 41.784... 129 28.759124 \n",
"271 POLYGON ((-87.60854 41.78583, -87.60808 41.785... 98 -2.240876 \n",
"272 POLYGON ((-87.69354 41.78458, -87.69354 41.784... 185 84.759124 \n",
"273 POLYGON ((-87.60431 41.78043, -87.60400 41.780... 148 47.759124 \n",
"\n",
"[274 rows x 7 columns]"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"mean = beat_map[\"count\"].mean()\n",
"beat_map[\"deviations\"] = beat_map.apply(lambda row: row[\"count\"] - mean, axis=1)\n",
"beat_map"
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "d83a3b43",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<GeoAxes: title={'center': \"Violent Crime Occurrances Difference from Mean, TTM Sep '23\"}>"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAigAAAH4CAYAAABg2xY3AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/OQEPoAAAACXBIWXMAAA9hAAAPYQGoP6dpAAD7FUlEQVR4nOydd5wTZd7AvzOTsr2z7NK7gCAqNooICmLvKAJ3gHr2copnuVOx66tnO7CcDc/esKICIgiCiAjSe+8L27O72ZSZ5/1jkuxmN8kmYVdYeb4fQjYzzzzzzJPJzG9+VQEEEolEIpFIJIcR6qEegEQikUgkEkldpIAikUgkEonksEMKKBKJRCKRSA47pIAikUgkEonksEMKKBKJRCKRSA47pIAikUgkEonksEMKKBKJRCKRSA47pIAikUgkEonksEMKKBKJRCKRSA47mkxAGTt2LEII2rdvH/O2U6ZMYevWrU0wqkNP+/btEUIwduzYQz0UyRFGqN9VcnIyr732Gnv37kUIwXPPPQdAbm4un3zyCYWFhQghuO222w7FkA8b5HxIJH88UQsoX375JZWVlaSkpIRt8+677+JyucjKymqUwTUlPXr0YOLEiTELUH369OGdd95hx44dVFdXU1RUxPfff8+4ceNQ1eatkBozZgxz586lpKSEyspKVqxYwf33309SUtKhHpqkDhMnTkQIEXhVVlayfft2vvrqK8aNG4fNZouqn3/+85+MGzeOl19+mTFjxvDOO+8A8NxzzzF8+HCeeOIJxowZw/Tp05vycA57mtN8+B+ChBD861//Ctnm3XffRQiBw+H4g0d3cGzdujXovA/3irad/0HR//m1114Lud9HH3000CY7O7vBcfbq1YtPPvmEbdu24XQ62bVrFzNnzuTmm29u1PmIlq1btzJx4sTA56OOOor/+7//4/fff6e8vJw9e/Ywbdo0+vbtW2/biy66iOnTp7N7926qq6vZuXMnn3zyCUcffXSTj1shylo8l19+OR999BF//etfAxex2iQmJrJ//35mz57NhRdeiKqqWK1WXC5XzIOaMmUKgwcPpmPHjjFvGy2XXnopn376KYMHD2bu3LlRbXP11VfzyiuvUFBQwDvvvMPGjRtJTU3ljDPO4Nxzz+W+++7jiSeeaLAfu92Ox+PBMIyDPYxGQVVV3n//fa644grmzZvHZ599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
"text/plain": [
"<Figure size 800x600 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"\n",
"ax = gplt.polyplot(beat_map, projection=gcrs.AlbersEqualArea())\n",
"ax.set_title(\"Violent Crime Occurrances Difference from Mean, TTM Sep '23\")\n",
"gplt.choropleth(\n",
" beat_map,\n",
" hue=\"deviations\",\n",
" edgecolor=\"white\",\n",
" linewidth=1,\n",
" legend=True,\n",
" norm=mpl.colors.TwoSlopeNorm(vmin=beat_map[\"deviations\"].min(), vcenter=0, vmax=beat_map[\"deviations\"].max()),\n",
" cmap=\"coolwarm\",\n",
" ax=ax,\n",
")"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "11e96927",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "chicago-crime--9IHvOK1-py3.11",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.11.5"
}
},
"nbformat": 4,
"nbformat_minor": 5
}