La Gramática de Gráficos para Análisis Económico
Dpto. de Fundamentos del Análisis Económico. Universidad de Alicante
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:
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áficosComponentes 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”
¿Quién es nuestra clientela y en qué se diferencia? clientes, una ficha por persona: lo que ingresa, lo que gasta, su edad, por qué canal compra y en qué segmento está
¿Cómo va el negocio y de qué depende? ventas: cuánto se vendió y cuánto se invirtió en marketing, en cada región, producto y trimestre
¿En qué entorno operamos? macro, un país por fila: renta, población, paro, inflación y deuda
De cada conjunto salen muchas preguntas, y cada una pide su propio gráfico
La descripción de cada variable está en su diccionario: clientes_info, ventas_info, macro_info
Los ficheros se descargan de la página Datos del curso, y van en un subdirectorio data dentro de vuestra carpeta del tema
Un gráfico se construye en tres pasos. Cada pestaña añade uno:
ggplot() con los datos solos da un lienzo vacío: todavía no hemos dicho qué variable va a cada sitio.
La estética es la correspondencia entre una variable y una propiedad visual del gráfico. Se declara con aes(): aquí, qué variable va en cada eje. Ya hay ejes, pero aún no hay nada dibujado.
Si aes() va en ggplot(), la estética vale para todas las capas que vengan detrás. Si va dentro de un geom_, vale solo para esa capa
Con una sola capa, las dos formas dan el mismo gráfico:
ggplot() lo heredan todas, y así no hay que repetirloCada 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
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()
Dentro de aes(): una variable se traduce en una señal visual, y aparece su leyenda
Con el data frame clientes (300 fichas de la clientela de nuestra cadena de gimnasios):
Dibujad la relación entre ingresos y gasto con geom_point()
Pintad TODOS los puntos de rojo, de verdad (que no aparezca ninguna leyenda)
Ahora ejecutad esto y describid qué veis: ¿de qué color salen los puntos? ¿qué dice la leyenda? ¿por qué?
ggplot(clientes, aes(x = ingresos, y = gasto)) + geom_point(aes(color = "red"))
Distinguid el segmento por color y el canal por forma. Y ahora añadid además size = edad. ¿Se lee el gráfico con tres variables encima? ¿Cuántas cosas a la vez puede leer quien lo mira?
Añadid size = 4 dentro de aes() y luego fuera. Una de las dos no tiene sentido: ¿cuál y por qué? En una frase, ¿qué regla os sirve para decidirlo?
Nota
Esta práctica es el apartado a) del ejercicio 1: id haciéndola ahí, en vuestro .qmd.
geom_text(): acepta estéticas de etiquetas (variables con texto):Nota
Ahora el ejercicio 1, apartado b): etiquetar a quienes más gastan, con su propia capa de datos.
geom_boxplot() no dibuja las observaciones: dibuja sus cuartiles y su mediana
geom_bar() y geom_histogram() convierten los datos en frecuenciasgeom_bar() cuenta los casos de cada categoría: no hay que calcular nada antes. En Excel habría que haber contado primero
En una variable continua no hay categorías naturales: los intervalos los elegimos nosotros, y esa elección cambia lo que se ve
Venís de Excel, donde para hacer un gráfico de barras hay que contar antes. Aquí no. Con clientes:
Número de clientes de cada segmento, con geom_bar(). ¿Dónde está la tabla de frecuencias que habéis usado?
Lo mismo, pero con la PROPORCIÓN que representa cada segmento, sin calcular nada aparte: el geom ya ha contado, y after_stat() deja usar lo que ha calculado
geom “tiene una estadística por defecto”?Nota
Esta práctica es el apartado c) del ejercicio 1.
Distribución de los ingresos con geom_histogram(), probando bins = 10, bins = 40 y binwidth = 3. ¿Cuál de las tres le enseñaríais a dirección y por qué?
Con una de las tres se ve un grupo de clientes de ingresos muy bajos y con las otras no. ¿Con cuál, y qué os dice eso sobre elegir los intervalos?
Añadid un geom_boxplot() del gasto por segmento
Nota
Esta práctica es el apartado d) del ejercicio 1.
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 |
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")En muchos contextos, las variables tienen un rango de valores amplio
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 (%)
Aquí cambiamos a macro, un país por fila: la poblacion va de 1 a 138 millones, y es donde la escala logarítmica se nota. Con los ingresos de clientes no se vería nada, porque están todos en el mismo orden de magnitud
x = log(pib) porque los ejes se muestran en unidades originalesUsar 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
Una consultora de inversión compara el perfil de ingresos de cinco grandes corporaciones y cinco startups. Los datos están en la página Datos del curso:
Diagrama de cajas de ingresos_millones por tipo, en escala normal
El mismo gráfico con scale_y_log10()
Comparando los dos: ¿qué diferencias hay en la posición central y en la variabilidad dentro de cada grupo? ¿Cuál de los dos gráficos es más informativo, y por qué?
Si esa variabilidad mide el riesgo de una inversión, ¿dónde es más arriesgado invertir?
Nota
Esta práctica es el ejercicio 2, el de corporaciones y startups.
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)
facet_wrap(): facetas por una variable (usando “fórmula” ~)facet_grid(): facetas en dos dimensioneslabs()Una buena práctica de legibilidad es dar título al gráfico, nombrar los ejes, incluir leyendas
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))annotate(): añade objetos geométricos NO asociados a variables: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:
Nota
Ahora el ejercicio 1, apartado e): tendencia, facetas, línea de referencia, labs() y temas.
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
Recursos de Ayuda
Help > Cheatsheets > Data Visualization with ggplot2
Otras bibliotecas de gráficos en R
plotly: gráficos interactivos para dashboards
gganimate: animaciones para evolución temporal