Economic Indicators

Wages by Occupation Methodology

Wages by Occupation Methodology

This methodology localizes occupational wage estimates from the U.S. Bureau of Labor Statistics' Occupational Employment and Wage Statistics (OEWS) program. OEWS publishes wages at the metropolitan-area (MSA) level rather than at municipal or county level, so each app geography is resolved to its containing MSA before the wage estimates are joined in.

Curated Occupations

The chart reports 25th, 50th, and 75th percentile annual wages for 12 occupations, chosen to span four sector groupings used elsewhere in the platform:

SectorOccupationSOC code
KnowledgeSoftware Developer15-1252
KnowledgeAccountant13-2011
KnowledgeFinancial Analyst13-2051
Blue collarElectrician47-2111
Blue collarPlumber47-2152
Blue collarHeavy Truck Driver53-3032
ServiceRetail Salesperson41-2031
ServiceFood Prep & Server35-2014
ServiceJanitor / Cleaner37-2011
Eds, meds & publicRegistered Nurse29-1141
Eds, meds & publicK-12 Teacher25-2031
Eds, meds & publicPolice Officer33-3051

The sector groupings match those used in the job growth chart so the two views are directly comparable.

Geographic Resolution

OEWS publishes wages by area_code, where each metropolitan area_code corresponds to one CBSA. The chart resolves each app geoid to a CBSA in three steps:

  1. County → CBSA mapping. A persistent dictionary is built from xwalks.xwalk, grouping by (cty, cbsa) and picking the most common CBSA for each county. Non-metro rows (cbsa = '99999') are excluded.
  2. Geoid → County. The county FIPS is extracted from the geoid:
    • 5-character geoids (counties) are used directly.
    • 10-character geoids (county subdivisions) use the first five characters.
    • 7-character geoids (places) are resolved through xwalks.place_to_county_xwalk_2024, picking the county with the largest place_area_share per place.
  3. County → CBSA → OEWS area_code. The county FIPS is looked up in the mapping from step 1; the resulting CBSA code is the OEWS area code.

National Fallback

Geoids that fail to resolve to any MSA (for example, rural counties not in a CBSA) fall back to the OEWS national series (area_code = '99', AREA_TYPE = 1). The chart still emits the same 12 occupations for these geoids, with the same column layout, so the rendered visualization is uniform across communities.

Vintage Selection

The OEWS table is filtered to the 12 curated SOC codes and to either the resolved CBSA codes or the national area code, then narrowed to the latest year present in the data. Older vintages are not retained per-geoid; the chart shows a snapshot for the most recent year only.

Wage values are only emitted when all three percentile fields (p25, p50, p75) are present for a row. Suppressed cells (common for low-employment occupations in small MSAs) result in that occupation being omitted for that geoid for that year.

Output Table

ColumnDescription
geoidGeography identifier
soc_codeBLS SOC occupation code
occupationDisplay name
sectorSector grouping (Knowledge / Blue collar / Service / Eds, meds & public)
p2525th-percentile annual wage
p50Median annual wage
p7575th-percentile annual wage
yearOEWS vintage

Caveats

  • OEWS measures wages where the job is, not where the worker lives. A bedroom community will inherit the wage profile of its surrounding metro.
  • Small or fast-growing MSAs may have BLS-suppressed cells for less-common occupations. The chart silently omits those rows; missing bars in the visualization reflect data suppression, not a true zero wage.
  • The national fallback yields the same wage profile for any non-MSA geoid, so neighboring rural counties will show identical wage values until they are mapped to a CBSA.
Previous
Employment nowcast