Data

Where the numbers come from

The full table for download, a dictionary for every column, and ten public sources, each with a limitation worth stating before someone else finds it.

Areas

1,389

1,387 carry a composite score

Residents

39.3M

Covered by the boundaries used

Small-population flags

26

Shown, but excluded from the headline statistics

Median mortality

740

per 100k, age-adjusted · IQR 608–963

Download

Everything the map knows about every area, as one CSV: 1,389 rows, one per ZIP code area, 20 columns, sorted worst-served first. Unscored areas are kept with their rank fields empty, so not scored is distinguishable from not in California.

Data build 2026-07-27. Licensed CC BY 4.0; drive-time derived columns carry OpenStreetMap’s ODbL attribution. Cite as:

Medi-Vu, California healthcare access index, data build 2026-07-27. https://medi-vu-deep.vercel.app

Data dictionary

Column meanings are the same sentences the map legend and the methodology page use, because they are read from the same definition. Ranks run from 1, the worst-served area, to 1,389. The interval is the 5th to 95th percentile of an area’s rank across the simulations.

ColumnMeaningUnit
geo_idZIP Code Tabulation Area, 2020 vintage. The join key.five digits, as text
labelTown or county name for the area. A label, not a claim that the area is that town.text
countyCounty containing the area’s population-weighted centre.text
populationResidents, ACS 2020–24.people
low_reliabilityToo few residents or recorded deaths for a stable rate. Shown on the map with hatching; excluded from headline statistics.true / false
rank_medianMedian composite rank across simulations. 1 is the worst-served area in California.rank, 1 = worst
rank_p05Lower end of the 90% rank interval: the best the area plausibly is.rank
rank_p95Upper end of the 90% rank interval: the worst it plausibly is.rank
rank_widthrank_p95 minus rank_p05. How far the evidence lets the rank move.places
prob_worst_decileThe share of simulations placing this area in the bottom decile. The default, because it is the claim the analysis can actually support.0 to 1
rank_equalOne number per area, no uncertainty. Included so you can see how much more confident this looks than the evidence warrants.rank, 1 = worst
asmr_per_100kAll causes, 2019–24, adjusted so an older population does not by itself look unhealthy.deaths per 100,000 per year
access_primary_careProviders per 100,000 people, weighted by distance and by competition from everyone else nearby.providers per 100,000
access_safety_netCommunity and free clinic capacity within reach, weighted by distance and competition. Capacity is staffed primary-care FTE from HCAI.FTE per 100,000
uninsured_pctShare of people with no health insurance.percent
no_vehicle_pctWhere care exists but getting to it is the obstacle.percent
copd_pctAdults with COPD, CDC PLACES model-based estimate.percent
diabetes_pctAdults with diagnosed diabetes, CDC PLACES model-based estimate.percent
chd_pctAdults with coronary heart disease, CDC PLACES model-based estimate.percent
clusterAreas whose neighbourhood scores are more extreme than chance allows, at every neighbourhood size tested. Rust marks clusters of poor service, blue clusters of good service.hot / cold / none; empty if not tested

The sources

Each card names what the source provides and what it cannot do. The second half is the part that matters: an index is only as honest as its weakest input, and every one of these has a boundary.

CDPH Death Profiles by ZIP Code

All-cause and cause-specific deaths, 2019–24, by ZIP and age band.

Age is crossed with cause only for all-causes, so cause-specific rates cannot be age-standardised at this grain. Counts under 11 are suppressed.

Grain ZIPLicence CHHS Terms of Use

CDC PLACES, 2025 release

Model-based chronic disease prevalence by ZCTA.

Small-area estimates modelled from survey data, not direct measurements. Not for programme evaluation.

Grain ZCTALicence Public domain

American Community Survey 2020–24

Population by age, insurance coverage, vehicle availability.

Margins of error are large for small areas. They are propagated — through the barrier shares and through the population denominators every rate divides by — which is most of why the published intervals are as wide as they are.

Grain Tract → ZCTALicence Public domain

NPPES provider registry

Primary care providers by practice ZIP.

Enumerated, not practising. Addresses go stale and there is no measure of hours or panel size.

Grain ZIPLicence Public (FOIA)

HCAI Primary Care Clinic Annual Utilization (2024 final)

California community and free clinics: primary-care provider FTE, encounters, and each clinic’s own coordinates.

Capacity is staffed FTE, not encounters. Encounters would be circular here — a clinic logs more of them partly because more people live near it, and the accessibility model already divides supply by demand.

Grain ClinicLicence CHHS Terms of Use

HRSA Health Center Program sites

Federally qualified health centres and look-alikes, used to cross-check which clinics are federally qualified.

Site counts only, so it can say where the safety net is but not how big each part of it is. Superseded as a capacity measure by HCAI.

Grain ZIPLicence Public

Census TIGER/Line 2025 and Centers of Population

ZCTA, tract, place and county boundaries, plus population-weighted centroids. Places and counties are what turn a ZIP code into a town name.

ZCTA boundaries are 2020 vintage and are not the same objects as postal ZIP codes. Place boundaries do not nest inside them either, so a name is a label for an area, never a claim that the area is that town.

Grain Tract, ZCTA, place, countyLicence Public domain

OpenStreetMap, California extract

The road network every drive time is routed over, with OSRM at free-flow speeds.

Speed limits, not traffic. The routing knows no rush hour, no mountain weather and no bus timetable, which is why no-vehicle share is carried as a separate barrier.

Grain Road segmentLicence ODbL, attribution required

HUD USPS ZIP-to-tract crosswalk

Residential allocation ratios for pushing ZIP-coded counts to tracts.

Allocation uncertainty is not propagated into the intervals.

Grain ZIP → tractLicence HUD USER

CDC/ATSDR SVI 2022 and HRSA shortage designations

Held out as external validators, never used as index inputs.

Feeding either into the index and then validating against it would be circular.

Grain ZCTA, countyLicence Public domain

Coverage

The index covers 1,389 ZIP code areas and 39,284,090 residents. 26 areas are flagged as small-population and are shown but treated with caution. Statewide medians: age-adjusted mortality 740.1 per 100,000, primary care 233.6 providers per 100,000, uninsured 5.4%, no vehicle 5.0%.

Full detail for every dataset — URL, vintage, grain, licence and ingestion notes — lives in config/sources.yaml in the repository, which is what the loaders read.