-
Notifications
You must be signed in to change notification settings - Fork 21
/
Copy pathOH.Rmd
167 lines (123 loc) · 6.57 KB
/
OH.Rmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
---
title: "Ohio Early Voting Statistics"
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
library(tidyverse)
library(knitr)
library(kableExtra)
library(scales)
library(DT)
library(highcharter)
state_stats <- read_csv("D:/DropBox/Dropbox/Mail_Ballots_2020/markdown/2020G_Early_Vote.csv")
OH_stats <- read_csv("D:/DropBox/Dropbox/Mail_Ballots_2020/markdown/2020G_Early_Vote_OH.csv")
# Setup
party_shell <- data.frame(Party=character(),
Count=integer(),
Percent=double(),
stringsAsFactors=FALSE)
party_shell[1,1] <- "Democrats"
party_shell[2,1] <- "Republicans"
party_shell[3,1] <- "Minor"
party_shell[4,1] <- "No Party Affiliation"
party_shell[5,1] <- "TOTAL"
race_shell <- data.frame(Race=character(),
Count=integer(),
Percent=double(),
stringsAsFactors=FALSE)
race_shell[1,1] <- "Non-Hispanic White"
race_shell[2,1] <- "Non-Hispanic Black"
race_shell[3,1] <- "Hispanic"
race_shell[4,1] <- "Non-Hispanic Asian American"
race_shell[5,1] <- "Non-Hispanic Native American"
race_shell[6,1] <- "Other/Multiple/Unknown"
race_shell[7,1] <- "TOTAL"
gender_shell <- data.frame(Gender=character(),
Count=integer(),
Percent=double(),
stringsAsFactors=FALSE)
gender_shell[1,1] <- "Female"
gender_shell[2,1] <- "Male"
gender_shell[3,1] <- "Unknown"
gender_shell[4,1] <- "TOTAL"
age_shell <- data.frame(Age=character(),
Count=integer(),
Percent=double(),
stringsAsFactors=FALSE)
age_shell[1,1] <- "18 to 24"
age_shell[2,1] <- "25 to 34"
age_shell[3,1] <- "35 to 44"
age_shell[4,1] <- "45 to 54"
age_shell[5,1] <- "55 to 64"
age_shell[6,1] <- "65 and up"
age_shell[7,1] <- "TOTAL"
OH_req_send_tot <- data.frame(Total=character(),
Count=integer(),
Percent=double(),
stringsAsFactors=FALSE)
OH_req_send_tot[1,1] <- "TOTAL"
OH_req_send_tot[1,2] <- sum(state_stats[36,5])
OH_req_send_tot$Percent <- 100.0
OH_req_send_age <- age_shell
OH_req_send_age[1,2] <- state_stats[36,23]
OH_req_send_age[2,2] <- state_stats[36,24]
OH_req_send_age[3,2] <- state_stats[36,25]
OH_req_send_age[4,2] <- state_stats[36,26]
OH_req_send_age[5,2] <- state_stats[36,27]
OH_req_send_age[6,2] <- state_stats[36,28]
OH_req_send_age[7,2] <- state_stats[36,5]
OH_req_send_age$Percent <- 100*OH_req_send_age$Count/OH_req_send_age[7,2]
OH_stats_requests <- select(OH_stats, COUNTY, Reg.Voters, Mail.Req.Tot, Pct.Request)
OH_stats_returns <- select(OH_stats, COUNTY, Mail.Rtn.Tot, Mail.Req.Tot, Pct.Return)
```
## {.tabset}
Last Report: `r state_stats[36,9]`
Source: `r state_stats[36,2]`
Data presented here are scraped from 80 of Ohio's 88 counties that post absentee ballot reports online. These 80 reporting counties include the largest counties of Cuyahoga, Franklin, and Hamilton.
These data were last scraped on the Last Report date, but counties may have last posted their data on an earlier date.
You may see reports of Ohio mail ballot activity by "Party". I will not post party statistics because they are misleading. Ohio's party affiliation is unlike party registration in other states. In Ohio, "Party" is a record of the last party primary a voter participated in, in the current and past last two calendar years (see: [Ohio Code 3513.19(3)](https://codes.ohio.gov/orc/3513.19)). In Ohio's April 28, 2020 presidential primary, 124,628 more voters participated in the Democratic primary than the Republican primary, primarily because President Trump had only token opposition. As a consequence, **Ohio's "Party" is currently artificially tilted towards the Democrats.** Leveraging this quirk, both political parties and their allies have abused these party statistics over the years to make disingenuous claims about party enthusiasm in Ohio.
**I do not distinguish between mail and in-person votes in Ohio because some counties do not provide data by method of voting**
### Mail Ballots Returned
Ballots Returned: **`r format(as.numeric(state_stats[36,6]), big.mark =",")`**
``` {r echo = FALSE}
OH_2020g_map_data <- OH_stats
OH_2020g_map_data$fips <- as.character(OH_2020g_map_data$fips)
OH_2020g_map_data <- mutate(OH_2020g_map_data, percent = round(100*Pct.Return, digits = 1))
mapfile <- download_map_data("countries/us/us-oh-all.js")
mapdata <- get_data_from_map(mapfile)
mapdata$row <- as.integer(rownames(mapdata))
OH_2020g_map_data <- left_join(OH_2020g_map_data, mapdata, by = "fips")
OH_2020g_map_data <- arrange(OH_2020g_map_data, row)
hcmap(map = "countries/us/us-oh-all", data = OH_2020g_map_data,
value = "percent", name = "Percent Returned", joinBy = "fips") %>%
hc_title(text ="Mail Ballot Return Rates") %>%
hc_subtitle(text = "County plots may not be shaded using the same scale")
```
``` {r echo = FALSE}
datatable(OH_stats_returns, colnames = c("County", "Mail Ballots Returned", "Mail Ballot Requests", "Percent Returned"), rownames = F) %>%
formatPercentage('Pct.Return', 1) %>%
formatRound(c('Mail.Rtn.Tot','Mail.Req.Tot'), 0, mark = ",")
```
### Mail Ballots Requested
Ballots Requested: **`r format(as.numeric(state_stats[36,5]), big.mark =",")`**
#### Mail Ballot Requests by County
Ohio releases a weekly update to the voter registration file. The voter registration numbers are from the most recent release and may be slightly dated.
``` {r echo = FALSE}
OH_2020g_map_data <- OH_stats
OH_2020g_map_data$fips <- as.character(OH_2020g_map_data$fips)
OH_2020g_map_data <- mutate(OH_2020g_map_data, percent = round(100*Pct.Request, digits = 1))
mapfile <- download_map_data("countries/us/us-oh-all.js")
mapdata <- get_data_from_map(mapfile)
mapdata$row <- as.integer(rownames(mapdata))
OH_2020g_map_data <- left_join(OH_2020g_map_data, mapdata, by = "fips")
OH_2020g_map_data <- arrange(OH_2020g_map_data, row)
hcmap(map = "countries/us/us-oh-all", data = OH_2020g_map_data,
value = "percent", name = "Percent Requested", joinBy = "fips") %>%
hc_title(text ="Mail Ballot Return Rates") %>%
hc_subtitle(text = "County plots may not be shaded using the same scale")
```
``` {r echo = FALSE}
datatable(OH_stats_requests, colnames = c("County", "Registered Voters", "Mail Ballot Requests", "Percent Requested"), rownames = F) %>%
formatPercentage('Pct.Request', 1) %>%
formatRound(c('Reg.Voters','Mail.Req.Tot'), 0, mark = ",")
```