Martin Ngoh
Case study

Justice Lens

A live platform that measured DC policing against MPD's own records. Nine analyses, two baselines, results published whichever way they point.

Archived in October 2026. I checked who used it: a few dozen readers a day, nearly all landing on the monthly neighborhood briefs. So I moved the findings into Residents Count's Policing in DC series, kept the briefs as a static archive, and shut down the servers and database.

2026, archived October 20261.4M+ public recordsPython, FastAPI, PostgreSQL500+ automated tests
Read the findings Archived briefs
Justice Lens home page with its key findings
While it ran, every number was recomputed from the latest data on page load, with its method and caveats beside it.

Why I built it

To understand how policing in DC lands across race. MPD publishes the records, but nobody was measuring them against baselines, continuously and in public. I hadn't seen anything like it.

The data

SourceRecordsWindow
MPD stops of persons509,000+July 2019 to 2025
MPD adult arrests320,000+2013 to 2025
Reported incidents588,000+2008 to present, daily
Moving violations7.9M2023 to 2025, 98.6% camera
Population by tractACS2019 to 2023

DC Open Data and the Census API. Counts as of the July 2026 releases.

Method

Two baselines: who lives in each police district, and the crime its residents report. Nine analyses:

Outcome test

If searches of Black and non-Black people find contraband at the same rate, the extra searches of one group are not finding more. Direction is claimed only when a two-proportion z-test is significant at 5%.

Veil-of-darkness test

If officers see race before stopping someone, daylight stops should skew Blacker than after-dark stops at the same clock time. Stops in the 4:45 to 9:09 PM twilight window, lit by NOAA sunset times, pooled with a Mantel-Haenszel odds ratio across 30-minute strata.

Search-threshold test

Equal hit rates can hide searches made on thinner suspicion. A Bayesian model infers the evidence bar itself for 14 cells (7 districts by race), fitted with emcee MCMC.

Map of DC police districts shaded by how far Black residents' share of stops exceeds their share of the population
Stops by district, 2023 to 2025, each shaded against its own population.

Findings, October 2026

6.67x

In the 2nd District, 8% of residents are Black but 53% of people stopped were. Citywide: 1.82x, and above parity in all 7 districts.

MPD stops 2023 to 2025, N = 26,116
4.5x

Black stopped people were pat-down searched at up to 4.5x the rate of everyone else. Hit rates were the same: 13.9% vs 12.5%.

14,487 searches with an outcome, 2019 to 2025
0.05 vs 0.08

The inferred bar for searching Black people is lower than for everyone else. Searches proceed on thinner suspicion.

Threshold model, gap 0.038 (0.019 to 0.059)
0.93

No daylight effect. The disparities are not explained by officers reacting to what they can see. This one favors MPD.

Mantel-Haenszel odds ratio, 95% CI 0.90 to 0.96, N = 127,947

Results that favor MPD are published at the same prominence as those that do not.

Chart of the Black share of stops by clock time, daylight versus after dark, with the two lines nearly overlapping
Veil of darkness: daylight and after-dark stops track each other in every stratum.

Engineering

What I would change

I removed the AI features

Between July and September 2026 I retired the Ask AI chat, the map's natural-language query and the AI reports. They gave verdicts the data could not support. Trust and accuracy mattered more.

The population baseline

Stop rates are compared to residents, not to who is on the street. Downtown's daytime population is not its residents.

Small cells

The non-Black hit rate rests on 1,081 searches. More years of data would tighten the intervals.