Methods

Methodology

How Plat processes tens of millions of mortgage records into census-tract summaries — and what the maps do and don't show.

From Raw Records to Maps

Each year's HMDA data arrives as flat CSV files with one row per loan application. Plat processes these through a five-stage pipeline into the compact JSON files and PMTiles the maps load.

  1. 1
    Download
    Raw HMDA LAR (Loan Application Register) files are downloaded from the CFPB HMDA Data Browser API. For 2018–2024, the API provides JSON or CSV exports filtered by state and action type. For 2007–2017, bulk LAR files in legacy pipe-delimited format are processed separately.
  2. 2
    Filter
    Records are filtered to home-purchase loan originations only — records where action_taken = 1 (originated) and loan_purpose = 1 (home purchase). Applications, withdrawals, and denials are excluded from the choropleth maps, though denial data will be included in a forthcoming analysis layer.
  3. 3
    Assign Race & Ethnicity
    Each record is assigned a single racial/ethnic category based on the HMDA applicant race and ethnicity fields. Hispanic/Latino ethnicity takes precedence over race coding. Records with missing or not-applicable race data are excluded from racial breakdowns but counted in transaction totals.
  4. 4
    Aggregate
    Records are grouped by census tract GEOID (or county FIPS / state FIPS for coarser levels). For each group, Plat computes: total originations, share of originations by racial group, median applicant income overall, and median income by racial group.
  5. 5
    Classify Dominant Group
    The dominant racial group is the group with the largest share of originations in that tract and year. A tract is classified as its dominant group's color on the choropleth. Tracts with fewer than 5 total originations are shown in gray to avoid misleading patterns from small samples.

Racial Categories

Plat uses five racial and ethnic categories. These follow HMDA reporting definitions and U.S. Census race/ethnicity standards. Applicants self-report race and ethnicity on loan applications.

Asian

HMDA race code 2: Asian. Includes all sub-categories (Asian Indian, Chinese, Filipino, Japanese, Korean, Vietnamese, Other Asian).

Black or African American

HMDA race code 3: Black or African American.

Hispanic or Latino

HMDA ethnicity code 1: Hispanic or Latino. Assigned regardless of reported race — ethnicity takes precedence in Plat's classification.

White

HMDA race code 5: White. Non-Hispanic White only — applicants coded Hispanic are assigned to the Hispanic category.

Multiracial

HMDA race code 6 (Information not provided), or records coded with two or more distinct racial groups.

Missing and Not-Applicable Race Data

HMDA records frequently have missing or "not applicable" race fields — particularly for purchased loans and certain institutional reporters. Records with unresolvable race data are excluded from per-race breakdowns and income medians, but are counted in the tract's total origination count and overall median income.

Geographic Boundaries & Epochs

Census tract boundaries are redrawn after each decennial census. Plat uses three boundary vintages to match HMDA data to the correct tract definitions.

Epoch Boundary Vintage HMDA Years Approx. Tract Count
2000 2000 Census TIGER 2007–2011 ~65,000
2010 2010 Census TIGER 2012–2021 ~74,000
2020 2020 Census TIGER 2022–present ~84,000

When you change years across an epoch boundary (for example, from 2021 to 2022), the map swaps the underlying tile layer to reflect the new boundary definitions. Some tracts split or merge between epochs; this can produce apparent discontinuities in tract-level time series that are geographic rather than substantive.

Zoom-Level Switching

To keep the map fast and readable, Plat shows different geographic levels depending on zoom: state boundaries at zoom levels below 7, county boundaries from zoom 7–8, and census tracts from zoom 9 and above. Clicking or double-clicking on a feature drills down to the next level.

How Income Is Calculated

Applicant income in HMDA data is the annualized gross income used by the lender to evaluate the application, in thousands of dollars. Plat converts these to full dollar amounts and computes the median (not mean) across all originations in a geography.

Medians are computed separately for each racial group within a tract. For tracts with fewer than 5 originations for a given racial group, the per-group income median is suppressed (shown as "—" in the tooltip) to avoid misleading values from very small samples. The overall tract median uses all originations regardless of race.

Income Is Not Inflation-Adjusted

All income values are nominal — they are not adjusted for inflation. Comparing income levels across years will reflect both real changes in buyer income and the effects of general inflation. When comparing across a long time span (for example, 2007 vs. 2024), keep in mind that the 2024 dollar is worth significantly less than the 2007 dollar.

What the Maps Don't Show