Methodology

This page documents the data sources, analytical choices, and known limitations behind the Metro Atlanta Transit Equity & Access Tracker. It is written for readers who want to verify the analysis — including transit researchers, FTA staff, and anyone who wants to reproduce or challenge the findings. Every dataset identifier, version, and derivation step is named explicitly.


Data sources

U.S. Census American Community Survey (ACS)

Demographic estimates come from the ACS 5-year estimates for the 2020–2024 period, the most recent available vintage as of the April 2026 refresh. The geography is tract-level across 10 metro Atlanta counties: Cherokee, Clayton, Cobb, DeKalb, Douglas, Forsyth, Fulton, Gwinnett, Henry, and Rockdale. The analysis uses 1,224 populated Census tracts after filtering out tracts with zero total population.

Five tables were extracted via the Census Bureau's Data API. Table B01003 provides total population. Table B03002 provides the Hispanic-or-Latino and non-Hispanic racial breakdown used to compute minority share. Table B16005 provides language-at-home and English-speaking-ability counts, which form the basis of the limited English proficiency estimate. Table B17001 provides poverty-level counts relative to the federal poverty line. Table B19013 provides median household income, which drives the income quartile assignment.

The LEP estimate draws from 24 variables in B16005 rather than a single field. The table separately reports four language groups — Spanish; other Indo-European; Asian and Pacific Islander; other languages — and, within each group, counts both native-born and foreign-born populations who speak English "well," "not well," or "not at all." Summing all three proficiency tiers below "very well" aligns this measure with the common FTA Title VI LEP standard of persons who speak English less than "very well." Including native-born limited-English speakers is analytically necessary: places like Norcross, Chamblee, and parts of Gwinnett County have long-established native-born communities whose members speak English at limited proficiency. An LEP measure that counts only foreign-born speakers would systematically undercount these communities and understate the transit equity stakes in those areas.

Federal Transit Administration National Transit Database (NTD)

Annual ridership and operating expense data come from the FTA's National Transit Database, fiscal years 2015 through 2024. Data were downloaded via the Socrata API at data.transportation.gov, using two datasets: npsm-38gk (service data) and 9ivb-8ae9 (financials and ridership). Both are published annually by the FTA and represent the most complete official record of U.S. transit agency operations.

Four operators are included. MARTA (NTD ID 40022) covers heavy rail and bus. CobbLinc (NTD ID 40078) covers Cobb County bus service. Gwinnett County Transit / Ride Gwinnett (NTD ID 40138) covers Gwinnett County bus. The fourth series bridges two entities: GRTA (NTD ID 40135) through FY2017 and the Atlanta-region Transit Link Authority / Xpress (NTD ID 42000) from FY2021 onward. GRTA transferred its commuter bus operations to ATL in July 2020; NTD records for both IDs are absent for FY2018–2020, the transition period. The dashboard treats this as a structural data gap and displays the two series as a continuous bridged line with the transition years annotated.

NTD data lags the current year by approximately two fiscal years. FY2024 is the most recent complete year available as of this publication.

MARTA monthly Key Performance Indicators

MARTA publishes 33 performance indicators across eight scorecard categories on its public website, covering on-time performance, customer satisfaction, safety incidents, paratransit metrics, and station accessibility. Individual KPI pages display the current-month value as a text figure alongside a trend chart. This dashboard scrapes those text values at build time via the data/marta_kpis.py loader and stores them in data/marta_kpis.json.

MARTA does not publish historical KPI data as machine-readable structured data. The trend charts on each KPI page are rendered client-side from JavaScript — they display data in a browser canvas but do not expose it as a downloadable file, a CSV, or an API endpoint. As a result, this dashboard contains only the most recent monthly snapshot for each indicator; twelve-month trend series are not available. This is a publishing choice by MARTA, not a technical limitation of the scraper. A reader who wants trend data would need to manually record values month over month, or petition MARTA to publish historical series in structured form.

GTFS route_type values 0 (tram, streetcar, light rail), 1 (subway, metro), and 2 (rail, generally including intercity and regional rail) are treated as fixed-guideway. In the Atlanta-region feeds reviewed in April 2026, route_type=0 captures the Atlanta Streetcar and route_type=1 captures MARTA heavy rail. No route in the feeds is classified as route_type=2 or as Bus Rapid Transit; if MARTA were to designate a BRT corridor formally, the dashboard's service equity calculations would update automatically on the next refresh.

General Transit Feed Specification (GTFS) feeds

Static GTFS feeds were downloaded as April 2026 snapshots from four operators. The MARTA feed was downloaded from the agency's published URL. The CobbLinc feed required discovery: the URL listed on Transitland was stale; the live feed is hosted on the Availtec / RiderAlerts platform. The Ride Gwinnett feed is also hosted on Availtec. The Xpress feed is published by the ATL via gamobility.info.

Three anomalies were identified and addressed during feed processing. First, Gwinnett's calendar uses date-based calendar_dates.txt entries rather than a standard calendar.txt with day-of-week fields; the service window query was adapted to handle this. Second, the MARTA feed endpoint returned intermittent HTTP 500 errors during the collection period; the loader retries with exponential backoff. Third, an early version of the headway computation produced trip counts approximately twice the correct value because trips were counted in both travel directions. This was discovered during QA against MARTA's published route timetables. The fix filters to direction_id = "0" before aggregating, which captures one canonical direction per route and eliminates the inflation.


Methodology

Service equity calculation

Each of the 1,224 tracts is assigned to an income quartile based on its ACS median household income (table B19013). Quartile boundaries are computed across all tracts with a non-null income value; tracts missing income data are excluded from quartile charts but remain in the map layer. The bottom 25% by income form Q1 (lowest-income); the top 25% form Q4 (highest-income).

A tract is classified as having fixed-guideway access if at least 25% of the tract's polygon area falls within a ½-mile straight-line proximity buffer around fixed-guideway stops. The 25% threshold is a best-practical-v1 choice — strict enough to reduce sensitivity to incidental tract-edge contacts, permissive enough to include tracts where fixed-guideway service reasonably reaches a meaningful portion of the tract. Sensitivity checks at 10% and 50% thresholds are computed alongside the 25% headline value and are available in the source JSON so reviewers can test the metric's robustness to threshold choice. A more rigorous v2 method would weight access by where tract residents actually live, using Census block-level population data. The service equity headline figure is a count of Q1 tracts where has_fixed_guideway_access_25pct = true divided by total Q1 tracts.

A tract is classified as having bus access if at least 25% of the tract's polygon area falls within the dashboard's bus-stop straight-line proximity buffer. The 25% threshold is used as the headline measure to reduce sensitivity to incidental tract-edge contacts. Sensitivity checks at 10% and 50% thresholds are computed alongside the 25% headline value and are available in the source JSON. This is an area-based straight-line proximity measure, not a pedestrian-network accessibility measure and not a population-weighted access measure.

Tracts with no service are assigned a sentinel headway of 120 minutes for quartile-averaging purposes and are explicitly labeled as transit deserts in all charts.

½-mile straight-line proximity buffer

The ½-mile straight-line proximity buffer radius follows the FTA's Title VI analysis threshold for fixed-guideway access. The 25% area-overlap threshold used to classify tracts as having access is the dashboard's own analytical choice, not an FTA requirement. All spatial operations use the UTM Zone 16N projection (EPSG:32616), which provides accurate meter-scale distances across the Atlanta region. Stop buffers are generated at 804.672 meters (the exact metric equivalent of ½ mile). Overlap fractions are computed by intersecting the buffered stop polygons with each tract polygon and dividing intersection area by tract area.

This is a straight-line proximity measure consistent with common Title VI transit-access practice; it does not reflect actual walkability, sidewalks, barriers, or pedestrian network routing. Population-weighted access using Census block-level data is a candidate refinement for a future version, providing a more accurate picture by weighting access by where residents actually live within tracts. That method requires Census block-level joins and adds complexity beyond v1's scope.

Peak headway computation

Peak windows are defined as 7:00–9:00 AM and 4:00–6:00 PM on weekdays. The snapshot date is April 22, 2026 — a Wednesday, chosen as a standard midweek service day unaffected by holiday or special-event schedules. For each route, headway is computed as 120 minutes divided by the number of first-stop departures in the canonical direction (direction_id = "0") within each 2-hour peak window. The morning and afternoon per-window headways are averaged to produce a single daily peak headway per route.

Peak headway is calculated per route during those windows. For each tract, the dashboard reports the best available peak headway among routes whose stop-buffer coverage overlaps at least 25% of the tract area. This represents the most frequent service available within the tract under the dashboard's 25% area-overlap access rule. It is not an average across all routes and is not population-weighted. Route-level eligibility, rather than individual-stop eligibility, ensures that routes serving a tract through cumulative stop coverage are properly counted, while preventing single edge-clipping stops from establishing a tract's best headway.

To avoid double-counting bidirectional service, the current version uses one canonical direction per route, direction_id = "0" in GTFS. Direction-specific headway analysis is a candidate refinement for a future version, since service can differ meaningfully by direction during peak periods — for example, commuter routes may run denser inbound than outbound. The dashboard's headway logic is acceptable and defensible for v1 with this caveat disclosed.

Demographic computations

Minority share is computed from B03002: total population minus the non-Hispanic white alone count, divided by total population.

LEP share is computed from B16005: the sum of all "speak English well," "speak English not well," and "speak English not at all" counts across all four language groups and both nativity categories (native-born and foreign-born), divided by total population aged 5 and over — 24 source variables in total. This aligns with the common Title VI LEP standard of persons who speak English less than "very well." The variable construction is described in detail under ACS sources above.

Poverty share is computed from B17001: persons for whom poverty status is determined and whose income is below 100% of the federal poverty line, divided by the total count for whom poverty status is determined.

Cost per trip

The cost-per-trip figures in the Regional Coverage tab represent each agency's total operating expenses divided by its total unlinked passenger trips for FY2024, both drawn from NTD. This is an agency-level accounting metric — it measures the public cost of operating the system per boarding, not what a rider pays at the farebox. No U.S. transit system covers its full operating cost from fare revenue; the remainder is subsidized by federal grants, state and local appropriations, and property tax levies.

CobbLinc's FY2024 cost per trip ($32.41) is substantially higher than MARTA's ($10.18). Three factors drive this: Cobb County's low ridership density relative to service hours operated; the geographic spread of a county bus system without the network density of an urban core; and the inclusion of ADA paratransit in CobbLinc's NTD reporting, which carries a structurally higher per-trip cost than fixed-route service and pulls the blended average up. The figure reflects structural differences in geography, land use, and required service mandates, not a measure of relative efficiency.


Known limitations


April 2026 technical review

An external technical review in April 2026 surfaced refinements that have been incorporated: the LEP definition was revised to the common Title VI standard of persons who speak English less than "very well" using 24 source variables from ACS table B16005; the ACS vintage was upgraded from 2019–2023 to 2020–2024; the spatial access methodology was revised from boundary/adjacency-based access to polygon-overlap thresholds, with 25% as the headline threshold and 10% and 50% as sensitivity checks, to reduce sensitivity to incidental tract-edge contacts; tract-level headway aggregation is now scoped to routes meeting the 25% overlap criterion; and the description of headway aggregation was clarified as "best available" rather than "population-weighted." The dashboard improves with feedback; this disclosure documents the changes.


Independence and license

This analysis is independent civic work by Gene Roth and is not affiliated with, funded by, or reviewed by MARTA, CobbLinc, Gwinnett County Transit, the Atlanta-region Transit Link Authority, the FTA, or any other transit agency or government body. Methodology choices and any errors are the author's own.

Dashboard source code is released under the MIT License. Analysis content — text, charts, and derived data outputs — is released under CC-BY-NC 4.0. Reuse with attribution is welcome for non-commercial purposes.

Source: github.com/GeneRoth/metro-atlanta-equity-tracker


Reproducibility

All data loaders are Python scripts in src/data/. The dashboard framework is Observable Framework. To reproduce: clone the repository, install dependencies with npm install and pip install -r requirements.txt, then run npm run build. Each loader fetches from its upstream source and writes a JSON file; the build process runs all loaders and assembles the static site.

Data is refreshed quarterly. The current build reflects sources as of April 2026. Pull requests with updated loaders or corrected methodology are welcome via the GitHub repository.