← Back to map
Rubber meets road  /  Summer youth employment

The summer jobs factor map: methodology & sources

How every measure was built, where it comes from, what was checked and what its limits are. The map pairs any two of 25 measures about young people, their poverty, work and schooling, arrests, violence and the summer jobs sites within a mile. It shows them by NYPD police precinct (the default, where every arrest, shooting and violent crime counts) or by City Planning neighborhood (finer, but without the records NYPD logs at a station house). Every measure and both geographies are described below.
For the judgment calls behind these methods, who made each one and what the alternatives were, see How I built this.

What the map is for

New York City's Summer Youth Employment Program (SYEP) pays 14- to 24-year-olds for summer work. Deciding where to add slots or sites means weighing several things at once: how many young people live in a neighborhood, how many are poor or out of school and work, how much violence and police contact young people there experience, and how many program sites are already nearby. The map does not combine these into a score. It lets a reader set any two side by side. Its companion, The summer jobs gap, builds an explicit need index at a coarser geography; What the evidence shows, Vital City's evidence browser, collects the evaluations of these programs.

Young people and summer jobs: the 25 measures

MeasureSource and formula
Residents 16 to 24; share; per square mileAmerican Community Survey (ACS) 2020–24 5-year estimates, table B23001 age-group totals (16–19, 20–21, 22–24, both sexes). Share divides by B01003 total population; density by land area.
Residents 14 to 24 (2020 count)2020 census Demographic and Housing Characteristics file, table PCT12, single years 14 through 24, both sexes. Matches the program's eligible ages exactly. Census Bureau disclosure-avoidance noise applies.
Children under 18; residents under 25; share under 25ACS 2020–24, B01001 age cells (under 5 through 15–17; under 5 through 22–24).
Poverty rate, ages 16 to 24B17001: below-poverty 16–17 and 18–24, both sexes ÷ (below + at or above) for the same ages. Students in college dorms are outside the poverty universe; students living off campus on their own are counted by their own incomes, which raises youth poverty around campuses.
Child poverty rateB17001: below-poverty under-18 cells ÷ all under-18 cells with poverty status determined.
Unemployment rate, ages 16 to 24B23001: unemployed ÷ civilian labor force, ages 16–19, 20–21 and 22–24, both sexes.
Teens 16 to 19 not in school or workingB14005: not enrolled in school and either unemployed or not in the labor force (high school graduates and non-graduates, both sexes) ÷ all 16- to 19-year-olds.
Young adults 18 to 24 without a diplomaB15001: 18–24 with less than 9th grade or 9th–12th grade without a diploma ÷ all 18–24.
Arrests under 18; ages 18 to 24; under 25 (counts and rates)NYPD Arrests Data (Historic), 8h9b-rp9u, calendar 2024, age_group "<18" and "18-24", NYPD's own jurisdictions only (jurisdiction_code 0, 1 and 2: patrol, transit and housing), placed where the arrest was made (see station houses below). Rates per 1,000 residents aged 10–17 (B01001 10–14 and 15–17), 18–24, or 10–24 for the combined under-25 measure. NYPD records age only in bands, so “under 25” (24 and younger) is the closest available cut to “under 24.”
Shooting victims under 25; shootings with a suspect under 25 (counts and rates)NYPD Shootings 5ucz-vwe8, Shooting Victims pztn-9bne and Shooting Offenders gdk4-mbsv, joined on incident_key; incidents July 1, 2023, through June 30, 2026, by occurrence date. A victim counts if victim_age_group is "<18" or "18-24"; an incident counts if any listed offender's perp_age_group is. Rates are yearly averages over the three years: victims per 10,000 residents under 25; incidents per 10,000 residents.
Violent crimes against people under 25 (count and rate)NYPD Complaint Data, Historic qgea-i56i (July–December 2025) plus Year-to-Date 5uac-w243 (January–June 2026), by report date (rpt_dt). Offense codes 101 murder, 105 robbery and 106 felony assault, with vic_age_group "<18" or "18-24". Rate per 1,000 residents under 25.
Summer jobs sites within a mileDepartment of Youth and Community Development (DYCD) Program Sites, ebkm-iyma, program_area = SYEP, latest fiscal year (2026, meaning summer 2025), year-round types dropped (Work, Learn & Grow and Year Round Sector Focus), one entry per location: 122 sites. The count is taken from where young people live: sites within 1 mile (great-circle distance) of each census tract's internal point from the 2020 Census Gazetteer, a point inside the tract near its middle, then averaged across the neighborhood's tracts weighted by residents 16 to 24. (A count of sites inside each neighborhood's borders was dropped from the menu on Oct. 9, 2026; the within-a-mile measure answers the access question better.)

Age bands. The program serves 14- to 24-year-olds. The survey's small-area tables on poverty, work and schooling break at 15, 16 and 18, so most measures here use 16 to 24, as The summer jobs gap does. NYPD's age groups are "under 18" and "18 to 24", so "under 25" here means 24 and younger.

Rates need enough residents. Arrest, shooting and violence rates are left blank where the relevant age group has fewer than 100 residents. Counts are always shown.

Where it happened, not where they live. Arrests, shootings and complaints are placed where they occurred; the survey counts young people where they live. Neighborhoods that draw young people from elsewhere, such as shopping strips and transit hubs, show high per-resident rates for that reason.

Station houses: where NYPD puts records it cannot place

NYPD's arrest data footnotes say arrests that cannot be geocoded are located at the station house of the precinct where they happened. The same thing happens, without a footnote, in the other files: in the first half of 2026, 1,003 of 1,065 rape complaints (94%) sit within 130 meters of their precinct's station house, a deliberate choice to protect victims, and shootings stack there too (20 shootings in the window sit on the 46th Precinct's station-house point). Left alone, a whole precinct's share of these records would land in the one tract that holds the station house.

These records have no known street location. The map finds them and leaves them out, in three steps:

  1. Find the station houses. The address of all 78 precincts was read from each precinct's page on nyc.gov and geocoded with NYC Planning's GeoSearch; every geocoded ZIP code matches the page. The 40th Precinct moved from 257 Alexander Avenue to 567 East 149th Street in late 2024, and NYPD still places 40th Precinct records at the old building, so both count (Bronx Times; Bronx Community Board 4).
  2. Pick a radius from the data. NYPD's station point and the geocoded address are not identical. Among 2024 arrests, in 75 of the 76 precincts with a large stack of arrests spanning at least 15 offense types, the biggest such stack sits within 140 meters of the geocoded station house. The exception is the 14th Precinct, where the biggest stack is Macy's Herald Square, a real arrest location; its station-house stack is second, 60 meters from the address. A record within 140 meters of its own precinct's station house is treated as placed there.
  3. Leave them out of the neighborhood view. A record within 140 meters of its own precinct's station house is not counted in any neighborhood. No record is ever assigned to a neighborhood by its precinct alone. The counts below are what the neighborhood view is missing; the precinct view counts all of them.
RecordsTotalAt a station house: left out of the neighborhood view, counted in the precinct view
Arrests of people under 25, 2024 (NYPD jurisdictions)51,471 with coordinates12,842 (24.9%): 3,153 of 9,450 under 18 (33.4%) and 9,689 of 42,021 aged 18–24 (23.1%)
Shootings with a suspect under 25, July 2023–June 202670281 (11.5%)
Shooting victims under 25, same period1,125141 (12.5%)
Murders, robberies and felony assaults with a victim under 25, July 2025–June 202610,057192 (1.9%)

What leaving them out costs. Counts and rates understate, and unevenly: the share of 2024 youth arrests logged at the station house ranges from 15% to 44% across precincts with at least 50 such arrests, so a precinct that logs more arrests this way looks lower than it is. A real incident that happens within 140 meters of a station house is also left out. The two alternatives were worse or less honest. Left where NYPD put them, a precinct's worth of records piles into the one tract holding the station house (some of those tracts carried as many as 95 extra violent felonies a year). Spread across the precinct in proportion to its other records, which an earlier version of this map did, they would be counted in neighborhoods by estimate rather than by any known location.

Where they do count: the precinct view. NYPD gives every record a precinct even when it has no street location, so a map drawn by precinct can count them all, and since Oct. 9, 2026 that is the map's default. A neighborhood map cannot: precinct lines cross neighborhood lines constantly. A precinct overlaps a median of four of the city's neighborhoods and as many as ten, and only 2 of the 78 precincts lie within a single neighborhood, so placing a station-house record in a neighborhood would mean guessing which part of the precinct it came from.

Records on a boundary

NYPD does not publish exact addresses. Its arrest data footnotes (number 4) say an arrest near an intersection is placed at the intersection and any other arrest at the middle of the nearest street segment, and the shooting and complaint files are placed the same way. Most census tract and neighborhood boundaries run down street centerlines, so many records sit exactly on a boundary, and which side they fall on would come down to hairline differences between NYPD's street map and City Planning's boundary lines. The build works tract by tract, the units the Census data arrive in, and shares any record within 10 meters of a tract boundary equally among the tracts that meet there; the tracts are then summed into neighborhoods. Of the 38,629 street-located youth arrests in 2024, 20,124 (52%) were shared this way, most of them between tracts in the same neighborhood, where the sharing cancels out; about one in five street-located youth arrests sits on a boundary between two neighborhoods. Counts can therefore be fractional.

Why 2024 arrests

NYPD's 2025 arrest file, as published in 2026, records the age group as the text "(null)" on 147,237 of 278,953 arrests (52.8%), falling from 67% of January arrests to 20% of December's: 61% in the Bronx, 55% in Brooklyn, 54% in Manhattan, 42% in Queens and 34% on Staten Island. Under-18 arrests in 2025 would therefore look half as common as in 2024 for no real reason. The build refuses any arrest year in which more than 2% of arrests lack an age. 2024 is complete (every arrest has an age group). As a check, the neighborhood pattern of 2024 youth arrests was compared with January–June 2026, the most recent complete months: the correlation across the 262 neighborhoods is 0.86 for under-18 arrests and 0.96 for arrests at 18 to 24.

Arrests by other agencies

NYPD's arrest file also records arrests under other agencies' jurisdictions (codes 3 and up, per the dataset's own column description). They are 1,223 of the 52,699 arrests of people under 25 in 2024 (2.3%), and the map leaves them out. Most come from a single point in Hunts Point, where 457 arrests of all ages in 2024 were recorded under jurisdiction code 72, mostly for offenses against public administration and felony assault. Left in, they would have doubled the 18-to-24 arrest rate of the Hunts Point neighborhood.

Shootings data quirks

On 2,084 of the 2,406 shooting incidents in the window, the latitude and longitude columns are swapped; the build detects and fixes each one. Every incident also carries NYPD's New York State Plane coordinates, and after the fix the two agree within 1.3 meters on every incident where both are valid. One incident had latitude and longitude of zero and was located from its state-plane coordinates (it sits at the old 40th Precinct station house and is left out accordingly). NYPD lists at least one offender for 1,478 of the 2,406 incidents (61.4%), so the suspect measure undercounts; an offender in this file is someone identified or described, not necessarily arrested.

Violent crimes against young people

Rape is excluded because its location is withheld (see station houses above). Of the 44,408 murders, robberies and felony assaults reported in the 12 months, 2,140 (4.8%) carry no victim age and are not counted; the share is steady from month to month. Most complaints without a victim age list a business or organization (mostly robberies) or the People of the State of New York, rather than a person, as the victim: 777 of the 962 in January–June 2026.

Summer jobs sites

DYCD's file lists one row per site, fiscal year, program type and contract. The build keeps fiscal 2026 (summer 2025), drops the year-round types and counts each distinct coordinate pair once, the same rules as The summer jobs gap; both yield 122 sites, the same number as in fiscal 2025. These are where provider organizations enroll and serve participants. The jobs themselves are at employer worksites whose locations DYCD does not publish, and its file has no slot counts by site, so site counts measure presence, not capacity.

Checks performed

Data sources

Geography: precincts and neighborhoods

The map opens on NYPD's 77 patrol precincts plus the Central Park precinct, using City Planning's shoreline-clipped precinct boundaries (NYC Open Data y76i-bdw7). A switch shows City Planning's 262 Neighborhood Tabulation Areas (NTAs) instead: 197 residential neighborhoods plus 65 parks, cemeteries, airports, military installations, jails or industrial areas. Both are built from the same census-tract data.

Precincts

Neighborhoods

Each neighborhood is built from whole 2020 census tracts, about nine on average, and the build works tract by tract before adding the tracts up.

Margins of error and reliability

The survey is a sample, not a count. Every estimate carries a margin of error (MOE) at 90% confidence, and for small youth groups it can be a large fraction of the estimate. The map shows it three ways:

MOEs for shares follow the Census Bureau's formulas in the ACS General Handbook, chapter 8: moe(p) = √[moe(x)² − p² · moe(y)²] / y when the numerator is part of the denominator, falling back to the ratio formula when the term under the root is negative; sums of cells use √Σmoe². NYPD counts and site counts are tallies, not estimates, and carry no MOE; the rates built on them inherit the uncertainty of their survey denominators.

Color scales

Two measures. Each measure is split into thirds (low, middle, high) across the areas that have both values, and the 3×3 palette colors each neighborhood by its pair of thirds. The legend labels the cut points and how many neighborhoods fall in each third; ties can make the thirds uneven. The correlation shown is Pearson's r across the same areas, each counted once regardless of population. Each ready-made comparison has one explanation per view, and a script checks every place, cell, borough count and correlation they name against the data on every build.

Summary statistics. The lowest, middle, average and highest values in the sidebar describe the areas on the map, each counted once. They are not citywide figures: the average of 77 precinct poverty rates is not the city's poverty rate.

Known limits

Reproducing this map

Source code is on GitHub. fetch_youth.py scrapes and geocodes the station houses and pulls the NYPD, DYCD and 2020 census data, placing every record in a tract (nypd_places.py does the placement, the station-house exclusion and the boundary sharing). fetch_precincts.py pulls the precinct boundaries and 2020 census blocks, works out how each tract splits across precincts, and counts every NYPD record by precinct for the same windows. build.py pulls the American Community Survey tables from Census Reporter, derives every measure tract by tract, sums the tracts into neighborhoods and precincts and writes the files the page reads. Each pull checks itself and stops rather than write an empty or implausible file. scripts_check_presets.py checks the ready-made comparisons against the data. The page is plain HTML and JavaScript, with Leaflet for the map and d3 for the color scales.