Methodology
This service explores the NHTSA (National Highway Traffic Safety Administration) vehicle safety complaints database, normalized with US Census data. This page explains where every number comes from, what is measured, what is estimated or filled in, and where the data is weak. The chat assistant is given this page verbatim.
Source data
Complaints. NHTSA's Office of Defects Investigation publishes every
safety-related defect complaint it has received since 1 January 1995 as one
file, FLAT_CMPL.zip (https://static.nhtsa.gov/odi/ffdd/cmpl/FLAT_CMPL.zip).
It is tab-delimited with no header, has 51 fields, and is regenerated daily.
The field layout is documented in CMPL.txt on the same site. Complaints come
mostly from consumers (via the web form, a hotline, or letters), but also
from manufacturers, consumer groups, and others. The cmpl_type field records
the source: IVOQ (online vehicle owner questionnaire) and EVOQ (electronic
questionnaire) are by far the most common.
Keeping current. Each HTTP response for the file carries two MD5 hashes:
ETag, the hash of the zip, and x-amz-meta-md5, the hash of the text
inside it. We download only when the content hash changes (a re-zip of
identical data is ignored), verify both hashes before replacing our copy,
and rebuild only when the content or our processing code has changed.
Census. Population, household vehicles and commuting come from the US Census Bureau API. See "Census denominators" below.
What counts as a complaint
The raw file has one line per complaint per component. A complaint that
names three components (say, "air bags", "steering" and "electrical system")
appears three times. Each complaint has an ODI number (ODINO). Before
15 December 2002, one ODI number could also cover several products owned by
the same person.
So we count complaints as distinct (ODI number, make, model, model year, product type). That is the grain of the "complaints" table: about 1.66 million complaints from about 2.25 million raw lines. When a complaint spans several lines:
- crash / fire: true if any line says so.
- injured / deaths: the maximum across the complaint's lines (they repeat per line; summing would multiply them).
- received date: the earliest.
- state: the consumer's home state (constant within a complaint).
Component systems ("Top systems") come from the part of the component
description before the first colon, e.g. ENGINE AND ENGINE COOLING:COOLING SYSTEM:RADIATOR → "Engine And Engine Cooling". A complaint that names two
systems counts once in each. The system panel's numbers therefore add up to
more than the complaint total, and that is expected.
Fields and cleaning
- Dates (received, failure/incident, added, purchase, manufacture) are YYYYMMDD in the source. Anything that doesn't parse becomes null.
- Model year
9999means unknown and is stored as null. - Y/N fields (crash, fire, police report, medical attention, towed, ...) become true/false. NHTSA's note: from 17 May 2021, previously blank Y/N fields show as "N", and previously blank numeric fields show as 0. Mileage, vehicle speed and cylinder counts of 0 are stored as null for that reason. A "N" in older records may mean "not answered".
- Make and model are upper-cased and trimmed. NHTSA spells some makes
several ways ("MERCEDES-BENZ" and "MERCEDES BENZ", about 14K and 11K
complaints; "FLEETWOOD" and "FLEET WOOD"). Makes that differ only in
punctuation or spacing are merged under their most common spelling; the
original is kept as
make_raw. Models aren't merged. NHTSA itself re-normalized manufacturer, make, model and component names in 2021, so older records reflect current names. - Product type: V = vehicles, T = tires, C = child seats, E = equipment. The dashboard shows one product type at a time (vehicles by default).
- State is the consumer's two-letter state code, filled on essentially every complaint. It also includes codes with no map shape (military APO/FPO addresses, territories other than Puerto Rico, "00", "UN"). The map covers the 50 states and DC; Puerto Rico is in the data but not drawn.
- State of incident (where the event happened) was added by NHTSA on 30 April 2026 and only exists for complaints since then, so the map uses the consumer's home state instead.
- VIN: NHTSA publishes only the first 11 characters, which identify the make, model, year, plant and so on, but not the individual vehicle.
- CMPLID (NHTSA's internal row id) can change between daily files; we never use it as a key.
Dashboard panels
Your dataset. You build it by opting values in, per dimension: manufacturers, makes, vehicle model years, consumer states, and the years NHTSA received the complaint. An empty dimension means "any"; several values mean "any of these". Dimensions combine with AND: Toyota or Honda, and model year 2017 or 2018, and California or Oregon. Pickers show how many complaints each value would add given your other choices. You can also drag across the year chart to select received years, and click states on the map. The product type (vehicles, tires, child seats, equipment) is chosen separately. Every panel shows your dataset, with two deliberate exceptions: the year chart always shows every year (with your selected years highlighted), and the map always shows every state (with yours outlined). That way, both stay usable for choosing.
Manufacturer and make are different fields. NHTSA records the manufacturer of each product, and a make can appear under several (a Chevrolet chassis upfitted by a body builder, for instance), so filtering by manufacturer and filtering by make can give different results.
Downloads. The CSV and Parquet links export every complaint in your dataset (one row per complaint, narratives included), exactly the rows behind the dashboard's totals.
- Totals: distinct complaints, and how many involved a crash or a fire, with the total people injured and killed as reported by complainants. These are allegations reported to NHTSA, not verified crash statistics.
- Complaints received per year: by the date NHTSA received the complaint, not the date of the incident. The current year is partial and drawn hollow. Years with no complaints show as zero bars.
- Top systems: distinct complaints per component system (see above).
- Top makes / models: top makes when no make is selected (each with a + to add it to your dataset), otherwise the selected makes' top models.
Map metrics
The map compares states. It ignores the state filter (the selected state is outlined instead) but respects every other filter.
Complaints: the raw count. It mostly reflects how many people live in a state, so it's a population map more than anything.
Per 100k residents (per year): complaints in the window, divided by the state's population summed over the same years, × 100,000. This is an annualized rate: complaints per 100,000 person-years. A year counts only if it has a population figure, and then it counts on both sides: a year without one contributes neither complaints nor population. (Population exists for every year except Puerto Rico 1995–1999.) The current year counts as the fraction of it the data covers: if the latest complaint is from 24 September, the current year contributes 267/365 of a year of population.
Per 10k household vehicles (per year): the same, with the Census "aggregate vehicles available to households" as the denominator. This data starts in 2005. For a window that begins earlier, the years before 2005 are dropped from the numerator and the denominator alike. For example, a window starting in 1998 gives the same per-vehicle rate as one starting in 2005: complaints received 2005–present ÷ vehicles summed over 2005–present. Complaints from 1998–2004 aren't counted in this rate at all, so they can't inflate it. It counts cars, vans and trucks kept at home for household use. It excludes company fleets, rentals, government and commercial vehicles, and vehicles in group quarters, so it's a proxy for exposure, not a registration count.
vs. national mix (index; needs a make): how concentrated a make's complaints are in a state compared with everyone's: (make's complaints in the state ÷ make's national total) ÷ (all complaints in the state ÷ national total). 1× means the make's complaints are spread like everyone else's; 2× means twice as concentrated there. It normalizes itself, so it needs no Census data. It reflects where a make's vehicles are (e.g. Tesla on the West Coast) as much as how problematic they are.
Small numbers: states with fewer than 20 complaints in the current filter are hatched ("too few to rate") for the rate and index metrics. With a handful of complaints, a rate is mostly noise.
Color scales: counts and rates use 7 quantile bins (each bin holds about the same number of states), so one very large state doesn't wash out the rest. The index uses fixed bins that are symmetric around 1×: <0.5×, 0.5–0.67×, 0.67–0.83×, 0.83–1.2×, 1.2–1.5×, 1.5–2×, ≥2×. Legends show each bin's range.
Census context metrics color states by a Census covariate, not by complaints, averaged over the window's years (2005 onward):
- vehicles per household (aggregate vehicles ÷ households)
- share of households with no vehicle
- share of workers who commute by car, truck or van (alone or carpooling)
- mean one-way commute time: aggregate travel time ÷ (workers − those working from home)
Census denominators: sources and imputation
We build one row per state per year from 1995 onward. No single Census release covers that span, so it is stitched together, and every value records its source.
Three kinds of values, and the words we use for them:
- Census estimates: the Census Bureau's own figures. Population estimates (PEP) are modeled from births, deaths and migration and benchmarked to each decennial census; ACS figures are survey estimates with margins of error. None of them are head counts, but they are the official numbers, and we use them as published.
- Interpolated (by us): a value we computed between two published years.
- Carried forward (by us): the latest published value, repeated for later years that have no release yet.
The pop_source and acs_source columns say which one each value is.
Population comes from the Census Bureau's Population Estimates Program (PEP), as July 1 estimates:
| Years | Source |
|---|---|
| 1995–1999 | 1990s intercensal estimates. The API only has these as county × age × race-sex × Hispanic-origin cells, which we sum to state totals. |
| 2000–2009 | 2000s intercensal estimates |
| 2010–2019 | Vintage 2019 estimates |
| 2020–2023 | Vintage 2023 estimates (July 1 estimates; the April 2020 census count is their base, not the value used) |
| 2024 | American Community Survey (ACS) 1-year estimate, because PEP vintage 2024 isn't in the API yet |
| 2025 onward | carried forward from the latest year (flagged "carried forward") |
The vintages are stitched without adjustment. There can be a small step at 2020, where the vintage changes and a new decennial census is incorporated. Puerto Rico has no 1990s figures, so its population is null for 1995–1999.
Vehicles, households and commuting come from ACS 1-year estimates:
| Years | Treatment |
|---|---|
| before 2005 | not available (null); rates that need them skip these years |
| 2005 | measured, except commute mode, which starts in 2006 |
| 2006–2019, 2021–2024 | measured |
| 2020 | interpolated as the midpoint of 2019 and 2021, because the Census Bureau didn't release standard ACS 1-year estimates for 2020 (pandemic data collection problems) |
| 2025 onward | carried forward from 2024 |
ACS figures are survey estimates with margins of error. For states they are tight enough for these purposes, but small year-to-year wiggles are noise.
Things this data cannot tell you
- Complaints are not failures. They are what people chose to report to NHTSA. Reporting depends on awareness of NHTSA, media coverage, recalls (which drive surges of complaints), internet access, and who owns which vehicles. A high rate can mean a real problem, an engaged owner base, or a news cycle.
- No sales or registration denominators by make or model. Rates here are per resident or per household vehicle in a state, not per vehicle of that make or model. A popular model gets more complaints just because more of them are on the road.
- Allegations aren't verified. NHTSA publishes complaints as received; it doesn't confirm them.
- Duplicates across channels (the same incident reported by the owner and a lawyer, say) can't be fully identified from the public file.
- Old records changed. NHTSA re-normalized names and fields in 2021, so today's file doesn't exactly match older copies of it.
The assistant
The "Ask about the data" assistant is given this page and the current build's facts. It can also see and change your dashboard (make, state, years, product type, and what the map shows) when you ask ("show me Toyota in Oregon since 2020"). Every change it makes appears in the chat as a ↳ line. The numbers it quotes come from the same queries that draw the dashboard. It can't run arbitrary queries, so it answers "how many" only for views the dashboard can show.
Freshness
The dashboard shows when the data was built and how recent the NHTSA file is. A new build is swapped into the running site automatically. Conversations with the assistant live only in the server's memory; they're not stored and disappear when you start a new conversation or the server restarts.
This is the documentation the "Ask about the data" assistant is given, word for word, plus the current build's facts.