How I built this
Every step from the city's 311 file to the page, and every judgment call along the way: what was decided, why, the alternative, what difference it makes and who made the call. Formulas and exact counts are in the methodology.
Who did what. Josh Greenman asked the questions: which 5% (or whatever share made sense) of locations draw the most 311 complaints, what those complaints are and what share of all complaints they make up; then for an interactive infographic; then whether the most prolific filers file too fast to be human. Claude (Anthropic's Claude Code) chose the definitions, pulled and processed the data, wrote the code and the text and ran the checks. Calls marked "Claude" are open to Josh's review.
The build, step by step
- Pulled counts of complaints by address, ZIP code and complaint type for each quarter since January 2020 (28 queries) and checked that they add up to the dataset's row count.
- Cleaned addresses, set aside entries with no house number, and ranked 1,301,096 street addresses by complaints.
- Computed the share of complaints held by each slice of addresses, and the mix of complaint types inside each slice.
- Pulled coordinates for every address and every individual record for 22 of the busiest addresses.
- Measured the timing of complaints at those 22 addresses.
- Built the page: two grids of 1,000 squares tied to a slider, category and type charts, a map of the top 5% and an annotated list of the busiest addresses.
Judgment calls
A location is a street address plus ZIP code
- Decision
- Rank addresses as 311 records them, after cleanup, keyed by address and ZIP code.
- Why
- It matches what a reader means by "a location" and needs no outside data.
- Alternative
- Tax lot (BBL) would merge buildings with several addresses and split nothing; rounded coordinates would merge neighbors.
- Effect
- A big complex with several street addresses counts as several locations.
- Who decided
- Claude
Entries without a house number are not ranked
- Decision
- Set aside 1,243,802 complaints filed under a street name, park or airport (Broadway in one ZIP code, Central Park, JFK) along with 944,278 with no address.
- Why
- Those entries cover a stretch of street or a whole park, so ranking them beside single buildings mixes different things.
- Alternative
- Rank them as locations, which the first answer in chat did.
- Effect
- The top 5% share fell from 55.3% (66,371 addresses, in the first answer in chat) to 51.6% (65,055 addresses). The headline "just over half" holds either way.
- Who decided
- Claude
Shares use all complaints as the base
- Decision
- Divide by all 22,788,256 complaints, including the 9.6% with no street address.
- Why
- Josh asked what share of total complaints the slice accounts for.
- Alternative
- Divide by complaints that have a street address.
- Effect
- The top 5% share would be 57.1% instead of 51.6%.
- Who decided
- Claude, following Josh's wording
Address cleanup
- Decision
- Uppercase, collapse spaces and spell out six abbreviations.
- Why
- Older records store some addresses with doubled spaces, which would split one building into two.
- Alternative
- Use the raw strings.
- Effect
- The abbreviation rule touched 22,924 complaints. The doubled spaces matter more: 655 East 230th Street has 237,208 of its complaints under the doubled-space spelling.
- Who decided
- Claude
Six categories
- Decision
- Group complaint types into apartment and building conditions, noise, parking and vehicles, police and street order, streets and sanitation, and everything else.
- Why
- Readers need a handful of kinds to compare slices; 311 has 261 type names.
- Alternative
- Group by the agency that handles each type, which puts most noise and parking together under the police.
- Effect
- Category shares depend on the lists in the methodology.
- Who decided
- Claude
Default slice of 5%
- Decision
- Open the page at the top 5% and let readers move the slider from 0.1% to 100%.
- Why
- Josh suggested 5% "or whatever is the right number." The curve has no natural break, so the slider lets readers pick.
- Alternative
- Open at 1%, where the top slice holds about 30% of complaints.
- Effect
- None on the numbers.
- Who decided
- Josh (5%), Claude (the slider)
Map coordinates
- Decision
- Use each address's coordinates from the quarter with the most located complaints.
- Why
- The geocoder sometimes places one address in two spots; an average could fall between them.
- Alternative
- Average all coordinates.
- Effect
- 2,290 of the top 5% have quarterly points more than 100 meters apart.
- Who decided
- Claude
Naming addresses
- Decision
- Show and name the busiest addresses, including private homes.
- Why
- They are published in the city's open data, and the timing findings depend on them. The page says these are complaints filed, not problems found, and that the data does not identify filers.
- Alternative
- Show only counts by neighborhood.
- Effect
- Readers can find a specific building. Josh should review this call before the page is shared widely.
- Who decided
- Claude, flagged for review
How to describe the fastest filing
- Decision
- Say the timing "looks automated" and give the measurements; say nothing about who files or why.
- Why
- Hours of complaints at an even 172 an hour and nights of gaps of 38 seconds are hard to square with a person filing by hand, but the data cannot show what tool or person is behind them.
- Alternative
- Call it a bot, or speculate about the filer.
- Effect
- The page stops short of the tip that the filer is a bot and sticks to what the timing shows.
- Who decided
- Claude
Sorting closing notes into outcomes
- Decision
- Sort the city's closing notes into eight outcomes with written rules, and publish every note with its outcome.
- Why
- The status field marks almost everything closed. The notes carry the outcome, but in about 1,260 different wordings.
- Alternative
- Read a sample by hand, or use only the status field.
- Effect
- Citywide, 15.7% of complaints got a note with no clear outcome. One note, a promise to keep a location under observation for idling trucks, was moved from action to no clear outcome after review, which lowered the top addresses' action share by less than one point.
- Who decided
- Claude, at Josh's request to add outcomes
What to compare the busiest addresses with
- Decision
- Compare each complaint type at the busiest addresses with the same type at every address outside the top 0.1%, weighted to the busiest addresses' mix of types.
- Why
- Complaint types end differently: heat complaints rarely end in a violation, parking complaints often do. A raw comparison would mostly measure the mix.
- Alternative
- Compare with the citywide average directly.
- Effect
- Raw, the citywide action share is 25.4%; adjusted for the top 130 addresses' mix, it is 28.2%. Their observed share is 11.2% either way.
- Who decided
- Claude
Saying what the data does not show
- Decision
- Put a list of what the outcomes cannot tell readers next to the findings.
- Why
- The notes are the agencies' own words and the data has no visit records, so several natural readings of the gap cannot be tested.
- Alternative
- Leave the caveats to the methodology.
- Effect
- None on the numbers.
- Who decided
- Josh asked for it
Chart colors
- Decision
- Use the house inks, with a pink in place of lilac and a gray for "everything else."
- Why
- Lilac and cobalt were too close for readers with normal vision and with red-green color blindness; the swap passed a color-separation check against the black page.
- Alternative
- Keep lilac.
- Effect
- None on the numbers.
- Who decided
- Claude
How the numbers were checked
- The 28 quarterly pulls sum to 22,788,256, equal to the dataset's own count of 22,788,256.
- The concentration figures were computed twice: once in the first analysis in chat and again in the page build, with matching results before the house-number rule was added.
- The first record-level pull returned 4,522 complaints for 655 East 230th Street, against 241,730 in the counts. The cause was the doubled-space spelling; the pull was rewritten to match every spelling, and the record counts now match the aggregate counts for all 22 addresses.
- Group facts quoted on the page (distances between addresses, totals, years) were checked against the built data, and the page computes its numbers from the data files rather than typing them in.
- The page's script was syntax-checked, and the page was loaded and clicked through at desktop and phone widths.
Change log
- Oct. 14, 2026: first version.
- Oct. 14, 2026: the slider now goes down to the top 0.01% (130 addresses), at Josh's request.
- Oct. 14, 2026: added "How these complaints ended," comparing agencies' closing notes at the busiest addresses with the same complaint types elsewhere, with a list of what the comparison cannot show, at Josh's request.
What this page does not do
- It does not adjust for building size or population.
- It does not identify who filed any complaint, or say whether a complaint was valid. The outcome section reports what agencies wrote when they closed complaints, which is not the same thing.
- It does not follow complaints over time beyond the yearly bars and the timing study of 22 addresses.
- It does not cover 311 requests before 2020, which sit in a separate dataset.