Visualización de datos en R

Javier Emmanuel Anguiano Pita

CONAHCYT-Universidad de Guadalajara

9 de enero de 2025

Agenda del día

  1. Ejercicios de manipulación de datos con dplyr
  2. Introducción a la visualización de datos con ggplot()
  • Sintáxis básica de uso.

  • Personalización de gráficas.

  • Integridad y excelencia en el uso de gráficas.

Ejercicio

10:00
  • Importa el archivo 02_taylor-swift-spotify.csv (lo puedes obtener de este Enlace. Usa la función View() para visualizar la base de datos.

  • Usa la función summarise() para calcular el promedio de la variable danceability y el número de canciones incluidas en cada albúm.

  • Crea un subconjunto de los datos denominado maxpop (máxima popularidad) que contenga las variables: name, album, relase_date, danceability y popularity para las 10 canciones más populares. Usa las funciones arrange() y row_number(). Muestra el valor de la variable popularidad en orden descendente.

Visualización de datos

Los primeros gráficos conocidos aplicados a datos económicos fueron elaborados por William Playfair (1759-1823), un ingenierio mecánico y economista político escocés, en su libro The Commercial and Political Atlas y The Statistical Breviary.

Exportaciones e importaciones de y para Dinamarca y Noruega desde 1700 a 1780

Exportaciones e importaciones de y para Dinamarca y Noruega desde 1700 a 1780

William Playfair (1759-1823)

Se le considera el pionero en el uso del gráfico de líneas para representar series de tiempo, y fue el creador del gráfico circular, de sectores y de barras.

“La información que se adquiere de forma imperfecta generalmente se retiene de forma imperfecta; una persona que ha investigado detenidamente una tabla impresa descubre, al finalizar, que solo tiene una idea muy vaga y parcial de lo que ha leido, y que, al igual que una figura impresa en la arena, pronto queda totalmente borrada y desfigurada […].

Al observar atentamente cualquiera de estos gráficos, se logrará una impresión suficientemente clara que permanecerá intacta durante un tiempo considerable y, la idea que perdure, será sencilla y completa […]”

— William Playfair en The Commercial and Political Atlas

E.J. Marey, La méthode graphique

Ilustración por Alisson Horst

Introducción a ggplot2

  • ggplot2 es una reimplemantación de los principios propuestos por Hadley Wickham en el libro The Grammar of Graphics.
  • El paqute contiene MUCHAS funciones para generar MUCHOS tipos de gráficas.
  • Las gráficas se construyen usando múltiples capas.

Fuente: towardsdatascience.com

Fuente: towardsdatascience.com

Preparación de los datos

En esta sesión vamos a usar datos de The World Inequality Database Descarga aquí. (La base está disponible en la página del curso)


library(tidyverse)
wid <- read.csv("Datos/wid_dataset.csv")
glimpse(wid)
Rows: 1,610
Columns: 6
$ country   <chr> "Algeria", "Algeria", "Algeria", "Algeria", "Algeria", "Alge…
$ continent <chr> "Africa", "Africa", "Africa", "Africa", "Africa", "Africa", …
$ year      <int> 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, …
$ fshare    <dbl> 0.0992, 0.1120, 0.1201, 0.1206, 0.1160, 0.1221, 0.1232, 0.12…
$ top1      <dbl> 0.1003, 0.0991, 0.0991, 0.0991, 0.0991, 0.0991, 0.0991, 0.09…
$ inc_head  <dbl> 12610.627, 12619.984, 12634.026, 12531.988, 12546.430, 12533…
  • Variables:

    • fshare: Proporción de ingresos generados por mujeres.
    • top1: Proporción de personas en percentil 1 de ingresos.
    • inc_head: Ingreso per cápita (adultos)

Uso de la función ggplot()

  • La función ggplot() sin ningún argmuento nos genera un lienzo (canvas) en blanco. Sobre este lienzo podemos agregar:
    • 🔢 Datos: Especificar un dataframe con las variables y valores a graficar.
    • 📐 Mapeo de los valores (aesthetics): definimos el orden de las variables respecto a los ejes (X, Y).
    • 📉 Geometría: Describimos como representamos cada observación. Podemos usar múltiples capas para tener diferentes representaciones de nuestros datos.
  • Visita el Cheatsheet de ggplot2 para conocer más sobre su implementación.

Ejemplo: World Inequality Database

# install.packages("ggplot2")  # Contenido en Tidyverse

library(ggplot2)           # Llamamos a la librearía

ggplot(data = wid,        # Generamos canvas e indicamos datos
       aes(x = inc_head,  # Definimos ejes y variables
           y = top1)) +   # + Añadimos una capa extra
  geom_point()            # Definimos geometría 

Uso del operador pipe %>%

Podemos usar el operador pipe (%>% o |>) en combinación con ggplot():

wid %>%                     # Datos
  ggplot(aes(x = inc_head,  # Mapeo (Aesthetics)
             y = top1)) +
  geom_point()              # Geometría

Uso de dplyr y ggplot

wid %>% 
  filter(country == "Mexico") %>%  
  ggplot(aes(year, fshare)) +
  geom_line() 

Ejemplo de otras geometrías

wid %>%
filter(year == "2010") %>%
ggplot(aes(inc_head)) +
geom_histogram()
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Personalización de la estética

Ejes: Las funciones más rápidas para las modificaciones más comunes.

wid %>%
  ggplot(aes(inc_head, top1)) +
  geom_point() +
  xlab("Ingreso per cápita") +
  ylab("Proporción ingreso 1% más alto") +
  xlim(NA, 50000)

wid %>%
  ggplot(aes(inc_head, top1)) +
  geom_point() +
  xlab(NULL) +
  ylab("") +
  ylim(0.2, 0.3)

Uso de temas en ggplot

  • El sistema de temas también te permite controlar la apariencia de todos los elementos (no datos) del gráfico. La librería tiene temas por defecto.

...+
    theme_gray(base_size = 10) # Cambiar tamaño de fuente
?theme  # Capítulo 8 de Wickham (2016)

Atributos de las geometrías

Podemos personalizar la apariencia de nuestras observaciones especificando su forma, color, tamaño/ancho y la transparencia ( alpha ).

df <- data.frame(x = rnorm(15000), y = rnorm(15000))
norm <- df %>%
  ggplot(aes(x,y))
  norm + geom_point()

Problemas de superposición (overplotting)

Problemas de superposición (overplotting)

library(patchwork)

plot1 <- norm + geom_point(size = 3)
plot2 <- norm + geom_point(size = 2) 
plot3 <- norm + geom_point(size = 0.5)

(plot1 | plot2 | plot3) 
plot1 <- norm + geom_point(size = 3)
plot2 <- norm + geom_point(size = 3,
                           shape = 1) # Cambiar forma
plot3 <- norm + geom_point(size = 3,
                           shape = "X")

(plot1 | plot2 | plot3)

plot1 <- norm + geom_point(size = 3)
plot2 <- norm + geom_point(size = 3, alpha = 1/2) 
plot3 <- norm + geom_point(size = 3, alpha = 0.1)

(plot1 | plot2 | plot3) 

Ejemplo: Cambiar el tamaño de los puntos

Ejemplo: Cambiar la forma de los puntos

Ejemplo: Cambiar la transparencia de los punto

Añadir dimensiones a las gráficas

Podemos añadir más variables usando el componente estético para representar nuestros datos con diferentes colores, formas y tamaños.

  • ggplot2 convierte automáticamente el nombre de los continentes a variables categóricas y asigna un color.
  • Si usamos variables continuas mostrará un gradiente de colores.
  • La escala de colores puede personalizarse . Véase el Capítulo 6 del libro ggplot2 para más detalles
wid %>% 
  ggplot(aes(x = inc_head, 
             y = top1,
             color = continent)) +
  geom_point()

Ejemplo: Añadir dimensiones

Facetas en ggplot2

Podemos utilizar facetas (gráficos de paneles) para visualizar variables categóricas:

wid %>% 
  ggplot(aes(inc_head, top1)) +
  geom_point(alpha = 0.3) + 
  facet_wrap(~continent)
  • La función facet_wrap() crea subconjuntos de los datos y muestra una gráfica para cada subconjunto.

  • Podemos personalizar el arreglo de las facetas usando las opciones nrow y ncol.

wid %>% 
  ggplot(aes(inc_head, top1)) +
  geom_point(alpha = 0.3) + 
  facet_wrap(~continent, 
             ncol = 3, 
             nrow = 6)

Ejemplo: Uso de facetas

Guardar gráficas

  • La función ggsave() es útil para guardar las gráficas que tenemos activas en el panel plot.
ggsave("../grafica.png")  # Guarda el gráfico con extensión .png

ggsave("../grafica.png",   # Donde
       plot = last_plot(), # Que guardamos
       width = 16,         # Dimensiones
       height = 9, 
       units = "cm")       # Unidades

::::::