School & College Enrollment Validation
  • Follow Us
    • Facebook
    • X (Twitter)
    • Instagram
    • LinkedIn
    • YouTube
  • Source Code
  • Report a Bug
  1. Overview

Site under development.

  • Overview
  • Pipeline
    • 1. Geography
    • 2. Enrollment
    • 3. Synthetic population
    • 4. Validation

On this page

  • Purpose
  • Comparisons at a glance
  • Pages
  • How the site is built
  • Known limitations

School and College Enrollment Validation

Does PopulationSim’s synthetic population match real K-12 and college enrollment?

Purpose

This site checks the PopulationSim synthetic population behind WFRC’s travel demand model against real school and college enrollment. The study area is Box Elder, Davis, Weber, Salt Lake, and Utah counties. K-12 enrollment is compared by school district. College enrollment is compared by county.

PopulationSim does not control on school enrollment, so each comparison runs two ways:

  • Enrollment status (the real test). The synthetic population’s school-grade label (SCHG) is uncontrolled, so it is compared directly with actual enrollment.
  • Age population (a sanity bound). Age is controlled in PopulationSim. The population in the school-age band should meet or exceed enrollment. It is not expected to match exactly.

Comparisons at a glance

Synthetic counts are from the 2023 PopulationSim run.

Level Real reference Synthetic: enrolled Synthetic: age band
K-12, by district Utah DOE school counts, 2024-25 (K-12 + preschool); NCES CCD public schools, 2023-24 (K-12 + PK) SCHG 1-14, any age Ages 3-18
College, by county USHE (public institutions, all levels, Academic Year 2025 Term 2); IPEDS campus-based (fall 2023) SCHG 15 (undergraduate) and 16 (graduate), any age Ages 18-24

Pages

Page What it does Status
1. Geography Builds the school-to-district and college-to-county crosswalks. MAZ rows in both let PopulationSim output roll up. Checks coverage and maps the study area. Done
2. Enrollment Real K-12 enrollment by district (Utah DOE, NCES CCD, NCES private) and college enrollment by county (USHE, IPEDS). Compares the sources. Done
3. Synthetic population Rolls PopulationSim persons up to district and county by school grade and by age. Done, except the Box Elder clip
4. Validation Real against synthetic, by district and by county: tables, scatter plots, and level charts. Districts and counties done; Box Elder and the summary are still to do

How the site is built

flowchart TD
    subgraph sources["Data sources"]
        UGRC["UGRC / Open SGID\ncounty, district, school and college boundaries and locations; DOE school counts (BY2023 snapshot, 2024-25)"]
        NCES["NCES\nCCD public schools and Private School Universe Survey (2023-24), postsecondary locations"]
        IPEDS["IPEDS\nFall 2023 Enrollment and institutional control"]
        CENSUS["Census TIGER (via pygris)\ncounties and blocks; blocks are not used in the crosswalks"]
        MAZSRC["MAZ microzones\ndraft layer supplied for Utah"]
        TAZSRC["WFRC WasatchFrontTAZ\nreference layer only"]
        USHE["USHE\nenrollment by institution and site (AY 2025)"]
        PSIM["PopulationSim persons\n2023 synthetic population, local only"]
    end

    UGRC --> GEO
    NCES --> GEO
    CENSUS --> GEO
    MAZSRC --> GEO
    TAZSRC -.-> GEO
    GEO["1_geography.qmd\nschool and college crosswalks"] --> XWALK[("crosswalk_school.csv\ncrosswalk_college.csv")]

    XWALK --> ENR
    UGRC --> ENR
    NCES --> ENR
    IPEDS --> ENR
    USHE --> ENR
    ENR["2_enrollment.qmd\nreal enrollment by district and county"] --> ENR_OUT[("real_enrollment_by_district.csv\nreal_enrollment_by_county.csv")]

    XWALK --> SYN
    PSIM --> SYN
    SYN["3_synthetic.qmd\nPopulationSim rollups"] --> SYN_OUT[("synthetic_k12_by_district.csv\nsynthetic_college_by_county.csv")]

    ENR_OUT --> VAL
    SYN_OUT --> VAL
    VAL["4_validation.qmd\nreal against synthetic"]

The pages run in order. Each one writes CSV and GeoJSON files to _data/intermediate/, and the next page reads them. The charts are built in Observable JavaScript from those files, so they update on every render.

Known limitations

  • Box Elder is only partly inside the model region. Synthetic persons exist only inside model MAZs, so Box Elder needs clipping to the model boundary before it can be compared. That clip is still a TODO.
  • USHE and IPEDS are not like-for-like. USHE covers public institutions only and is Academic Year
    1. IPEDS includes private institutions and is fall 2023. The county validation has an option to include private institutions.
  • Residence against location. Synthetic college counts are where students live. IPEDS counts by institution location, and USHE counts by site.
  • Charter schools are included in the district totals. Whether Utah DOE credits their enrollment to the resident district has not been checked against DOE’s published totals.
  • Online-only schools have no geographic catchment, so they are left out of the district totals and reported separately.
  • Private schools (NCES Private School Universe Survey) appear on the enrollment page but not in the district validation table.

Code, setup, and how to re-render the site are in the project README.