For this project, I want to focus specifically on the voting behaviors of South Asian-American voters. South Asian Americans are not a commonly studied population, with focus often going to other demographic groups, or lumping South Asians into the greater Asian-American population. But over the past couple of decades, there has been a steady rise in immigration from South Asia, specifically India, which makes them an interesting population to study. Though South Asians make up a small percentage of the American population, as the rates of immigration from South Asia continue to rise over time, I feel as though this population is one that is important to understand.
In addition, there has been a shift in South-Asian Republicans on a national level, with the introduction of politicians into the GOP like Vivek Ramaswamy. I wanted to investigate if this trend can be found in the general South Asian community in Florida as well, and if there are changes in the voting trends of the ‘model minority’
basic_plot <- ggplot(south_asians, aes(x = PartyAffiliation, fill = PartyAffiliation)) +
geom_bar(width = 0.7) +
scale_fill_manual(values = party_colors) +
labs(
title = "Distribution of Party Affiliation Among Floridan South Asian voters",
x = "Political Party",
y = "Number of Voters"
) +
theme_minimal() +
theme(legend.position = "none")
basic_plot + scale_x_discrete(limits = c("DEM", "REP", "NPA"))
South Asians tend to be either non party affiliated or affiliated with the Democratic party, with a minority affiliated with the Republican party.
country_counts <- south_asians |>
mutate(cleaned_country = str_to_title(cleaned_country)) |>
count(cleaned_country) |>
mutate(percentage = (n/sum(n)) * 100)
south_asia_map <- map_data("world") |>
filter(region %in% c("Bangladesh", "India", "Nepal", "Pakistan", "Sri Lanka"))
map_data <- left_join(south_asia_map, country_counts, by = c("region" = "cleaned_country"))
ggplot(map_data, aes(x = long, y = lat, group = group)) +
geom_polygon(aes(fill = percentage)) + # n is the count column created by count()
scale_fill_gradient(low = "lightblue", high = "darkblue", name = "Percentage (%)") +
labs(title = "Distribution of Voter Origins Across South Asia",
fill = "Number of People") +
theme_minimal() +
coord_fixed()
The majority of South Asian voters tend to be from India and Pakistan, with less people from Bangladesh, Nepal, and Sri Lanka.
party_by_country <- south_asians %>%
count(cleaned_country, PartyAffiliation) %>%
group_by(cleaned_country) %>%
mutate(percentage = n/sum(n) * 100)
ggplot(party_by_country, aes(x = cleaned_country, y = percentage, fill = PartyAffiliation)) +
geom_bar(stat = "identity", position = "dodge") +
scale_fill_manual(values = c("DEM" = "blue",
"REP" = "red",
"NPA" = "grey",
"OTHER" = "purple"))+
labs(title = "Political Party Affiliation by Country of Origin",
x = "Country",
y = "Percentage",
fill = "Party") +
theme_minimal()
There are some differences in party affiliation by country of birth but most differences are fairly small. Most notably, Bangladeshis and Pakistanis have a higher rate of Democratic affiliation compared to other countries, and Sri Lankans and Indians have the highest rates of Republican affiliation.
white_sa <- south_asians |>
filter(Race == 'White')
basic_plot8 <- ggplot(white_sa, aes(x = PartyAffiliation, fill = PartyAffiliation)) +
geom_bar(width = 0.7) +
scale_fill_manual(values = party_colors) +
labs(
title = "Distribution of Party Affiliation Among 'White' South Asian voters",
x = "Political Party",
y = "Number of Voters"
) +
theme_minimal() +
theme(legend.position = "none")
basic_plot8 + scale_x_discrete(limits = c("DEM", "REP", "NPA"))
Since there is no “South Asian” or “Asian” option on the Florida voter registration form, the race that a person chooses provides insight into their perceived racial identity. When looking at the distribution of party affiliation among South Asians who identified as “White”, there seems to be an increase in Republican party affiliation.
Where do South Asians live in the state of Florida? Using the American Community 5-Year survey, we can look at populations of South Asian communities in Florida
fl_wider <- fl |>
dplyr::select(-moe) |>
pivot_wider(names_from = variable, values_from = estimate) |>
mutate(
south_asian_total = asian_indian + bangladeshi + pakistani + sri_lankan + bhutanese + nepalese + sikh + other_sa)
fl_wider |>
ggplot(aes(fill = south_asian_total)) +
geom_sf(color = NA) +
scale_fill_viridis_c(option = "viridis") +
labs(title = "South Asian Populations Across Florida",
fill = "Number of South Asians")
South Asians make up a small percentage of the Floridian population, but commonly live in metropolitan areas. The top counties as shown in the graph above are Hillsborough (Tampa), Orange (Orlando), Polk, Osceola, Palm Beach (West Palm Beach), Broward (Ft. Lauderdale), and Miami-Dade (Miami)
For the rest of the profile, we will focus on the South Asian population in Broward County.
basic_plot <- ggplot(south_asian_bro, aes(x = party_aff, fill = party_aff)) +
geom_bar(width = 0.7) +
scale_fill_manual(values = party_colors) +
labs(
title = "South Asian Voters",
x = "Political Party",
y = "Number of SA Voters"
) +
theme_minimal() +
theme(legend.position = "none")
#basic_plot + scale_x_discrete(limits = c("DEM", "REP", "NPA"))
basic_plot2 <- ggplot(broward, aes(x = party_aff, fill = party_aff)) +
geom_bar(width = 0.7) +
scale_fill_manual(values = party_colors) +
labs(
title = "All Broward County",
x = "Political Party",
y = "Number of Voters"
) +
theme_minimal() +
theme(legend.position = "none")
#basic_plot2 + scale_x_discrete(limits = c("DEM", "REP", "NPA"))
basic_plot + scale_x_discrete(limits = c("DEM", "REP", "NPA")) +
basic_plot2 + scale_x_discrete(limits = c("DEM", "REP", "NPA"))
When comparing South Asians to the general Broward population, we can see that they have a higher rate of non-party affiliated voters, as well as a higher rate of democratic party affiliation.
south_asian_bro <- south_asian_bro |>
mutate(
Age = floor(interval(BirthDate, Sys.Date()) / years(1))
)
ggplot(south_asian_bro, aes(x = Age)) +
geom_histogram(binwidth = 5, fill = "blue", color = "black") +
labs(title = "Distribution of Ages of South Asian-Born Voters", x = "Age", y = "Frequency") +
theme_minimal()
print(paste("Mean South Asian Voter Age:", mean(south_asian_bro$Age)))
## [1] "Mean South Asian Voter Age: 52.5265082266913"
broward_filtered <- broward_filtered |>
mutate(
date_dob = as.Date(dob, format = "%m/%d/%Y"),
Age = floor(interval(date_dob, Sys.Date()) / years(1))
)
ggplot(broward_filtered, aes(x = Age)) +
geom_histogram(binwidth = 5, fill = "blue", color = "black") +
labs(title = "Distribution of Ages of Broward Voters", x = "Age", y = "Frequency") +
theme_minimal()
print(paste("Mean Broward Voter Age:", mean(broward_filtered$Age)))
## [1] "Mean Broward Voter Age: 50.9435377561691"
South Asians seem to be more normally distributed in age, which is against the trend of right skew/more uniform that is seen in Broward County as a whole.
This can be explained by the immigration process and the path to citizenship. There are not many young South-Asian born voters, since there many come to the U.S. on work visas like H1-b. Because of this, they gain citizenship later in life, usually around their 30s. In addition, the large concentration from 40-60 years of age may reflect the high immigration rates of young works in the early 90s from India and Pakistan during the tech boom in the U.S. These people are now in their 40s-50s in 2024.
sa_reg_totals <- south_asian_bro |>
group_by(reg.year) |>
summarise(count = n())
ggplot(sa_reg_totals, aes(x = reg.year, y = count)) +
geom_line() +
labs(title = "South Asian Voters Registered in Broward Over Years",
x = "Year",
y = "Number of Registrations") +
theme_minimal()
This same trend is reflected in the trend of voter registrations in South Asian populations. There is a large increase from around 2005 to 2015, which is when these workers gained citizenship status, since they need to have held legal residence (a green card) for five years before they qualify for naturalization.
potential_parents <- south_asian_bro |>
filter(Age >= 40 & Age <= 65)
potential_children <- broward_filtered |>
filter(Age >= 18 & Age <= 25)
matched_families <- inner_join(
potential_children,
potential_parents,
by = c("last" = "last", "res_address1" = "res_address1")
)
matched_children <- matched_families |>
dplyr::select(last, res_address1, ends_with(".x")) |>
rename_with(~str_remove(., ".x"))
matched_parents <- matched_families |>
dplyr::select(last, res_address1, ends_with(".y")) |>
rename_with(~str_remove(., ".y"))
basic_plot3 <- ggplot(matched_parents, aes(x = par_aff.y, fill = par_aff.y)) +
geom_bar(width = 0.7) +
scale_fill_manual(values = party_colors) +
labs(
title = "Parents",
x = "Political Party",
y = "Number of Voters"
) +
theme_minimal() +
theme(legend.position = "none")
#basic_plot3 + scale_x_discrete(limits = c("DEM", "REP", "NPA"))
basic_plot4 <- ggplot(matched_children, aes(x = party_aff, fill = party_aff)) +
geom_bar(width = 0.7) +
scale_fill_manual(values = party_colors) +
labs(
title = "Children",
x = "Political Party",
y = "Number of Voters"
) +
theme_minimal() +
theme(legend.position = "none")
#basic_plot4 + scale_x_discrete(limits = c("DEM", "REP", "NPA"))
basic_plot3 + scale_x_discrete(limits = c("DEM", "REP", "NPA")) +
basic_plot4 + scale_x_discrete(limits = c("DEM", "REP", "NPA"))
Both distributions seem to be very similar, albeit with South Asian children tending to register as democrat slightly more than their parents who tend toward registering as non-party affiliated. This could reflect the process of political socialization, where children are conditioned toward a certain political party due to their upbringing in the U.S.
We can also see that there are less non-party affiliated voters among South Asian parents compared to the general South-Asian American population. This might suggest a reverse flow of influence, where instead of parents influencing their children’s affiliation, children affect their parent’s affiliation. There is not enough evidence to support that this process is occuring, but it is an important mechanism to note when interpreting this data.
bro16_filtered <- broward_2016 |>
filter(last != "*")
sa_bro1624 <- south_asian_bro |>
inner_join(bro16_filtered |>
dplyr::select(VoterID, party_aff),
by = "VoterID")
basic_plot6 <- ggplot(sa_bro1624, aes(x = party_aff.y, fill = party_aff.y)) +
geom_bar(width = 0.7) +
scale_fill_manual(values = party_colors) +
labs(
title = "Political Affliation in 2016",
x = "Political Party",
y = "Number of Voters"
) +
theme_minimal() +
theme(legend.position = "none")
basic_plot6 + scale_x_discrete(limits = c("DEM", "REP", "NPA"))
df <- sa_bro1624 |>
mutate(
party_aff.x = case_when(
party_aff.x %in% c("DEM", "REP", "NPA") ~ party_aff.x,
TRUE ~ "Third Party"
),
party_aff.y = case_when(
party_aff.y %in% c("DEM", "REP", "NPA") ~ party_aff.y,
TRUE ~ "Third Party"
)
)
alluv_data <- df |>
count(party_aff.y, party_aff.x)
names(alluv_data) <- c("2016", "2024", "Freq")
ggplot(alluv_data,
aes(y = Freq,
axis1 = `2016`, axis2 = `2024`)) +
geom_alluvium(aes(fill = `2016`)) +
geom_stratum(width = 1/8) +
geom_stratum(width = 1/8) +
geom_text(stat = "stratum", aes(label = after_stat(stratum))) +
scale_fill_manual(values = c("DEM" = "blue", "REP" = "red", "NPA" = "grey", "Third Party" = "purple"))+
ggtitle("Changes in South Asian Party Affiliation from 2016 to 2024") +
theme_minimal()
From the alluvial plot, we can see that the biggest shift was South Asian democrats shifting to non-party affiliated, with a small portion of them shifting to Republican. A portion of non-party affiliated shifted to democrat, and some shifted to republican. There seems to not be a beig shift in democrat to republican as the media seems to show, but this is only looking at a subset of people in Broward country, which already has a high proportion of democrats.