On August 9, 2014, Michael Brown, an unarmed black male, was fatally shot in Ferguson, Missouri, by Darren Wilson, a white police officer. Starting the day after this incident, members of the community protested and rioted against police brutality, which sparked national media attention, a debate about the power of law enforcement in general, and saw the outcrop of the Black Lives Matter Movement. These protests lasted on and off throughout the following months, reaching their peak on November 24, after a grand jury decided not to indict Wilson. Some demonstrations continued in the months following as well.
I have recently been very interested in political efficacy - that is, citizens’ faith and trust in government - in response to crises in their communities. I thought about researching the effect that events such as poor water quality (Flint, Michigan) or a natural disaster like forest fires (California) had on political participation before ultimately deciding to examine this subject in the context of in Ferguson’s police brutality issue and related unrest . In deciding to look into voter registration in Ferguson after the events of Fall 2014, I first examined it as I would have any other national occurrence, with the demonstrations against police brutality serving as the crisis at hand.
In the beginning of my research, I used the paper by Gimpel et. al, “Election-Year Stimuli and the Timing of Voter Registration” as guidance. From this paper, I was introduced to the concept of “disruptive stimuli”, which is stimuli that varies from the internal norms of society. This seemed fit perfectly with the goal I had in examining political participation when the norms of a community are disrupted, from natural disaster or infrastructure issues or, in this case, demonstrations that caught national attention. The matter I was looking into seemed straightforward - I would examine how voter registration changed according to the proximity of voters to Ferguson. I hypothesized that voter registration would increase the closer that voters were to Ferguson, with the close distance of the crisis motivating those to register. However, I then came across a paper by Hannah Walker, “Targeted: The Mobilizing Effect of Perceptions of Unfair Policing Practices”, which opened my eyes to the different factors and considerations that play into the issue I am researching.
In this paper, Hannah Walker explains that African Americans more likely to express political participation in response to unfair police practices in non-traditional ways. I realized I had been thinking about the issue in the wrong way: I shouldn’t measure voter registration in response to unrest as a way of measuring political participation, because the unrest itself was the political participation. As a result of this realization, I focused on framing my research in measuring registration response to the shooting itself rather than the protests. Further, I was wary of drawing false conclusions in which I attributed a change in registration to proximity when race was more influential in how people would engage politically. As St. Louis County is already highly segregated, with African American communities centered around the northeast part of the county (around Ferguson, more or less) and becoming predominantly white towards the southwest edges of the county, I worried that any measure that showed a correlation between distance from Ferguson and change in registration (and thus, a change in “political participation”) was actually showing patterns that could be attributed to what we already know about race.
Taking all this into consideration, I decided to examine the subject from various angles.
To begin, I loaded the R packages tidyverse and ggplot2, and set my working directory
Then, I read in the data. For this project, I used the Missouri Voter File.
This file includes all the voter registrations in Missouri, as well as registrants names, addresses, counties, zip codes, residential cities, and past voter history. It did not include age, birthdate, race, or gender information for any of the registrants. After exploring the database a little, I learned that the city of Ferguson, since it is a suburb of St. Louis, was grouped with it in the voter file, and therefore there was no one registered to the residential city of Ferguson. Luckily, I also discovered that the entire suburb of Ferguson has one zip code (63135), so I decided to examine voter registration numbers within different zip codes.
To simplify the data I was working with, I first used the filter function to filter out all registrants in the database except ones with the county identifier St. Louis. Then, I selected only the columns relevant to what I wanted to use, which were “Residential Zipcode” and “Registration Date”. I also decided to convert the values in the column “Registration Date” to dates, since they originally were read in as characters. For this, I used the as.Date function.
StLouisCounty <- "St. Louis"
StLouisVoters <- filter(MO.voters, County == "St. Louis")
(StLouisVoters.Basic <- select(StLouisVoters, `Residential ZipCode`, `Registration Date`))
## # A tibble: 731,988 x 2
## `Residential ZipCode` `Registration Date`
## <chr> <chr>
## 1 63117 12/13/2012
## 2 63125 09/27/2012
## 3 63123 10/10/2000
## 4 63134 02/01/2010
## 5 63121 12/08/2004
## 6 63129 10/04/1980
## 7 63146 09/24/2015
## 8 63074 09/27/2002
## 9 63123 08/09/1989
## 10 63119 08/27/2010
## # … with 731,978 more rows
StLouisVoters.Basic$RegistrationDate <- as.Date(StLouisVoters.Basic$"Registration Date", format = "%m/%d/%Y")
To make my dataset a little smaller and manageable to work with yet still give myself room to use different time periods, I filtered the set so it showed data between 2010 and 2017 only. I also changed the zipcode that denotes Ferguson to “Ferguson” in order to make it more accessible when it comes to graphing.
StLouisVoters.Important <- StLouisVoters.Basic %>%
filter(RegistrationDate >= "2010/01/01")
StLouisVoters.Important <- StLouisVoters.Important %>%
filter(RegistrationDate <= "2017/06/30")
StLouisVoters.Important$`Residential ZipCode`<- recode(StLouisVoters.Important$`Residential ZipCode`, "63135" = "Ferguson", .default = StLouisVoters.Important$`Residential ZipCode`)
The first thing I wanted to show were the numbers in registration year to year in Ferguson and everywhere else in St. Louis County, to get an idea of how registration trends varied from Ferguson at the county level and over the years. However, instead of graphing January through December of each year, I wanted to look at the time period relevant to my project. Considering that the shooting happened in August, I started the graph in June, to see if there was any change once August came. Then, since the next municipal election happened in April, I closed the time period at the beginning of May, to see if people were reacting to the incident by planning on voting in the next election.
To do this, I created new data sets featuring registration dates from June 2013 through May 2014, June 2014 through May 2015, and June 2015 through May 2016. I created one with only registrations in Ferguson, and then with all the Zip Codes in St. Louis county except Ferguson. These will be the data I use for my plotting.
Ferguson.1314 <- StLouisVoters.Important %>%
filter(grepl("Ferguson",`Residential ZipCode`))
Ferguson.1314 <- Ferguson.1314 %>%
filter(RegistrationDate >= "2013/06/01" & RegistrationDate <= "2014/05/31")
AllOthers.1314 <- StLouisVoters.Important %>%
filter(!grepl("Ferguson", `Residential ZipCode`))
AllOthers.1314 <- AllOthers.1314 %>%
filter(RegistrationDate >= "2013/06/01" & RegistrationDate <= "2014/05/31")
(Repeated two more times for different time periods)
From this, I created the graphs.
Ferguson.1314graph <- ggplot(Ferguson.1314, aes(RegistrationDate)) +
geom_bar(color = "#5CC628") +
labs(x = "Registration Date",
y = "Number of Registrants",
title = "Ferguson 2013-2014")
I repeated this 5 more times for the other graphs, changing the data, color, and title.
grid.arrange(Ferguson.1314graph, AllOthers.1314graph, ncol = 2)
grid.arrange(Ferguson.1415graph, AllOthers.1415graph, ncol = 2)
grid.arrange(Ferguson.1516graph, AllOthers.1516graph, ncol = 2)
In these visualizations, I noticed that upticks in Ferguson usually corresponded with upticks in the rest of the county from year to year. However, I needed to take a closer look at these months before I drew any conclusions about these voter registration spikes. Further, because of the reasons I listed before, I wanted to examine voter registration in Ferguson in relation to zip codes with similar demographics – majority black and low-income – so that I am comparing apples to apples in determining how registration changed in Ferguson.
To do this, I decided to select nine other zip codes with demographics similar to Ferguson’s and create visualizations of the same time periods over the span of three years to compare Ferguson’s registration numbers in relation to the other zip codes in three different years. The first time period I examined was that in which the unrest was happening: August through December
First, I created three new datasets, filtering out all registrations but those that happened in August through December in 2013, 2014, and 2015. I had issues selecting only the zip codes that I wanted to use, so instead I had to filter out all unnecessary zip codes in St. Louis County manually.
ZipsFall2013 <- StLouisVoters.Important %>%
filter(!grepl("-", `Residential ZipCode`))
ZipsFall2013 <- ZipsFall2013 %>%
filter(!grepl("XXXXX", `Residential ZipCode`))
ZipsFall2013 <- ZipsFall2013 %>%
filter(RegistrationDate >= "2013/07/31" & RegistrationDate <= "2013/12/31")
ZipsFall2013 <- ZipsFall2013 %>%
filter(!grepl("63005", `Residential ZipCode`))
ZipsFall2013 <- ZipsFall2013 %>%
filter(!grepl("63011", `Residential ZipCode`))
ZipsFall2013 <- ZipsFall2013 %>%
filter(!grepl("63017", `Residential ZipCode`))
ZipsFall2013 <- ZipsFall2013 %>%
filter(!grepl("63021", `Residential ZipCode`))
ZipsFall2013 <- ZipsFall2013 %>%
filter(!grepl("63025", `Residential ZipCode`))
ZipsFall2013 <- ZipsFall2013 %>%
filter(!grepl("63026", `Residential ZipCode`))
ZipsFall2013 <- ZipsFall2013 %>%
filter(!grepl("63040", `Residential ZipCode`))
ZipsFall2013 <- ZipsFall2013 %>%
filter(!grepl("63034", `Residential ZipCode`))
ZipsFall2013 <- ZipsFall2013 %>%
filter(!grepl("63045", `Residential ZipCode`))
ZipsFall2013 <- ZipsFall2013 %>%
filter(!grepl("63042", `Residential ZipCode`))
ZipsFall2013 <- ZipsFall2013 %>%
filter(!grepl("63043", `Residential ZipCode`))
ZipsFall2013 <- ZipsFall2013 %>%
filter(!grepl("63044", `Residential ZipCode`))
ZipsFall2013 <- ZipsFall2013 %>%
filter(!grepl("63049", `Residential ZipCode`))
ZipsFall2013 <- ZipsFall2013 %>%
filter(!grepl("63069", `Residential ZipCode`))
ZipsFall2013 <- ZipsFall2013 %>%
filter(!grepl("63074", `Residential ZipCode`))
ZipsFall2013 <- ZipsFall2013 %>%
filter(!grepl("63031", `Residential ZipCode`))
ZipsFall2013 <- ZipsFall2013 %>%
filter(!grepl("63145", `Residential ZipCode`))
ZipsFall2013 <- ZipsFall2013 %>%
filter(!grepl("63146", `Residential ZipCode`))
ZipsFall2013 <- ZipsFall2013 %>%
filter(!grepl("63141", `Residential ZipCode`))
ZipsFall2013 <- ZipsFall2013 %>%
filter(!grepl("63131", `Residential ZipCode`))
ZipsFall2013 <- ZipsFall2013 %>%
filter(!grepl("63122", `Residential ZipCode`))
ZipsFall2013 <- ZipsFall2013 %>%
filter(!grepl("63088", `Residential ZipCode`))
ZipsFall2013 <- ZipsFall2013 %>%
filter(!grepl("63122", `Residential ZipCode`))
ZipsFall2013 <- ZipsFall2013 %>%
filter(!grepl("63127", `Residential ZipCode`))
ZipsFall2013 <- ZipsFall2013 %>%
filter(!grepl("63124", `Residential ZipCode`))
ZipsFall2013 <- ZipsFall2013 %>%
filter(!grepl("63105", `Residential ZipCode`))
ZipsFall2013 <- ZipsFall2013 %>%
filter(!grepl("63117", `Residential ZipCode`))
ZipsFall2013 <- ZipsFall2013 %>%
filter(!grepl("63114", `Residential ZipCode`))
ZipsFall2013 <- ZipsFall2013 %>%
filter(!grepl("63132", `Residential ZipCode`))
ZipsFall2013 <- ZipsFall2013 %>%
filter(!grepl("63130", `Residential ZipCode`))
ZipsFall2013 <- ZipsFall2013 %>%
filter(!grepl("63144", `Residential ZipCode`))
ZipsFall2013 <- ZipsFall2013 %>%
filter(!grepl("63148", `Residential ZipCode`))
ZipsFall2013 <- ZipsFall2013 %>%
filter(!grepl("63119", `Residential ZipCode`))
ZipsFall2013 <- ZipsFall2013 %>%
filter(!grepl("63126", `Residential ZipCode`))
ZipsFall2013 <- ZipsFall2013 %>%
filter(!grepl("63123", `Residential ZipCode`))
ZipsFall2013 <- ZipsFall2013 %>%
filter(!grepl("63125", `Residential ZipCode`))
ZipsFall2013 <- ZipsFall2013 %>%
filter(!grepl("63128", `Residential ZipCode`))
ZipsFall2013 <- ZipsFall2013 %>%
filter(!grepl("63129", `Residential ZipCode`))
ZipsFall2013 <- ZipsFall2013 %>%
filter(!grepl("63138", `Residential ZipCode`))
ZipsFall2013 <- ZipsFall2013 %>%
filter(!grepl("63137", `Residential ZipCode`))
cols <- c("63138" = "#A5A5A5", "63005" = "#A5A5A5", "63033" = "#A5A5A5", "63038" = "#A5A5A5", "63120" = "#A5A5A5", "63121" = "#A5A5A5", "63133" = "#A5A5A5", "63134" = "#A5A5A5","63136" = "#A5A5A5", "63140" = "#A5A5A5", "63143" = "#A5A5A5", "Ferguson" = "#F01F1F")
ZipsFall2013Graph <- ggplot (data = ZipsFall2013, mapping = aes(x = RegistrationDate, colour = `Residential ZipCode`)) +
geom_freqpoly(binwidth = 20) + scale_color_manual(values = cols) +
labs(x = "Registration Date",
y = "Number of Registrants",
title = "Registrations 2013")
Once I created all the graphs, I plotted them.
Looking at the graph of Fall 2014, I found most interesting and suprising that a majority of the different zip codes followed the same trend in the fall of 2014, given that they were extremely varied in the other two years. I was suprised to see that Ferguson also followed these trends, since I was expecting to see a lower number during this time period due to the unrests.
Next, I wanted to see what happened registration wise in the period after the unrest and leading up to the next municipal election in April. Had the people in Ferguson and similar zip codes already expressed maximum political participation through protesting, or did they want their voices to be heard in voting as well, and decide to register to vote? I explored this through similar graphs in the time period of January through April of 2014, 2015, and 2016. For context, in each of these years, there was an election in early April, and the cut-off for registration was about a month before then.
In comparing these graphs to each other and Ferguson to other zip codes, I noticed that some zip codes had a pre-election spike in registrations right before the registration deadline, but Ferguson’s registrations were relatively constant in 2015 throughout the four months, hovering around 20 per month. However, this does not necessarily have relation to what happened in Ferguson in the months prior, since the beginning of 2014 saw a similar consistency and lack of sudden increase in registrations, despite other zip codes having increases. In fact, 2016 was the outlier in this set of graphs, in that Ferguson’s registrations were similar to the other zip codes.
Since a considerable amount of the abstract, conceptual part of this project acknowledges (or even assumes, I suppose) that race influences the way that people engage politically, I decided to look at one more thing: how voter registration trends in Ferguson compared to a few (>85%) white, upper-income zip codes in St. Louis county during the time of the demonstrations. To do this, I went through a similar process of filtering out all unnecessary zip codes and keeping the ones I wanted to visualize.
This set of graphs I found most interesting and surprising, because they yielded results contrary to what I had been expecting. For Fall of 2014, I had been expecting Ferguson’s registrations to be lower than the other zip codes, either because people were too busy protesting to think about registering to vote, or because they were choosing protesting over registering to vote as their type of political participation (which are related reasons, of course). Yet, in 2014, registrations in Ferguson peaked at 60 in the month of October, when in previous years they had sat below the other zip codes, peaking at 15 or 20 per month.
Before looking into the data of this project, I made several assumptions about how voter registration was affected as a result of the act of police brutality in the city of Ferguson and the areas around it. My theories changed as I delved into different aspects of this project, but what I originally suspected – that Ferguson would see the greatest uptick in registrations at the time of the demonstrations – proved to be true, especially when compared to zip codes not experiencing unrest. Though I reasoned, using Walker’s paper as a guide, that political engagement may not have been carried out in the form of voter registration in Ferguson, and that predominantly white communities were more likely to register to vote in response to a feeling of injustice, the data showed otherwise.
This may be due to the nature of the problem people were retaliating against (either through demonstration or voter registration or both), in that white people may not have seen police brutality as an issue that affects them, or merely not believe it is real at all, and so their political participation was not at all affected by what was happening here.
One of the greatest challenges I had in this research was wrapping my head around all the moving parts of my topic and building a cohesive plan for what I wanted to explore, in that it involved interacting the mathematic, quanitative part of my thinking with the theoretical and abstract. When I was thinking too conceptually or big-picture about this topic, it was hard for me to decide how I wanted to put the idea into practice with data manipulation, or if I did, I didn’t know how to phrase it in R terms. I knew what I wanted to explore, but I didn’t know exactly how to. There was a full week I spent on Google and YouTube, searching for one specific function that I just did not know the name of. It goes without saying (I think) that this is the first time I’ve worked with R, or any stats language in general, and that I have very little knowledge of statistics and its practical applications. In the end, there are some aspects of this project where I was unable to live up to the expectations I set for myself – I originally wanted to include GIS mapping, but the way the project changed from focusing on proximity to merely different regions to demographics made me unable to decide on even how I should spatially display the information I was trying to find out. If this project carries into the future, that is definitely something I want to figure out once and for all. Still, I was able to engage with R in meaningful ways over the course of this research, and even small victories felt great (for example, discovering the grid.arrange function in order to place graphs next to each other).
Gimpel, James G., Dyck, Joshua J., and Shaw, Daron R. “Election-Year Stimuli and the Timing of Voter Registration.” Party Politics, vol 13, no. 3, 2007, pp. 351-374.
Walker, Hannah L. “Targeted: The Mobilizing Effect of Perceptions of Unfair Policing Practices.” The Journal of Politics, 14 Nov. 2019.