Profile picture

Fatal Force

Analysing a Decade of Fatal Police Shootings in the United States

Posted on March 05, 2026

project image

Overview

This project analyses over 10,400 fatal police shootings in the United States recorded by Washington Post between January 2015 and 2024. The data covers details about each incident including the victim's race, gencer, whether they were armed, and whether a mental health crisis was involved.

The analysis was done using four US Census datasets, which are, median household income, poverty rates, high school graduation rates, and racial demographics by city. This was carried out to explore whether socioeconomic factors correlate with where and how police killings occur.

The project was built entirely in Python using Google Colab and covers everything from data cleaning and explorataory analysis to interactive visualisations and a racial disparity rate model.

Background and Context

Police use of lethal force in the US is one of the most debated topics. The Washington Post started building a database containing the fatal record of police shootings in 2015 because no comprehensive federal record existed and it has been tracking the numbers ever since.

This project was an opportunity to work with a real, socially significant dataset and adk meaningful questions:

  1. Are certain communities killed at disproportionate rates?
  2. Is there a trend over time? 
  3. Which agencies are responsible for the most deaths?
  4. Do poverty and education levels connect to where killings are concentrated?

The goal was not just to clean and chart data, but to tell a story that both a data scientist and a general reader could follow and take something from.

Tools

Tool/Library How it was Used
Python:  Core language for all data work
Pandas: Loading, cleaning, transforming and merging 6 datasets
Numpy: Numerical Operations and array manipulation
Plotly Express:             Interactive bar, pie, line, choropleth and treemap charts
Matplotlib: Static chart framework underpinning Seaborn visuals
Seaborn: KDE plots, joint plots, regression and heatmaps
Google Colab: Cloud notebook environment
Collections: Python's Counter used to tally unarmed victims and weapon types

 

 

 

 

Key Analysis Highlights

The analysis is broken into several questions, each backed by data and a visualisation.

1. Poverty, Education and Geography

Before diving into the shootings, the Census datasets were explored to understand socioeconomic context. Mississippi has the highest average poverty rate (28.88%) of any state; New Jersey the lowest (8.19%). A dual axis line chart and regression plot confiem a clear inverse relationship: "as povery rises, high school graduation rates tend to fall." 

Dual line chart - Poverty rate vs high school graduation rate

   Regplot - Poverty rate vs high school graduation rate

 

2. Who is Being Killed?

In numbers, White Americans account for the most fatalities (4,659), but that only reflects their larger share of the overall population. Black Americans represent 2,486 of the victims, Hispanic Americans 1, 717. A donut chart shows the racial breakdown at a glance. 

Donut chart - Racial breakdown of fatal police shootings

Men make up the overwhelming majority of those killed; 9,943 compared to 462 women. About 14.56% of all victims were under 25years old.

Bar Chart - Total deaths of men and women

3. Armed or Unarmed?

Over 58% of those killed were carrying a gun. A knife was the second most common weapon. Crucially, 565 people (5.42% of all cases) were entirely unarmed when they were shot. The chart below shows the top 10 weapon types.

Horizotal bar chart - Types of weapons carried by the deceased

4. Mental Health

19.7% of fatal shootings involved someone experiencing a mental health crisis at the time. That is nearly 1 in 5 cases. This figure raises serious questions about the role of mental health support in crisis response.

Pie Chart — Proportion of Killings Involving a Mental Health Crisis

5. Cities with the Most Killings

Los Angeles leads with 157 fatal shootings, followed by Phoenix (130) and Houston (125). but the racial profile within each city differs sharply; 60.5% of  Los Angeles victims are Hispanic while in chicago, 77.2% of Victims are Black. The chart below shows the top 10 cities with police shootings.

Bar Chart — Top 10 Cities by Number of Fatal Police Shootings

6. Racial Disparity Rate - The Most Important Finding

Raw counts didn't tell the full story. To measure true disparity, a kill rate was calculated for each race: the share of killings attributed to that race divided by their share of the local population. A rate of 1.0 means a group is killed exactly in proportion to their population. Anything above 1.0 signals over-representation. The results are clear and hard to ignore. In Chicago, Black Americans are killed at 3.55 times their population share. In Houston and Los Angeles, Black residents face a kill rate of 4.0. This means they are four times more likely to be killed relative to their population than the average resident. This pattern hold across almost every major city in the analysis. Native-Americans have a kill rate of 3.8 in Denver and 3.1 in Las Vegas.

Heatmap — Killings Rate Ratio by Race Across Top 10 Cities

7. Is it Getting Worse Over Time?

Yes. Police killings have increased every single year since 2015; from 995 in 2015 to 1,175 in 2024. The trend line doesn't show dramatic spikes, but the steady upward direction is hard to ignore.

Line Chart — Fatal Police Shootings Per Year (2015–2024)

Multi-Line Chart — Police Killings by Race Over Time

8. Which Agencies Are Responsible?

The LAPD recorded the most shootings of any single department (144), followed by the US Marshals Service (136) and the Phoenix PD (125). Local police departments account for roughly 60% of fatal shootings nationally. California and Texas dominate the state-level breakdown. The charts below shows the top 10 police agencies and their total fatalities, the second shows the 15 highest fatality states and the agencies involved.

Horizontal Bar Chart — Top 10 Police Agencies by Total Shootings

Treemap — Highest Fatality States and Their Top Agencies

Challenges and Learnings

  • Computing the racial disparity rate: This required merging multiple datasets across inconsistent city naming conventions. Some cities appeared under different names or spanned multiple states, so a custom matching logic was built to map city names correctly before joining.
  • Handing multi-valued fields: Some fatalities were lined to more than one police agency (e.g "491;492"), while some victims were listed with mixed racial identifiers (e.g. "W;B"). Both required careful parsing and a decision on how to handle edge cases without distorting the overall counts.
  • Missing data: Not every record had a race, age, or county entry. Rather dropping rows or filling blindly with zeros, which would skew the analysis, missing categorical values were retained as "unknown" where appropraite, and median inputation was used only for household income.
  • Animated heatmaps: The animated density heatmap showing racial killings by sate across years initally had disappearing categories when a race had zero killings in a given year. The was fixed by re-indexing with a full MultiIndex of all year-state-race combinations, filling the gaps with zero.

Less Challenging Activities

  • Exploratory data checks: inspecting shape, column names, null values and duplicates across all six datasets was straightforward and helped map out the cleaning work needed upfront.
  • Grouping and aggregating with Pandas: once the data was clean, tasks like ranking states by poverty rate or counting fataalities by city were quick to execute with groupby and value_counts.
  • Building the charts with Plotly: Plotyly Express made it easy to go from a clean dataframe to an interactive, well-labelled chart in just a few lines.
  • Renaming and standardising race codes: replacing single-letter codes like "W", "B", and "H" with their full names made the visualisations immediately readable without any additional explanation.

Outcome

The analysis confirmed what many studies have suggested: "that Black Americans are killed by police at rates far exceeding their share of the population, and that this pattern is consistent across cities, years and agency types". It also showed that the total number of fatal police shootings in the US has been rising steadily every year for a decade.

 Beyond the findings, the project sharpened several key data skills: multi-dataset merging, missing data strategy, building a custom disparity metric from scratch, and communicating complex finding clearly. The annotated choropleth maps and animated heatmaps also pushed the visualisationg work beyond standard bar charts into genuinely informative storytelling tools.

The Washington Post's own analysis of this data can be read here: Washington Post's Analysis

 

Code on GitHub: fatal-force repository