Introduction

This report investigates whether same-day registration (SDR) in the 2020 election increased voter turnout in subsequent elections (specifically 2024). This analysis focuses on North Carolina, where SDR has been implemented to remove barriers to voter participation. I hypothesize that voters who registered on the same day in 2020 are more likely to participate in future elections due to reduced registration obstacles and because people who vote in one election are more likely to participate in future elections.

Data Overview

This analysis uses two key datasets from the North Carolina State Board of Elections to examine the relationship between same-day registration (SDR) and voter turnout in 2020 and subsequent elections.

North Carolina Voter Registration Files (2020, 2024): These files contain voter information by county, including the date of the election, party affiliation, race, ethnicity, sex, age group, and total number of voters in each precinct. For example, the dataset includes records for voters from counties such as Iredell, Guilford, and Wake, detailing demographics such as age groups (e.g., “Age 41 - 65”) and voter participation data. The columns also include precinct and election-specific identifiers that allow for cross-referencing voter behavior across various regions and elections.

Provisional Voter Registration Data (2020): This dataset tracks whether voters were registered at the time they voted, providing insight into whether they used same-day registration in the 2020 election. This allows us to identify voters who registered on the same day they cast their ballot and see how that affected their subsequent voting behavior.

# Summarize total voters by party for each year
turnout_by_party <- combined_data %>%
  group_by(election_date, party_cd) %>%
  summarize(total_voters = sum(total_voters, na.rm = TRUE), .groups = 'drop')

# View the summarized data
print(turnout_by_party)
## # A tibble: 15 × 3
##    election_date party_cd total_voters
##    <date>        <chr>           <int>
##  1 2020-11-03    CST              4684
##  2 2020-11-03    DEM           2629237
##  3 2020-11-03    GRE              3651
##  4 2020-11-03    LIB             46547
##  5 2020-11-03    REP           2236582
##  6 2020-11-03    UNA           2457886
##  7 2024-11-05    CST               554
##  8 2024-11-05    DEM           2457532
##  9 2024-11-05    GRE              3654
## 10 2024-11-05    JFA               511
## 11 2024-11-05    LIB             49940
## 12 2024-11-05    NLB             25384
## 13 2024-11-05    REP           2350382
## 14 2024-11-05    UNA           2965094
## 15 2024-11-05    WTP              1413
# Load necessary library for plotting
library(ggplot2)

# Bar plot for total voters by party
ggplot(turnout_by_party, aes(x = party_cd, y = total_voters, fill = as.factor(election_date))) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(title = "Voter Turnout by Party in 2020 and 2024", x = "Party", y = "Total Voters") +
  theme_minimal()

# Bar plot of voter turnout by party
ggplot(combined_data, aes(x = party_cd, y = total_voters, fill = party_cd)) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(title = "Voter Turnout by Party",
       x = "Party",
       y = "Total Voters") +
  theme_minimal()

# Box plot of voter turnout by age group
ggplot(combined_data, aes(x = age, y = total_voters, fill = age)) +
  geom_boxplot() +
  labs(title = "Voter Turnout by Age Group",
       x = "Age Group",
       y = "Total Voters") +
  theme_minimal()

# Scatter plot of voter turnout vs age
ggplot(combined_data, aes(x = age, y = total_voters)) +
  geom_point(aes(color = party_cd)) +
  labs(title = "Voter Turnout vs. Age",
       x = "Age",
       y = "Total Voters") +
  theme_minimal()

# Heatmap of voter turnout by county and party
ggplot(combined_data, aes(x = county_desc, y = party_cd, fill = total_voters)) +
  geom_tile() +
  labs(title = "Heatmap of Voter Turnout by County and Party",
       x = "County",
       y = "Party",
       fill = "Total Voters") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 90, hjust = 1))

# Stacked bar plot of voter turnout by party and election date
ggplot(combined_data, aes(x = election_date, y = total_voters, fill = party_cd)) +
  geom_bar(stat = "identity") +
  labs(title = "Voter Turnout by Party and Election Date",
       x = "Election Date",
       y = "Total Voters") +
  theme_minimal() +
  scale_x_date(date_labels = "%b %Y", date_breaks = "1 year")

# Facet grid of voter turnout by party and age group
ggplot(combined_data, aes(x = party_cd, y = total_voters)) +
  geom_bar(stat = "identity", position = "dodge") +
  facet_grid(~ age) +
  labs(title = "Voter Turnout by Party and Age Group",
       x = "Party",
       y = "Total Voters") +
  theme_minimal()