Tarea 3: Clasificación avanzada con tidymodels

IA para Científicos Sociales - UCU

Autor/a

Danilo Freire

Fecha de publicación

13 de abril de 2026

1 Instrucciones

Esta tarea usa el dataset del Laboratorio 3 (latinobarometro_sim.csv). 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 latinobarometro_sim.csv de la página del curso, o clonen el repositorio completo con git clone https://github.com/danilofreire/introduccion-ia-ucu.git
  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)
library(ranger)
library(vip)
library(pdp)
library(xgboost)

set.seed(2026)

datos <- read_csv("datos/latinobarometro_sim.csv", show_col_types = FALSE)

datos <- datos |>
  mutate(
    pais = factor(pais),
    zona = factor(zona),
    genero = factor(genero),
    uso_internet = factor(uso_internet, levels = c("nunca", "semanal", "diario")),
    voto = factor(voto, levels = c("no", "si"))
  )

2 Exploración

2.1 Pregunta 1: Participación electoral por grupos

Calculen la proporción de votantes (voto == "si") por zona (urbana/rural) y por género. Muestren los resultados en una tabla. ¿Hay diferencias entre los grupos?

# Escriban su código aquí

Respuesta:

2.2 Pregunta 2: Correlaciones entre predictores

Calculen la matriz de correlaciones entre las variables numéricas: edad, educacion_anios, ingreso_hogar, confianza_gobierno, confianza_justicia, satisfaccion_democracia, percepcion_economia, interes_politica y satisfaccion_vida. ¿Cuáles dos variables tienen la mayor correlación? ¿Tiene sentido teórico?

# Escriban su código aquí

Respuesta:

2.3 Pregunta 3: Distribución de edad por voto

Creen un boxplot que muestre la distribución de edad separada por voto. Agreguen labs() con título y etiquetas claras. ¿Los votantes tienden a ser mayores o menores que los no votantes?

# Escriban su código aquí

Respuesta:

3 Modelos base

3.1 Pregunta 4: Modelo reducido

Dividan los datos en 75% entrenamiento y 25% prueba con set.seed(2026) y estratificación por voto. Luego ajusten una regresión logística usando solo tres predictores: edad, educacion_anios e interes_politica. Calculen la accuracy y el AUC sobre el conjunto de prueba. ¿Cómo se compara con el modelo completo del laboratorio?

Pista: usen la misma estructura de recipe() + workflow() del laboratorio, pero con menos variables en la fórmula.

# Escriban su código aquí

Respuesta:

3.2 Pregunta 5: Coeficientes e interpretación

Usando el modelo reducido de la pregunta 4 (edad, educación e interés político), extraigan los coeficientes con tidy() y calculen los odds ratios (exp(estimate)). ¿Cuál de los tres predictores tiene el efecto más fuerte sobre la probabilidad de votar? ¿Los signos van en la dirección que esperarían teóricamente?

Pista: con los niveles c("no", "si") que definimos en la configuración, glm() modela la probabilidad del segundo nivel (“si”), así que un coeficiente positivo aumenta la probabilidad de votar. Ojo: si el factor estuviera definido al revés (c("si", "no")), todos los signos se invertirían; siempre verifiquen los niveles antes de interpretar.

# Escriban su código aquí

Respuesta:

4 Random Forest y tuning

4.1 Pregunta 6: Efecto del número de árboles

Entrenen tres modelos de Random Forest con 100, 500 y 1000 árboles respectivamente (usando mtry = 4 y min_n = 10 fijos, sin tuning). Calculen el AUC de cada modelo sobre el conjunto de prueba. ¿Cuánto mejora el AUC al aumentar el número de árboles? ¿Vale la pena usar 1000?

# Escriban su código aquí

Respuesta:

4.2 Pregunta 7: Grilla aleatoria vs. regular

En el laboratorio usamos grid_regular() para crear la grilla de búsqueda. Ahora usen grid_random() con size = 20 para el mismo modelo de Random Forest con mtry y min_n a ajustar. Comparen el mejor AUC obtenido con cada tipo de grilla.

Pista: es la misma idea que grid_regular() del laboratorio, pero con grid_random(). Pásenle los rangos de mtry() y min_n() (los mismos que usaron antes) y el argumento size para fijar cuántas combinaciones probar.

# Escriban su código aquí

Respuesta:

4.3 Pregunta 8: ¿La validación cruzada predice el desempeño real?

La validación cruzada estima el desempeño usando solo los datos de entrenamiento. Tomen la mejor combinación de hiperparámetros de la grilla regular (pregunta 7), finalicen el workflow, ajústenlo sobre todo el conjunto de entrenamiento y calculen el AUC sobre el conjunto de prueba. Comparen ese AUC con la estimación de la validación cruzada (media ± 2 errores estándar de show_best()). ¿La validación cruzada fue optimista, pesimista o acertada? ¿Por qué es importante que el conjunto de prueba no participe del tuning?

Pista: el flujo es el mismo del final del laboratorio: finalize_workflow(), ajustar sobre los datos de entrenamiento, predecir sobre los de prueba.

# Escriban su código aquí

Respuesta:

5 Interpretación

5.1 Pregunta 9: PDPs adicionales

Usando el modelo de Random Forest ajustado en el laboratorio, creen Partial Dependence Plots para confianza_gobierno y educacion_anios. Describan la relación que observan: ¿es lineal, tiene mesetas, tiene curvas?

# Escriban su código aquí

Respuesta:

5.2 Pregunta 10: VIP vs. coeficientes logísticos

Comparen el ranking de importancia del VIP (Random Forest, Gini) con el ranking de los coeficientes de la regresión logística (ordenados por valor absoluto del estadístico z). ¿Coinciden los dos rankings? ¿Por qué podrían diferir?

Pista: en tidy(), la columna statistic contiene el estadístico z.

# Escriban su código aquí

Respuesta:

6 Comparación de modelos

6.1 Pregunta 11: Agregar un árbol de decisión

Entrenen un modelo decision_tree() con cost_complexity = 0.01, tree_depth = 10 y min_n = 10. Calculen sus métricas (accuracy, AUC) sobre el conjunto de prueba y compárenlas con la regresión logística y el Random Forest. ¿Cuánto se pierde en rendimiento respecto al Random Forest?

Pista: la sintaxis del árbol está en el Apéndice 3 del Laboratorio 3: decision_tree(cost_complexity, tree_depth, min_n) |> set_engine("rpart") |> set_mode("classification").

# Escriban su código aquí

Respuesta:

6.2 Pregunta 12: Tabla comparativa completa

Creen una tabla que compare cuatro modelos (regresión logística, Random Forest, XGBoost y árbol de decisión) con las métricas: accuracy, AUC, precision, recall y F1. Usen bind_rows() para combinar y pivot_wider() para formatear.

Pista (XGBoost): la sintaxis está en el Apéndice 4 del Laboratorio 3. Usen boost_tree() con el motor xgboost en modo clasificación; pueden fijar los hiperparámetros (por ejemplo trees, tree_depth, learn_rate) en valores razonables.

Pista (métricas): para cada modelo necesitan tanto la clase predicha como la probabilidad; augment() les da ambas en un paso. Definan una sola vez metric_set(accuracy, roc_auc, precision, recall, f_meas) y aplíquenla a las predicciones de cada modelo (con event_level = "second", como en el laboratorio).

# Escriban su código aquí

Respuesta:

7 Reflexión

7.1 Pregunta 13: Recomendación para un tomador de decisiones

Imaginen que trabajan para un organismo electoral latinoamericano que quiere entender qué factores influyen en la participación electoral para diseñar campañas de movilización. ¿Qué modelo recomendarían de los cuatro que entrenaron? Consideren al menos tres criterios: rendimiento predictivo, interpretabilidad y utilidad para la toma de decisiones. Justifiquen su respuesta.

Respuesta:

Volver arriba