Tema 01 - Visualización de datos

La Gramática de Gráficos para Análisis Económico

Pedro Albarrán

Dpto. de Fundamentos del Análisis Económico. Universidad de Alicante

Alberto Pérez

¿Por qué visualizar datos?

  • Resumir información que no se vería en los datos en bruto (hoja de cálculo)

  • Identificar patrones y relaciones entre variables

  • Comunicar hallazgos de forma efectiva a diferentes audiencias

  • La visualización es esencial en:

    • Bancos Centrales: dashboard de indicadores macroeconómicos
    • Consultoras: presentaciones ejecutivas con insights de datos
    • Investigación: trabajos con gráficos que demuestran hipótesis
    • Medios: The Economist, Financial Times - visualización como marca
    • Empresas: dashboards de KPIs, segmentación de clientes
  • En un buen gráfico, la audiencia encuentra obvias las ideas a transmitir, sin abrumar con muchos hallazgos

ggplot2 y la Gramática de Gráficos

  • Componentes básicos:

    • Datos

    • Estéticas (aes): asocia variables a propiedades visuales (posición, longitud, área, color)

    • Geometrías (geom): objetos para representar datos (líneas, círculos, barras)

    • Escalas, Sistemas de coordenadas, Facetas (subgráficos), Contexto (títulos, leyendas), etc.

  • Construir gráficos como frases gramaticales

    • sujeto + verbo + objeto = oración

    • datos + geometría + estética = gráfico de ggplot2

“Por encima de todo, mostrar los datos”

Creando un “ggplot”

library(ggplot2)
load("data/datosVisualizacion.RData")
  • Solo ggplot() crea un gráfico vacío
ggplot(data = ventas)
  • aes() define cómo las variables se asignan a propiedades visuales
ggplot(data = ventas, aes(x = marketing, y = ventas))
  • Añadir capas con +: objeto geométrico geom_point()
ggplot(data = ventas, aes(x = marketing, y = ventas)) + 
  geom_point()
  • NOTAR: datos y estética para todas las capas o solo para una
ggplot(data = ventas) + 
  geom_point(aes(x = marketing, y = ventas))

Objetos Geométricos

Cada geom_*() agrega un tipo diferente de capa:

Tipo Función Uso Habitual
Puntos geom_point() Dispersión
Líneas geom_line() Evolución temporal
Barras geom_bar() Frecuencias categóricas
Histograma geom_histogram() Distribución continua
Cajas geom_boxplot() Estadísticos descriptivos
Suavizado geom_smooth() Tendencias
Texto geom_text() Etiquetas

Para lista completa: buscar funciones que comienzan con geom_ en Ayuda

Asociación Estética, con aes()

  • Cada aes() es una asociación entre una señal visual y una variable:

    posición: x, y | forma: shape
    color: color exterior | relleno: fill (color interior)
    tamaño: size | tipo de línea: linetype
  • Algunas estéticas son solo adecuadas para variables cuantitativas o para cualitativas

  • Cada geom acepta solo un subconjunto de estéticas (ver ayuda)

  • Regla de oro: Si quieres que algo varíe con los datos, ponlo en aes()

ggplot(ventas, aes(x = marketing, y = ventas)) +
  geom_point(aes(color = region))

Asociación Estética vs. Opción Fija

  • Con aes(), se visualiza una variable con una señal visual
  • Fuera de aes(), se establece un valor fijo de la señal visual
ggplot(ventas, aes(x = marketing, y = ventas)) +
  geom_point(aes(color = "red"))
  • Principio: Añadir señal visual para representar información, NO “embellecer”
ggplot(macro, aes(y = desempleo, x = pib)) +
  geom_point(aes(color = norte), shape = "diamond")
  • NO saturar el gráfico con estéticas fijas o información innecesaria
ggplot(macro, aes(y = desempleo, x = pib)) +
  geom_point(aes(size = inflacion, color = deuda))

ggplot(macro, aes(y = desempleo, x = pib)) +
  geom_point(shape = "diamond", color = "blue", size = 3)

Gráficos como Objetos

  • Un gráfico también es un objeto de R
graf_base <- ggplot(macro, aes(y = desempleo, x = pib)) +
                geom_point()
  • Se pueden agregar capas a este objeto:
graf_base + geom_line()
graf_base + geom_point(aes(shape = norte)) 
graf_base + geom_point(aes(size = inflacion, color = deuda))

Datos (y estéticas) específicas por capa

Ejemplo práctico:

  • geom_text(): acepta estéticas de etiquetas (variables con texto):
graf_base + geom_text(aes(label = pais), size = 3)

library(ggrepel)  # Evita solapamiento
graf_base + geom_text_repel(aes(label = pais), size = 3)
  • Ahora con datos específicos por capa si solo queremos señalar algunos puntos
graf_base + 
  geom_text_repel(
    data = subset(macro, 
                  pais %in% c("España","Francia","Alemania")), 
    aes(label = pais), size = 3)
  • Esta idea se puede generalizar: usar distintos datos o estéticas en cada capa según las necesidades del gráfico

Gráficos que muestran datos transformados

  • Algunos gráficos (ej., dispersión) muestran los datos originales directamente
  • Pero otros gráficos representan estadísticas calculadas a partir de los datos

  • geom_boxplot(): datos → cuartiles, mediana

ggplot(clientes, 
       aes(y = gasto/1000)) +  
  geom_boxplot()

  • geom_smooth(): regresión → predicción de línea de tendencia
graf_base + geom_smooth()           # con intervalos de confianza
graf_base + geom_smooth(method = lm, se = FALSE)  

Gráficos que muestran datos transformados (cont.)

  • geom_bar() y geom_histogram(): datos → frecuencias por intervalo

  • La estadística predeterminada en geom_bar() es contar casos (stat_count)

    • Notad que en Excel un gráfico de barras requiere los datos previamente transformados (datos contados)
ggplot(ventas, aes(x = region)) + geom_bar()
  • En variables continuas, no hay categorías “naturales” para calcular frecuencias

    • Se tienen que definir “arbitrariamente” los intervalos

    • Distintas elecciones pueden revelar distinta información: p.e., no apreciamos un grupo importante de clientes con muy bajos ingresos en el último gráfico

graf <- ggplot(clientes, aes(x = ingresos/1000))
graf + geom_histogram(bins = 20)              # Número de grupos
graf + geom_histogram(binwidth = 3)           # Ancho de grupos
graf + geom_histogram(breaks = seq(10,90,5))  # Rangos

Escalas: Control de Asociación Estética

  • aes() establece qué variable asignar, la escala cómo representarla

  • Funciones de escala: scale_<estética>_<tipo>. Ejemplos,

Escala Tipos Ejemplos
scale_color_ identity scale_fill_continuous
scale_fill_ manual scale_color_discrete
scale_size_ continuous scale_color_manual
discrete scale_size_discrete
scale_shape_ discrete scale_shape_discrete
scale_linetype_ manual scale_shape_manual
identity scale_linetype_discrete
scale_x_ continuous scale_x_continuous
scale_y_ discrete scale_y_discrete
reverse scale_y_reverse
log10 scale_x_log10
date scale_x_date
datetime scale_y_datetime

Escalas (cont.)

  • Algunos argumentos son habituales en casi todas las escalas (name, breaks, labels)

  • Otros argumentos son específicos según el tipo de variables (continua, discreta) o la escala concreta

ggplot(macro, aes(y = pais, x = pib)) + 
  geom_point(aes(color = desempleo))  +
  scale_color_continuous(breaks = c(5, 10, 15),
                         labels = c("Bajo", "Medio", "Alto"), 
                         low = "green", high = "red")

ggplot(macro, aes(y = desempleo, x = pib/1000)) + 
  geom_point(aes(color = norte, size = deuda, shape = norte)) + 
  scale_y_continuous(breaks = seq(0, 20, 5), limits = c(-5, 25)) +
  scale_shape_discrete(labels = c("Norte", "Sur"), 
                       name = "Zona de Europa")
  • Nota: este ejemplo tiene elementos redundantes a efectos ilustrativos

Escala Logarítmica

  • En muchos contextos, las variables tienen un rango de valores amplio

    • PIB, población (Lux 0.6M vs ALE 83M), clientes (pyme 500 vs Inditex 200M)
  • Escala lineal vs logarítmica:

    • Lineal: misma distancia visual = mismo aumento absoluto → los valores pequeños quedan “aplastados” para mostrar los grandes

    • Logarítmica: misma distancia visual = mismo incremento relativo (%)

ggplot(macro, aes(y = desempleo, x = poblacion)) + 
  scale_x_log10(breaks = seq(0,100,20)) + geom_point()
  • Mejor que x = log(pib) porque los ejes se muestran en unidades originales
  • Usar logs cambia la interpretación de diferencias absolutas a porcentuales

    • Más relevante +10% o +500 clientes (mucho en pyme, nada en Inditex)

    • NO para “evitar” valores extremos o distribución asimétrica

Facetas (sub-gráficos)

  • Los sub-gráficos por variables categóricas son una alternativa a aes() para añadir variables

  • Facilitan comparaciones, evitando la saturación visual (ej., demasiadas líneas en un solo gráfico)

graf_tiempo <- ggplot(ventas_tiempo, aes(x = fecha, y = ventas))
graf_tiempo + geom_line(aes(color = region))
  • facet_wrap(): facetas por una variable (usando “fórmula” ~)
graf_tiempo + geom_line() + facet_wrap(~region, ncol = 2)
  • facet_grid(): facetas en dos dimensiones
g3 <- ggplot(data = clientes) + geom_histogram(aes(x = gasto))
g3 + facet_grid(segmento ~ canal)  # Filas y columnas
g3 + facet_grid(segmento ~ .)      # Solo por filas 
g3 + facet_grid(. ~ canal)         # Solo por columnas

Contexto con labs()

  • Una buena práctica de legibilidad es dar título al gráfico, nombrar los ejes, incluir leyendas

    • Descripciones claras de variables y sus unidades
ggplot(macro, aes(y = desempleo, x = pib/1000)) + 
  geom_point(aes(color = norte, size = deuda)) + 
  geom_smooth(method = "lm", se = FALSE) +
  labs(
    title = "Relación entre PIB per cápita y tasa de desempleo",
    subtitle = "Países de la Unión Europea (2023)",
    caption = "Fuente: Eurostat",
    x = "PIB per cápita (miles de €)",
    y = "Tasa de desempleo (%)",
    color = "Norte",
    size = "Deuda pública (% PIB)") +
  scale_y_continuous(breaks = seq(0, 20, 5))

Otros Elementos de Contexto

  • annotate(): añade objetos geométricos NO asociados a variables:
ggplot(macro, aes(y = desempleo, x = pib/1000)) +
  geom_point(aes(color = norte)) + 
  geom_smooth(method = "lm", se = FALSE) +
  annotate("text", x = 60, y = 11, 
           label = "La doble división Norte-Sur") +
  annotate("text", x = 85, y = 6, label = "R ^ 2 == 0.45", 
           parse = TRUE)
  • Líneas de Referencia
ggplot(clientes, aes(x = canal, y = gasto/1000)) +
  geom_boxplot() +
  geom_hline(yintercept = 3.0, linetype = "dashed", 
             color = "red") +
  annotate("text", x = 3, y = 3.3, 
           label = "Objetivo mínimo", color = "red")

Personalizar el aspecto general

  • Se pueden cambiar manualmente colores (p.e., scale_fill_manual()) o la forma (ej., scale_shape_manual())

  • PERO es preferible usar paletas predefinidas con criterios de diseño y visualización de información:

graf <- ggplot(ventas, aes(x = region, y = ventas, fill = region)) + 
          geom_boxplot()
library(RColorBrewer)
display.brewer.all()
graf + scale_fill_brewer(palette = "Set2")
  • Se puede añadir una capa de tema (estilo general de todos los componentes)
graf + theme_gray()      
graf + theme_minimal()
  • También existen temas profesionales predefinidos en bibliotecas
library(ggthemes)
graf + theme_economist() + scale_fill_economist()     

Ejemplos Aplicados

  1. Relación Gasto Marketing - Ventas
ggplot(ventas, aes(x = marketing, y = ventas)) +
  geom_point(aes(color = region)) +
  geom_smooth(method = "lm", se = TRUE) +
  labs(title = "ROI del Gasto en Marketing por Región",
       x = "Inversión en Marketing (miles €)",
       y = "Ventas (miles €)",
       color = "Región") +
  theme_minimal()
  1. Distribución de Satisfacción del Cliente
ggplot(ventas, aes(x = satisfaccion)) +
  geom_bar(fill = "steelblue") +
  facet_wrap(~producto) +
  labs(title = "Distribución de Satisfacción del Cliente por Producto",
       x = "Puntuación de Satisfacción (1-5)",
       y = "Número de Clientes") +
  theme_light()

Ejemplos Aplicados

  1. Indicadores Macroeconómicos
ggplot(macro, aes(x = desempleo, y = inflacion)) +
  geom_point(aes(size = deuda, color = norte)) +
  geom_text_repel(aes(label = pais), size = 3) +
  labs(title = "Relación Desempleo-Inflación por País",
       x = "Tasa de Desempleo (%)",
       y = "Tasa de Inflación (%)",
       size = "Deuda Pública (% PIB)",
       color = "Norte de Europa")
  • Buenas prácticas: visualizar no es decorar datos, es comunicar insights

    • Una idea por gráfico

    • Claridad sobre ornamentación: cada elemento visual debe tener propósito

    • Títulos y leyendas descriptivos e informativos

    • Evitar demasiados colores o patrones y la sobrecarga de información

Comentarios Finales

  • Guardar gráficos: en la pestaña de Plots > Export o con el comando
ggsave("analisis-ventas.pdf")
ggsave("dashboard-macro.png", width = 12, height = 8, dpi = 300)
  • Recursos de Ayuda

  • Otras bibliotecas de gráficos en R

    • plotly: gráficos interactivos para dashboards

    • gganimate: animaciones para evolución temporal