¿Cómo interpretar los resultados de una encuesta presidencial? Cualquier resultado obtenido a partir de una muestra tiene un margen de error. Eventualmente los medios de comunicación indican el margen de error y mencionan algo sobre cierto nivel de confianza, pero estos datos suelen ser incomprendidos por la mayoría. ¿Por qué hay un margen de error? Pues porque los números que se muestran son el resultado de una encuesta en la que solo se ha consultado a una pequeña parte de la población. Suponga por ejemplo que usted toma una muestra al azar de 100 personas y que en esa muestra encuentra que 30 tienen intención de votar por el candidato A. Entonces puede decir que el 30% de su muestra piensa votar por A, pero eso no quiere decir que el 30% de la población vaya a votar por A, y tampoco quiere decir que en otra muestra de 100 nuevamente 30 vayan a indicar que piensan votar por A. Si se sacaran muchas muestras de tamaño 100, en cada muestra se podrían obtener resultados distintos a favor de A; quizÔ 30 en algunas, 28 en otras, o 29, 33, 32 o 25, en fin, números distintos pero que, si se hicieron bien las cosas en el muestreo, debieran estar todos ellos alrededor de la intención de voto poblacional (lo que se observa finalmente el día de las elecciones), desconocida, a favor de dicho candidato. Esta variabilidad de muestra a muestra es la que tiene que ver con el margen de error.

¿Cómo visualizar entonces el resultado de una encuesta junto con su correspondiente margen de error? Una forma es calcular un intervalo de confianza. Otra forma, y la que me permito mostrar aquí, podría ser mostrando una posible distribución de los resultados que podrían obtenerse si se repitiera la encuesta muchas veces, en el supuesto, claro estÔ, de que la única encuesta que sí se hizo, se hizo bien. La idea es, a partir de los resultados de la encuesta que sí se hizo, simular resultados de otras posibles encuestas para poder visualizar el famoso margen de error. Los resultados de estas simulaciones se pueden graficar de varias maneras: en este caso he escogido un grÔfico de puntos. Abajo puede ver los resultados obtenidos con la simulación de 1000 encuestas. Las abreviaturas usadas en los grÔficos son las siguientes:

library(ggplot2)

set.seed(1)

sims <- function(y, n){
  x <- t(array(rgamma(n * 1000, y, 1), c(n, 1000)))
  p <- x / apply(x, 1, sum) * 100
  p <- sapply(t(p[, 1:(n - 1)]), c)
}

gg <- function(datos, candidato, p){
  ggplot(datos, aes(candidato, p)) +
    labs(x = "Candidato", y = "Intención de voto (%)") +
    geom_jitter(width = 0.1, aes(color = candidato), alpha = I(0.05)) +
    theme(legend.position = "none")
}

Encuesta nacional urbano rural de GFK - Encuestas del 11 al 15 de Diciembre del 2015

y <- c(380, 139, 101, 63, 38, 25, 25, 25, 13, 8, 5, 3, 3, 439)
p <- sims(y, length(y))
candidato <- c("KF", "PPK", "CA", "AG", "AT", "VM", "JG", "DU", "RR", "NGG",
               "RB", "AFA", "MH")
candidato <- factor(candidato, levels = candidato)
datos <- data.frame(p = p, candidato = candidato)
gg(datos, candidato, p)

Encuesta nacional urbano rural de Ipsos - Encuestas del 12 al 14 de enero del 2016

y <- c(590, 240, 237, 146, 103, 55, 42, 36, 31, 27, 15, 7, 6, 5, 5, 4, 3, 3, 276)
p <- sims(y, length(y))
candidato <- c("KF", "PPK", "CA", "AG", "JG", "AT", "VM", "DU", "RR", "NGG",
               "GS", "VC", "FDC", "MH", "AB", "FO", "YS", "AFA")
candidato <- factor(candidato, levels = candidato)
datos <- data.frame(p = p, candidato = candidato)
gg(datos, candidato, p)

Encuesta nacional urbano rural de GFK - Encuestas del 22 al 26 de enero del 2016

y <- c(510, 163, 156, 148, 102, 42, 30, 22, 14, 9, 8, 6, 5, 2, 2, 344)
p <- sims(y, length(y))
candidato <- c("KF", "JG", "CA", "PPK", "AG", "AT", "VM", "RR", "DU", "GS",
               "AB", "VC", "NGG", "AFA", "YS")
candidato <- factor(candidato, levels = candidato)
datos <- data.frame(p = p, candidato = candidato)
gg(datos, candidato, p)

Simulacro de votación de Datum - Encuestas del 5 al 8 de febrero del 2016

y <- c(375, 193, 133, 85, 48, 36, 24, 24, 12, 12, 12, 12, 5, 2, 1, 1, 1, 233)
p <- sims(y, length(y))
candidato <- c("KF", "JG", "PPK", "CA", "AG", "AB", "VM", "AT", "DU", "RR",
               "NGG", "GS", "FO", "VC", "MH", "AFA", "YS")
candidato <- factor(candidato, levels = candidato)
datos <- data.frame(p = p, candidato = candidato)
gg(datos, candidato, p)

Encuesta nacional urbano rural de Ipsos - Encuestas del 13 al 18 de febrero del 2016

y <- c(537, 337, 156, 102, 94, 80, 70, 32, 28, 19, 16, 10, 5, 5, 2, 2, 1, 1, 318)
p <- sims(y, length(y))
candidato <- c("KF", "JG", "PPK", "CA", "AG", "VM", "AB", "AT", "RR", "DU",
               "GS", "NGG", "VC", "AFA", "FDC", "YS", "FO", "MH")
candidato <- factor(candidato, levels = candidato)
datos <- data.frame(p = p, candidato = candidato)
gg(datos, candidato, p)

Encuesta nacional urbano rural de GFK - Encuestas del 27 de febrero al 1 de marzo del 2016

y <- c(537, 258, 107, 79, 67, 57, 56, 25, 17, 11, 5, 5, 5, 2, 326)
p <- sims(y, length(y))
candidato <- c("KF", "JG", "PPK", "AB", "AG", "VM", "CA", "AT", "GS", "DU",
               "NGG", "RR", "VC", "MH")
candidato <- factor(candidato, levels = candidato)
datos <- data.frame(p = p, candidato = candidato)
gg(datos, candidato, p)

Encuesta nacional de Datum - Encuestas del 4 al 7 de marzo del 2016

Con AcuƱa y GuzmƔn:

y <- c(396, 204, 120, 84, 72, 60, 48, 216)
p <- sims(y, length(y))
candidato <- c("KF", "JG", "PPK", "AB", "AG", "VM", "CA")
candidato <- factor(candidato, levels = candidato)
datos <- data.frame(p = p, candidato = candidato)
gg(datos, candidato, p)

Sin AcuƱa y GuzmƔn:

y <- c(444, 168, 108, 96, 84, 17, 16, 14, 7, 7, 5, 4, 4, 1, 1, 229)
p <- sims(y, length(y))
candidato <- c("KF", "PPK", "AB", "VM", "AG", "AT", "DU", "GS", "NGG", "RR",
               "VC", "AFA", "FO", "MH", "YS")
candidato <- factor(candidato, levels = candidato)
datos <- data.frame(p = p, candidato = candidato)
gg(datos, candidato, p)

Encuesta nacional urbano rural de Ipsos - Encuestas del 5 al 10 de marzo del 2016

Con AcuƱa y GuzmƔn:

y <- c(574, 296, 167, 130, 111, 93, 56, 424)
p <- sims(y, length(y))
candidato <- c("KF", "JG", "PPK", "AB", "AG", "VM", "CA")
candidato <- factor(candidato, levels = candidato)
datos <- data.frame(p = p, candidato = candidato)
gg(datos, candidato, p)

Sin AcuƱa y GuzmƔn:

y <- c(592, 259, 167, 167, 111, 37, 518)
p <- sims(y, length(y))
candidato <- c("KF", "PPK", "AB", "VM", "AG", "AT")
candidato <- factor(candidato, levels = candidato)
datos <- data.frame(p = p, candidato = candidato)
gg(datos, candidato, p)

Encuesta nacional urbano rural de GFK - Encuestas del 11 al 15 de marzo del 2016

y <- c(544, 256, 190, 120, 93, 29, 26, 8, 5, 3, 3, 3, 2, 304)
p <- sims(y, length(y))
candidato <- c("KF", "PPK", "AB", "VM", "AG", "AT", "GS", "NGG",
               "VC", "RR", "DU", "AFA", "FO")
candidato <- factor(candidato, levels = candidato)
datos <- data.frame(p = p, candidato = candidato)
gg(datos, candidato, p)

Encuesta nacional urbano rural de Ipsos - Encuestas del 15 al 17 de marzo del 2016

y <- c(552, 271, 210, 202, 125, 20, 18, 16, 11, 367)
p <- sims(y, length(y))
candidato <- c("KF", "PPK", "AB", "VM", "AG", "AT", "NGG", "GS", "FO")
candidato <- factor(candidato, levels = candidato)
datos <- data.frame(p = p, candidato = candidato)
gg(datos, candidato, p)

Simulacro de votación de Datum - Encuestas del 17 al 20 de marzo del 2016

y <- c(413, 208, 164, 126, 50, 16, 13, 10, 8, 6, 2, 1, 1, 182)
p <- sims(y, length(y))
candidato <- c("KF", "PPK", "AB", "VM", "AG", "GS", "NGG", "AT", "FO", "VC",
               "AFA", "FDC", "YS")
candidato <- factor(candidato, levels = candidato)
datos <- data.frame(p = p, candidato = candidato)
gg(datos, candidato, p)

Encuesta nacional urbano rural de Ipsos - Encuestas del 22 al 24 de marzo del 2016

y <- c(575, 287, 217, 199, 111, 36, 18, 16, 332)
p <- sims(y, length(y))
candidato <- c("KF", "PPK", "VM", "AB", "AG", "AT", "GS", "NGG")
candidato <- factor(candidato, levels = candidato)
datos <- data.frame(p = p, candidato = candidato)
gg(datos, candidato, p)

Simulacro de votación de GFK - Encuestas del 28 al 30 de marzo del 2016

y <- c(678, 276, 274, 185, 108, 57, 15, 13, 4, 2, 216)
p <- sims(y, length(y))
candidato <- c("KF", "PPK", "VM", "AB", "AG", "GS", "AT", "FO", "AFA", "MH")
candidato <- factor(candidato, levels = candidato)
datos <- data.frame(p = p, candidato = candidato)
gg(datos, candidato, p)

Simulacro de votación de Ipsos - Encuestas del 30 de marzo al 1 de abril del 2016

y <- c(619, 302, 279, 144, 95, 34, 327)
p <- sims(y, length(y))
candidato <- c("KF", "PPK", "VM", "AB", "AG", "GS")
candidato <- factor(candidato, levels = candidato)
datos <- data.frame(p = p, candidato = candidato)
gg(datos, candidato, p)