Skip to contents

This 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)

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: 234

Story 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)

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

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)

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

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)

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)

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