article · ~6 min · live data

Three buckets, one verdict

Chicago classifies every food establishment into one of three risk tiers — High, Medium, Low — that govern how often the city inspects them. Across more than 100,000 inspections since 2020, those three buckets fail at indistinguishable rates. The tier predicts the cadence; it doesn't predict the outcome.

The Chicago Department of Public Health pre-classifies every food establishment by risk — based on what it serves, how complex the prep is, who eats there, and how often it's historically failed. The tier matters because it sets the inspection calendar: a Risk 1 (High) establishment can expect more visits per year than a Risk 3 (Low). The tier doesn't publicly describe what the inspector looks for differently; it just sets the frequency.

If the tier label captured something real about the underlying risk, we'd expect the inspections themselves to bear it out: Risk 1 establishments should fail more often than Risk 3, in the same way a smoke detector wired in a kitchen goes off more than one in a bedroom. The data, looking at every Pass / Pass w/ Conditions / Fail inspection since January 2020:

Risk 1 (High) establishments fail at roughly —%. Risk 3 (Low) fail at —%. Less than a percentage point of daylight across what is supposed to be the city's primary risk-stratification scheme. The cadence is doing the work; the tier is not.

Where the variation actually lives

Drop the risk-tier lens and re-aggregate the same inspections by facility type — the kind of operation, not the city-assigned risk. For each facility type, take every establishment that's been inspected four or more times since 2020, compute its per-establishment fail rate (fails ÷ inspections), and draw a kernel density of those rates. The ridges below stack low-to-high by median fail rate, and the count in parens is the number of qualifying establishments per type.

The expectation set up by the risk tiers — that restaurants should be high-risk because they handle so much food, so fast, with so many handoffs — runs head-on into the data. Schools and long-term-care kitchens, both classified as Risk 1, sit notably higher than restaurants. Children's-services facilities sit higher still. Restaurants and grocers cluster near the city's overall 20% baseline. The risk-tier label tells you the city visits an establishment often; it doesn't tell you what the inspectors will find.

The trigger matters more than the tier

The richer signal in the dataset isn't the tier — it's the inspection type. The same establishment gets visited under different triggers: a routine canvass on the inspection calendar, a license inspection for a new operator, a complaint inspection after a resident calls 311 or 311-equivalent food-poisoning intake. Each trigger lands on a different prior:

Complaint-driven inspections fail at nearly double the rate of routine canvass visits. Re-inspections — the city returning to a previously-failed establishment to verify the fix — predictably pass at a much higher rate, since the operator has had time to address what was cited. The "fail rate" headline is a function of which window into the inspection regime you pick. A 311-equivalent complaint is much more diagnostic than a calendar-driven canvass.

The honest version of this story is that the public food-inspection record is much better at telling you which trigger brought the inspector through the door than at telling you which establishment is genuinely riskier. The risk tier the city publishes is an inspection-cadence policy, not a forecast. Pull the dataset apart yourself via the dataset page, or browse the raw SoQL at data.cityofchicago.org / 4ijn-s7e5.

View underlying data

Outcomes by risk tier, 2020–present

Risk tierInspectionsFailsPassPass w/ ConditionsFail rate

Outcomes by facility type, 2020–present

Facility typeInspectionsFailsFail rate

Outcomes by inspection trigger, 2020–present

Inspection typeInspectionsFailsFail rate

Data Sources

Inspections: Chicago food inspections (4ijn-s7e5). Four runtime SoQL queries through the worker proxy: outcomesByRiskTier, outcomesByFacilityType, outcomesByInspectionType, and per-facility-type perEstablishmentByFacilityType rollups (6 fanouts, one per facility shown in the ridgeline). All filtered to inspection_date >= '2020-01-01' and results IN ('Pass', 'Pass w/ Conditions', 'Fail'). Source: VIEWS in src/lib/data/datasets/chicago-food-inspections.ts.

Methodology: Per-establishment fail rates are computed in-browser as fails / count for every license with at least four inspections in the window. RidgelinePanel performs Silverman-rule KDE bandwidth selection on the resulting samples. All queries route through the Cloudflare Worker proxy at /api/socrata, KV-cached for one hour.