Presidentinvaalit 2024 I kierros Helsingissä: ehdokkaiden kannatus äänestysalueittain ja naapuriäänestysalueittain

data analysis
R
election
vaalit
presidentinvaalit2024
avoin data
open data
Tekijä
Julkaistu

29. tammikuuta 2024

Oikeusministeriön vaalien tulospalvelusta on ladattavissa ensimmäisen kierroksen tulosdatat. Alla kartta jossa kunnan väri kertoo suosituimman ehdokkaan ja siirtämällä osoittimen äänestysalueen päälle näet kuvan ehdokkaiden kannatuksesta sekä kyseisellä äänestysalueella että sen naapureissa. Äänestysalueiden rajat https://kartta.hel.fi/avoindata/2024_PKS_aanestysaluejako.zip.

[/kode]
if (!file.exists("./2024-pressa-kierros-I-helsinki.RData")){
library(tidyverse)
library(leaflet)
library(htmlwidgets)
library(glue)
library(sf)

# 2024
flie <- "tpv-2024_1_ehd_maa.csv.zip"
urli <- "https://tulospalvelu.vaalit.fi/TPV-2024_1/tpv-2024_1_ehd_maa.csv.zip"
download.file(urli, flie)
unzip(zipfile = flie, exdir = "./")
# fs::dir_ls(tmpdir)
dat <- read_csv2("./tpv-2024_1_aea_maa.csv", col_names = FALSE)
dat23 <- dat %>% 
  filter(X3 == "091") %>% 
    # äänimäärä ja ehdokasnumero kokonaisluvuiksi
  mutate(X3 = as.integer(X3),
         X35 = as.integer(X35),
         X38 = as.integer(X38),
         tunnus = gsub("^0+", "", X5)
         ) %>% 
  # vaalipiirit veks
  filter(!is.na(X3)) %>% 
  # Merkistöenkoodaukset
  mutate(
    X16 = iconv(x = X16, from = "Windows-1252", to = "UTF-8"),
    X17 = iconv(x = X17, from = "Windows-1252", to = "UTF-8"),
    X19 = iconv(x = X19, from = "Windows-1252", to = "UTF-8"),
    X18 = iconv(x = X18, from = "Windows-1252", to = "UTF-8"),
    ) %>% 
  select(X5,tunnus,X16,X18,X19,X35) %>% #print(n = 100)
  mutate(ehdokas = paste0(X18," ", X19)) %>%  
  group_by(tunnus) %>% 
  mutate(osuus = round(X35 / sum(X35) * 100,1)) %>% 
  arrange(desc(osuus)) %>% 
  mutate(rank = 1:n()) %>% 
  ungroup() %>% 
  select(tunnus,X16,ehdokas,X35,osuus,rank)

flie <- "2024_PKS_aanestysaluejako.zip"
urli <- "https://kartta.hel.fi/avoindata/2024_PKS_aanestysaluejako.zip"
download.file(urli, flie)
unzip(zipfile = flie, exdir = "./")
fs::dir_ls("./", recurse = T) %>% 
  .[grepl("shp", .)] -> shp_path 
hel_aan <- st_read(dsn = shp_path, quiet = TRUE)
hel_aan <- st_transform(hel_aan, crs = 3067) %>% 
  # kalasatama
  mutate(nimi = ifelse(nimi == "KALASTATAMA A", "KALASATAMA A", nimi),
         nimi = ifelse(nimi == "KALASTATAMA B", "KALASATAMA B", nimi)
         )


levelit_ehdokas <- dat23 %>% 
  group_by(ehdokas) %>%  
  summarise(X35 = sum(X35)) %>%  
  arrange(desc(X35))  %>% 
  pull(ehdokas)
  
dat_kartta <- right_join(hel_aan, dat23)

# tehdään png-kuvat labeleihin
# fs::dir_create("../../images/png_labs_vaalit2023")
kuntanimet <- unique(dat23$tunnus)
for (i in seq(kuntanimet)){
  print(paste0(i,"/",length(kuntanimet)))
  
  this_muni <- hel_aan %>% filter(tunnus == kuntanimet[i])
  this_nimi <- dat23$X16[i]
  
  naapurikunnat <- sf::st_intersection(hel_aan,this_muni)  %>%
    sf::st_drop_geometry() %>% 
    count(tunnus) %>% pull(tunnus)
  if (length(naapurikunnat) == 0) next()
  
  naapurikunnat_shape <- hel_aan %>% 
    filter(tunnus %in% naapurikunnat)
  # naapurikunnat_nimet <- naapurikunnat_shape$nimi
  
  dat_tmp <- dat23[dat23$tunnus %in% naapurikunnat,]
  
  levelit_ehdokas <- dat_tmp %>% filter(tunnus == kuntanimet[i]) %>% arrange(desc(X35))  %>% pull(ehdokas)
  
  dat_tmp$ehdokas <- factor(dat_tmp$ehdokas, 
                            levels = levelit_ehdokas)
  aluenimet <- unique(dat_tmp[dat_tmp$tunnus %in% naapurikunnat,]$X16)
  
  levelit_kunta <- c(this_nimi, aluenimet[!aluenimet %in% this_nimi]) |> rev()
  dat_tmp$X16 <- factor(dat_tmp$X16, levels = levelit_kunta)
  naapurikunnat_shape$nimi <-  factor(naapurikunnat_shape$nimi, levels = toupper(levelit_kunta)) |> rev()

p <- ggplot(data = dat_tmp,
       aes(x = osuus, y =X16, fill = X16)) + 
    geom_col() +
  geom_text(aes(x = 15, label = paste0(osuus, "%")), family = "Space Mono", size = 2.5) +
  facet_wrap(~ehdokas) +
  # hrbrthemes::scale_fill_ipsum() + #scale_fill_brewer(palette = "Set1") +
  hrbrthemes::theme_ipsum_rc(base_size = 9, grid = "XY", plot_title_size = 18, strip_text_size = 8,
                             base_family = "Space Mono") +
  theme(legend.position = "none",
        plot.margin = unit(c(1,1,1,1), "mm"), 
        legend.key.size = unit(4, "mm"),
        plot.background = element_rect(fill = "transparent", color = NA),
        panel.background = element_rect(fill = "transparent", color = NA)) +
  labs(y = NULL, x = "kannatus (%)") +
  theme(panel.spacing = unit(0.1, "mm"))

p1 <- ggplot(naapurikunnat_shape, aes(label = nimi, fill = nimi)) + geom_sf() + 
  geom_sf_text(family = "Space Mono", size = 2.5) +
  hrbrthemes::theme_ipsum_rc(base_size = 9, grid_col = "white", 
                             plot_title_size = 18, 
                             base_family = "Space Mono") +
  theme(axis.title.x = element_blank(),
        axis.title.y = element_blank(),
        axis.text.x = element_blank(),
        axis.text.y = element_blank(),
        legend.position = "none")

pp <- patchwork::wrap_plots(p,p1, widths = c(0.55,.45)) + patchwork::plot_annotation(
  title = paste0(this_nimi, " ja naapurialueet"), 
  subtitle = "Ehdokkaat järjestetty äänestysalueen\nkokonaisäänimäärän mukaan", 
  theme = hrbrthemes::theme_ipsum_rc(base_size = 9, grid_col = "white", 
                             plot_title_size = 18, 
                             base_family = "Space Mono")
)

# p
ggsave(filename = glue("./png_labs/{kuntanimet[i]}.png"), plot = pp, width = 9, height = 7, dpi = 120)
}

save.image(file = "./2024-pressa-kierros-I-helsinki.RData")
}

library(tidyverse)
library(leaflet)
library(htmlwidgets)
library(glue)
library(sf)

load(file = "2024-pressa-kierros-I-helsinki.RData")

dat_alue <- dat_kartta %>%   
  # lasketaan kuntakohtaiset summat
  group_by(tunnus) %>% 
  filter(osuus == max(osuus, na.rm = FALSE)) %>%
  ungroup() %>% 
  select(tunnus,X16,ehdokas,osuus,X35,rank) %>% 
  sf::st_transform(4326)

# puoluekohtaiset kannatukset

library(tidyverse)
library(leaflet)
library(htmlwidgets)
library(glue)
library(sf)
pal <- leaflet::colorFactor(palette = "Set1", domain = factor(dat_alue$ehdokas))

labels <- sprintf(
  '<div class="card" style="width: auto;">
  <div class="card-body">
    <img src ="png_labs/%s.png">
  </div>
</div>',
dat_alue$tunnus
) %>% lapply(htmltools::HTML)


leaflet(dat_alue
        ) %>% 
  addTiles(options = tileOptions(opacity = .4)) %>% 
  # addProviderTiles(provider = providers$CartoDB.Positron) %>% 
  # leaflet::setView(lng = 25.25,lat = 61.742, zoom = 4) %>% 
  addPolygons(fillColor = ~pal(factor(ehdokas)),
              color = "white",
              weight = 1,
              opacity = 1,
              dashArray = "3",
              fillOpacity = 0.4,
              highlight = highlightOptions(
                weight = 2,
                color = "#666",
                dashArray = "",
                fillOpacity = 0.4,
                bringToFront = TRUE),
              label = labels,
              labelOptions = labelOptions(opacity = .7,
                                          style = list("font-weight" = "normal",
                                                       "font-family" = "Courier New",
                                                       "padding" = "0px"),
                                          textsize = "12px",
                                          direction = "auto")
  ) %>% 
  addLegend(pal = pal, values = ~ehdokas, opacity = 0.7, title = "Kunnan suosituin ehdokas",
            position = "bottomright") %>% 
  leaflet.extras::addFullscreenControl()

Uudelleenkäyttö

Viittaus

BibTeX-viittaus:
@online{kainu2024,
  author = {Kainu, Markus},
  title = {Presidentinvaalit 2024 I kierros Helsingissä: ehdokkaiden
    kannatus äänestysalueittain ja naapuriäänestysalueittain},
  date = {2024-01-29},
  url = {https://markuskainu.fi/posts/2024-01-29-presidentinvaalit-helsinki/},
  langid = {fi}
}
Viitatkaa tähän teokseen seuraavasti:
Kainu, Markus. 2024. “Presidentinvaalit 2024 I kierros Helsingissä: ehdokkaiden kannatus äänestysalueittain ja naapuriäänestysalueittain.” January 29, 2024. https://markuskainu.fi/posts/2024-01-29-presidentinvaalit-helsinki/.