TodЛs somos políticЛs. TodЛs hacemos política.

En este post vamos a comenzar a explorar las posibilidades de R que hemos introducido en la entrega anterior. En el proceso de análisis de datos, la visualización es una de las fases finales. Sin embargo, aquí vamos a comenzar a visualizar inmediatamente después de la importación de los microdatos para que los principiantes puedan ver de forma clara los efectos del cambio de código sobre los gráficos.

Importación de microdatos

Antes de importar los microdatos primero tendrás que instalar RStudio y abrir un nuevo script donde escribir el código que luego se ejecutará en la consola. En primer lugar importamos los microdatos de la encuesta postelectoral de las elecciones generales de 2019 (estudio número 3248), descargados en formato .sav del banco de datos del CIS.  Después del comando **read_sav** hay que poner la ruta donde están almacenados los microdatos. Este comando viene del paquete haven, que ya está integrado en RStudio.

library(haven)
dataset <- read_sav(".../data/3248.sav")

Haven importa los valores con sus códigos (por ejemplo, 1,2, 3 y 4) y etiquetas (por ejemplo, mucho, bastante, poco y nada). Para tener otro dataset que muestre solo las etiquetas tenemos que aplicarle la función as_factor.

datasetconetiquetas <- as_factor(dataset)

Para importar únicamente los códigos utilizaríamos val_labels del paquete labelled. Aparte de eso, en el siguiente fragmento de código se muestra cómo instalar el paquete con install.packages y activarlo con library.

#install.packages("labelled")
library(labelled)
val_labels(dataset) <- NULL

Tidyverse y visualización de datos con ggplot2

Una vez importados los datos vamos a conocer las posibilidades de visualización de R a través de ggplot2. El motivo de empezar visualizando es que el usuario principiante puede ver de forma más tangible el resultado de lo que está modificando en su código. Ggplot2 forma parte del Tidyverse, una colección de paquetes que amplían las funcionalidades de R para ciencia de datos. Su creador es Hadley Wickham, todo un referente en la comunidad de R.

Los paquetes más importantes de Tidyverse son:

  • ggplot2 para visualización.
  • dplyr para manipulación de datos.
  • tidyr para manipulación de dataframes.
  • readr para importar datos.
  • purrr para programación con funciones.
  • tibble para trabajar con estructuras de datos alternativas a los dataframes.
  • stringr para trabajar con variables de tipo cadena.
  • forcats para trabajar con variables de tipo factor.

En primer lugar instalamos y activamos el paquete que aglutina la colección Tidyverse. También iniciamos el paquete scales, que se utiliza para personalizar las escalas de los gráficos. Si es la primera vez que vas a utilizar estos paquetes tendrías que quitar la almohadilla (#) antes de install.packages. La almohadilla se utiliza para que esa parte de código no se ejecute, por lo que es útil cuando queremos hacer comentarios o marcar un proceso ya realizado, como en este caso.

#install.packages("tidyverse")
library(tidyverse)
#install.packages("scales")
library(scales)

En primer lugar, vamos a realizar un gráfico de barras muy básico para ver el grado de interés por la política (P1) de la muestra.

ggplot(data = dataset) +
  geom_bar(mapping = aes(x = P1))

De manera similar a Photoshop, ggplot2 trabaja por capas. Por tanto, al gráfico anterior le podemos añadir cuantas capas queramos de cara a mejorar la visualización de aquello que queremos comunicar. Incluyendo algunas líneas al gráfico anterior lo podemos mejorar considerablemente.

ggplot(data = dataset, aes(x = P1)) +
  geom_bar(aes(y = ..prop.., group = 1), fill = "lightblue", color = "darkblue") +
  labs(title = "Grado de interés por la política", caption = "Elaboración propia. Fuente: Encuesta postelectoral del CIS (2019)") +
  theme_minimal() +
  theme(plot.title = element_text(size = 16, hjust = 0.5), axis.title.x = element_blank(), axis.title.y = element_blank(), axis.text.y = element_blank()) +
  scale_x_continuous(limits = c(0, 5), breaks = c(1,2,3,4), labels = c("Mucho", "Bastante", "Poco", "Nada")) +
  scale_y_continuous(labels = percent_format()) +
  geom_text(aes(label = percent(..prop..), y= ..prop..), stat= "count", vjust = -.5)

Al trabajar por capas podemos, por ejemplo, dejar al fondo el gráfico de barras y poner uno de línea encima. Las posibilidades de este paquete son casi infinitas y no hay más que informarse, practicar y empaparse de lo que los mejores comparten, como este cookbook del equipo de datos de la BBC o la cheatsheet de ggplot2.

ggplot(data = dataset, aes(x = P1)) +
  geom_bar(aes(y = ..prop.., group = 1), fill = "lightblue", alpha = 0.4) +
  labs(title = "Grado de interés por la política", caption = "Elaboración propia. Fuente: Encuesta postelectoral del CIS (2019)") +
  theme_minimal() +
  theme(plot.title = element_text(size = 16, hjust = 0.5), axis.title.x = element_blank(), axis.title.y = element_blank(), axis.text.y = element_blank()) +
  scale_x_continuous(limits = c(0, 5), breaks = c(1,2,3,4), labels = c("Mucho", "Bastante", "Poco", "Nada")) +
  scale_y_continuous(labels = percent_format()) +
  geom_text(aes(label = percent(..prop..), y= ..prop..), stat= "count", vjust = -.5)

Algunos ejemplos de lo que se puede llegar a hacer

Con un poco de práctica y habilidad se pueden crear gráficos de calidad como éste de Kiko Llaneras.

O este boxplot de The R Graph Gallery, una web útil para obtener plantillas de gráficos y reutilizarlas para nuestras propias visualizaciones.

Facets

Otra funcionalidad interesante de ggplot2 son los facets, que permiten presentar un mismo gráfico varias veces en función de otra variable. En este caso, mostramos el interés en la política para capitales de comunidad autónoma, capitales de provincia y otros municipios.

labels <- c(
                    `1` = "Capital de CA",
                    `2` = "Capital de provincia",
                    `3` = "Otros municipios"
                    )
ggplot(data = dataset, aes(x = P1)) +
  geom_bar(aes(y = ..prop..), fill = "lightblue", alpha = 0.8) +
  facet_wrap(~CAPITAL, labeller = as_labeller(labels)) +
  labs(title = "Grado de interés por la política", caption = "Elaboración propia. Fuente: Encuesta postelectoral del CIS (2019)") +
  theme_minimal() +
  theme(plot.title = element_text(size = 16, hjust = 0.5), axis.title.x = element_blank(), axis.title.y = element_blank(), axis.text.x = element_text(angle = 90)) +
  scale_x_continuous(limits = c(0, 5), breaks = c(1,2,3,4), labels = c("Mucho", "Bastante", "Poco", "Nada")) +
  scale_y_continuous(labels = percent_format()) +
  geom_text(aes(label = percent(..prop..), y= ..prop..), stat= "count", vjust = -.5)

Series temporales

La postelectoral del CIS proporciona datos en un momento temporal dado. Sin embargo, las series temporales de esta institución permiten analizar una misma variable longitudinalmente. Para mostrar otros tipos de gráficos con ggplot2 vamos a cargar la serie temporal de percepción de la ubicación ideológica del Partido Popular.

library(readxl)
Ubicacion_PP <- read_excel(".../data/UbicacionPP.xlsx")

Para simplificar el gráfico, primero calculamos nuevas variables para agregar los posicionamientos de 1 a 4 como izquierda, 5 y 6 como centro y de 7 a 10 como derecha. Después, redondeamos a un decimal. También se define la variable Año como fecha.

Ubicacion_PP <- Ubicacion_PP %>% 
  mutate(izquierda = (a + b)/(a+b+c+d+e)*100) %>% 
  mutate(centro = c/(a+b+c+d+e)*100) %>% 
  mutate(derecha = (d + e)/(a+b+c+d+e)*100)

Ubicacion_PP$izquierda <- round(Ubicacion_PP$izquierda, digits = 1)
Ubicacion_PP$centro <- round(Ubicacion_PP$centro, digits = 1)
Ubicacion_PP$derecha <- round(Ubicacion_PP$derecha, digits = 1)

Ubicacion_PP$Año <- as.Date(Ubicacion_PP$Año)

Con ggplot se visualiza la serie temporal con la geometría geom_line.

Ubicacion_PP %>% 
  ggplot() +
    geom_line(mapping = aes(x = Año, y = izquierda, color = "Izquierda"), size = 1.3) +
    geom_line(mapping = aes(x = Año, y = centro, color = "Centro"), size = 1.3) +
    geom_line(mapping = aes(x = Año, y = derecha, color = "Derecha"), size = 1.3) +
    scale_colour_manual("", 
                      breaks = c("Izquierda", "Centro", "Derecha"),
                      values = c("orange", "blue", "red")) +
    scale_x_date("", breaks = "4 year", date_labels = "%b %y") +
    scale_y_continuous("") +
    ggtitle("Ubicación ideológica del Partido Popular")+
    theme_minimal()

Gracias a la gramática por capas de ggplot se pueden superponer gráficos de puntos sobre un gráfico de línea. Este ejemplo es algo trivial, pero abre posibilidades muy interesantes.

Ubicacion_PP %>% 
  ggplot() +
    geom_line(mapping = aes(x = Año, y = izquierda, color = "Izquierda"), size = 1.3) +
    geom_line(mapping = aes(x = Año, y = centro, color = "Centro"), size = 1.3) +
    geom_line(mapping = aes(x = Año, y = derecha, color = "Derecha"), size = 1.3) +
    scale_colour_manual("", 
                      breaks = c("Izquierda", "Centro", "Derecha"),
                      values = c("orange", "blue", "red")) +
    scale_x_date("", breaks = "4 year", date_labels = "%b %y") +
    scale_y_continuous("") +
    ggtitle("Ubicación ideológica del Partido Popular")+
    theme_minimal() +
    geom_point(mapping = aes(x= Año, y = izquierda)) +
    geom_point(mapping = aes(x= Año, y = centro)) +
    geom_point(mapping = aes(x= Año, y = derecha))

Existe otra geometría, denominada geom_smooth, que permite suavizar la serie y añadir un intervalo de confianza para mostrar el grado de incertidumbre.

Ubicacion_PP %>% 
  ggplot() +
    geom_smooth(mapping = aes(x = Año, y = izquierda, color = "Izquierda"), size = 1.3, span = 0.2) +
    geom_smooth(mapping = aes(x = Año, y = centro, color = "Centro"), size = 1.3, span = 0.2) +
    geom_smooth(mapping = aes(x = Año, y = derecha, color = "Derecha"), size = 1.3, span = 0.2) +
    scale_colour_manual("", 
                      breaks = c("Izquierda", "Centro", "Derecha"),
                      values = c("orange", "blue", "red")) +
    scale_x_date("", breaks = "4 year", date_labels = "%b %y") +
    scale_y_continuous("") +
    ggtitle("Ubicación ideológica del Partido Popular")+
    theme_minimal()

Ggplot2 es una herramienta muy interesante, pero por sí sola no es suficiente para cubrir todas las necesidades del analista de datos. Tidyverse tiene más paquetes útiles para otras fases del proceso de análisis de datos y recomiendo encarecidamente que investigues sobre ellos. En esta serie, con introducir ggplot2 y dplyr será suficiente. En el próximo post mostraremos cómo realizar un análisis exploratorio de los datos mediante métricas cuantitativas.