CHECKED AGAINST THE ORIGINAL FILES
Every attendance number on these pages was read a second time from the school district’s and the state’s published files by a separate program and matched: 9,595 district figures and 23,924 state figures, plus 990 of the calculations built from them, with 0 disagreements. That guarantees the numbers were copied and added up correctly. It does not settle what the numbers mean, which is what the rest of this page is for; the check report lists exactly what was and was not tested.
Chronic absenteeism in Philadelphia: what we measured, what we found, and why you can trust it
This is the methods page for an independent analysis of student attendance at Philadelphia’s public schools. It explains, in plain terms, what “chronic absenteeism” means here and how that differs from the federal, state, and district definitions; where every number comes from; how the numbers were checked; and what the data cannot show. The findings themselves are on the analysis page; the summary below is a map.
Start here
What this is
Philadelphia’s school district and Pennsylvania’s education department both publish, for each school, the share of students who attended at least 90% of their school days. We turn that around into the share who did not: the students who missed more than 10% of days, which is the usual working definition of chronic absenteeism. We use the district’s files for district-run schools (five years, 2020-21 through 2024-25, plus monthly figures into 2025-26) and the state’s files to compare district-run and charter schools (attendance years 2017-18 through 2023-24). Nothing here is survey data or estimate: every figure is arithmetic on the publishers’ own numbers.
What it found
- Chronic absenteeism at district-run schools peaked at 42.1% of student records in 2021-22 and has come down only to 37.7% in 2024-25, with each year’s improvement smaller than the last. Details
- At the typical school, 39.0% of students were chronically absent in 2024-25, and at 62 of 216 schools it was more than half of students. Details
- Elementary schools have improved since 2021-22 (41.0% to 33.0%); high schools have barely moved (48.6% to 47.8%). Details
- On the state’s measure, attendance at both charter and district-run schools is worse than before the pandemic: at the median charter school, 27.0% of eligible students were below 90% attendance in 2023-24, against 21.1% in 2018-19; at the median district-run school, 38.5% against 25.0%. This is a description, not a verdict on charter schools; the reasons it cannot be read as one are set out with the finding. Details
- Black students are chronically absent far more often than White students, and part of that gap sits inside the same schools: comparing the two groups school by school, the average school’s rate was 37.7% for Black students against 29.0% for White students in 2024-25. Details
- The current school year, 2025-26, opened with the lowest September–November average in the six years of monthly data and then recorded the highest December, January, and March for those months. Details
Why you can trust it, and where it stops
- Official sources, linked. Every file comes from the School District of Philadelphia or the Pennsylvania Department of Education, is named in §2 with a link, and is recorded with a digital fingerprint so anyone can confirm they have the same file.
- Every number is traceable. Each figure on the analysis page links to a proof page that walks from the publisher’s file through each step of arithmetic to the number shown, school by school.
- Checked twice. A second program, written separately, re-reads the publishers’ files and recomputes the figures; the status at the top of this page reports its result, and §4 explains what such a check does and does not establish.
- Reviewed from outside, with a public record of corrections. Five successive external methodology audits in September 2026 found real errors, including one that changed a finding; every correction is logged with its date in §6. The reviewer’s closing assessment was that the analysis is ready to share with its stated caveats.
- What it does not claim. These are descriptive comparisons. Nothing here says why attendance differs between schools, sectors, or groups of students, and the measure is a close relative of the federal definition of chronic absenteeism, not the same thing (§1). The limits that matter most for interpretation, and the projects still deferred, are in §4 and the analysis page’s section “What this data can and can’t show.”
Questions or a possible error: use the GitHub link on the About page. The rest of this page is the technical reference. Every source below is registered, with provenance, in the source registry.
Sections: 1 definition, 2 datasets, 3 what each figure uses, 4 what was checked, 5 exhibits, 6 corrections log, 7 technical appendix.
1. The definition we use
The School District of Philadelphia publishes no school-level chronic-absenteeism rate in its open-data files. What it does publish, in its School Performance open-data collection, is the share of students with 90% or better attendance, per school per year. Our headline series is the complement:
share below 90% = 100 − (“% with 90%+ Attendance (Yearly)”)
— the share of a school’s students who attended less than 90% of their enrolled days. This is a proxy for the chronic-absenteeism rate, and we label it one wherever it appears. The table shows how it lines up against the definitions the publishers actually use.
| Measure | Who counts as chronically absent (or not regularly attending) | Student at exactly 90% | Minimum enrollment | Year labeling |
|---|---|---|---|---|
| U.S. Department of Education (ED Data Story) | Missed 10% or more of enrolled school days | Chronically absent | Not specified in the cited overview (federal collections and state accountability plans set their own) | The school year the absences occurred |
| Pennsylvania Future Ready PA Index: Regular Attendance (PercentPersistentAttendance) | Not regularly attending = present less than 90% of school days, among students enrolled 90 or more school days | Regularly attending (not counted) | 90 or more school days | A lagging indicator: the workbook labeled 2024-25 reports 2023-24 attendance |
| School District of Philadelphia: % with 90%+ Attendance | Below 90% = attended less than 90% of enrolled days at that school | Counted as 90%+ (not below 90%) | 10 or more days enrolled at the school; a student enrolled 10+ days at two schools counts at both | The school year the attendance occurred |
| This site (proxy) | 100 − the district's (or state's) 90%+ share | Not counted | Inherited from the publisher (10 days for the district; 90 days for the state) | The school year the attendance occurred (state values re-labeled; see §2) |
- Boundary. Under the federal definition (U.S. Department of Education), a student who misses exactly 10% of enrolled days is chronically absent. That same student attended exactly 90% and so is inside the publishers’ “90% or better” group, which puts them outside our below-90 share. For the same students, enrollment spells, and day-counting rules, the proxy therefore cannot exceed a federal-definition rate, and it understates it by the share of students sitting exactly on the line. Neither publisher reports that share, and neither documents its rounding at the line, so the size of that understatement is unknown. The ordering does not carry over to a separately published federal statistic built on different eligibility or attribution rules; the proxy is a related measure, not a close estimate of any particular federal figure.
- Minimum enrollment. The district’s Office of Research and Evaluation documents the rule for this file family: a student is included at a school if enrolled there for at least 10 days, and a student enrolled 10 or more days at more than one school is attributed to each of them (Student Attendance Patterns in Philadelphia, 2017-18 to 2021-22, June 2023, “Inclusion and Attribution Criteria”). Two consequences: the yearly student counts in the file are student records, not distinct students, and a student who moved between schools mid-year can appear in both schools’ figures. The state’s rule is stricter: its Future Ready glossary defines Regular Attendance over students “enrolled in a school for 90 or more school days.” If shorter-enrollment records have lower attendance, excluding them could raise the state’s 90%+ share; we have not measured that relationship or its contribution to the publisher difference. §4 reports the observed difference.
- Local coding. The state standardizes the threshold and the minimum enrollment but not how a partial day counts. Its Guidelines for Reporting Regular Attendance and Chronic Absenteeism (May 2019) state that “missed hours, periods, or fractions of days may be handled differently by each LEA,” and give the example of a student who is a quarter day late four times counting as present 180 days under one local policy and 179 under another. District-run schools and the charter-school local education agencies may use different local attendance policies (district schools share the district’s). We have not verified that they code attendance identically, or that any of them coded it the same way before and after the pandemic; the sector comparison in Figures 9–10 carries that caveat.
- Excused vs unexcused. The 90% threshold here counts all absences; the district’s report states that all classifications and reasons for absence are included.
- The state’s own chronic-absenteeism column. The state’s workbooks carry a
PercentChronicAbsenteeismcolumn in its 2024-25 workbook, blank for every Philadelphia school row; the 2021-22, 2022-23, and 2023-24 workbooks have no such column at all (counts in §5). So our servedchronic_absenteeism_ratemetric is empty and hidden from the ratings dropdowns. The state reports the concept positively, as Regular Attendance; the column is named PercentPersistentAttendance in the 2021-22 and later workbooks and “Percent Regular Attendance” in the earlier ones. We refer to it by the glossary’s name, Regular Attendance, throughout.
2. The datasets that carry it
District school-level yearly attendance (source_id: sdp_attendance_90_school)
- Grain: school × year × subgroup; 2020-21 through 2024-25; 213–216 District-sector schools per year with an unsuppressed all-students value, with the published numerator and student count for every cell.
- Denominator: “Total Students (Yearly)” = students enrolled 10 or more days at the school. Summed across schools this is a count of student records (transfers counted at each school), which is how the figures label it.
- Cuts: All Students, Race/Ethnicity, Gender, and Grade Level (K–12; no PK). No economic-disadvantage, English-learner, or special-education cuts.
- Sectors: District sector only, as fetched: the file’s Sector column carries a single value, so no charter, cyber-charter, contracted, or alternative schools appear (the district’s own report describes its attendance data as covering District and Alternative schools, but this file does not carry the alternative rows). The packet generator enforces the District filter and warns if a new sector ever appears.
- Complementary suppression (gender): from 2021-22, wherever the Non-Binary cell is suppressed (about 45–58 schools per year), the district also suppresses exactly one of the Male or Female cells to prevent back-calculation, and the affected schools include large comprehensive high schools. A gender series built from whichever cells happen to be unsuppressed changes composition at 2021-22 and can produce a trend that is an artifact of the suppression pattern; ours is restricted to schools reporting both genders, with a fixed-panel sensitivity check (§3).
- Suppression: small cells arrive suppressed from the district and are stored with a suppressed flag, excluded from all statistics (codes in §5).
District district-level monthly attendance (source_id: sdp_attendance_90_district_monthly)
- Grain: district × month × subgroup, 2020-21 into 2025-26 (the only published 2025-26 attendance on the 90% threshold; September through March as of the May 2026 vintage). Students are counted in a month if enrolled 10 or more days within it.
- Caution: values are within-month 90%+ shares: a student can dip below 90% in one month and finish the year above it, so monthly values are not comparable to the yearly cumulative rate. The threshold also depends on the calendar. In a 20-day month a student can miss two days and stay at 90%, but in a shorter month two absences fall below it (the district’s report gives the month-by-month maxima), so a month’s figure moves with its number of school days as well as with attendance. The analysis uses these only for same-month comparisons across years and for a September–March average of within-month shares, which is not a year-to-date rate.
- Freshness: the district’s research and data page states that the within-month 90% and average-daily-attendance files update quarterly, lists the monthly 90% file as last refreshed May 2026 with the next update in August 2026, and lists the annual school-level attendance file as last refreshed February 2026 with the next update in spring 2027. The latest file we retrieved is the 8 May 2026 vintage. On 2026-09-07 we probed the date-stamped URL pattern for every day from June through September 2026 and found no newer file; that probe is evidence of what we found, not proof that no newer file exists at another location, and we report the discrepancy with the published August date without deciding which explains it. The earlier vintage’s URL returned 404 when re-requested, so we keep every vintage we fetch; the district also advertises an archive of previously published files. It publishes 2025-26 district-level monthly files for average daily attendance and for the 95% threshold as well; neither is used here.
State: Future Ready PA Index Regular Attendance (source_ids: futurereadypa_performance_2018-19 through 2024-25, seven workbooks)
- What it is: the state’s school-level share of students, among those enrolled 90 or more school days, who attended 90% or more of them, for every public school in Pennsylvania including charters, with subgroups the district’s file lacks (economically disadvantaged, English learners, students with disabilities). No student counts are published for it.
- Year alignment: the state’s glossary describes this indicator as “a lagging indicator indicating data is from the year prior to the reporting year.” Each workbook’s attendance value is therefore stored under the previous school year: the 2024-25 workbook supplies 2023-24 attendance, and the seven workbooks (2018-19 through 2024-25) give attendance years 2017-18 through 2023-24. The state’s latest observation is a year behind the district’s. Only this indicator is shifted; test, growth, and graduation measures from the same workbooks keep the workbook’s year in the database. That describes the software, not a validation: the state’s glossary also calls graduation a lagging indicator, and its observation-year convention has not been audited here — do not combine graduation and attendance by year until it is. The shift is documented in the loader (_lib.ts) and was verified by the cross-publisher check in §4 for district-run schools in attendance years 2020-21 through 2023-24: with the shift, the state’s and district’s figures for the same schools agree closely in every one of those years; without it they do not. The two pre-pandemic years and the charter rows are not covered by that check; their assignment rests on the glossary’s definition and on the state’s own display materials (its Spring 2022 guide shows the 2020-21 release carrying 2019-20 attendance). The map:
| Workbook | Attendance year | Format | Element | Note |
|---|---|---|---|---|
| 2018-19 (id 20) | 2017-18 | long | Percent Regular Attendance | pre-pandemic |
| 2019-20 (id 26) | 2018-19 | long | Percent Regular Attendance | pre-pandemic; registered 2026-09-07 |
| 2020-21 (id 32) | 2019-20 | long | Percent Regular Attendance | pandemic: buildings closed 13 March 2020 |
| 2021-22 (id 39) | 2020-21 | wide | PercentPersistentAttendance | pandemic: mostly virtual; cross-check r = 0.998 |
| 2022-23 (id 44) | 2021-22 | wide | PercentPersistentAttendance | cross-check r = 0.993 |
| 2023-24 (id 49) | 2022-23 | wide | PercentPersistentAttendance | cross-check r = 0.996 |
| 2024-25 (id 60) | 2023-24 | wide | PercentPersistentAttendance | cross-check r = 0.995; latest |
- Universe: we load only the rows that join, through their current state codes, to the district’s 2024-25 school directory: 230 district-run schools, 81 charter schools (17 of them Renaissance charters, former district schools run by charter operators that keep neighborhood catchments), 19 contracted programs, and one special-education school. No cyber charter is in that directory. Consequences: charters or district schools that closed before 2024-25 are absent from every year; a school that changed operator or state code loses its earlier history (John B. Stetson and Olney, Renaissance charters until 2022 and district-run since, appear in the 2018-19 workbook under charter codes 133513315-8149 and 126513452-8205 that the current crosswalk cannot join); and sector and school-type labels are the current ones, carried backward. The series is therefore a set of historical observations for schools matchable to the current directory, not a year-by-year universe of who ran which school. A historical governance crosswalk is a known gap. In the analysis, the sector comparison (Figures 9–10) uses district-run and charter schools only, and its figures are averages of school rates (medians, or means weighted by fixed 2024-25 enrollment), never shares of all students in a sector.
- Formats: the 2021-22 and later workbooks share one wide format (PercentPersistentAttendance columns); the 2018-19, 2019-20, and 2020-21 workbooks are an older long format in which the element is “Percent Regular Attendance.” Both are loaded under one key. The 2019-20 workbook was added on 2026-09-07; an earlier version of this page wrongly said it had never been published (§6).
- Weighting: because the state publishes no student counts, any “weighted” sector figure uses each school’s 2024-25 enrollment as a fixed weight in every year. That is an average of school rates with fixed weights, not the share of the sector’s students; the unweighted school mean and median are always shown alongside it.
Companions and context
- District average daily attendance: (source_id: sdp_attendance_ada_school): same universe and years; the companion measure in Figure 4.
- District research report: Student Attendance Patterns in Philadelphia, 2017-18 to 2021-22 (Office of Research and Evaluation, June 2023) carries district-wide 90%+ attendance for two complete pre-pandemic years and 2019-20 through March, for District and Alternative schools (a broader population than the annual district-school file used here), plus the inclusion rules quoted above and the pandemic timeline: buildings closed on 13 March 2020, the 2019-20 figures run through March, 2020-21 was mostly virtual with “multiple methods” used to determine presence, and students returned fully in person in 2021-22. It is cited for context; its figures are not recomputed here.
- District archive: (Archive_Attendance.zip on the same CDN): school-level 95%-attendance and average daily attendance back to 2013-14, a different threshold, so it cannot be spliced onto this series.
- District daily-attendance dashboard: district and alternative schools by school day, but only the current school year is publicly visible. Verified against its Qlik engine on 2026-08-31: the app’s field values for school year contained only 2025-26. That establishes what the public can see, not what the district retains internally; we have not asked. It cannot backfill a historical series from outside.
Every source file is fetched by pipeline_philly/discover.py, which records sha256, byte-count, and retrieval-time provenance beside the file. The registry of record (URLs, column mappings, year encodings, and per-source caveats) is docs/cities/philly/sources.yaml.
3. What each figure uses
Universes differ from figure to figure, so the manifest is given per figure. “Full file” means every District-sector school in the district’s yearly file with an unsuppressed All-Students cell, including schools that have since closed; “directory” means the subset present in the 2024-25 school directory, which supplies school type and demographics (the two Austin Meehan school-years are the only ones that restriction drops). Weighting is by the published student count unless stated.
| Figure | Source | Sector | Years | Unit | Weighting | Universe and exclusions |
|---|---|---|---|---|---|---|
| 1 district-wide | District yearly file | District | 2020-21 to 2024-25 | % of student records | Student-weighted; median and percentiles of school rates | Full file (213–216 schools per year); suppressed cells excluded |
| 2 by grade | District yearly file (grade rows) | District | 2021-22 and 2024-25 | % of student records in the grade | Student-weighted | Full file; K = grade 00; no pre-K rows |
| 3 by school type | Served database + directory | District | 2020-21 to 2024-25 | % of student records | Student-weighted | Directory schools only (closed schools absent); type from the 2024-25 list |
| 4 vs average daily attendance | Served database (both measures) | District | 2021-22 to 2024-25 | Levels, two panels | Both measures: school rates weighted by the attendance-file student count (not by student-days) | Directory schools with both measures in a year (213 in 2021-22) |
| 5 race and gender | District yearly file (subgroup rows) | District | 2020-21 to 2024-25 | % of the group's student records | Student-weighted within group | Full file; each race line covers only schools reporting that group; gender covers schools reporting both genders (fixed panel as a check) |
| 6 distribution | District yearly file | District | 2021-22 and 2024-25 | Number of schools | Each school once | Full file |
| 7 stability | District yearly file | District | 2023-24 to 2024-25 pair | School rates; changes on the 0–100 scale | Each school once; size contrast reported as the standard deviation of changes (and the median absolute change) | Full file; schools present in both years |
| 8 monthly | District monthly file | District | 2020-21 to 2025-26 (through March) | % of students enrolled 10+ days in the month | Sep–Mar average weighted by monthly counts | District-wide only; within-month shares |
| 9 sectors | State workbooks (served database) | District-run and charter | Attendance years 2017-18 to 2023-24 | Average of school rates (each school's % of students enrolled 90+ days who were below 90%); not a share of all students in the sector | Fixed 2024-25 enrollment weights, with unweighted mean and median and a fixed-panel version alongside | Schools matchable to the 2024-25 directory (changing count by year); contracted programs and the special-education school excluded; pandemic years hatched |
| 10 subgroup gaps by sector | State workbooks (served database) | District-run and charter | 2023-24 | Unweighted mean of school rates: group minus school-wide | Each reporting school equal | Schools reporting both the group and the school-wide figure (a different set per bar); economically disadvantaged not charted |
| §3 tables (thirds) | Served database + 2024-25 demographics | District | 2024-25 | % of student records | Student-weighted within each third | Directory schools with both the share and the attendance cell (216) |
- Pandemic years. 2020-21 is displayed but excluded from the annual in-person recovery comparisons (the monthly records deliberately show both all-year and in-person-only comparisons, labeled as such): instruction was mostly virtual, with hybrid in-person instruction from March 2021, and the district used different methods to record presence. On the state series, 2019-20 (buildings closed from 13 March 2020) is treated the same way. The district-file trend baseline is therefore 2021-22, the first full in-person year and the series peak; the state series also carries two pre-pandemic years.
- Suppressed cells are excluded from every statistic; subgroups that are majority-suppressed (American Indian, Pacific Islander, non-binary) are omitted from subgroup charts entirely.
- The Philadelphia figures are packet-rendered: the analysis page renders its Philadelphia figures from the committed packet JSON, generated by a single committed script. Two kinds of external context appear on the page and are outside that provenance: a hand-transcribed block from the district’s June 2023 report, stored in the packet with its citation and labeled as not recomputed, and four figures from this site’s separate New York City analysis, which carries its own unverified warning and is not covered by the checks here.
4. What was checked, and what was not
Different kinds of error need different checks, so the status is given per kind rather than as one badge.
| Kind of error | Check | Result | Where |
|---|---|---|---|
| Transcription (source file → served database) | Every served cell re-read from the publisher's file by a separate program (Python, not the TypeScript loader) and compared: the value where both sides have one, the suppression status otherwise, and the student count regardless (an earlier version skipped the count whenever the rate was suppressed; corrected 2026-09-08) | District 90%+ share: 9,595 cells, 0 value mismatches; student counts compared for 9,595 cells independently of whether the rate is suppressed (a count missing on one side counts as a mismatch), 0 mismatches. Average daily attendance: 1,072 cells, 0 mismatches. State regular attendance: 23,924 cells, 0 mismatches | Full QA §A–B |
| Reproduction (packet arithmetic) | Specified packet values recomputed from the source files (and, for blocks that use the directory, from the served database) by that separate program and compared one by one — the QA report lists which | 990 specified comparisons, 0 mismatches | Full QA §D |
| Coverage (nothing dropped silently) | Source cells vs served cells per metric and year; closed-school rows counted, not hidden | 2 school-years in the district file are absent from the database (Austin Meehan, closed); listed below with their effect on the district-wide rate | Full QA §C; §5 below |
| Year alignment | State workbook year vs attendance year, tested by comparing the state's and district's figures for the same schools under both alignments | Aligned by attendance year, agreement is close in every year; aligned by workbook year it is not. The site now uses attendance years (corrected 2026-09-07) | Cross-publisher report |
| Definition validity | Publisher documentation read and quoted (PDE glossary and reporting guidelines; SDP June 2023 report) | Documented. Remaining limitations: eligibility rules differ between publishers (10 vs 90 days); transfers count at each school in the district file; partial-day coding is a local choice not verified across sectors; the share of students at exactly 90% is unmeasured | §1 |
| Interpretation and wording | Not certifiable by a program. Universal statements ('every', 'lowest', 'record') on the analysis page are composed from packet fields (monthly records and window selectors, grade shape, subgroup peak years, stability counts and ratios, fixed-panel level pairs) that the QA now compares directly; the prose that uses them is not tested. Register and caveats reviewed by three external audits (7–8 September 2026) | See §6 | Analysis page §4–5 |
| Not checked | — | Enrollment weights and directory classifications (sector, school type, admission type) are read from the served database, not re-derived from the district's enrollment and Master School List files; the New York comparison on the analysis page comes from that city's own analysis, which carries its own unverified warning; the SDP June 2023 report figures are hand-transcribed | QA report |
The checks, in detail
- Packet-local crosschecks. The generator itself recomputes the district-wide series from the source file using the exact published numerators and compares it with the figure built from the loaded percentages, on the common schools. That is 15 aggregate comparisons (weighted rate, school count, and student count for each of five years), not a cell-by-cell test; the cell-by-cell test is the full QA above. Tolerance for the rates is 0.01 percentage points: the loaded values are published to two decimals, so each school’s rate can differ from its exact-count rate by up to 0.005, and a weighted average of such errors is bounded by 0.005 when the school sets match; 0.01 is that bound plus a small explicit margin. Largest difference observed: 0.0003 percentage points. Counts must match exactly.
- Cross-publisher check, aligned by attendance year. For 216 district-run schools with 2023-24 attendance in both the district’s file and the state’s 2024-25 workbook, the state’s 90%+ share runs a median 1.7 percentage points above the district’s; 27.8% of schools agree within 1 point and 97.2% within 5; 0 differ by more than 10; the correlation is 0.9948. Individual schools fall on both sides (the difference ranges from −3.9 to +6.5), so the median is a central tendency, not a one-directional gap. Across the overlapping years the median difference is 2020-21: +0.8, 2021-22: +1.7, 2022-23: +1.7, 2023-24: +1.7, the same sign each time with the correlation above 0.99 in every year. The previously reported large break disappears when attendance years are aligned; this comparison does not establish that all local reporting practices stayed unchanged. The state’s longer minimum enrollment is a plausible contributor to the difference, but we have not recomputed the district’s measure for the state’s eligible population (the district file has no enrollment-spell detail), so we cannot say how much of the offset it explains; local partial-day coding, transfer attribution, revisions, and rounding are other candidates. The check covers district-run schools in attendance years 2020-21 through 2023-24 only. The threshold for treating the two as one number (median within 0.5 and 80% of schools within 1) is not met, so the site never mixes the two publishers in one series. That threshold was written into the script before its first run on 2026-09-06; readers cannot verify that from the outputs, so treat it as a claim. Full report: cross-publisher attendance check.
- What the misaligned comparison looked like. Before 2026-09-07 the same check matched the state’s workbook year to the district’s attendance year, and the site reported that the state’s figure ran about 11 percentage points above the district’s in 2020-21 and 2021-22 and that the state had changed its attendance rules at 2022-23. Both statements were artifacts of comparing different school years, and both are withdrawn. The misaligned comparison is preserved in the report as a diagnostic so the error is reproducible.
- Closed schools. The database joins on the current directory and so lacks 2 school-years present in the district’s file. The analysis computes its district-wide series from the file with those included, and reports the direction of the effect from the data rather than assuming closed schools were high-absence:
| Year | School | Student records | Below 90% | District-wide rate with it | Without it | Effect of including |
|---|---|---|---|---|---|---|
| 2020-21 | Austin Meehan School (8140) | 733 | 24.4% | 29.3% | 29.4% | -0.029 |
| 2021-22 | Austin Meehan School (8140) | 414 | 49.8% | 42.1% | 42.0% | +0.025 |
5. Auditable exhibits
Coverage: source cells vs served cells, by metric and year
| Metric | Year | Source cells | Served cells | Source-only (directory schools) | Source-only (closed schools) | Served-only |
|---|---|---|---|---|---|---|
| District 90%+ share (yearly file) | 2020-21 | 1,852 | 1,843 | 0 | 9 | 0 |
| District 90%+ share (yearly file) | 2021-22 | 1,931 | 1,922 | 0 | 9 | 0 |
| District 90%+ share (yearly file) | 2022-23 | 1,937 | 1,937 | 0 | 0 | 0 |
| District 90%+ share (yearly file) | 2023-24 | 1,946 | 1,946 | 0 | 0 | 0 |
| District 90%+ share (yearly file) | 2024-25 | 1,947 | 1,947 | 0 | 0 | 0 |
| District average daily attendance | 2020-21 | 213 | 212 | 0 | 1 | 0 |
| District average daily attendance | 2021-22 | 214 | 213 | 0 | 1 | 0 |
| District average daily attendance | 2022-23 | 215 | 215 | 0 | 0 | 0 |
| District average daily attendance | 2023-24 | 216 | 216 | 0 | 0 | 0 |
| District average daily attendance | 2024-25 | 216 | 216 | 0 | 0 | 0 |
| State regular attendance (by attendance year) | 2017-18 | 3,212 | 3,212 | 0 | 0 | 0 |
| State regular attendance (by attendance year) | 2018-19 | 3,234 | 3,234 | 0 | 0 | 0 |
| State regular attendance (by attendance year) | 2019-20 | 3,234 | 3,234 | 0 | 0 | 0 |
| State regular attendance (by attendance year) | 2020-21 | 3,528 | 3,528 | 0 | 0 | 0 |
| State regular attendance (by attendance year) | 2021-22 | 3,564 | 3,564 | 0 | 0 | 0 |
| State regular attendance (by attendance year) | 2022-23 | 3,576 | 3,576 | 0 | 0 | 0 |
| State regular attendance (by attendance year) | 2023-24 | 3,576 | 3,576 | 0 | 0 | 0 |
A cell is one school × subgroup with a value or a suppression marker in the file; “served” counts the same cells in the database. Source-only cells belong to schools absent from the 2024-25 directory (closed). State rows are labeled by attendance year (workbook year minus one). The district file carries 213–216 schools with an unsuppressed all-students value per year.
Crosswalk between the state’s and district’s school codes
State rows carry an AUN (district number) and a four-digit school number; district files carry a ULCS code. The join uses the AUN and PA codes on the district’s 2024-25 Master School List, so a state row is served only if that list maps its codes to a ULCS. Every school page shows its codes. Two state codes are shared between a school and its Continuation Academy; each is assigned to the main school. Codes that appear more than once on the list for the same school under name variants are aliases, not collisions, and are listed separately.
| State code (AUN-school) | Distinct schools sharing it | Assigned to |
|---|---|---|
| 126515001-8507 | John B. Stetson Middle School (5580); Stetson Middle School Continuation Academy (5581) | 5580 |
| 126515001-8508 | Olney High School (7060); Olney High School Continuation Academy (7061) | 7060 |
| State code (AUN-school) | One school, listed as | ULCS |
|---|---|---|
| 185515523-7981 | Boys' Latin of Philadelphia Charter School / Boys Latin of Philadelphia Charter School | 3388 |
Historical code changes are not in this crosswalk: schools that carried different state codes in earlier workbooks (the two former Renaissance charters noted in §2, for example) cannot be joined for those years.
The state’s chronic-absenteeism columns, Philadelphia rows
| Workbook | Matched school rows | Chronic-absenteeism columns | Schema | Cells examined | Blank | Numeric | Other |
|---|---|---|---|---|---|---|---|
| 2018-19 | — | 0 | long format (one row per school × element); no chronic-absenteeism element | 0 | 0 | 0 | 0 |
| 2019-20 | — | 0 | long format (one row per school × element); no chronic-absenteeism element | 0 | 0 | 0 | 0 |
| 2020-21 | — | 0 | long format (one row per school × element); no chronic-absenteeism element | 0 | 0 | 0 | 0 |
| 2021-22 | 294 | 0 | columns absent from the School On Track Measures sheet | 0 | 0 | 0 | 0 |
| 2022-23 | 297 | 0 | columns absent from the School On Track Measures sheet | 0 | 0 | 0 | 0 |
| 2023-24 | 298 | 0 | columns absent from the School On Track Measures sheet | 0 | 0 | 0 | 0 |
| 2024-25 | 298 | 11 | columns present | 3,278 | 3,278 | 0 | 0 |
Cells examined = matched school rows × columns present; the QA asserts that blank + numeric + other equals that product. The conclusion is narrow: these workbooks provide no populated chronic-absence series for the matched schools.
Suppression codes treated as withheld
District files: blank and “s”. State workbooks: “IS” and, in the 2020-21 workbook, the spelled-out “Insufficient Sample” (PDE’s reporting guidelines set a minimum group size of 20 students for reporting — a separate rule from the 90-day enrollment minimum), plus “--”, “INS”, “*”, and blank. The loaders store any other non-numeric token as suppressed too, which could hide a parsing problem, so the QA records a census of every non-numeric token in the district file’s value columns and in the matched-school attendance cells of all seven state workbooks, flags any token outside that list, and prints the census in the QA report. Suppression mismatches between file and database: 0 (district) and 0 (state).
Charter admissions
Of the 81 charter schools, 63 enroll by citywide lottery and 18 by neighborhood catchment (17 are Renaissance charters), per the Master School List. Each school’s page shows its admission type and Renaissance status; a downloadable list is a known gap.
6. Corrections log
2026-09-07: external methodology audit. A detailed outside review of these pages found several errors, all now corrected:
- The state’s attendance indicator was stored under its workbook year rather than the attendance year it describes. The site had reported an 11-point disagreement between the state’s and district’s figures in 2020-21 and 2021-22 and a change in the state’s rules at 2022-23; both were artifacts of that misalignment and are withdrawn. The state series now runs by attendance year, 2017-18 to 2023-24, with pandemic years hatched, and the charter comparison’s latest year is 2023-24.
- The site said the state never published a 2019-20 workbook. It did; the workbook is now registered and loaded (attendance year 2018-19).
- The boundary case in §1 was stated backwards (a student at exactly 90% attendance is chronically absent under the federal definition, not the reverse).
- The district’s 10-day enrollment rule and the state’s 90-day rule were described as undocumented; both are documented and now quoted.
- The cross-publisher summary said eight schools differed by more than 10 points; the report’s own list showed twelve. The count is now computed, not typed.
- The headline “students” figure is a count of student records, and is now labeled that way; closed schools were assumed to raise the district-wide rate, and the effect is now reported from the data (it goes both ways); the Black–White gap at common schools was described as a within-school gap, and within-school versions are now computed separately; the gender series gained a fixed-panel check; 2020-21 is described as mostly virtual rather than all-virtual; the claim that the two attendance measures show “the same improvement” at a fixed ratio, and the claim that year-to-year mover rankings are mostly luck, were withdrawn.
2026-09-08: second external audit. A follow-up review found that several first-round fixes had not reached all the live text and graphics, plus new errors. Fixed: the charter figures were described as shares of students when they are averages of school rates (now led by medians, with the weighted average named as such and a fixed-panel check); the Black–White takeaway described the equal-weight within-school gap (8.4 in 2021-22, 8.6 in 2024-25) as having declined, and left 8.4 standing as the apparent baseline for the record-weighted 6.2 (now one estimator per pair, plus a 97-school fixed panel); differences between rates were still called “percent” in several places (rewritten as level sequences or as moves on the 0-to-100 scale); Figure 4 still carried the withdrawn “2.9×” annotation (now two level panels); the monthly takeaway claimed a six-year November record that the mostly virtual 2020-21 year beats, and a “worst winter” not supported by a December–February average (superlatives are now composed from a records block the QA recomputes); grade and subgroup wording claimed monotone patterns with exceptions (kindergarten to grade 1, grades 10 to 11, the Asian series); the charter count of 31 schools serving high-school grades was described as all mixed-grade (9 are stand-alone high schools; 22 are mixed-grade); the state’s 90-day rule was presented as the established cause of the publisher offset (now a hypothesis); the chronic-absence column census counted absent columns as blank cells (2021-22 through 2023-24 workbooks have no such column); the district’s published refresh schedule was overlooked; the dashboard-deletion and “most cities” claims were withdrawn; state cell proofs printed template variables; the Black–White proof now shows the subgroup inputs; the QA badge no longer claims to cover every number. Added: the local partial-day coding caveat, the historical governance limitation, a workbook-to-attendance-year map, the graduation caveat, and the New York comparison’s qualification.
2026-09-08: third external audit. The charter and racial calculations reproduced (182 values checked against the reviewer’s own extractions). Fixed: the QA documentation named derived fields as checked that the program never compared (grade shape, subgroup peak years, parts of the monthly records, fixed-panel level pairs, size-band medians — all now compared directly); universal assurance language on this page, in §5 of the analysis, and in the QA report’s title; Figure 10’s claim that its averaged bars are necessarily understated (withdrawn — the direction cannot be inferred across schools) and its income sentence (now a labeled diagnostic of school averages); the district proof pages’ stale denominator description and old publisher-gap label; the packet and sector proof still asserting the 90-day rule as the cause of the publisher offset and mid-year leavers as the worst attenders; the token census, which had skipped the three long-format workbooks (the 2020-21 workbook spells suppression “Insufficient Sample”); the analysis introduction’s “close stand-in”; the small-school reliability inference; the New York heading; the district report’s population; a 0.02 tolerance still quoted in two places; and the “212” school minimum. Added: content hashes on every evidence link so a downloaded packet or QA report always matches the page that cites it, with a shorter cache on raw downloads.
2026-09-08: fourth external audit. The reviewer’s 777 comparisons all matched. Fixed: the QA comparator skipped the student-count comparison whenever the attendance rate was suppressed (2,932 cells) and did not treat a count missing on one side as a mismatch — counts are now compared independently of suppression, with acceptance tests; the evidence identifiers were cache-busting only — the site now refuses a link whose identifier no longer matches, the source viewer preserves the requested version, and the hashing rule is stated; residual “every figure” assurance wording; two methodology sentences that stated a premise (short enrollments have low attendance) and a conclusion (no change in measurement) beyond the evidence; the registry’s dashboard-deletion note and “only published 2025-26 attendance” claim; the packet’s 212–216 school range (now derived from the data); a population convention at the top of the analysis; the charter opening scoped to schools matchable to the current directory; and the over-broad “excluded from every trend statement.”
2026-09-08: fifth external audit. Final wording pass; the reviewer found no numerical change needed and re-ran 777 comparisons with no mismatches. Fixed: the monthly takeaway’s parenthesis and the limitations section now scope the 2020-21 exclusion to the annual comparisons (Figure 8 compares matching months and windows across all years, labeled as such), and the packet’s pandemic-year note says the same; the population convention distinguishes annual school-file totals from Figure 8’s monthly eligibility; chart accessibility descriptions name their denominators; the analysis opening is a short status line with identifiers moved to a technical-details section; the source viewer’s stale-link notice now says accurately that its download is the current version; the comparator’s acceptance tests are linked from §4.
To report a problem with any number on these pages, use the GitHub link on the About page; corrections are logged here with dates.
7. Technical appendix
Evidence identifiers and versioning
Packet generated 2026-09-08 16:11:58 UTC, identifier ec4df569edbc; QA identifier 18f401b4af45 (each is the first 12 hex characters of SHA-256 over JSON.stringify(<parsed JSON object>) — no indentation, no trailing newline; a Markdown report shares its JSON twin's identifier). Links to these artifacts carry the identifier. A raw download whose identifier no longer matches the version the site serves is refused with an explanation, and the formatted source viewer shows the current document with a notice that a different version was requested. Older versions are not archived on the site. The QA JSON is at __absenteeism_full_qa.json.
Serving details (table and metric names)
- District yearly file →
philly_school_year_metricsasattendance_rate_above_90(the published 90%+ share, higher is better) with the published student count as the denominator. Grade-level rows are not loaded; the packet reads them from the file. The analysis inverts the rate (100 minus) at display time. - State workbooks → the same table as
attendance_persistence_rate(the published Regular Attendance share, higher is better), keyed by attendance year (workbook year minus one; seeSTATE_METRIC_YEAR_OFFSETin the loader library). No denominator. - Average daily attendance →
average_daily_attendance, all-students only. - The district monthly file is read by the packet generator directly and is not loaded to the database.
- Percentiles and peer groups are recomputed after every load (compute_percentiles.ts); the Proof pages reconstruct each one live.
- Verification programs: absenteeism_full_qa.py (its comparator’s acceptance tests: test_compare_cells.py) and cross_publisher_attendance.py; the publication status of the analysis page is driven by the committed verdict in the full QA JSON, never hand-edited.
Analysis: /philly/methodology/analysis/absenteeism
Source registry: docs/cities/philly/sources.yaml · NYC parallel: /methodology/data-quality/metrics/chronic-absenteeism