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)
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
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…
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
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)
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'