Overview

The bueller package provides automated analysis and reporting for assessment participation and chronic absenteeism patterns. Designed for state education agencies, it generates comprehensive reports that help identify student engagement challenges across districts and schools.

Core Function: bueller_report()

The main function generates multi-year trend analysis reports in both HTML and Word formats:

bueller_report(
  data       = your_combined_dataset,
  output_dir = where_your_reports_will_live
)

Parameters

  • data: Combined dataset with test participation and chronic absenteeism data
  • output_dir: Directory where reports will be saved

Required Data Format

The package expects a single combined dataset with the following structure:

Required Columns

Column Name Type Description
COUNTY_ID Integer County identifier
DISTRICT_ID Integer District identifier
SCHOOL_ID Integer School identifier
COUNTY_NAME Character County name
DISTRICT_NAME Character District name
SCHOOL_NAME Character School name
YEAR Integer Academic year (2023 = 2023-24)
SUBJECT Character “ELA” or “MATH”
DISAGGREGATED_GROUP Character Student group (e.g., “All_Students”, “Hispanic”, “English_Learners”)
PARTICIPATION_RATE Numeric Assessment participation rate (0-100)
CHRONIC_ABSENT_RATE Numeric Chronic absenteeism rate (0-100)
STUDENTS_ENROLLED Integer Number of students enrolled

Data Structure Requirements

Multi-Year Data: Each row represents a unique combination of school-year-subject-student group. The package analyzes trends across years, so multiple years of data are essential.

Subject Coverage: Include both ELA and MATH data. Each school-year-student group combination should have separate rows for ELA and MATH.

Student Groups: Include “All_Students” as well as disaggregated groups. The “All_Students” group serves as the baseline for gap analysis.

Example Data Structure

# Example of properly formatted data
sample_data <- data.frame(
  COUNTY_ID = c("01", "01", "01", "01"),
  DISTRICT_ID = c("001", "001", "001", "001"),
  SCHOOL_ID = c("0001", "0001", "0001", "0001"),
  COUNTY_NAME = c("Alameda", "Alameda", "Alameda", "Alameda"),
  DISTRICT_NAME = c("Oakland Unified", "Oakland Unified", "Oakland Unified", "Oakland Unified"),
  SCHOOL_NAME = c("Lincoln Elementary", "Lincoln Elementary", "Lincoln Elementary", "Lincoln Elementary"),
  YEAR = c(2023, 2023, 2023, 2023),
  SUBJECT = c("ELA", "MATH", "ELA", "MATH"),
  DISAGGREGATED_GROUP = c("All_Students", "All_Students", "Hispanic", "Hispanic"),
  PARTICIPATION_RATE = c(94.5, 93.2, 89.1, 88.7),
  CHRONIC_ABSENT_RATE = c(18.3, 18.3, 22.1, 22.1),
  STUDENTS_ENROLLED = c(245, 245, 156, 156)
)

Data Quality Checks

Before running bueller_report():

# Check required columns
required_cols <- c("COUNTY_ID", "DISTRICT_ID", "SCHOOL_ID", "COUNTY_NAME", 
                   "DISTRICT_NAME", "SCHOOL_NAME", "YEAR", "SUBJECT", 
                   "DISAGGREGATED_GROUP", "PARTICIPATION_RATE", 
                   "CHRONIC_ABSENT_RATE", "STUDENTS_ENROLLED")
missing_cols <- required_cols[!required_cols %in% names(your_data)]
if(length(missing_cols) > 0) {
  stop("Missing required columns: ", paste(missing_cols, collapse = ", "))
}

# Check data ranges
summary(your_data[c("PARTICIPATION_RATE", "CHRONIC_ABSENT_RATE")])

# Check for required student group
if(!"All_Students" %in% your_data$DISAGGREGATED_GROUP) {
  warning("All_Students group not found - gap analysis may not work properly")
}

Report Output

The function generates:

  1. HTML Report: Interactive report with embedded tables and visualizations
  2. Word Document: Formatted report suitable for printing and sharing
  3. Analysis Focus:
    • Multi-year trends in participation and absenteeism
    • School-level variation analysis within districts
    • Student group gap analysis
    • Federal compliance tracking (95% participation threshold)

Getting Started

# Install the package (if not already installed)
devtools::install_github("erwx/bueller")

# Load the package
library(bueller)

# Generate your report
bueller_report(
  data = your_prepared_data,
  output_dir = "engagement_reports/"
)