library(tidyverse)
library(leaflet)
library(sf)
library(readxl)
library(DT)
library(plotly)
library(broom)
library(tidycensus)
senate_counties <- read_xlsx("Statewide Results.xlsx")
New names:
* `` -> ...2
* `` -> ...3
* `` -> ...4
* `` -> ...5
senate_counties <- read_xlsx("Statewide Results.xlsx", sheet = 1, range = "B7:E63")

Use glimpse() to view senate_counties.

glimpse(senate_counties)
Observations: 56
Variables: 4
$ County                             <chr> "Beaverhead", "Big Horn", "Blaine", "Broadwater", "Carbon", "Carter", "Ca…
$ `JON TESTER\r\nDemocrat`           <dbl> 1876, 3027, 1961, 1071, 2680, 128, 17435, 1275, 1942, 281, 1233, 2892, 28…
$ `MATT ROSENDALE\r\nRepublican`     <dbl> 2866, 1558, 982, 2086, 3209, 602, 15566, 1312, 2762, 631, 2700, 1208, 951…
$ `RICK BRECKENRIDGE\r\nLibertarian` <dbl> 155, 91, 76, 104, 178, 22, 1008, 70, 179, 29, 140, 136, 57, 189, 1349, 14…
senate_counties <- senate_counties %>% 
  rename(Republican = "MATT ROSENDALE\r\nRepublican") %>% 
  rename(Democrat = "JON TESTER\r\nDemocrat") %>% 
  rename(Libertarian = "RICK BRECKENRIDGE\r\nLibertarian")
glimpse(senate_counties)
Observations: 56
Variables: 4
$ County      <chr> "Beaverhead", "Big Horn", "Blaine", "Broadwater", "Carbon", "Carter", "Cascade", "Chouteau", "Cu…
$ Democrat    <dbl> 1876, 3027, 1961, 1071, 2680, 128, 17435, 1275, 1942, 281, 1233, 2892, 281, 1964, 19652, 33251, …
$ Republican  <dbl> 2866, 1558, 982, 2086, 3209, 602, 15566, 1312, 2762, 631, 2700, 1208, 951, 3640, 26759, 21248, 5…
$ Libertarian <dbl> 155, 91, 76, 104, 178, 22, 1008, 70, 179, 29, 140, 136, 57, 189, 1349, 1434, 30, 89, 21, 52, 227…
senate_counties <- senate_counties %>% 
  mutate(total_votes = Republican + Democrat + Libertarian) %>% 
  mutate(Repub_advantage = Republican/total_votes - Democrat/total_votes) %>% 
  mutate(Repub_advantage = round(Repub_advantage*100, 1))

senate_counties %>% 
  arrange(-Repub_advantage)
NA
mt_counties <- get_acs(geography = "county",
                       variables = "B01003_001",
                       state = "MT",
                       geometry = TRUE) 
Getting data from the 2014-2018 5-year ACS
Downloading feature geometry from the Census website.  To cache shapefiles for use in future sessions, set `options(tigris_use_cache = TRUE)`.
Using FIPS code '30' for state 'MT'

senate_counties[25, "County"] <- "Lewis and Clark"              # Changes  "&" "and"

mt_counties <- mt_counties %>% 
  mutate(County = gsub(" County, Montana", "", NAME)) %>%      # Removes unnecessary words
  rename(Population = estimate)                                # Renames the 'estimate' to 'Population'
senate_election <- mt_counties %>% 
  full_join(senate_counties)
Joining, by = "County"
senate_election %>%
  as_tibble() %>% 
  select(County, Population, Democrat, Republican, Libertarian, total_votes, Repub_advantage) %>% 
  datatable()

NA

vote_colors <- colorNumeric(palette = "viridis", domain = senate_election$Repub_advantage)

senate_election %>%
  leaflet() %>% 
  addTiles() %>%
  addPolygons(weight = 1,
              fillColor = ~vote_colors(Repub_advantage), 
              label = ~paste0(County, ", Republican advantage = ", Repub_advantage),
              highlight = highlightOptions(weight = 2)) %>% 
  setView(-110, 47, zoom = 6) %>% 
  addLegend(pal = vote_colors, values = ~Repub_advantage)
sf layer has inconsistent datum (+proj=longlat +datum=NAD83 +no_defs).
Need '+proj=longlat +datum=WGS84'
senate_election %>%
  plot_ly(x = ~Population, 
          y = ~Repub_advantage,
          hoverinfo = "text", 
          text = ~paste("County:", 
                        County, "<br>", 
                        "Population: ", Population, "<br>", 
                        "Republican advantage: ", Repub_advantage)) %>% 
  add_markers(marker = list(opacity = 0.7)) %>%
  layout(title = "Predicting Republican Vote Advantage from Population, by County",
         xaxis = list(title = "County population"),
         yaxis = list(title = "Republican vote advantage"))     

NA
pop_model <- lm(Repub_advantage ~ Population, data = senate_election)
summary(pop_model)

Call:
lm(formula = Repub_advantage ~ Population, data = senate_election)

Residuals:
    Min      1Q  Median      3Q     Max 
-71.228 -12.013   3.247  15.782  47.948 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept) 24.2809050  4.0835813   5.946 2.08e-07 ***
Population  -0.0003761  0.0001100  -3.418  0.00121 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 26.44 on 54 degrees of freedom
Multiple R-squared:  0.1779,    Adjusted R-squared:  0.1626 
F-statistic: 11.68 on 1 and 54 DF,  p-value: 0.001207
tidy(pop_model)
glance(pop_model)
NA
NA
senate_election %>%
  plot_ly(x = ~Population, 
          y = ~Repub_advantage,
          hoverinfo = "text", 
          text = ~paste("County:", 
                        County, "<br>", 
                        "Population: ", Population, "<br>", 
                        "Republican advantage: ", Repub_advantage)) %>% 
  add_markers(showlegend = F, marker = list(opacity = 0.7)) %>%
  layout(title = "Predicting Republican Vote Advantage from Population, by County",
         xaxis = list(title = "County population"),
         yaxis = list(title = "Republican vote advantage")) %>% 
    add_lines(y = ~fitted(pop_model))

NA
NA
senate_election <- senate_election %>% 
  mutate(Longitude = as_tibble(st_coordinates(st_centroid(senate_election$geometry)))$X) %>% 
  mutate(Latitude = as_tibble(st_coordinates(st_centroid(senate_election$geometry)))$Y)
st_centroid does not give correct centroids for longitude/latitude datast_centroid does not give correct centroids for longitude/latitude data
  

senate_election %>%
  leaflet() %>% 
  addTiles() %>%
  addPolygons(weight = 1) %>% 
  setView(-110, 47, zoom = 6) %>% 
addCircleMarkers(~Longitude, ~Latitude)
sf layer has inconsistent datum (+proj=longlat +datum=NAD83 +no_defs).
Need '+proj=longlat +datum=WGS84'
senate_election %>%
  plot_ly(x = ~Longitude, y = ~Repub_advantage) %>% 
  add_markers()
longitude_lm <- lm(Repub_advantage ~ Longitude, data = senate_election)
tidy(longitude_lm)
glance(longitude_lm)
senate_election %>% 
  plot_ly(x = ~Longitude, 
          y = ~Repub_advantage,
          hoverinfo = "text", 
          text = ~paste("County:", County, "<br>", "Longitude: ", Longitude, "<br>", "Republican advantage: ", Repub_advantage)) %>% 
  add_markers(marker = list(opacity = 0.7), showlegend = F) %>%
  layout(title = "Predicting Republican Vote Advantage from Longitude, by County",
         xaxis = list(title = "County longitude"),
         yaxis = list(title = "Republican vote advantage")) %>% 
  add_lines(y = ~fitted(longitude_lm))

NA
NA
multiple_lm <- lm(Repub_advantage ~ Population + Longitude, data = senate_election)
tidy(multiple_lm)
glance(multiple_lm)
senate_election %>% 
  plot_ly(x = ~Longitude, y = ~Population, z = ~Repub_advantage, 
          text = ~County, hoverinfo = "text") %>% 
  add_markers(opacity = .7, showlegend = F)
LS0tCnRpdGxlOiAiaW5kZXBlbmRlbnQgbXQgZWxlY3Rpb25zIGNoYWQgcmFuZGFsbCIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3J9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGxlYWZsZXQpCmxpYnJhcnkoc2YpCmxpYnJhcnkocmVhZHhsKQpsaWJyYXJ5KERUKQpsaWJyYXJ5KHBsb3RseSkKbGlicmFyeShicm9vbSkKbGlicmFyeSh0aWR5Y2Vuc3VzKQpgYGAKCgpgYGB7cn0Kc2VuYXRlX2NvdW50aWVzIDwtIHJlYWRfeGxzeCgiU3RhdGV3aWRlIFJlc3VsdHMueGxzeCIpCmBgYAoKYGBge3J9CnNlbmF0ZV9jb3VudGllcyA8LSByZWFkX3hsc3goIlN0YXRld2lkZSBSZXN1bHRzLnhsc3giLCBzaGVldCA9IDEsIHJhbmdlID0gIkI3OkU2MyIpCmBgYAoKVXNlIGdsaW1wc2UoKSB0byB2aWV3IHNlbmF0ZV9jb3VudGllcy4KCmBgYHtyfQpnbGltcHNlKHNlbmF0ZV9jb3VudGllcykKYGBgCgoKCgpgYGB7cn0Kc2VuYXRlX2NvdW50aWVzIDwtIHNlbmF0ZV9jb3VudGllcyAlPiUgCiAgcmVuYW1lKFJlcHVibGljYW4gPSAiTUFUVCBST1NFTkRBTEVcclxuUmVwdWJsaWNhbiIpICU+JSAKICByZW5hbWUoRGVtb2NyYXQgPSAiSk9OIFRFU1RFUlxyXG5EZW1vY3JhdCIpICU+JSAKICByZW5hbWUoTGliZXJ0YXJpYW4gPSAiUklDSyBCUkVDS0VOUklER0VcclxuTGliZXJ0YXJpYW4iKQpgYGAKCgoKYGBge3J9CmdsaW1wc2Uoc2VuYXRlX2NvdW50aWVzKQpgYGAKCmBgYHtyfQpzZW5hdGVfY291bnRpZXMgPC0gc2VuYXRlX2NvdW50aWVzICU+JSAKICBtdXRhdGUodG90YWxfdm90ZXMgPSBSZXB1YmxpY2FuICsgRGVtb2NyYXQgKyBMaWJlcnRhcmlhbikgJT4lIAogIG11dGF0ZShSZXB1Yl9hZHZhbnRhZ2UgPSBSZXB1YmxpY2FuL3RvdGFsX3ZvdGVzIC0gRGVtb2NyYXQvdG90YWxfdm90ZXMpICU+JSAKICBtdXRhdGUoUmVwdWJfYWR2YW50YWdlID0gcm91bmQoUmVwdWJfYWR2YW50YWdlKjEwMCwgMSkpCgpzZW5hdGVfY291bnRpZXMgJT4lIAogIGFycmFuZ2UoLVJlcHViX2FkdmFudGFnZSkKCmBgYAoKCgoKYGBge3J9Cm10X2NvdW50aWVzIDwtIGdldF9hY3MoZ2VvZ3JhcGh5ID0gImNvdW50eSIsCiAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVzID0gIkIwMTAwM18wMDEiLAogICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gIk1UIiwKICAgICAgICAgICAgICAgICAgICAgICBnZW9tZXRyeSA9IFRSVUUpIApgYGAKCmBgYHtyfQoKc2VuYXRlX2NvdW50aWVzWzI1LCAiQ291bnR5Il0gPC0gIkxld2lzIGFuZCBDbGFyayIgICAgICAgICAgICAgICMgQ2hhbmdlcyAgIiYiICJhbmQiCgptdF9jb3VudGllcyA8LSBtdF9jb3VudGllcyAlPiUgCiAgbXV0YXRlKENvdW50eSA9IGdzdWIoIiBDb3VudHksIE1vbnRhbmEiLCAiIiwgTkFNRSkpICU+JSAgICAgICMgUmVtb3ZlcyB1bm5lY2Vzc2FyeSB3b3JkcwogIHJlbmFtZShQb3B1bGF0aW9uID0gZXN0aW1hdGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFJlbmFtZXMgdGhlICdlc3RpbWF0ZScgdG8gJ1BvcHVsYXRpb24nCmBgYAoKCmBgYHtyfQpzZW5hdGVfZWxlY3Rpb24gPC0gbXRfY291bnRpZXMgJT4lIAogIGZ1bGxfam9pbihzZW5hdGVfY291bnRpZXMpCmBgYAoKCmBgYHtyfQpzZW5hdGVfZWxlY3Rpb24gJT4lCiAgYXNfdGliYmxlKCkgJT4lIAogIHNlbGVjdChDb3VudHksIFBvcHVsYXRpb24sIERlbW9jcmF0LCBSZXB1YmxpY2FuLCBMaWJlcnRhcmlhbiwgdG90YWxfdm90ZXMsIFJlcHViX2FkdmFudGFnZSkgJT4lIAogIGRhdGF0YWJsZSgpCgpgYGAKCgpgYGB7cn0KCnZvdGVfY29sb3JzIDwtIGNvbG9yTnVtZXJpYyhwYWxldHRlID0gInZpcmlkaXMiLCBkb21haW4gPSBzZW5hdGVfZWxlY3Rpb24kUmVwdWJfYWR2YW50YWdlKQoKc2VuYXRlX2VsZWN0aW9uICU+JQogIGxlYWZsZXQoKSAlPiUgCiAgYWRkVGlsZXMoKSAlPiUKICBhZGRQb2x5Z29ucyh3ZWlnaHQgPSAxLAogICAgICAgICAgICAgIGZpbGxDb2xvciA9IH52b3RlX2NvbG9ycyhSZXB1Yl9hZHZhbnRhZ2UpLCAKICAgICAgICAgICAgICBsYWJlbCA9IH5wYXN0ZTAoQ291bnR5LCAiLCBSZXB1YmxpY2FuIGFkdmFudGFnZSA9ICIsIFJlcHViX2FkdmFudGFnZSksCiAgICAgICAgICAgICAgaGlnaGxpZ2h0ID0gaGlnaGxpZ2h0T3B0aW9ucyh3ZWlnaHQgPSAyKSkgJT4lIAogIHNldFZpZXcoLTExMCwgNDcsIHpvb20gPSA2KSAlPiUgCiAgYWRkTGVnZW5kKHBhbCA9IHZvdGVfY29sb3JzLCB2YWx1ZXMgPSB+UmVwdWJfYWR2YW50YWdlKQoKYGBgCgoKYGBge3J9CnNlbmF0ZV9lbGVjdGlvbiAlPiUKICBwbG90X2x5KHggPSB+UG9wdWxhdGlvbiwgCiAgICAgICAgICB5ID0gflJlcHViX2FkdmFudGFnZSwKICAgICAgICAgIGhvdmVyaW5mbyA9ICJ0ZXh0IiwgCiAgICAgICAgICB0ZXh0ID0gfnBhc3RlKCJDb3VudHk6IiwgCiAgICAgICAgICAgICAgICAgICAgICAgIENvdW50eSwgIjxicj4iLCAKICAgICAgICAgICAgICAgICAgICAgICAgIlBvcHVsYXRpb246ICIsIFBvcHVsYXRpb24sICI8YnI+IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICJSZXB1YmxpY2FuIGFkdmFudGFnZTogIiwgUmVwdWJfYWR2YW50YWdlKSkgJT4lIAogIGFkZF9tYXJrZXJzKG1hcmtlciA9IGxpc3Qob3BhY2l0eSA9IDAuNykpICU+JQogIGxheW91dCh0aXRsZSA9ICJQcmVkaWN0aW5nIFJlcHVibGljYW4gVm90ZSBBZHZhbnRhZ2UgZnJvbSBQb3B1bGF0aW9uLCBieSBDb3VudHkiLAogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiQ291bnR5IHBvcHVsYXRpb24iKSwKICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIlJlcHVibGljYW4gdm90ZSBhZHZhbnRhZ2UiKSkgICAgIAogICAgICAgICAgICAgICAgCmBgYAoKYGBge3J9CnBvcF9tb2RlbCA8LSBsbShSZXB1Yl9hZHZhbnRhZ2UgfiBQb3B1bGF0aW9uLCBkYXRhID0gc2VuYXRlX2VsZWN0aW9uKQoKYGBgCgpgYGB7cn0Kc3VtbWFyeShwb3BfbW9kZWwpCmBgYAoKCmBgYHtyfQp0aWR5KHBvcF9tb2RlbCkKZ2xhbmNlKHBvcF9tb2RlbCkKCgpgYGAKCmBgYHtyfQpzZW5hdGVfZWxlY3Rpb24gJT4lCiAgcGxvdF9seSh4ID0gflBvcHVsYXRpb24sIAogICAgICAgICAgeSA9IH5SZXB1Yl9hZHZhbnRhZ2UsCiAgICAgICAgICBob3ZlcmluZm8gPSAidGV4dCIsIAogICAgICAgICAgdGV4dCA9IH5wYXN0ZSgiQ291bnR5OiIsIAogICAgICAgICAgICAgICAgICAgICAgICBDb3VudHksICI8YnI+IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICJQb3B1bGF0aW9uOiAiLCBQb3B1bGF0aW9uLCAiPGJyPiIsIAogICAgICAgICAgICAgICAgICAgICAgICAiUmVwdWJsaWNhbiBhZHZhbnRhZ2U6ICIsIFJlcHViX2FkdmFudGFnZSkpICU+JSAKICBhZGRfbWFya2VycyhzaG93bGVnZW5kID0gRiwgbWFya2VyID0gbGlzdChvcGFjaXR5ID0gMC43KSkgJT4lCiAgbGF5b3V0KHRpdGxlID0gIlByZWRpY3RpbmcgUmVwdWJsaWNhbiBWb3RlIEFkdmFudGFnZSBmcm9tIFBvcHVsYXRpb24sIGJ5IENvdW50eSIsCiAgICAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJDb3VudHkgcG9wdWxhdGlvbiIpLAogICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiUmVwdWJsaWNhbiB2b3RlIGFkdmFudGFnZSIpKSAlPiUgCiAgICBhZGRfbGluZXMoeSA9IH5maXR0ZWQocG9wX21vZGVsKSkKICAgIAogICAgICAgICAgICAgICAgCmBgYAoKCgpgYGB7cn0Kc2VuYXRlX2VsZWN0aW9uIDwtIHNlbmF0ZV9lbGVjdGlvbiAlPiUgCiAgbXV0YXRlKExvbmdpdHVkZSA9IGFzX3RpYmJsZShzdF9jb29yZGluYXRlcyhzdF9jZW50cm9pZChzZW5hdGVfZWxlY3Rpb24kZ2VvbWV0cnkpKSkkWCkgJT4lIAogIG11dGF0ZShMYXRpdHVkZSA9IGFzX3RpYmJsZShzdF9jb29yZGluYXRlcyhzdF9jZW50cm9pZChzZW5hdGVfZWxlY3Rpb24kZ2VvbWV0cnkpKSkkWSkKICAKYGBgCgpgYGB7cn0KCnNlbmF0ZV9lbGVjdGlvbiAlPiUKICBsZWFmbGV0KCkgJT4lIAogIGFkZFRpbGVzKCkgJT4lCiAgYWRkUG9seWdvbnMod2VpZ2h0ID0gMSkgJT4lIAogIHNldFZpZXcoLTExMCwgNDcsIHpvb20gPSA2KSAlPiUgCmFkZENpcmNsZU1hcmtlcnMofkxvbmdpdHVkZSwgfkxhdGl0dWRlKQoKYGBgCgoKCmBgYHtyfQpzZW5hdGVfZWxlY3Rpb24gJT4lCiAgcGxvdF9seSh4ID0gfkxvbmdpdHVkZSwgeSA9IH5SZXB1Yl9hZHZhbnRhZ2UpICU+JSAKICBhZGRfbWFya2VycygpCmBgYAoKCgoKYGBge3J9CmxvbmdpdHVkZV9sbSA8LSBsbShSZXB1Yl9hZHZhbnRhZ2UgfiBMb25naXR1ZGUsIGRhdGEgPSBzZW5hdGVfZWxlY3Rpb24pCnRpZHkobG9uZ2l0dWRlX2xtKQpnbGFuY2UobG9uZ2l0dWRlX2xtKQpgYGAKCgoKYGBge3J9CnNlbmF0ZV9lbGVjdGlvbiAlPiUgCiAgcGxvdF9seSh4ID0gfkxvbmdpdHVkZSwgCiAgICAgICAgICB5ID0gflJlcHViX2FkdmFudGFnZSwKICAgICAgICAgIGhvdmVyaW5mbyA9ICJ0ZXh0IiwgCiAgICAgICAgICB0ZXh0ID0gfnBhc3RlKCJDb3VudHk6IiwgQ291bnR5LCAiPGJyPiIsICJMb25naXR1ZGU6ICIsIExvbmdpdHVkZSwgIjxicj4iLCAiUmVwdWJsaWNhbiBhZHZhbnRhZ2U6ICIsIFJlcHViX2FkdmFudGFnZSkpICU+JSAKICBhZGRfbWFya2VycyhtYXJrZXIgPSBsaXN0KG9wYWNpdHkgPSAwLjcpLCBzaG93bGVnZW5kID0gRikgJT4lCiAgbGF5b3V0KHRpdGxlID0gIlByZWRpY3RpbmcgUmVwdWJsaWNhbiBWb3RlIEFkdmFudGFnZSBmcm9tIExvbmdpdHVkZSwgYnkgQ291bnR5IiwKICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIkNvdW50eSBsb25naXR1ZGUiKSwKICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIlJlcHVibGljYW4gdm90ZSBhZHZhbnRhZ2UiKSkgJT4lIAogIGFkZF9saW5lcyh5ID0gfmZpdHRlZChsb25naXR1ZGVfbG0pKQogICAgICAgICAgICAgICAgCgpgYGAKCgoKYGBge3J9Cm11bHRpcGxlX2xtIDwtIGxtKFJlcHViX2FkdmFudGFnZSB+IFBvcHVsYXRpb24gKyBMb25naXR1ZGUsIGRhdGEgPSBzZW5hdGVfZWxlY3Rpb24pCnRpZHkobXVsdGlwbGVfbG0pCmdsYW5jZShtdWx0aXBsZV9sbSkKYGBgCgoKYGBge3J9CnNlbmF0ZV9lbGVjdGlvbiAlPiUgCiAgcGxvdF9seSh4ID0gfkxvbmdpdHVkZSwgeSA9IH5Qb3B1bGF0aW9uLCB6ID0gflJlcHViX2FkdmFudGFnZSwgCiAgICAgICAgICB0ZXh0ID0gfkNvdW50eSwgaG92ZXJpbmZvID0gInRleHQiKSAlPiUgCiAgYWRkX21hcmtlcnMob3BhY2l0eSA9IC43LCBzaG93bGVnZW5kID0gRikKYGBgCgoK