Un heatmap de los resultados de las elecciones presidenciales con R
4 de Abril de 2012
Hace algunas semanas vi este post del excelente sitio FlowingData sobre como hacer un heatmap con el programa de estadísticas R y me dío la idea de hacer lo mismo con los resultados de la primera vuelta de las últimas elecciones presidenciales.
Donde estan los datos?
La primera etapa (y la más dificil) fue de encontrar los datos. Finalmente, encontré lo que me interesaba (el porcentaje de votos de cada candidato por departamento) en el portal del JNE. El PDF se encuentra aquí.
Como los 4 últimos candidatos han tenido resultados casi nulos, los suprime, pero guarde los votos blancos y nulos que me parecían interesantes. Ordené los departamentos según las macro zonas Costa, Sierra y Selva.
Para los que quieren jugar con los datos, el archivo procesado en formato CSV.
Código R
Yo uso RStudio (un IDE para R) que permite usar R a través de una interfaz gráfica. No esta en versión 1.0 todavía pero es bastante estable y su arquitectura en varías ventanas (consola, variables, ayuda, gráficos,...) es super agradable. Además, algunas tareas como el hecho de importar un archivo o guardar un gráfico en formato imagen es más facil que con R solo.
El código a continuación se ejecuta también en R.
> # Importo el archivo CSV > elecciones <- read.csv("~/code/R/eleciones/data_elecciones_2011.csv", sep=";") |
El resultado es el siguiente:
A este nivel, las lineas no tienen nombre. Quiero atribuirlas el nombre de los departamentos (que esta contenido en la columna "DEPARTAMENTO"). Eso se hace con la método row.names
> row.names(elecciones) <- elecciones$DEPARTAMENTO |
Ya que mis lineas tienen el nombre de los departamentos puedo suprimir la primera columna:
> elecciones <- elecciones[,2:8] |
Ahora debemos transformar nuestros datos en una matrice:
> matrix_elecciones <- data.matrix(elecciones) |
Realizar el heatmap
Ya! Estamos listos para realizar el heatmap. Un último paso antes de eso, vamos a escoger la paleta de colores que queremos usar para el heatmap. Para eso, necesitamos el package RColorBrewer (lo debemos descargar, instalar y luego cargar en R).
> library("RColorBrewer") > # Quiero una paleta de colores que va del blanco al rojo oscuro > mipaleta <- brewer.pal(9,"Reds") > image(1:9,1,as.matrix(1:9), col=mipaleta, xlab="Leyenda", ylab="", xaxt="n", yaxt="n", bty="n") |
La función image nos da:
Ahora, vamos a usar mipaleta dentro de la función heatmap:
> heatmap_elecciones <- heatmap(matrix_elecciones, Rowv=NA, Colv=NA, revC = 'true', col = mipaleta, scale="row", margins=c(5,10)) |
Que nos da:
Algunas explicaciones sobre 2 parametros de la función heatmap:
- revC = 'true': Para intervertir el orden de las columnas. En mi caso quiero tener LIma en la primera linea
- scale="row". scale indica si los valores estan representados en el sentido de las lineas o de las columnas. "row" es el valor por defecto
Entonces este heatmap se lee por linea, es decir por cada departamento se puede analizar los resultados de los diferentes candidatos. Vemos de inmediato que Humala gana en la mayoría de los departamentos pero también que en Lima y el Callao PPK llegó primero. En Ancash y Loreto es Toledo.
Resultado final
Este resultado es interesente pero quiero ver por cada candidato sus resultados en los diferentes departamentos.
Solamente debo modificar el valor del parametro scale:
> heatmap_elecciones <- heatmap(matrix_elecciones, Rowv=NA, Colv=NA, revC = 'true', col = mipaleta, scale="column", margins=c(5,10)) |
Como es mi resultado final lo voy a editar un poco. Por eso, exporto el heatmap en formato SVG que luego modifico en Inkscape y GIMP.
La imagen final:
Algunas observaciones rápidas sobre este último heatmap:
- Globalmente Humala tiene sus resultados mas bajos en la Costa
- PPK y Castañeda obtienen sus mejores resultados en la Costa
- El mejor resultado de Castañeda es en Lambayeque
- Los resultados de Toledo son globalmente bajos, excepto en Ancash y Loreto
- Los votos blancos y nulos son mas bajos en la Costa y son mas altos en el departamento de Apurímac