Funding from the Robert Wood Johnson Foundation’s Local Data for Equitable Communities program, and technical support from the Urban Institute, has enabled us to produce an interactive choropleth map aggregating 23 indicators — including demographics, housing production, building permits, traffic safety, infrastructure access, and air quality — across a variety of geographies.
{code_1}
You can see how Ward 7 compares to Ward 3 on median household income, or how a specific ANC compares to its neighbors on fatal crash rates, or how much income-restricted, subsidized housing has been built in each planning area since 2015.
Using the map embedded above, or a full-screen version here, you can use the drop-down menus in the upper-right of the screen to select any of the 23 indicators and any of eight geographic levels. When you do, the map will then show a map of DC, at that geographic level, color-coded by that indicator. You can mouse-over a geography to see its name and a measurement of the indicator.
You can also click on a geography to see a comparison table of all the indicators, and you can click more geographies to add them to the table. Click a geography again, or click the ‘x’ at the top of the column, to remove it from the table. When you remove all geographies, the table will disappear from the screen until you click on another one. (You’ll probably find the comparison table easier to use in the full-screen version).
In addition to using the map itself, you can also download a spreadsheet of indicator values here.
In this post, I’ll share a few especially interesting results of the analysis the map enables. And, I’ll review the methodology behind it: the choices of geographic levels of analysis, the sources of data, and the means of calculating each of the 23 indicators.
A few interesting results
There’s a lot of data accessible in the indicators map. As you explore it, you’ll make your own discoveries, find different patterns, and maybe learn something about your own neighborhood. These are just a few of the interesting data points that stuck out to me while I was building the map.
Traffic crashes and traffic fatalities have different distributions. Traffic crashes are relatively evenly-distributed across the District, with a hotspot in downtown and lighter incidence in Ward 3. But traffic fatalities are anything but even. Fatalities are highly concentrated in Ward 7 and Ward 8, with rates nearly twice as high as anywhere else in the city. This aligns with findings shown in a 2023 GGWash research project, a report on transportation, racial inequities, and public health in Washington, DC, also funded by RWJF.
Frequent transit covers less of the District than you might expect. We defined frequent transit access in a relatively conservative way: within a quarter-mile of a Metrorail entrance, or within an eighth of a mile of a bus stop running at 10-minute headways or better. This is meant to represent the kind of service that someone can rely on, every day, without having to check schedules or walk out of their way. This high bar means that for an ANC or ward to have a high transit-access score, it needs to be thoroughly covered by high-quality transit. The highest-scoring ward is Ward 1, with two-thirds of residents living close to frequent transit. The lowest is Ward 5, with barely more than a quarter. As good as our transit is, there’s a lot of room for improvement.
Worse air quality tracks closely with high-injury roads. The corridors with high diesel PM and NO₂ exposure tend to be the same ones with elevated crash rates and High Injury Network roads. None of this is a surprise to anyone familiar with environmental-justice literature. But the map makes it clear how residents who live near major arterials suffer the double burden of traffic violence and air pollution.
The distribution of income-restricted, subsidized (“affordable”) housing is very uneven. ANC 3D, the Palisades, has only seven income-restricted, subsidized units built since 2015. ANC 8C, Congress Heights, has over 3,000. When dedicated affordable housing is so concentrated in specific neighborhoods, people with lower incomes have less residential choice and less ability to live close to their communities and their places of work or school.
The eight geographic layers
One of the reasons DC is difficult to analyze at the neighborhood level is that its governance runs through overlapping, non-nested geographic systems. ANCs don’t correspond to planning areas, and land-use zones don’t follow, either. We included eight layers, and the choice of which to use matters depending on the question you’re asking.
Eight wards are the primary unit of District residents’ political representation, each individually represented by one member of the DC Council. Because wards are the largest areas we analyze, they have the most statistically robust results. Ward boundaries were redrawn after the 2020 Census to equalize the population distribution across wards. Ward-level data is the most widely cited in local policy discussions, which makes it a useful baseline. It also makes ward comparisons easy to put in context. If you know DC at all, you know roughly what Ward 8 means in terms of income and demographics. Source: DC Open Data, 2022 boundaries.
46 advisory neighborhood commissions (ANCs) are DC’s hyperlocal elected bodies. Each ANC represents several thousand residents and is given great weight on zoning, development, and licensing decisions. For most housing and land use questions, ANCs are the more operationally relevant unit than wards, because they’re the geography at which development fights tend to happen. Source: DC Open Data, 2023 boundaries.
345 ANC single-member districts are the individual commissioner districts within each ANC, typically covering a few hundred to a few thousand residents. At this scale, Census estimates become noisy and should be interpreted carefully. We include SMDs because they’re the unit at which commissioners are elected. Source: DC Open Data, 2023 boundaries.
Ten DC Comprehensive Plan planning areas are the ten planning regions used by the DC Office of Planning in the Comprehensive Plan: Far Northeast/Southeast, Near Northwest, Central Washington, and so on. They don’t correspond to any elected body, but they’re the geography at which the District thinks about long-range land use capacity and neighborhood change. If your interest is in housing production trends and growth policy, planning areas are often the right level of analysis. Source: DC Office of Planning via DC Open Data.
953 zoning districts — raw are individual zoning parcels as designated under DC’s 2016 Zoning Regulations. This is the highest-resolution look at legal land use in the tool. At 953 features, individual parcels can be very small, and the Census-based indicators are correspondingly unreliable. Source: DC Office of Zoning via DC Open Data.
178 zoning districts — by label dissolves the raw parcels by their zoning designation, so all R-1-A parcels citywide merge into one geometry, all MU-4 parcels merge, and so on. This is the more analytically useful zoning view: it lets you compare conditions across land use types rather than individual parcels, which is what you usually actually want to do when asking questions like “do we build more affordable housing in mixed-use zones than in residential zones?” Source: same as above, dissolved.
1,648 Future Land Use Map — raw is the District’s FLUM at parcel resolution. The FLUM is the long-range land use vision embedded in the Comprehensive Plan, with which zoning cannot conflict. At 1,648 features, this is the finest-grained geography in the tool, and Census-based indicators at this level are more illustrative than rigorous. Source: DC Office of Planning via DC Open Data.
44 Future Land Use Map — By land-use code dissolves FLUM parcels by their combined land use code, producing 44 distinct categories citywide. Source: same as above, dissolved.
Indicator methodologies
Demographics
We include seven demographic indicators. These are the baseline descriptors that give any neighborhood analysis its context. You can’t interpret a crash rate or an affordable housing count without knowing who lives there and at what density.
- 1: Total population — ACS table B03002. The count of total residents allocated to each target geography.
- 2: Population density — Total allocated population divided by the target polygon’s area in square miles. This is gross density, meaning the full polygon area including parks and water, which will slightly understate density in geographies with significant non-residential land.
- 3: Share non-White (People of Color)— ACS table B03002. Calculated as 1 minus the non-Hispanic White alone population divided by total population. This is the broadest available ACS measure of racial diversity and includes all residents not identified as non-Hispanic White, regardless of specific race or ethnicity. We include it because racial demographics remain one of the strongest predictors of access to infrastructure, exposure to pollution, and neighborhood investment patterns in DC.
- 4: Share age 18 or younger — ACS table B01001. Because the ACS bins ages 18 and 19 together, this is technically the share under age 20 — a close proxy for under 18, and the difference is small in practice. Children’s share of a neighborhood’s population matters for school planning, park investment, and family housing policy.
- 5: Share age 65 or older — ACS table B01001, summing all bins 65 and above. Older adults have distinct infrastructure needs — transit access, sidewalk quality, proximity to services — that this indicator helps identify where they’re concentrated.
- 6: Share non-male — ACS table B01001. The ACS measures biological sex (male/female), not gender identity. We label this “non-male” to be precise about what’s being measured. DC’s neighborhoods are roughly evenly split, but meaningful variation exists, particularly in areas with large institutional populations.
- 7: Median household income — ACS table B19001. The ACS reports income in 16 bins at the block group level rather than as a direct median, so we reconstruct the median by finding the 50th percentile within the cumulative bin distribution. Because this ACS variable as capped at 200,000, the map is not able to represent variation at the upper end of the income distribution.
Source: US Census Bureau, American Community Survey 5-Year Estimates, 2022 vintage, retrieved at the block group level via the Census API. All indicators are allocated to target geographies by area-fraction overlay.
Affordable housing
This group of indicators tracks where income-restricted, subsidized housing production has occurred since 2015, including where it’s been built, where it’s still in the pipeline, and whether production has kept pace with population.
- 8: Affordable housing units completed since 2015 — Sum of TOTAL_AFFORDABLE_UNITS for projects with a “Completed 2015 to Date” status. This is the stock of subsidy-supported affordable units that have actually come online in the past decade.
- 9: Affordable housing units in the pipeline — Sum of TOTAL_AFFORDABLE_UNITS for projects currently listed as “Pipeline” or “Under Construction.” These units are committed but not yet built.
- 10: Affordable housing units completed or in progress since 2015 — The combined total. This is the broadest view of the production pipeline: where has the city’s affordable housing investment been directed?
- 11: Affordable units per resident (Built since 2015) — The combined count divided by total population. Raw unit counts favor larger geographies; this rate normalizes for population size and helps identify which neighborhoods have seen disproportionately high or low production relative to their existing residents.
This dataset counts affordable units within DHCD-tracked projects, not unique addresses, and it doesn’t distinguish between units affordable at 30 percent of AMI and those affordable at 80 percent. The count is a reasonable proxy for production activity, but it overstates the depth of affordability.
Source: DC Open Data, Affordable Housing dataset maintained by the DC Department of Housing and Community Development (DHCD). Each project is a geographic point, assigned to geographies by point-in-polygon.
Building permits
Building permits are a leading indicator of housing supply growth. They are imperfect, since not every permit becomes a building, but meaningful as a measure of where new construction has been attempted. The map shows exclusively new building permits, excluding renovations, additions, and repairs.
Across the ten-year period, the filtered dataset yields 3,830 permit records. After deduplication by address (to remove cases where a project appears in multiple annual files), we have 3,610 unique locations. Annual totals peaked in 2021 at 561 unique addresses and declined to 243 by 2024.
- 12: New building permits (2016–2024, deduplicated) — Count of unique permitted construction addresses per geography.
- 13: New building permits per resident — The count normalized by population, useful for comparing production intensity across geographies of different sizes.
Source: DC Open Data, building permit datasets, downloaded annually for 2015–2024. Filtered to PERMIT_SUBTYPE_NAME equal to “NEW BUILDING,” then deduplicated across years by normalized address.
Traffic crashes
The full dataset contains 342,539 records. After filtering to the 2016–2025 window and deduplication, we work with 223,960 crashes. Fatal crashes are defined as any record where at least one of five fatality fields (FATAL_DRIVER, FATAL_PEDESTRIAN, FATAL_BICYCLIST, FATALPASSENGER, or FATALOTHER) is greater than zero. By that definition, the dataset contains 354 fatal crashes over the period.
Traffic safety is the indicator group where the data tells the most direct story about who is being harmed and where. The raw counts tell you volume; the per-capita rates tell you risk; comparing the two tells you something about the character of the danger.
- 14: Traffic crashes (2016–2025) — Total count of crashes per geography over the full period.
- 15: Fatal crashes (2016–2025) — Count of crashes where any person was killed. At 354 total across ten years, this is a small number, and at the SMD level fatal crash counts will often be zero or one. Interpret with caution.
- 16: Traffic crashes per 10,000 residents — Normalizes crash volume for population size. High-traffic commercial corridors with few residential addresses will appear elevated on this measure, which is a feature rather than a bug: it surfaces where crash risk is concentrated relative to who lives nearby.
- 17: Fatal crashes per 10,000 residents — The same normalization applied to fatal crashes. At small geographies, a single fatality can produce an outsized rate. We cap the display value in the visualization to prevent a single outlier from dominating the color scale.
Source: DC Open Data, Crashes in DC dataset, covering reports from 2016 through 2025. Deduplicated by CRIMEID.
People near infrastructure
This indicator group shows the share of a geography’s residents living close enough to each piece of infrastructure to plausibly use it. “Close enough” is defined differently for each mode based on reasonable walking distances.
The methodology here works in two steps. First, for each Census block group, we calculate what fraction of its area falls within the relevant buffer zone. We multiply that fraction by the block group’s total population to estimate how many residents are “near” the infrastructure. Then we allocate those estimated counts to target geographies using the same area-fraction method used elsewhere, and report the share.
- 18: Share of residents near High Injury Network roads — Within 200 meters (roughly ⅛ mile) of DDOT’s High Injury Network, the set of road segments responsible for a disproportionate share of DC’s serious and fatal crashes. This is an exposure indicator, not an access indicator. Being near HIN roads is a harm, not a benefit. Source: DDOT via DC Open Data.
- 19: Share of residents near frequent transit — Within 400 meters (¼ mile) of a Metrorail entrance, or within 201 meters (⅛ mile) of a bus stop with median weekday headways of 10 minutes or better between 7 a.m. and 7 p.m., with at least 6 scheduled departures in that window. We use a larger buffer for Metro because station access typically involves a longer walk than a bus stop; the asymmetry reflects how people actually use the two modes. Headways are computed from WMATA’s GTFS feed. Source: WMATA GTFS; DC Open Data for Metro entrances.
- 20: Share of residents near protected bike lanes — Within 200 meters (⅛ mile) of a physically-protected bike lane (BIKELANE_PROTECTED or BIKELANE_DUAL_PROTECTED in DDOT’s bicycle lanes dataset). Painted lanes without physical protection are excluded. Protected infrastructure is meaningfully different from painted lanes in terms of who is willing to use it; treating them the same would overstate true cycling access. Source: DDOT via DC Open Data.
- 21: Share of residents near Capital Bikeshare — Within 200 meters (⅛ mile) of an installed bikeshare station. Bikeshare access is a reasonable proxy for first-/last-mile active transportation options in DC, and the station network is dense enough in some areas to make this indicator informative. Source: Capital Bikeshare station locations via DC Open Data.
Source: DDOT and WMATA data via DC Open Data and WMATA’s public GTFS feed. All population figures use ACS 2022 block group totals.
Air quality
EJScreen is the Environmental Protection Agency’s environmental-justice screening tool. It publishes modeled estimates of pollution exposure at the block group level, expressed as national percentiles.
A block group at the 80th percentile for NO₂ has higher modeled nitrogen dioxide exposure than 80 percent of block groups in the country. This framing makes DC’s neighborhoods comparable both to each other and to the national distribution, useful for a city that sometimes thinks of its pollution exposure as a solved problem when it isn’t.
- 22: NO₂ exposure (EJScreen national percentile) — EJScreen field P_NO2. Nitrogen dioxide is primarily associated with vehicle traffic and is a marker for respiratory risk, particularly for children and people with asthma. Aggregated to target geographies as a population-weighted mean of block group percentiles.
- 23: Diesel particulate matter exposure (EJScreen national percentile) — EJScreen field P_DSLPM. Diesel PM is associated with freight trucks, bus depots, and construction equipment. Like NO₂, it tracks closely with arterial corridors and industrial land uses. Aggregated the same way as NO2 exposure.
Source: EPA EJScreen 2024, archived via Zenodo (DOI: 10.5281/zenodo.14767363). Data at the Census block group level, allocated to target geographies by area-fraction overlay with population weighting.
How we built the map
The core aggregation method is area-fraction-weighted allocation. When source data comes in Census block groups and the target geography is, say, an ANC, we intersect the two, calculate what fraction of each block group’s area overlaps the ANC, and allocate numeric values proportionally. It’s the standard approach for areal interpolation when source and target geographies don’t align, which, in DC, they never do.
This is a classic issue in geospatial analysis, called the Modifiable Areal Unit Problem. When we allocate block group populations to target geographies by land area, we’re assuming people are distributed uniformly across the block group. They aren’t — people live in buildings — but the Census doesn’t publish finer population counts.
For large geographies like wards and planning areas, this is a reasonable approximation. For small geographies like SMDs and raw FLUM parcels, it can produce meaningful error when a block group overlaps many small target features with very different land uses. This means you should take our results for those small or low-density geographies with a big grain of salt. (For example, this is why we say that the McMillan Reservoir has an average household income of $156,000. This is ridiculous – nobody lives in the reservoir – but it’s the statistical result of the process we have to use to aggregate data.)
Point data (crashes, building permits, affordable housing projects) uses simpler point-in-polygon counting: Each point falls in exactly one target polygon, and we sum.
All indicator values are rounded so as not to overstate the precision of the findings. Percentage values are rounded to the nearest whole percentage point (e.g., 25.3% becomes 25%), and numerical values are rounded to two significant figures (e.g., 142,304 becomes 140,000). We hope this will reinforce the understanding that indicator values are approximate, especially for the smaller geographic units but also for the larger ones.
The software to generate the map is built in Python, using GeoPandas for spatial operations, the Census API for demographic data, and Leaflet for the web visualization. Every indicator gets computed by the same basic pipeline: fetch or load the source data, clean and project it to DC State Plane (EPSG:26985), aggregate to each of the eight geographic layers, and write the results to a GeoPackage. The visualization script then reads all eight GeoPackages, combines them with display metadata, and renders a single self-contained HTML file.
Limitations
There are a few key limitations that you should bear in mind when using the indicator map.
- Small-area Census estimates carry significant uncertainty. ACS five-year estimates at the block group level have margins of error that can be large relative to the estimate itself, especially for rare characteristics in small block groups. After allocating to small target geographies, those errors compound. Income estimates at the SMD level, in particular, should be treated as rough indicators rather than precise measures. We don’t display confidence intervals in the tool because the user interface would become unwieldy.
- The data comes from different years. Demographic figures reflect 2018–2022 conditions (the ACS 2022 five-year window). Crash data runs through 2025. EJScreen is a 2024 vintage. Affordable housing data reflects the current DC Open Data snapshot. These indicators don’t all describe the same moment in time, which means the tool isn’t suited for tracking how a neighborhood changed over a specific period.
- “Affordable” means income-restricted and subsidized, but covers a wide range. The housing indicator counts DHCD-tracked units with some affordability mechanism, but doesn’t distinguish between units restricted to 30% of AMI and those restricted to 80% — or between long-term deed restrictions and time-limited commitments. The count measures production activity of income-restricted and subsidized units, not depth of their affordability.
- A permit is not a building. Some permitted projects are never built, and some completed buildings were permitted years before the period this tool covers. The permits indicator is a leading indicator of construction intent, not a direct count of new housing units.
- EJScreen percentiles are national, not local. A DC block group at the 65th national percentile for NO₂ may be entirely typical for a dense East Coast city. The percentiles tell you where DC neighborhoods stand relative to the country, which is useful, but they don’t tell you whether DC’s absolute air quality levels are acceptable by a particular clinical or regulatory standard.
- The High Injury Network is a policy designation. DDOT determined the HIN using historical crash data, but it’s a discrete list of road segments, not a continuous function of crash severity. If DDOT updates the network, the indicator would change independent of any change in actual crash risk.
Top image: Scott Circle in Northwest DC (Ward 2, ANC 2B, SMD 2B04). Image by Joe Flood licensed under Creative Commons.
© Getty Images
© Chinadaily
© Chinadaily
© <a href="http://trip.com" rel="nofollow">trip.com</a>
© CPG



