Gráficas con GGPlot2

Estoy seguro que alguna vez en la vida nos hemos encontrado con el desafío de presentar información de manera atractiva y convincente. Muchas veces la frase correcta es la que logra que una venta se concrete. Pero en el caso de la estadística y la ciencia de los datos, tener los datos en la forma correcta, y presentados de manera clara y entendible es el verdadero desafío. Para lograr que nuestros datos sean representados correctamente, lo mejor es usar una gráfica, y no hay mejor paquete para ello que GGPlot2

Ggplot2 es un paquete R de Hadley Wickham y Winston Chang que implementa la gramática de los gráficos de Wilkinson. El énfasis de ggplot2 está en la exploración rápida de datos, y especialmente en datos de alta dimensión. Piense en las funciones gráficas base que hemos trabajado para dibujar con datos (ejemplos de funciones gráficas base son plot(), barplot() y lines()). Con gráficos base, el usuario tiene un control completo sobre cada píxel en una gráfica, pero puede tomar una gran cantidad de tiempo y código para producir un elemento gráfico valioso.

Aunque ggplot2 se puede personalizar completamente, llega a un punto de rendimientos decrecientes. Se tiende a usar ggplot2 y gráficos base por aquellos aspectos que hacen que destaque: ggplot2 para exploración rápida de datos y para gráficos pulidos y totalmente personalizados para publicación.

Entonces, este es un paquete de visualización de datos que se basa en el “grammar of graphics”, en el cual se usan bloques de información como mapas, objetos geométricos, transformaciones estadísticas, escalas, sistemas coordinados o ajustes de posición y los convierte en diferentes tipos de gráficos. Al igual que con los paquetes incluidos en R, podemos generar algunos de los siguientes gráficos (y muchos más):

Por tanto, es nuestro interés poder utilizar más y más de este tipo de gráficas, así que hoy estaremos trabajando en este paquete

Nota: Tenga en cuenta que esta clase puede ser un nivel introductorio para la producción de gráficos, por lo que lo invitamos a seguir investigando sobre este tema.

Cargue de datos

Al igual que en todas nuestras clases, el día de hoy estaremos trabajando con una base de datos nueva. Para el día de hoy nos empezaremos a adentrar en el mundo de la información bancaria, por lo que trabajaremos con una base de datos clásica. Un banco de Portugal presentó los datos de una campaña para que los clientes adquieran productos del banco. Así pues, revisemos los datos:

data1 <- read.csv("Clase 5.csv", sep=";")
str(data1)
## 'data.frame':    6395 obs. of  17 variables:
##  $ age         : int  49 28 26 39 49 27 45 41 40 51 ...
##  $ job         : chr  "entrepreneur" "management" "management" "management" ...
##  $ marital     : chr  "married" "single" "single" "single" ...
##  $ education   : chr  "primary" "tertiary" "tertiary" "tertiary" ...
##  $ default     : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ balance     : int  -63 637 1837 30 512 876 4639 0 -186 201 ...
##  $ housing     : chr  "yes" "yes" "no" "yes" ...
##  $ loan        : chr  "no" "no" "no" "no" ...
##  $ contact     : chr  "unknown" "cellular" "cellular" "cellular" ...
##  $ day         : int  14 4 3 13 14 18 6 11 11 17 ...
##  $ month       : chr  "may" "feb" "feb" "may" ...
##  $ duration    : int  416 324 417 201 455 268 82 101 154 582 ...
##  $ campaign    : int  2 1 2 3 3 1 2 1 2 2 ...
##  $ pdays       : int  -1 -1 -1 -1 -1 355 -1 -1 -1 -1 ...
##  $ previous    : int  0 0 0 0 0 1 0 0 0 0 ...
##  $ poutcome    : chr  "unknown" "unknown" "unknown" "unknown" ...
##  $ term_deposit: int  0 0 0 0 0 0 0 0 0 1 ...

Como podrán ver en el resultado anterior, esta base de datos nos muestra información general de las campañas de marketing realizadas por este banco.

El link para descargar los datos es el siguiente: https://www.dropbox.com/s/fzj10wgn4xeyc03/Clase%205.csv?dl=0

Datos y data frames

Uno de los elementos más importantes de un gráfico son los datos que se quieren representar. Una particularidad de ggplot2 es que solo acepta un tipo de datos: data.frames. Otras funciones gráficas (p.e., hist) admiten vectores, listas u otro tipo de estructuras. ggplot2 no, por lo que la primera comprobación que se debe llevar a cabo es la estructura de datos que tenemos. En este caso podemos ver el código anterior que tenemos un data frame, por lo que podemos proseguir.

Trabajando con GGPlot2

La clave para entender ggplot2 es pensar en una figura como un conjunto de capas. Esta idea podría resultarte familiar si has usado un programa de edición de imágenes como Photoshop, Illustrator o Inkscape. Esto quiere decir que los gráficos de ggplot2 se construyen paso a paso agregando nuevos elementos o capas, resultando en una gran flexibilidad para la personalización de los mismos. Por tanto, empecemos por leer el paquete GGPlot2:

library(ggplot2)

Puede que este paquete tarde un poco en cargar, pero no te preocupes que esto es normal por la complejidad misma de GGPlot.

Primer elemento: datos

Como vimos anteriormente, el paquete ggplot2() puede generar cualquiera de los diagramas o gráficos mencionados anteriormente dependiendo de los parámetros que le suministremos. El primer parámetro o elemento que recibe corresponderá al dataset que se desee visualizar. Este dataset debe ser un data frame y puede ser suministrado de forma directa (completo) o indirecta (con funciones intermediarias como subset()).

g1 <- ggplot(data1)

A las funciones de ggplot2 les gusta trabajar con datos en formato largo, es decir, una columna para cada variable y una fila para cada observación. Tener datos bien estructurados te ahorrará mucho tiempo a la hora de realizar gráficos con ggplot2. Además, todos los argumentos que le pasemos a la función ggplot() serán considerados como opciones globales en nuestro gráfico, lo cual significa que estas opciones son válidas para todas sus capas.

El segundo parámetro corresponde al mapeo, el grupo de variables que se desea visualizar. Una herramienta muy útil en este contexto es la función aes() que describe como las variables son mapeadas mediante el uso de geomas (que veremos más adelante). Define un mapeo (usando la función aes() dentro de ggplot()) para seleccionar las variables a graficar y especificar cómo deben ser presentadas:

ggplot(data1, mapping = aes(x=balance, y=marital))

Con esta estructura básica ya podemos empezar a crear cambios sobre nuestros datos.

Segundo elemento: geomas

Los geomas (o geoms para ggplot2) son los verbos del lenguaje de los gráficos. Indican qué hacer con los datos y las estéticas elegidas, cómo representarlos en un lienzo. Al declarar geomas y usar funciones especiales podemos establecer el tipo de grafico que se realizara o establecer modificaciones sobre los aspectos visuales o los datos que se usarán en el grafico. Esto se realiza por medio del operador “+”:

ggplot(data1, mapping = aes(x=marital, y=balance)) + geom_boxplot()

Para ver lo interesante, haremos una comparación con la misma gráfica en R:

boxplot(data1$balance ~ data1$marital)

Es claro que esta representación mejora considerablemente la calidad de la representación.

Veamos otros gráficos que hemos realizado a lo largo del curso. Empecemos con el diagrama de barras tradicional para las frecuencias de los tipos de educación:

ggplot(data1, aes(education))+geom_bar()

Ahora veamos este mismo gráfico en sus diferencias entre los balances de los clientes, usando en este caso un gráfico de líneas:

ggplot(data1, aes(education, balance))+geom_line()

¿Y si queremos un gráfico de dispersión? Usaremos geom_point():

ggplot(data1, aes(age, balance)) + geom_point()

Finalmente, otros gráficos podrían ser de su interés y no son los nombrados. A continuación se presenta una lista de geomas útiles o comunes y los gráficos que generan. Sus representaciones y funcionamiento es similar a los mostrados anteriormente:

  • geom_abline(), geom_hline(), geom_vline(): Diagramas de lineas en diferentes orientaciones.
  • geom_bin_2d(), stat_bin_2d(): Mapas de calor en 2d.
  • geom_blank(): Un grafico en blanco.
  • geom_contour(): Un mapa de contornos de una superficie.
  • geom_density(): Contornos de estimados de densidad en 2d.
  • geom_dotplot(): Diagrama de puntos.
  • geom_errorbarh(): Incluir barras de error horizontales.
  • geom_map(): polígonos de un mapa de referencia.
  • geom_polygon(): Grafico de polígonos definidos.
  • geom_violin(): Diagrama de violín.

Estéticas

En un conjunto de datos hay columnas: edad, altura, ingresos, temperatura, etc. En un gráfico hay, en la terminología de ggplot2, estéticas. Estéticas son, por ejemplo, la distancia horizontal o vertical, el color, la forma (de un punto), el tamaño (de un punto o el grosor de una línea), etc. Igual que al hablar asociamos a un conjunto de sonidos (p.e., m-e-s-a) un significado (el objeto que conocemos como mesa), al realizar un gráfico asociamos a elementos sin significado propio (p.e., los colores) uno: el que corresponde a una columna determinada de los datos.

En ggplot2, dentro del lenguaje de los gráficos que implementa, es muy importante esa asociación explícita de significados a significantes, es decir, de columnas de datos a estéticas. Acá aprenderemos algunos básicos

Labs

Esta función es especialmente útil para la generación de gráficos debido a que nos permite añadir o modificar títulos de grafico o de eje. Los parámetros que recibe son: titulo, subtitulo y caption, los valores declarados usualmente son de tipo string, sin embargo pueden usarse expresiones matemáticas usando quote():

ggplot(data1, aes(age, balance, colour=education)) + geom_point() + labs(x="edad", y="balance en cuenta", title="Balance de acuerdo a la edad", colour= "Nivel educativo", caption = "Realizado por Andrés Acero")

Algunas veces las etiquetas aparecerán en lugares poco convenientes para la visualización, en estos casos podemos usar comandos como ggrepel() para evitar que se sobrepongan, tibble() para que las etiquetas se muestren en el borde del grafico, str_wrap() para definir saltos de linea entre etiquetas o hjust() o vjust() para cambiar la alineación. A continuación se muestran las diferentes combinaciones para el uso de hjust() y vjust():

Figura 1: Posiciones de la alineación

Si deseas explorar estas funciones te invitamos a que des una vuelta por ellas.

Scales

Normalmente ggplot2() genera una escala adecuada para la información mostrada, sin embargo en algunas ocasiones debemos modificarla, bien por legibilidad o porque cierta información puede no ser relevante, en estos casos la función scales() es de gran utilidad.

ggplot(data1, aes(age, balance, colour=education)) + geom_point() + scale_x_discrete(labels=NULL) + scale_y_continuous(breaks = seq(0, 40000, by = 5000))

En el ejemplo usamos breaks(), el cual modifica el rango en el que se ven los datos o cuando se tienen pocos datos puede generar una grafica discontinua (con saltos). Además, al usar scales() se puede usar labels=NULL para que no aparezca alguna etiqueta, escala o leyenda.

Si se tiene un color o colores preferidos para la grafica podemos establecerla haciendo uso del parámetro scale_color_manual(). En este caso el parámetro es el color entre comillas escrito en ingles.

ggplot(data1, aes(age, balance, colour=education)) + geom_point() + scale_color_manual(values = c("yellow", "blue", "orange", "purple"))

Si queremos una paleta completa de colores en la que queramos trabajar, podemos hacer uso del comando scale_color_brewer(). Las paletas de color disponibles son:

Figura 2: Paletas de colores

ggplot(data1, aes(age, balance, colour=education)) + geom_point() + scale_color_brewer(palette = "Spectral")

Finalmente, en mapas de calor, o de relieve podemos llegar a necesitar paletas de color continuas, en el caso especifico en el que trabajemos con gradientes incluidos en R de forma nativa podemos contar con las opciones scale_fill_gradient() y scale_color_gradient2():

ggplot(data1, aes(marital,education, fill=balance)) + geom_tile() + scale_fill_gradient()

Themes

Los temas de ggplot2 permiten modificar aspectos estéticos del gráfico que no tienen que ver con los datos en sí. Eso incluye los ejes, etiquetas, colores de fondo, el tamaño de los márgenes, etc. No es habitual (y se desaconseja a los usuarios menos expertos) tener que alterar los temas que ggplot2 usa por defecto. Solo se vuelve necesario cuando los gráficos tienen que adecuarse a una imagen corporativa o atenerse a algún criterio de publicación exigente.

Un tema es una colección de elementos (p.e., panel.background, que indica el color, transparencia, etc. del lienzo sobre el que se representa el gráfico) modificables. El tema que usa ggplot2 por defecto es theme_grey. Al escribir theme_grey() en la consola de R, se muestran alrededor de cuarenta elementos modificables y sus atributos tal y como los define dicho tema.

ggplot(data1, aes(age, balance, colour=education)) + geom_point() + theme_light()

Theme() a diferencia de scales o label se define después de crear el grafico base con ggplot, por lo que las modificaciones que genera son independientes de las leyendas que ya se incluyeron en el original.

Facetas

El último aspecto que revisaremos son las facetas. El enfoque de facetas divide una parcela en una matriz de paneles. Cada panel muestra un subconjunto diferente de datos, el cual yo determino de acuerdo con las divisiones que desee hacer.

ggplot(data1, aes(age, balance)) + geom_point() + facet_grid(~marital)