☕ Café post-electoral

encuestas
el país
la silla vacia
ajiaco
pronósticos
elecciones

Pronósticos vs resultados electorales

Autor/a
Afiliación

Recetas Electorales

Análisis independiente

Fecha de publicación

31 de mayo de 2022

Fecha de última modificación

20 de junio de 2022

“Everything is obvious –once you know the answer”
–Duncan Watts

Lista la primera vuelta: Gustavo Petro obtuvo 40% de la votación, seguido por la sorpresa de la jornada Rodolfo Hernández con 28%. Federico Gutierrez obtuvo 25%, y Sergio Fajardo 4%.

Aplicando la fórmula de 🥇 Recetas Abiertas, todas las recetas que ponderaron más el pasado inmediato tuvieron relativamente un mejor desempeño. De las 8 recetas incluídas en el Sancocho 2022 a las que mejor les fue: En primera vuelta, un promedio simple sin ponderacion de las encuestas y La Silla Vacia1 tuvieron el mejor desempeño, y en segunda vuelta un modelo ensamble de @PoliticaConDato.

ImportanteCon base en los resultados del escrutinio y solo teniendon en cuenta lo pronósticos abiertos y documentados, La Silla Vacia hizo el mejor pronóstico en la 1era vuelta y @PoliConDato en la 2da vuelta
Ver código
library(tidyverse)
library(plotly)

# Parametros ####
shape_cafe_2022 <- c(
  "Encuestas" = 6,
  "@PoliticaConDato" = 15,
  "@ColombiaRisk" = 17,
  "Simple 2022" = 15,
  "Mixto 2022" = 16,
  "Ajiaco" = 5,
  "@JorgeGalindo El Pais" = 16,
  "La Silla Vacia" = 6,
  "@calc_electoral" = 1,
  "Resultado" = NULL
  )

colors_cafe_2022 <- c(
  "Encuestas" = "purple3",
  "@PoliticaConDato" = "blue",
  "@ColombiaRisk" = "gold2",
  "Simple 2022" = "orangered",
  "Mixto 2022" = "orangered",
  "Ajiaco" = "orangered",
  "@JorgeGalindo El Pais" = "green4",
  "La Silla Vacia" = "darkturquoise",
  "@calc_electoral" = "royalblue2",
  "Resultado" = "#ff4800"
  )

# Cafe plot ####
cafe_2022_plot <- readr::read_csv("sancocho_resultados.csv") %>%
  dplyr::filter(!is.na(nombres), nombres!="Voto en blanco") %>%
  dplyr::mutate(nombres = factor(nombres, levels=c("Gustavo Petro","Rodolfo Hernandez","Federico Gutierrez","Sergio Fajardo"))) %>%
  ggplot(aes(x=nombres %>% reorder(desc(nombres)),y=pronostico))+
  geom_point(data=. %>% dplyr::filter(plato!="Resultado"),
             aes(shape=plato,
                 text = paste("Estimado por: ", plato,
                              "\nValor estimado: ",paste(round(pronostico, digits = 2)," %")),
                 color=plato),
             size=4,
             position = position_dodge(0.5),
             show.legend = FALSE)+
  geom_errorbar(data=. %>% dplyr::filter(plato!="Resultado"),
              aes(ymax=high,ymin=low,
                  color=plato),
              position = position_dodge(0.5),width=0.3, show.legend = FALSE)+
  # Resultados
  geom_col(data=. %>% dplyr::filter(plato=="Resultado"),
           aes(text = paste0("Resultado ",nombres,": ", paste(round(pronostico, digits = 2)," %"))),
           alpha=0.4, fill="#ff4800", show.legend = FALSE)+
  theme(legend.position = "none",
        legend.title = element_blank(),
        legend.key=element_blank(),
        legend.text=element_text(size=11),
        strip.text.x = element_text(size = 8),
        axis.text=element_text(size=11),
        axis.ticks.x=element_blank(),
        axis.text.x=element_blank(),
        panel.background=element_rect(fill="white",color="white"))+
  labs(x=NULL,y="\n% Votos validos vs % Votos estimados",
       title="Cafe post electoral 2022 - Primera vuelta",
       subtitle="Pronósticos (puntos) vs Resultados (barra)",
       caption="\nFuente: www.recetas-electorales.com")+
  scale_shape_manual(values=shape_cafe_2022)+
  scale_color_manual(values=colors_cafe_2022)+
  coord_flip()

# ggplotly ####
ggplotly(cafe_2022_plot, tooltip = "text") %>%
   layout(title = list(text = paste0('Cafe post electoral 2022 - Primara vuelta',
                                    '<br>',
                                    '<sup>',
                                     'Pronosticos (puntos) vs Resultados (barra)','</sup>')))

Café post electoral 2022 - Primera vuelta

Ver código
library(tidyverse)
library(plotly)

# parametros ####
shape_cafe_2022 <- c(
  "Encuestas" = 6,
  "@PoliticaConDato" = 15,
  "@ColombiaRisk" = 17,
  "Simple 2022" = 15,
  "Mixto 2022" = 16,
  "Ajiaco" = 5,
  "@JorgeGalindo El Pais" = 16,
  "La Silla Vacia" = 6,
  "@calc_electoral" = 1,
  "@Scalvo25" = 18,
  "Resultado" = NULL
  )

colors_cafe_2022 <- c(
  "Encuestas" = "purple3",
  "@PoliticaConDato" = "blue",
  "@ColombiaRisk" = "gold2",
  "Simple 2022" = "orangered",
  "Mixto 2022" = "orangered",
  "Ajiaco" = "orangered",
  "@JorgeGalindo El Pais" = "green4",
  "La Silla Vacia" = "darkturquoise",
  "@calc_electoral" = "royalblue2",
  "@Scalvo25" = "gold2",
  "Resultado" = "#ff4800"
  )
library(tidyverse)
library(lubridate)

# Encuestas 2022 ####
encuestas_ulr_2022 <- "https://raw.githubusercontent.com/nelsonamayad/Elecciones-presidenciales-2022/main/Encuestas%202022/encuestas_2022.csv"
encuestas_2022 <- readr::read_csv(encuestas_ulr_2022)

# 0. Resultado 2da vuelta ####
resultado_2da_vuelta_2022 <- tribble(~pronostico,~nombres,
                     50.44,"Gustavo Petro",
                     47.31,"Rodolfo Hernandez") %>%
  dplyr::mutate(plato = "Resultado")

# 1. Base: promedio de las encuestas ####
encuestas_2da_vuelta_2022 <- encuestas_2022 %>%
  # Filter despues de consultas 
  dplyr::filter(fecha >= lubridate::as_date("2022-05-29")) %>%
  # Seleccionar candidatos que encabezan las encuestas
  dplyr::select(n,fecha,contains(c("petro","hernandez")),blanco,otros) %>%
  # Pivotear los datos
  tidyr::pivot_longer(cols = c(contains("_"),"blanco","otros"),
                      names_to = "candidato", values_to = "int_voto") %>%
  # Promedios
  dplyr::group_by(candidato) %>%
  dplyr::summarise(pronostico = mean(int_voto,na.rm=TRUE),
                   high = max(int_voto,na.rm=TRUE),
                   low = min(int_voto,na.rm=TRUE)) %>%
  dplyr::mutate(plato= paste0("Encuestas"),
                nombres = case_when(candidato=="rodolfo_hernandez" ~ "Rodolfo Hernandez",
                                    candidato=="gustavo_petro" ~ "Gustavo Petro",
                                    candidato=="blanco" ~ "Voto en blanco",
                                    candidato=="otros" ~ "Otros candidatos",
                                    )
                ) 

# 4. El País ####
elpais_2da_2022 <- readr::read_csv("https://raw.githubusercontent.com/JorgeGalindo/co-elect-2022/main/promedio_evol_2av.csv") %>% 
  dplyr::slice_tail(n=1) %>%
  dplyr::select(gustavo_petro, rodolfo_hernandez) %>%
  tidyr::pivot_longer(cols = everything(),names_to = "candidato",values_to = "pronostico") %>%
  dplyr::mutate(plato= "@JorgeGalindo El Pais",
                nombres = case_when(candidato=="rodolfo_hernandez" ~ "Rodolfo Hernandez",
                                    candidato=="gustavo_petro" ~ "Gustavo Petro"
                                    )
                ) 
  
# 5. La Silla Vacia ####
lsv_2022_2da <- tribble(~pronostico,~nombres,
                     47.2,"Gustavo Petro",
                     46.5,"Rodolfo Hernandez",
                     4,"Voto en blanco") %>%
  dplyr::mutate(plato = "La Silla Vacia")

# 6. PoliticaConDato ####
politicacondato_2da_2022 <- tribble(~pronostico,~nombres,~high,~low,
                     48.3,"Gustavo Petro",54.1,44.8,
                     47.3,"Rodolfo Hernandez",50.7,41.4) %>%
  dplyr::mutate(plato = "@PoliticaConDato")

# 8. Calculo Electoral ####
calculo_electoral_2da_2022 <- tribble(~nombres,~pronostico,~low,~high,
                     "Gustavo Petro",48,NA,NA,
                     "Rodolfo Hernandez",47.3,NA,NA
                     ) %>%
  dplyr::mutate(plato = "@calc_electoral")
  
# 9 Sergio Calvo
sergio_calvo_2da_2022 <-  tribble(~nombres,~pronostico,~low,~high,
                     "Gustavo Petro",48.19,50.83,44.36,
                     "Rodolfo Hernandez",47.69,53.98,40.24
                     ) %>%
  dplyr::mutate(plato = "@Scalvo25")


# Preparar cafe 2da vuelta ####
cafe2022_2da_vuelta <- dplyr::bind_rows(
                             resultado_2da_vuelta_2022,
                             encuestas_2da_vuelta_2022,
                             elpais_2da_2022,
                             lsv_2022_2da,
                             politicacondato_2da_2022,
                             sergio_calvo_2da_2022,
                             calculo_electoral_2da_2022
                             ) %>%
  dplyr::select(plato,nombres,pronostico,high,low) %>%
  dplyr::mutate(nombres = factor(nombres, levels=c("Gustavo Petro","Rodolfo Hernandez")),
                plato = factor(plato,levels = c("Resultado","@JorgeGalindo El Pais","La Silla Vacia","@PoliticaConDato","@calc_electoral","@Scalvo25","Encuestas"))) 

# Cafe 2nda vuelta ####
cafe2022_2da_vuelta_plot <- cafe2022_2da_vuelta %>%
  dplyr::filter(!str_detect(nombres,"Blanco|Otros"),!is.na(nombres)) %>%
  ggplot(aes(x=nombres %>% reorder(desc(nombres)),y=pronostico))+
  geom_point(data=. %>% dplyr::filter(plato!="Resultado"),
             aes(shape=plato,
                 text = paste('Candidato: ', nombres,
                              '<br>Estimacion: ', round(pronostico, digits=2),
                              '<br>Cocinero: ',plato),
                color=plato),
             size=4,
             position=position_dodge(0.5))+
  geom_errorbar(aes(color=plato,ymax=high,ymin=low),position = position_dodge(0.5),width=0.5, show.legend = FALSE)+
  # Resultados
  geom_col(data=. %>% dplyr::filter(plato=="Resultado"),
           aes(text = paste0("Resultado ",nombres,": ", paste(round(pronostico, digits = 2)," %"))),
           alpha=0.4, fill="cyan", show.legend = FALSE)+
  theme(legend.position = "none",
        legend.title = element_blank(),
        legend.key=element_blank(),
        legend.text=element_text(size=11),
        strip.text.x = element_text(size = 8),
        axis.text=element_text(size=11),
        axis.ticks.x=element_blank(),
        axis.text.x=element_blank(),
        panel.background=element_rect(fill="white",color="white"))+
  labs(x=NULL,y="\n% votos pronosticados/estimados por candidato",
       title="Cafe post electoral 2022",
       subtitle="Pronosticos y promedios para la 2da vuelta 2022",
       caption="\nFuente: Cálculos www.recetas-electorales.com")+
  #scale_y_continuous(limits = c(30,60))+
  scale_color_manual(values=colors_cafe_2022)+
  scale_shape_manual(values=shape_cafe_2022)+
  coord_flip()

# ggplotly ####
ggplotly(cafe2022_2da_vuelta_plot, tooltip = "text") %>%
   layout(title = list(text = paste0('Cafe post electoral 2022 - Segunda vuelta',
                                    '<br>',
                                    '<sup>',
                                     'Pronosticos (puntos) vs Resultados (barra)','</sup>')))

Café post electoral 2022 - Segunda vuelta

¿Sirvió el 🚦 de encuestadoras de La Silla Vacía?

El semáforo es una evaluación ex ante del desempeño de las encuestadoras basado en algunos atributos deseables, como la transparencia de publicación y la precisión en pasadas elecciones. Fue un insumo también para el ejercicio de promedios ponderados de @JorgeGalindo.

¿Qué poder predictivo tuvo el semáforo? ¿Realmente las encuestadoras con mejor puntaje fueron las más precisas? Usando la misma fórmula de evaluación de las recetas, abajo se muestra la relación entre el score de cada encuestadora y el semáforo para la primera y segunda vuelta.

El semáforo fue un muy buen predictor de los sesgos polling house excepto para las encuestadoras más precisas: AtlasIntel en primera vuelta y GAD3 en segunda vuelta. Es claro que el semáforo le da un puntaje muy bajo a las mejores encuestadoras y muy alto a otras que tal vez no lo merecen.

En el futuro, el semáforo podría tener en cuenta que hay mucha variabilidad interna entre las encuestas que hace cada encuestadora.

Ver código
library(tidyverse)
library(lubridate)
library(RColorBrewer)
library(plotly)
library(ggrepel)

# Encuestas ####
encuestas_ulr_2022 <- "https://raw.githubusercontent.com/nelsonamayad/Elecciones-presidenciales-2022/main/Encuestas%202022/encuestas_2022.csv"
encuestas_2022 <- readr::read_csv(encuestas_ulr_2022)

# Parametros ####
shape_entrada_2022 <- c(22,4,23,16,17,21,12,5,18,19)
colors_entrada_2022 <- c(
  "Alejandro Gaviria" = rgb(50,205,50, maxColorValue = 255),
  "Sergio Fajardo" = rgb(31,161,46, maxColorValue = 255),
  "Juan Manuel Galan" = rgb(213,48,62, maxColorValue = 255),
  "Ingrid Betancourt" = rgb(14,185,11, maxColorValue = 255),
  "Alex Char" = rgb(228,0,120, maxColorValue = 255),
  "David Barguil" = rgb(0,97,169, maxColorValue = 255),
  "Enrique Peñalosa" = rgb(0,139,139, maxColorValue = 255),
  "Federico Gutierrez" = rgb(0,0,255, maxColorValue = 255),
  "Oscar I. Zuluaga" = rgb(30,144,255, maxColorValue = 255),
  "Gustavo Petro" = rgb(128,0,128, maxColorValue = 255),
  "Rodolfo Hernandez" = rgb(247,190,10, maxColorValue = 255),
  "Voto en blanco" = rgb(32,33,36, maxColorValue = 255)
  )
# Resultado 1era vuelta ####
resultado_1era_vuelta_2022 <- tribble(~pronostico,~nombres,
                     39.84,"Gustavo Petro",
                     23.64,"Federico Gutierrez",
                     4.13,"Sergio Fajardo",
                     27.82,"Rodolfo Hernandez") %>%
  dplyr::mutate(plato = "Resultado")

# Encuestadoras ####
semaforo_1era_2022 <- encuestas_2022 %>%
  dplyr::select(n,fecha,encuestadora,contains("_"), blanco,otros,muestra,merror=margen_error) %>%
  tidyr::pivot_longer(cols = c(contains("_"),"blanco","otros"),
                      names_to = "candidato", values_to = "int_voto") %>% 
  dplyr::mutate(e_max = int_voto + merror,
                e_min = int_voto - merror,
                fecha = lubridate::as_date(fecha),
                nombres = case_when(
                                    candidato=="sergio_fajardo" ~ "Sergio Fajardo",
                                    candidato=="ingrid_betancourt" ~ "Ingrid Betancourt",
                                    candidato=="federico_gutierrez" ~ "Federico Gutierrez",
                                    candidato=="rodolfo_hernandez" ~ "Rodolfo Hernandez",
                                    candidato=="gustavo_petro" ~ "Gustavo Petro"
                                    ) %>%
                  factor(),
                order_colors = as.numeric(nombres)) %>%
    dplyr::filter(between(lubridate::as_date(fecha),
                        #Start
                        lubridate::as_date("2022-03-13"),
                        #End
                        lubridate::as_date("2022-05-28")),
                  !is.na(nombres)) %>%
  dplyr::group_by(nombres,encuestadora)  %>%
  dplyr::summarize(promedio_encuestadora = mean(int_voto, na.rm=TRUE),
                max_encuestadora = max(int_voto, na.rm=TRUE),
                min_encuestadora = min(int_voto, na.rm=TRUE)) %>%
  dplyr::select(pronostico=promedio_encuestadora,high=max_encuestadora,low=min_encuestadora,plato=encuestadora) %>%
  # Join resultados 
  dplyr::left_join(resultado_1era_vuelta_2022 %>%
                     dplyr::select(Resultado=pronostico,nombres),
                   by="nombres") %>%
  # Distancia media pronostico-resultado
  dplyr::mutate(evaluacion = abs(Resultado  - pronostico)) %>%
  dplyr::group_by(plato) %>% 
  dplyr::summarize(score = sum(evaluacion, na.rm = TRUE)) %>%
  # Join semaforo
  dplyr::left_join(tribble(~plato,~semaforo,
                           "Invamer",10,
                           "CNC",8.1,
                           "Guarumo",7.2,
                           "TYSE",5.7,
                           "YanHaas",5.2,
                           "CELAG",4.7,
                           "AtlasIntel",3.5,
                           "MassiveCaller",2.5
                           ),
                   by="plato") %>%
  # Plot
  ggplot(aes(x=semaforo,y=score))+
  geom_point(data=. %>% dplyr::filter(plato!="Resultado"),
             aes(
               text = paste("Encuestadora: ", plato,
                              "\nScore Recetas Electorales: ", round(score, digits = 2),
                              "\nPuntaje Semaforo La Silla Vacia: ", semaforo),
               color=plato, fill=plato, shape=plato),
             size=4,
             show.legend = FALSE)+
  geom_text_repel(aes(label=plato))+
  geom_smooth(method="lm")+
  theme(legend.position = "none",
        legend.title = element_blank(),
        legend.key=element_blank(),
        legend.text=element_text(size=11),
        strip.text.x = element_text(size = 8),
        axis.text=element_text(size=11),
        axis.ticks.x=element_blank(),
        axis.text.x=element_blank(),
        panel.background=element_rect(fill="white",color="white"))+
  labs(x="Puntaje Semáforo La Silla Vacía",y="Score evaluación resultados",
       caption="\nFuente: Cálculos www.recetas-electorales.com basados en La Silla Vacía")+
  scale_shape_manual(values=shape_entrada_2022)

# Ggplotly ####
ggplotly(semaforo_1era_2022, tooltip = "text")

Café post electoral: Evaluación del semáforo de La Silla Vacía

Ver código
library(tidyverse)
library(lubridate)
library(RColorBrewer)
library(ggrepel)

# Resultado 1era vuelta ####
resultado_2da_vuelta_2022 <- tribble(~pronostico,~nombres,
                     50.44,"Gustavo Petro",
                     47.31,"Rodolfo Hernandez") %>%
  dplyr::mutate(plato = "Resultado")

# Encuestadoras ####
semaforo_2da_2022 <- encuestas_2022 %>%
  dplyr::select(n,fecha,encuestadora,contains("_"), blanco,otros,muestra,merror=margen_error) %>%
  tidyr::pivot_longer(cols = c(contains("_"),"blanco","otros"),
                      names_to = "candidato", values_to = "int_voto") %>% 
  dplyr::mutate(e_max = int_voto + merror,
                e_min = int_voto - merror,
                fecha = lubridate::as_date(fecha),
                nombres = case_when(
                                    candidato=="rodolfo_hernandez" ~ "Rodolfo Hernandez",
                                    candidato=="gustavo_petro" ~ "Gustavo Petro"
                                    ) %>%
                  factor(),
                order_colors = as.numeric(nombres)) %>%
  dplyr::filter(between(lubridate::as_date(fecha),
                        #Start
                        lubridate::as_date("2022-05-29"),
                        #End
                        lubridate::as_date("2022-06-20")),
                  !is.na(nombres)) %>%
  dplyr::group_by(nombres,encuestadora)  %>%
  dplyr::summarize(promedio_encuestadora = mean(int_voto, na.rm=TRUE),
                max_encuestadora = max(int_voto, na.rm=TRUE),
                min_encuestadora = min(int_voto, na.rm=TRUE)) %>%
  dplyr::select(pronostico=promedio_encuestadora,high=max_encuestadora,low=min_encuestadora,plato=encuestadora) %>%
  # Join resultados 
  dplyr::left_join(resultado_2da_vuelta_2022 %>%
                     dplyr::select(Resultado=pronostico,nombres),
                   by="nombres") %>%
  # Distancia media pronostico-resultado
  dplyr::mutate(evaluacion = abs(Resultado  - pronostico)) %>%
  dplyr::group_by(plato) %>% 
  dplyr::summarize(score = sum(evaluacion, na.rm = TRUE)) %>%
  # Join semaforo
  dplyr::left_join(tribble(~plato,~semaforo,
                           "Invamer",10,
                           "CNC",7.1,
                           "GAD3",7,
                           "Guarumo",10,
                           "TYSE",5.5,
                           "YanHaas",5.3,
                           "CELAG",5.1,
                           "AtlasIntel",7.5,
                           "MassiveCaller",3.5
                           
                           ),
                   by="plato") %>%
  # Plot
  ggplot(aes(x=semaforo,y=score))+
  geom_point(data=. %>% dplyr::filter(plato!="Resultado"),
             aes(
               text = paste("Encuestadora: ", plato,
                              "\nScore Recetas Electorales: ", round(score, digits = 2),
                              "\nPuntaje Semaforo La Silla Vacia: ", semaforo),
               color=plato, fill=plato, shape=plato),
             size=4,
             show.legend = FALSE)+
  geom_text_repel(aes(label=plato))+
  geom_smooth(method="lm")+
  theme(legend.position = "none",
        legend.title = element_blank(),
        legend.key=element_blank(),
        legend.text=element_text(size=11),
        strip.text.x = element_text(size = 8),
        axis.text=element_text(size=11),
        axis.ticks.x=element_blank(),
        axis.text.x=element_blank(),
        panel.background=element_rect(fill="white",color="white"))+
  labs(x="Puntaje Semáforo La Silla Vacía",y="Score evaluación resultados",
       caption="\nFuente: Cálculos www.recetas-electorales.com basados en La Silla Vacía")+
  scale_shape_manual(values=shape_entrada_2022)

# ggplotly ####
ggplotly(semaforo_2da_2022, tooltip = "text")

Café post electoral: Evaluación del semáforo de La Silla Vacía en 2da vuelta

Ñapa del trabajo con Linterna Verde

Gracias al equipo de Linterna Verde, fue posible analizar algunas de las más populares encuestas hechas en Twitter sobre las elecciones.

Estas encuestas son un reflejo directo de lo que dicen y piensan los seguidores de estas populares cuentas, por lo que se espera que tengan una distancia abismal con la realidad. Al final del día, es mejor tener una muestra bien tomada de 2 000 ciudadanos que cientos de miles de respuestas digitales que representan poco más que el perfil de seguidores de una cuenta de Twitter.

Abajo se muestra algo que faltó en el primer análisis: el resultado de las elecciones. Además, gracias a la gráfica interactiva, se puede ver cada uno de los puntos en detalle.

Ver código
# Packages ####
library(ggdist)
library(ggridges)
library(tidyverse)
library(RColorBrewer)
library(gganimate)
library(plotly)

# Load data ####
twitter_polls <- readr::read_csv("linterna_verde/df_polls_procesados.csv")
twitter_posts <- readr::read_csv("linterna_verde/df_posts_procesados.csv")

# Wrangle ####
twitter_linterna <- 
  twitter_polls %>%
  # Join handle and name
  dplyr::inner_join(twitter_posts %>%
                     dplyr::select(twitter_id,post_id,name,handle,followers), by=c("status_id"="post_id")) %>%
  # Count choices in each poll
  dplyr::group_by(poll_id) %>%
  dplyr::mutate(poll_id_simple = cur_group_id()) %>%
  dplyr::ungroup() %>%
  dplyr::group_by(poll_id_simple) %>%
  dplyr::mutate(poll_choices = n()) %>%
  # Keep same choices: All 4 candidates to the 1st round
  dplyr::filter(poll_choices==4, label_estandar %in% c("Gustavo Petro","Federico Gutiérrez","Rodolfo Hernández","Sergio Fajardo")) %>%
  # Create percentage poll results
  dplyr::mutate(result = 100*votes/sum(votes) %>% round(digits=1),
                poll_responses = sum(votes)) %>%
  dplyr::mutate(label_estandar = factor(label_estandar, levels = c("Gustavo Petro","Federico Gutiérrez","Rodolfo Hernández","Sergio Fajardo"))) %>%
  dplyr::ungroup()

# Result 1: Twitter vs La realidad ####
twitter_vs_realidad <- 
  twitter_linterna %>%
  dplyr::mutate(label_estandar = case_when(str_detect(label_estandar,"Rodolfo") ~ "Rodolfo Hernandez",
                                           str_detect(label_estandar,"Fede")    ~ "Federico Gutierrez",
                                           str_detect(label_estandar,"Fajardo") ~ "Sergio Fajardo",
                                           str_detect(label_estandar,"Petro")   ~ "Gustavo Petro")) %>%
  dplyr::mutate(label_estandar = factor(label_estandar, levels=c("Gustavo Petro","Federico Gutierrez","Rodolfo Hernandez","Sergio Fajardo"))) %>%
  # PLOT
  ggplot(aes(x=label_estandar %>% reorder(desc(label_estandar)),y=result))+
  coord_flip()+
  geom_hline(yintercept = c(0,10,20,30,40,50,60,70,80,90,100),alpha=0.4, linetype="dashed")+
  geom_boxplot(aes(fill=label_estandar),alpha=0.5, show.legend = FALSE)+
  # Twitter
  geom_point(aes(size=poll_responses,
                 text=paste("Cuenta:", handle,
                            "<br>Nombre:", name,
                            "<br>Seguidores:", followers,
                            "<br>Resultado:", paste(round(result, digits = 2)," %")),
                 color=label_estandar), alpha=0.4,shape=19, position = "jitter", show.legend = FALSE) +
  # Resultados
  geom_point(data =  readr::read_csv("sancocho_resultados.csv")  %>% 
               dplyr::select(plato,label_estandar=nombres,result=pronostico) %>%
               dplyr::filter(plato=="Resultado"),
             aes(text = paste0("Resultado ",label_estandar,": ", paste(round(result, digits = 2)," %"))),
             fill="lawngreen", 
             color="black", 
             size=16, shape=24) +
  #Encuestas
  geom_point(data = readr::read_csv("sancocho_resultados.csv") %>% 
               dplyr::select(plato,label_estandar=nombres,result=pronostico) %>%
               dplyr::filter(plato=="Encuestas"),
             aes(text = paste0("Promedio Encuestas ",label_estandar,": ", paste(round(result, digits = 2)," %"))),
             color="red2", size=8, shape=16) +
  
  labs(y="Resultado poll Twitter/Encuestas: % votos para cada candidato",
       x=NULL,
       title = "Encuestas en Twitter vs Realidad",
       subtitle = "Distribucion de resultados Polls en Twitter (N = 546)\nEncuestas con muestreo probabilistico (circulo rojo) (N = 27)\nResultado primera vuelta (triangulo verde)",
       caption = "Fuente: @RecetaElectoral basado en datos recuperados por @linterna y resultados electorales")+
  scale_fill_manual(values=c("purple","blue","gold2","forestgreen"))+
  scale_color_manual(values=c("purple","blue","gold2","forestgreen"))+
  theme_classic() +
  theme(legend.position = "none")

# ggplotly
ggplotly(twitter_vs_realidad, tooltip = "text")

Cafe 2022: Encuestas en Twitter vs La realidad

Notas

  1. En la primera evaluación se excluyó a Cálculo Electoral de la primera evaluación del 30 de Mayo (culpa del trasnocho). Con la actualización de los resultados con el escrutinio, La Silla Vacía recuperó el primer puesto.↩︎

Cómo citar

BibTeX
@online{recetas_electorales2022,
  author = {{Recetas Electorales}},
  title = {☕ Café post-electoral},
  date = {2022-05-31},
  url = {https://www.recetas-electorales.com/elecciones/2022-colombia/2022-05-31-cafe-2022/2022-cafe.html},
  langid = {es}
}
Por favor, cita este trabajo como:
Recetas Electorales. 2022. “☕ Café post-electoral.” May 31. https://www.recetas-electorales.com/elecciones/2022-colombia/2022-05-31-cafe-2022/2022-cafe.html.