About this data
The map shows complaints reported to the New York City Police Department from 2016 to 2025, from the city's open data. This page explains what that means.
Complaints, not crimes
Each record is a complaint: a report of a felony, misdemeanor or violation that the NYPD took down. It is not an arrest, a charge or a conviction, and some complaints turn out not to be crimes at all. Many crimes are never reported, and reporting rates differ between offenses and between neighborhoods, so the map shows where complaints were made, not where crime happened or how safe a place is.
"Enforcement offenses" (drugs, weapons, traffic and impaired driving, public order) mostly record what police officers found on patrol. They rise and fall with where and how police work.
The map uses 18 offense types of its own, built on the NYPD's offense codes, in four groups. It never shows the age, race or sex of suspects or victims.
Report date, not occurrence date
Complaints are counted by the day they were reported. That date is always present and is how the NYPD publishes the data. The day and time a crime happened is often missing or uncertain (it may be a range, such as "while I was away"), so it is used only in the "Day and hour" chart. A complaint reported in January about something that happened in December counts in January.
Data runs from January 2016 through December 2025. The NYPD updates the historic file quarterly; this map is rebuilt from it.
Locations are rounded
To protect privacy, the NYPD moves each complaint to the middle of the block or to the nearest intersection. Many complaints share the same point. When you zoom in, each dot is one of those points, sized by how many complaints it holds and colored by its most frequent offense group; it is never one person's address.
Hot spots group complaints into hexagons about 180 meters on a side (roughly eight blocks), so that rounding to a block doesn't matter at that scale.
Withheld locations
For rape and sex crimes (including sexual exploitation) the NYPD withholds where they happened, to protect victims, and places them at the precinct station house instead. The map counts these complaints in the city, borough and precinct totals but never draws them on hexagons or as points: every station house would show up as a false hot spot. They are marked † in the offense list.
A small share of other complaints has no location at all. Those are counted in the totals and the one-sentence summary says how many.
Rates and their caveats
Precincts and boroughs are colored by complaints per 1,000 residents a year, because raw counts mostly measure how big or busy a place is. Residents come from the 2020 Census, summed from census blocks inside each precinct.
- Places where few people live but many work, shop or visit (Midtown, for example) come out high per resident. Precincts with fewer than 2,000 residents are hatched and not rated.
- "Compared with the city" divides a place's rate by the city's; "1.4×" means 40% more complaints per resident than New York City as a whole.
- Every comparison over time uses one baseline: the same months of 2019, the last year before the pandemic changed both crime and reporting (a longer period is compared as its yearly average; periods that start before 2020 are compared with the period before). Small numbers swing a lot, so under 20 complaints the panel shows both counts instead of a percentage. A single location that only appears in later years is not compared at all: NYPD sometimes changes where it places complaints.
- The 116th Precinct was created in December 2024 from parts of the 105th and 113th. For periods before 2025 the three are shown as one area.
How colors are set
On the light map, darker means more; on the dark map, brighter means more. Precincts and boroughs follow the same rule as the hexagons, so each map reads one way.
Hexagons are split at the 20th, 40th, 60th, 80th and 95th percentiles of the hexagons with complaints anywhere in the city, rounded, so the deepest shade is the top 5% and the busiest areas can still be told apart. Column height shows the count too. Precincts are split into six classes with about the same number of precincts each. The classes are computed for the whole city, so panning or zooming never recolors a place; they change only when you change the dates or offenses. The key always shows the ranges, the unit and the period.
When you zoom in, the key switches to the dots: their color is the offense group with the most complaints at that location, and their size grows with the number of complaints there.
The density color is a single plum hue, chosen because it reads as neither water, parks nor alarm. The four offense groups have their own colors, used only for the dots and the offense list. Highlighter yellow marks the block or neighborhood you are pointing at in a chart.
Why I made this map
I built this as a personal project, but it started two years ago. For a university project, I made a scrollytelling piece about New York's 311 complaints, the things New Yorkers call the city about. It was the first time I looked at a whole city through what its people report. What stayed with me was how plainly it showed inequality: counted per resident, some parts of the city reported far more problems than others. A few simple numbers made the city's social divides hard to ignore. I was left wanting more than a story you scroll through once.
This year I started working on a newspaper's data team in Buenos Aires, where I've been building maps of my own city's complaints, block by block, with a search by address. That work changed how I think about data. On a map you start from your own street, and the numbers stop being abstract. What better and more reliable way to understand data than a map?
I'm finishing my degree in data science, and this is the project I wanted to close it with: going back to New York, now with ten years of NYPD complaints and everything I've learned since. I want people to understand where they live, how they live and how it changes through time.
Ramón Eppens
How it was built
Everything comes from public data. From NYC Open Data:
- NYPD Complaint Data Historic, the complaints themselves (snapshot of April 28, 2026)
- 2020 Neighborhood Tabulation Areas, the neighborhoods
- Police Precincts
- NYC Street Centerline (CSCL), for streets, blocks and the address search
- 2020 Census Blocks and 2020 Census Tracts, to count residents
Resident counts come from the 2020 Census (U.S. Census Bureau API). To check the numbers, the map is compared with the NYPD's own CompStat figures for the seven major felonies: citywide totals are within 1% of CompStat in every year from 2016 to 2025, and 97% of precinct-years are within 2%.
A set of Python scripts downloads the data, cleans it, places each complaint in its neighborhood, precinct and street, and writes small files the map reads. The map runs entirely in your browser: MapLibre draws the streets, deck.gl draws the data and DuckDB answers each filter on your own device, without a database server. Base map by CARTO, map data from OpenStreetMap contributors. Type: Newsreader and Schibsted Grotesk.
I wrote the code with the help of Claude Code, an AI coding assistant. The decisions are mine: what to count, how to group offenses, how to compare places, what to leave out, and checking the results against NYPD's figures. Each one is written down, with the reason, in the project's decision log.
The code, the data notes and the decision log are open on GitHub under the MIT license.