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:

Los datos de las elecciones importados en R

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:

Leyenda

 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:

heatmap

Algunas explicaciones sobre 2 parametros de la función heatmap:

 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:

Heatmap final

Algunas observaciones rápidas sobre este último heatmap:

Twittear