1.Introducción

La seguridad ciudadana es uno de los retos sociales más significativos en Colombia. Los delitos contra las personas, especialmente el hurto, generan un impacto profundo en la percepción de seguridad, el bienestar psicológico y la confianza en las instituciones. Según la Encuesta de Convivencia y Seguridad Ciudadana (ECSC) del DANE, el hurto a personas se mantiene como uno de los delitos más comunes en las zonas urbanas del país. Sin embargo, una proporción considerable de estos casos no se denuncia, lo que provoca subregistros que dificultan comprender la magnitud real del problema y limitan la capacidad de respuesta de las autoridades locales y nacionales.

El análisis de los factores asociados a la victimización es clave para entender las condiciones bajo las cuales se cometen estos delitos y para identificar perfiles de riesgo dentro de la población. Variables como haber sido víctima previamente, la hora del suceso, si ocurrió en compañía, si hubo amenaza con arma o si se presentó denuncia, ofrecen indicios sobre las circunstancias que incrementan o reducen la probabilidad de ser víctima. Este tipo de análisis permite generar diagnósticos más precisos y orientar el diseño de políticas públicas basadas en evidencia, priorizando acciones preventivas en contextos de mayor vulnerabilidad.

El presente trabajo tiene como objetivo modelar los factores asociados con la probabilidad de haber sido víctima de hurto a personas en Colombia, a partir de la información del módulo de victimización de la ECSC. Para ello, se emplean dos métodos de clasificación: el algoritmo K-Nearest Neighbors (KNN) y la Regresión Logística Penalizada de Firth, seleccionados por su capacidad de identificar patrones y estimar relaciones entre variables explicativas y una respuesta binaria.

Finalmente, este estudio busca evaluar y comparar el desempeño de ambos modelos mediante métricas estándar como Accuracy, Sensibilidad y Especificidad. Además, se pretende demostrar cómo las técnicas de aprendizaje supervisado pueden aplicarse al análisis de datos sociales oficiales, ofreciendo una herramienta metodológica útil para el fortalecimiento de la investigación aplicada a la seguridad ciudadana.

2. Metodología

2.1 Fuente de datos

Los datos utilizados en este estudio provienen del módulo Hurto a personas de la Encuesta de Convivencia y Seguridad Ciudadana (ECSC) del DANE, fuente oficial de información sobre victimización en Colombia. La ECSC capta incidentes ocurridos durante los últimos 12 meses a personas residentes en cabeceras municipales y tiene representatividad a nivel nacional. La información se obtuvo del archivo “Hurto a personas.sav”, correspondiente al conjunto de datos suministrado en el marco del taller de Gestión de Datos.

La encuesta incluye un módulo de seguridad que recopila detalles sobre los hechos delictivos sufridos, las circunstancias en las que ocurrieron, las reacciones de las víctimas y sus características sociodemográficas. Este insumo es fundamental para comprender los patrones delictivos, evaluar la percepción de inseguridad y diseñar estrategias de política pública orientadas a la prevención.

2.2 Variables

Variable dependiente (Y):

P1343: “Durante los últimos 12 meses, ¿le han hurtado un objeto personal?”.

Codificación aplicada: Si = 1, No = 2.

Naturaleza: binaria (clasificación).

Esta variable constituye la etiqueta objetivo del modelo; representa el estado de victimización de la persona.

Variables independientes (X):

Variables independientes (X).
Código Descripción Tipo Interpretación
X1 = P1342 Número de veces que fue víctima de hurto Cuantitativa Indica intensidad o frecuencia de victimización.
X2 = P1328 ¿Conocía al agresor? Categórica (Sí/No) Mide un posible factor contextual de riesgo.
X3 = P1333 ¿Fue amenazado con arma durante el hecho? Categórica (Sí/No) Representa el nivel de violencia asociado al suceso.
X4 = P1324 ¿Denunció el hurto ante las autoridades? Categórica (Sí/No) Refleja confianza institucional y conducta post-evento.
X5 = P1318 ¿Se recuperaron los bienes? Categórica (Sí/No) Mide la cantidad de intentos de recuperación efectivos

Las variables X2–X5 son preguntas de seguimiento que solo se formulan si el individuo respondió “Sí” a la variable Y (es decir, si fue víctima). Por diseño, cuando Y = “No”, esas preguntas no aplican, y los valores aparecen como NA (ausencia estructural, no dato perdido al azar). Este detalle metodológico se tuvo en cuenta en la limpieza para evitar eliminar indebidamente casos de la clase “No”. En un escenario predictivo, el uso de variables dependientes del evento puede inducir fuga de información (data leakage), ya que ciertas respuestas solo existen si Y = “Sí”. En este ejercicio, se mantuvo el mismo esquema de variables definido en el script original para respetar el diseño del taller, documentando claramente sus implicaciones en la evaluación.

2.3 Preparación y balanceo de datos

El proceso de preparación siguió tres pasos principales:

Selección y recodificación: Se creó la variable objetivo (Y) a partir de P1343, recodificando sus valores en “Sí” y “No”. Se mapearon las variables P1342–P1318 como X1–X5, manteniendo su formato y etiquetas originales.

Imputación condicional: Para los casos donde Y = “No”, se imputaron valores coherentes (por ejemplo, 0 para X1 y “No” para X2–X5), evitando así eliminar observaciones por saltos estructurales.

Balanceo de clases: Dado que el número de víctimas (Y = “Sí”) era menor que el de no víctimas, se aplicó submuestreo aleatorio (undersampling) para igualar el tamaño de ambas categorías, garantizando un entrenamiento sin sesgo de clase.

2.3.1 Gráficos

# --- 1. Carga de datos ---
mydata <- read_sav("Hurto a personas.sav")

# --- 2. Limpieza y selección de variables ---
mydata_selected <- mydata %>%
  select(P1343, P1342, P1328, P1333, P1324, P1318) %>%
  mutate(
    Y = factor(P1343, levels = c(1, 2), labels = c("Si", "No")),
    X1 = as.numeric(P1342),
    X2 = factor(P1328, levels = c(1, 2), labels = c("Si", "No")),
    X3 = factor(P1333, levels = c(1, 2), labels = c("Si", "No")),
    X4 = factor(P1324, levels = c(1, 2), labels = c("Si", "No")),
    X5 = factor(P1318, levels = c(1, 2), labels = c("Si", "No"))
  ) %>%
  select(Y, X1, X2, X3, X4, X5)

# --- 3. Imputación condicional de valores faltantes ---
mydata_imputed <- mydata_selected %>%
  mutate(
    X1 = ifelse(Y == "No" & is.na(X1), 0, X1),
    X2 = factor(ifelse(Y == "No" & is.na(X2), "No", as.character(X2)), levels = c("Si", "No")),
    X3 = factor(ifelse(Y == "No" & is.na(X3), "No", as.character(X3)), levels = c("Si", "No")),
    X4 = factor(ifelse(Y == "No" & is.na(X4), "No", as.character(X4)), levels = c("Si", "No")),
    X5 = factor(ifelse(Y == "No" & is.na(X5), "No", as.character(X5)), levels = c("Si", "No"))
  )

# --- 4. Limpieza final ---
mydata_clean <- mydata_imputed %>% na.omit()

# --- 5. Balanceo de clases ---
data_si <- mydata_clean %>% filter(Y == "Si")
data_no <- mydata_clean %>% filter(Y == "No")

set.seed(28)
n_min <- min(nrow(data_si), nrow(data_no))
data_si_eq <- sample_n(data_si, n_min)
data_no_eq <- sample_n(data_no, n_min)

mydata_balance <- bind_rows(data_si_eq, data_no_eq)

# --- 6. Gráfica de distribución balanceada ---
library(ggplot2)
ggplot(mydata_balance, aes(x = Y, fill = Y)) +
  geom_bar() +
  geom_text(stat = "count", aes(label = ..count..), vjust = -0.5, size = 5) +
  scale_fill_manual(values = c("#3c8dbc", "#00a65a")) +
  labs(
    title = "Distribución balanceada de la variable Y",
    subtitle = "Casos de víctimas y no víctimas de hurto después del submuestreo",
    x = "Condición de víctima de hurto",
    y = "Frecuencia de casos"
  ) +
  theme_minimal(base_size = 13) +
  theme(
    legend.position = "none",
    plot.title = element_text(hjust = 0.5, face = "bold"),
    plot.subtitle = element_text(hjust = 0.5)
  )

Conteos similares de ‘Si’ y ‘No’ tras balanceo/partición.

knitr::include_graphics(“https://ibb.co/s9KmJ6Hn”)

Mediana = 1; rango hasta 3 en ‘Si’; baja variación informativa.

library(ggplot2)
library(dplyr)

# Calcular proporciones de X2 dentro de cada categoría de Y
prop_x2 <- mydata_balance %>%
  group_by(Y, X2) %>%
  summarise(Frecuencia = n()) %>%
  mutate(Proporcion = Frecuencia / sum(Frecuencia))

# Gráfico de barras apiladas
ggplot(prop_x2, aes(x = Y, y = Proporcion, fill = X2)) +
  geom_bar(stat = "identity", position = "fill") +
  geom_text(aes(label = scales::percent(Proporcion, accuracy = 1)),
            position = position_fill(vjust = 0.5),
            color = "white", size = 4) +
  scale_fill_manual(values = c("#3c8dbc", "#00a65a"), name = "Conocía el agresor") +
  labs(
    title = "Proporción de personas que conocían el agresor",
    subtitle = "",
    x = "Condición de víctima de hurto",
    y = "Proporción"
  ) +
  theme_minimal(base_size = 13) +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold"),
    plot.subtitle = element_text(hjust = 0.5),
    legend.position = "top"
  )

Predomina ‘No’; agresores usualmente desconocidos.

library(ggplot2)
library(dplyr)

# Calcular proporciones de X3 dentro de cada categoría de Y
prop_x3 <- mydata_balance %>%
  group_by(Y, X3) %>%
  summarise(Frecuencia = n()) %>%
  mutate(Proporcion = Frecuencia / sum(Frecuencia))

# Gráfico de barras apiladas
ggplot(prop_x3, aes(x = Y, y = Proporcion, fill = X3)) +
  geom_bar(stat = "identity", position = "fill") +
  geom_text(aes(label = scales::percent(Proporcion, accuracy = 1)),
            position = position_fill(vjust = 0.5),
            color = "white", size = 4) +
  scale_fill_manual(values = c("#3c8dbc", "#00a65a"), name = "¿Hurto armado?") +
  labs(
    title = "Proporción de hurtos armados según condición de víctima (Y)",
    subtitle = "",
    x = "Condición de víctima de hurto",
    y = "Proporción"
  ) +
  theme_minimal(base_size = 13) +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold", size=13),
    plot.subtitle = element_text(hjust = 0.5),
    legend.position = "top"
  )

Conteos Si/No similares entre víctimas; señal moderada.

library(ggplot2)
library(dplyr)

# Calcular proporciones de X4 dentro de cada categoría de Y
prop_x4 <- mydata_balance %>%
  group_by(Y, X4) %>%
  summarise(Frecuencia = n()) %>%
  mutate(Proporcion = Frecuencia / sum(Frecuencia))

# Gráfico de barras apiladas
ggplot(prop_x4, aes(x = Y, y = Proporcion, fill = X4)) +
  geom_bar(stat = "identity", position = "fill") +
  geom_text(aes(label = scales::percent(Proporcion, accuracy = 1)),
            position = position_fill(vjust = 0.5),
            color = "white", size = 4) +
  scale_fill_manual(values = c("#3c8dbc", "#00a65a"), name = "¿Denunció el hurto?") +
  labs(
    title = "Proporción de denuncia del hurto según condición de víctima (Y)",
    subtitle = "Comparación entre víctimas y no víctimas respecto a la denuncia",
    x = "Condición de víctima de hurto",
    y = "Proporción"
  ) +
  theme_minimal(base_size = 13) +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold", size=11),
    plot.subtitle = element_text(hjust = 0.5, size=10),
    legend.position = "top"
  )

Predomina ‘No’ en denuncia; potencial subregistro.

library(ggplot2)
library(dplyr)

# Calcular proporciones de X5 dentro de cada categoría de Y
prop_x5 <- mydata_balance %>%
  group_by(Y, X5) %>%
  summarise(Frecuencia = n()) %>%
  mutate(Proporcion = Frecuencia / sum(Frecuencia))

# Gráfico de barras apiladas
ggplot(prop_x5, aes(x = Y, y = Proporcion, fill = X5)) +
  geom_bar(stat = "identity", position = "fill") +
  geom_text(aes(label = scales::percent(Proporcion, accuracy = 1)),
            position = position_fill(vjust = 0.5),
            color = "white", size = 4) +
  scale_fill_manual(values = c("#3c8dbc", "#00a65a"), name = "¿Se recuperaron los bienes?") +
  labs(
    title = "Proporción de recuperación de bienes hurtados según condición de víctima (Y)",
    subtitle = "Comparación entre víctimas y no víctimas respecto a la recuperación del bien hurtado",
    x = "Condición de víctima de hurto",
    y = "Proporción"
  ) +
  theme_minimal(base_size = 13) +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold", size=11),
    plot.subtitle = element_text(hjust = 0.5, size=11),
    legend.position = "top"
  )

Predomina ‘No’ en ambas clases; baja recuperación de bienes.

2.3.2 Partición, preprocesamiento y modelado

Una vez obtenida la base balanceada, los datos se dividieron en conjunto de entrenamiento (75%) y conjunto de prueba (25%) mediante partición estratificada con la función createDataPartition() del paquete caret.

Para el modelo KNN: Las variables categóricas se transformaron en binarias (1 = “Sí”, 0 = “No”), y se normalizaron todas las variables predictoras con media 0 y desviación estándar 1. Se aplicó el algoritmo K-Nearest Neighbors con k = 3, añadiendo un ligero ruido (jitter) para romper empates en las distancias. Este modelo clasifica observaciones según la mayoría de sus vecinos más cercanos, basándose en la distancia euclidiana.

Para el modelo Logit (Firth): Se ajustó una Regresión Logística Penalizada de Firth, que corrige la separación completa de clases mediante un sesgo penalizado. Este método mejora la estabilidad de los coeficientes y evita estimaciones infinitas en muestras pequeñas o desbalanceadas. Las predicciones se realizaron en formato probabilístico y se convirtieron a clasificación binaria usando el umbral óptimo obtenido por el criterio de Youden en la curva ROC.

2.5 Métricas de evaluación

El desempeño de ambos modelos se evaluó utilizando tres métricas estándar:

Exactitud (Accuracy): proporción total de clasificaciones correctas.

Sensibilidad (Recall o True Positive Rate): capacidad del modelo para identificar correctamente a las víctimas (Y = “Sí”).

Especificidad (True Negative Rate): capacidad para identificar correctamente a las personas no víctimas (Y = “No”).

Además, para el modelo Logit se analizó el Área Bajo la Curva (AUC) de la curva ROC, que resume el poder discriminante entre clases. Estas métricas permiten comparar objetivamente la efectividad de los modelos y establecer cuál logra un mejor equilibrio entre identificación de positivos y negativos.

3. Modelo propuesto

Antes de presentar los resultados empíricos, se describen los fundamentos conceptuales de los modelos utilizados y su formulación matemática. Para analizar los factores asociados a la probabilidad de haber sido víctima de hurto a personas, se aplicaron dos modelos de clasificación supervisada: K-Nearest Neighbors (KNN) y Regresión Logística Firth. Ambos permiten estimar la relación entre un conjunto de variables predictoras (X₁–X₅) y una variable objetivo binaria (Y), que en este caso representa si la persona ha sido víctima de hurto en los últimos 12 meses.

El propósito de estos modelos es identificar patrones en las características de los individuos y de los eventos reportados, con el fin de predecir la ocurrencia del hurto y comparar el desempeño de cada método bajo las mismas condiciones de entrenamiento y prueba.

3.1 Regresión Logística Firth

La regresión logística modela la probabilidad de que ocurra un evento binario Yᵢ (ser víctima de hurto) en función de variables explicativas Xᵢ.
La versión Firth aplica una corrección penalizada que reduce el sesgo en estimaciones con clases desbalanceadas o tamaños muestrales pequeños.

La ecuación general del modelo es:

\[ \text{logit}(P(Y_i = 1)) = \beta_0 + \beta_1 X1_i + \beta_2 X2_i + \beta_3 X3_i + \beta_4 X4_i + \beta_5 X5_i \]

Donde:
- P(Yᵢ = 1) es la probabilidad de que la persona i haya sido víctima de hurto.
- β₀ es el intercepto, que representa la log-odds base.
- β₁, ..., β₅ son los coeficientes de regresión que miden el cambio en las probabilidades asociado a cada predictor.
- X1X5 corresponden respectivamente al número de veces que fue víctima, si fue amenazado, si denunció, si estaba acompañado y si ocurrió de noche.

Este modelo permite interpretar directamente el efecto de cada variable sobre la probabilidad de victimización, ofreciendo una lectura inferencial sobre los factores más determinantes.

3.2 Modelo K-Nearest Neighbors (KNN)

El modelo KNN clasifica cada observación según las categorías predominantes entre sus k vecinos más cercanos en el espacio de variables predictoras. En este estudio se utilizó un valor impar de k (por ejemplo, k = 3) para evitar empates en la asignación de clases.

Formalmente, para un individuo i con vectores de características Xᵢ, la clase predicha Ŷᵢ se obtiene mediante:

\[ \hat{Y_i} = \text{mode}(Y_{(i,1)}, Y_{(i,2)}, ..., Y_{(i,k)}) \]

donde Y₍ᵢ,ⱼ₎ son las clases reales de los k vecinos más cercanos a Xᵢ según una métrica de distancia (en este caso, Euclidiana).

Este algoritmo no asume una relación lineal entre variables y es útil cuando se desea detectar patrones empíricos en los datos sin imponer una estructura funcional previa.

3.3 Comparación de modelos

Ambos modelos se evaluaron sobre el mismo conjunto de datos balanceado, aplicando métricas de desempeño estándar: exactitud (Accuracy), sensibilidad (TPR) y especificidad (TNR).
La comparación entre Logit Firth y KNN permite determinar qué enfoque ofrece mayor capacidad predictiva y estabilidad, considerando tanto la precisión general como la capacidad de detección de casos positivos (víctimas reales).

4.Resultados Descriptivos

## [1] 26364     6
datos_resumen <- mydata_balance %>%
  group_by(Y) %>%
  summarise(
    n = n(),
    X1_promedio = mean(X1, na.rm = TRUE),
    X1_mediana = median(X1, na.rm = TRUE)
  )

knitr::kable(datos_resumen, caption = "Resumen descriptivo por clase de Y")
Resumen descriptivo por clase de Y
Y n X1_promedio X1_mediana
Si 13182 1.388257 1
No 13182 0.000000 0

Los resultados permiten observar la distribución general de las variables antes del modelado, con el fin de comprender las características de la población analizada y detectar posibles patrones de victimización.

En primer lugar, al revisar la variable Y (condición de víctima de hurto), se evidencia que el conjunto de datos fue balanceado de forma intencionada, garantizando una proporción similar entre los casos de personas que sí fueron víctimas y aquellas que no lo fueron. Este equilibrio es fundamental para evitar que los modelos de clasificación se vean sesgados hacia la clase mayoritaria, permitiendo una evaluación más justa del desempeño predictivo.

En cuanto a la variable X1 (número de veces que fue víctima), se observa que, en promedio, las personas que reportaron haber sido víctimas sufrieron entre una y dos incidencias dentro del periodo de referencia. La mediana cercana a 1 indica que la mayoría de los casos corresponden a una sola experiencia de hurto, aunque algunos individuos presentan recurrencia, lo que sugiere una concentración de la victimización en ciertos grupos o contextos.

Respecto a las variables categóricas, se destaca que (la amenaza con arma) (X2) se presenta con cierta frecuencia entre los casos positivos, lo cual evidencia la presencia de violencia e intimidación en una fracción relevante de los hurtos. Por otro lado, la variable (denuncia) (X3) muestra que una proporción considerable de las víctimas no reporta el delito ante las autoridades, un hallazgo coherente con los informes oficiales del DANE, donde se reconoce una brecha entre victimización y denuncia formal. Este comportamiento podría estar relacionado con la desconfianza institucional o la percepción de ineficacia del sistema judicial.

En el caso de X4 (acompañamiento durante el hecho), los resultados sugieren que la mayoría de los hurtos ocurren cuando la persona se encuentra sola, lo cual resalta la importancia del contexto situacional y de los factores de oportunidad delictiva. Finalmente, X5 (recuperación de bienes hurtados) presenta una tendencia intermedia, indicando que la recuperacion de los bienes es algo que ocurre igual que como no ocurre en cantidades similares, Lo que nos podría hacer pensar que no depende directamente de una sola variable en la situación si no que puede llegar a cierto resultado debido a muchas más variables involucradas.

En conjunto, este análisis preliminar refleja una estructura de victimización multifactorial, donde el riesgo no depende únicamente del número de incidentes, sino también de elementos de contexto y comportamiento. Estas observaciones iniciales justifican la aplicación posterior de modelos predictivos (KNN y Logit de Firth) para cuantificar de forma más rigurosa la influencia de cada variable sobre la probabilidad de ser víctima.

5.Modelado y Evaluación

set.seed(28)
train_index <- createDataPartition(y = mydata_balance$Y, p = 0.75, list = FALSE)
train_data <- mydata_balance[train_index, ]
test_data  <- mydata_balance[-train_index, ]

train_data <- train_data %>% select(-X1)
test_data  <- test_data  %>% select(-X1)

train_x_knn <- train_data %>% select(-Y) %>% mutate(across(where(is.factor), ~ as.numeric(. == "Si")))
test_x_knn  <- test_data  %>% select(-Y) %>% mutate(across(where(is.factor), ~ as.numeric(. == "Si")))

preproc <- preProcess(train_x_knn, method = c("center", "scale"))
train_x_knn_norm <- predict(preproc, train_x_knn)
test_x_knn_norm  <- predict(preproc, test_x_knn)

# Agregar jitter para evitar empates
set.seed(28)
train_x_knn_norm <- as.data.frame(train_x_knn_norm) + matrix(rnorm(prod(dim(train_x_knn_norm)), 0, 0.001), nrow = nrow(train_x_knn_norm))
test_x_knn_norm  <- as.data.frame(test_x_knn_norm) + matrix(rnorm(prod(dim(test_x_knn_norm)), 0, 0.001), nrow = nrow(test_x_knn_norm))

# KNN con k=3
knn_pred <- knn(train_x_knn_norm, test_x_knn_norm, cl = train_data$Y, k = 3)
conf_knn <- confusionMatrix(knn_pred, test_data$Y, positive = "Si")

# Modelo Logit (Firth)
fit_logit <- logistf(Y ~ ., data = train_data)
probs <- predict(fit_logit, newdata = test_data, type = "response")
roc_obj <- roc(test_data$Y, probs, levels = c("No", "Si"))
threshold <- coords(roc_obj, x = "best", best.method = "youden", ret = "threshold")$threshold
logit_pred <- factor(ifelse(probs >= threshold, "Si", "No"), levels = c("Si", "No"))
conf_logit <- confusionMatrix(logit_pred, test_data$Y, positive = "Si")

5.1 Visualización del Modelo KNN

5.1.1 Desempeño del Modelo Knn

El gráfico de métricas resume el desempeño del modelo KNN en términos de exactitud (Accuracy), sensibilidad (Sensitivity) y especificidad (Specificity). Los resultados muestran que el modelo alcanza una exactitud general aceptable, lo que significa que clasifica correctamente una proporción considerable de los casos observados.

La sensibilidad refleja la capacidad del modelo para identificar a las personas que efectivamente fueron víctimas de hurto, mientras que la especificidad mide su habilidad para reconocer correctamente a quienes no lo fueron. En este caso, los valores obtenidos indican un equilibrio razonable entre ambos indicadores, lo que sugiere que el modelo logra distinguir adecuadamente las dos clases sin favorecer en exceso una de ellas.

Este comportamiento es especialmente relevante en contextos sociales, donde la información suele ser incompleta o presentar alta variabilidad. En tales escenarios, un rendimiento balanceado es preferible a una precisión extrema en un solo tipo de caso (por ejemplo, identificar solo víctimas o solo no víctimas).

# Gráfico de barras de métricas KNN
metricas_knn <- data.frame(
  Metrica = c("Accuracy", "Sensitivity", "Specificity"),
  Valor = c(conf_knn$overall["Accuracy"], conf_knn$byClass["Sensitivity"], conf_knn$byClass["Specificity"])
)

ggplot(metricas_knn, aes(x = Metrica, y = Valor)) +
  geom_col(fill = "#3c8dbc") +
  geom_text(aes(label = round(Valor, 3)), vjust = -0.25) +
  labs(title = "Desempeño del Modelo KNN", x = "Métrica", y = "Valor Proporcional") +
  theme_minimal()

5.1.2 Matriz de confusión

La matriz de confusión permite examinar en detalle el comportamiento del modelo al comparar las predicciones con los valores reales. Las celdas de la diagonal principal concentran las clasificaciones correctas —casos en los que el modelo predijo “Sí” o “No” correctamente—, mientras que las celdas fuera de la diagonal representan los errores de clasificación.

En los resultados obtenidos, las frecuencias más altas se concentran en la diagonal, lo que confirma un nivel de acierto satisfactorio. Los errores observados se ubican principalmente en los límites entre clases, es decir, en casos donde las características del individuo no permiten una separación nítida entre víctima y no víctima, un fenómeno común en datos sociales con alto traslape entre categorías.

# Matriz de confusión visual para KNN
matriz_knn <- as.data.frame(conf_knn$table)
colnames(matriz_knn) <- c("Prediccion", "Real", "Frecuencia")

ggplot(matriz_knn, aes(x = Real, y = Prediccion, fill = Frecuencia)) +
  geom_tile() +
  geom_text(aes(label = Frecuencia), color = "white", size = 5) +
  scale_fill_gradient(low = "#6baed6", high = "#08306b") +
  labs(title = "Matriz de Confusión - KNN", x = "Real", y = "Predicción") +
  theme_minimal()

Conclusión sobre el modelo KNN

En conjunto, los resultados del modelo KNN evidencian un comportamiento estable y consistente, con un balance adecuado entre sensibilidad y especificidad. El algoritmo logró capturar patrones básicos en las variables relacionadas con el hurto, aunque su poder predictivo depende directamente de la distribución de los datos y de la configuración de los parámetros de vecindad (k).

El rendimiento alcanzado muestra que el modelo es apropiado como herramienta exploratoria para detectar perfiles de riesgo o similitud entre individuos, pero podría beneficiarse de una optimización adicional del parámetro k o de la inclusión de nuevas variables explicativas que aporten mayor discriminación entre grupos. De esta forma, KNN constituye una primera aproximación útil dentro del análisis comparativo, ofreciendo resultados interpretables y coherentes con las dinámicas observadas en la encuesta de seguridad ciudadana.

5.2 Curva ROC

La curva ROC (Receiver Operating Characteristic) representa gráficamente la relación entre la tasa de verdaderos positivos (TPR) y la tasa de falsos positivos (FPR) para distintos umbrales de decisión. El Área Bajo la Curva (AUC) obtenida es elevada, lo que refleja un poder discriminante sólido del modelo para distinguir entre víctimas y no víctimas. Un AUC cercano a 1 indica un rendimiento excelente, mientras que valores cercanos a 0.5 representarían un modelo sin capacidad predictiva. El umbral óptimo, determinado mediante el criterio de Youden, define el punto que maximiza simultáneamente la sensibilidad y la especificidad, permitiendo lograr el mejor equilibrio posible entre ambos tipos de aciertos.

resultados_comp <- data.frame(
  Modelo = c("KNN", "LOGIT (Firth)"),
  Accuracy = c(conf_knn$overall["Accuracy"], conf_logit$overall["Accuracy"]),
  Sensitivity = c(conf_knn$byClass["Sensitivity"], conf_logit$byClass["Sensitivity"]),
  Specificity = c(conf_knn$byClass["Specificity"], conf_logit$byClass["Specificity"])
)

# Curva ROC para Logit (Firth)
auc_val <- auc(roc_obj)
plot(roc_obj, main = sprintf("Curva ROC - Logit (Firth) | AUC = %.3f | Umbral Óptimo = %.3f", auc_val, threshold))

5.3 Resultados Comparativos

El gráfico comparativo muestra las métricas de desempeño de ambos modelos: exactitud (Accuracy), sensibilidad (Sensitivity) y especificidad (Specificity). Los resultados indican que el modelo de Regresión Logística Firth presenta un ligero mejor desempeño global frente al KNN, especialmente en las métricas de sensibilidad y especificidad. Esto sugiere que el modelo penalizado logró un mayor equilibrio entre la correcta identificación de las víctimas (verdaderos positivos) y la de las personas no víctimas (verdaderos negativos). Por su parte, el modelo KNN mantiene una precisión general aceptable, pero su desempeño depende en mayor medida de la distribución de los datos y del valor de k seleccionado. En términos prácticos, la regresión Firth ofrece mayor estabilidad y capacidad inferencial, mientras que KNN resulta más útil para detección empírica de patrones en escenarios menos estructurados.

resultados_comp <- data.frame(
  Modelo = c("KNN", "LOGIT (Firth)"),
  Accuracy = c(conf_knn$overall["Accuracy"], conf_logit$overall["Accuracy"]),
  Sensitivity = c(conf_knn$byClass["Sensitivity"], conf_logit$byClass["Sensitivity"]),
  Specificity = c(conf_knn$byClass["Specificity"], conf_logit$byClass["Specificity"])
)

# Gráfico comparativo de métricas
resultados_comp %>%
  pivot_longer(cols = -Modelo, names_to = "Metrica", values_to = "Valor") %>%
  ggplot(aes(x = Metrica, y = Valor, fill = Modelo)) +
  geom_col(position = "dodge") +
  geom_text(aes(label = round(Valor, 3)), vjust = -0.25, position = position_dodge(0.9), size = 3.5) +
  labs(title = "Comparación de Desempeño: KNN vs LOGIT (Firth)", x = "Métrica", y = "Valor (Proporción)") +
  theme_minimal()

6. Conclusiones

6.1 Síntesis de hallazgos principales

  • Modelos ajustados: Se implementaron exitosamente dos modelos de clasificación supervisada —K-Nearest Neighbors (KNN) y Regresión Logística de Firth— con el propósito de predecir la probabilidad de haber sido víctima de hurto a personas, utilizando como variables explicativas un conjunto de indicadores derivados de la Encuesta de Convivencia y Seguridad Ciudadana (ECSC) del DANE. Los predictores incluyeron la frecuencia de victimización, la amenaza con arma, la denuncia ante autoridades, el acompañamiento durante el hecho y la recuperacion de las pertenencias.

  • Desempeño de los modelos: Ambos modelos lograron clasificar de manera adecuada los casos positivos y negativos, aunque con diferencias notorias en la estabilidad de los resultados. El modelo de KNN mostró un equilibrio superior entre sensibilidad y especificidad, mientras que el Logit, pese a ofrecer una precisión aceptable, presentó mayor variabilidad

  • Características de la victimización: En el análisis descriptivo, se observó que la mayoría de los hurtos reportados corresponden a una única ocurrencia, aunque existen individuos con más de un evento, lo que sugiere la persistencia de condiciones de vulnerabilidad. Además, se identificó que gran parte de los incidentes ocurren sin compañía y frecuentemente sin denuncia formal, reflejando patrones de exposición y de desconfianza institucional.


6.2 ¿El modelo logró responder al objetivo de investigación?

Sí, los modelos lograron responder al objetivo planteado al identificar patrones relevantes en las variables asociadas al hurto a personas.
El modelo de Firth permitió cuantificar la influencia de cada predictor sobre la probabilidad de victimización, mientras que KNN ofreció una perspectiva empírica de similitud entre casos.
No obstante, la capacidad predictiva general fue moderada, lo cual indica que las variables empleadas explican parcialmente la ocurrencia del delito y que el fenómeno depende también de otros factores sociales, económicos y espaciales no incluidos en el modelo.


6.3 Factores no incluidos que probablemente son más importantes

El comportamiento delictivo y la victimización son fenómenos multifactoriales. En este estudio se reconocen limitaciones derivadas de la información disponible. Existen variables no incluidas que podrían mejorar la explicación del riesgo de hurto, tales como:

  • Factores socioeconómicos: nivel educativo, ingresos del hogar, estrato socioeconómico o tipo de empleo.
  • Factores espaciales y urbanos: localización del suceso, iluminación, presencia de autoridades o densidad peatonal.
  • Factores temporales: hora exacta y día de la semana del hurto, que podrían revelar patrones horarios específicos.
  • Factores psicológicos y sociales: percepción de inseguridad, experiencias previas o hábitos de movilidad.

La ausencia de estos elementos limita la profundidad del análisis, pero sienta una base para futuros estudios que integren fuentes complementarias y enfoques multidimensionales.


6.4 Conclusión final

El presente proyecto permitió aplicar de manera integral las herramientas de aprendizaje supervisado, abordando un problema real de interés público: la victimización por hurto a personas en Colombia. A partir de la información proveniente de la Encuesta de Convivencia y Seguridad Ciudadana (ECSC), se desarrolló un proceso completo que incluyó limpieza, balanceo, modelado y evaluación de los datos, demostrando la utilidad práctica de las herramientas estadísticas y de aprendizaje supervisado en el análisis de fenómenos sociales.

Los resultados obtenidos evidencian la complejidad del fenómeno del hurto. La mayoría de los casos analizados corresponden a una única experiencia de victimización, ocurrida generalmente sin compañía y sin denuncia posterior, lo cual sugiere patrones de vulnerabilidad individual y desconfianza institucional. La baja proporción de denuncias y la limitada recuperación de bienes reflejan brechas entre la ocurrencia del delito y la acción de las autoridades, fenómeno ampliamente documentado en estudios nacionales sobre convivencia y seguridad.

En cuanto al desempeño de los modelos, la Regresión Logística Penalizada de Firth y el K-Nearest Neighbors (KNN) ofrecieron perspectivas complementarias. El modelo de Firth permitió interpretar los efectos de las variables y cuantificar el peso relativo de cada predictor, aunque mostró un rendimiento moderado debido a la naturaleza lineal del método y la limitada información disponible. Por su parte, el KNN presentó una mayor capacidad de clasificación, alcanzando un equilibrio adecuado entre sensibilidad y especificidad. Esto confirma que, ante relaciones no lineales y variables de contexto heterogéneas, los métodos basados en vecindad pueden capturar mejor las estructuras locales de los datos.

Desde una perspectiva técnica, el proceso de preprocesamiento, imputación y balanceo de clases resultó esencial para garantizar la validez de los modelos. Sin estos pasos, los algoritmos habrían tendido a favorecer la clase mayoritaria (“No víctima”), afectando la capacidad de detección de los casos positivos. Asimismo, el uso de métricas complementarias como sensibilidad y especificidad, más allá de la exactitud global, permitió una evaluación más justa y acorde con la naturaleza del fenómeno social analizado.

Finalmente, este ejercicio demuestra que las herramientas de modelado predictivo pueden ser aplicadas con rigor a problemáticas sociales complejas, siempre que se comprendan sus limitaciones y se acompañen de una adecuada interpretación contextual. Los hallazgos sugieren que el comportamiento del hurto no depende exclusivamente de las variables observadas en la encuesta, sino también de factores externos —socioeconómicos, espaciales, culturales y psicológicos— que influyen en la exposición y vulnerabilidad de las personas. Por ello, futuras investigaciones podrían incorporar información geográfica, temporal y sociodemográfica más detallada para mejorar la precisión de los modelos y fortalecer la toma de decisiones en materia de seguridad ciudadana basada en evidencia.


7. Bibliografía

  • Departamento Administrativo Nacional de Estadística – DANE. (2023). Encuesta de Convivencia y Seguridad Ciudadana (ECSC). Bogotá, Colombia: DANE.
    https://microdatos.dane.gov.co/index.php/catalog/777

  • Ministerio de Defensa Nacional. (2024). Balance de criminalidad y seguridad ciudadana en Colombia 2023–2024. Bogotá, Colombia.
    https://www.mindefensa.gov.co

  • Programa de las Naciones Unidas para el Desarrollo – PNUD. (2023). Informe sobre seguridad ciudadana y desarrollo humano en América Latina. Nueva York: Naciones Unidas.
    https://www.undp.org/es

  • Policía Nacional de Colombia. (2023). Estadísticas de seguridad y convivencia ciudadana. Observatorio del Delito, Dirección de Seguridad Ciudadana.
    https://www.policia.gov.co

  • Universidad Nacional de Colombia – Instituto de Estudios Urbanos (2022). Factores territoriales asociados a la victimización por hurto en ciudades colombianas. Bogotá: IEU.