1 Instrucciones generales

La misión: explicar con claridad qué harías en código, sin escribir el código exacto. Entrega cada ejercicio con:

Pro tip: si alguien copia y pega código aquí, pierde el estilo y el misterio. Manténlo en modo ninja 🥷.

1.1 Ejercicio 1 — Limpieza y reporte descriptivo mínimo

Contexto: Tienes una base con respuestas de estudiantes: variables demográficas, programa, y un par de puntajes.

Objetivo: Definir el pipeline de limpieza y un reporte descriptivo básico para el informe de tu trabajo.

1.1.1 Pseudocódigo (completo)

  1. Cargar datos desde: _______________________________
  2. Estandarizar nombres de columnas (criterio: ____________)
  3. Filtrar filas inválidas (reglas: _______________________)
  4. Imputar/gestionar NA (método y variables: _____________)
  5. Crear variables derivadas (cuáles y por qué: __________)
  6. Calcular descriptivos clave (lista: ____________________)
  7. Generar 1 tabla y 2 gráficos (cuáles: _________________)
  8. Exportar resultados (formato y ruta: __________________)

1.1.2 Flujo (cajas → flechas)

Importar → Estandarizar nombres → Validar/Filtrar → Imputar NA → Crear derivadas → Descriptivos → Tabla/Gráficos → Exportar

Entradas, salidas y supuestos

Entrada(s): ____________________________________________

Salida(s): _____________________________________________

Supuestos de calidad: __________________________________

1.2 Código A — Mini-pipeline de limpieza + descriptivos + gráfico + export

Objetivo didáctico: reconocer un flujo E2E: importar → limpiar → transformar → resumir → visualizar → exportar.

# Paquetes
library(readr)
library(dplyr)
library(stringr)
library(ggplot2)
library(janitor)

# 1) Importar
encuestas <- read_csv("data/encuestas_2024.csv")

# 2) Estandarizar nombres y recortar espacios
encuestas <- encuestas |>
  clean_names() |>
  mutate(across(where(is.character), ~str_squish(.x)))

# 3) Reglas de calidad mínimas
encuestas <- encuestas |>
  filter(!is.na(programa), !is.na(puntaje_global), puntaje_global >= 0)

# 4) Variable derivada (clasificación por rangos)
encuestas <- encuestas |>
  mutate(rango = case_when(
    puntaje_global >= 170 ~ "Alto",
    puntaje_global >= 140 ~ "Medio",
    TRUE ~ "Bajo"
  ))

# 5) Descriptivos por programa
resumen <- encuestas |>
  group_by(programa) |>
  summarise(
    n = n(),
    prom = mean(puntaje_global, na.rm = TRUE),
    sd = sd(puntaje_global, na.rm = TRUE),
    .groups = "drop"
  ) |>
  arrange(desc(prom))

# 6) Visualización rápida
g <- ggplot(resumen, aes(x = prom, y = reorder(programa, prom))) +
  geom_point() +
  labs(x = "Promedio puntaje global", y = "Programa",
       title = "Resumen por programa") +
  theme_minimal()

# 7) Exportar artefactos
write.csv(resumen, "salidas/resumen_programas.csv", row.names = FALSE)
ggsave("salidas/resumen_programas.png", g, width = 7, height = 5, dpi = 300)

Pistas para el seudocódigo:

  • ¿Cuál es la entrada y cuáles son las salidas?

  • Enumera las reglas de calidad aplicadas.

  • Explica la lógica de la variable derivada (rango).

  • Describe el resumen y la visualización sin mencionar funciones.

  • Indica qué se exporta y dónde.

1.3 Código B — Orquestación multi-año con función + consolidado

Objetivo didáctico: reconocer modularidad, repetibilidad y consolidación.

library(readr)
library(dplyr)
library(purrr)
library(stringr)
library(janitor)

# 0) Parámetros
anios <- c(2021, 2022, 2023, 2024)
ruta_base <- "data/saber/"

# 1) Procedimiento reusable
procesar_anio <- function(anio) {
  # 1.1 Importar
  df <- readr::read_csv(file.path(ruta_base, paste0("saber_", anio, ".csv")))
  
  # 1.2 Estandarizar y limpiar
  df <- df |>
    janitor::clean_names() |>
    mutate(across(where(is.character), str_squish)) |>
    filter(!is.na(rectoria), !is.na(puntaje_global)) 
  
  # 1.3 Resumen por rectoría
  out <- df |>
    group_by(rectoria) |>
    summarise(
      n = n(),
      prom = mean(puntaje_global, na.rm = TRUE),
      .groups = "drop"
    ) |>
    mutate(anio = anio)
  
  return(out)
}

# 2) Orquestación sobre la lista de años
res_consolidado <- map_dfr(anios, procesar_anio)

# 3) Ranking por año
ranking <- res_consolidado |>
  group_by(anio) |>
  arrange(desc(prom), .by_group = TRUE) |>
  mutate(puesto = row_number()) |>
  ungroup()

# 4) Exportar
write.csv(ranking, "salidas/ranking_rectoria_por_anio.csv", row.names = FALSE)

Pistas para el seudocódigo:

  • Declara parámetros (lista de años, ruta).

  • Define el procedimiento PROCESAR(AÑO) con sus pasos (importar, limpiar, resumir, etiquetar año).

  • Explica la orquestación (iterar años, concatenar resultados).

  • Describe el ranking por año sin funciones.

  • Señala la exportación final.