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

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.

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)