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.
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()