District-run enrollment fell by 60,000 in nine years while charter enrollment rose by 24,000
A reproducibility log: the data this analysis touched, the queries it ran, and how a third party would re-run it.
Summary
Summed October membership by sector for every year 2016-17 → 2025-26 from the state file (district-run regular, charter, other), and computed school-level change for schools open in both 2019-20 and 2025-26.
Data sources
- Database tablemiami_schools
One row per school number (MSID directory + CCD + GIS); sector, level, magnet status, activity code, region.
- Database tablemiami_school_year_metrics
Long-format facts: (school_number, year, metric_key, subgroup) with value, suppressed, denominator, peer and district percentiles, and the residual-z columns.
- Cached output
data/analysis/miami-enrollment.jsonThe enrollment analysis packet: trend, school change, utilization, lift table, spending versus size.
- External datasetFLDOE Membership by District and School by Grade (Survey 2)
Steps
Sector totals by year (district-run regular vs charter vs other; the story's district-run series is the REGULAR sector only).
SELECT m.year, CASE WHEN s.is_charter THEN 'charter' WHEN s.school_type = 'REGULAR' THEN 'district_run_regular' ELSE 'other' END AS sector, SUM(m.value) AS students, COUNT(*) AS schools FROM miami_school_year_metrics m JOIN miami_schools s USING (school_number) WHERE m.metric_key = 'enrollment_oct' AND m.subgroup = 'ALL' AND NOT m.suppressed GROUP BY 1, 2 ORDER BY 1, 2;School-level change 2019-20 → 2025-26 (packet school_change.pre_pandemic_to_latest).
Caveats
Sector totals are net stocks, not student flows; they cannot identify transfers or how many children left public education. 'District-run regular' excludes alternative, ESE-center and adult programs (packet universe). The federal CCD copy agrees with the state count exactly at 99% of school-years in the three CCD years checked (harness C; the exact share is in __cross_publisher_enrollment.json).
Reproduce
Follow docs/cities/miami/07_runbook.md: `make miami-discover-all`, parse the PDFs, run the loaders in order, `make miami-verify`, then the analysis scripts. The queries below run directly against the local Postgres.
The recipe lives at data/cities/miami/stories/recipes.ts in the repo.