Arkansas School Data: 15 Insights from District ADA
Source:vignettes/enrollment_hooks.Rmd
enrollment_hooks.RmdThis vignette explores Arkansas school district data through 15 data stories using Average Daily Attendance (ADA) from the Annual Statistical Reports.
Data Overview
The package provides access to Arkansas school district data from the Arkansas Division of Elementary and Secondary Education (DESE) Annual Statistical Reports.
years_info <- get_available_years()
cat("Available years:", paste(years_info$available_years, collapse = ", "), "\n")
#> Available years: 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025, 2026
cat("Gap years (not available):", paste(years_info$gap_years, collapse = ", "), "\n")
#> Gap years (not available):Story 1: Springdale is now Arkansas’s largest district
Springdale Public Schools has overtaken Little Rock to become the state’s largest school district by Average Daily Attendance.
enr_2024 <- fetch_enr(2024, use_cache = TRUE)
# Clean data - skip header rows, filter by valid district ID
enr_clean <- enr_2024[3:nrow(enr_2024), ] %>%
rename(district_name = `1`, district_id = `2`, ada = `2_ada`) %>%
mutate(ada = as.numeric(gsub(",", "", ada))) %>%
filter(!is.na(district_name), !is.na(ada), ada > 0, district_name != "Totals") %>%
arrange(desc(ada))
stopifnot(nrow(enr_clean) > 0)
top_10 <- head(enr_clean %>% select(district_name, ada), 10)
print(top_10)
#> # A tibble: 10 × 2
#> district_name ada
#> <chr> <dbl>
#> 1 SPRINGDALE SCHOOL DISTRICT 20313.
#> 2 BENTONVILLE SCHOOL DISTRICT 17929.
#> 3 LITTLE ROCK SCHOOL DISTRICT 17582.
#> 4 ROGERS SCHOOL DISTRICT 14333.
#> 5 FORT SMITH SCHOOL DISTRICT 12404.
#> 6 PULASKI COUNTY SPECIAL SCHOOL DISTRICT 10726.
#> 7 CABOT SCHOOL DISTRICT 9485.
#> 8 FAYETTEVILLE SCHOOL DISTRICT 9377.
#> 9 CONWAY SCHOOL DISTRICT 9214.
#> 10 BRYANT SCHOOL DISTRICT 9027.
stopifnot(nrow(top_10) == 10)
print(summary(top_10$ada))
#> Min. 1st Qu. Median Mean 3rd Qu. Max.
#> 9027 9404 11565 13039 16770 20313
ggplot(top_10, aes(x = reorder(district_name, ada), y = ada / 1000)) +
geom_col(fill = "steelblue") +
coord_flip() +
labs(title = "Top 10 Arkansas Districts by Average Daily Attendance (2024)",
x = NULL, y = "ADA (thousands)") +
theme_minimal()
Top 10 Arkansas districts by ADA (2024)
Story 2: Arkansas has 414,600 students across 234 districts
Arkansas has approximately 414,600 students in Average Daily Attendance across 234 school districts.
state_total <- sum(enr_clean$ada, na.rm = TRUE)
n_districts <- nrow(enr_clean)
cat("State ADA total:", format(round(state_total), big.mark = ","), "\n")
#> State ADA total: 414,634
cat("Number of districts:", n_districts, "\n")
#> Number of districts: 234Story 3: Northwest Arkansas districts dominate growth
The four largest NWA districts (Springdale, Bentonville, Rogers, Fayetteville) account for nearly 62,000 students combined – 15% of the state from four districts.
nwa_districts <- enr_clean %>%
filter(grepl("SPRINGDALE|BENTONVILLE|ROGERS|FAYETTEVILLE", district_name)) %>%
select(district_name, ada)
stopifnot(nrow(nwa_districts) > 0)
print(nwa_districts)
#> # A tibble: 4 × 2
#> district_name ada
#> <chr> <dbl>
#> 1 SPRINGDALE SCHOOL DISTRICT 20313.
#> 2 BENTONVILLE SCHOOL DISTRICT 17929.
#> 3 ROGERS SCHOOL DISTRICT 14333.
#> 4 FAYETTEVILLE SCHOOL DISTRICT 9377.
cat("\nNWA Combined ADA:", format(round(sum(nwa_districts$ada)), big.mark = ","), "\n")
#>
#> NWA Combined ADA: 61,953
cat("Share of state:", round(sum(nwa_districts$ada) / state_total * 100, 1), "%\n")
#> Share of state: 14.9 %
stopifnot(nrow(nwa_districts) > 0)
print(summary(nwa_districts$ada))
#> Min. 1st Qu. Median Mean 3rd Qu. Max.
#> 9377 13094 16131 15488 18525 20313
ggplot(nwa_districts, aes(x = reorder(district_name, ada), y = ada / 1000)) +
geom_col(fill = "darkorange") +
coord_flip() +
labs(title = "Northwest Arkansas Districts by ADA (2024)",
x = NULL, y = "ADA (thousands)") +
theme_minimal()
NWA districts by ADA (2024)
Story 4: Bentonville has grown 27% in a decade
Bentonville’s ADA has grown from 14,100 to 17,900 since 2013, fueled by corporate relocations and the Walmart economy.
# Fetch multi-year data
enr_multi <- fetch_enr_multi(c(2013, 2024), use_cache = TRUE)
# 2013 uses "actual_amount" for district name; 2024 uses "1"
# Create unified district_name column
enr_multi <- enr_multi %>%
mutate(district_name = coalesce(actual_amount, `1`))
get_ada <- function(df, year) {
df %>%
filter(end_year == year) %>%
mutate(ada = as.numeric(gsub(",", "", `2_ada`))) %>%
filter(!is.na(district_name), !is.na(ada), ada > 0,
!grepl("^Totals$|^DISTRICT$", district_name))
}
enr_2013 <- get_ada(enr_multi, 2013)
enr_2024_v2 <- get_ada(enr_multi, 2024)
bentonville_2013 <- enr_2013 %>% filter(grepl("BENTONVILLE", district_name)) %>% pull(ada)
bentonville_2024 <- enr_2024_v2 %>% filter(grepl("BENTONVILLE", district_name)) %>% pull(ada)
stopifnot(length(bentonville_2013) == 1, length(bentonville_2024) == 1)
cat("Bentonville ADA 2013:", format(round(bentonville_2013), big.mark = ","), "\n")
#> Bentonville ADA 2013: 14,128
cat("Bentonville ADA 2024:", format(round(bentonville_2024), big.mark = ","), "\n")
#> Bentonville ADA 2024: 17,929
cat("Growth:", round((bentonville_2024 / bentonville_2013 - 1) * 100, 1), "%\n")
#> Growth: 26.9 %Story 5: 57% of districts have fewer than 1,000 students
More than half of Arkansas’s 234 districts serve fewer than 1,000 students, but they account for only 19% of the state’s ADA. Meanwhile, just 6 districts with 10,000+ students serve 22% of all students.
size_breakdown <- enr_clean %>%
mutate(size_category = case_when(
ada < 500 ~ "Under 500",
ada < 1000 ~ "500-999",
ada < 5000 ~ "1,000-4,999",
ada < 10000 ~ "5,000-9,999",
TRUE ~ "10,000+"
)) %>%
group_by(size_category) %>%
summarize(n_districts = n(), total_ada = sum(ada)) %>%
arrange(match(size_category, c("Under 500", "500-999", "1,000-4,999", "5,000-9,999", "10,000+")))
stopifnot(nrow(size_breakdown) > 0)
print(size_breakdown)
#> # A tibble: 5 × 3
#> size_category n_districts total_ada
#> <chr> <int> <dbl>
#> 1 Under 500 47 18211.
#> 2 500-999 86 60555.
#> 3 1,000-4,999 86 177499.
#> 4 5,000-9,999 9 65081.
#> 5 10,000+ 6 93288.
stopifnot(nrow(size_breakdown) > 0)
print(summary(size_breakdown$n_districts))
#> Min. 1st Qu. Median Mean 3rd Qu. Max.
#> 6.0 9.0 47.0 46.8 86.0 86.0
ggplot(size_breakdown, aes(x = size_category, y = n_districts)) +
geom_col(fill = "darkgreen") +
labs(title = "Arkansas District Size Distribution (2024)",
x = "ADA Range", y = "Number of Districts") +
theme_minimal()
District size distribution
Story 6: The smallest district has just 203 students
Marvell-Elaine School District, in the Mississippi Delta, is Arkansas’s smallest with about 203 students in ADA.
smallest <- enr_clean %>%
filter(ada > 0) %>%
arrange(ada) %>%
head(10) %>%
select(district_name, ada)
stopifnot(nrow(smallest) == 10)
print(smallest)
#> # A tibble: 10 × 2
#> district_name ada
#> <chr> <dbl>
#> 1 MARVELL-ELAINE SCHOOL DISTRICT 203.
#> 2 WESTERN YELL CO. SCHOOL DIST. 260.
#> 3 DERMOTT SCHOOL DISTRICT 268.
#> 4 STRONG-HUTTIG SCHOOL DISTRICT 292.
#> 5 SHIRLEY SCHOOL DISTRICT 299.
#> 6 GUY-PERKINS SCHOOL DISTRICT 300.
#> 7 AUGUSTA SCHOOL DISTRICT 307.
#> 8 LEAD HILL SCHOOL DISTRICT 319.
#> 9 DEER/MT. JUDEA SCHOOL DISTRICT 321.
#> 10 CALICO ROCK SCHOOL DISTRICT 334.Story 7: Little Rock is Pulaski County’s largest district
Despite losing the top spot statewide, Little Rock remains the largest single district in Pulaski County – but the other three Pulaski County districts combined (21,303 ADA) now exceed Little Rock (17,582).
pulaski <- enr_clean %>%
filter(grepl("LITTLE ROCK|PULASKI|JACKSONVILLE", district_name)) %>%
select(district_name, ada) %>%
arrange(desc(ada))
stopifnot(nrow(pulaski) > 0)
print(pulaski)
#> # A tibble: 4 × 2
#> district_name ada
#> <chr> <dbl>
#> 1 LITTLE ROCK SCHOOL DISTRICT 17582.
#> 2 PULASKI COUNTY SPECIAL SCHOOL DISTRICT 10726.
#> 3 N. LITTLE ROCK SCHOOL DISTRICT 6671.
#> 4 JACKSONVILLE NORTH PULASKI SCHOOL DISTRICT 3906.
stopifnot(nrow(pulaski) > 0)
print(summary(pulaski$ada))
#> Min. 1st Qu. Median Mean 3rd Qu. Max.
#> 3906 5980 8699 9721 12440 17582
ggplot(pulaski, aes(x = reorder(district_name, ada), y = ada / 1000)) +
geom_col(fill = "firebrick") +
coord_flip() +
labs(title = "Pulaski County Districts by ADA (2024)",
x = NULL, y = "ADA (thousands)") +
theme_minimal()
Pulaski County districts by ADA (2024)
Story 8: State ADA peaked in 2020, then dropped 5% post-COVID
Arkansas’s total ADA hit 436,116 in 2020, then fell sharply to 421,997 in 2021 – a one-year drop of 14,000 students. By 2024, the state had not recovered.
years_to_check <- c(2018, 2019, 2020, 2021, 2022, 2023, 2024)
enr_years <- fetch_enr_multi(years_to_check, use_cache = TRUE)
# Filter out header and Totals rows using district ID
ada_by_year <- enr_years %>%
filter(!is.na(`2`), grepl("^[0-9]", `2`)) %>%
mutate(ada = as.numeric(gsub(",", "", `2_ada`))) %>%
filter(!is.na(ada)) %>%
group_by(end_year) %>%
summarize(total_ada = round(sum(ada, na.rm = TRUE))) %>%
arrange(end_year)
stopifnot(nrow(ada_by_year) == 7)
print(ada_by_year)
#> # A tibble: 7 × 2
#> end_year total_ada
#> <dbl> <dbl>
#> 1 2018 432503
#> 2 2019 430705
#> 3 2020 436116
#> 4 2021 421997
#> 5 2022 414984
#> 6 2023 416836
#> 7 2024 414634
stopifnot(nrow(ada_by_year) > 0)
print(summary(ada_by_year$total_ada))
#> Min. 1st Qu. Median Mean 3rd Qu. Max.
#> 414634 415910 421997 423968 431604 436116
ggplot(ada_by_year, aes(x = end_year, y = total_ada / 1000)) +
geom_line(color = "steelblue", linewidth = 1.2) +
geom_point(color = "steelblue", size = 3) +
geom_vline(xintercept = 2020.5, linetype = "dashed", color = "red", alpha = 0.5) +
annotate("text", x = 2020.7, y = 438, label = "COVID", color = "red", hjust = 0, size = 3) +
labs(title = "Arkansas State ADA Trend (2018-2024)",
x = "School Year End", y = "ADA (thousands)") +
theme_minimal() +
scale_y_continuous(limits = c(400, 450))
State ADA trend with COVID annotation
Story 9: Fort Smith leads the River Valley
Fort Smith School District is the largest in western Arkansas outside NWA, more than double the next-largest River Valley district.
western <- enr_clean %>%
filter(grepl("FORT SMITH|VAN BUREN|GREENWOOD|ALMA", district_name)) %>%
select(district_name, ada) %>%
arrange(desc(ada))
stopifnot(nrow(western) > 0)
print(western)
#> # A tibble: 4 × 2
#> district_name ada
#> <chr> <dbl>
#> 1 FORT SMITH SCHOOL DISTRICT 12404.
#> 2 VAN BUREN SCHOOL DISTRICT 5213.
#> 3 GREENWOOD SCHOOL DISTRICT 3655.
#> 4 ALMA SCHOOL DISTRICT 2990.
stopifnot(nrow(western) > 0)
print(summary(western$ada))
#> Min. 1st Qu. Median Mean 3rd Qu. Max.
#> 2990 3488 4434 6065 7011 12404
ggplot(western, aes(x = reorder(district_name, ada), y = ada / 1000)) +
geom_col(fill = "purple4") +
coord_flip() +
labs(title = "River Valley Districts by ADA (2024)",
x = NULL, y = "ADA (thousands)") +
theme_minimal()
River Valley districts by ADA (2024)
Story 10: Cabot is the largest district in the ring suburbs
Cabot leads the suburban ring around Little Rock in ADA, narrowly edging out Conway and Bryant.
suburbs <- enr_clean %>%
filter(district_name %in% c(
"CABOT SCHOOL DISTRICT",
"CONWAY SCHOOL DISTRICT",
"BRYANT SCHOOL DISTRICT",
"BENTON SCHOOL DISTRICT",
"SHERIDAN SCHOOL DISTRICT",
"LONOKE SCHOOL DISTRICT"
)) %>%
select(district_name, ada) %>%
arrange(desc(ada))
stopifnot(nrow(suburbs) > 0)
print(suburbs)
#> # A tibble: 6 × 2
#> district_name ada
#> <chr> <dbl>
#> 1 CABOT SCHOOL DISTRICT 9485.
#> 2 CONWAY SCHOOL DISTRICT 9214.
#> 3 BRYANT SCHOOL DISTRICT 9027.
#> 4 BENTON SCHOOL DISTRICT 5335.
#> 5 SHERIDAN SCHOOL DISTRICT 3908.
#> 6 LONOKE SCHOOL DISTRICT 1488.
stopifnot(nrow(suburbs) > 0)
print(summary(suburbs$ada))
#> Min. 1st Qu. Median Mean 3rd Qu. Max.
#> 1488 4265 7181 6410 9167 9485
ggplot(suburbs, aes(x = reorder(district_name, ada), y = ada / 1000)) +
geom_col(fill = "forestgreen") +
coord_flip() +
labs(title = "Little Rock Suburban Ring Districts by ADA (2024)",
x = NULL, y = "ADA (thousands)") +
theme_minimal()
Little Rock suburban ring districts by ADA (2024)
Story 11: The Delta has multiple small districts
Mississippi Delta districts in eastern Arkansas tend to be smaller due to decades of population decline. Lee County has just 596 students in ADA.
delta <- enr_clean %>%
filter(grepl("HELENA|LEE COUNTY|FORREST CITY", district_name)) %>%
select(district_name, ada) %>%
arrange(ada)
stopifnot(nrow(delta) > 0)
print(delta)
#> # A tibble: 3 × 2
#> district_name ada
#> <chr> <dbl>
#> 1 LEE COUNTY SCHOOL DISTRICT 596.
#> 2 HELENA/ W.HELENA SCHOOL DIST. 860.
#> 3 FORREST CITY SCHOOL DISTRICT 1826.Story 12: Top 20 districts educate 43% of the state
The largest 20 districts by ADA account for 43% of all students – but that is only 20 out of 234 districts.
top_20 <- enr_clean %>%
head(20)
stopifnot(nrow(top_20) == 20)
cat("Top 20 districts ADA:", format(round(sum(top_20$ada)), big.mark = ","), "\n")
#> Top 20 districts ADA: 178,020
cat("Percent of state:", round(sum(top_20$ada) / state_total * 100, 1), "%\n")
#> Percent of state: 42.9 %Story 13: Jonesboro anchors northern Arkansas
Jonesboro is the largest district in the northern half of the state, followed by Mountain Home and Batesville in the Ozarks.
ozarks <- enr_clean %>%
filter(grepl("MOUNTAIN HOME|HARRISON|BATESVILLE|JONESBORO|PARAGOULD", district_name)) %>%
select(district_name, ada) %>%
arrange(desc(ada))
stopifnot(nrow(ozarks) > 0)
print(ozarks)
#> # A tibble: 5 × 2
#> district_name ada
#> <chr> <dbl>
#> 1 JONESBORO SCHOOL DISTRICT 5741.
#> 2 MOUNTAIN HOME SCHOOL DISTRICT 3530.
#> 3 BATESVILLE SCHOOL DISTRICT 2916.
#> 4 PARAGOULD SCHOOL DISTRICT 2708.
#> 5 HARRISON SCHOOL DISTRICT 2567.Story 14: Nettleton leads Paragould in northeast Arkansas
After Jonesboro, Nettleton (3,433 ADA) leads the next tier of northeast Arkansas districts, with Paragould (2,708) close behind.
northeast <- enr_clean %>%
filter(grepl("JONESBORO|PARAGOULD|POCAHONTAS|TRUMANN|NETTLETON", district_name)) %>%
select(district_name, ada) %>%
arrange(desc(ada))
stopifnot(nrow(northeast) > 0)
print(northeast)
#> # A tibble: 5 × 2
#> district_name ada
#> <chr> <dbl>
#> 1 JONESBORO SCHOOL DISTRICT 5741.
#> 2 NETTLETON SCHOOL DISTRICT 3433.
#> 3 PARAGOULD SCHOOL DISTRICT 2708.
#> 4 POCAHONTAS SCHOOL DISTRICT 1723.
#> 5 TRUMANN SCHOOL DISTRICT 1346.Story 15: Educational Service Cooperatives support small districts
Arkansas has Educational Service Cooperatives (ESCs) that support small rural districts with shared services. They do not appear in this ADA data because they do not directly serve students.
coops <- enr_2024[3:nrow(enr_2024), ] %>%
rename(district_name = `1`, ada = `2_ada`) %>%
mutate(ada = as.numeric(gsub(",", "", ada))) %>%
filter(grepl("COOP|COOPERATIVE|SERVICE", district_name, ignore.case = TRUE)) %>%
select(district_name, ada)
if(nrow(coops) > 0) {
print(coops)
} else {
cat("ESCs are not included in this enrollment data.\n")
}
#> ESCs are not included in this enrollment data.Data Notes
This package provides data from the Arkansas Division of Elementary and Secondary Education (DESE) Annual Statistical Reports:
- Data source: Annual Statistical Reports
- Available years: 2006, 2013-2024 (gap: 2007-2012)
- Key metric: Average Daily Attendance (ADA)
- Coverage: ~234 school districts
- Limitations: This data provides ADA and fiscal information. For enrollment demographics by race/ethnicity, visit the ADE Data Center
Session Info
sessionInfo()
#> R version 4.5.2 (2025-10-31)
#> Platform: x86_64-pc-linux-gnu
#> Running under: Ubuntu 24.04.3 LTS
#>
#> Matrix products: default
#> BLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3
#> LAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.26.so; LAPACK version 3.12.0
#>
#> locale:
#> [1] LC_CTYPE=C.UTF-8 LC_NUMERIC=C LC_TIME=C.UTF-8
#> [4] LC_COLLATE=C.UTF-8 LC_MONETARY=C.UTF-8 LC_MESSAGES=C.UTF-8
#> [7] LC_PAPER=C.UTF-8 LC_NAME=C LC_ADDRESS=C
#> [10] LC_TELEPHONE=C LC_MEASUREMENT=C.UTF-8 LC_IDENTIFICATION=C
#>
#> time zone: UTC
#> tzcode source: system (glibc)
#>
#> attached base packages:
#> [1] stats graphics grDevices utils datasets methods base
#>
#> other attached packages:
#> [1] ggplot2_4.0.2 dplyr_1.2.0 arschooldata_0.1.0
#>
#> loaded via a namespace (and not attached):
#> [1] gtable_0.3.6 jsonlite_2.0.0 compiler_4.5.2 tidyselect_1.2.1
#> [5] jquerylib_0.1.4 systemfonts_1.3.2 scales_1.4.0 textshaping_1.0.5
#> [9] readxl_1.4.5 yaml_2.3.12 fastmap_1.2.0 R6_2.6.1
#> [13] labeling_0.4.3 generics_0.1.4 curl_7.0.0 knitr_1.51
#> [17] tibble_3.3.1 desc_1.4.3 bslib_0.10.0 pillar_1.11.1
#> [21] RColorBrewer_1.1-3 rlang_1.1.7 utf8_1.2.6 cachem_1.1.0
#> [25] xfun_0.56 fs_1.6.7 sass_0.4.10 S7_0.2.1
#> [29] cli_3.6.5 pkgdown_2.2.0 withr_3.0.2 magrittr_2.0.4
#> [33] digest_0.6.39 grid_4.5.2 rappdirs_0.3.4 lifecycle_1.0.5
#> [37] vctrs_0.7.1 evaluate_1.0.5 glue_1.8.0 cellranger_1.1.0
#> [41] farver_2.1.2 codetools_0.2-20 ragg_1.5.1 purrr_1.2.1
#> [45] httr_1.4.8 rmarkdown_2.30 tools_4.5.2 pkgconfig_2.0.3
#> [49] htmltools_0.5.9