← Back to story

School type effectsMethodology recipe

NYC's audition-only schools serve few low-income kids, but graduate everyone

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

For schools with admission_category='AUDITION' (LaGuardia, Talent Unlimited, Frank Sinatra School of the Arts, others), pulled pct_economically_disadvantaged and graduation_rate_4yr and compared with citywide HS distribution.

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/*.

Steps

  1. Identify audition schools and pull their FRL share + grad rate; compare with citywide HS averages.

    SELECT s.dbn, s.name, s.latest_enrollment,
           (SELECT value FROM school_year_metrics WHERE school_dbn=s.dbn AND metric_key='graduation_rate_4yr' AND subgroup='ALL' AND year='2023-24') AS grad_rate
      FROM schools s
     WHERE s.admission_category::text='AUDITION' AND s.closed_at IS NULL;

Caveats

AUDITION is a small category (about a dozen schools); per-school statistics are not aggregates of a large set.

Reproduce

Clone the repo, set DATABASE_URL to a Postgres with the project schema loaded, run `npx tsx scripts/loaders/<source>.ts` for any not-yet-loaded data, then issue the queries in the Steps section. The story page also lists the exact `metric_key`/`subgroup`/`year` filters used. Searchable by the answer's headline number — every figure is recomputable from the queries shown.

The recipe lives at data/stories/recipes.ts in the repo. Corrections welcome.