DataViz I: Shape of You

4 minute read

Hablando de palabras nuevas para nombrar cosas viejas, hoy empezamos una serie de artículos sobre DataViz. O como decimos en criollo, visualización de datos. Un conjunto de técnicas que nos van a permitir representar gráficamente información, con el objeto de entenderla mejor o de comunicar eficientemente resultados.

Un error frecuente en analistas de datos newbies es querer ir directo a los bifes sin juego previo. Si antes de modelar datos paramos la pelota para estudiar su naturaleza y su forma nos ahorraremos unos cuantos dolores de cabeza. Ahí es donde las herramientas que veremos hoy entran en juego.

Pero primero lo primero, necesitamos un dataset a modo de ejemplo para trabajar. En este caso elegí InsectSprays una tabla con la cantidad de insectos encontrados en parcelas agrícolas tratadas con diferentes sprays de insecticidas. Con las funciones head y tail podemos ver las primeras y últimas filas de la tabla.

> head(InsectSprays,3)
  count spray
1    10     A
2     7     A
3    20     A
> tail(InsectSprays,3)
   count spray
70    26     F
71    24     F
72    13     F

Para los gráficos vamos a usar un paquete llamado ggplot2, del que no vamos a entrar en detalles de la sintaxis pero la pueden consultar aquí. Nuestro objetivo es visualizar como se comportan las distribuciones de conteos de cada spray. Aprender sobre su magnitud y variabilidad nos da mucha información para luego elegir como modelar estos datos.

Histograma y density plot

La primera idea que tuve fue hacer un histograma y agregarle encima un density plot que es una clase de suavizado que permite visualizar mejor la forma de la distribución.

> library(ggplot2)

> ## Density
> ggplot(InsectSprays, aes(count)) + 
        geom_histogram(aes(y=..density..), binwidth = 2,  color = "grey30", fill = "white") +
        geom_density(alpha = .2, fill = "grey60") +
        facet_grid(.~spray, scales="free_x") + theme_classic() 

density

¿Cuál es el problema con este técnica? Es díficil comparar los grupos entre sí al estar en diferentes cuadros. Podríamos ponerlos en el mismo cuadro y usar transparencias pero tampoco sería un gráfico muy fácil de entender.

Boxplot

Una alternativa mejor es el boxplot, o gráfico de cajas y tegobis*, que me gusta pensarlo como una “vista área” del histograma.

histbox

Lo mejor del boxplot es que permite comparar a simple vista las distribuciones de diferentes grupos de datos:

> ## Boxplot
> ggplot(InsectSprays, aes(x=spray, y=count, fill=spray)) + 
     geom_boxplot() + theme_classic()

boxplot

Podemos ver muy fácilmente que hay tres sprays medias más bajas y menor variabilidad (C, D y E), lo que implica que son más efectivos matando insectos. Podemos mejorar este gráfico agregando todos los puntos, de manera de tener un panorama más completo:

> ## Boxplot + Jitter
> ggplot(InsectSprays, aes(x=spray, y=count, fill=spray)) + 
     geom_boxplot() + theme_classic() + 
     geom_jitter(shape=16, position=position_jitter(0.2))

boxjitt

Violin plot

Todo piola con los boxplot, salvo que… los datos no tengan forma “de campana”. Cuando los datos son bimodales (con dos montañitas en su histograma, como un lomo de camello) o con distribución uniforme, por citar dos ejemplos, esta herramienta deja de ser buena para representarlos. Así lo mostraron Hintze y Nelson en 1998 cuando presentaron un nuevo tipo de gráfico: el violin plot.

boxviol

Mucho mejor el violin, ¿no? distribuciones diferentes, gráficos diferentes, tal como esperaríamos. Una animación que me gusta mucho para resaltar este punto es ésta (tomada de acá) que muestra como datos muy diferentes pueden dar lugar al mismo boxplot pero no pueden engañar al violin plot.

boxvio

El violin plot es una especie de híbrido entre boxplot y density plot. Para hacerlo se toma el density, se crea una copia “espejada” y se pegan juntas las dos partes. El nombre se debe a que, aparentemente, se parece a un violín pero me sumo al comentario de Rafael Irizarry de que en realidad son más parecidos a soplillos*.

sop

Si lo probamos sobre nuestros datos de insecticidas tenemos:

> ## Violin
> ggplot(InsectSprays, aes(x=spray, y=count, fill=spray)) + 
     geom_violin(trim = FALSE) + theme_classic() + 
     geom_jitter(shape=16, position=position_jitter(0.2))

violin

Pero para qué alimentar la grieta entre boxplot y violin plot si podemos tener lo mejor de los dos mundos:

lomipizza

Lomipizza

Disculpas, me equivoqué de imagen, ahora así:

> ## Boxplot + violin  
> ggplot(InsectSprays, aes(x=spray, y=count, fill=spray)) + 
     geom_violin(trim = FALSE) +
     geom_boxplot(width = 0.08, fill = "white", outlier.size = FALSE) +
     theme_classic() 
     

boxviol2

La combinación de boxplot y violin plot es algo que me gusta mucho pero debo decir que este comic de xkcd la arruinó un poco para mi XD (once you see it, you can’t unsee it).

Otras alternativas

En esta selección de métodos estoy dejando muchas otras alternativas de lado pero quiero cerrar con estas últimas dos: beeswarm y joy plot.

beeswarm es una nube de puntos “no solapados” que es muy útil en especial cuando tenemos muchos datos (no es este caso).

> ## Beeswarm
> library("ggbeeswarm")
> ggplot(InsectSprays, aes(x=spray, y=count, fill=spray)) + 
     geom_beeswarm() + theme_classic()

beeswarm

Mientras que el joy plot es otra forma de mostrar los density plots de manera de que sea más fácil de comparar entre grupos. Es una alternativa al violin plot para aquellas personas que no se acostumbran a ver las densidades en forma vertical.

> ## joy
> library(ggjoy)
> ggplot(InsectSprays, aes(x=count, y=spray, height=..density..)) +
     geom_joy(scale=0.85) + theme_classic()

joyplot

Así terminamos este primer posts de DataViz, pueden comentar en twitter ¿cuál es el gráfico que más les gusta para describir los datos? ¿conocen algún otro que les guste más que los que vimos aquí?

Desde aquí pueden descargar el script completo para R.


Notas al pie

*tegobi es bigote en lunfardo.
*soplillo es la forma que tenemos en Entre Ríos (Argentina) de nombrar a los adornos del árbol de navidad. Propongo que sea adoptada por el resto del mundo hispanoparlante debido a su brevedad.

Leave a comment