365-day rolling count
Cumulative shootings by day of year
Monthly counts
Note on location accuracy: Nearly every shooting record carries usable coordinates. NYPD geocodes incidents to street-segment midpoints and intersections (not exact addresses), so repeat locations legitimately share identical coordinates. A small share (~3%) sat at pile-up coordinates within 100 m of the precinct stationhouse — NYPD's default when an address can't be geocoded. Most of those were recovered by cross-matching to the NYPD Complaint dataset (… of all incidents); the unrecoverable … are excluded from the Neighborhood (NTA), NYCHA-development, and map views (still counted in borough and precinct totals). Mapped share: …. An earlier version of this dashboard flagged ~40% of incidents as stationhouse geocodes; that heuristic misclassified genuine repeat locations and was corrected in August 2026 — see About → Geocoding.
Borough counts by year
Precinct counts by year
Neighborhood hotspots (NTAs) — with linked map
NYC Neighborhood Tabulation Areas are official boundaries from NYC's Department of City Planning — the same geographies the Census uses to summarize data about the city. ~262 NTAs cover the city; about 197 are populated residential areas (parks/cemeteries/airports excluded). Incident counts (one row per shooting, not per victim) include only precisely-geocoded shootings (see About → Geocoding for why). Click a neighborhood name (or any number cell) to zoom the map to that area + time window.
NYCHA developments
Shootings within an adjustable buffer of an NYCHA campus boundary. NYPD geocodes incidents to street centerlines, so points often land just outside the campus polygon — widening the buffer captures more of these street-curb incidents (and risks swallowing neighboring blocks). Click any development name to see its footprint and tagged incidents on a map.
Note on missing data: NYPD does not always identify a suspect. In our data, a meaningful share of incidents have no suspect record at all (structural), and many suspect records have demographic fields marked UNKNOWN. Both are shown explicitly below — never silently filtered out. Suspect-side numbers are inherently incomplete.
By race, over time
By age group, over time
By sex, over time
Incidents with no identified suspect
Location type
Shootings by location classification. The HOUSING category includes both NYCHA and private multi-dwelling buildings; STREET is most common throughout. UNKNOWN/PRE-2022 reflects records before NYPD added this field in 2022.
Specific location descriptions (top 12)
About this dashboard
Long-running personal project to track NYC shootings, rebuilt from a 10-year Excel workflow into a Python pipeline + GitHub Pages site so the work can keep up with NYPD's quarterly data updates.
Data sources
Methodology notes
- Geocoding fallback to precinct stations.
About ~3% of incidents have lat/lon set not to the actual incident location but to the
precinct stationhouse — NYPD's default when an address can't be geocoded. Detected by
flagging any exact coordinate shared by ≥3 incidents of one precinct that sits within
100 m of that precinct's stationhouse (stationhouse locations compiled from the NYC
Facilities Database and City-Owned-Property records; see
data/reference/stationhouses.jsonin the repo). Most are recovered via the Complaint dataset (next note); the remaining … are excluded from NYCHA and NTA spatial joins, and hidden by default on the map.
Correction (August 2026): an earlier version flagged ANY exact coordinate shared by ≥3 same-precinct incidents, without checking it against the stationhouse — about 40% of all incidents. Testing every such pile-up against actual stationhouse locations showed the overwhelming majority are genuine repeat locations (NYCHA campuses and persistent hot corners recurring across 10–16 different years): NYPD geocodes to street-segment midpoints, so identical coordinates are expected, not suspicious. Those incidents are now treated as precisely located, which materially raised the NTA and NYCHA counts below. - Coordinate recovery via the NYPD Complaint dataset.
Many shootings also appear in the separate NYPD Complaint Data (Historic) feed, sometimes with
better lat/lon than the shooting dataset. We recover those where we can, using two rules:
- Fatal shootings: deterministic ID match — a MURDER complaint with
cmplnt_num = incident_key + 'Hn'is treated as the same incident. - Non-fatal shootings: fuzzy match on same date + same precinct + time within ±60 minutes + offense in {FELONY ASSAULT, ROBBERY}, picking the time-closest candidate.
- Fatal H-suffix match: 85% of matched coords land within 75 m of the true incident.
- Non-fatal fuzzy match: 87% within 75 m of truth; 81% within 25 m.
- Fatal shootings without an H-suffix match are not recovered via fuzzy (validation showed only 43% accuracy for that path).
geocoding_quality = "precise_from_complaint"and acoord_sourcefield records which rule fired. On the map they appear with a dashed blue outline. - Fatal shootings: deterministic ID match — a MURDER complaint with
- Schema break in 2025. NYPD replaced its single all-in-one dataset with three normalized datasets (incidents, victims, suspects/offenders). This dashboard reconciles them and uses the archived dataset only to backfill the small number of historical incidents missing from the new feeds.
- Lat/lon swap. The current Shootings (2006-Present) dataset has its
latitudeandlongitudecolumns swapped in the API response. The pipeline detects and corrects this. - Murder flag. Moved from incident-level to victim-level in the 2025 reorg; the incident-level flag here is derived as TRUE if any victim has stat_murder_flg='Y'.
- NYCHA join. 100-foot buffer around official NYCHA campus polygons. NYPD geocodes incidents to street centerlines, so strict point-in-polygon misses sidewalk-adjacent shootings. Even with the buffer, each shooting is attributed to at most ONE development — no double-counting.
- COVID period. NYC declared a State of Emergency on March 12, 2020; Mayor Adams rescinded it on September 5, 2022. Shaded as a single band on the rolling-count chart.
- Raw counts, not rates. Heatmaps and tables show shooting counts, not population-adjusted rates. Precinct populations vary widely; high counts in big precincts may not mean elevated per-capita risk.
- Most recent year is partial. The current quarter is excluded from year-by-year heatmaps so an in-progress year doesn't make everything look like a drop-off.
- What this dashboard does not show. The NYPD shooting datasets contain no domestic-violence indicator, so a DV vs non-DV split is not derivable. A planned future feature is a baseline-comparison view that pegs the current year to 2019 (the last full year before COVID); not yet implemented.