NYPD Crime Data Analysis

An analysis of the NYPD Hate Crimes open dataset that compares reported incidents, bias motives, and offense severity across pre-COVID, during-COVID, and post-COVID periods.

Academic research

My role

Performed the data cleaning, exploratory analysis, visualizations, statistical testing, and modeling, and wrote the final report.

Bar chart of reported hate crimes per month: 36.0 pre-COVID, 36.6 during COVID, 49.9 post-COVID.
Reported incidents per month
36.0 → 49.9Pre-COVID vs. post-COVID, normalized by period length.
Chi-square: bias motive vs. period
p < 0.001Bias-motive distributions differed across periods.

The problem

Raw incident counts can mislead when the periods being compared have different lengths and when reporting practices change. The questions were whether hate-crime frequency changed across the pandemic periods, whether bias motives and offense types shifted, and whether offense severity could be predicted from those factors.

My contribution

I cleaned the NYPD data, defined the three periods, built the exploratory visualizations, ran the statistical tests and model, and wrote up the findings and limitations.

What I built

I converted dates, removed records missing key values, and assigned each incident to Pre-COVID (before March 2020), During COVID (March 2020 through December 2021), or Post-COVID (January 2022 through April 2025). Because the periods differ in length, I normalized counts to incidents per month before comparing them, then examined bias motives and offense severity within each period.

  • Distributions of incidents by period, bias motive, and offense severity.
  • A heatmap and normalized stacked bars of bias motives across periods.
  • A chi-square test of whether bias-motive distributions differ by period.
  • A logistic regression classifying felony vs. misdemeanor from period and bias motive.

How it works

The analysis moves from cleaning and period definitions to normalized comparisons before any statistical claim.

  1. NYPD Hate Crimes open data
  2. Cleaning + period assignment
  3. Normalized exploratory comparisons
  4. Chi-square testing
  5. Logistic regression + limitations
Heatmap of bias motive counts across Pre-COVID, During COVID, and Post-COVID periods, with anti-Jewish incidents highest in every period.
From the final report: bias motives across the three periods. Anti-Asian incidents peaked during COVID; anti-Jewish incidents were the most common throughout.

Key decisions

Normalize before comparing.

The post-COVID period is far longer than the others, so incidents per month, not raw totals, carry the comparison.

Separate association from cause.

The report describes changes across periods without claiming the pandemic caused them.

Report a modest model honestly.

The severity classifier reached 56% accuracy, which the report presents as a limited result rather than a predictive success.

Outcomes & evidence

Normalized by period length, reported hate crimes rose from 36.0 per month pre-COVID and 36.6 during COVID to 49.9 per month post-COVID. A chi-square test showed bias-motive distributions differed significantly across periods: anti-Jewish incidents were the most common throughout and rose post-COVID, while anti-Asian incidents peaked during COVID.

The logistic regression for offense severity reached 56% accuracy, a modest result that points to the need for richer contextual variables.

Scope & limits

The dataset reflects reported incidents, which can be affected by underreporting and changing classification practices, and the period boundaries are approximations. The public repository linked from the previous portfolio is not currently available; the figures here come from the final report.

What I learned

Statistical comparisons need explicit definitions, normalized measures, and an honest boundary between association and cause.

Built with

PythonpandasNumPyMatplotlibseabornSciPyscikit-learnJupyter

More projects

All projects