Inteligencia Analítica de Datos con R

Visualización de datos y gráficos

Msc. Roberto Trespalacios

Universidad Tecnológica de Bolivar

7/11/22

Visualización de datos y gráficos con R

La librería ggplot2

Visualización de datos con ggplot2

La visualización de datos es una de las etapas fundamentales en el análisis de datos porque se relaciona con la comunicación de los resultados. Una buena visualización permite:

  • condensar mucha información
  • evidenciar nuestro punto de vista
  • contar historias con datos
  • ggplot2 es uno de los paquetes que está dentro de tidyverse y es el paquete más utilizado para hacer gráficos.

Las capas de los gráficos de la librería ggplot2

Sobre la librería ggplot2

  • El paquete o librería ggplot2 es uno de los paquetes dentro de la colección tidyverse.
  • Está basado en la teoría de “grammar of graphics” (la gramática de los gráficos)
  • Permite construir los gráficos por capas, controlando las características individuales de cada uno.
  • Esto implica que podemos controlar desde la estructura del gráfico (títulos, ejes) hasta todo lo que pasa dentro de la visualización.

Las capas Data, Aesthetics y Geometries

Estas tres capas son las esenciales para hacer un gráfico en ggplot2.

  • Data (Datos): La fuente de datos que usaremos para graficar los datos.
  • Aesthetics (Estética): Son las modificaciones estéticas que haremos asignando variables al gráfico.
  • Geometries (Geometría): Va a ser la forma geométrica con la que vamos a representar los datos (barras, líneas, puntos, etc.).

Las capas Facets, Statistics, Coordinates y Theme

Las siguientes capas nos permiten controlar otros aspectos de la visualización.

  • Facets (Facetas o lados): Si tenemos un gráfico que combina varios elementos, los facets nos permiten un gráfico individual por cada elemento.
  • Statistics (Estadística): Podemos agregar una capa que incorpore por ejemplo una regresión lineal o bien una referencia como un valor promedio.
  • Coordinates (Ejes): Nos permite controlar los ejes, desde su presentación, o incluso los límites, etc..
  • Theme (Estilo): Controla aspectos visuales sobre el fondo, fuente, ejes, etc..

Installación de la librería ggplot2

Como siempre, necesitamos instalar y cargar el paquete para utilizarlo. Si ya instalamos tidyverse() no hace faltar volver a instalar ggplot2; de lo contrario, lo instalamos.

install.packages("ggplot2")

Luego, tenemos que cargar el paquete. También cargaremos otros paquetes para cargar y manipular datos.

Cargar los paquetes ggplot2 y dplyr

library(ggplot2)   # Visualización de datos
library(dplyr)    # Limpieza y manipulación de datos

Haciendo gráficos con ggplot2

La sintáxis básica de ggplot2 es la siguiente:

ggplot(nombre_dataframe, aes(x, y)) +
         geom_XXX
  1. La función para hacer gráficos siempre será ggplot().
  2. Luego tenemos que poner el nombre del data frame.
  3. Adentro del aes() ponemos las columnas que queremos ver reflejadas en el gráfico(mapear).
    • Podemos verlas reflejadas en los ejes x, e y.
    • Pueden usarse para modificar el color y el tamaño de los elementos de un gráfico.
  4. Con geom_xxx() le indicamos la forma geométrica que puede adoptar la visualización (gráficos, puntos, líneas, etc.).
  5. Para sumar capas en un gráfico tenemos que usar el signo +.

Algunos tipos de gráficos en ggplot2

  • geom_histogram(): Para graficar histogramas. Nos permiten ver la distribución de una variable numérica. Se puede graficar mapeando una sola variable al menos.
  • geom_freqpoly(): También nos permite ver la distribución de una variable numérica, atenuando la curva. Se puede graficar mapeando una sola variable al menos.
  • geom_boxplot(): Hace gráficos boxplot, también conocidos como de bigote y caja. Permite visualizar una gran cantidad de información estadística.
  • geom_bar(): Hace gráficos de barras. El largo de las barras lo determina la cantidad de filas de lo que estemos mapeando. Funciona incluso con un sólo eje.
  • geom_col(): También hace gráficos de barra pero el largo lo determina el valor de la/s celda/s que grafiquemos. Necesita por lo menos mapear una variable para el eje x, y otro para el eje y.
  • geom_line(): Para hacer gráficos de línea.
  • geom_point(): Para hacer gráficos de dispersión (también conocidos como scatter plots).

Histogramas

geom_histogram()

  • Los histogramas son un tipo de gráfico que nos permite ver la distribución de una variable numérica, y entre otras cosas, analizar por ejemplo su simetría.
  • Por default, geom_histogram() divide a la variable numérica en 30 secciones con un rango de valores.
  • El largo de cada barra estará determinado por la cantidad de observaciones que quedan dentro de cada rango de valores.

Hagamos un histograma de la variable ventas del data.frame carseats.

library(ggplot2)

# Hagamos un histograma de ventas del data frame carseats
ggplot(data = carseats, aes(x = ventas)) +
  geom_histogram()
  • Cada barra de un histograma en R se llama bin.
  • Podemos controlar la cantidad de barras que vemos usando dentro de geom_histogram()
  • El parámetro bins y asignando el número que más nos sirva.
  • También podemos modificar el ancho de los bins con el parámetro bindwidth.

Histogramas - modificaciones

Podemos modificar la cantidad de bins a 15

ggplot(carseats, aes(x = ventas)) +
  geom_histogram(bins = 10)

Modifiquemos el ancho de los bins por 2

ggplot(carseats, aes(x = ventas)) +
  geom_histogram(binwidth = 4)

Histogramas con geom_freqpoly()

geom_freqpoly()

  • Una alternativa a los histogramas es geom_freqpoly()
  • Permite ver la forma de la distribución, generando un poligono de frecuencias al centro de cada bin(columnas).
  • Tenemos la función geom_density() permite ver una curva de la distribució.

Hacer un poligono de frecuencias sobre el histograma de ventas

# Hacer un histograma de ventas y combinarlo con poligono de frec
ggplot(carseats, aes(x = ventas)) +
  geom_histogram() +
  geom_freqpoly()

Hacer la curva de distribución empirica de la variable ventas

# Hacer un histograma de ventas y combinarlo con poligono de frec
ggplot(carseats, aes(x = ventas)) +
  geom_histogram() +
  geom_freqpoly()

Agregando color a las columnas

Podemos agregar colores a las columnas y los bordes del histograma

# Hacer un histograma de ventas y combinarlo con poligono de frec
ggplot(carseats, aes(x = ventas)) +
  geom_histogram(color = "white", fill = "lightblue") +
  geom_freqpoly()

Diagrama de boxplot (Cajas y bigotes)

geom_boxplot()

Los boxplots son gráficos que contienen una gran cantidad de información estadística.

En este gráfico podemos ver:

  • Los cuartiles 1 y 3 (Q1 y Q3) en los bordes de la caja.
  • La mediana que es la linea dentro de la caja.
  • Los outliers, representados en puntos, que son observaciones que superan una vez y media (1.5 veces) el rango intercuartil (Q3-Q1).
  • Además, la extensión de la caja nos permite tener una idea de la distribución de los datos.

Comparemos el boxplot e histograma

Hacer un boxplot básico de la variable ventas

ggplot(carseats, aes(x = ventas)) +
  geom_boxplot()

Histograma y poligono para ventas

# Hagamos un histograma de ventas del data frame carseats
ggplot(data = carseats, aes(x = ventas)) +
  geom_histogram()
  • En los tipos de gráficos que contienen una superficie, como:
    • boxplots
    • gráficos de barras
    • circulares
  • El parámetro que necesitamos para modificar los colores en función de una variable se llama fill y lo tenemos que usar dentro del aes().

Mapear la variable eeuu con el parámetro fill, sobre la variable ventas

ggplot(carseats, aes(y = ventas, fill = eeuu)) +
  geom_boxplot()

Practiquemos

Usando los data.frames carseats realizar los siguientes gráficos:

  1. Realizar un histograma de la variable ingreso
  2. Realizar un histograma con su poligono de frecuencias de la variable precio (deben haber 10 binds)
  3. Realizar un boxplot, mapeando la variable urbano en el eje x y la variable precio, en el eje y.

Gráficos de barra

geom_bar()

La función geom_bar(): El largo de la barra lo determina la cantidad de filas de una columna. Se pueden hacer mapeando una sola variable.

Otras geometrías para hacer barras

  • geom_col(): El largo de la barra lo determina el valor de la celda. Otra diferencia con geom_bar(), es que necesitamos mapear una variable al eje x y otra variable al eje y.

Otras geometrías para hacer barras

Usemos el data.frame carseats para probar ambos gráficos.

Hacer un gráfico de barras mapeando estantería al eje x usando geom_bar() y fill lo mapeamos con eeuu

ggplot(carseats, aes(x = estanteria, fill = eeuu)) +
  geom_bar() 

Si mapeamos, por ejemplo la variable genero al color, podemos controlar la posición de las barras con los siguientes parámetros:

  • position = “dodge”: Para poner las barras una al lado de la otra.
  • position = “identity”: Pone una barra detrás de la otra.
  • position = “stack”: Para hacer gráficos apilados. Es la opción por default de geom_bar().
  • position = “fill”: Para hacer un gráfico apilado al 100%

Las visualizaciones también se pueden guardar en objetos. Lo cual nos permite ahorrar mucho tiempo escribiendo.

ggplot(carseats, aes(x = estanteria, fill = eeuu)) +
  geom_bar(position = "dodge") 

La función geom_col() (parecida a geom_bar())

Supongamos que queremos saber si el promedio de ventas, depende del lugar donde se encuentra el producto en la estantería. Debemos procedes así:

ventas_estanteria <- carseats %>% 
  group_by(estanteria) %>%     # Agrupo por estanteria
  summarise(ventas_promedio = mean(ventas)) %>% # Calculo ventas promedio
  arrange(desc(ventas_promedio))

# Veamos el contenido
ventas_estanteria

Veamos gráficamente como es el resultado

# Hacer un gráfico de columnas
ggplot(ventas_estanteria, aes(x = estanteria, y = ventas_promedio)) +
  geom_col()

Agregando etiquetas a las barras o columnas con geom_text()

Podemos cambiar el lugar de las etiquetas del factor al eje vertical y agregar texto con geom_text().

# Repetir el gráfico anterior pero invirtiendo los ejes
ggplot(ventas_estanteria, aes(y = estanteria, x = ventas_promedio)) +
  geom_col() +
  geom_text(aes(label = round(ventas_promedio, 2)),
            size = 14,
            hjust = 1.5,
            color = "white")
  • Cuando la variable de texto no tiene un orden implícito, como las jerarquías de un puesto.
  • Ejemplo, una buena práctica es ordenar las barras de mayor a menor.
  • Esto simplifica al lector la interpretación del gráfico (o en otras palabras, hace que nuestro trabajo sea de mayor calidad).
  • Hay varias formas de lograr esto, una forma simple de hacerlo es con la función reorder().

Ordenando las columnas la función reorder()

Ordenemos las columnas de acuerdo a su frecuencia.

# gráfico anterior, pero ordenando las barras de mayor a menor
ggplot(ventas_estanteria, aes(x = ventas_promedio,
                         y = reorder(estanteria, ventas_promedio))) +
  geom_col() +
  geom_text(aes(label = round(ventas_promedio, 2)),
            size = 14,
            hjust = 1.5,
            color = "white")
  • La sintaxis de reorder() es la siguiente:
eje = reorder(variable_eje, variable_criterio) 

En el ejemplo anterior hicimos los siguiente:

  • y = reorder(estanteria, sueldo_promedio). Vamos por partes:
  • y: es el eje al cual estamos asignando (mapeando) la variable.
  • reorder(): es la función.
  • estanteria: es la variable que estamos asignando al eje y en este caso.
  • ventas_promedio: El criterio por el cual vamos a ordenar las barras.
  • Si queremos ordenar al reves, usamos (-) delante de la variable (por ejemplo: -ventas_promedio).

Agregando título, nombres a los ejes

  • Algo que no está bueno en el gráfico anterior es que se muestran los nombres de los ejes tal cual como vienen en el data frame original.
  • Una función que nos permite añadir títulos y corregir los nombres de las variables es la función labs().
# Repetir el gráfico anterior, y añadir títulos, subtítulos, ejes, y nota al pie
ggplot(ventas_estanteria, aes(x = ventas_promedio,
                         y = reorder(estanteria, ventas_promedio))) +
  geom_col() +
  labs(title = "Vantas promedio por lugar en la estanteria",
       subtitle = "Good-Medium-Bad",
       x = "Ventas Promedio",
       y = "Lugar en la estanteria",
       caption = "Datos de ventas de Carseats en EEUU")

Ajustes: centrar título, tamaño de letra, color

Podemos centrar y aumentar el tamaño de la letra del titulo y los ejes.

# Repetir el gráfico anterior, y añadir títulos, subtítulos, ejes, y nota al pie
ggplot(ventas_estanteria, aes(x = ventas_promedio,
                         y = reorder(estanteria, ventas_promedio))) +
  geom_col() +
  labs(title = "Vantas promedio por lugar en la estanteria",
       subtitle = "Good-Medium-Bad",
       x = "Ventas Promedio",
       y = "Lugar en la estanteria",
       caption = "Datos de ventas de Carseats en EEUU") +
       theme(plot.title=element_text(hjust=0.5,size=20, face='bold', color='red'),
           plot.subtitle= element_text(hjust=0.5, size=10),
           axis.title.x = element_text(size = 20),
           axis.title.y = element_text(size = 30)
           )

Estilo del título y los ejes

En resumen:

  • labs(title =…, x=…, y=…) para añadir título y nombre a los ejes
  • plot.title=element_text(hjust=0.5,size=20, face=‘bold’, color=‘red’) cambiar estilo de titulo.
  • plot.subtitle= element_text(hjust=0.5, size=10) cambiar estilo de subtitulo.
  • axis.title.x = element_text(size = 20) para cambiar el tamaño de letra de los ejes

Gráficos de líneas

Los gráficos de líneas son el gráfico por excelencia para visualizar series de tiempo, es decir la evolución temporal de una variable.

Para este ejemplo vamos a utilizar el data frame de rotacion. Veamos el contenido del data.frame ‘rotacion’

rotacion
# Hacer un gráfico de líneas con la evolución temporal de los Ingresos y Egresos
ggplot(rotacion, aes(x = Periodo, y = Cantidades, color = Movimientos)) +
  geom_line()

Para marcar la sección donde corta cada año, podemos agregar una capa de puntos al gráfico anterior. Juguemos con el parámetro size dentro de geom_point().

#Agregar una capa de puntos
ggplot(rotacion, aes(x = Periodo, y = Cantidades, color = Movimientos)) +
  geom_line() +
  geom_point(size = 2)

La función facet_wrap()

Este es un buen momento para ver la utilidad de los facets.

# Añadir una capa de facet_wrap(~Movimientos)
ggplot(rotacion, aes(x = Periodo, y = Cantidades, color = Movimientos)) +
  geom_line() +
  geom_point(size = 2) +
  facet_wrap(~Movimientos)

Gráficos de dispersión - Scatter plots

  • Los gráficos, o diagramas de dispersión, son una gran forma de visualizar relaciones entre variables numéricas, concentraciones de datos, entre otras cosas.

  • Es una forma de introducirnos en el análisis de regresiones lineales.

  • También permiten la concentración de datos entre variables numéricas y categóricas. La geometría que necesitaremos es geom_point().

# Realizar un gráfico de dispersión entre publicidad y ventas de los datos carseats
ggplot(carseats, aes(x = publicidad, y = ventas)) +
  geom_point()

Si quisiéramos trazar una recta de regresión, una forma de hacerlo es la siguiente:

# Agregar una regresión lineal
ggplot(carseats, aes(x = publicidad, y = ventas)) +
  geom_point() +
  geom_smooth(method = "lm")

Ejercicio

Realizar el análisis gráfico de la base de datos carseats

  1. Histogramas para las variables población y edad
  2. Construya un diagrama de barras horizontal, en el cual se mapee la variable urbano, con precio y ordene las columnas de forma ascendente y coloque las etiquetas de los precios.
  3. Diagrama boxplot para la variable precio de compra y eeuu
  4. Costruir un diagrama de lineas para la vriable publicidad, mapeada con la variable estantería.