Skip to content

Instantly share code, notes, and snippets.

@psobczyk
Created October 22, 2019 22:04
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save psobczyk/47a9972a6392e75e1a579259d24b0af1 to your computer and use it in GitHub Desktop.
Save psobczyk/47a9972a6392e75e1a579259d24b0af1 to your computer and use it in GitHub Desktop.
Analysis of polish general elections 2019
# Files with data come from https://wybory.gov.pl/sejmsenat2019/pl/dane_w_arkuszach
require(dplyr)
require(magrittr)
require(tidyr)
require(broom)
require(ggparliament)
# Sejm elections. Could void votes affect results?
okregi <- read.csv2("okregi_sejm.csv", stringsAsFactors = F)
okregi <- okregi %>%
select(Numer.okręgu, Liczba.mandatów)
wyniki <- read.csv2("~/Downloads/wyniki_gl_na_listy_po_okregach_proc_sejm.csv",
stringsAsFactors = F)
# hypothetical situation - void votes go to sld
wyniki <- wyniki %>%
rename(ko = KOALICYJNY.KOMITET.WYBORCZY.KOALICJA.OBYWATELSKA.PO..N.IPL.ZIELONI...ZPOW.601.6.19,
konfederacja = KOMITET.WYBORCZY.KONFEDERACJA.WOLNOŚĆ.I.NIEPODLEGŁOŚĆ...ZPOW.601.5.19,
psl = KOMITET.WYBORCZY.POLSKIE.STRONNICTWO.LUDOWE...ZPOW.601.19.19,
pis = KOMITET.WYBORCZY.PRAWO.I.SPRAWIEDLIWOŚĆ...ZPOW.601.9.19,
lewica = KOMITET.WYBORCZY.SOJUSZ.LEWICY.DEMOKRATYCZNEJ...ZPOW.601.1.19,
mn = KOMITET.WYBORCZY.WYBORCÓW.MNIEJSZOŚĆ.NIEMIECKA...ZPOW.601.15.19) %>%
mutate(lewica = lewica + X..głosów.nieważnych * W.tym.z.powodu.postawienia.znaku..X..obok.nazwiska.dwóch.lub.większej.liczby.kandydatów.z.różnych.list / 100) %>%
gather(komitet, poparcie, ko:mn) %>%
filter(komitet %in% c("ko", "konfederacja", "psl", "pis", "lewica", "mn"))
wyniki <- inner_join(wyniki, okregi)
parliament <- wyniki %>%
group_by(Numer.okręgu, komitet) %>%
do(tidy(t(.$poparcie/(1:.$Liczba.mandatów[1])))) %>%
ungroup() %>%
ungroup() %>%
gather(mandat, poparcie, -Numer.okręgu, -komitet) %>%
mutate(mandat = as.numeric(gsub('X', '', mandat))) %>%
filter(!is.na(poparcie)) %>%
group_by(Numer.okręgu) %>%
mutate(mandaty_w_okregu = max(mandat)) %>%
arrange(Numer.okręgu, desc(poparcie)) %>%
filter(row_number() <= mandaty_w_okregu) %>%
group_by(komitet) %>%
summarise(liczba_mandatow=n())
parliament$colour <- c('#FCA241', '#000000', '#ed1c24', 'yellow', '#073A76', '#1BB100')
parliament$party_short <- paste(c('KO', 'Konf', 'SLD', 'MN', 'PiS', 'PSL'), "-", parliament$liczba_mandatow)
parliament$komitet <- factor(parliament$komitet, levels = c("lewica", 'ko', 'psl', 'mn', 'konfederacja', 'pis'),
ordered = T)
parliament <- arrange(parliament, komitet)
sejm <- parliament_data(election_data = parliament,
parl_rows = 11,
type = 'semicircle',
party_seats = parliament$liczba_mandatow)
ggplot(sejm, aes(x, y, colour = komitet)) +
geom_parliament_seats(size = 3) +
labs(colour="Partia", subtitle = "...głosy nieważne zdobyła Lewica? PiS topnieje do 231 posłów",
title = "Sejm 2019. Co by było gdyby...", caption = "@szychtawdanych") +
theme_ggparliament(legend = TRUE) +
scale_colour_manual(values = parliament$colour, labels = parliament$party_short) +
theme(plot.title = element_text(hjust = 0.5, size = 27),
plot.subtitle = element_text(hjust = 0.5, size = 22),
plot.caption = element_text(size = 14, colour = 'gray80'),
legend.text = element_text(size = 17))
# Files with data come from https://wybory.gov.pl/sejmsenat2019/pl/dane_w_arkuszach
require(dplyr)
require(tidyr)
require(gridExtra)
# could void votes tilt polish senate elections?
okregi_kontestowane_przez_pis <- c(12,75, 92, 95, 96, 100)
senat_pliki <- list.files("wyniki_gl_na_kand_po_obwodach_senat_csv/", full.names = T)
senat_wyniki <- lapply(senat_pliki, function(file){
senat <- read.csv2(file)
senat %>%
group_by(Okręg) %>%
summarise_at(vars(-Symbol.kontrolny, -Kod.TERYT, -Numer,
-Typ.obszaru, -Typ.obwodu, -Siedziba, -Gmina, -Powiat, -Województwo), sum) %>%
mutate(niewaznych_podwojne_skreslenie = W.tym.z.powodu.postawienia.znaku..X..obok.nazwiska.dwóch.lub.większej.liczby.kandydatów) %>%
select(-Komisja.otrzymała.kart.do.głosowania:-Liczba.głosów.ważnych.oddanych.łącznie.na.wszystkich.kandydatów) %>%
gather(kandydat, glosow, - Okręg, -niewaznych_podwojne_skreslenie)
})
bind_rows(senat_wyniki) %>%
group_by(Okręg) %>%
arrange(desc(glosow)) %>%
summarise(niewaznych_podwojne_skreslenie = niewaznych_podwojne_skreslenie[1],
roznica = glosow[1] - glosow[2]) %>%
filter(roznica < niewaznych_podwojne_skreslenie)
png("senat_table.png", height=200, width=520)
df <- bind_rows(senat_wyniki) %>%
group_by(Okręg) %>%
arrange(desc(glosow)) %>%
summarise(`Głosów nieważnych przez podwójne skreślenie` = niewaznych_podwojne_skreslenie[1],
`Przewaga kandydata opozycji` = glosow[1] - glosow[2]) %>%
filter(Okręg %in% okregi_kontestowane_przez_pis)
p <- tableGrob(df, rows = NULL)
grid.arrange(p)
dev.off()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment