Chicago Theft After 2020

Our Question

How did theft in Chicago change after 2020?

How to Use

Use the filters to pick years, a type of theft or a part of the city. All the charts update together. To filter by type of place, switch the second chart to location type and click a bar. Hover over a point to see details. Drag across the line chart to zoom in on those years, and click Reset to go back.

Thefts per month

Which thefts went up or down

When thefts happen during the day

Write-up

About the Dataset

We used the Crimes - 2001 to Present dataset from the Chicago Data Portal. Each row is one reported crime with the date and time, the type of crime, a description, the type of place, whether someone was arrested, and the community area.

We only kept THEFT and MOTOR VEHICLE THEFT from 2016 to 2025 (716,105 rows). We included motor vehicle theft because it is a separate category in the data and it changed a lot after 2020. We left out 2026 because the year isn't over yet. We compare 2016-2019 (before) to 2021-2025 (after). 2020 is shown but not used in the averages because of the pandemic.

The full dataset is over 8 million rows and the export from the website kept failing, so we downloaded only the rows we needed using the portal's API. Then we used a Python script to put the thefts into groups:

Then we counted the thefts by month and by hour so the files are small enough to load in the browser.

Limitations: this is only crime that was reported. Also, about 3% of thefts are recorded at exactly 12:00 AM, usually because no one knows the real time, so midnight looks higher than it really is. Finally, in 2024 the police started using a new description, "THEFT FROM MOTOR VEHICLE" (about 2,300 thefts in 2024 and 5,900 in 2025). It doesn't match any of our groups, so it lands in "Other theft". Before 2024 these thefts were probably recorded under the dollar amount codes instead. That makes "Other theft" look like it more than quadrupled and makes "$500 and under" and "Over $500" look a bit lower than they really are, so View 2 leaves "Other theft" out of its caption.

Design Decisions

Interactions we implemented:

View 1 (thefts per month): We used a line chart because it shows change over time clearly. We used months instead of years so you can see the drop in spring 2020 and the summer peaks every year. The dashed lines show the stay-at-home order (March 2020) and the 2016-2019 monthly average, so you can see if a month was above or below normal. The average doesn't change when you zoom, so you're always comparing to the same thing.

Interactions in View 1: hovering over a point shows a tooltip with the number of thefts, how it compares to the 2016-2019 average, and the arrest rate (details on demand). Dragging across the chart zooms every chart to those years (brushing and linking).

Other options we thought about: a bar chart by year was simpler but hid the 2020 drop and the seasons. A stacked area chart by theft type made the total hard to read, and View 2 already shows the theft types.

View 2 (which thefts went up or down): We used a horizontal bar chart to show which theft types and locations changed the most after 2020. We compared the average yearly thefts in 2016-2019 with 2021-2025, leaving out 2020 because of the pandemic. We used yearly averages because the two periods have different numbers of years. Red bars show increases and blue bars show decreases. Horizontal bars also make the category names easier to read.

Interactions in View 2: Users can switch between theft type and location type. Hovering over a bar shows more details, and clicking a bar filters the other charts to that category. Clicking the same bar again clears the selection (filtering and linking).

Other options we thought about: a pie chart would show the share of each category but not how much it changed. A grouped bar chart would show both periods, but percentage-change bars make it easier to see which categories increased or decreased.

View 3 (when thefts happen during the day): We used a heatmap with one row per year and one column per hour, because it shows two things at once: the daily pattern (reading across) and how that pattern changed over the years (reading down). The color is the share of that year's thefts that happened in that hour, not the count. Some years had many more thefts than others, so with counts the busy years would just look darker everywhere and hide the change we care about. We used a yellow-to-red scale because the values only go one way (more or less of the day's thefts). The labels on the right group the rows into before, 2020 and after, in the same blue and red as the other charts.

The 12 AM column has stripes because it isn't reliable: when nobody knows when a theft happened, it is usually recorded at 12:00 AM. We left that column out when setting the colors, otherwise its fake spike would make every other hour look pale. The bracket above 1-5 AM points out the main finding: a bigger share of thefts happen overnight after 2020.

Interactions in View 3: hovering over a cell shows the number of thefts, its share of the year, and how that share compares to the same hour in 2016-2019 (details on demand). The heatmap follows the shared filters and the View 1 zoom, so you can check whether the overnight shift holds for one type of theft or one part of the city (filtering and linking).

Other options we thought about: a line chart with one line per year was too crowded with ten years, and the lines crossed a lot. Two side-by-side bar charts (before vs after) were easier to read but hid how the change built up year by year, and hid 2020.

Filters: We added year range, theft type, and city-side filters so users can explore specific theft patterns. All three charts use the same filters and update together. We also added a summary showing how many thefts match the current selection and a Reset button to return to the original view. This makes it easier to compare patterns without switching between separate pages (dynamic filtering). We first also had Theft / Motor vehicle theft checkboxes and a location dropdown, but we removed them to keep the panel simple: the theft type dropdown already has each motor vehicle group, and clicking a bar in View 2's location mode already filters by type of place. Two controls for the same thing could also contradict each other and leave every chart empty.

Development Process

We split the work by view so each person owned their own files. Mouhamadou did the data: the download script, the cleaning script, the page skeleton, the shared filter code that links the charts, View 1 and the dataset section of the write-up. Meksud did the filter panel and View 2. Buruk did View 3, the shared tooltip, the page layout and the demo video. Each of us wrote the design rationale for our own chart. We wrote down the shared parts (the data files, the filter names and what each view's functions take) in one PROJECT.md file before we started coding, so our charts worked together the first time we connected them.

We spent about 16 people-hours in total (from our work log): about 5 hours for Mouhamadou, 6.5 hours for Meksud and 4.5 hours for Buruk.

What took the most time:

What went well: agreeing on PROJECT.md first meant we could work at the same time without breaking each other's code. What we would do differently: check how each category changes year by year earlier, so we find recording changes like the 2024 one before building the charts.

AI Usage

We used AI (Claude and Chatgpt) as a coding helper. The design decisions were ours: we picked the dataset and our question, decided which crimes and years to include, chose the theft type and place groups, and designed the three linked views and how you interact with them. AI helped us turn those decisions into code faster.

AI saved a lot of time, but we still had to catch its mistakes. For example, simple keyword matching put barbershops in the "bar" group and bowling alleys in "street/alley", and the first version of the code was more complicated than it needed to be, so we rewrote it in the same style as our labs.

We also used AI to question our results, not only to write code. When View 2 said "Other theft" went up 326%, we asked AI to help check the raw data year by year. It found that almost all of the increase was the new "THEFT FROM MOTOR VEHICLE" code from 2024, so we explained it instead of reporting it as a real finding.

References