La misión: explicar con claridad qué harías en código, sin escribir el código exacto. Entrega cada ejercicio con:
Un pseudocódigo (lista de pasos),
Un mini-diagrama (cajas → flechas en texto),
Supuestos/entradas y salidas esperadas,
Un checklist de validación.
Pro tip: si alguien copia y pega código aquí, pierde el estilo y el misterio. Manténlo en modo ninja 🥷.
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.
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: __________________________________
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.
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.