Library Event Attendance and Performance Analysis

Author

Andrew Ledet

Published

September 5, 2025

Show code
# Load required libraries
library(tidyverse)
library(janitor)
library(lubridate)
library(kableExtra)
library(viridis)
library(DT)

# Load and prepare the data
event_data <- read_csv("event_data_with_analysis.csv", 
                       col_types = cols(), 
                       na = c("", "NA", "N/A")) %>%
  clean_names() %>%
  mutate(
    # Parse event dates and times
    event_start_time = ymd_hms(event_start_time),
    event_date = as.Date(event_start_time),
    event_year = year(event_date),
    event_month = month(event_date),
    event_day_of_week = wday(event_date, label = TRUE),
    event_hour_decimal = hour(event_start_time) + minute(event_start_time) / 60,
    
    # Filter out children/youth events and cancelled events
    is_valid_event = 
      !str_detect(tolower(event_title %||% ""), "child|kid|family|youth") &
      !str_detect(tolower(event_subjects %||% ""), "child|kid|family|youth") &
      !str_detect(tolower(event_title %||% ""), "cancel") &
      !is.na(event_date) &
      !is.na(actual_registrations) & 
      actual_registrations > 0 &
      hour(event_start_time) >= 9  # Remove pre-opening events
  ) %>%
  filter(is_valid_event)

[Previous code remains the same…]

Detailed Event Data Tables

Show code
# Prepare detailed data table
detailed_events_table <- event_data %>%
  group_by(event_day_of_week, event_hour = floor(event_hour_decimal), event_subjects) %>%
  summarise(
    avg_registrations = round(mean(actual_registrations, na.rm = TRUE), 2),
    total_events = n(),
    .groups = "drop"
  ) %>%
  arrange(desc(total_events))

# Create interactive data table
datatable(detailed_events_table, 
          filter = 'top', 
          options = list(
            pageLength = 10, 
            autoWidth = TRUE,
            scrollX = TRUE
          ),
          caption = "Detailed Event Registration Data")
Show code
# Prepare room-specific data table
room_events_table <- event_data %>%
  group_by(event_room_name, event_day_of_week, event_hour = floor(event_hour_decimal)) %>%
  summarise(
    avg_registrations = round(mean(actual_registrations, na.rm = TRUE), 2),
    total_events = n(),
    .groups = "drop"
  ) %>%
  arrange(desc(total_events))

# Create interactive room data table
datatable(room_events_table, 
          filter = 'top', 
          options = list(
            pageLength = 10, 
            autoWidth = TRUE,
            scrollX = TRUE
          ),
          caption = "Room-Specific Event Registration Data")