NHTSA complaints

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:

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

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.

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):

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:

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

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.