Tidyverse

Tidyverse es una colección de paquetes de R de código abierto especialiados en la importación, ordenamiento, modificación y visualización de datos. Sus estructuras son muy similares, de forma que existe coherencia e integración entre ellos, optimizando así la aplicación de sus funciones en la ciencia de datos. Estos paquetes y sus funciones son los mostrados a continuación:

Librería Descripción
ggplot2 Biblioteca para visualización de datos, basada en la gramática de los gráficos. Permite crear gráficos atractivos y personalizados.
dplyr Proporciona herramientas para manipulación y transformación eficiente de datos, incluyendo filtrado, selección de columnas, ordenamiento y agregación.
tidyr Librería para la manipulación de datos tabulares, permitiendo reorganizar, separar o combinar columnas y filas. Es especialmente útil para convertir datos en formato “wide” a “long” y viceversa.
readr Ofrece funciones para leer y escribir datos en diferentes formatos, como CSV, TSV y archivos de ancho fijo. Proporciona una forma rápida y eficiente de importar y exportar datos en R.

existen más librerias, sin embargo para alcanzar el objetivo de este cursillo vamos a profindizar en ggplot2

Llamar la librería

Al llamar la librería Tidyverse, estamos llamando la librería de ggplot2 que es la que se va a usar en esta parte del cursillo

library(ggplot2)

La librería ggplot2 permite hacer un gran número de graficos con mucho mejor calidad que los graficos que tienen r por defecto, vamos a trabajar la siguiente base de datos

tail(mpg)
## # A tibble: 6 × 11
##   manufacturer model  displ  year   cyl trans      drv     cty   hwy fl    class
##   <chr>        <chr>  <dbl> <int> <int> <chr>      <chr> <int> <int> <chr> <chr>
## 1 volkswagen   passat   1.8  1999     4 auto(l5)   f        18    29 p     mids…
## 2 volkswagen   passat   2    2008     4 auto(s6)   f        19    28 p     mids…
## 3 volkswagen   passat   2    2008     4 manual(m6) f        21    29 p     mids…
## 4 volkswagen   passat   2.8  1999     6 auto(l5)   f        16    26 p     mids…
## 5 volkswagen   passat   2.8  1999     6 manual(m5) f        18    26 p     mids…
## 6 volkswagen   passat   3.6  2008     6 auto(s6)   f        17    26 p     mids…

¿Cómo podrías mostrar las 20 primeras filas de este conjunto?

  • Tienes que utilizar print(). Puedes averiguar cómo usarlo escribiendo el comando ?print en la consola.

  • Utiliza el argumento n = dentro del comando anterior.

  • Puede usar ? para pedirle ayuda a r, y saber cual es el argumento n de la función

Solución

print(mpg, n = 20)
## # 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…
## 11 audi         a4 quattro   2    2008     4 auto… 4        19    27 p     comp…
## 12 audi         a4 quattro   2.8  1999     6 auto… 4        15    25 p     comp…
## 13 audi         a4 quattro   2.8  1999     6 manu… 4        17    25 p     comp…
## 14 audi         a4 quattro   3.1  2008     6 auto… 4        17    25 p     comp…
## 15 audi         a4 quattro   3.1  2008     6 manu… 4        15    25 p     comp…
## 16 audi         a6 quattro   2.8  1999     6 auto… 4        15    24 p     mids…
## 17 audi         a6 quattro   3.1  2008     6 auto… 4        17    25 p     mids…
## 18 audi         a6 quattro   4.2  2008     8 auto… 4        16    23 p     mids…
## 19 chevrolet    c1500 sub…   5.3  2008     8 auto… r        14    20 r     suv  
## 20 chevrolet    c1500 sub…   5.3  2008     8 auto… r        11    15 e     suv  
## # … with 214 more rows

Otra solución válida es:

mpg[1:20,]
## # A tibble: 20 × 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…
## 11 audi         a4 quattro   2    2008     4 auto… 4        19    27 p     comp…
## 12 audi         a4 quattro   2.8  1999     6 auto… 4        15    25 p     comp…
## 13 audi         a4 quattro   2.8  1999     6 manu… 4        17    25 p     comp…
## 14 audi         a4 quattro   3.1  2008     6 auto… 4        17    25 p     comp…
## 15 audi         a4 quattro   3.1  2008     6 manu… 4        15    25 p     comp…
## 16 audi         a6 quattro   2.8  1999     6 auto… 4        15    24 p     mids…
## 17 audi         a6 quattro   3.1  2008     6 auto… 4        17    25 p     mids…
## 18 audi         a6 quattro   4.2  2008     8 auto… 4        16    23 p     mids…
## 19 chevrolet    c1500 sub…   5.3  2008     8 auto… r        14    20 r     suv  
## 20 chevrolet    c1500 sub…   5.3  2008     8 auto… r        11    15 e     suv

Se puede notar que el método de la solución no es único

GRÁFICOS

es una biblioteca de visualización de datos en R que utiliza la gramática de gráficos para crear visualizaciones atractivas y personalizadas. Con ggplot2, puedes crear gráficos de alta calidad utilizando una combinación de capas estéticas y geométricas.

El enfoque principal de ggplot2 es permitirte construir gráficos de forma iterativa, agregando capas de información una a una. Cada capa representa una componente específica del gráfico, como puntos, líneas, barras o áreas. Puedes personalizar cada capa mediante una amplia gama de opciones estéticas, como colores, tamaños y formas.

Además de las capas geométricas, ggplot2 también permite agregar capas estadísticas, que representan resúmenes de los datos subyacentes, como medias, medianas o intervalos de confianza. Estas capas estadísticas proporcionan una forma conveniente de resumir y visualizar tendencias o patrones en los datos.

El proceso de construcción de un gráfico con ggplot2 sigue un flujo coherente. Primero, especificas el conjunto de datos que deseas visualizar y mapeas variables a estéticas, como colores o tamaños. Luego, añades capas geométricas y estadísticas para representar visualmente los datos. Puedes personalizar aún más el gráfico ajustando los ejes, agregando leyendas y anotaciones, cambiando los temas visuales, entre otras opciones.

Una de las fortalezas de ggplot2 es su flexibilidad y capacidad para crear gráficos altamente personalizados. Puedes ajustar cada aspecto del gráfico utilizando una amplia variedad de funciones y opciones. Además, ggplot2 está diseñado para funcionar bien con la filosofía del “tidy data” y se integra sin problemas con otras librerías del tidyverse, como dplyr y tidyr, lo que facilita la manipulación y visualización de datos en un flujo de trabajo coherente.

En resumen, ggplot2 enriquece la visualización de datos en R al proporcionar una forma estructurada y poderosa de crear gráficos personalizados utilizando la gramática de los gráficos. Con su enfoque iterativo y su amplia gama de opciones de personalización, ggplot2 es una herramienta invaluable para explorar y comunicar patrones y tendencias en tus datos.

La sintaxis de ggplot2 tiene tres aspectos a considerar: data, mapping y geometría

#ggplot(data = <DATOS>) + 
#  <FUNCIÓN_GEOM>(mapping = aes(<VARIABLES>))
Geometría Descripción
geom_point Puntos individuales en el gráfico.
geom_line Líneas que conectan los puntos en orden.
geom_path Líneas que conectan los puntos en el orden en que aparecen en los datos.
geom_bar Barras verticales o horizontales.
geom_histogram Histogramas que cuentan la frecuencia de los valores en un rango.
geom_boxplot Diagramas de caja y bigotes para resumir la distribución de los datos.
geom_area Áreas sombreadas bajo una línea o entre dos líneas.
geom_density Gráfico de densidad que muestra la distribución de los datos.
geom_tile Cuadrados o rectángulos de igual tamaño para representar valores en una matriz.
geom_polygon Polígonos definidos por una secuencia de coordenadas.
geom_text Etiquetas de texto colocadas en ubicaciones específicas en el gráfico.
geom_label Etiquetas de texto con una caja de fondo.
geom_ribbon Bandas sombreadas entre dos líneas.
geom_errorbar Barras de error que representan la incertidumbre en los datos.
geom_smooth Curva suavizada que muestra una tendencia en los datos.
ggplot(data = mpg) + 
  geom_point(mapping = aes(x = displ, y = hwy))

# Prueba a hacer lo mismo, pero representando el gasto en carretera vs. el gasto en ciudad. ¿Qué observas?

ggplot(data = mpg) + 
  geom_point(mapping = aes(x = hwy, y = cty))

Aesthetics

El comando aes(), además de para introducir las variables principales (x e y), sirve para introducir otras variables y modificar de qué forma se van a ver en la gráfica. Ilustrándonos con el ejemplo anterior, podemos ver cómo la gráfica nos muestra la relación que existe entre el consumo de un determinado vehículo y su cilindrada. Si quisiéramos observar la relación que tienen estos resultados con la variable class (el tipo de coche), podemos introducirla dentro del comando aes() como propiedad visual.

Representamos la clase de coche dentro de la gráfica anterior cambiando el color de los puntos empleando el argumento color:

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

Observando el ejemplo anterior, ¿a qué conclusión puedes llegar en relación al tipo de vehículo, su gasto en carretera y su cilindrada?

Observación

Note que con este simple gráfico se pueden ver como interaccionan tres variables

Podemos mapear cualquier variable dentro del gráfico incluyéndola en aes(). Además, podemos elegir que propiedad visual asignar a esta (color, tamaño de los puntos…). Podemos representar el tipo de vehículos cambiando el tamaño de los puntos (con size):

ggplot(data = mpg) + 
  geom_point(mapping = aes(x = displ, y = hwy, size = class))
## Warning: Using size for a discrete variable is not advised.

ggplot(data = mpg) + 
  geom_point(mapping = aes(x = displ, y = hwy, alpha = class))
## Warning: Using alpha for a discrete variable is not advised.

ggplot(data = mpg) + 
  geom_point(mapping = aes(x = displ, y = hwy, shape = class))
## Warning: The shape palette can deal with a maximum of 6 discrete values because
## more than 6 becomes difficult to discriminate; you have 7. Consider
## specifying shapes manually if you must have them.
## Warning: Removed 62 rows containing missing values (geom_point).

Estos ejemplos, sin embargo, muestran una serie de problemas. En los dos primeros se dificulta la visión de algunos puntos, mientras que en el tercero ggplot2 únicamente representa seis formas de puntos, que son fácilmente diferenciables entre sí. Cuando el número de valores es mayor a seis, se dejan de representar algunas de estos.

Estos aesthetics, por tanto, solo se emplean en casos muy específicos.

Nota

Puedes diseñar otras gráficas empleando diferentes aesthetics. Prueba a mirar todos los aesthetics posibles para el diagrama de dispersión usando ?geom_point.

Una cosa muy importante para tener en cuenta es que aes() solo sirve para modificar las gráficas con respecto a una variable. También podemos modificarla sin tener en cuenta los valores. Por ejemplo, podemos cambiar el color de todos los puntos sacando color del comando aes():

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

Diseña un diagrama de dispersión que represente la cilindrada vs. el gasto en ciudad

ggplot(data = mpg) + 
    geom_point(mapping = aes(x = displ, y = cty))

# Sobre la gráfica del ejercicio anterior, cambia la forma de los puntos por cuadrados (shape = 15) y representa el tipo de combustible según el color.

ggplot(data = mpg) + 
    geom_point(mapping = aes(x = displ, y = cty, color = fl), shape = 15)

En el ejemplo anterior, ¿cómo modificarías la gráfica de forma que represente aquellos vehículos con una cilindrada menor que 5 de un color y aquellos con cilindrada mayor de otro?

ggplot(data = mpg) + 
    geom_point(mapping = aes(x = displ, y = cty, color = displ < 5))

Gráficos estadísticos

Son gráficos estadísticos aquellos que representan datos cuantitativos. Entre ellos encontramos los gráficos de dispersión (repasados en el apartado anterior), diagramas de barras, diagramas de cajas, histogramas, etc. Para estudiar estos gráficos vamos a usar un nuevo conjunto de datos denominado “diamonds”, incluido en ggplot2, que contiene información sobre diferentes propiedades de un gran número de diamantes.

Empecemos estudiando los gráficos de barras empleando el comando geom_bar(), de la misma forma que con los gráficos de dispersión.

Imaginemos que queremos clasificar los diamantes según la calidad del corte (variable cut). Para ello, usamos:

ggplot(data = diamonds) + 
  geom_bar(mapping = aes(x = cut))

ggplot2 interpreta automáticamente que, al no concretar la variable y, debe representar el número total de diamantes por calidad de corte. Para ello, ggplot2 emplea unas transformaciones estadísticas capaces de crear nuevas variables modificando las ya existentes. En este caso, lo que hace es contar el número de diamantes dentro de cada tipo de corte.

Al igual que el resto de gráficas, empleando aes() puedes modificar la apariencia del gráfico de barras. En los gráficos de barras, color cambia el color del borde de las barras y fill cambia el color del relleno.

Por ejemplo, podemos representar la claridad de los diamantes (variable clarity) de la siguiente forma:

ggplot(data = diamonds) + 
  geom_bar(mapping = aes(x = cut, fill = clarity))

También podemos representar diagramas de cajas, empleando la función geom_box. Como ejemplo, podemos representar el gasto en carretera según el tipo de coche de la siguiente manera:

ggplot(data = mpg) + 
  geom_boxplot(mapping = aes(x = class, y = hwy))

Si necesitamos girar la gráfica, simplemente añadimos coord_flip() justo a continuación:

ggplot(data = mpg) + 
  geom_boxplot(mapping = aes(x = class, y = hwy)) +
  coord_flip()

# Gráficas múltiples A veces, para facilitar la visualización de los datos, es necesario representar varias gráficas a la vez. Para ello, existen dos formas:

Supongamos que necesitamos representar una línea de tendencia del gasto en carretera con respecto a la cilindrada. Usando geom_smooth() dibujamos una línea de tendencia suavizada del conjunto de datos propuesto:

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

Si quisiéramos representar esta línea como una capa sobre un diagrama de dispersión, simplemente escribimos sus respectivas funciones geom una después de la otra:

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

Podemos combinar tantas capas como queramos, siempre y cuando no existan incoherencias entre las variables representadas.

Gráficas por ventanas (facets)

Supongamos que queremos representar el gasto en carretera con respecto a la cilindrada. Imaginemos también que queremos representar los tipos de vehículos. Podemos hacer como hicimos antes, es decir, representar los tipos de vehículos según el color. Esto, sin embargo, a veces puede resultar en gráficas difíciles de observar, pues es complicado distinguir los diferentes valores.

Para solucionar esto podemos usar los facets, con los que es posible representar muchas gráficas a la vez dividiendo las variables en numerosos paneles. Para ello, usamos facet_wrap(). Se usa de la siguiente forma:

ggplot(data = mpg) + 
  geom_point(mapping = aes(x = displ, y = hwy)) +
  facet_wrap(~ class, nrow = 2)

ggplot(data = mpg) + 
  geom_point(mapping = aes(x = displ, y = hwy)) +
  facet_grid(drv ~ cyl)

Los facets son muy útiles cuando queremos tener una visión global de todas las posibles representaciones que podemos hacer para luego seleccionar la que más nos interese.

Con el material visto hasta ahora, estamos bastante preparados para representar datos ordenados de forma lógica y agradable. Existen muchísimas más opciones para graficar empleando ggplot2, aunque en este tutorial únicamente hemos mostrado lo que nos parece esencial. Si quieres saber más, puedes revisar el resto de posibilidades aquí).

EJERCICIOS PROPUESTOS

SELECCIONE UNO PARA EXPONER SU AVANCE EN EL CURSILLO

PRIMER EJERCICIO

Con la base de datos ‘iris’ que tiene por defecto R, realizar:

SEGUNDO EJERCICIO

Con la base de datos ‘economics’ que tiene por defecto R, realizar: