Visualización de datos en R

R es un programa muy útil para explorar y visualizar datos La librería “ggplot2” es la herramienta más eficaz para hacerlo, ggplot2 es parte de un conjunto de librerías esenciales para el análisis de datos llamada “tidyverse”. Comencemos por instalar y abrir tidyverse. Las librerías se instalan con install.packages(“LIBRERÍA”), importante poner las comillas. Y luego se abren con library(LIBRERÍA).

library(ggplot2)

Explorar una base de datos

La base de datos mpg viene como un ejemplo con el programa RStudio, esta base de datos es una colección de variables (columnas) y observaciones (filas) que podemos explorar del la agencia de protección amiental de EEUU. Para explorarla solo hay que escribir su nombre.

mpg
## # A tibble: 234 × 11
##    manufacturer model      displ  year   cyl trans drv     cty   hwy fl    class
##    <chr>        <chr>      <dbl> <int> <int> <chr> <chr> <int> <int> <chr> <chr>
##  1 audi         a4           1.8  1999     4 auto… f        18    29 p     comp…
##  2 audi         a4           1.8  1999     4 manu… f        21    29 p     comp…
##  3 audi         a4           2    2008     4 manu… f        20    31 p     comp…
##  4 audi         a4           2    2008     4 auto… f        21    30 p     comp…
##  5 audi         a4           2.8  1999     6 auto… f        16    26 p     comp…
##  6 audi         a4           2.8  1999     6 manu… f        18    26 p     comp…
##  7 audi         a4           3.1  2008     6 auto… f        18    27 p     comp…
##  8 audi         a4 quattro   1.8  1999     4 manu… 4        18    26 p     comp…
##  9 audi         a4 quattro   1.8  1999     4 auto… 4        16    25 p     comp…
## 10 audi         a4 quattro   2    2008     4 manu… 4        20    28 p     comp…
## # … with 224 more rows

Vemos las variables arriba (manufacturer, model, etc.) y las observaciones numeradas en las filas. Para ver todas las variables y de qué tipo son, usamos la función str(), mientras que la función summary() nos muestra cómo se manifiestan las variables.

str(mpg)
## tibble [234 × 11] (S3: tbl_df/tbl/data.frame)
##  $ manufacturer: chr [1:234] "audi" "audi" "audi" "audi" ...
##  $ model       : chr [1:234] "a4" "a4" "a4" "a4" ...
##  $ displ       : num [1:234] 1.8 1.8 2 2 2.8 2.8 3.1 1.8 1.8 2 ...
##  $ year        : int [1:234] 1999 1999 2008 2008 1999 1999 2008 1999 1999 2008 ...
##  $ cyl         : int [1:234] 4 4 4 4 6 6 6 4 4 4 ...
##  $ trans       : chr [1:234] "auto(l5)" "manual(m5)" "manual(m6)" "auto(av)" ...
##  $ drv         : chr [1:234] "f" "f" "f" "f" ...
##  $ cty         : int [1:234] 18 21 20 21 16 18 18 18 16 20 ...
##  $ hwy         : int [1:234] 29 29 31 30 26 26 27 26 25 28 ...
##  $ fl          : chr [1:234] "p" "p" "p" "p" ...
##  $ class       : chr [1:234] "compact" "compact" "compact" "compact" ...
summary(mpg)
##  manufacturer          model               displ            year     
##  Length:234         Length:234         Min.   :1.600   Min.   :1999  
##  Class :character   Class :character   1st Qu.:2.400   1st Qu.:1999  
##  Mode  :character   Mode  :character   Median :3.300   Median :2004  
##                                        Mean   :3.472   Mean   :2004  
##                                        3rd Qu.:4.600   3rd Qu.:2008  
##                                        Max.   :7.000   Max.   :2008  
##       cyl           trans               drv                 cty       
##  Min.   :4.000   Length:234         Length:234         Min.   : 9.00  
##  1st Qu.:4.000   Class :character   Class :character   1st Qu.:14.00  
##  Median :6.000   Mode  :character   Mode  :character   Median :17.00  
##  Mean   :5.889                                         Mean   :16.86  
##  3rd Qu.:8.000                                         3rd Qu.:19.00  
##  Max.   :8.000                                         Max.   :35.00  
##       hwy             fl               class          
##  Min.   :12.00   Length:234         Length:234        
##  1st Qu.:18.00   Class :character   Class :character  
##  Median :24.00   Mode  :character   Mode  :character  
##  Mean   :23.44                                        
##  3rd Qu.:27.00                                        
##  Max.   :44.00

Primeras gráficas

La función ggplot() nos permite crear cualquier gráfica, comenzamos con la información más básica y la vamos complementando con modificaciones estadísticas o estéticas. Vamos a crear una gráfica que compare las variables displ (tamaño del motor) con hwy (eficiencia de combustible). La estructura del código es ggplot (data=“NUESTRA BASE DE DATOS”, aes(“VARIABLE EJE X”, “VARIABLE EJE Y)) + geom_”TIPO DE GRÁFICA”

ggplot(data = mpg, aes(displ, hwy)) + geom_point()

En este caso vemos una gráfica de puntos con una relación negativa entre el tamaño del motor y la eficiencia. También podemos crear otros tipos de gráfica con geom_bar (gráfico de barras), geom_histogram (histograma), geom_line (linea), geom_boxplot (boxplot), y muchos más…

Usando colores

Con modificaciones estéticas podemos mostrar más información en la misma gráfica. Se pueden añadir complementos al código base para mostrar más variables de formas distintas. Esto se logra con aes(color = “LA VARIABLE QUE QUEREMOS MOSTRAR POR COLORES”)

ggplot(data = mpg, aes(displ, hwy)) + geom_point(aes(color = class))

También podemos mostrar esta variable con de otras formas, como con las formas de los puntos (shape), sus tamaños (size) o su transparencia (alpha); aunque no funciona tan bien para esta gráfica en particular.

ggplot(data = mpg, aes(displ, hwy)) + geom_point(aes(shape = class))

ggplot(data = mpg, aes(displ, hwy)) + geom_point(aes(size = class))

ggplot(data = mpg, aes(displ, hwy)) + geom_point(aes(alpha = class))

Además de dejar que el programa asigne los valores a las variables automáticamente, también podemos controlar de forma manual los parámetros estéticos de la gráfica:

ggplot(data = mpg, aes(displ, hwy)) + geom_point(color = "blue")

Como el color aplica para toda la gráfica, y no para las variables, no es necesario poner aes(), si incluimos el color “blue” dentro de la función aes(), lo va a tomar como una característica de las variables y no como el color:

ggplot(data = mpg, aes(displ, hwy)) + geom_point(aes(color = "blue"))

Este tipo de problemas son comunes al visualizar datos en R, por eso podemos usar ?“FUNCIÓN” para descubrir su formato y sus parámetros cuando nos encontremos con un error.

?geom_point
## starting httpd help server ... done

Facetas

Otro parámetro estético que nos sirve para visualizar distintas variables son las facetas. Son subgráficas que dividen las distintas partes de la base de datos en gráficas distintas. Para crear facetas para una variable utilizamos la función facet_wrap(~“VARIABLE”). Las variables que insertemos deben ser discretas, no continuas.

ggplot(data = mpg, aes(displ, hwy)) + 
  geom_point() + 
  facet_wrap(~class)

Podemos crear grillas con la combinación de dos variables al hacer las faceras. Para esto usamos la función facet_grid(“VARIABLE 1” ~ “VARIABLE 2”). Y podemos complementarla con funciones estéticas.

ggplot(data = mpg, aes(displ, hwy)) + 
  geom_point() + 
  facet_grid(class~cyl)

Objetos geométricos

Hasta ahora solo hemos explorado gráficas de puntos con la función geom_point(), pero dependiendo de lo que queramos encontrar, se pueden crear distintos tipos de gráficas con los mismos datos. Cada tipo de gráfica tiene sus propiedades, y se pueden usar para visualizar los datos y sus variables.

Por ejemplo la función geom_smooth() crea una línea con la tendencia de los datos, y se pueden ver distintos tipos de línea con la propiedad aes(linetype=“TIPO DE LÍNEA). Exploremos la misma gráfica de antes con esta propiedad.

ggplot(data = mpg, aes(displ, hwy)) + 
  geom_smooth(aes(linetype=drv))  
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'

Podemos comparar cómo se relaciona la eficiencia de los carros con su tamaño de motor, y dividir los carros por su tren de tracción (drv). Vemos que los carros con tracción delantera (f) tienen mejor eficiencia y menor tamaño de motor que los carros 4x4 (4).

Si no se distingue bien la gráfica, también podemos añadir color para que se diferencien mejor, y añadir la gráfica de puntos por debajo para mayor claridad.

ggplot(data = mpg, aes(displ, hwy)) + 
  geom_smooth(aes(linetype=drv, color=drv)) +
  geom_point(alpha=1/5, aes(color=drv))
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'

Dentro de estas gráficas adicionales, podemos modificar los parametros globales como “data=” o los ejes para mostrar subcategorías. Por ejemplo, con la función filter(“BASE DE DATOS”, “VARIABLE”==“SUBCATEGORÍA”) podemos aislar una categoría para mostrar en la gráfica. Reutilizaremos la gráfica de puntos con la clase del carro, y pero con una gráfica de línea para los carros “subcompact”.

ggplot(data = mpg, aes(displ, hwy)) + 
  geom_point(aes(color = class)) +
  geom_smooth(data = dplyr::filter(mpg, class=="subcompact"))
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'

La sombra está ocultando algunos de los datos, podemos quitarla con el parámetro “se = FALSE”. También podemos hacer que la línea sea del mismo color que los puntos de su categoría al incluir el color en los parámetros globales (ggplot()):

library(dplyr)

ggplot(data = mpg, aes(displ, hwy, color=class)) + 
  geom_point(aes(color = class)) +
  geom_smooth(data = dplyr::filter(mpg, class == "subcompact"), se=FALSE)

Por último, vamos a ver cómo transformar los datos para mostrar puntos que pueden estar ocultos. En todas las gráficas anteriores, los puntos de hwy y displ aparecen ordenados en una especie de cuadrícula, lo que nos indica que pueden haber algunos puntos por encima de otros. Esto impide ver la concentración de los puntos en ciertas partes de la gráfica. Podemos modificar la posición de los puntos con el parámetro “position=”, que hace que los puntos se desplacen aleatoriamente un poco para poder verlos mejor. Acá la comparación:

ggplot(data = mpg, aes(displ, hwy)) + 
  geom_point(position = "identity")

ggplot(data = mpg, aes(displ, hwy)) + 
  geom_point(position = "jitter")

Position=“identity” refleja los datos originales, mientras que position=“jitter” nos permite ver cómo están acumulados. Esto también aplica para gráficas de barras, con las posiciones “dodge”, “fill” y “stack”. Las gráficas de barras se crean con geom_bar() y solo necesitan el eje X.

ggplot(data = mpg, aes(class, fill=drv)) +
  geom_bar(position = "stack")

ggplot(data = mpg, aes(class, fill=drv)) +
  geom_bar(position = "fill")

ggplot(data = mpg, aes(class, fill=drv)) +
  geom_bar(position = "dodge")

Estas son distintas maneras de ver cómo se distribuyen los distintos trenes de tracción (drv) entre las clases de carro. Si queremos voltear la gráfica para ver la cuenta de los carros en el eje X, podemos aplicar la función coordflip() al final de la gráfica. La función coord_polar() transforma los datos a coordenadas polares en un eje de 360° grados.

ggplot(data = mpg, aes(class, fill=drv)) +
  geom_bar(position = "stack") + 
  coord_flip()

ggplot(data = mpg, aes(class, fill=class)) +
  geom_bar(position = "stack")+
  coord_polar()

A manera de resumen, esta es la estructura general para crear un gráfico con ggplot2:

ggplot(data = "BASE DE DATOS", aes(EJE X, EJE Y)) + GEOM_FUNCTION(aes("MAPPINGS"), stat = "STAT", position = "POSICIÓN") + "COORDINATE_FUNCTION" + "FACET_FUNCTION"

observa la siguiente gráfica para identificar todos los componentes:

ggplot(data = mpg, aes(displ, hwy, color=drv)) + 
  geom_point(alpha=1/2, size=1, position = "jitter") + 
  geom_smooth(se=FALSE) +
  scale_color_brewer(palette = "Dark2", guide = guide_legend(title="Tren de tracción")) +
  scale_y_log10(guide = guide_axis(title = "Eficiencia del motor")) + 
  scale_x_continuous(guide = guide_axis(title = "Tamaño del motor")) +
  facet_wrap(~drv, nrow = 1) + 
  ggtitle("Relación entre el tamaño del motor y su eficiencia 
          dependiendo del tren de tracción") + 
  coord_cartesian()
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'