Tarea 1: Clasificación con tidymodels

IA para Científicos Sociales - UCU

Autor/a

Danilo Freire

Fecha de publicación

12 de abril de 2026

1 Instrucciones

Esta tarea usa un dataset nuevo, distinto del que vimos en el Laboratorio 1: desarrollo_municipios.csv, con 300 municipios latinoamericanos simulados. El flujo de trabajo es el mismo del laboratorio (explorar, dividir, ajustar, evaluar), pero los datos son otros, así que las respuestas también lo serán. La variable de resultado es desarrollo_alto (si/no) y hay 8 predictores numéricos. Respondan cada pregunta escribiendo código R en los bloques indicados. Cuando se pida una respuesta escrita, usen texto normal debajo del bloque de código.

Para trabajar en esta tarea:

  1. Descarguen este archivo .qmd y el dataset desarrollo_municipios.csv de la página del curso, o clonen el repositorio completo con git clone https://github.com/danilofreire/introduccion-ia-ucu.git. Mantengan el CSV en una subcarpeta datos/ junto al .qmd
  2. Necesitan Quarto instalado junto con RStudio. Las versiones recientes de RStudio (>= 2022.07) ya incluyen Quarto. Si no lo tienen, instálenlo desde https://quarto.org/docs/get-started/
  3. Abran este archivo .qmd en RStudio y ejecuten los bloques de código con Ctrl+Enter (o Cmd+Enter en Mac)
  4. Cuando terminen, pueden renderizar el documento completo con el botón “Render” en RStudio

1.1 Configuración

library(tidymodels)
library(tidyverse)

datos <- read_csv("datos/desarrollo_municipios.csv", show_col_types = FALSE)
# Lean el archivo directo desde la web:
# datos <- read_csv("https://raw.githubusercontent.com/danilofreire/introduccion-ia-ucu/main/clases/dia-01/datos/desarrollo_municipios.csv", show_col_types = FALSE)

datos <- datos |>
  mutate(desarrollo_alto = factor(desarrollo_alto, levels = c("no", "si")))

Las columnas municipio (el identificador) y pais no entran en los modelos: cuando llegue el momento de modelar, sáquenlas con select().

2 Exploración y preprocesamiento

2.1 Pregunta 1: Resumen por país

Calculen la media de ingreso_promedio y acceso_agua por país. ¿Qué país tiene los municipios más ricos en promedio? ¿El ranking de agua coincide con el de ingreso?

# Escriban su código aquí

Respuesta:

2.2 Pregunta 2: Visualización de distribuciones

Creen un histograma de escolaridad_media usando ggplot2. Agreguen una línea vertical en la mediana con geom_vline(). ¿La distribución es simétrica o sesgada? Hagan lo mismo con poblacion: ¿qué diferencia notan entre las dos distribuciones?

# Escriban su código aquí

Respuesta:

2.3 Pregunta 3: Correlaciones

Calculen la matriz de correlaciones entre los 8 predictores numéricos. ¿Cuáles dos variables tienen la correlación más alta (en valor absoluto)? ¿Tiene sentido teórico?

# Escriban su código aquí

Respuesta:

3 División y entrenamiento

3.1 Pregunta 4: División estratificada

Saquen municipio y pais, y dividan los datos en 80% entrenamiento y 20% prueba, con estratificación por desarrollo_alto. Usen set.seed(42). ¿Cuántas observaciones hay en cada conjunto? Verifiquen que las proporciones de "si" y "no" son similares en ambos.

# Escriban su código aquí

Respuesta:

3.2 Pregunta 5: La línea base

Antes de entrenar nada, un modelo útil tiene que superar a una predicción trivial. Usando el conjunto de prueba de la pregunta anterior, calculen la accuracy de un “modelo” que siempre predice la clase mayoritaria de desarrollo_alto (sin usar ningún predictor). ¿Cuál es esa accuracy?

Pista: la respuesta sale de las proporciones de desarrollo_alto en el conjunto de prueba.

# Escriban su código aquí

Respuesta:

3.3 Pregunta 6: ¿Cuánto mejora el modelo completo?

Ajusten el modelo logístico completo con los 8 predictores. Comparen su accuracy en el conjunto de prueba con la línea base de la pregunta anterior. ¿Cuánto mejora el modelo sobre simplemente “adivinar” la clase mayoritaria?

# Escriban su código aquí

Respuesta:

4 Evaluación

4.1 Pregunta 7: Matriz de confusión

Usando el modelo completo, generen predicciones sobre el conjunto de prueba y construyan la matriz de confusión. ¿Cuántos falsos positivos y falsos negativos hay? ¿Qué tipo de error es más frecuente?

# Escriban su código aquí

Respuesta:

4.2 Pregunta 8: Precisión vs. recall

Calculen precisión y recall (con event_level = "second") para el modelo completo. Contexto: una agencia de cooperación usa el modelo para decidir qué municipios “se gradúan” de un programa de subsidios (si el modelo predice desarrollo_alto = "si", el municipio deja de recibir fondos). Un falso positivo significa cortarle los fondos a un municipio que todavía los necesita. ¿Qué métrica priorizarían en este escenario? Justifiquen.

# Escriban su código aquí

Respuesta:

4.3 Pregunta 9: Efecto del umbral

Calculen precisión y recall para cinco umbrales distintos: 0.2, 0.35, 0.5, 0.65 y 0.8. Presenten los resultados en una tabla. ¿Qué umbral elegirían para el escenario de los subsidios de la pregunta anterior?

Para no copiar y pegar el mismo cálculo cinco veces, usamos el mismo patrón del Apéndice 4 del Laboratorio 1: apilamos varias copias de las predicciones con bind_rows(), cada una etiquetada con su umbral, y después calculamos las métricas dentro de cada grupo con group_by(). Acá son cinco umbrales en lugar de tres. Usen esta estructura y completen las dos líneas marcadas con ___:

# pred_probs: probabilidades del modelo completo (predict(..., type = "prob"))
tabla_umbrales <- bind_rows(
  pred_probs |> mutate(umbral = 0.2),
  pred_probs |> mutate(umbral = 0.35),
  pred_probs |> mutate(umbral = 0.5),
  pred_probs |> mutate(umbral = 0.65),
  pred_probs |> mutate(umbral = 0.8)
) |>
  mutate(
    .pred_u = if_else(.pred_si >= umbral, "si", "no"),
    .pred_u = factor(.pred_u, levels = c("no", "si"))
  ) |>
  group_by(umbral) |>
  summarise(
    precision = ___,   # precision_vec() sobre desarrollo_alto y .pred_u, con event_level = "second"
    recall    = ___    # lo mismo con recall_vec()
  )

tabla_umbrales
# Completen la estructura de arriba aquí

Respuesta:

4.4 Pregunta 10: Curva ROC y AUC

Grafiquen la curva ROC y calculen el AUC del modelo completo. Recuerden usar event_level = "second". ¿Consideran que el AUC indica un buen modelo? Justifiquen usando la tabla de referencia del laboratorio.

# Escriban su código aquí

Respuesta:

5 Validación cruzada

5.1 Pregunta 11: Validación cruzada con 10 folds

Realicen validación cruzada con 10 folds sobre los datos de entrenamiento. Reporten la accuracy media y su error estándar. ¿La accuracy que obtuvieron en el conjunto de prueba (Pregunta 6) cae dentro del rango que sugiere la validación cruzada (media ± 2 errores estándar)?

# Escriban su código aquí

Respuesta:

5.2 Pregunta 12: Modelo reducido

Ajusten un modelo que use solo los 4 predictores con p-valor más bajo en el modelo completo. Comparen su accuracy (validación cruzada, 5 folds) con la del modelo completo. ¿Vale la pena usar los 8 predictores o el modelo reducido es suficiente?

Pista: miren los p-valores de tidy(ajuste) para elegir las variables.

# Escriban su código aquí

Respuesta:

6 Reflexión

6.1 Pregunta 13: Variables sin efecto

En el modelo completo, acceso_electricidad y poblacion no son significativas (p > 0.05). Sin embargo, ambas se correlacionan positivamente con desarrollo_alto en un análisis bivariado simple (verifíquenlo si quieren). Expliquen por qué una variable puede correlacionar con el outcome sin tener un efecto directo en el modelo multivariado. Den un ejemplo hipotético de la vida real.

Respuesta:

6.2 Pregunta 14: ¿Recomendarían este modelo?

Sin escribir código nuevo, junten lo que ya calcularon (línea base, accuracy, precisión, recall, AUC, validación cruzada). Imaginen que la agencia de cooperación les pide una recomendación: ¿usarían este modelo para decidir qué municipios se gradúan del programa de subsidios? Argumenten a favor o en contra citando al menos una métrica con su valor, y digan qué error les preocuparía más (un falso positivo o un falso negativo) y por qué.

Respuesta:

Volver arriba