← Back to story

PhiladelphiaLearning Networks & geographyMethodology recipe

The 32-percentage-point gap between Philly's best and worst council districts on PSSA ELA

A reproducibility log: the data this analysis touched, the queries it ran, and how a third party would re-run it.

Summary

Grouped philly_schools by `city_council_district` and aggregated `pssa_all_ela_proficiency` (subgroup=ALL, population_cut=acct) for median per district. Restricted to districts with ≥5 schools.

Data sources

  • Database tablephilly_schools

    One row per Philly school. PK is ulcs_code (SDP canonical, = id_eos in PSSA, = SRC_School_ID × 10). Carries aun_code + pa_code for PDE-side joins.

  • Database tablephilly_school_year_metrics

    Long-format facts. PK (school_ulcs, year, metric_key, subgroup, population_cut). Carries comparison_group_percentile + citywide_percentile (direction-adjusted).

  • External datasetSDP PSSA & Keystone (OpenDataPhilly CDN)

Steps

  1. Per-district median + econ-disadv.

    SELECT s.city_council_district, count(*),
           percentile_cont(0.5) WITHIN GROUP (ORDER BY m.value) AS med_pssa,
           percentile_cont(0.5) WITHIN GROUP (ORDER BY dem.value) AS med_econ
    FROM philly_schools s
    JOIN philly_school_year_metrics m ON m.school_ulcs = s.ulcs_code
    LEFT JOIN philly_school_year_metrics dem ON dem.school_ulcs = s.ulcs_code AND dem.metric_key='pct_econ_disadv'
    WHERE m.metric_key='pssa_all_ela_proficiency' AND m.subgroup='ALL' AND m.population_cut='acct'
      AND s.city_council_district IS NOT NULL
    GROUP BY s.city_council_district;

Caveats

Council districts are political boundaries, not school-management areas; some schools sit on district borders. Median econ-disadv = 100% for all 10 districts (CEP universal eligibility), so within-Philly outcome variation isn't driven by family-income measurement.

Reproduce

Load Master School List + SDP PSSA, run the query.

The recipe lives at data/cities/philly/stories/recipes.ts in the repo.