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:
| Sector | Occupation | SOC code |
|---|---|---|
| Knowledge | Software Developer | 15-1252 |
| Knowledge | Accountant | 13-2011 |
| Knowledge | Financial Analyst | 13-2051 |
| Blue collar | Electrician | 47-2111 |
| Blue collar | Plumber | 47-2152 |
| Blue collar | Heavy Truck Driver | 53-3032 |
| Service | Retail Salesperson | 41-2031 |
| Service | Food Prep & Server | 35-2014 |
| Service | Janitor / Cleaner | 37-2011 |
| Eds, meds & public | Registered Nurse | 29-1141 |
| Eds, meds & public | K-12 Teacher | 25-2031 |
| Eds, meds & public | Police Officer | 33-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:
- 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. - 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 largestplace_area_shareper place.
- 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
| Column | Description |
|---|---|
geoid | Geography identifier |
soc_code | BLS SOC occupation code |
occupation | Display name |
sector | Sector grouping (Knowledge / Blue collar / Service / Eds, meds & public) |
p25 | 25th-percentile annual wage |
p50 | Median annual wage |
p75 | 75th-percentile annual wage |
year | OEWS 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.