Proyectos de R y Visualización con {ggplot2}

Módulo 6 - Organización del trabajo + visualización de datos + TP integrador

Pablo Tiscornia

Estación R

2026-03-10

Bienvenidos y bienvenidas

Contacto con Estación R



¿Qué vimos hasta ahora?


✅ La EPH: qué mide, cómo se estructura


✅ Conceptos básicos de R: valores, vectores, funciones, objetos


Tidyverse: paquetes, importación, select(), filter()


mutate(), case_when(), summarise(), group_by()

Hoja de Ruta - Hoy


📁 Proyectos de R - Organizar la mesa de trabajo


📊 ggplot2 - Visualización de datos

🎯 TP integrador - Consigna del trabajo final


🏁 ¡Último encuentro del curso!

Proyectos de R

El problema


  • Hasta ahora importamos datos indicando la ruta completa del archivo:


base_personas <- read_csv("/home/pablote/Documentos/datos/nombres-2015.csv")

El problema


  • Si compartimos el script a otra persona, el código se rompe


  • Si cambiamos de computadora, el código se rompe


  • Si cambiamos la base de lugar, el código se rompe

La solución: Proyectos de RStudio


Un proyecto de RStudio define una carpeta como directorio de trabajo.


Esto significa que las rutas de archivos se vuelven relativas a esa carpeta.


Ya no necesitamos rutas completas. Solo indicamos la ruta dentro del proyecto.

Crear un proyecto - Paso a paso


File → New Project → New Directory → New Project


Crear un proyecto - Resultado


Antes vs. Después


Antes (sin proyecto - ruta absoluta)

base_personas <- read_csv("/home/pablote/Documentos/datos/nombres-2015.csv")


Después (con proyecto - ruta relativa)

base_personas <- read_csv("datos/nombres-2015.csv")


Más corto, más portable, más reproducible.

Estructura de carpetas recomendada


  • 📂 mi_proyecto/
    • mi_proyecto.Rproj
    • 📂 datos/
      • eph_individual.csv
    • 📂 scripts/
      • 📄 01_procesamiento.R
    • 📂 outputs/
      • 📊 grafico_ingresos.png
    • 📂 docs/
      • 📚 informe.Rmd

Manos a la obra


  1. Crear un proyecto nuevo en RStudio (o abrir el que veníamos usando)


  1. Crear una carpeta datos y guardar ahí la base de la EPH


  1. Crear un script nuevo y cargar los datos:
library(tidyverse)
eph_ind <- read_csv("datos/eph_individual.csv")

Visualización de datos

¿Por qué visualizar?


“La visualización es el proceso de hacer visibles los contrastes, ritmos y eventos que los datos expresan, que no podemos percibir cuando vienen en forma de áridas listas de números.”


  • Interpretar y decodificar la información de forma visual


  • Guiar hacia el hallazgo

{ggplot2}

¿Qué es {ggplot2}?


  • Una implementación del sistema Grammar of Graphics (Wilkinson, 2005).


  • Un esquema pensado en capas (datos → plano → geometrías)


  • Un paquete de funciones de aplicación intuitiva.

¿Por qué {ggplot2}?


  • Tiene un marco de referencia (Grammar of Graphics)
  • Flexible, con especificaciones a nivel de capas
  • Sistema de themes para pulir la apariencia
  • Decenas de extensiones para ampliar su potencia
  • Comunidad activa y predispuesta a ayudar

¿A dónde vamos?

eph_ind |>
  filter(ESTADO %in% c(1, 2, 3)) |>
  mutate(actividad = case_when(
    ESTADO == 1 ~ "Ocupado",
    ESTADO == 2 ~ "Desocupado",
    ESTADO == 3 ~ "Inactivo"
  )) |>
  summarise(cantidad = n(), .by = actividad) |>
  ggplot(aes(x = actividad, y = cantidad)) +
  geom_col(aes(fill = actividad)) +
  geom_text(aes(label = scales::number(cantidad, big.mark = ".")),
            vjust = -0.5, size = 4) +
  geom_hline(yintercept = 0) +
  labs(title = "Población por condición de actividad",
       subtitle = "EPH - T1 2024",
       x = "",
       y = "Cantidad de personas",
       caption = "Fuente: Elaboración propia en base a EPH-INDEC",
       fill = "Condición") +
  theme_minimal() +
  theme(legend.position = "none")

Gráfico en clave de capas


3 capas son indispensables:


  1. Los datos (data =): el dataframe de insumo


  1. Las aesthetics (aes()): vínculo entre datos y propiedades visuales (ejes x, y)


  1. Las geometrías (geom_*()): la forma con que se representan los datos

Preparamos los datos


  • Pregunta: ¿Cuántas personas hay por condición de actividad?


df_actividad <- eph_ind |>
  filter(ESTADO %in% c(1, 2, 3)) |>
  mutate(actividad = case_when(
    ESTADO == 1 ~ "Ocupado",
    ESTADO == 2 ~ "Desocupado",
    ESTADO == 3 ~ "Inactivo"
  )) |>
  summarise(cantidad = n(), .by = actividad)

Usamos todo lo aprendido en las clases anteriores: filter(), mutate(), case_when(), summarise().

Capa 1 y 2: datos + aesthetics

ggplot(data = df_actividad,
       aes(x = actividad, y = cantidad))

Capa 3: geometría

ggplot(data = df_actividad,
       aes(x = actividad, y = cantidad)) +
  geom_col()

Chapa y pintura

Relleno con un color fijo

ggplot(data = df_actividad,
       aes(x = actividad, y = cantidad)) +
  geom_col(fill = "steelblue")

Relleno según una variable

ggplot(data = df_actividad,
       aes(x = actividad, y = cantidad)) +
  geom_col(aes(fill = actividad))

Contorno

ggplot(data = df_actividad,
       aes(x = actividad, y = cantidad)) +
  geom_col(aes(fill = actividad),
           color = "black")

Referencias con labs()

ggplot(data = df_actividad,
       aes(x = actividad, y = cantidad)) +
  geom_col(aes(fill = actividad),
           color = "black") +
  labs(title = "Población por condición de actividad",
       subtitle = "EPH - T1 2024",
       x = "",
       y = "Cantidad de personas",
       caption = "Fuente: EPH-INDEC")

Temas (theme)

ggplot(data = df_actividad,
       aes(x = actividad, y = cantidad)) +
  geom_col(aes(fill = actividad),
           color = "black") +
  labs(title = "Población por condición de actividad",
       subtitle = "EPH - T1 2024",
       x = "",
       y = "Cantidad de personas",
       caption = "Fuente: EPH-INDEC") +
  theme_minimal() +
  theme(legend.position = "none")

Ejercitación

Ejercitación: visualización con {ggplot2}


  1. Calcular el ingreso promedio (P21) de la población ocupada (ESTADO == 1) con ingreso positivo (P21 > 0), por sexo (CH04). Recordar recodificar sexo con case_when().


  1. Con esa tabla, crear un gráfico de barras (geom_col()) con el ingreso promedio en el eje y y el sexo en el eje x.


  1. Agregarle relleno por sexo, título y theme_minimal().


  1. Desafío: Hacer lo mismo pero agrupando por sexo y región (REGION). Tip: usar fill = factor(REGION) dentro de aes().

Resolución - Ejercicio 1 a 3

df_ingreso_sexo <- eph_ind |>
  filter(ESTADO == 1, P21 > 0) |>
  mutate(sexo = case_when(CH04 == 1 ~ "Varón",
                          CH04 == 2 ~ "Mujer")) |>
  summarise(ingreso_promedio = mean(P21), .by = sexo)

ggplot(data = df_ingreso_sexo,
       aes(x = sexo, y = ingreso_promedio)) +
  geom_col(aes(fill = sexo), color = "black") +
  labs(title = "Ingreso promedio por sexo",
       subtitle = "Población ocupada - EPH T1 2024",
       x = "", y = "Ingreso promedio ($)",
       caption = "Fuente: EPH-INDEC") +
  theme_minimal() +
  theme(legend.position = "none")

Trabajo Práctico Integrador

Consigna del TP


Tema: Ejercicio de análisis con tema libre. Pueden usar la EPH u otra base de datos propia.


Eje: Plantear una pregunta sencilla sobre el tema elegido y responderla con datos.


Contenido esperado:

  • Importación de datos
  • Procesamiento con tidyverse (filter, select, mutate, summarise)
  • Visualización con ggplot2 (opcional, suma puntos)
  • Breve análisis de los hallazgos

Formato de entrega


📂 Enviar un proyecto de RStudio completo (carpeta con subcarpetas y archivos)


📄 Que contenga un script de R (.R) con el código del análisis


☁️ Subir a Google Drive (u otro servicio) y compartir el link


📧 Enviar a: pablotiscornia@estacion-r.com

📅 Fecha de entrega: Martes 8 de abril de 2026

Tips para el TP


  • No elegir una base muy compleja. La EPH está perfecta.


  • Que el script corra sin errores de principio a fin.


  • El Slack queda abierto para consultas.


  • Se evalúa el flujo de trabajo, no la complejidad del análisis.

Lo que logramos en el curso


✅ Conocer la EPH y sus datos


✅ Bases de R: objetos, funciones, vectores


Tidyverse completo: importar, filtrar, seleccionar, transformar, resumir


Proyectos de RStudio para organizar el trabajo


Visualización de datos con ggplot2

¡Gracias!



Fue un gusto acompañarlos en este recorrido


📧 pablotiscornia@estacion-r.com

💬 Slack de Estación R


Recuerden: el Slack queda abierto para consultas sobre el TP. Fecha de entrega: 8 de abril de 2026.