Data analysis quantifying the gap in hands-on CPR training requirements across California high schools. This project supports legislative advocacy for mandatory CPR and heart screening education for youth by providing data-driven evidence of curriculum gaps and their disproportionate impact on underserved communities.
| Metric | Value |
|---|---|
| Total CA High School Students | 1,890,303 |
| Students without CPR requirement | 757,679 (40.1%) |
| Districts without CPR requirement | 186 |
| Schools without CPR requirement | 1,147 |
| Combined Black + Hispanic students without CPR | 494,071 |
| Socioeconomically disadvantaged students without CPR | 493,041 (41.4%) |
Hispanic/Latino students (42.6%) and Black/African American students (41.7%) are disproportionately affected compared to White students (36.4%).
All data used in this project comes from publicly available government sources:
- CDE Census Day Enrollment Data (2024-25) — Official student enrollment headcounts by school, grade, race/ethnicity, and socioeconomic status
- CDE Title I School Allocations (2024-25) — Federal Title I funding designations for low-income schools
- American Heart Association District Survey — District-level data on CPR graduation requirements (parsed into
data/no_cpr_districts.csv) - California Legislature — Public legislator contact info and district-to-zip mappings
├── ca_cpr_analysis.ipynb # Main analysis notebook
│
├── data/ # Input/source data files
│ ├── no_cpr_districts.csv # 186 no-CPR districts (AHA survey)
│ ├── title1_school_allocations_2425.xlsx # Title I school allocations
│ ├── assembly_members.xlsx # CA Assembly member info
│ ├── senate_members.xlsx # CA Senate member info
│ ├── assembly_district_to_zip.xlsx # Assembly district-to-zip mapping
│ └── senate_district_to_zip.xlsx # Senate district-to-zip mapping
│
├── output/ # Generated analysis CSVs
│ ├── ca_high_schools_enrollment.csv # All CA high schools with enrollment
│ ├── districts_without_cpr_with_enrollment.csv # No-CPR districts with student counts
│ ├── cpr_gap_by_race_ethnicity.csv # Race/ethnicity breakdown
│ ├── cpr_gap_sed_analysis.csv # Socioeconomically disadvantaged analysis
│ ├── cpr_analysis_summary.csv # Summary statistics
│ ├── no_cpr_districts_with_zipcodes.csv # No-CPR districts with zip codes
│ ├── no_cpr_district_zipcodes.txt # Zip code list (plain text)
│ ├── no_cpr_schools_with_addresses.csv # Schools in no-CPR districts
│ ├── no_cpr_districts_legislators.csv # Districts mapped to state legislators
│ ├── no_cpr_districts_legislators_full.csv # Full legislator mapping detail
│ ├── assembly_members_no_cpr_districts.csv # Assembly members with no-CPR districts
│ └── senators_no_cpr_districts.csv # Senators with no-CPR districts
│
├── output/visualizations/ # Generated chart images
│ ├── cpr_gap_pie.png # CPR gap pie chart
│ ├── cpr_impact_statement.png # Impact statement graphic
│ └── cpr_gap_by_race.png # Racial disparity bar chart
│
├── output/regional/ # San Diego regional analysis
│ ├── greater_san_diego_zipcodes.csv # Greater SD area zip codes
│ └── greater_san_diego_no_cpr_enrollment.csv # SD no-CPR enrollment data
│
└── docs/ # Documentation & methodology
├── data_source_explanation.md # Detailed data source documentation
├── title1_race_ethnicity_methodology.md # Methodology notes
├── legislative_advocacy_summary.md # Advocacy summary document
└── legislative_data_mining_notes.md # Legislative data mining notes
- Python 3.x
- pandas, numpy, matplotlib, seaborn
Install dependencies:
pip install pandas numpy matplotlib seaborn openpyxljupyter notebook ca_cpr_analysis.ipynbThe notebook fetches live CDE enrollment data and processes it against the local district list to generate all output files and visualizations.
- CDE Census Day enrollment data is filtered to school-level (
AggregateLevel='S') total enrollment (ReportingCategory='TA') - Grades 9-12 are summed to calculate high school enrollment per school
- Schools are matched to the 186 districts without CPR graduation requirements via case-insensitive string comparison
- Race/ethnicity and socioeconomic breakdowns use CDE reporting category codes
- Legislative district mapping connects no-CPR school zip codes to state Assembly and Senate districts
For full methodology details, see data_source_explanation.md and title1_race_ethnicity_methodology.md.
The analysis generates advocacy-ready visualizations showing:
- Racial/ethnic disparities in CPR education access
- Overall proportion of students lacking CPR requirements
- Impact statement graphics for legislative presentations
This project uses publicly available government data for educational and legislative advocacy purposes.