Visualización de Datos

Capacitación en R

¿Por Qué Visualizar Datos?

Los Mismos Datos, Tres Formas

Brecha promedio de IVA por industria:

Como una Tabla:

industry avg_gap
Retail 8209
Services 12158
Manufacturing 8861
Technology 17238

Como Números:

min mean max
-84038 11411 125974

¿Cuál cuenta la historia instantáneamente?

Los Mismos Datos como un Gráfico

Ahora vemos instantáneamente: ¡Manufactura tiene la brecha promedio más alta!

¿Por Qué Visualizar?

Para administración tributaria:

  1. Detectar patrones rápidamente - tendencias de cumplimiento, valores atípicos, efectos estacionales
  2. Comunicar a partes interesadas - ministros, directores, oficiales de campo
  3. Apoyar decisiones - ¿qué sectores auditar? ¿Dónde enfocar recursos?
  4. Generar confianza - representación transparente y honesta de datos

Note

Una buena visualización responde una pregunta inmediatamente

Principios de Visualización Efectiva

Tres reglas:

  1. Mostrar datos, no decoración - eliminar elementos innecesarios
  2. Hacer patrones obvios - usar tipos de gráfico apropiados
  3. Ser honesto - no engañar con escala o distorsión

❌ Malo: - Gráficos 3D - Colores arcoíris sin significado - Ordenamiento alfabético

✓ Bueno: - Gráficos simples y claros - Colores significativos - Ordenado por valor

Elegir el Gráfico Correcto

Fuente: ActiveWizards

Enfoque de hoy: Gráficos de barras, gráficos de líneas, gráficos de dispersión

La Gramática de Gráficos

¿Qué Hace a ggplot2 Diferente?

La mayoría de herramientas: “Hazme un gráfico de barras”

ggplot2: Construir gráficos capa por capa con una gramática sistemática

Note

Si entiendes la gramática, puedes crear CUALQUIER gráfico

Tres componentes esenciales:

  1. Datos - ¿qué conjunto de datos?
  2. Estéticas - mapear variables a propiedades visuales (x, y, color)
  3. Geometría - ¿qué formas? (barras, puntos, líneas)

La Plantilla de ggplot2

Cada gráfico sigue este patrón:

ggplot(data = <DATOS>, aes(x = <VAR1>, y = <VAR2>)) +
  geom_<TIPO>()

Ejemplo:

ggplot(data = vat_gap_analysis, aes(x = industry, y = vat_gap)) +
  geom_bar(stat = "identity")

Important

¡Nota el + al final de la primera línea - esto conecta las capas!

Construyendo un Gráfico: Paso a Paso

Paso 1: Decirle a ggplot qué datos

ggplot(data = vat_gap_analysis)

Caja gris vacía - ggplot está listo pero no sabe qué graficar

Construyendo un Gráfico: Agregar Estéticas

Paso 2: Mapear variables a x e y

ggplot(data = vat_gap_analysis, aes(x = taxable_income, y = actual_vat))

¡Ahora tenemos ejes, pero aún no hay datos!

Construyendo un Gráfico: Agregar Geometría

Paso 3: Agregar formas geométricas

ggplot(data = vat_gap_analysis, aes(x = taxable_income, y = actual_vat)) +
  geom_point()

¡Gráfico completo! 🎉

Entendiendo las Estéticas

¿Qué Son las Estéticas?

Las estéticas mapean tus datos a propiedades visuales

Tres estéticas principales que usarás:

  1. x - posición horizontal
  2. y - posición vertical
  3. color - color de puntos/líneas/barras
# Mapear industria al eje x, brecha de IVA al eje y
aes(x = industry, y = vat_gap)

# Agregar color por tamaño de empresa
aes(x = industry, y = vat_gap, color = firm_size)

Posición: x e y

La base de cada gráfico:

ggplot(vat_gap_analysis, aes(x = expected_vat, y = actual_vat)) +
  geom_point() +
  theme_minimal()

La posición indica: Qué empresa tiene qué valores

Color: Agregando una Tercera Dimensión

El color puede mostrar categorías:

ggplot(vat_gap_analysis, aes(x = expected_vat, y = actual_vat, color = firm_size)) +
  geom_point() +
  theme_minimal()

Ahora vemos: Empresas grandes (naranja) se agrupan en la parte superior derecha

Color vs Fill: Distinción Importante

Diferentes geoms usan diferentes estéticas:

color - para puntos y líneas:

ggplot(vat_gap_analysis[1:100], 
       aes(x = expected_vat, 
           y = actual_vat)) +
  geom_point(color = "darkblue") +
  theme_minimal()

Usa color para geom_point() y geom_line()

fill - para barras y áreas:

firm_counts <- vat_gap_analysis[, .N, by = firm_size]

ggplot(firm_counts, 
       aes(x = firm_size, y = N)) +
  geom_bar(stat = "identity",
           fill = "darkblue") +
  theme_minimal()

Usa fill para geom_bar() y formas similares

Color Y Fill Juntos

Las barras pueden tener tanto fill (interior) como color (borde):

ggplot(firm_counts, aes(x = firm_size, y = N)) +
  geom_bar(stat = "identity", 
           fill = "lightblue",      # Color interior
           color = "darkblue",      # Color del borde
           linewidth = 1) +
  theme_minimal() +
  labs(title = "Fill = interior, Color = borde")

Tip

Regla rápida: Los puntos usan color, las barras usan fill

La Regla de aes(): Dentro vs Fuera

Las variables van dentro de aes(), los valores fijos van fuera:

# ✓ CORRECTO: color por una variable en tus datos
ggplot(data, aes(x = var1, y = var2, color = firm_size))

# ✓ CORRECTO: hacer todos los puntos azules
ggplot(data, aes(x = var1, y = var2)) +
  geom_point(color = "blue")

# ❌ INCORRECTO: "blue" no es un nombre de variable
ggplot(data, aes(x = var1, y = var2, color = "blue"))

Important

Si está en tus datos → usa aes()
Si es una elección fija → fuera de aes()

Práctica: ¿Qué Está Mal Aquí?

# Gráfico A
ggplot(vat_data, aes(x = income, y = vat, color = "red"))

# Gráfico B  
ggplot(vat_data, aes(x = income, y = vat)) +
  geom_point(color = industry)

# Gráfico C
ggplot(vat_data, aes(x = income, y = vat, color = industry))

Respuesta: ¡Solo C es correcto!

  • Gráfico A: “red” debería estar fuera de aes()
  • Gráfico B: industry debería estar dentro de aes()

Gráficos de Barras

Gráficos de Barras: Cuándo Usar

Mejor para: Comparar valores entre categorías

En administración tributaria: - IVA total por industria - Número de auditorías por región - Tasas de cumplimiento por sector

# Patrón: variable categórica en x, numérica en y
ggplot(data, aes(x = category, y = value)) +
  geom_bar(stat = "identity")

Gráfico de Barras: Ejemplo Básico

# Calcular IVA total por industria
industry_vat <- vat_gap_analysis[, .(total_vat = sum(actual_vat)), by = industry]

ggplot(industry_vat, aes(x = industry, y = total_vat)) +
  geom_bar(stat = "identity")

Problema: Difícil leer etiquetas verticales

Gráfico de Barras: Hacerlo Horizontal

ggplot(industry_vat, aes(x = industry, y = total_vat)) +
  geom_bar(stat = "identity") +
  coord_flip()

¡Mucho mejor! coord_flip() rota el gráfico

Gráfico de Barras: Ordenar por Valor

ggplot(industry_vat, aes(x = reorder(industry, total_vat), y = total_vat)) +
  geom_bar(stat = "identity") +
  coord_flip()

reorder(industry, total_vat) ordena industrias por monto de IVA

Gráfico de Barras: Agregar Color y Etiquetas

ggplot(industry_vat, aes(x = reorder(industry, total_vat), y = total_vat)) +
  geom_bar(stat = "identity", fill = "#3B9AB2") +
  coord_flip() +
  labs(
    title = "Recaudación Total de IVA por Industria",
    x = NULL,
    y = "IVA Total (USD)"
  ) +
  theme_minimal()

Ejercicio 1: Gráfico de Barras Agrupadas

10:00

Tarea: Crear un gráfico de barras agrupadas mostrando recaudación de IVA por industria y tamaño de empresa

Pasos:

  1. Agregar datos: total de actual_vat por industry Y firm_size
  2. Crear gráfico de barras con industry en eje x, total_vat en eje y
  3. Usar fill = firm_size para colorear barras por tamaño de empresa
  4. Agregar position = "dodge" para hacer barras lado a lado
  5. Hacer horizontal con coord_flip()
  6. Agregar etiquetas apropiadas y theme_minimal()

Pregunta: ¿Qué combinación (industria + tamaño de empresa) recauda más IVA?

Barras Agrupadas: Comparando Múltiples Categorías

Cuando tienes DOS variables categóricas:

# IVA por industria y tamaño de empresa
industry_size <- vat_gap_analysis[, .(total_vat = sum(actual_vat)/1e6), 
                                   by = .(industry, firm_size)]

Crear barras lado a lado con position = "dodge":

ggplot(industry_size, aes(x = industry, y = total_vat, fill = firm_size)) +
  geom_bar(stat = "identity", position = "dodge") +
  coord_flip() +
  labs(
    title = "Recaudación de IVA por Industria y Tamaño de Empresa",
    x = NULL,
    y = "IVA Total (Millones USD)",
    fill = "Tamaño Empresa"
  ) +
  theme_minimal()

Barras Apiladas: Mostrando Composición

Mostrar total Y desglose con barras apiladas:

ggplot(industry_size, aes(x = reorder(industry, total_vat), y = total_vat, fill = firm_size)) +
  geom_bar(stat = "identity", position = "stack") +  # position = "stack" es predeterminado
  coord_flip() +
  labs(
    title = "Recaudación de IVA por Industria (por Tamaño de Empresa)",
    x = NULL,
    y = "IVA Total (Millones USD)",
    fill = "Tamaño Empresa"
  ) +
  scale_fill_brewer(palette = "Set2") +
  theme_minimal()

Cada barra muestra el total, los colores muestran la contribución de cada tamaño de empresa

Agrupadas vs Apiladas: Cuándo Usar

Usa Barras Agrupadas cuando:

  • Comparar valores entre grupos
  • Quieras ver valores individuales claramente
  • Tengas 2-4 categorías por grupo

Ejemplo: Comparar empresas pequeñas vs grandes a través de industrias

Usa Barras Apiladas cuando:

  • Mostrar total Y composición
  • Te interesen las proporciones
  • Quieras ver efecto acumulativo

Ejemplo: IVA total con desglose por tamaño de empresa

Warning

¡Evita apilar al comparar valores - difícil leer segmentos medios/superiores!

Gráficos de Dispersión

Gráficos de Dispersión: Cuándo Usar

Mejor para: Mostrar relaciones entre dos variables continuas

En administración tributaria: - IVA esperado vs real (cumplimiento) - Tamaño de empresa vs obligación tributaria - Inputs vs outputs

# Patrón: dos variables numéricas
ggplot(data, aes(x = numeric_var1, y = numeric_var2)) +
  geom_point()

Gráfico de Dispersión: Ejemplo Básico

ggplot(vat_gap_analysis, aes(x = expected_vat, y = actual_vat)) +
  geom_point()

Muestra la relación entre IVA esperado y real

Gráfico de Dispersión: Agregar Color para Grupos

ggplot(vat_gap_analysis, aes(x = expected_vat, y = actual_vat, color = firm_size)) +
  geom_point() +
  theme_minimal()

Ahora vemos: El patrón difiere por tamaño de empresa

Gráfico de Dispersión: Agregar una Línea de Referencia

ggplot(vat_gap_analysis, aes(x = expected_vat, y = actual_vat)) +
  geom_point() +
  geom_abline(intercept = 0, slope = 1, color = "red", linetype = "dashed") +
  theme_minimal()

La línea roja muestra cumplimiento perfecto (real = esperado)

Gráfico de Dispersión: Agregar una Línea de Tendencia

ggplot(vat_gap_analysis, aes(x = expected_vat, y = actual_vat)) +
  geom_point(color = "gray") +
  geom_smooth(method = "lm", color = "blue") +
  theme_minimal()

geom_smooth(method = "lm") agrega línea de tendencia lineal

Gráfico de Dispersión: Versión Profesional

ggplot(vat_gap_analysis, aes(x = expected_vat, y = actual_vat)) +
  geom_point(aes(color = firm_size)) +
  geom_smooth(method = "lm", color = "black") +
  labs(
    title = "Cumplimiento de IVA: Real vs Esperado",
    x = "IVA Esperado (USD)",
    y = "IVA Real (USD)",
    color = "Tamaño Empresa"
  ) +
  theme_minimal()

Ejercicio 2: Gráfico de Dispersión

08:00

Tarea: Crear un gráfico de dispersión de inputs vs outputs de IVA

Pasos:

  1. Usar conjunto de datos vat_gap_analysis
  2. Mapear vat_inputs al eje x, vat_outputs al eje y
  3. Agregar geom_point() con color por industry
  4. Agregar línea de referencia: geom_abline(intercept = 0, slope = 1)
  5. Agregar etiquetas apropiadas

Pregunta: ¿Qué representa la línea de referencia?

Gráficos de Líneas

Gráficos de Líneas: Cuándo Usar

Mejor para: Mostrar tendencias en el tiempo

En administración tributaria: - Recaudación mensual de IVA - Tasas de cumplimiento a través de años - Tendencias trimestrales por sector

# Patrón: tiempo en eje x, valor en eje y
ggplot(data, aes(x = year, y = value)) +
  geom_line()

Gráfico de Líneas: Tendencia Temporal Básica

# Agregar por año
vat_by_year <- vat_gap_analysis[, .(total_vat = sum(actual_vat)/1e6), by = year]

ggplot(vat_by_year, aes(x = year, y = total_vat)) +
  geom_line() +
  geom_point()

Mejor práctica: Agregar geom_point() para mostrar puntos de datos reales

Gráfico de Líneas: Múltiples Grupos

# Agregar por año y tamaño de empresa
vat_by_year_size <- vat_gap_analysis[, .(total_vat = sum(actual_vat)/1e6), 
                                      by = .(year, firm_size)]

ggplot(vat_by_year_size, aes(x = year, y = total_vat, color = firm_size)) +
  geom_line() +
  geom_point()

¡El color crea automáticamente líneas separadas para cada grupo!

Gráfico de Líneas: Versión Profesional

ggplot(vat_by_year_size, aes(x = year, y = total_vat, color = firm_size)) +
  geom_line() +
  geom_point() +
  labs(
    title = "Tendencias de Recaudación de IVA por Tamaño de Empresa",
    x = "Año",
    y = "IVA Total (Millones USD)",
    color = "Tamaño Empresa"
  ) +
  theme_minimal()

Ejercicio 3: Gráfico de Líneas

08:00

Tarea: Crear un gráfico de líneas mostrando brecha promedio de IVA en el tiempo

Pasos:

  1. Agregar datos: calcular promedio de vat_gap por year
  2. Crear gráfico de líneas con geom_line() y geom_point()
  3. Mapear year al eje x, brecha promedio al eje y
  4. Agregar título y etiquetas apropiados
  5. Usar theme_minimal()

Pregunta: ¿La brecha de IVA está aumentando o disminuyendo?

Facetas

Facetas: Múltiplos Pequeños

Cuando tienes muchas categorías, las facetas son mejores que el color:

# En lugar de amontonar todo en un gráfico con muchos colores...
ggplot(data, aes(x = var1, y = var2, color = category))  # ¡desordenado!

# Crear paneles separados para cada categoría
ggplot(data, aes(x = var1, y = var2)) +
  geom_point() +
  facet_wrap(~ category)  # ¡limpio!

Facetas: Ejemplo Básico

ggplot(vat_gap_analysis, aes(x = expected_vat, y = actual_vat)) +
  geom_point() +
  facet_wrap(~ industry) +
  theme_minimal()

¡Cada industria obtiene su propio panel - mucho más claro!

Facetas: Controlar el Diseño

ggplot(vat_gap_analysis, aes(x = vat_gap)) +
  geom_histogram(bins = 30, fill = "#3B9AB2") +
  facet_wrap(~ firm_size, ncol = 3) +
  theme_minimal()

ncol = 3 controla el número de columnas

Facetas: Cuándo Usar

Usa facetas cuando:

  • Tienes muchas categorías (>3-4)
  • Las categorías se superponen demasiado con color
  • Quieres comparar patrones entre grupos

Sintaxis:

facet_wrap(~ variable)        # Una variable de agrupación
facet_wrap(~ var1 + var2)     # Dos variables (¡crea muchos paneles!)

Ejercicio 4: Gráfico con Facetas

10:00

Tarea: Crear gráficos de dispersión con facetas por industria

Pasos:

  1. Crear gráfico de dispersión: taxable_income vs actual_vat
  2. Agregar geom_point()
  3. Agregar facet_wrap(~ industry)
  4. Agregar línea de tendencia con geom_smooth(method = "lm")
  5. Agregar etiquetas apropiadas y tema

Pulido Profesional

Etiquetas: Hacerlo Profesional

Siempre incluir:

  • Título informativo
  • Etiquetas de ejes con unidades
  • Fuente de datos
ggplot(vat_gap_analysis[1:100], aes(x = expected_vat/1000, y = actual_vat/1000)) +
  geom_point(aes(color = firm_size)) +
  labs(
    title = "Cumplimiento de IVA por Tamaño de Empresa",
    subtitle = "Años Fiscales 2021-2023",
    x = "IVA Esperado (Miles USD)",
    y = "IVA Real (Miles USD)",
    color = "Tamaño Empresa",
    caption = "Fuente: Base de Datos de Administración Tributaria"
  ) +
  theme_minimal()

Temas: Apariencia Limpia

Tema recomendado para informes:

ggplot(industry_vat, aes(x = reorder(industry, total_vat), y = total_vat)) +
  geom_bar(stat = "identity", fill = "#3B9AB2") +
  coord_flip() +
  labs(title = "IVA por Industria", x = NULL, y = "IVA Total") +
  theme_minimal()

theme_minimal() da una apariencia limpia y moderna

Colores: Usar Paletas Profesionales

ggplot(vat_gap_analysis[1:100], aes(x = taxable_income, y = actual_vat, color = firm_size)) +
  geom_point() +
  scale_color_brewer(palette = "Set2") +  # Profesional, amigable para daltónicos
  theme_minimal()

Paletas ColorBrewer: “Set1”, “Set2”, “Dark2” son buenas predeterminadas

Guardando Tu Trabajo

# Primero, crear y guardar gráfico en objeto
my_plot <- ggplot(vat_gap_analysis, aes(x = expected_vat, y = actual_vat)) +
  geom_point() +
  theme_minimal()

# Guardar como PNG para presentaciones
ggsave(
  filename = "cumplimiento_iva.png",
  plot = my_plot,
  width = 10,
  height = 6,
  dpi = 300
)

# Guardar como PDF para informes
ggsave("cumplimiento_iva.pdf", plot = my_plot, width = 10, height = 6)

Lista de Verificación de Mejores Prácticas

Antes de compartir cualquier visualización:

  • ✓ Título claro y descriptivo
  • ✓ Etiquetas de ejes con unidades (USD, %, conteo, etc.)
  • ✓ Tipo de gráfico apropiado para tus datos
  • ✓ Barras ordenadas (por valor, no alfabéticamente)
  • ✓ Tema profesional (theme_minimal())
  • ✓ Fuente de datos en caption
  • ✓ Guardado en alta resolución (300 dpi)

Ejercicio Final: Análisis Completo

20:00

Tarea: Crear tres gráficos profesionales para un informe tributario

Crear:

  1. Gráfico de barras: IVA total por industria (ordenado, horizontal)
  2. Gráfico de dispersión: IVA esperado vs real con línea de tendencia y color por tamaño de empresa
  3. Gráfico de líneas: Brecha promedio de IVA en el tiempo

Todos los gráficos deben tener: - Títulos y etiquetas apropiados - theme_minimal() - Colores profesionales - Caption con fuente de datos

Guardar los tres como archivos PNG (300 dpi)

Resumen

Lo que Has Aprendido

Conceptos centrales: - Cuándo usar gráficos de barras, dispersión y líneas - La plantilla de ggplot2: ggplot() + aes() + geom_*() - Mapear datos a estéticas (x, y, color, fill) - Fill vs color: los puntos usan color, las barras usan fill - La regla de aes(): variables adentro, valores fijos afuera

Habilidades prácticas: - Crear visualizaciones profesionales - Barras agrupadas y apiladas para múltiples categorías - Agregar etiquetas y temas - Usar facetas para múltiples grupos - Guardar gráficos de alta calidad

Errores Comunes a Evitar

⚠️ Olvidar el +

# ❌ ¡Error!
ggplot(data, aes(x = var1, y = var2))
  geom_point()

# ✓ Correcto
ggplot(data, aes(x = var1, y = var2)) +
  geom_point()

⚠️ Uso incorrecto de aes() - Variables → dentro de aes() - Valores fijos → fuera de aes()

Referencia Rápida

Gráfico de barras:

# Gráfico de barras simple
ggplot(data, aes(x = category, y = value)) +
  geom_bar(stat = "identity", fill = "blue") +
  coord_flip()

# Barras agrupadas
ggplot(data, aes(x = category, y = value, fill = group)) +
  geom_bar(stat = "identity", position = "dodge") +
  coord_flip()

# Barras apiladas
ggplot(data, aes(x = category, y = value, fill = group)) +
  geom_bar(stat = "identity", position = "stack") +
  coord_flip()

Gráfico de dispersión:

ggplot(data, aes(x = var1, y = var2, color = group)) +
  geom_point() +
  geom_smooth(method = "lm")

Gráfico de líneas:

ggplot(data, aes(x = time, y = value, color = group)) +
  geom_line() +
  geom_point()

Recuerda: Los puntos usan color, las barras usan fill

Recursos

Documentación: - R para Ciencia de Datos - Capítulo 2 - Hoja de Referencia ggplot2

Ejemplos: - Galería de Gráficos R

Tip

Cuando te atasques: Busca en Google “ggplot cómo…” - ¡casi siempre hay un ejemplo!

¡Gracias!

Ahora puedes: - Elegir el tipo de gráfico correcto para tu pregunta - Crear visualizaciones tributarias profesionales - Comunicar insights de datos efectivamente

La práctica hace al maestro: - Prueba estas técnicas con tus propios datos - Comienza simple, agrega complejidad gradualmente - Comparte gráficos con colegas para retroalimentación

¿Preguntas?