knitr::opts_chunk$set(echo = TRUE)
k_values <- 1:20
library(grid)
library(haven)
library(dplyr)
library(ggplot2)

#leer el archivo.sav
CHC_2017 <- read_sav("Estructura CHC_2017.sav")

# 3. Convertir etiquetas
CHC_2017 <- CHC_2017 %>%
  mutate(across(everything(), as_factor))

# 4. Seleccion variables 
datos <- CHC_2017 %>%
  select(P32, P35, P8, P28R, P29, P23S1R)

# 5. Recodificación según el documento
datos <- datos %>%
  mutate(
    P32_bin = ifelse(P32 == "Sí", 1, 0),                                # Variable dependiente
    sexo = ifelse(P35 == "Hombre", 1, 0),                               # X1
    edad_grupo = ifelse(as.numeric(as.character(P8)) >= 18 & 
                          as.numeric(as.character(P8)) <= 39, 1, 0),       # X2
    nivel_educ = ifelse(P28R %in% c("Sin educación", "Primaria"), 1, 0),# X3
    actividad = ifelse(P29 == "Reciclaje", 1, 0),                       # X4
    tiempo_calle = ifelse(as.numeric(as.character(P23S1R)) > 5, 1, 0)   # X5
  )

# 6. Análisis descriptivo de variables numéricas
cat("\n--- Estadísticas descriptivas de variables numéricas ---\n")
## 
## --- Estadísticas descriptivas de variables numéricas ---
summary(select(datos, P8, P23S1R))
##        P8           P23S1R    
##  34     : 245   10     : 520  
##  36     : 235   20     : 471  
##  35     : 231   0      : 415  
##  37     : 228   1      : 413  
##  27     : 224   2      : 396  
##  (Other):5783   (Other):4694  
##  NA's   :2592   NA's   :2629
# Selección de variables
datos <- CHC_2017 %>%
  select(P32, P35, P8, P28R, P29, P23S1R)

# ---- Conversión variables numéricas ----
datos <- datos %>%
  mutate(
    P8 = as.numeric(as.character(P8)),      
    P23S1R = as.numeric(as.character(P23S1R))
  )

# ---- Variable dependiente: Uso de programas ----
datos <- datos %>%
  mutate(
    P32_bin = ifelse(P32 == "Sí", 1,
                     ifelse(P32 == "No", 0, NA))
  )

# ---- Variable binaria: Sexo ----
datos <- datos %>%
  mutate(
    sexo_bin = ifelse(P35 == "Hombre", 1,
                      ifelse(P35 == "Mujer", 0, NA))
  )

# ---- Variable binaria: Nivel educativo ----
datos <- datos %>%
  mutate(
    P28R_bin = case_when(
      P28R %in% c("Ninguno", "Básica primaria") ~ 1,
      P28R %in% c("Básica secundaria",
                  "Media académica, media técnica o normalista",
                  "Técnica profesional o tecnológica",
                  "Universitario o posgrado") ~ 0,
      TRUE ~ NA_real_
    )
  )

# ---- Variable binaria: Actividad ----
datos <- datos %>%
  mutate(
    P29_bin = case_when(
      P29 == "Reciclaje" ~ 1,
      !is.na(P29) ~ 0,
      TRUE ~ NA_real_
    )
  )

# ---- Grupo de edad (18–39 = 1 / 40+ = 0) ----
datos <- datos %>%
  mutate(
    edad_grupo = ifelse(P8 < 40, 1,
                        ifelse(P8 >= 40, 0, NA))
  )

# ---- Categorizar tiempo en calle ----
datos <- datos %>%
  mutate(
    tiempo_calle = ifelse(P23S1R > 5, 1,
                          ifelse(P23S1R <= 5, 0, NA))
  )

1 INTRODUCCIÓN:

El fenómeno de la habitancia en calle constituye una de las expresiones más críticas de la exclusión social. En Colombia, miles de personas enfrentan condiciones de vulnerabilidad extrema al carecer de vivienda, estabilidad económica, redes de apoyo y acceso adecuado a servicios básicos, salud o educación. Esta situación no solo compromete el bienestar individual, sino que también plantea retos profundos para la gestión pública, la cohesión social y el ejercicio de los derechos humanos.

En respuesta a esta problemática, el Departamento Administrativo Nacional de Estadística (DANE) llevó a cabo en 2017 el Censo de Habitantes de Calle (CHC 2017), con el fin de generar información estadística confiable sobre las condiciones de vida, características sociodemográficas, niveles educativos, actividades económicas y participación institucional de esta población. Este censo constituye una fuente fundamental para orientar políticas de inclusión, atención integral y rehabilitación en todo el territorio nacional.

El análisis de estos datos permite comprender de manera más profunda quiénes son los habitantes de calle, cómo viven y qué factores influyen en su relación con los programas de atención y apoyo social. Sin embargo, a pesar de la riqueza de la información recolectada, no basta con describir la situación: es necesario modelar y predecir comportamientos o patrones que orienten la toma de decisiones, la focalización de recursos y el diseño de políticas públicas más efectivas.

En este contexto, el presente estudio busca aplicar modelos de clasificación supervisada, específicamente Regresión Logística (Logit) y K-Nearest Neighbors (KNN), para predecir la probabilidad de que una persona en situación de calle utilice o no los programas institucionales de atención ofrecidos por entidades públicas o privadas.

A partir de variables como el nivel educativo, la actividad principal, la edad, el tiempo viviendo en calle y otras características sociodemográficas, se pretende identificar los factores que influyen en la vinculación de esta población a los servicios de apoyo.

El problema central se puede definir de la siguiente manera:

Problema de investigación: ¿Qué características personales y sociales inciden en la probabilidad de que una persona habitante de calle acceda o no a programas de atención institucional, y qué modelo predictivo —entre la Regresión Logística y el KNN— permite estimar con mayor precisión esa probabilidad?

Este análisis no solo aporta valor técnico, sino también social: comprender los determinantes del uso de programas de atención permite orientar esfuerzos hacia quienes más los necesitan, fortalecer las estrategias de inclusión y avanzar hacia políticas públicas basadas en evidencia.

En suma, el modelamiento estadístico y de aprendizaje automático se convierte aquí en una herramienta de transformación social, capaz de vincular la analítica de datos con el propósito humano de restablecer derechos, reducir desigualdades y mejorar la calidad de vida de las personas más vulnerables.

2 Metodología:

Para este estudio se utilizó la base de datos del Censo de Habitantes de Calle 2017 del DANE, que recoge información demográfica, social y económica de personas que habitan en las calles de diferentes ciudades de Colombia. El propósito principal fue analizar las condiciones que influyen en su situación de vulnerabilidad y construir un modelo que permitiera clasificar y predecir ciertos comportamientos o características relevantes dentro de esta población.

En primer lugar, se realizó un proceso de limpieza y depuración de los datos, eliminando valores faltantes y ajustando las variables necesarias para el análisis. Posteriormente, se seleccionaron las variables más relevantes, entre ellas la edad, el nivel educativo, el tiempo que llevan en situación de calle, el sexo, y otros factores relacionados con su entorno social. Estas variables se eligieron por su posible relación con la condición de habitante de calle y su influencia en la calidad de vida de las personas.

Para el modelamiento se utilizaron dos algoritmos de clasificación supervisada: Regresión Logística (Logit) y K-Nearest Neighbors (KNN).

El modelo Logit se aplicó con el objetivo de estimar la probabilidad de que un individuo perteneciera a un grupo determinado (por ejemplo, nivel educativo bajo o medio-alto), a partir de las variables explicativas.

El modelo KNN, por su parte, clasifica los casos nuevos basándose en la similitud con los datos existentes, considerando los “vecinos” más cercanos en el espacio de características.

Para ambos modelos, el conjunto de datos se dividió en dos partes: una de entrenamiento y otra de prueba, con el fin de evaluar el desempeño predictivo de cada modelo. Las métricas utilizadas para la comparación fueron la exactitud (accuracy), la sensibilidad (recall), la precisión, y el AUC (Área bajo la curva ROC), que mide la capacidad del modelo para distinguir correctamente entre las clases.

El análisis se realizó en el lenguaje de programación Python, utilizando librerías como pandas, scikit-learn, matplotlib y seaborn, que facilitaron la manipulación de datos, el entrenamiento de los modelos y la visualización de los resultados.

3 DESCRPCIÓN DE LA FUENTE DE DATOS:

Base de datos: Censo de Habitantes de Calle

Período: (2017)

Acceso: https://microdatos.dane.gov.co/index.php/catalog/548/data-dictionary/F1?file_name=Estructura%20CHC_2017

A continuación se presenta la base de datos del Censo de Habitantes de Calle,que tiene como objetivo general Contar con información actualizada y confiable sobre el volumen y las principales características socioeconómicas y demográficas de los habitantes de la calle ubicados en el territorio nacional, para la formulación, gestión y evaluación de las políticas, planes y programas de las administraciones municipales, departamentales y nacionales, respecto a la atención integral, rehabilitación e inclusión social de dicha población.

3.1 VARIABLE Y

P32 – “¿Utiliza programas de atención?” Esta variable permite distinguir entre quienes participan en programas de apoyo social y quienes permanecen por fuera de ellos, lo cual es esencial para estudiar los factores asociados a dicha participación.

Se observa que la mayoría no ha tenido acceso ni ha participado en estos programas, mientras que una proporción menor sí lo ha hecho. Esto refleja una baja cobertura o participación en programas institucionales, lo cual puede deberse a desconocimiento, desconfianza o dificultades de acceso. Esta información es importante porque el uso de programas podría estar asociado con una mejor calidad de vida o con procesos de reintegración social.

De acuerdo con los datos, 40.08% de los encuestados manifestaron utilizar programas de atención, mientras que 19.10% no lo hacen.

ggplot(datos, aes(x = factor(P32_bin))) +
  geom_bar(fill= "skyblue") +
  labs(x = "1=Sí, 0=No", y = "Frecuencia",
       title = "Uso de programas de atención")

tabla_P32 <- datos %>%
  count(P32_bin) %>%
  mutate(
    Categoría = ifelse(P32_bin == 1, "Sí usa programas de atención", 
                       "No usa programas de atención"),
    `Porcentaje (%)` = round(100 * n / sum(n), 2)
  ) %>%
  select(Categoría, Frecuencia = n, `Porcentaje (%)`)
grid.newpage()
grid.text("Uso de programas de atención (P32)", y = 0.95, gp = gpar(fontsize = 14, fontface = "bold"))
grid.table(tabla_P32)

4 VARIABLES X CUANTITATIVAS:

4.1 X1: Grupo de edad P8

Variable numérica expresada en años, con codificación binaria (1 = 18–39 años / 0 = 40 años o más). Permite examinar si los jóvenes muestran una mayor probabilidad de acceder a programas institucionales en comparación con las personas mayores.

De acuerdo con los datos, 42.80% de los encuestados pertenecen al grupo de edad de 18-39 años, mientras que 30.03% pertenecen al grupo de 40+ años . con un rango de [14.00000] a [90.00000].

El gráfico de barras correspondiente al sexo indica que la población masculina predomina ampliamente entre los habitantes de calle encuestados. La proporción de mujeres es significativamente menor. Esto concuerda con los estudios previos sobre este fenómeno social, donde los hombres suelen ser mayoría debido a factores estructurales como el desempleo, el consumo de sustancias y la ruptura de vínculos familiares. Sin embargo, la presencia femenina, aunque menor, es preocupante, pues las mujeres en calle suelen enfrentar mayores riesgos de violencia y exclusión.

ggplot(datos, aes(x = factor(edad_grupo))) +
  geom_bar(fill="lightgreen") +
  labs(x = "1=18–39, 0=40+", y = "Frecuencia",
       title = "Distribución por grupo de edad")

tabla_edad <- data.frame(
  Estadístico = c("Media", "Mediana", "Mínimo", "Máximo", "Desviación estándar"),
  Valor = c(
    mean(datos$P8, na.rm = TRUE),
    median(datos$P8, na.rm = TRUE),
    min(datos$P8, na.rm = TRUE),
    max(datos$P8, na.rm = TRUE),
    sd(datos$P8, na.rm = TRUE)
  )
)
grid.newpage()
grid.text("Edad (P8)", y = 0.95, gp = gpar(fontsize = 14, fontface = "bold"))
grid.table(tabla_edad)

4.2 X2: Tiempo viviendo en la calle P23S1R

Variable numérica en años, recodificada como 1 = Más de 5 años / 0 = 5 años o menos.

El tiempo de permanencia refleja el grado de vulnerabilidad y adaptación a la vida en la calle. Se espera que las personas con más tiempo en esta situación tengan menor probabilidad de acceder a programas de atención.

En este gráfico se observa la distribución entre dos grupos etarios: jóvenes y adultos (18–39 años) y mayores de 40 años. Los datos indican que existe una mayor concentración de personas mayores de 40 años, lo que sugiere que gran parte de esta población ha permanecido en calle durante largos periodos de su vida o llegó a ella en edades adultas. Este hallazgo implica que las estrategias de atención deben considerar enfoques diferenciales por edad, ya que las necesidades de los jóvenes son distintas a las de los adultos mayores.

ggplot(datos, aes(x = factor(tiempo_calle))) +
  geom_bar(fill="orange") +
  labs(x = "1=>5 años, 0=≤5 años", y = "Frecuencia",
       title = "Tiempo viviendo en calle")

tabla_tiempo <- data.frame(
  Estadístico = c("Media", "Mediana", "Mínimo", "Máximo", "Desviación estándar"),
  Valor = c(
    mean(datos$P23S1R, na.rm = TRUE),
    median(datos$P23S1R, na.rm = TRUE),
    min(datos$P23S1R, na.rm = TRUE),
    max(datos$P23S1R, na.rm = TRUE),
    sd(datos$P23S1R, na.rm = TRUE)
  )
)
grid.newpage()
grid.text("Tiempo en la calle (P23S1R)", y = 0.95, gp = gpar(fontsize = 14, fontface = "bold"))
grid.table(tabla_tiempo)

4.3 X3: Sexo P35

En la muestra predominan los hombres, reflejando la composición habitual de la población en situación de calle. Se plantea la hipótesis de que las mujeres podrían tener mayor propensión a vincularse con programas de atención debido a factores de vulnerabilidad específicos, como la maternidad o las responsabilidades de cuidado.

El gráfico de barras correspondiente al sexo indica que la población masculina predomina ampliamente entre los habitantes de calle encuestados. La proporción de mujeres es significativamente menor. Esto concuerda con los estudios previos sobre este fenómeno social, donde los hombres suelen ser mayoría debido a factores estructurales como el desempleo, el consumo de sustancias y la ruptura de vínculos familiares. Sin embargo, la presencia femenina, aunque menor, es preocupante, pues las mujeres en calle suelen enfrentar mayores riesgos de violencia y exclusión.

ggplot(datos, aes(x = factor(sexo_bin))) +
  geom_bar(fill="pink") +
  labs(x = "1=Hombre, 0=Mujer", y = "Frecuencia",
       title = "Distribución por sexo")

tabla_sexo <- datos %>%
  count(P35) %>%
  mutate(`Porcentaje (%)` = round(100 * n / sum(n), 2)) %>%
  rename(Categoría = P35, Frecuencia = n)
grid.newpage()
grid.text("Sexo (P35)", y = 0.95, gp = gpar(fontsize = 14, fontface = "bold"))
grid.table(tabla_sexo)

4.4 X4: Nivel educativo alcanzado P28R

Variable categórica, agrupada en dos niveles: 1 = Bajo (sin educación o primaria) y 0 = Medio–alto (secundaria o superior). Dado que la educación influye en las oportunidades laborales y en la capacidad de acceso a la información institucional, se espera que las personas con mayor nivel educativo presenten una participación más alta en los programas. En la muestra, la mayoría de los participantes tiene un nivel educativo bajo (27.44%).

El gráfico del nivel educativo muestra que la gran mayoría posee un nivel educativo bajo, es decir, sin educación formal o con estudios incompletos. Solo una pequeña fracción alcanza niveles medios o altos. Este indicador es fundamental, pues la educación se asocia directamente con la posibilidad de reintegración laboral y social. La baja escolaridad limita las oportunidades y profundiza la exclusión, lo que resalta la importancia de programas educativos flexibles dirigidos a esta población.

ggplot(datos, aes(x = factor(P28R_bin))) +
  geom_bar(fill="yellow") +
  labs(x = "1=Bajo, 0=Medio-Alto", y = "Frecuencia",
       title = "Nivel educativo")

tabla_actividad_bin <- datos %>%
  count(P29_bin) %>%
  mutate(
    Categoría = ifelse(P29_bin == 1, "Reciclaje", "Otro medio"),
    `Porcentaje (%)` = round(100 * n / sum(n), 2)
  ) %>%
  select(Categoría, Frecuencia = n, `Porcentaje (%)`)
grid.newpage()
grid.text("Actividad principal (P29_bin)", y = 0.95, gp = gpar(fontsize = 14, fontface = "bold"))
grid.table(tabla_actividad_bin)

4.5 X5: Actividad principal para obtener dinero P29

El reciclaje es una de las principales actividades económicas entre las personas en situación de calle y puede relacionarse con un mayor contacto con organizaciones sociales. En los datos,72.27 % de los encuestados indicó el reciclaje como su fuente principal de ingresos.

Este gráfico presenta las principales actividades económicas que realizan las personas en situación de calle. La variable “P29_bin” diferencia entre quienes obtienen ingresos por reciclaje y quienes lo hacen por otros medios (como venta informal, mendicidad, oficios temporales, entre otros). La mayoría de los encuestados se dedica al reciclaje como principal fuente de sustento, lo cual evidencia su papel dentro de la economía informal urbana. No obstante, esta actividad suele estar mal remunerada y carece de condiciones dignas de trabajo, lo que perpetúa la vulnerabilidad económica del grupo.

ggplot(datos, aes(x = factor(P29_bin))) +
  geom_bar(fill="purple") +
  labs(x = "1=Reciclaje, 0=Otro medio", y = "Frecuencia",
       title = "Actividad para obtener dinero")

tabla_educ <- datos %>%
  count(P28R_bin) %>%
  mutate(
    Categoría = ifelse(P28R_bin == 1,
                       "Nivel bajo (sin educación o primaria)",
                       "Nivel medio-alto (secundaria o más)"),
    `Porcentaje (%)` = round(100 * n / sum(n), 2)
  ) %>%
  select(Categoría, Frecuencia = n, `Porcentaje (%)`)
grid.newpage()
grid.text("Nivel educativo binario (P28R_bin)", y = 0.95, gp = gpar(fontsize = 14, fontface = "bold"))
grid.table(tabla_educ)

5 INTERPRETACIÓN GENERAL:

En términos generales, se observa que esta población presenta altos niveles de vulnerabilidad social, educativa y económica, lo que influye directamente en sus posibilidades de integración y en la efectividad de las políticas públicas dirigidas a ellos.

En primer lugar, se evidencia que la mayoría no participa en programas de atención social, lo que sugiere una brecha entre la oferta institucional y el acceso real de esta población a los servicios del Estado. Este hallazgo es relevante, ya que limita las oportunidades de inclusión y de mejora de sus condiciones de vida.

Asimismo, la población masculina predomina ampliamente sobre la femenina, lo cual coincide con estudios previos que asocian la condición de habitante de calle con dinámicas de exclusión económica y social que afectan principalmente a los hombres adultos. Sin embargo, la presencia de mujeres, aunque menor, resalta la necesidad de estrategias de atención con enfoque diferencial de género, dada su mayor exposición a situaciones de vulnerabilidad.

En cuanto a la edad, se observa una concentración importante en personas mayores de 40 años, lo que indica una tendencia a la permanencia prolongada en calle o al ingreso en edades adultas. Este resultado refuerza la idea de un fenómeno crónico y difícil de revertir, donde el paso del tiempo consolida las condiciones de exclusión.

El análisis de las actividades económicas muestra que el reciclaje es la principal fuente de ingresos, evidenciando la dependencia de la economía informal y la precariedad laboral de este grupo. Esto refleja no solo la falta de alternativas de empleo formal, sino también el rol ambiental que desempeñan estas personas sin recibir reconocimiento ni garantías laborales.

En el ámbito educativo, la mayoría de los encuestados posee bajo nivel educativo, lo que limita sus oportunidades de inserción laboral y social. La educación, siendo un factor clave para la movilidad social, aparece aquí como una de las principales carencias estructurales.

Finalmente, el análisis del tiempo viviendo en calle revela que gran parte de esta población ha permanecido más de cinco años en dicha condición, lo cual sugiere procesos de cronificación y la necesidad de políticas públicas sostenidas, integrales y personalizadas que promuevan su rehabilitación y reintegración.

En síntesis, los gráficos reflejan una realidad compleja marcada por la exclusión, la desigualdad y la falta de acceso a oportunidades básicas. Los resultados permiten comprender mejor las características de esta población y servirán como base para la construcción y análisis de los modelos predictivos (KNN y Regresión Logística), orientados a identificar factores asociados al uso de programas de atención social.

6 CONSTRUCCIÓN DE CLASIFICACIÓN

Para clasificar a las personas en situación de calle según si utilizan o no programas institucionales de atención (variable P32), se aplicaron dos modelos de clasificación: K-Nearest Neighbors (KNN) y Regresión Logística Binaria (Logit).

Ambos se construyeron a partir de las variables explicativas: sexo (P35), grupo de edad (P8), nivel educativo (P28R), actividad principal (P29) y tiempo viviendo en la calle (P23S1R).

Modelo 1: K-Nearest Neighbors (KNN) El modelo KNN clasificó los casos en función de los vecinos más cercanos, utilizando una distancia euclidiana entre las variables estandarizadas. El valor óptimo de k = 19 fue seleccionado tras evaluar el desempeño del modelo con diferentes valores de k, alcanzando una precisión de 65.21%.

# MODELO KNN – Predicción del uso de programas de atención (P32_bin)

library(class)
library(caret)
## Cargando paquete requerido: lattice
library(dplyr)

# Seleccion de variables numéricas relevantes para el modelo
modelo_knn <- datos %>%
  select(P32_bin, P28R_bin, P29_bin, P8, P23S1R) %>%
  na.omit()   # Eliminamos casos con NA para poder entrenar

# Estandarizar variables predictoras (muy importante en KNN)
modelo_knn$P8 <- scale(modelo_knn$P8)
modelo_knn$P23S1R <- scale(modelo_knn$P23S1R)

# Dividir datos en entrenamiento (70%) y prueba (30%)
set.seed(123)
train_index <- sample(1:nrow(modelo_knn), 0.7 * nrow(modelo_knn))
train <- modelo_knn[train_index, ]
test <- modelo_knn[-train_index, ]

# Definir variables dependiente e independientes
train_x <- train[, c("P28R_bin", "P29_bin", "P8", "P23S1R")]
train_y <- train$P32_bin
test_x  <- test[, c("P28R_bin", "P29_bin", "P8", "P23S1R")]
test_y  <- test$P32_bin

# Probar varios valores de k para encontrar el óptimo
k_values <- seq(1, 25, by = 2)
accuracy <- numeric(length(k_values))

for (i in seq_along(k_values)) {
  pred <- knn(train_x, test_x, train_y, k = k_values[i])
  accuracy[i] <- mean(pred == test_y)
}

# Mostrar el mejor valor de k
mejor_k <- k_values[which.max(accuracy)]
cat("\n Mejor valor de k:", mejor_k, "con una precisión de", round(max(accuracy)*100, 2), "%\n")
## 
##  Mejor valor de k: 19 con una precisión de 65.21 %

6.0.1 la matriz de confusión obtenida fue de:

# Entrenar modelo final con el mejor k
pred_final <- knn(train_x, test_x, train_y, k = mejor_k)

# Evaluar resultados
conf_matrix <- table(Predicho = pred_final, Real = test_y)
cat("\n MATRIZ DE CONFUSIÓN:\n")
## 
##  MATRIZ DE CONFUSIÓN:
print(conf_matrix)
##         Real
## Predicho    0    1
##        0   38   55
##        1  524 1059

6.1 Precisión final del modelo:

La precisión final del modelo KNN fue de 65.45%, mostrando una capacidad moderada para clasificar correctamente los casos.

El modelo presentó un recall de 0.192, una precisión de 0.397 y un F1 score de 0.259, lo que indica que, aunque logra detectar algunos casos positivos, tiende a tener un número elevado de falsos negativos.

# Gráfico de precisión según k
plot(k_values, accuracy, type = "b", pch = 19, col = "purple",
     xlab = "Valor de k", ylab = "Precisión del modelo",
     main = "Selección del mejor k en KNN")
abline(v = mejor_k, col = "red", lty = 2)

6.2 Modelo 2: Regresión Logística (Logit)

El modelo logit estima la probabilidad de que una persona use programas de atención en función de las variables sociodemográficas. Los resultados mostraron una precisión (accuracy) de 0.665, un recall de 0.000 y un AUC de 0.517. Estos valores reflejan un desempeño bajo en la detección de casos positivos, aunque el modelo logra un nivel de clasificación global similar al KNN. A pesar de su menor sensibilidad, el modelo logístico permite interpretar los efectos individuales de cada variable, identificando los factores que influyen significativamente en la probabilidad de uso de programas institucionales.

6.3 Tabla comparativa

library(class)
library(caret)
library(pROC)
## Type 'citation("pROC")' for a citation.
## 
## Adjuntando el paquete: 'pROC'
## The following objects are masked from 'package:stats':
## 
##     cov, smooth, var
library(dplyr)


modelo_comparacion <- datos %>%
  select(P32_bin, P28R_bin, P29_bin, P8, P23S1R) %>%
  na.omit()

# Estandarizar variables continuas
modelo_comparacion$P8 <- scale(modelo_comparacion$P8)
modelo_comparacion$P23S1R <- scale(modelo_comparacion$P23S1R)

# Dividir en entrenamiento (70%) y prueba (30%)
set.seed(123)
train_index <- sample(1:nrow(modelo_comparacion), 0.7 * nrow(modelo_comparacion))
train <- modelo_comparacion[train_index, ]
test <- modelo_comparacion[-train_index, ]

train_x <- train[, c("P28R_bin", "P29_bin", "P8", "P23S1R")]
train_y <- train$P32_bin
test_x  <- test[, c("P28R_bin", "P29_bin", "P8", "P23S1R")]
test_y  <- test$P32_bin

# Modelo 1: Regresión Logística
modelo_logit <- glm(P32_bin ~ P28R_bin + P29_bin + P8 + P23S1R,
                    data = train, family = binomial)

pred_logit_prob <- predict(modelo_logit, newdata = test, type = "response")
pred_logit <- ifelse(pred_logit_prob > 0.5, 1, 0)

# Modelo 2: KNN
k_optimo <- 5 
pred_knn <- knn(train_x, test_x, train_y, k = k_optimo)

# Evaluación de ambos modelos
evaluar_modelo <- function(real, pred, prob = NULL) {
  cm <- confusionMatrix(factor(pred), factor(real))
  acc <- cm$overall["Accuracy"]
  rec <- cm$byClass["Recall"]
  prec <- cm$byClass["Precision"]
  f1 <- cm$byClass["F1"]
  auc <- if (!is.null(prob)) roc(real, prob)$auc else NA
  return(c(Accuracy = acc, Recall = rec, Precision = prec, F1 = f1, AUC = auc))
}

result_logit <- evaluar_modelo(test_y, pred_logit, pred_logit_prob)
## Warning in confusionMatrix.default(factor(pred), factor(real)): Levels are not
## in the same order for reference and data. Refactoring data to match.
## Setting levels: control = 0, case = 1
## Setting direction: controls < cases
result_knn <- evaluar_modelo(test_y, pred_knn)

# Tabla comparativa
comparacion <- rbind(Logístico = result_logit, KNN = result_knn)
print(round(comparacion, 3))
##           Accuracy.Accuracy Recall.Recall Precision.Precision F1.F1   AUC
## Logístico             0.665         0.000                  NA    NA 0.517
## KNN                   0.631         0.192               0.397 0.259    NA

6.4 Curva ROC comparativa: muestra un desempeño similar entre ambos modelos, aunque el modelo logístico mantiene una ligera ventaja en el área bajo la curva.

roc_logit <- roc(test_y, pred_logit_prob)
## Setting levels: control = 0, case = 1
## Setting direction: controls < cases
roc_knn <- roc(test_y, as.numeric(pred_knn))
## Setting levels: control = 0, case = 1
## Setting direction: controls < cases
plot(roc_logit, col = "blue", main = "Curvas ROC: Logit vs KNN")
lines(roc_knn, col = "purple")
legend("bottomright", legend = c("Logit", "KNN"),
       col = c("blue", "purple"), lwd = 2)

# REFLEXIÓN FINAL:

Al comparar ambos modelos, se observa que el KNN logra una sensibilidad mayor (0.192), identifica mejor los casos positivos (personas que usan programas de atención). Sin embargo, su precisión general (65.45%) es ligeramente inferior a la del modelo logístico (66.5%), y su interpretación es menos transparente. El modelo logístico, aunque tiene baja sensibilidad, ofrece una mejor capacidad de interpretación y una ligera mayor exactitud global. Por lo tanto lo convierte en la opción más adecuada para este tipo de análisis, donde el interés no solo es clasificar correctamente, sino también comprender qué factores influyen en la participación de las personas en programas institucionales. Se recomienda el uso del modelo de regresión logística, ya que permite cuantificar el efecto de cada variable sobre la probabilidad de uso, facilitando la toma de decisiones informadas en el diseño de atención a la población en situación de calle.