← Philly methodology

PhiladelphiaWorking analysis

How full Philadelphia’s school sites are

The School District of Philadelphia publishes, for each of its school sites, a capacity (the number of students the site is built to serve), an October enrollment, and the utilization score it computes from the two — enrollment divided by capacity: how full the site is. In the same dashboard it also publishes the Program Change it recommends for each site — its recommendation for the site’s future, in the district’s own published wording, ranging from no change to closure. This page describes how full the sites are, how that varies by school level, and how it lines up with those recommendations. The precise measure is: Site Utilization = (Site Enrollment + Site Pre-K Allotment) / Site Capacity, October 1 enrollment snapshot, SY2024-25.

One snapshot in time, so no trend. Everything here describes 2024-25 and nothing on the page is drawn as a series, because there is no second observation to draw one from. The School District of Philadelphia (SDP) publishes one facilities vintage, SY2024-25. The app's School Year field is a cross-join onto the student table, so a site's capacity appears under both labels with identical figures (335 of the 342 (ULCS, site) pairs carrying a capacity appear under both labels; 0 differ) — no trend and no enrollment-vs-capacity decomposition of the NYC kind is possible from this source.

Pre-K is inside the numerator, as allotted seats. The dashboard adds the Pre-K seats allotted to a site's early-childhood programmes to its K-12 October 1 enrollment ('students enrolled (and allotted seats for PreK)'). NYC's Blue Book enrollment and Miami-Dade's October (FLDOE Survey 2) headcount, PK-12, count enrolled Pre-K children instead (NYC also 3-K), and NYC's target capacity includes Pre-K rooms, so the three are not on one Pre-K basis.

Neutral by construction. NEUTRAL — utilization is reported, not ranked. Nothing here scores a school. Sites are described by how full they are; no site is ranked, scored, or called at risk here.

Source sdp_facilities_dashboard · School District of Philadelphia, Office of Operations · snapshot 2026-09-22 · 428 site rows and 502 building rows · extract 18b9791617ed · packet · script · method

§1 Headline takeaways

  1. 24.7% of the district’s school sites are under half full, and the median site is at 67.1% of its capacity. Of the 215 district sites that carry both a capacity and an enrollment, 53 sit below 50% of capacity, and 7.9% sit below 33%. The middle half of sites runs 51% to 85%; near the two ends, the tenth and ninetieth percentiles sit at 37% and 106%; and 13.5% are over capacity. The district-wide total — all students divided by all seats — gives 68.4%, a different quantity from the median, and close to it here. (Fig 1)
  2. Standalone Middle sites sit lowest of the 4 levels large enough to compare, at 45.8%, and the largest level, Elementary-Middle — 106 of the 215 sites — sits at 65.5%, within 1.6 points of the district median. Middle is the district’s own School Level value for sites carrying middle grades and no others; a site carrying middle grades alongside elementary or high ones is counted under one of the compound levels, so this is a statement about standalone middle schools rather than about the middle grades. A level is compared here only where it carries at least 6 sites. Below that, the group is too small for statistics to pin down its true median with 95% confidence — however the sites happen to fall, the range they span cannot bracket the middle value that reliably — so smaller levels are shown with their counts rather than compared. That holds back Middle-High (n = 4) and Elementary-Middle-High (n = 1), which Fig 2 and Table 1 still draw, each with its n. Fig 2 orders every level by median, so Middle-High sits at the top of it on a median read from 4 sites. Among the 4 levels that clear the minimum, Elementary sites are the fullest — median 72.2%, 6.5% under half full, 21.7% over capacity — against 45.8% and 50% under half full across the 12 Middle sites. Elementary-Middle at 65.5% (n = 106) and High at 64.8% (n = 46) sit between them. Middle is the smallest level that clears the minimum: with 12 sites its median rests on its middle observations, so a single site moves it and it reads as indicative rather than settled. (Fig 2)
  3. Low utilization tracks the district’s own closure recommendations — and both numbers come out of the same publication, so this is adherence to a stated criterion, not out-of-sample prediction. 16 of the 215 sites (7.4%) carry a recommendation beginning with Close. Among sites under 66% utilization the share is 13.5% (14 of 104) against 1.8% (2 of 111) for the rest — 7.47× the rate (p = 0.0012, the probability that a split this lopsided would arise by chance if the score and the recommendations were unrelated). That cut is not the one with the largest lift: the rule is the loosest of the four published cuts whose comparison group still holds more than one Close site, because at 75% only 1 of 75 sites above the cut carries one and the ratio rests on that single case. The utilization score and the recommendation are two fields of the same dashboard, published together, so a site is not being predicted from independent evidence: Both the predictor and the reference come from the same publication, so this measures how closely the district's recommendation tracks its own stated criterion, not whether an outside observer could have predicted the list. Size is the stronger single predictor: on the same 215 sites, enrollment including allotted Pre-K seats under 300 carries a 10.72x lift (25.5% of 47 sites against 2.4% of 168, p < 0.0001; doc §4.3). (Fig 3)

§2 Figures

1. Distribution of site utilization, 215 district sites, 2024-25

Each bar is the share of sites whose utilization falls in that band, drawn on the utilization axis at the band’s true width — a bar is wide because its band spans a long stretch of that axis, not because it is taller than it looks. The bands are shaded light to dark by their position on that axis and nothing in the shading is a verdict: an empty site is not marked as failing here and an over-capacity one is not marked as succeeding. The hatched bars are the intervals this packet cannot split into the district’s own finer bands. The dashed rules mark 50% and 66%, the two cut points the rest of the page uses. The strip underneath is the percentile spread of the same sites: the box is the middle half, the purple rule the median.

0%20%40%60%80%7.9%17 sitesunder 33%16.8%36 sites33–50%61.8%133 sites50–100%district splits this band; packet does not13.5%29 sitesover 100%district splits this band; packet does not50% — half full66% — the cut Fig 3 headlinesspreadp10 37%p25 51%median 67.1%p75 85%p90 106%0%25%50%75%100%125%site utilization — enrollment including Pre-K allotment, divided by site capacityshare of sites
Source: School District of Philadelphia, Office of Operations (sdp_facilities_dashboard, qlik-engine-api), snapshot 2026-09-22. Universe: The universe narrows in two steps: 428 site rows resolve to 328 distinct sites, because a site hosting several programs publishes one set of capacity and enrollment figures across several rows; 215 of those 328 sites are District-sector sites carrying both a capacity and an enrollment, and those 215 are the universe of every figure here. The 113 distinct sites not carried forward are Charter, Alternative or Pre-K sector, or carry no capacity or no enrollment. The 342 in the note that SDP publishes one facilities vintage is a different count at a different grain — distinct (ULCS code, site) pairs carrying a capacity anywhere in the app, across every sector and both School Year labels (doc §2) — and is quoted there only to show that the two labels carry identical capacity figures. Charter coverage in this extract is thin, so any district-wide figure is a district-sites figure. Grain: distinct site (site_id), deduplicated across program rows, District sector only. Percentiles use exclusive (Weibull / R type-6), the default of Python's statistics.quantiles used by docs/cities/philly/probe/facilities.py. p10/p25/p75/p90 are rounded to integers and the median to one decimal, as published in doc §4.1. The dashboard’s own published bands are five — under 50, 50–74, 75–99, 100–104 and 105 or more — and this packet carries three cut points (under 33%, under 50%, over 100%). Those fix the four intervals drawn here and leave the district’s 50–74 / 75–99 split and its 100–104 / 105-plus split unresolved; filling them needs the row-level extract (data/cities/philly/reference/parsed/sdp_facilities_sites.csv), which carries a band per site, not this packet. The site counts printed on the bars are the packet’s shares applied to its own n and rounded. Two of them can be checked against a direct count, because Fig 3 counts sites at the same two thresholds: the under-33% bar prints 17 sites against 17 counted there, and the first two bars together — 17 + 36 = 53 — against the 53 counted below 50%. That sum is not printed on any bar, and the remaining two bars have no such check. The under-33% share counts sites strictly under 33%. The method doc's measurement script uses < 33.3; no site falls between the two, so both give the same count.

2. Median utilization and the share of sites under half full, by school level, 2024-25

One row per school level, ordered by median utilization. The left bar is the median site in that level; the right bar is the share of that level’s sites below 50%. The two say different things — a level can have a middling median and still have a long tail below the cut. Middle-High (n = 4) and Elementary-Middle-High (n = 1) fall below the 6 sites this page requires before it compares one level with another, so they are drawn here and tabulated in Table 1 but not read against the others. Elementary-Middle-High carries a single site, so every percentile in that row of Table 1 is that one site. Middle (n = 12) is the smallest level that does clear it, and its figures move several points on a single site.

median utilizationshare of sites under 50%0%50%100%50% — half full0%50%100%Middle-Highn = 477.7%25%Elementaryn = 4672.2%6.5%Elementary-Middlen = 10665.5%27.4%Highn = 4664.8%28.3%Elementary-Middle-Highn = 148.8%100%Middlen = 1245.8%50%
Levels are the district’s own School Level field; the 6 levels cover 215 sites, the same universe as Fig 1. Utilization is Site Utilization = (Site Enrollment + Site Pre-K Allotment) / Site Capacity, October 1 enrollment snapshot, SY2024-25. Full percentile ladders for every level are in Table 1. The ordering is by median utilization and is a property of the distribution, not a ranking: NEUTRAL — utilization is reported, not ranked. Nothing here scores a school.

3. Share of sites carrying a Close recommendation, below each cut point and above it, 215 district sites

At each cut point, the left bar is the share of sites below the cut that carry a Close recommendation and the right bar is the share among every other site. The dashed line is the rate across all 215 sites, 7.4%. The lift under each pair is the ratio of the two bars. Lift rises as the cut loosens even though the flagged rate falls, because the comparison group empties out: of the 75 sites above the loosest cut, 1 carries a Close recommendation.

0%10%20%30%all 215 sites: 7.4%29.4%5 of 175.6%11 of 198under 33%5.29× the ratep = 0.004318.9%10 of 533.7%6 of 162under 50%5.09× the ratep = 0.0009313.5%14 of 1041.8%2 of 111under 66%7.47× the ratep = 0.001210.7%15 of 1401.3%1 of 75under 75%8.04× the ratep = 0.013sites under the cutevery other siteshare with a Close recommendation
Universe: distinct district sites carrying a capacity, an enrollment and a published Program Change. Close is defined as: Program Change beginning with "Close" — the district's own vocabulary: Close, Close + Repurpose, Close, Modernize, + Repurpose. The cut §1 headlines is the loosest one whose comparison group still holds more than one Close site, which is a stated rule rather than the largest lift on the table. Both the predictor and the reference come from the same publication, so this measures how closely the district's recommendation tracks its own stated criterion, not whether an outside observer could have predicted the list. Size is the stronger single predictor: on the same 215 sites, enrollment including allotted Pre-K seats under 300 carries a 10.72x lift (25.5% of 47 sites against 2.4% of 168, p < 0.0001; doc §4.3). Fisher two-sided p-values are carried from docs/cities/philly/06_enrollment_capacity_utilization.md §4.3 (and §4.1 for the split-campus sensitivity), where they were measured with scipy.stats.fisher_exact. They are not recomputed here. The counts behind the utilization-cut p-values are in Table 2. For the size comparison, the comparisons within enrollment including allotted Pre-K seats under 400 and 400 or more, and the split-campus sensitivity, the script that builds these figures stops if the counts move from the ones the p-values were measured on. A null lift means no site on the other side of the cut carries a Close recommendation, so the ratio is unbounded.

4. The district's Program Change recommendations, 215 district sites

One bar per recommendation in the district’s published vocabulary, ordered by the number of sites carrying it. Modernize covers 63.7% of sites on its own. The 3 recommendations beginning with Close are red and cover 16 sites between them — the outcome Fig 3 counts.

Modernize137 · 63.7%Maintain50 · 23.3%Close7 · 3.3%Close, Modernize, + Repurpose7 · 3.3%Modernize + Co-Locate4 · 1.9%Co-Locate3 · 1.4%Co-Locate + Modernize3 · 1.4%Close + Repurpose2 · 0.9%Maintain (future relocation)1 · 0.5%Relocate + Modernize1 · 0.5%recommendation beginning with Closesites carrying each recommendation
The recommendations are published per site in the same dashboard as the capacity and enrollment figures, for the same 2024-25 vintage; they are recommendations as published, not decisions taken, and this page does not track what followed any of them. Close is Program Change beginning with "Close" — the district's own vocabulary: Close, Close + Repurpose, Close, Modernize, + Repurpose. The 16 Close sites here are the 16 of Fig 3. Full counts and shares in Table 3.

§3 Tables

In these tables, p10 through p90 are percentiles — rungs on the emptiest-to-fullest ladder, with p10 a tenth of the way up — and “Σ ÷ Σ” is the total figure: all students divided by all seats. “Fisher exact” is the probability that the Close/non-Close split at that cut would arise by chance if utilization and the recommendations were unrelated.

Table 1. Site utilization by school level, 2024-25 (percent of site capacity)
UniverseSitesp10p25Medianp75p90Under 50%Under 33%Over 100%Σ ÷ Σ
All district sites215375167.18510624.7%7.9%13.5%68.4%
Middle-High4333977.711612025%0%50%71.5%
Elementary46525772.2941126.5%2.2%21.7%78%
Elementary-Middle106384965.58510027.4%7.5%9.4%68.2%
High46364964.88411128.3%8.7%10.9%65.9%
Elementary-Middle-High1494948.84949100%0%0%48.8%
Middle12202545.87510250%33.3%16.7%57.1%
Table 2. Close recommendations below and above each utilization cut (base rate 7.4% across 215 sites)
CutBelow: Close / sitesRateAbove: Close / sitesRateLiftFisher exact
under 33%5 / 1729.4%11 / 1985.6%5.29×p = 0.0043
under 50%10 / 5318.9%6 / 1623.7%5.09×p = 0.00093
under 66%14 / 10413.5%2 / 1111.8%7.47×p = 0.0012
under 75%15 / 14010.7%1 / 751.3%8.04×p = 0.013
Table 3. Published Program Change by site, 2024-25
RecommendationSitesShareBegins with Close
Modernize13763.7%—
Maintain5023.3%—
Close73.3%yes
Close, Modernize, + Repurpose73.3%yes
Modernize + Co-Locate41.9%—
Co-Locate31.4%—
Co-Locate + Modernize31.4%—
Close + Repurpose20.9%yes
Maintain (future relocation)10.5%—
Relocate + Modernize10.5%—

§4 What these numbers cannot show

  • One snapshot in time. The School District of Philadelphia (SDP) publishes one facilities vintage, SY2024-25. The app's School Year field is a cross-join onto the student table, so a site's capacity appears under both labels with identical figures (335 of the 342 (ULCS, site) pairs carrying a capacity appear under both labels; 0 differ) — no trend and no enrollment-vs-capacity decomposition of the NYC kind is possible from this source. So there is no before-and-after here, no enrollment-versus-capacity decomposition, and no way to say whether a site is emptier than it was. Candidates for a second vintage, and what has already been ruled out, are listed in capacity-utilization-gaps.md §4.
  • The dashboard also carries an older, 2017-labelled per-building capacity, “Current Capacity (OLD)”; nothing on this page uses it, and the method doc §6.5 compares it with Site Capacity.
  • Pre-K is inside the numerator, as allotted seats. The dashboard adds the Pre-K seats allotted to a site's early-childhood programmes to its K-12 October 1 enrollment ('students enrolled (and allotted seats for PreK)'). NYC's Blue Book enrollment and Miami-Dade's October (FLDOE Survey 2) headcount, PK-12, count enrolled Pre-K children instead (NYC also 3-K), and NYC's target capacity includes Pre-K rooms, so the three are not on one Pre-K basis. The check behind that statement: The published Site Utilization equals (K-12 enrollment + allotted Pre-K seats) ÷ site capacity to floating-point tolerance, confirming the allotment sits inside the numerator (doc §6.1).
  • Sites are not schools.The counting unit (“grain”) throughout is distinct site (site_id), deduplicated across program rows, District sector only. A site hosting a district school plus its Pre-K program, or plus a co-located charter, publishes one set of capacity/enrollment figures across several program rows. The distribution above counts each site once. 80 of 215 sites (37.2%) host more than one programme, up to 3 on a single site, so a site’s capacity is often not attributable to one school. The reverse also occurs. Three district schools have classroom capacity on more than one site of their own: 2210 (S016, S148), 7440 (S234, S278), 8770 (S100, S130). The dashboard repeats a school's whole enrollment on each of its sites, so each of those six published site figures divides the whole school by one site's capacity, and the distribution above, which keeps SDP's published per-site basis, counts 1,871 students more than once. Merged into one unit per school — enrollment once, Pre-K seats and capacity summed — the 212 units read a median of 66.6%, 25.0% under 50%, 8.0% under 33%, 11.8% over 100% and 67.4% overall, against 67.1%, 24.7%, 7.9%, 13.5% and 68.4% on the 215 sites as published. The Close lift under 66% reads 7.13x on 105 units (p = 0.0015) against 7.47x on 104 sites. None of the six sites carries a Close recommendation (Modernize), so no Close count changes.
  • The recommendation analysis is not a prediction. Both the predictor and the reference come from the same publication, so this measures how closely the district's recommendation tracks its own stated criterion, not whether an outside observer could have predicted the list. Size is the stronger single predictor: on the same 215 sites, enrollment including allotted Pre-K seats under 300 carries a 10.72x lift (25.5% of 47 sites against 2.4% of 168, p < 0.0001; doc §4.3). Fisher two-sided p-values are carried from docs/cities/philly/06_enrollment_capacity_utilization.md §4.3 (and §4.1 for the split-campus sensitivity), where they were measured with scipy.stats.fisher_exact. They are not recomputed here. The counts behind the utilization-cut p-values are in Table 2. For the size comparison, the comparisons within enrollment including allotted Pre-K seats under 400 and 400 or more, and the split-campus sensitivity, the script that builds these figures stops if the counts move from the ones the p-values were measured on. A null lift means no site on the other side of the cut carries a Close recommendation, so the ratio is unbounded.
  • Charter coverage is thin. The universe narrows in two steps: 428 site rows resolve to 328 distinct sites, because a site hosting several programs publishes one set of capacity and enrollment figures across several rows; 215 of those 328 sites are District-sector sites carrying both a capacity and an enrollment, and those 215 are the universe of every figure here. The 113 distinct sites not carried forward are Charter, Alternative or Pre-K sector, or carry no capacity or no enrollment. The 342 in the note that SDP publishes one facilities vintage is a different count at a different grain — distinct (ULCS code, site) pairs carrying a capacity anywhere in the app, across every sector and both School Year labels (doc §2) — and is quoted there only to show that the two labels carry identical capacity figures. Charter coverage in this extract is thin, so any district-wide figure is a district-sites figure. Charters in their own buildings are largely absent from this extract, so nothing here describes them.
  • Cross-city figures need their denominators named. All three on SY2024-25. Philadelphia: median 67.1%, 24.7% under 50%, 7.9% under a third, 68.4% overall (215 district sites). Miami-Dade: median 66.7%, 21.2%, 4.7%, 69.7% (316 district-run regular schools). NYC: median 80%, 13.3%, 3.6%, 83.1% (1,702 schools in DOE buildings). The denominators differ — SDP site capacity, permanent FISH (Florida Inventory of School Houses) capacity, SCA (NYC School Construction Authority) target capacity — and so do the universes and the Pre-K basis: Philadelphia adds allotted Pre-K seats to K-12 enrollment, Miami-Dade and NYC count enrolled Pre-K children (NYC also 3-K), and NYC's target capacity includes Pre-K rooms. SDP assigns site capacity to Pre-K space as well: its five Pre-K-only sites carry site capacities of 60 to 221. Whether Miami-Dade's FISH capacity counts Pre-K stations is not established. Name the numerator, the denominator and the year whenever the three appear together.

§5 Sources and checks

Every value on this page is read from one committed packet, philly-enrollment-capacity.json, written by philly-capacity-packet.ts from 2 committed CSVs — data/cities/philly/reference/parsed/sdp_facilities_sites.csv, data/cities/philly/reference/parsed/sdp_facilities_buildings.csv — extracted from School District of Philadelphia, Office of Operations’s dashboard at https://www.philasd.org/fpp/ (qlik-engine-api, app 2d47abaf-02e1-4671-adba-ea661203eda5), snapshot 2026-09-22, extract hash 18b9791617edada6d3ec991595941284749afaa9c0e2a4264c9a2a9fbba51191. The packet records 428 site rows and 502 building rows (399 distinct buildings, because the building cube repeats a building once per programme on its site); every Philadelphia figure on this page is built from the site rows. The NYC and Miami-Dade figures in the cross-city caveat are read from those cities’ committed packets. Extract retrieved 2026-09-22 — The extract's retrieval timestamp from provenance.json, not the time this script ran — the packet is a pure function of the committed CSVs, the snapshot's provenance.json and the committed NYC and Miami-Dade packets, so it reproduces byte-for-byte.

Checks carried in the packet: the published utilization score was recomputed for all 215 sites, and the largest absolute disagreement across them was 4.77e-12 percentage points, which is floating-point noise — The published Site Utilization equals (K-12 enrollment + allotted Pre-K seats) ÷ site capacity to floating-point tolerance, confirming the allotment sits inside the numerator (doc §6.1). Percentiles use exclusive (Weibull / R type-6), the default of Python's statistics.quantiles used by docs/cities/philly/probe/facilities.py. p10/p25/p75/p90 are rounded to integers and the median to one decimal, as published in doc §4.1. The under-33% share counts sites strictly under 33%. The method doc's measurement script uses < 33.3; no site falls between the two, so both give the same count. These are internal consistency checks. No second publisher has been read for Philadelphia capacity, and there is no full-QA report for this packet, which is why this page is not indexed.

Method, findings and the caveats in full: docs/cities/philly/06_enrollment_capacity_utilization.md. What is missing, and what closing each gap would take, is written up in docs/capacity-utilization-gaps.md. Source registry with URLs and provenance: sources.yaml.