Share of Texas Workers by Immigration Status in Selected Occupations
Background
Inspiration for this analysis came from a Brookings analysis here.
Final visualization for this analysis is published here. A secondary visual option using ET colors here.
Methods
For this analysis, I used 2023 5-Year ACS microdata from IPUMS USA and filtered for Texas workers. First round restricts to specific occupations (OCC list here). Second edit does not. After classifying individuals by immigration status (U.S. Born, Authorized Immigrant, Unauthorized Immigrant), the top 15 occupations where unauthorized immigrants are most concentrated as a share of their group were identified.
Occupation labels were applied post hoc using the official OCC crosswalk, and data were grouped by immigration status to calculate the percentage of each group working in each occupation.
Below is a list of variables pulled from the microdata. I filtered for Texas in IPUMS. Data for 2022 is available in the dataset if needed for comparison, but excluded from the analysis which only presented 2023.
Summary of Findings
Unauthorized immigrant workers in Texas remain highly concentrated in essential manual labor and service occupations, including construction laborers (5.75%), maids and housekeeping cleaners (3.91%), and cooks (3.77%). These three jobs alone account for more than 13% of all unauthorized immigrant workers in the state.
Other highly concentrated occupations for unauthorized immigrants include janitors (3.4%), drivers and truckers (2.71%), and painters (2.08%). Though still present in retail and tech roles (e.g., cashiers, retail sales, and software developers), these are less dominant relative to their representation in manual labor roles.
Compared to the U.S.-born and authorized immigrant populations, unauthorized workers are more heavily represented in lower-wage, physically demanding occupations that are vital to Texas’s economy but often lack sufficient legal protections and benefits.
NOTE: We are comparing within-group percentages and not raw counts.
Use of data from IPUMS USA is subject to conditions including that users should cite the data appropriately. Use command `ipums_conditions()` for more details.
dat1 <-zap_labels(dat1)
# str(dat1)tex_dat <- dat1 |>mutate(immigration_status =case_when( CITIZEN ==1~"U.S. Born", # Born abroad to American parents — considered U.S. citizen CITIZEN ==2~"Authorized Immigrant", # Naturalized citizen CITIZEN ==4~"Authorized Immigrant", # First papers CITIZEN ==3~"Unauthorized Immigrant", # Not a citizenTRUE~NA_character_ ))tex_dat <- tex_dat |>filter(YEAR ==2023)tex_dat <- tex_dat |>filter(!is.na(immigration_status) & OCC >0) # tex_dat <- tex_dat |># mutate(occupation = case_when(# OCC %in% c(4230) ~ "Maids and housekeeping cleaners",# OCC %in% c(4020) ~ "Cooks",# OCC %in% c(6260) ~ "Construction laborers",# OCC %in% c(4220) ~ "Janitors and building cleaners",# OCC %in% c(6730) ~ "Highway maintenance workers",# OCC %in% c(6050) ~ "Miscellaneous agricultural workers",# OCC %in% c(6230) ~ "Carpenters",# OCC %in% c(6515) ~ "Roofers",# OCC %in% c(6442) ~ "Plumbers, pipefitters, and steamfitters",# OCC %in% c(6410) ~ "Painters",# OCC %in% c(4720) ~ "Cashiers",# OCC %in% c(4140) ~ "Dishwashers",# OCC %in% c(9640) ~ "Packers and packagers, hand",# OCC %in% c(9130) ~ "Driver/sales workers and truck drivers",# OCC %in% c(8800) ~ "Packaging and filling machine operators and tenders",# TRUE ~ "Other"# ))tex_dat2 <- tex_dat |>mutate(occupation =case_when( OCC %in%c(4230) ~"Maids and housekeeping cleaners", OCC %in%c(4020) ~"Cooks", OCC %in%c(6260) ~"Construction laborers", OCC %in%c(4220) ~"Janitors and building cleaners", OCC %in%c(6730) ~"Highway maintenance workers", OCC %in%c(6050) ~"Miscellaneous agricultural workers", OCC %in%c(6230) ~"Carpenters", OCC %in%c(6515) ~"Roofers", OCC %in%c(6442) ~"Plumbers, pipefitters, and steamfitters", OCC %in%c(6410) ~"Painters", OCC %in%c(4720) ~"Cashiers", OCC %in%c(4140) ~"Dishwashers", OCC %in%c(9640) ~"Packers and packagers, hand", OCC %in%c(9130) ~"Driver/sales workers and truck drivers", OCC %in%c(8800) ~"Packaging and filling machine operators and tenders", OCC %in%c(3601) ~"Home health aides", OCC %in%c(3602) ~"Personal care aides", OCC %in%c(3603) ~"Nursing assistants", OCC %in%c(3605) ~"Orderlies and psychiatric aides", OCC %in%c(3610) ~"Occupational therapy assistants and aides", OCC %in%c(3620) ~"Physical therapist assistants and aides", OCC %in%c(3630) ~"Massage therapists", OCC %in%c(3640) ~"Dental assistants", OCC %in%c(3645) ~"Medical assistants", OCC %in%c(3646) ~"Medical transcriptionists", OCC %in%c(3647) ~"Pharmacy aides", OCC %in%c(3648) ~"Veterinary assistants and laboratory animal caretakers", OCC %in%c(3649) ~"Phlebotomists", OCC %in%c(3655) ~"Other healthcare support workers", OCC %in%c(3700) ~"First-line supervisors of correctional officers", OCC %in%c(3710) ~"First-line supervisors of police and detectives", OCC %in%c(3720) ~"First-line supervisors of firefighting and prevention workers", OCC %in%c(3725) ~"Miscellaneous first-line supervisors, protective service workers", OCC %in%c(3740) ~"Firefighters", OCC %in%c(3750) ~"Fire inspectors", OCC %in%c(3801) ~"Bailiffs", OCC %in%c(3802) ~"Correctional officers and jailers", OCC %in%c(3820) ~"Detectives and criminal investigators", OCC %in%c(3840) ~"Fish and game wardens and parking enforcement officers", OCC %in%c(3870) ~"Police officers", OCC %in%c(3900) ~"Animal control workers", OCC %in%c(3910) ~"Private detectives and investigators", OCC %in%c(3930) ~"Security guards and gaming surveillance officers", OCC %in%c(3940) ~"Crossing guards and flaggers", OCC %in%c(3945) ~"Transportation security screeners", OCC %in%c(3946) ~"School bus monitors", OCC %in%c(3960) ~"Other protective service workers", OCC %in%c(4000) ~"Chefs and head cooks", OCC %in%c(4010) ~"First-line supervisors of food preparation and serving workers", OCC %in%c(4030) ~"Food preparation workers", OCC %in%c(4040) ~"Bartenders", OCC %in%c(4055) ~"Fast food and counter workers", OCC %in%c(4110) ~"Waiters and waitresses", OCC %in%c(4120) ~"Food servers, nonrestaurant", OCC %in%c(4130) ~"Dining room and cafeteria attendants and bartender helpers", OCC %in%c(4150) ~"Hosts and hostesses, restaurant, lounge, and coffee shop", OCC %in%c(4160) ~"Food preparation and serving related workers, all other", OCC %in%c(4200) ~"First-line supervisors of housekeeping and janitorial workers", OCC %in%c(4210) ~"First-line supervisors of landscaping, lawn service, and groundskeeping workers", OCC %in%c(4240) ~"Pest control workers", OCC %in%c(4251) ~"Landscaping and groundskeeping workers", OCC %in%c(4252) ~"Tree trimmers and pruners", OCC %in%c(4255) ~"Other grounds maintenance workers", OCC %in%c(4330) ~"Supervisors of personal care and service workers", OCC %in%c(4340) ~"Animal trainers", OCC %in%c(4350) ~"Animal caretakers", OCC %in%c(4400) ~"Gambling services workers", OCC %in%c(4420) ~"Ushers, lobby attendants, and ticket takers", OCC %in%c(4435) ~"Other entertainment attendants and related workers", OCC %in%c(4461) ~"Embalmers, crematory operators, and funeral attendants", OCC %in%c(4465) ~"Morticians, undertakers, and funeral arrangers", OCC %in%c(4500) ~"Barbers", OCC %in%c(4510) ~"Hairdressers, hairstylists, and cosmetologists", OCC %in%c(4521) ~"Manicurists and pedicurists", OCC %in%c(4522) ~"Skincare specialists", OCC %in%c(4525) ~"Other personal appearance workers", OCC %in%c(4530) ~"Baggage porters, bellhops, and concierges", OCC %in%c(4540) ~"Tour and travel guides", OCC %in%c(4600) ~"Childcare workers", OCC %in%c(4621) ~"Exercise trainers and group fitness instructors", OCC %in%c(4622) ~"Recreation workers", OCC %in%c(4640) ~"Residential advisors", OCC %in%c(4655) ~"Personal care and service workers, all other",TRUE~"Other" ))
library(dplyr)library(ggplot2)library(scales)# Summarize dataoccupation_summary <- tex_dat2 |>filter(occupation !="Other") |>group_by(occupation, immigration_status) |>summarise(worker_count =sum(PERWT, na.rm =TRUE), .groups ="drop")group_totals <- occupation_summary |>group_by(immigration_status) |>summarise(total_group_workers =sum(worker_count, na.rm =TRUE), .groups ="drop")occupation_summary <- occupation_summary |>left_join(group_totals, by ="immigration_status") |>mutate(percent_within_group = worker_count / total_group_workers)top_occupations <- occupation_summary |>filter(immigration_status =="Unauthorized Immigrant") |>arrange(desc(percent_within_group)) |>slice(1:15) |>pull(occupation)brookings_style_data <- occupation_summary |>filter(occupation %in% top_occupations) |>mutate(occupation =factor(occupation, levels =rev(top_occupations)))ggplot(brookings_style_data, aes(x = percent_within_group, y = occupation, fill = immigration_status)) +geom_col(position ="stack") +scale_x_continuous(labels =percent_format()) +scale_fill_manual(values =c("U.S. Born"="#003f5c","Authorized Immigrant"="#7a5195","Unauthorized Immigrant"="#ef5675" )) +labs(title ="Top 15 Occupations for Unauthorized Immigrant Workers in Texas (2022)",subtitle ="Each bar shows the share of each immigration group working in these occupations",x ="Percent of Group Working in This Occupation",y ="Occupation",fill ="Immigration Status" ) +theme_minimal(base_size =12) +theme(legend.position ="bottom")