How are government workforce composition and the distribution of government employment across public functions associated across U.S. states and Washington, D.C. in 2025?
H1: Geographic areas with a higher proportion of full-time government employees will tend to have higher average monthly government payroll per employee.
H2: Geographic areas with a higher proportion of government employment devoted to education will tend to have a lower proportion devoted to police protection.
The data used for this analysis come from the U.S. Census Bureau’s Annual Survey of Public Employment & Payroll (ASPEP), specifically the 2025 State and Local Government Employment and Payroll Data. The dataset provides information on public employment and payroll across geographic areas and government functions.
The dataset meets the criteria established for this course.
1. Relevant documentation
The U.S. Census Bureau provides documentation for the Annual Survey of Public Employment & Payroll, including information about the survey methodology, variables, data files, and government classifications. This documentation provides information needed to interpret the variables and understand how the data were collected and organized.
2. Protection of personal and sensitive information
The dataset contains aggregate government employment and payroll information rather than individual-level records. It does not contain personally identifying information, personal health information, or other individual-level sensitive information.
3. Authorization for public distribution
The data are publicly distributed by the U.S. Census Bureau as part of its public government employment and payroll data products.
4. Sufficient observations and variables
The dataset contains 1,976 observations and 20 variables. The observations represent combinations of geographic areas and government functions for 2025. The dataset includes employment and payroll measures that provide sufficient information to conduct descriptive and correlational analyses.
5. Relevance to Public Administration and Nonprofit Administration
The dataset is directly relevant to Public Administration because it measures employment and payroll within state and local governments. Government workforce composition and the distribution of public employees across functions are important aspects of public-sector administration and resource allocation.
library(readr)
my_data <- read_csv("GOVSEMPTIMESERIES.GS00EMP01-2026-09-22T170141.csv")
## Rows: 1976 Columns: 20
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (7): Geographic Area Name (NAME), Meaning of Aggregate Description (AGG_...
## dbl (6): Year (time), Full-Time Employment Coefficient of Variation (FT_EMP_...
## num (7): Full-Time Employment (FT_EMP), Full-Time Payroll (FT_PAY), Part-Tim...
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
head(my_data)
## # A tibble: 6 × 20
## `Year (time)` `Geographic Area Name (NAME)` Meaning of Aggregate Description…¹
## <dbl> <chr> <chr>
## 1 2025 United States Total - All Government Employment…
## 2 2025 United States Financial Administration
## 3 2025 United States Other Government Administration
## 4 2025 United States Judicial and Legal
## 5 2025 United States Police Protection Total
## 6 2025 United States Police Protection - Persons with …
## # ℹ abbreviated name: ¹​`Meaning of Aggregate Description (AGG_DESC_LABEL)`
## # ℹ 17 more variables: `Meaning of Type of Government (GOVTYPE_LABEL)` <chr>,
## # `Full-Time Employment (FT_EMP)` <dbl>, `Full-Time Payroll (FT_PAY)` <dbl>,
## # `Part-Time Employment (PT_EMP)` <dbl>, `Part-Time Payroll (PT_PAY)` <dbl>,
## # `Part-Time Hours (PT_HRS)` <chr>,
## # `Full-Time Equivalent Employment (FTE)` <dbl>,
## # `Total Full-Time and Part-Time Employment (TOT_EMP)` <dbl>, …
summary(my_data)
## Year (time) Geographic Area Name (NAME)
## Min. :2025 Length :1976
## 1st Qu.:2025 N.unique : 52
## Median :2025 N.blank : 0
## Mean :2025 Min.nchar: 4
## 3rd Qu.:2025 Max.nchar: 20
## Max. :2025
## Meaning of Aggregate Description (AGG_DESC_LABEL)
## Length :1976
## N.unique : 38
## N.blank : 0
## Min.nchar: 6
## Max.nchar: 50
##
## Meaning of Type of Government (GOVTYPE_LABEL) Full-Time Employment (FT_EMP)
## Length :1976 Min. :0.000e+00
## N.unique : 1 1st Qu.:9.642e+02
## N.blank : 0 Median :3.676e+03
## Min.nchar: 15 Mean :4.996e+04
## Max.nchar: 15 3rd Qu.:1.451e+04
## Max. :1.579e+07
## Full-Time Payroll (FT_PAY) Part-Time Employment (PT_EMP)
## Min. :0.000e+00 Min. : 0.0
## 1st Qu.:6.083e+06 1st Qu.: 99.0
## Median :2.329e+07 Median : 539.5
## Mean :3.325e+08 Mean : 15757.7
## 3rd Qu.:9.887e+07 3rd Qu.: 3488.5
## Max. :1.067e+11 Max. :4524442.0
## Part-Time Payroll (PT_PAY) Part-Time Hours (PT_HRS)
## Min. :0.000e+00 Length :1976
## 1st Qu.:1.419e+05 N.unique : 1
## Median :8.601e+05 N.blank : 0
## Mean :2.884e+07 Min.nchar: 1
## 3rd Qu.:5.330e+06 Max.nchar: 1
## Max. :8.368e+09
## Full-Time Equivalent Employment (FTE)
## Min. : 0
## 1st Qu.: 1083
## Median : 4077
## Mean : 55970
## 3rd Qu.: 15751
## Max. :17527046
## Total Full-Time and Part-Time Employment (TOT_EMP)
## Min. : 0
## 1st Qu.: 1210
## Median : 4816
## Mean : 65713
## 3rd Qu.: 18512
## Max. :20314786
## Total Full-Time and Part-Time Payroll (TOT_PAY)
## Min. :0.000e+00
## 1st Qu.:6.588e+06
## Median :2.443e+07
## Mean :3.613e+08
## 3rd Qu.:1.052e+08
## Max. :1.151e+11
## Full-Time Employment Coefficient of Variation (FT_EMP_CV)
## Min. : 0.000
## 1st Qu.: 0.000
## Median : 1.060
## Mean : 3.433
## 3rd Qu.: 2.922
## Max. :49.730
## Full-Time Payroll Coefficient of Variation (FT_PAY_CV)
## Min. : 0.000
## 1st Qu.: 0.000
## Median : 1.040
## Mean : 3.623
## 3rd Qu.: 3.340
## Max. :77.910
## Part-Time Employment Coefficient of Variation (PT_EMP_CV)
## Min. : 0.00
## 1st Qu.: 0.00
## Median : 1.69
## Mean :10.41
## 3rd Qu.: 5.44
## Max. :99.30
## Part-Time Payroll Coefficient of Variation (PT_PAY_CV)
## Min. : 0.000
## 1st Qu.: 0.000
## Median : 1.850
## Mean : 9.024
## 3rd Qu.: 6.385
## Max. :98.230
## Part-Time Hours Coefficient of Variation (PT_HRS_CV)
## Length :1976
## N.unique : 1
## N.blank : 0
## Min.nchar: 1
## Max.nchar: 1
##
## Full-Time Equivalent Employment Coefficient of Variation (FTE_CV)
## Min. : 0.000
## 1st Qu.: 0.000
## Median : 1.310
## Mean : 5.072
## 3rd Qu.: 5.253
## Max. :143.640
## Total Full-Time and Part-Time Employment Coefficient of Variation (TOT_EMP_CV)
## Length :1976
## N.unique : 780
## N.blank : 0
## Min.nchar: 1
## Max.nchar: 5
##
## Total Full-Time and Part-Time Payroll Coefficient of Variation (TOT_PAY_CV)
## Length :1976
## N.unique : 742
## N.blank : 0
## Min.nchar: 1
## Max.nchar: 5
##
str(my_data)
## spc_tbl_ [1,976 × 20] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
## $ Year (time) : num [1:1976] 2025 2025 2025 2025 2025 ...
## $ Geographic Area Name (NAME) : chr [1:1976] "United States" "United States" "United States" "United States" ...
## $ Meaning of Aggregate Description (AGG_DESC_LABEL) : chr [1:1976] "Total - All Government Employment Functions" "Financial Administration" "Other Government Administration" "Judicial and Legal" ...
## $ Meaning of Type of Government (GOVTYPE_LABEL) : chr [1:1976] "State and Local" "State and Local" "State and Local" "State and Local" ...
## $ Full-Time Employment (FT_EMP) : num [1:1976] 15790344 429784 270830 424793 936007 ...
## $ Full-Time Payroll (FT_PAY) : num [1:1976] 1.07e+11 2.99e+09 1.89e+09 3.16e+09 7.97e+09 ...
## $ Part-Time Employment (PT_EMP) : num [1:1976] 4524442 53004 180646 37611 87506 ...
## $ Part-Time Payroll (PT_PAY) : num [1:1976] 8.37e+09 8.88e+07 1.58e+08 8.79e+07 1.47e+08 ...
## $ Part-Time Hours (PT_HRS) : chr [1:1976] "N" "N" "N" "N" ...
## $ Full-Time Equivalent Employment (FTE) : num [1:1976] 17527046 448891 301610 440423 970667 ...
## $ Total Full-Time and Part-Time Employment (TOT_EMP) : num [1:1976] 20314786 482788 451476 462404 1023513 ...
## $ Total Full-Time and Part-Time Payroll (TOT_PAY) : num [1:1976] 1.15e+11 3.08e+09 2.05e+09 3.25e+09 8.12e+09 ...
## $ Full-Time Employment Coefficient of Variation (FT_EMP_CV) : num [1:1976] 0.38 1.66 2.55 0.65 1.93 2.35 3.09 2.71 3.04 3.35 ...
## $ Full-Time Payroll Coefficient of Variation (FT_PAY_CV) : num [1:1976] 0.34 1.35 3.29 0.96 1.71 1.98 3.2 3.14 3.49 3.47 ...
## $ Part-Time Employment Coefficient of Variation (PT_EMP_CV) : num [1:1976] 0.42 9.59 2.5 1.38 1.87 ...
## $ Part-Time Payroll Coefficient of Variation (PT_PAY_CV) : num [1:1976] 1.42 6.14 8.68 1.77 4.41 ...
## $ Part-Time Hours Coefficient of Variation (PT_HRS_CV) : chr [1:1976] "N" "N" "N" "N" ...
## $ Full-Time Equivalent Employment Coefficient of Variation (FTE_CV) : num [1:1976] 0.36 1.95 2.73 0.64 1.87 2.32 2.85 3.69 4.14 5.3 ...
## $ Total Full-Time and Part-Time Employment Coefficient of Variation (TOT_EMP_CV): chr [1:1976] "0.31" "1.81" "1.83" "0.60" ...
## $ Total Full-Time and Part-Time Payroll Coefficient of Variation (TOT_PAY_CV) : chr [1:1976] "0.33" "1.32" "3.11" "0.94" ...
## - attr(*, "spec")=
## .. cols(
## .. `Year (time)` = col_double(),
## .. `Geographic Area Name (NAME)` = col_character(),
## .. `Meaning of Aggregate Description (AGG_DESC_LABEL)` = col_character(),
## .. `Meaning of Type of Government (GOVTYPE_LABEL)` = col_character(),
## .. `Full-Time Employment (FT_EMP)` = col_number(),
## .. `Full-Time Payroll (FT_PAY)` = col_number(),
## .. `Part-Time Employment (PT_EMP)` = col_number(),
## .. `Part-Time Payroll (PT_PAY)` = col_number(),
## .. `Part-Time Hours (PT_HRS)` = col_character(),
## .. `Full-Time Equivalent Employment (FTE)` = col_number(),
## .. `Total Full-Time and Part-Time Employment (TOT_EMP)` = col_number(),
## .. `Total Full-Time and Part-Time Payroll (TOT_PAY)` = col_number(),
## .. `Full-Time Employment Coefficient of Variation (FT_EMP_CV)` = col_double(),
## .. `Full-Time Payroll Coefficient of Variation (FT_PAY_CV)` = col_double(),
## .. `Part-Time Employment Coefficient of Variation (PT_EMP_CV)` = col_double(),
## .. `Part-Time Payroll Coefficient of Variation (PT_PAY_CV)` = col_double(),
## .. `Part-Time Hours Coefficient of Variation (PT_HRS_CV)` = col_character(),
## .. `Full-Time Equivalent Employment Coefficient of Variation (FTE_CV)` = col_double(),
## .. `Total Full-Time and Part-Time Employment Coefficient of Variation (TOT_EMP_CV)` = col_character(),
## .. `Total Full-Time and Part-Time Payroll Coefficient of Variation (TOT_PAY_CV)` = col_character()
## .. )
## - attr(*, "problems")=<pointer: 0x7f8cb6f67230>
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.2.1 ✔ purrr 1.2.2
## ✔ forcats 1.0.1 ✔ stringr 1.6.0
## ✔ ggplot2 4.0.3 ✔ tibble 3.3.1
## ✔ lubridate 1.9.5 ✔ tidyr 1.3.2
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
my_variables <- my_data %>%
select(`Geographic Area Name (NAME)`,
`Meaning of Aggregate Description (AGG_DESC_LABEL)`,
`Full-Time Employment (FT_EMP)`,
`Total Full-Time and Part-Time Employment (TOT_EMP)`,
`Total Full-Time and Part-Time Payroll (TOT_PAY)`)
names(my_data)
## [1] "Year (time)"
## [2] "Geographic Area Name (NAME)"
## [3] "Meaning of Aggregate Description (AGG_DESC_LABEL)"
## [4] "Meaning of Type of Government (GOVTYPE_LABEL)"
## [5] "Full-Time Employment (FT_EMP)"
## [6] "Full-Time Payroll (FT_PAY)"
## [7] "Part-Time Employment (PT_EMP)"
## [8] "Part-Time Payroll (PT_PAY)"
## [9] "Part-Time Hours (PT_HRS)"
## [10] "Full-Time Equivalent Employment (FTE)"
## [11] "Total Full-Time and Part-Time Employment (TOT_EMP)"
## [12] "Total Full-Time and Part-Time Payroll (TOT_PAY)"
## [13] "Full-Time Employment Coefficient of Variation (FT_EMP_CV)"
## [14] "Full-Time Payroll Coefficient of Variation (FT_PAY_CV)"
## [15] "Part-Time Employment Coefficient of Variation (PT_EMP_CV)"
## [16] "Part-Time Payroll Coefficient of Variation (PT_PAY_CV)"
## [17] "Part-Time Hours Coefficient of Variation (PT_HRS_CV)"
## [18] "Full-Time Equivalent Employment Coefficient of Variation (FTE_CV)"
## [19] "Total Full-Time and Part-Time Employment Coefficient of Variation (TOT_EMP_CV)"
## [20] "Total Full-Time and Part-Time Payroll Coefficient of Variation (TOT_PAY_CV)"
summary(my_variables)
## Geographic Area Name (NAME) Meaning of Aggregate Description (AGG_DESC_LABEL)
## Length :1976 Length :1976
## N.unique : 52 N.unique : 38
## N.blank : 0 N.blank : 0
## Min.nchar: 4 Min.nchar: 6
## Max.nchar: 20 Max.nchar: 50
##
## Full-Time Employment (FT_EMP)
## Min. :0.000e+00
## 1st Qu.:9.642e+02
## Median :3.676e+03
## Mean :4.996e+04
## 3rd Qu.:1.451e+04
## Max. :1.579e+07
## Total Full-Time and Part-Time Employment (TOT_EMP)
## Min. : 0
## 1st Qu.: 1210
## Median : 4816
## Mean : 65713
## 3rd Qu.: 18512
## Max. :20314786
## Total Full-Time and Part-Time Payroll (TOT_PAY)
## Min. :0.000e+00
## 1st Qu.:6.588e+06
## Median :2.443e+07
## Mean :3.613e+08
## 3rd Qu.:1.052e+08
## Max. :1.151e+11
hist(my_variables$`Full-Time Employment (FT_EMP)`)
plot(my_variables$`Full-Time Employment (FT_EMP)`,
my_variables$`Total Full-Time and Part-Time Employment (TOT_EMP)`)
cor(my_variables$`Full-Time Employment (FT_EMP)`,
my_variables$`Total Full-Time and Part-Time Employment (TOT_EMP)`)
## [1] 0.9975601
mean(my_variables$`Full-Time Employment (FT_EMP)`)
## [1] 49955.43
median(my_variables$`Full-Time Employment (FT_EMP)`)
## [1] 3676.5
sd(my_variables$`Full-Time Employment (FT_EMP)`)
## [1] 453099.5
The dataset contains 1,976 observations and 20 variables. The selected variables did not have missing values in the initial summary.
For full-time government employment, the mean was 49,955.43, the median was 3,676.5, and the standard deviation was 453,099.5. The histogram showed that the data were not evenly distributed, with some observations having much higher employment than others.
A correlation was also calculated between full-time employment and total employment. The correlation was 0.998, showing a very strong positive relationship between the two variables.
H1 stated that geographic areas with a higher proportion of full-time government employees would tend to have higher average monthly government payroll per employee.
The correlation between the two variables was 0.277, indicating a positive association between full-time employment proportion and average payroll per employee.
total_government <- my_data %>%
filter(`Meaning of Aggregate Description (AGG_DESC_LABEL)` == "Total - All Government Employment Functions")
total_government$full_time_proportion <-
total_government$`Full-Time Employment (FT_EMP)` /
total_government$`Total Full-Time and Part-Time Employment (TOT_EMP)`
total_government$average_payroll_per_employee <-
total_government$`Total Full-Time and Part-Time Payroll (TOT_PAY)` /
total_government$`Total Full-Time and Part-Time Employment (TOT_EMP)`
sum(is.na(total_government$full_time_proportion))
## [1] 0
plot(total_government$full_time_proportion,
total_government$average_payroll_per_employee)
cor(total_government$full_time_proportion,
total_government$average_payroll_per_employee)
## [1] 0.2770773
unique(my_variables$`Meaning of Aggregate Description (AGG_DESC_LABEL)`)
## [1] "Total - All Government Employment Functions"
## [2] "Financial Administration"
## [3] "Other Government Administration"
## [4] "Judicial and Legal"
## [5] "Police Protection Total"
## [6] "Police Protection - Persons with Power of Arrest"
## [7] "Police Protection - Other"
## [8] "Fire Protection Total"
## [9] "Fire Protection - Firefighters"
## [10] "Fire Protection - Other"
## [11] "Corrections"
## [12] "Highways"
## [13] "Air Transportation"
## [14] "Sea and Inland Port Facilities"
## [15] "Public Welfare"
## [16] "Health"
## [17] "Hospitals"
## [18] "Social Insurance Administration"
## [19] "Solid Waste Management"
## [20] "Sewerage"
## [21] "Parks and Recreation"
## [22] "Housing and Community Development"
## [23] "Natural Resources"
## [24] "Water Supply"
## [25] "Electric Power"
## [26] "Gas Supply"
## [27] "Transit"
## [28] "Education Total"
## [29] "Education - Elementary and Secondary Total"
## [30] "Education - Elementary and Secondary Instructional"
## [31] "Education - Elementary and Secondary Other"
## [32] "Education - Higher Education Total"
## [33] "Education - Higher Education Instructional"
## [34] "Education - Higher Education Other"
## [35] "Education - Other"
## [36] "Libraries"
## [37] "State liquor stores"
## [38] "All other and unallocable"
education <- my_data %>%
filter(`Meaning of Aggregate Description (AGG_DESC_LABEL)` == "Education Total")
police <- my_data %>%
filter(`Meaning of Aggregate Description (AGG_DESC_LABEL)` == "Police Protection Total")
education$education_proportion <-
education$`Total Full-Time and Part-Time Employment (TOT_EMP)` /
total_government$`Total Full-Time and Part-Time Employment (TOT_EMP)`
police$police_proportion <-
police$`Total Full-Time and Part-Time Employment (TOT_EMP)` /
total_government$`Total Full-Time and Part-Time Employment (TOT_EMP)`
plot(education$education_proportion,
police$police_proportion)
cor(education$education_proportion,
police$police_proportion,
use = "complete.obs")
## [1] -0.3521531
The correlation between education employment proportion and police employment proportion was -0.352, indicating a negative association between the two proportions.