Las encuestas de intención de voto sobrevivieron la ley que trató de destruirlas. Celebremos viéndolas todas juntas.
Autor/a
Afiliación
Recetas Electorales
Análisis independiente
Fecha de publicación
28 de enero de 2026
Fecha de última modificación
12 de junio de 2026
“Any outcome that is made possible by creating a law could have happened without the law.” –Kaushik Basu (2018)
“Artículo 11. Responsabilidad de las firmas encuestadoras. Las firmas encuestadoras deberán cumplir con las leyes de la estadística. Si no lo hicieren, responderán civil y penalmente por sus actos cuando corresponda.” –Ley 2494 de 2025
Las encuestas que sobrevivieron la regulación que buscó acabarlas
En 1897, el médico Edward Goodwin propuso una ley para determinar que la razón entre la circunferencia y el diámetro de un círculo \(\pi\) era 3.2. La intersección entre la ignorancia y la arrogancia siempre produce cosas así.
Las barbaridades escritas en la Ley 2494 de 2025 no están lejos del episodio de 1897. Ninguna es más reveladora de la ignorancia que lo quedó escrito en el Art 11, que amenaza el trabajo estadístico con consecuencias penales por no seguir las leyes de la estadística.
Ignorando por un momento que la ley fue propuesta por políticos cercanos a los futuros candidatos que se beneficiarían de la ignorancia producida por la veda a las encuestas, la existencia de esa ley es un triste reflejo de cómo unas élites pueden reconocer a todo el país que no entienden la diferencia entre una norma que hay que seguir y una regularidad científica.
Afortunadamente ni la honestidad ni el rigor estadístico se pueden legislar. Hay que seguir impulsando ambas así exista una ley que persigua lo contrario.
Las encuestas, juntas.
Ver código
library(tidyverse)library(plotly)library(scales)library(ggrepel)library(DT)library(RColorBrewer)library(showtext)library(here)sysfonts::font_add_google("News Cycle","news-cycle")showtext::showtext_auto()candidatos_df <- tibble::tribble(~cod, ~nombre, ~color_cand,"ic", "Iván Cepeda", "#A52E94","adle", "Abelardo de la Espriella", "#000066","vd", "Vicky Dávila","#A11E4E","sf", "Sergio Fajardo", "#442F7E","jmg", "Juan Manuel Galán", "#BE1100","jcp", "Juan Carlos Pinzón", "#23C062","pv", "Paloma Valencia", "#63B9E9","cl", "Claudia López", "#00B399","ep", "Enrique Peñalosa","#0BDA51","jdo", "Juan Daniel Oviedo","#F0E60D","voto_blanco","Voto en blanco", "#FFFFFF","ns_nr", "No sabe-No responde", "#EAECF0","ruido","Ruido","black" )encuestas_2026 <- readr::read_csv(here("elecciones","2026-colombia","2026-01-26-entrada","encuestas_2026.csv")) |> dplyr::mutate(fecha = lubridate::mdy(fecha),encuesta_id =1:dplyr::n(),encuestadora =factor(encuestadora),cand_ruido =1-rowSums(dplyr::across(-c("fecha","encuesta_id", "encuestadora", "muestra", "voto_blanco","ns_nr")), na.rm =TRUE)) |> tidyr::pivot_longer(cols = tidyselect::starts_with("cand"),names_to ="candidato",values_to ="int_voto")# Datos para grafica ####datos_entrada <- encuestas_2026 |> dplyr::filter(candidato %in%c("cand_ic", "cand_adle", "cand_pv", "cand_sf", "cand_cl")) |> dplyr::mutate(candidato = stringr::str_sub(candidato, start =6L)) |> dplyr::left_join(candidatos_df, by =c("candidato"="cod")) |> dplyr::filter(candidato !="ruido", !is.na(int_voto))# LOESS por candidato (grilla densa para curva suave) ####loess_entrada <- datos_entrada |> dplyr::group_by(nombre) |> dplyr::filter(dplyr::n() >=3) |> dplyr::group_modify(~{ fit <- stats::loess(int_voto ~as.numeric(fecha), data = .x) fecha_grid <-seq(min(.x$fecha), max(.x$fecha), by ="day") tibble::tibble(fecha = fecha_grid,int_voto = stats::predict(fit, newdata =data.frame(fecha =as.numeric(fecha_grid))) ) }) |> dplyr::ungroup()# Resultados reales primera vuelta 31 de mayo de 2026 ####resultados_entrada <- tibble::tribble(~nombre, ~int_voto,"Iván Cepeda", 0.4092,"Abelardo de la Espriella", 0.4372,"Paloma Valencia", 0.0692,"Sergio Fajardo", 0.0426,"Claudia López", 0.0095) |> dplyr::mutate(fecha = lubridate::ymd("2026-05-31"))# Grafica ####entrada_2026 <- datos_entrada |> ggplot2::ggplot(ggplot2::aes(x = fecha, y = int_voto, color = nombre)) + ggplot2::geom_line(data = loess_entrada, ggplot2::aes(x = fecha, y = int_voto, color = nombre, group = nombre),linetype ="dotdash", linewidth =0.8, show.legend =FALSE) + ggplot2::geom_point(ggplot2::aes(shape = encuestadora,text =paste0(nombre, ": ", scales::percent(int_voto, accuracy =0.1),"<br>", encuestadora, " (", format(fecha, "%d-%b"), ")")),size =4, alpha =0.85) + ggplot2::geom_point(data = resultados_entrada, ggplot2::aes(x = fecha, y = int_voto, color = nombre,text =paste0(nombre, ": ", scales::percent(int_voto, accuracy =0.1),"<br>★ Resultado real (31 mayo)")),shape =18, size =7 ) + ggplot2::scale_color_manual(values =setNames(candidatos_df$color_cand, candidatos_df$nombre)) + ggplot2::scale_y_continuous(labels = scales::percent_format(accuracy =1)) + ggplot2::guides(shape ="none") + ggplot2::labs(x =NULL, y ="Intención de voto", color =NULL,caption ="Diamante ◆: resultado real 31 de mayo de 2026") + ggplot2::theme_minimal() + ggplot2::theme(legend.position ="bottom")#ggplotly ####plotly::ggplotly(entrada_2026, tooltip ="text") |> plotly::layout(legend =list(orientation ="h", y =-0.15, x =0.5, xanchor ="center"),xaxis =list(rangeslider =list(visible =TRUE, thickness =0.04),rangeselector =list(buttons =list(list(step ="all", label ="Todo"),list(count =3, step ="month", stepmode ="backward", label ="3m"),list(count =1, step ="month", stepmode ="backward", label ="1m") ) ) ) )
1
Cargamos los paquetes: tidyverse para datos, plotly para el gráfico interactivo, y los demás para escalas, etiquetas, tablas, colores y fuentes.
2
Registramos la fuente News Cycle y activamos showtext para usarla en los gráficos.
3
Definimos la tabla de candidatos con su código, nombre y color de marca.
4
Leemos la base de encuestas desde el CSV y convertimos la fecha a tipo fecha.
5
Calculamos cand_ruido: la fracción de la muestra no asignada a ningún candidato listado (el complemento de la suma de intenciones).
6
Pasamos a formato largo: una fila por encuesta-candidato, con la intención de voto en una sola columna.
7
Filtramos los cinco candidatos principales y unimos sus nombres y colores.
8
Ajustamos una curva LOESS por candidato sobre una grilla diaria para suavizar la tendencia.
9
Definimos los resultados reales de la primera vuelta (31 de mayo) para marcarlos en el gráfico.
10
Construimos el gráfico ggplot2: puntos de encuestas, líneas LOESS y los diamantes del resultado real.
11
Convertimos el gráfico a interactivo con ggplotly, añadiendo rangeslider y botones de rango temporal.
Resultado — primera vuelta 31 de mayo de 2026
NotaResultados oficiales
Candidato
% Votos válidos
Abelardo de la Espriella
43.72%
Iván Cepeda
40.92%
Paloma Valencia
6.92%
Sergio Fajardo
4.26%
Claudia López
0.95%
Abelardo de la Espriella superó a Cepeda por 2.8 puntos y a las encuestas por más de 15 puntos. Paloma Valencia fue la candidata más sobreestimada. Ver análisis completo en ☕ Café.
Cómo citar
BibTeX
@online{recetas_electorales2026,
author = {{Recetas Electorales}},
title = {🍽️ Entrada, las sobrevivientes},
date = {2026-01-28},
url = {https://recetas-electorales.netlify.app/elecciones/2026-colombia/2026-01-26-entrada/2026-entrada.html},
langid = {es}
}