Community schools were the de Blasio cure-all. Did they work?
A reproducibility log: the data this analysis touched, the queries it ran, the outside sources it leaned on, and the steps a third party would follow to re-run it.
Summary
We couldn't get a machine-readable Community Schools roster from public sources (nyccommunityschools.org renders schools in image-based district pages; NYC Open Data carries no flag), so we report the program's headline counts plus an indirect view: the trajectory of the highest-need proclivity decile, which overlaps heavily with the program's served population.
Data sources
- Database tableschools
One row per New York City public school (DBN, name, district, borough, school_type, grade_band, latest_enrollment, proclivity_decile, proclivity_score, closed_at, admission_category).
- Database tableschool_year_metrics
Long-format per-school per-year metric facts (school_dbn, year, metric_key, subgroup, value, suppressed). Loaded from DOE/NYSED public files via scripts/loaders/*.
- Database tableproclivity_score / proclivity_decile
Composite student-body-challenge score (lower = lower-need, higher = higher-need) built from % economically disadvantaged, % English Language Learners, % students with disabilities. Decile 1 = lowest-need; decile 10 = highest-need.
- Loader script
scripts/loaders/_decile10_traj.tsPulls per-decile averages of chronic absenteeism, ELA, math, and grad rate at 2014-15, 2018-19, 2021-22, 2024-25.
- External datasetNYC DOE InfoHub — Community Schools program landing page (421-school count for 2024-25)
- External datasetnyccommunityschools.org — district pages (image-based; not directly scrapable)
Steps
Look up the program-size benchmarks from public sources: 45 schools at 2014 launch, 215 in 2017-18 (RAND study sample), 421 in 2024-25 (DOE InfoHub).
Pull per-decile averages of chronic absenteeism, ELA, math, and grad rate for still-open schools, restricted to (2014-15, 2018-19, 2021-22, 2024-25).
SELECT s.proclivity_decile, m.year, m.metric_key, AVG(m.value), COUNT(*) FROM schools s JOIN school_year_metrics m ON m.school_dbn = s.dbn WHERE s.proclivity_decile IS NOT NULL AND s.closed_at IS NULL AND m.subgroup='ALL' AND m.suppressed=false AND m.metric_key IN ('chronic_absenteeism_rate','ela_all_proficiency','math_all_proficiency','graduation_rate_4yr') AND m.year IN ('2014-15','2018-19','2021-22','2024-25') GROUP BY s.proclivity_decile, m.year, m.metric_key;Compare decile-10 (highest-need) movement with decile-1 (lowest-need) for the absenteeism + math chart.
Caveats
The decile-10 trajectory is NOT a Community Schools program-effect estimate — not all decile-10 schools are in the program, not all Community Schools are decile 10. The trend also reflects post-pandemic recovery and the 2022-23 state-test recalibration. Anyone wanting to claim Community Schools 'worked' or 'didn't' needs a matched-comparison design (RAND's 2020 method), not the proxy trajectory shown here.
References
Reproduce
To get the proper analysis, FOIL the NYC DOE Office of Community Schools for a DBN-keyed current roster, or scrape each district page at nyccommunityschools.org/district-N. Once a roster is loaded, run the same matched-comparison design as the Renewal Schools story (renewal-schools-postmortem) but with the Community Schools DBN list. To replicate the proxy trajectory in this story, run `npx tsx scripts/loaders/_decile10_traj.ts`.
The recipe lives at data/stories/recipes.ts in the repo. Corrections welcome.