Wczoraj przez przypadek natrafiłem na stronę ewybory.eu, o czym zresztą informowałem na Facebooku. Zatem słowo się rzekło, mamy dane to trzeba je pokazać i zobaczyć, co na trzy tygodnie przed wyborami dzieje się w temacie wyborów do Sejmu i Senatu. Komu rośnie, komu spada poparcie, kto jest pod progiem wyborczym a kto nad nim.
Analiza kodu strony wskazuje, że tabela z danymi o wszystkich sondażach umieszczona na http://ewybory.eu/sondaze/ odwołuje do arkusza osadzonego w repozytorium Google.

Także nasz wskaźnik url do strony w kodzie będzie się odwoływał bezpośrednio do tego repozytorium.
library(tidyverse)
library(rvest)
library(lubridate)
url <- "https://docs.google.com/a/ewybory.eu/spreadsheets/d/1AI3DqsQstn4qh_l_IT0ehjArQ2sgJlzkM2aQ5uVqqqs/htmlembed?single=true&gid=474429389&range=a12:r500&widget=false&chrome=false"
Wykorzystując funkcję html_read() z pakietu rvest pobieramy dane. Teraz trzeba je trochę przekształcić, czyli wybrać interesujące nas kolumny z tabeli, dopasować formaty danych i zastanowić się nad okresem, który chcemy przedstawić. Analizę przeprowadzę uwzględniając ostatnie trzy miesiące. Wydaje się, że jest to wystarczający okres, tym bardziej że obecna kampania jest jedną z najkrótszych w historii. Z kalendarzem wyborczym można się zapoznać między innymi tutaj.
# pobieramy tabelę z treści strony
sondaze <- html %>% html_nodes("table") %>% html_table(fill = T) %>% .[[1]]
# wybieramy własciwe kolumny i wycinamy trzy pierwsze wiersze z tabeli
sondaze <- sondaze[4:nrow(sondaze),c(2:4,6,10,14,16,17)]
# okreslamy nagłowki kolumn
colnames(sondaze) <- c("Osrodek","Data","Metoda","Lewica","Koalicja_Obywatelska","Koalicja_Polska","PIS","Konfederacja")
# dane dla trzech ostatnich miesięcy, dodajemy identyfikator roku i zamieniam na format daty
sondaze <- sondaze %>% filter(grepl(".{2}\\.0[7-9]",Data))
sondaze <- sondaze[1:57,]
sondaze$Data <- dmy(paste0(sondaze$Data,".19"))
# zamiana przecinków na kropki i na typ liczbowy w kolumnach z poparciem
for (ncol in 4:8) {
sondaze[,ncol] <- as.numeric(gsub(",",".",sondaze[,ncol],fixed = T))
}
Ok, mamy dane, zatem jak kształtowało się procentowe poparcie dla poszczególnych obozów politycznych (partii) wyrażone w sondażach przeprowadzonych przez różne sondażownie. Aby uchwycić tendencję zmian w wynikach różnych ośrodków badań zastosujemy metodę regresji Loess, która w języku polskim określona jest jako regresja lokalnie ważona. Tworzymy zatem wykres.
sondaze %>%
gather(Partia, Procent, -Osrodek, -Metoda, -Data) %>%
mutate(Partia = factor(Partia, levels = c("Koalicja_Polska","PIS","Lewica","Konfederacja","Koalicja_Obywatelska"))) %>%
ggplot() +
geom_point(aes(x = Data, y = Procent, color = Osrodek), show.legend = TRUE) +
geom_smooth(aes(x = Data, y = Procent, fill = Partia), method = "loess", show.legend = FALSE) +
theme(legend.position = c(0.8,0.2), legend.title = element_text(face = "bold")) +
xlab("Data opublikowania sondażu") + ylab("Procent poparcia") +
facet_wrap(~Partia, scales = "free_y")

I teraz już jest wszystko jasne. Największym wygranym ostatnich trzech miesięcy może czuć się PIS, którego poparcie według krzywej regresji sięga 46%. Drugim w kolejności obozem politycznym, którego poparcie ma również tendencję wzrostową i przekroczyło acz tylko 6% jest Koalicja Polska (PSL, Kukiz’15). Dla Lewicy ostatni sondaż przeprowadzony przez CBOS dużo zmienił, poziom poparcia dla tego obozu politycznego sprowadził do poziomu około 10%. Choć z drugiej strony można by tą wyraźnie odstającą wartość wyeliminować z analizy i wówczas poparcie dla lewicy według krzywej regresji kształtuje się na poziomie 12,2%. Fatalnie wygląda sytuacja Koalicji Obywatelskiej, która praktycznie w całym okresie traciła poparcie, nieznaczną zmianę przynoszą ostatnie sondaże podciągając poparcie do 27,5%. Natomiast sondaże nie dają zbytnio dużych szans Konfederacji, dla której poparcie wciąż jest poniżej progu wyborczego i kształtuje się na poziomie 4%.
Jaką metodą posługują się najczęściej ośrodki badań (sondażownie). Jak wynika z analizy są to przede wszystkim trzy metody:
- CAPI (wywiad osobisty wspomagany komputerowo )
- CATI (wywiad telefoniczny wspomagany komputerowo)
- CAWI (wywiad internetowy wspomagany komputerowo)
sondaze %>%
count(Osrodek, Metoda) %>%
ggplot() +
geom_tile(aes(Metoda, Osrodek, fill = n)) +
scale_fill_gradient(low = "#00FF00", high="#FF0000") +
xlab("Metoda badawcza") + ylab("Ośrodek badawczy")

Ośrodek badawczy | ? | CAPI | CATI | CAWI |
---|---|---|---|---|
Ariadna | – | – | – | 1 |
CBOS | – | 3 | – | – |
Dobra Opinia / PPG | – | 1 | – | – |
Estymator | – | – | 7 | – |
IBRiS | – | – | 12 | – |
IBSP | – | – | 1 | – |
Indicator | 1 | – | – | – |
IPSOS | – | – | 1 | – |
Kantar | – | 3 | 6 | – |
Pollster | – | – | – | 6 |
Social Changes | – | – | – | 15 |
Jak to wyglądało dla naszego przypadku. Najchętniej wykorzystywana jest metoda CATI. W okresie trzech miesięcy została w celu przeprowadzenia badań poparcia dla partii wykorzystana 27 razy, metodę CAWI z kolei zastosowano w 22 przypadkach. Metoda CAWI preferowana jest przede wszystkim przez sondażownię Social Changes oraz Pollster. Metoda CAPI została wykorzystana w siedmiu przypadkach, głównie w badaniach Kantar oraz Centrum Badania Opinii Społecznej (CBOS).
Aktualizacja
Do wyborów już tylko dwa dni. Postanowiłem nie zmieniać metodologii, uwzględnić wszystkie wyniki sondaży, nawet te z wyjątkowo odstającymi wartościami. A zatem jak przedstawia się sytuacja na dwa dni przed wyborami do Sejmu i Senatu w roku 2019. Po kolei (wartości średnie po odrzuceniu 10% najgorszych i najlepszych wyników):
- PSL – Kukiz – utrzymuje w miarę stabilne 6%
- PIS – ostatni tydzień lekka zadyszka wskazująca na 44%
- Lewica – wyraźny wzrost notowań ponad 12%
- Konfederacja – wciąż pod progiem, aczkolwiek końcówka września i październik przynoszą zdecydowaną poprawę
- Koalicja Obywatelska – tutaj zdecydowany zjazd poniżej 27%, stąd wniosek że Lewica zyskuje kosztem wyborców, którzy jeszcze nie tak dawno głosowali na Platformę Obywatelską

Metody, którymi posługiwały się sondażownie nie uległy zmianom.
