Occupational Employment and Wage Statistics Polygons, 2024
This data set contains counties classified by metropolitan statistical area as defined by the Office of Management and Budget for use with data from the Bureau of Labor Statistics Occupational and Employment Wage Statistics Query System (OEWS).
The primary purpose of this data set is to provide polygons that can be conveniently joined with downloaded OEWS data for mapping and spatial analysis, although attributes include employment and annual median wage information for a handful of example occupations.
County boundary polygons are from the US Census Bureau's 2023 TIGER/Line cartographic boundary files with 2024 MSA county definitions from the US Bureau of Labor Statistics.
Minn, Michael. 2025. "Occupational Employment and Wage Statistics Polygons, 2024." Modified 31 October 2025. https://michaelminn.net/tutorials/data/2024-oews-metadata.html.
Geography Fields
- OEWS_MSA: MSA names with area numbers that can be directly joined to Area Name fields in Excel data downloaded from the BLS. Occupational and Employment Wage Statistics Query System (OEWS). Note that BLS MSAs are defined on county boundries and differ from core-based statistical areas (CBSAs) defined by the US Census Bureau.
- GEOIDFQ: Fully-qualified GEOID code composed of a prefix and FIPS code that can be used to unambiguously join with US Census Bureau data from data.census.gov.
- ST (STUSPS): USPS two-letter state code (states, counties, tracts, and ZCTA only)
- Name (NAME): County name
- Latitude: WGS 1984 latitude of the centroid calculated from the area polygons with st_centroid()
- Longitude: WGS 1984 longitude of the centroid calculated from the area polygons with st_centroid()
- Square_Miles: Land area in square miles calculated by dividing ALAND + AWATER (square meters) by 2,589,988
Employment Data
*_MSA_Jobs (total MSA employees) and *_Wage (annual mean wage), *_per_1k (employment per 1k jobs) fields are provided for the following example occupations.
Note that employment totals are for each MSA as a whole and are duplicated across all counties in the MSAs.
- Accountants and Auditors (SOC code 13-2011)
- Actuaries (SOC code 15-2011)
- Educational, Guidance, and Career Counselors and Advisors (SOC code 21-1012)
- Epidemiologists (SOC code 19-1041)
- Logisticians (SOC code 13-1081)
- Physical Therapists (SOC code 29-1123)
- Plumbers, Pipefitters, and Steamfitters (SOC code 47-2152)
- Police and Sheriff's Patrol Officers (SOC code 33-3051)
- Sales Managers (SOC code 11-2022)
- Surveying and Mapping Technicians (SOC code 17-3031)
- Urban and Regional Planners (SOC code 19-3051)
- Web Developers (SOC code 15-1254)
R Processing Code
library(readxl)
areas = read_excel("2024-oews-area-definitions.xlsx")
areas$GEOIDFQ = paste0("0500000US", areas$FIPS, areas$"County code")
areas$MSA_Number = ifelse(nchar(areas$new_area) <= 5, paste0("00-", areas$new_area),
paste0(substr(areas$new_area, 1, 2), '-', substr(areas$new_area, 3, 7)))
areas$OEWS_MSA = paste0(areas$MSA, " (", areas$MSA_Number, ")")
library(sf)
counties = st_read("2019-2023-acs-counties.geojson")
counties = counties[,c("GEOIDFQ", "ST", "Name", "Latitude", "Longitude", "Square_Miles", "geometry")]
counties = merge(counties, areas[,c("GEOIDFQ", "OEWS_MSA")])
#plot(counties["OEWS_MSA"], border=NA)
occupations = read.csv("2024-oews-long.csv")
occupations$Short.Name = gsub(" ", "_", occupations$Short.Name)
for (jobname in unique(occupations$Short.Name)) {
job = occupations[occupations$Short.Name == jobname,
c("Area.Name", "Employment", "Annual.Median.Wage", "Employment.per.1.000.Jobs")]
names(job) = c("OEWS_MSA", paste0(jobname, "_MSA_Jobs"), paste0(jobname, "_Wage"), paste0(jobname, "_per_1k"))
counties = merge(counties, job, all.x=T)
}
#plot(counties["Plumber_Wage"], border=F)
st_write(counties, "2024-oews.geojson", delete_dsn=T)
write.csv(counties, "2024-oews.csv", row.names=F)