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 tier | Inspections | Fails | Pass | Pass w/ Conditions | Fail rate |
|---|
Outcomes by facility type, 2020–present
| Facility type | Inspections | Fails | Fail rate |
|---|
Outcomes by inspection trigger, 2020–present
| Inspection type | Inspections | Fails | Fail 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.