1. Introducción y preguntas de investigación

1.1 Contexto: ¿El mapa de la denuncia o el mapa del miedo?

Bogotá se organiza territorialmente en 112 Unidades de Planeamiento Zonal (UPZ) urbanas distribuidas en 19 localidades. Comprender la inseguridad en la capital exige ir más allá de contar cuántas denuncias se registran en una comisaría o estación de policía: implica observar quién habita cada territorio, cuántas personas viven por kilómetro cuadrado, cómo es el alumbrado y el entorno físico de sus barrios, cuál es la condición socioeconómica de sus hogares y qué tan lejos camina un ciudadano para llegar a un CAI o al transporte público.

En este informe abordamos las 112 UPZ de Bogotá como un sistema urbano completo, articulando los 5 bloques de información disponibles en input/upz_variables.csv y su cartografía oficial en input/shp/:

  1. Identificación y territorio (upz_cod, upz_nombre, localidad, area_km2).
  2. Demografía DANE 2023 (poblacion, densidad_hab_km2, estructura por edades y sexo).
  3. Vivienda (2023) e infraestructura de alumbrado (2021) (personas_por_vivienda, pct_viviendas_desocupadas, luminarias_km2, pct_luminarias_led).
  4. Delitos de alto impacto (enero a julio de 2023) (conteos absolutos casos_* y tasas por cada 10.000 habitantes tasa_* para 10 delitos y su total).
  5. Encuesta Multipropósito DANE 2021 (ingresos, pobreza, estratificación, percepción de inseguridad, factores de deterioro barrial como “ollas” o lotes oscuros, y minutos caminando a 7 equipamientos urbanos).

1.2 Las 8 preguntas transversales de investigación (sobre las 112 UPZ)

Cada una de las 8 preguntas fue diseñada de manera transversal (cruzando múltiples bloques de variables sobre la totalidad de las 112 UPZ) y parte de explicar qué buscamos encontrar en los datos y qué deseamos plasmar en su visualización:

# Pregunta Transversal de Investigación Bloques que Cruza ¿Qué buscamos encontrar en el EDA? ¿Qué deseamos plasmar en la visualización?
P1 ¿Las UPZ con más denuncias totales son las más inseguras por habitante, o solo son las más pobladas? Demografía + Territorio + Delitos Demostrar que tener muchas denuncias totales (casos_total) no equivale a tener una tasa alta (tasa_total): el centro acumula denuncias con pocos residentes y la periferia acumula volumen por su enorme población. Dispersión limpia (poblacion vs. casos_total) con contexto en gris, polos centrales en magenta y grandes UPZ residenciales en turquesa.
P2 ¿En qué zonas de Bogotá se concentra la mayor tasa de hurto a personas y cómo contrasta con los bordes residenciales? Territorio (.shp) + Demografía + Delitos Identificar si el hurto forma un corredor geográfico continuo en el centro-oriente y hacia El Dorado, en contraste con los anillos residenciales más densos. Mapa coroplético por quintiles de tasa_hurto_personas en las 112 UPZ con bordes de las 19 localidades + mapa interactivo leaflet.
P3 ¿La gente se siente más insegura en las UPZ donde más se denuncian hurtos, o el miedo y la denuncia van por separado? Encuesta (Percepción) + Delitos + Territorio Comprobar la paradoja de que en la mayoría de las UPZ la percepción de inseguridad (pct_percibe_inseguridad) y la tasa de denuncia tienen relación inversa (\(\rho = -0,37\)). Plano estratégico de 4 cuadrantes dividido por las medianas de Bogotá (100,6 hurtos/10k y 66% percepción).
P4 ¿Las UPZ con más lotes baldíos u oscuros y menor iluminación pública son aquellas donde los vecinos se sienten más inseguros? Infraestructura (Luminarias) + Entorno + Percepción Evaluar cómo el deterioro físico (pct_cerca_lotes_oscuros) y la baja densidad de alumbrado (luminarias_km2) elevan la percepción de miedo vecinal (\(\rho = +0,33\)). Dispersión con recta de regresión diferenciando en magenta las UPZ con baja densidad de luminarias y en turquesa las de alta cobertura.
P5 ¿Cómo aumenta la tasa de homicidios en las UPZ a medida que crece la cercanía de las viviendas a expendios de droga (“ollas”)? Entorno (Encuesta) + Delitos Letales + Territorio Medir cuánto se multiplica la mediana de tasa_homicidios al pasar del cuartil más bajo al cuartil más alto de cercanía a “ollas” (pct_cerca_ollas, \(\rho = +0,53\)). Gráfico de cajas por cuartiles de cercanía a “ollas” unidos por la línea magenta de sus medianas (escalera de riesgo letal).
P6 ¿Cambia el tipo de delito que más se denuncia según el estrato socioeconómico de la UPZ? Socioeconómico (Estrato/Salario/Pobreza) + 7 Delitos Demostrar que el delito no desaparece con el ingreso, sino que cambia de naturaleza: hurto patrimonial en estratos medio/alto vs. violencia intrafamiliar y lesiones en estrato bajo. Gráfico de mancuerna (dumbbell) comparando las tasas medianas de 7 delitos entre Estrato Bajo (magenta), Medio (morado) y Alto (turquesa).
P7 ¿Cómo se relacionan la edad de la población y el tamaño del hogar con la violencia intrafamiliar y el hurto a residencias? Demografía (Edad) + Vivienda + Delitos en el Hogar Contrastar cómo las UPZ con más niños (pct_0_14) sufren más violencia intrafamiliar (\(\rho = +0,46\)), mientras las UPZ con más adultos mayores (pct_60_mas) sufren más hurto a residencias (\(\rho = +0,43\)). Dos paneles comparativos lado a lado (magenta para niñez vs. violencia intrafamiliar; turquesa para vejez vs. robo de viviendas).
P8 ¿Qué tan lejos queda a pie un CAI de policía y otros servicios básicos en las 112 UPZ según su estrato? Accesibilidad (min_*) + Socioeconómico + Delitos Evaluar el cumplimiento del umbral de 15 minutos caminando en los 7 equipamientos y medir la brecha de acceso a un CAI policial y a salud/cultura en contra del Estrato Bajo. Gráfico de brecha de tiempos de caminata por estrato frente a la meta urbana de 15 minutos a pie.

1.3 Selección y justificación de variables (24 variables clave de los 5 bloques)

Aunque nuestra exploración inicial audita las 67 columnas, seleccionamos 24 variables transversales de los 5 bloques (superando ampliamente el mínimo exigido de 10 variables de 3 bloques) porque capturan de forma completa el denominador demográfico, la infraestructura física, la vulnerabilidad socioeconómica, el entorno de riesgo, la accesibilidad institucional y las distintas modalidades del delito:


2. Los datos y su exploración: Explorar todo primero (EDA)

2.1 Carga reproducible, estructura e integridad de las 112 UPZ

Cargamos los datos utilizando exclusivamente rutas relativas a la raíz del proyecto (input/...) y unimos la tabla de atributos con los polígonos de las 112 UPZ mediante la llave upz_cod:

Tabla 1. Auditoría técnica de estructura, integridad y calidad de los datos.
Indicador Valor
Filas (UPZ urbanas en tabla CSV) 112
Columnas originales en upz_variables.csv 67
Polígonos en upz_bogota.shp (EPSG:4326) 112
Polígonos en localidades_bogota.shp 19
Total de valores faltantes (NA) en toda la tabla 0
Códigos de UPZ duplicados 0
UPZ con población residente < 5.000 hab 8
UPZ con encuesta agrupada (em_agrupada == TRUE) 32

Para comprender la estructura de las 67 variables originales, las clasificamos según su bloque temático y su naturaleza matemática (tasas por 10.000 hab, conteos absolutos, porcentajes de 0 a 100%, tiempos en minutos, magnitudes continuas e identificadores):

catalogo_67_vars <- tibble(
  variable = names(read_csv("input/upz_variables.csv", show_col_types = FALSE))
) %>%
  mutate(
    bloque = case_when(
      variable %in% c("upz_cod", "upz_nombre", "localidad_cod", "localidad", "area_km2") ~
        "1. Identificación y territorio (5)",
      variable %in% c("poblacion", "densidad_hab_km2", "pct_mujeres", "pct_0_14", "pct_15_29", "pct_60_mas") ~
        "2. Demografía DANE 2023 (6)",
      variable %in% c("viviendas_totales", "viviendas_ocupadas", "pct_viviendas_desocupadas",
                      "personas_por_vivienda", "luminarias", "luminarias_km2",
                      "luminarias_1000hab", "pct_luminarias_led") ~
        "3. Vivienda e infraestructura (8)",
      str_starts(variable, "casos_|tasa_") ~
        "4. Delitos alto impacto 2023 (22)",
      TRUE ~
        "5. Encuesta Multipropósito 2021 (26)"
    ),
    naturaleza_variable = case_when(
      variable %in% c("upz_cod", "upz_nombre", "localidad_cod", "localidad") ~ "Identificador / Categórica nominal",
      variable == "em_agrupada" ~ "Binaria / Lógica (TRUE/FALSE)",
      str_starts(variable, "pct_") ~ "Porcentaje / Proporción (0 a 100%)",
      str_starts(variable, "tasa_") ~ "Tasa relativa (casos por 10.000 hab)",
      str_starts(variable, "casos_") ~ "Conteo absoluto de denuncias (entero)",
      str_starts(variable, "min_") ~ "Tiempo de acceso caminando (minutos)",
      TRUE ~ "Magnitud continua (hab, km², $, años, lum)"
    )
  )

resumen_arquitectura <- catalogo_67_vars %>%
  count(bloque, naturaleza_variable, name = "n_vars") %>%
  mutate(bloque = fct_rev(bloque))

ggplot(resumen_arquitectura, aes(x = bloque, y = n_vars, fill = naturaleza_variable)) +
  geom_col(width = 0.65, color = "white", linewidth = 0.4) +
  geom_text(
    aes(label = n_vars),
    position = position_stack(vjust = 0.5),
    color = "white", fontface = "bold", size = 3.6
  ) +
  coord_flip() +
  scale_fill_manual(
    values = c(
      "Porcentaje / Proporción (0 a 100%)"         = morado,
      "Tasa relativa (casos por 10.000 hab)"       = magenta,
      "Conteo absoluto de denuncias (entero)"      = "#8C2D65",
      "Magnitud continua (hab, km², $, años, lum)" = turquesa,
      "Tiempo de acceso caminando (minutos)"       = "#3FA7A1",
      "Identificador / Categórica nominal"         = "grey55",
      "Binaria / Lógica (TRUE/FALSE)"              = "#9E98A8"
    )
  ) +
  scale_y_continuous(breaks = seq(0, 26, 4), expand = expansion(mult = c(0, 0.08))) +
  labs(
    title = "El 72% del dataset se concentra en Delitos (22) y Encuesta Multipropósito (26), predominando tasas y porcentajes",
    subtitle = "Arquitectura de las 67 variables de upz_variables.csv según bloque temático y escala matemática de medición (0 valores faltantes)",
    x = NULL,
    y = "Número de variables en la tabla",
    fill = "Naturaleza y unidad de la variable:",
    caption = "Fuente: Elaboración propia a partir de upz_variables.csv y diccionario_datos.md (112 UPZ × 67 columnas)."
  ) +
  tema_clase +
  theme(legend.position = "bottom", panel.grid.major.y = element_blank()) +
  guides(fill = guide_legend(nrow = 3))


2.2 La población por UPZ y el “Efecto Denominador” en las tasas

El enunciado del taller advierte una regla de oro: “Miren especialmente la población por UPZ antes de confiar en cualquier tasa”. Todas las tasas delictivas están definidas como:

\[\text{Tasa por 10.000 hab} = \frac{\text{Casos denunciados}}{\text{Población residente proyectada}} \times 10.000\]

En las 112 UPZ de Bogotá viven 7.936.532 personas, con una mediana de 54.102 habitantes y una media de 70.862 habitantes (\(\text{DE} = 58.406\), \(\text{IQR} = 70.890\)). Sin embargo, existen 8 UPZ con menos de 5.000 residentes (y 11 con menos de 10.000) que corresponden a parques metropolitanos, zonas industriales, bordes rurales o el aeropuerto:

Tabla 2. Las 11 UPZ con menos de 10.000 habitantes residentes y el impacto del denominador sobre su tasa delictiva.
Código Nombre de la UPZ Localidad Población (hab) Densidad (hab/km²) Casos Totales Tasa Total (/10k hab) Encuesta Agrupada
63 El Mochuelo Ciudad Bolívar 30 9 34 11.333 Sí (Grupo)
117 Aeropuerto El Dorado Fontibón 883 118 545 6.172 Sí (Grupo)
60 Parque Entrenubes Usme 1.169 278 16 137 Sí (Grupo)
103 Parque Salitre Barrios Unidos 1.442 870 233 1.616 Sí (Grupo)
1 Paseo De Los Libertadores Usaquén 2.690 425 74 275 Sí (Grupo)
3 Guaymaral Suba 2.692 591 45 167 Sí (Grupo)
105 Jardin Botanico Engativá 2.900 1.787 266 917 Sí (Grupo)
104 Parque Simon Bolivar - Can Teusaquillo 3.323 830 958 2.883 Sí (Grupo)
2 La Academia Suba 5.260 780 123 234 Sí (Grupo)
64 Monte Blanco Ciudad Bolívar 6.575 942 80 122 Sí (Grupo)
108 Zona Industrial Puente Aranda 6.666 1.914 1.573 2.360 Sí (Grupo)

Para visualizar con total claridad cómo el denominador poblacional transforma la lectura de la ciudad sin saturar de líneas cruzadas, comparamos en dos paneles horizontales sincronizados (una fila por UPZ) el volumen real de denuncias (casos_total) frente a la tasa calculada por 10.000 habitantes (tasa_total), contrastando las 6 UPZ de baja población (< 5.000 hab, en magenta) frente a las 6 UPZ residenciales más pobladas de Bogotá (> 165.000 hab, en turquesa):

ranking_comparativo <- upz %>%
  mutate(
    rank_casos = min_rank(desc(casos_total)),
    rank_tasa  = min_rank(desc(tasa_total))
  )

seleccion_eda2 <- ranking_comparativo %>%
  filter(
    upz_nombre %in% c(
      # 6 UPZ con < 5.000 hab donde la tasa se dispara artificialmente
      "El Mochuelo", "Aeropuerto El Dorado", "Parque Simon Bolivar - Can",
      "Parque Salitre", "Jardin Botanico", "Paseo De Los Libertadores",
      # 6 UPZ residenciales masivas (> 165.000 hab) donde la tasa se diluye
      "Tibabuyes", "El Rincon", "Bosa Central",
      "Bosa Occidental", "Suba", "Garces Navas"
    )
  ) %>%
  mutate(
    grupo = if_else(
      poblacion < 5000,
      "UPZ con baja población (< 5.000 hab): Pocos casos reales, pero tasa disparada",
      "UPZ megapobladas (> 165.000 hab): Miles de casos reales, pero tasa diluida"
    ),
    etiqueta_upz = paste0(
      upz_nombre, " (", comma(poblacion, big.mark = ".", decimal.mark = ","), " hab)"
    )
  )

orden_upz_eda2 <- seleccion_eda2 %>%
  arrange(desc(grupo), tasa_total) %>%
  pull(etiqueta_upz)

datos_eda2_largo <- seleccion_eda2 %>%
  select(etiqueta_upz, grupo, casos_total, rank_casos, tasa_total, rank_tasa) %>%
  pivot_longer(
    cols = c(casos_total, tasa_total),
    names_to = "metrica",
    values_to = "valor"
  ) %>%
  mutate(
    etiqueta_upz = factor(etiqueta_upz, levels = orden_upz_eda2),
    panel = if_else(
      metrica == "casos_total",
      "A. Volumen real: Total de denuncias (casos_total)",
      "B. Espejismo relativo: Tasa por 10.000 hab (tasa_total)"
    ),
    texto_barra = if_else(
      metrica == "casos_total",
      paste0(comma(round(valor), big.mark = ".", decimal.mark = ","), " casos (#", rank_casos, ")"),
      paste0(comma(round(valor), big.mark = ".", decimal.mark = ","), " / 10k (#", rank_tasa, ")")
    ),
    limite_max = if_else(metrica == "casos_total", 5600, 15500)
  )

ggplot(datos_eda2_largo, aes(x = valor, y = etiqueta_upz, fill = grupo)) +
  geom_col(width = 0.65, alpha = 0.92) +
  geom_blank(aes(x = limite_max)) +
  geom_hline(yintercept = 6.5, color = "grey55", linetype = "dashed", linewidth = 0.7) +
  geom_text(
    aes(label = texto_barra, color = grupo),
    hjust = -0.08, size = 3.2, fontface = "bold", show.legend = FALSE
  ) +
  facet_wrap(~panel, scales = "free_x") +
  scale_fill_manual(
    values = c(
      "UPZ con baja población (< 5.000 hab): Pocos casos reales, pero tasa disparada" = magenta,
      "UPZ megapobladas (> 165.000 hab): Miles de casos reales, pero tasa diluida"    = turquesa
    )
  ) +
  scale_color_manual(
    values = c(
      "UPZ con baja población (< 5.000 hab): Pocos casos reales, pero tasa disparada" = magenta,
      "UPZ megapobladas (> 165.000 hab): Miles de casos reales, pero tasa diluida"    = turquesa
    )
  ) +
  scale_x_continuous(
    labels = label_comma(big.mark = ".", decimal.mark = ","),
    expand = expansion(mult = c(0, 0.05))
  ) +
  labs(
    title = "El espejismo del denominador: 34 casos en El Mochuelo generan una tasa 88 veces mayor que 3.812 casos en El Rincón",
    subtitle = "Comparación directa entre denuncias reales (izquierda) y tasa por 10.000 habitantes (derecha) según población residente",
    x = NULL,
    y = NULL,
    fill = "Comportamiento según denominador poblacional:",
    caption = "Fuente: Elaboración propia sobre las 112 UPZ (upz_variables.csv). Entre paréntesis (#) se muestra el puesto en el ranking de Bogotá."
  ) +
  tema_clase +
  theme(
    legend.position = "top",
    legend.direction = "vertical",
    panel.grid.major.y = element_blank(),
    axis.text.y = element_text(face = "bold", color = "grey20", size = 9.5)
  )

Decisión metodológica sobre las UPZ de baja población y el análisis de las 112 UPZ: En lugar de eliminar arbitrariamente filas del estudio, mantenemos las 112 UPZ en todas las preguntas para conservar la visión completa de la ciudad, pero aplicamos tres salvaguardas estadísticas esenciales: 1. Usamos mediana y rango intercuartílico (IQR) como medidas centrales de referencia (ya que en tasa_total la media es 504, arrastrada por El Mochuelo con 11.333 y El Dorado con 6.172, mientras la mediana de las 112 UPZ es 193,1). 2. Empleamos el coeficiente de correlación de rangos de Spearman (\(\rho\)) y escalas por quintiles / logarítmicas para que los 8 valores extremos de baja población no aplasten las escalas visuales ni distorsionen las pendientes. 3. Distinguimos explícitamente entre nodos de población flotante (centro, aeropuerto, parques) y zonas residenciales.


2.3 Distribución de las variables, rangos, medidas descriptivas y auditoría espacial

A continuación examinamos la distribución y asimetría de las 10 tasas de delitos en las 112 UPZ (resumiendo las 112 UPZ mediante cajas intercuartílicas limpias y resaltando únicamente los puntos de las 8 UPZ con menos de 5.000 habitantes junto con el rombo dorado de la Media aritmética para evidenciar el efecto de arrastre):

nombres_delitos <- c(
  hurto_personas          = "Hurto a personas",
  hurto_celulares         = "Hurto de celulares",
  violencia_intrafamiliar = "Violencia intrafamiliar",
  lesiones                = "Lesiones personales",
  hurto_comercio          = "Hurto a comercio",
  hurto_residencias       = "Hurto a residencias",
  hurto_bicicletas        = "Hurto de bicicletas",
  hurto_motos             = "Hurto de motocicletas",
  hurto_automotor         = "Hurto de automotores",
  homicidios              = "Homicidios"
)

tasas_10_largo <- upz %>%
  select(upz_cod, upz_nombre, poblacion, starts_with("tasa_"), -tasa_total) %>%
  pivot_longer(
    starts_with("tasa_"),
    names_to = "delito",
    values_to = "tasa",
    names_prefix = "tasa_"
  ) %>%
  mutate(
    delito_label = recode(delito, !!!nombres_delitos),
    grupo_pob = if_else(
      poblacion < 5000,
      "UPZ con < 5.000 hab (n = 8)",
      "UPZ con >= 5.000 hab (n = 104)"
    )
  )

resumen_10_delitos <- tasas_10_largo %>%
  group_by(delito_label) %>%
  summarise(
    mediana = median(tasa),
    media   = mean(tasa),
    q1      = quantile(tasa, 0.25),
    q3      = quantile(tasa, 0.75),
    iqr     = IQR(tasa),
    maximo  = max(tasa),
    razon_media_mediana = round(media / mediana, 2),
    .groups = "drop"
  ) %>%
  arrange(desc(mediana))

orden_delitos <- resumen_10_delitos %>% arrange(mediana) %>% pull(delito_label)
tasas_10_largo <- tasas_10_largo %>% mutate(delito_label = factor(delito_label, levels = orden_delitos))
resumen_10_delitos <- resumen_10_delitos %>% mutate(delito_label = factor(delito_label, levels = orden_delitos))

ggplot(tasas_10_largo, aes(y = delito_label, x = tasa)) +
  geom_hline(aes(yintercept = delito_label), color = "grey92", linewidth = 0.5) +
  geom_boxplot(
    width = 0.45,
    fill = "white",
    color = morado,
    outlier.shape = NA,
    linewidth = 0.55
  ) +
  geom_jitter(
    data = tasas_10_largo %>% filter(grupo_pob == "UPZ con < 5.000 hab (n = 8)"),
    aes(color = "UPZ < 5.000 hab (generan efecto arrastre)"),
    width = 0,
    height = 0.14,
    size = 2.4,
    alpha = 0.85
  ) +
  geom_point(
    data = resumen_10_delitos,
    aes(y = delito_label, x = media, shape = "Media aritmética de las 112 UPZ"),
    color = morado,
    fill = "#FFB800",
    size = 3.2,
    stroke = 0.85
  ) +
  geom_text(
    data = resumen_10_delitos,
    aes(
      y = delito_label,
      x = 180000,
      label = paste0(
        "Med: ", comma(round(mediana, 1), decimal.mark = "."),
        " | Media: ", comma(round(media, 1), decimal.mark = "."),
        " (", razon_media_mediana, "x)"
      )
    ),
    hjust = 1,
    size = 2.95,
    color = "grey20",
    fontface = "bold"
  ) +
  annotate(
    "text", y = 10.45, x = 180000,
    label = "Mediana | Media (Efecto arrastre)",
    hjust = 1, fontface = "bold.italic", size = 3, color = morado
  ) +
  scale_color_manual(
    name = NULL,
    values = c("UPZ < 5.000 hab (generan efecto arrastre)" = magenta)
  ) +
  scale_shape_manual(
    name = NULL,
    values = c("Media aritmética de las 112 UPZ" = 23)
  ) +
  scale_x_continuous(
    trans = "log1p",
    breaks = c(0, 1, 5, 20, 100, 500, 2500, 8000),
    limits = c(0, 200000),
    labels = label_comma(big.mark = ",", decimal.mark = ".")
  ) +
  coord_cartesian(clip = "off") +
  labs(
    title = "Asimetría derecha en los 10 delitos: la media triplica a la mediana por el arrastre de valores extremos",
    subtitle = "La caja (IQR) resume las 112 UPZ; los puntos evidencian cómo las UPZ con baja población disparan la media (rombo dorado)",
    x = "Tasa de denuncias por cada 10.000 habitantes (escala log1p)",
    y = NULL,
    caption = "Fuente: Secretaría de Seguridad (ene-jul 2023). La cifra entre paréntesis (x) indica cuántas veces la Media supera a la Mediana."
  ) +
  tema_clase +
  theme(
    legend.position = "top",
    legend.box = "horizontal",
    panel.grid.major.y = element_blank(),
    panel.grid.minor = element_blank(),
    plot.margin = margin(t = 10, r = 15, b = 10, l = 15)
  ) +
  guides(
    color = guide_legend(order = 1),
    shape = guide_legend(order = 2)
  )

Para comparar la distribución de las variables de todos los bloques temáticos a pesar de que están medidas en unidades distintas (pesos, habitantes, luminarias/km², minutos y porcentajes), estandarizamos el rango de cada variable entre 0% (su valor mínimo en las 112 UPZ) y 100% (su valor máximo), graficando la banda del 50% central de los datos (Q1 a Q3), la Mediana y la Media:

vars_multibloque <- tribble(
  ~variable,                       ~etiqueta,                                           ~unidad,
  "poblacion",                     "Demografía · Población residente",                  "hab",
  "densidad_hab_km2",              "Demografía · Densidad poblacional",                 "hab/km²",
  "personas_por_vivienda",         "Vivienda · Personas por vivienda",                  "pers/viv",
  "luminarias_km2",                "Infraestructura · Densidad de luminarias",          "lum/km²",
  "pct_luminarias_led",            "Infraestructura · Modernización LED",               "%",
  "tasa_hurto_personas",           "Delitos · Tasa hurto a personas",                   "/10k hab",
  "tasa_violencia_intrafamiliar",  "Delitos · Tasa violencia intrafamiliar",            "/10k hab",
  "tasa_homicidios",               "Delitos · Tasa de homicidios",                      "/10k hab",
  "salario_promedio",              "Socioeconómico · Salario mensual promedio",         "COP",
  "pct_pobreza",                   "Socioeconómico · Pobreza monetaria",                "%",
  "pct_percibe_inseguridad",       "Percepción · Percibe inseguridad en entorno",       "%",
  "pct_cerca_ollas",               "Entorno · Viviendas cerca de 'ollas'",              "%",
  "pct_cerca_lotes_oscuros",       "Entorno · Viviendas cerca de lotes oscuros",        "%",
  "min_cai_policia",               "Accesibilidad · Caminata a CAI policial",           "min"
)

formatear_valor <- function(x, unidad) {
  case_when(
    unidad == "COP"      ~ paste0("$", comma(round(x / 1e6, 2), big.mark = ".", decimal.mark = ","), "M"),
    unidad == "hab"      ~ comma(round(x), big.mark = ".", decimal.mark = ","),
    unidad == "hab/km²"  ~ comma(round(x), big.mark = ".", decimal.mark = ","),
    unidad == "lum/km²"  ~ comma(round(x), big.mark = ".", decimal.mark = ","),
    unidad == "%"        ~ paste0(round(x, 1), "%"),
    TRUE                 ~ as.character(round(x, 1))
  )
}

resumen_normalizado <- upz %>%
  select(all_of(vars_multibloque$variable)) %>%
  pivot_longer(everything(), names_to = "variable", values_to = "valor") %>%
  group_by(variable) %>%
  summarise(
    min_real  = min(valor),
    q1_real   = quantile(valor, 0.25),
    med_real  = median(valor),
    mean_real = mean(valor),
    q3_real   = quantile(valor, 0.75),
    max_real  = max(valor),
    sd_real   = sd(valor),
    iqr_real  = IQR(valor),
    q1_norm   = (q1_real - min_real) / (max_real - min_real) * 100,
    med_norm  = (med_real - min_real) / (max_real - min_real) * 100,
    mean_norm = (mean_real - min_real) / (max_real - min_real) * 100,
    q3_norm   = (q3_real - min_real) / (max_real - min_real) * 100,
    .groups = "drop"
  ) %>%
  left_join(vars_multibloque, by = "variable") %>%
  mutate(
    etiqueta = factor(etiqueta, levels = rev(vars_multibloque$etiqueta)),
    txt_min  = formatear_valor(min_real, unidad),
    txt_med  = formatear_valor(med_real, unidad),
    txt_max  = formatear_valor(max_real, unidad)
  )

ggplot(resumen_normalizado, aes(y = etiqueta)) +
  geom_segment(aes(x = 0, xend = 100, yend = etiqueta), color = gris, linewidth = 1.2) +
  geom_segment(aes(x = q1_norm, xend = q3_norm, yend = etiqueta), color = turquesa, linewidth = 5.5, alpha = 0.55) +
  geom_point(aes(x = med_norm, color = "Mediana (50% de las UPZ)"), size = 3.6) +
  geom_point(aes(x = mean_norm, color = "Media aritmética"), shape = 18, size = 4.2) +
  geom_text(aes(x = -2, label = txt_min), hjust = 1, size = 2.9, color = "grey40") +
  geom_text(aes(x = 102, label = txt_max), hjust = 0, size = 2.9, color = "grey40") +
  geom_text(aes(x = med_norm, label = txt_med), vjust = -1.1, size = 2.85, color = morado, fontface = "bold") +
  scale_x_continuous(
    limits = c(-16, 116),
    breaks = c(0, 25, 50, 75, 100),
    labels = c("0%\n(Mínimo)", "25%", "50%\n(Mitad del rango)", "75%", "100%\n(Máximo)")
  ) +
  scale_color_manual(values = c("Mediana (50% de las UPZ)" = morado, "Media aritmética" = magenta)) +
  labs(
    title = "Mientras la densidad y las personas por hogar son simétricas, los delitos e ingresos se comprimen abajo del 25% del rango",
    subtitle = "Posición relativa de Q1-Q3 (barra turquesa), Mediana (círculo morado) y Media (rombo magenta) dentro del rango [Mín - Máx] de las 112 UPZ",
    x = "Posición relativa dentro del rango observado de cada variable (0% = Mínimo de las 112 UPZ, 100% = Máximo)",
    y = NULL,
    color = "Medida de tendencia central:",
    caption = "Fuente: Elaboración propia sobre las 112 UPZ. Los textos en los extremos muestran el Mínimo y Máximo real; el texto central muestra la Mediana."
  ) +
  tema_clase +
  theme(legend.position = "top", panel.grid.major.y = element_blank())

En la Tabla 3 presentamos el resumen estadístico completo de las 24 variables transversales seleccionadas en las 112 UPZ (Mínimo, Q1, Mediana, Media, Q3, Máximo, IQR y Desviación Estándar):

Tabla 3. Estadísticos descriptivos univariados de las 24 variables seleccionadas en las 112 UPZ de Bogotá.
Variable Mínimo Q1 (25%) Mediana Media Q3 (75%) Máximo IQR Desv. Est.
area_km2 0,9 2,3 3,5 3,7 4,6 9,3 2,3 1,7
poblacion 30,0 30.081,8 54.102,5 70.861,9 100.972,2 305.907,0 70.890,5 58.406,4
densidad_hab_km2 9,4 11.160,4 20.180,2 19.119,4 25.826,5 46.156,9 14.666,1 10.801,9
pct_0_14 7,4 14,0 16,7 17,3 20,7 31,0 6,7 4,8
pct_60_mas 7,5 11,8 14,6 15,7 19,2 29,9 7,4 5,1
personas_por_vivienda 1,7 2,6 2,8 2,8 3,0 5,8 0,4 0,5
luminarias_km2 18,3 644,3 1.000,0 908,5 1.182,6 1.751,4 538,2 406,9
pct_luminarias_led 0,0 9,8 49,3 42,6 71,3 95,8 61,5 31,7
casos_total 16,0 779,5 1.222,0 1.453,9 1.961,5 5.441,0 1.182,0 1.023,1
tasa_total 64,5 129,5 192,5 503,6 287,6 11.333,3 158,1 1.263,4
tasa_hurto_personas 15,7 55,4 100,6 292,2 167,4 6.333,3 111,9 762,3
tasa_hurto_celulares 7,3 19,3 35,1 104,5 61,8 2.666,7 42,5 282,8
tasa_hurto_comercio 0,9 4,0 7,4 26,0 15,6 1.333,3 11,6 126,2
tasa_hurto_residencias 0,0 3,5 6,0 6,7 8,8 26,3 5,3 4,5
tasa_hurto_bicicletas 0,0 2,9 5,8 14,5 9,4 333,3 6,5 40,6
tasa_violencia_intrafamiliar 0,0 11,9 17,6 23,7 24,2 232,1 12,3 31,0
tasa_lesiones 3,7 8,3 12,2 23,6 16,7 333,3 8,4 42,6
tasa_homicidios 0,0 0,2 0,6 0,9 1,1 6,9 0,9 1,3
salario_promedio 845.688,4 1.227.872,2 1.866.476,1 2.580.110,8 3.689.024,5 7.977.532,5 2.461.152,3 1.735.971,9
pct_pobreza 0,1 1,0 2,6 4,0 5,8 16,6 4,8 3,9
pct_percibe_inseguridad 17,4 44,8 66,0 60,8 74,3 92,1 29,6 18,9
pct_cerca_ollas 0,3 9,1 20,6 21,6 31,1 75,6 22,1 15,8
pct_cerca_lotes_oscuros 0,6 11,7 18,2 20,0 26,0 59,8 14,3 12,6
min_cai_policia 10,1 15,4 17,6 18,4 20,8 35,1 5,5 4,6

Asimismo, mapeamos las dos condiciones metodológicas del dataset sobre los 112 polígonos de la ciudad: dónde se ubican las 8 UPZ con población menor a 5.000 habitantes y dónde están las UPZ con encuesta agrupada (em_agrupada == TRUE):

mapa_upz_diag <- mapa_upz %>%
  mutate(
    regimen_metodologico = case_when(
      poblacion < 5000 ~ "1. Baja población (< 5.000 hab, 8 UPZ): Tasa distorsionada",
      em_agrupada      ~ "2. Encuesta agrupada (em_agrupada = TRUE, 25 UPZ >= 5k hab)",
      TRUE             ~ "3. UPZ residencial con muestra propia (79 UPZ)"
    )
  )

centroides_baja_pob <- suppressWarnings(
  mapa_upz_diag %>%
    filter(poblacion < 5000) %>%
    st_point_on_surface()
) %>%
  mutate(
    coords = st_coordinates(geometry),
    lon = coords[, 1],
    lat = coords[, 2],
    etiqueta_mapa = paste0(upz_nombre, "\n(", comma(poblacion, big.mark = ".", decimal.mark = ","), " hab)")
  )

ggplot() +
  geom_sf(data = mapa_upz_diag, aes(fill = regimen_metodologico), color = "white", linewidth = 0.2) +
  geom_sf(data = loc_shp, fill = NA, color = morado, linewidth = 0.45) +
  geom_label_repel(
    data = centroides_baja_pob,
    aes(x = lon, y = lat, label = etiqueta_mapa),
    size = 2.7, fontface = "bold", color = morado, fill = "white",
    box.padding = 0.35, label.padding = 0.18, max.overlaps = 20,
    segment.color = magenta, segment.size = 0.5
  ) +
  scale_fill_manual(
    values = c(
      "1. Baja población (< 5.000 hab, 8 UPZ): Tasa distorsionada" = magenta,
      "2. Encuesta agrupada (em_agrupada = TRUE, 25 UPZ >= 5k hab)" = turquesa,
      "3. UPZ residencial con muestra propia (79 UPZ)"             = lila_claro
    )
  ) +
  labs(
    title = "Auditoría espacial: las 8 UPZ de baja población\ny las 25 UPZ con encuesta agrupada",
    subtitle = "Clasificación de los 112 polígonos según denominador poblacional\ny condición muestral (em_agrupada)",
    fill = "Condición metodológica de la UPZ:",
    caption = "Fuente: Cartografía upz_bogota.shp y localidades_bogota.shp unida con upz_variables.csv (n = 112 UPZ)."
  ) +
  theme_void(base_size = 12) +
  theme(
    plot.title.position = "plot",
    plot.title = element_text(face = "bold", size = 13.5, color = morado, hjust = 0.5),
    plot.subtitle = element_text(size = 10, color = "grey30", hjust = 0.5, margin = margin(b = 8)),
    plot.caption = element_text(hjust = 0.5, color = "grey45", size = 8.5, margin = margin(t = 8)),
    legend.position = "bottom",
    legend.direction = "vertical",
    legend.title = element_text(face = "bold", size = 9.5, color = morado),
    plot.margin = margin(10, 20, 10, 20)
  )


2.4 Estructura de correlaciones transversales (Spearman en las 112 UPZ)

Finalmente, antes de pasar al análisis pregunta por pregunta, calculamos y visualizamos la matriz de correlaciones de rangos de Spearman (\(\rho\)) cruzando 15 indicadores representativos de los 5 bloques sobre las 112 UPZ:

vars_corr <- c(
  "poblacion", "densidad_hab_km2", "personas_por_vivienda", "luminarias_km2",
  "salario_promedio", "pct_pobreza", "pct_percibe_inseguridad",
  "pct_cerca_ollas", "pct_cerca_lotes_oscuros", "min_cai_policia",
  "tasa_hurto_personas", "tasa_hurto_residencias",
  "tasa_violencia_intrafamiliar", "tasa_lesiones", "tasa_homicidios"
)

etiquetas_corr <- c(
  poblacion                    = "1. Población total",
  densidad_hab_km2             = "2. Densidad (hab/km²)",
  personas_por_vivienda        = "3. Personas / vivienda",
  luminarias_km2               = "4. Luminarias / km²",
  salario_promedio             = "5. Salario promedio",
  pct_pobreza                  = "6. % Pobreza",
  pct_percibe_inseguridad      = "7. % Percibe inseguridad",
  pct_cerca_ollas              = "8. % Cerca a 'ollas'",
  pct_cerca_lotes_oscuros      = "9. % Lotes oscuros",
  min_cai_policia              = "10. Minutos a CAI",
  tasa_hurto_personas          = "11. Tasa hurto personas",
  tasa_hurto_residencias       = "12. Tasa hurto residencias",
  tasa_violencia_intrafamiliar = "13. Tasa viol. intrafamiliar",
  tasa_lesiones                = "14. Tasa lesiones",
  tasa_homicidios              = "15. Tasa homicidios"
)

mat_spearman <- cor(upz %>% select(all_of(vars_corr)), method = "spearman")

corr_largo <- as_tibble(mat_spearman, rownames = "var1") %>%
  pivot_longer(-var1, names_to = "var2", values_to = "rho") %>%
  mutate(
    var1_label = factor(recode(var1, !!!etiquetas_corr), levels = unname(etiquetas_corr)),
    var2_label = factor(recode(var2, !!!etiquetas_corr), levels = rev(unname(etiquetas_corr))),
    color_texto = if_else(abs(rho) > 0.48, "white", "grey15")
  )

ggplot(corr_largo, aes(x = var1_label, y = var2_label, fill = rho)) +
  geom_tile(color = "white", linewidth = 0.5) +
  geom_text(aes(label = sprintf("%.2f", rho), color = color_texto), size = 2.75, fontface = "bold") +
  scale_color_identity() +
  scale_fill_gradient2(
    low = turquesa, mid = "white", high = magenta, midpoint = 0,
    limits = c(-1, 1), name = "Spearman (rho)"
  ) +
  labs(
    title = "Dos regímenes delictivos en las 112 UPZ: el ingreso se asocia al hurto patrimonial (+0,66) y la pobreza a la violencia (+0,65)",
    subtitle = "Matriz de correlación de rangos de Spearman (rho) cruzando variables de los 5 bloques sobre las 112 UPZ de Bogotá",
    x = NULL,
    y = NULL,
    caption = "Fuente: Elaboración propia sobre las 112 UPZ (upz_variables.csv). Spearman captura relaciones monótonas sin distorsión por valores extremos."
  ) +
  tema_clase +
  theme(
    axis.text.x = element_text(angle = 38, hjust = 1, size = 8.8, face = "bold"),
    axis.text.y = element_text(size = 8.8, face = "bold"),
    panel.grid = element_blank()
  )


3. Análisis estadístico y visual por pregunta

3.1 Tabla resumen por estrato predominante y Ranking Top 10 de UPZ

Antes de desglosar cada pregunta, presentamos la Tabla Resumen comparativa de las 112 UPZ según su estrato socioeconómico predominante (Tabla 4) y el Ranking Top 10 de las UPZ con mayor carga de denuncias en Bogotá (Tabla 5):

Tabla 4. Tabla resumen comparativa de las 112 UPZ agrupadas según su estrato socioeconómico predominante (valores medianos).
Estrato Predominante N° UPZ Población Total Salario Mediano ($) Pobreza Mediana (%) Percepción Inseg. (%) Hurto Personas (/10k) Hurto Residencias (/10k) Viol. Intrafam. (/10k) Homicidios (/10k) Cerca a Ollas (%) Minutos a CAI
Estrato Bajo (1 y 2) 44 3.969.369 $1.163.751 6.8% 74.4% 50.5 3.5 22.5 0.97 31.7% 18.8
Estrato Medio (3 y 4) 57 3.372.828 $2.612.241 1.4% 60.4% 153.4 7.3 16.0 0.40 15.3% 17.2
Estrato Alto (5 y 6) 11 594.335 $5.907.659 0.4% 33% 147.1 9.2 9.4 0.00 1.7% 14.7
Tabla 5. Ranking Top 10 de las UPZ con mayor número total de denuncias en Bogotá (enero a julio de 2023).
Puesto Código UPZ Localidad Población Denuncias Totales Tasa Total (/10k) Tasa Hurto Pers. (/10k) Percepción Inseg. Salario Promedio
1 102 La Sabana Los Mártires 38.856 5.441 1.400 852,1 83.4% $1.914.420
2 97 Chico Lago Chapinero 38.608 4.985 1.291 841,8 21.5% $7.977.532
3 93 Las Nieves Santa Fe 17.203 4.033 2.344 1.487,5 59.9% $4.390.281
4 28 El Rincon Suba 295.322 3.812 129 58,0 78.6% $1.296.491
5 98 Los Alcazares Barrios Unidos 44.678 3.495 782 466,9 69.8% $2.188.284
6 85 Bosa Central Bosa 237.111 3.346 141 57,6 89.7% $1.181.975
7 26 Las Ferias Engativá 100.848 3.139 311 167,4 72.9% $1.983.508
8 100 Galerias Teusaquillo 38.425 3.067 798 496,6 48.5% $3.574.567
9 101 Teusaquillo Teusaquillo 28.881 2.976 1.030 648,2 62.9% $3.675.044
10 99 Chapinero Chapinero 26.491 2.901 1.095 699,9 50.3% $4.981.378

3.2 Pregunta 1 · ¿Las UPZ con más denuncias totales son las más inseguras por habitante, o solo son las más pobladas?

  • Qué buscamos encontrar: Evaluar cómo se relacionan la poblacion y el volumen total de denuncias (casos_total) en las 112 UPZ (\(\rho = +0,56\)), frente a la relación inversa entre poblacion y tasa_total (\(\rho = -0,56\)).
  • Qué muestra la gráfica: Un diagrama de dispersión limpio donde las UPZ del común aparecen en gris de contexto y se resaltan únicamente los dos extremos que explican el comportamiento de la ciudad: en magenta los polos comerciales/centrales con pocos residentes pero miles de denuncias, y en turquesa las grandes UPZ residenciales con más de 180.000 habitantes.

Insight P1: Las tres UPZ con más denuncias de toda Bogotá no son las más pobladas, sino nodos centrales de comercio, servicios y oficinas con menos de 39.000 residentes: La Sabana (5.441 casos, tasa de 1.400 / 10k), Chicó Lago (4.985 casos, tasa de 1.291 / 10k) y Las Nieves (4.033 casos, tasa de 2.344 / 10k). En cambio, megabarrios residenciales como El Rincón (295.322 hab, 3.812 casos) o Bosa Central (237.111 hab, 3.346 casos) ocupan los primeros puestos en volumen absoluto únicamente por su masa poblacional, con tasas por habitante diez veces menores (129 y 141 / 10k hab).


3.3 Pregunta 2 · ¿En qué zonas de Bogotá se concentra la mayor tasa de hurto a personas y cómo contrasta con los bordes residenciales?

  • Qué buscamos encontrar: Identificar el patrón geográfico de la tasa_hurto_personas en las 112 UPZ y su contraste con la densidad habitacional (densidad_hab_km2, con la que tiene una correlación de Spearman de \(\rho = -0,56\)).
  • Qué muestra la gráfica: Un mapa coroplético estático por quintiles de tasa (para que las UPZ extremas no aplasten la escala de color) junto con un mapa interactivo en leaflet para explorar cada polígono al pasar el cursor.

A continuación se presenta el mapa interactivo en leaflet para explorar en detalle cada una de las 112 UPZ (puedes hacer zoom y pasar el cursor sobre cualquier UPZ para consultar su población, casos, tasa de hurto y percepción de inseguridad):

Insight P2: El quintil más crítico de hurto a personas (Q5: > 237 hurtos por 10.000 hab) forma una franja ininterrumpida a lo largo del borde oriental-central (La Candelaria, Santa Fe, Los Mártires, Teusaquillo, Chapinero y Barrios Unidos) que se extiende por el eje de la Calle 26 / Avenida El Dorado hacia Fontibón y el Aeropuerto. Por el contrario, los anillos de altísima densidad residencial en Bosa, Usme, San Cristóbal y el sur de Suba pertenecen a los quintiles más bajos (Q1 y Q2, menos de 85 hurtos por 10.000 hab).


3.4 Pregunta 3 · ¿La gente se siente más insegura en las UPZ donde más se denuncian hurtos, o el miedo y la denuncia van por separado?

  • Qué buscamos encontrar: Contrastar en las 112 UPZ la tasa objetiva de denuncias de hurto (tasa_hurto_personas, mediana 100,6 / 10k hab) frente a la percepción subjetiva de inseguridad en el entorno de la vivienda (pct_percibe_inseguridad, mediana 66,0%).
  • Qué muestra la gráfica: Un plano dividido en 4 cuadrantes por las medianas de Bogotá que permite contar cuántas UPZ tienen coincidencia entre denuncia y miedo y cuántas viven en desconexión.

Insight P3: Existe una correlación inversa moderada (\(\rho = -0,37\)) entre la tasa de hurto denunciado y la percepción de inseguridad. Exactamente 70 de las 112 UPZ (62,5%) viven esta paradoja: 35 UPZ del sur y occidente popular (como Bosa Central con 89,7% de miedo y tasa de solo 57,6, o Ismael Perdomo y Lucero) viven con temor generalizado pese a registrar pocas denuncias formales; mientras que 35 UPZ del norte y centro ampliado (como Chicó Lago con 21,5% de percepción de inseguridad pero una tasa de 842 hurtos/10k hab, o Usaquén con 24,5% y tasa de 202) registran altísimas denuncias comerciales/laborales pero tranquilidad en el entorno de sus viviendas.


3.5 Pregunta 4 · ¿Las UPZ con más lotes baldíos u oscuros y menor iluminación pública son aquellas donde los vecinos se sienten más inseguros?

  • Qué buscamos encontrar: Evaluar cómo el porcentaje de viviendas cercanas a lotes baldíos o sitios oscuros (pct_cerca_lotes_oscuros, mediana 18,2%, \(\text{IQR} = 14,3\%\)) y la densidad de alumbrado público (luminarias_km2, mediana 1.000 lum/km²) inciden en la percepción de inseguridad en las 112 UPZ.
  • Qué muestra la gráfica: Un gráfico de dispersión con recta de tendencia lineal donde el color distingue a las UPZ con baja densidad de alumbrado público (< 1.000 luminarias/km², en magenta) frente a las de alta densidad (>= 1.000 luminarias/km², en turquesa).

Insight P4: El deterioro físico del entorno barrial explica buena parte del miedo ciudadano que no capturan las denuncias de hurto: a medida que sube el porcentaje de viviendas cercanas a lotes baldíos o sitios oscuros, la percepción de inseguridad crece de forma sostenida (\(\rho = +0,33\), \(r = +0,31\)). UPZ como Corabastos (48,9% cerca de lotes oscuros y 92,1% de percepción de inseguridad), El Tesoro (45,2% y 87,2%) y Monte Blanco (45,2% y 87,2%) combinan alta presencia de sitios oscuros con temor generalizado.


3.6 Pregunta 5 · ¿Cómo aumenta la tasa de homicidios en las UPZ a medida que crece la cercanía de las viviendas a expendios de droga (“ollas”)?

  • Qué buscamos encontrar: Cuantificar la asociación entre la presencia territorial de expendios de droga (pct_cerca_ollas, mediana 20,6%, rango 0,3% a 75,6%) y la violencia letal (tasa_homicidios, \(\rho = +0,53\)) e interpersonal (tasa_lesiones, \(\rho = +0,41\)).
  • Qué muestra la gráfica: Dividimos las 112 UPZ en 4 grupos de igual tamaño (cuartiles de 28 UPZ cada uno) según el porcentaje de viviendas cercanas a “ollas” y graficamos sus cajas intercuartílicas conectadas por la línea de sus medianas.

Insight P5: La presencia de mercados ilegales de microtráfico (“ollas”) actúa como un fuerte catalizador de la violencia letal en Bogotá (\(\rho = +0,53\)). Mientras en las 28 UPZ con menor presencia de ollas (< 9% de viviendas afectadas) la tasa mediana de homicidios es de apenas 0,17 por 10.000 hab, pasa a 0,40 en el segundo grupo, a 0,70 en el tercero y alcanza 1,12 por 10.000 hab en el cuartil más expuesto (> 31% de viviendas cerca de ollas), con picos críticos en Las Cruces (6,2), La Sabana (6,2), Las Nieves (5,2), Corabastos (3,6) y Lucero (2,9).


3.7 Pregunta 6 · ¿Cambia el tipo de delito que más se denuncia según el estrato socioeconómico de la UPZ?

  • Qué buscamos encontrar: Comprobar si el nivel socioeconómico (estrato_predominante, salario_promedio y pct_pobreza) reduce todos los delitos por igual o si produce una especialización del tipo de delito en las 112 UPZ.
  • Qué muestra la gráfica: Un gráfico de mancuerna (dumbbell plot) que compara lado a lado la tasa mediana de 7 delitos entre Estrato Bajo (magenta), Estrato Medio (morado) y Estrato Alto (turquesa), separando con una línea horizontal punteada los hurtos patrimoniales de los delitos de violencia intrafamiliar y lesiones.

Insight P6: En las 112 UPZ de Bogotá el orden de los puntos se invierte por completo al cruzar la línea punteada: - Arriba (Delitos patrimoniales): En las UPZ de Estrato Medio y Alto la tasa mediana de denuncias de hurto a personas (153,4 y 147,1 / 10k), hurto de celulares (55,9 y 60,3) y hurto a residencias (7,3 y 9,2) triplica a la del Estrato Bajo (50,5, 17,6 y 3,5), impulsada por mayores activos asegurables, actividad comercial y mayor propensión a denunciar (\(\rho = +0,66\) con el salario). - Abajo (Violencia interpersonal e intrafamiliar): En las UPZ de Estrato Bajo (1 y 2) la tasa mediana de violencia intrafamiliar (22,5 / 10k) y lesiones personales (12,5 / 10k) más que duplica las tasas del Estrato Alto (9,4 y 6,6), reflejando una relación directa con la pobreza monetaria (\(\rho = +0,65\)).


3.8 Pregunta 7 · ¿Cómo se relacionan la edad de la población y el tamaño del hogar con la violencia intrafamiliar y el hurto a residencias?

  • Qué buscamos encontrar: Analizar cómo la estructura demográfica de la UPZ (pct_0_14 % de niños de 0 a 14 años vs. pct_60_mas % de adultos mayores de 60 años y personas_por_vivienda) divide el comportamiento de los dos delitos que ocurren puertas adentro del hogar.
  • Qué muestra la gráfica: Dos paneles paralelos que contrastan la pendiente positiva entre población infantil y violencia intrafamiliar (Panel A, en magenta) frente a la pendiente positiva entre envejecimiento poblacional y hurto a residencias (Panel B, en turquesa).

Insight P7: Los dos delitos del ámbito residencial muestran perfiles demográficos opuestos en las 112 UPZ: 1. Violencia intrafamiliar: Crece significativamente en las UPZ jóvenes con mayor proporción de niños de 0 a 14 años (\(\rho = +0,46\)) y mayor número de personas por vivienda (\(\rho = +0,28\)), como El Tesoro y Monte Blanco (donde más del 26% de la población son menores de 15 años). 2. Hurto a residencias: Se concentra en las UPZ demográficamente envejecidas (\(\rho = +0,43\) con pct_60_mas) y con menor densidad de personas por hogar (\(\rho = -0,56\)), tales como Teusaquillo, La Alhambra, Santa Bárbara y Country Club (donde más del 24% de los residentes supera los 60 años).


3.9 Pregunta 8 · ¿Qué tan lejos queda a pie un CAI de policía y otros servicios básicos en las 112 UPZ según su estrato?

  • Qué buscamos encontrar: Evaluar los tiempos promedio de caminata a los 7 equipamientos urbanos medidos por la Encuesta Multipropósito (min_parque, min_sitp, min_ciclorruta, min_transmilenio, min_cai_policia, min_centro_medico, min_cultura) a través de las 112 UPZ frente al estándar urbano de 15 minutos caminando.
  • Qué muestra la gráfica: La comparación del tiempo mediano a pie para cada servicio según el estrato predominante de la UPZ, destacando los valores de los dos extremos en cada fila frente al umbral de 15 minutos.

Insight P8: Bogotá cumple el umbral de los 15 minutos a pie en transporte público (Paradero SITP: ~8 min, TransMilenio: ~12 a 14 min) y parques (5,6 a 10,7 min), pero presenta un déficit estructural y desigual en seguridad policial, salud y cultura: - Mientras en las UPZ de Estrato Alto un residente camina en mediana 14,7 minutos hasta un CAI de policía (dentro de la meta de 15 minutos), en Estrato Bajo debe caminar 18,8 minutos (llegando a más de 30 minutos en UPZ periféricas como Alfonso López o El Mochuelo). - La brecha es aún más pronunciada en Ciclorruta (7,8 min en Estrato Alto vs. 21,1 min en Estrato Bajo) y en Centro médico (19,1 min vs. 31,8 min). Además, allí donde sí hay cercanía a ciclorrutas (min_ciclorruta bajo), se concentra el hurto de bicicletas (\(\rho = -0,55\)).


4. Hallazgos e historia: La anatomía de las dos Bogotás frente a la inseguridad

Al conectar los hallazgos de las 8 preguntas transversales sobre las 112 UPZ, emerge una historia clara que desmiente la idea de que la inseguridad en Bogotá sea un fenómeno único o uniforme. Por el contrario, los datos revelan que en la ciudad coexisten dos dinámicas territoriales opuestas:

  1. Acto I · La Bogotá del flujo comercial y la denuncia patrimonial (Centro y Norte): En el corredor central-oriental (Las Nieves, La Sabana, Chicó Lago, Chapinero, Teusaquillo, Galerías) y el nodo aeroportuario (El Dorado), viven relativamente pocos residentes pero convergen diariamente cientos de miles de trabajadores, estudiantes, comercios y viajeros (Preguntas 1 y 2). Allí se disparan las tasas denunciadas de hurto a personas, celulares, comercios y residencias (\(\rho = +0,66\) con el salario promedio, Pregunta 6), y en los barrios más envejecidos y consolidados del norte se concentra el robo a viviendas (\(\rho = +0,43\) con adultos mayores, Pregunta 7). Sin embargo, salvo en los nodos mixtos del centro histórico y La Sabana, los habitantes de las UPZ del norte reportan baja percepción de inseguridad en el entorno de su vivienda (Pregunta 3) y cuentan con mejor iluminación, menos lotes oscuros y un CAI policial a menos de 15 minutos a pie (Preguntas 4 y 8).

  2. Acto II · La Bogotá residencial vulnerable, el miedo cotidiano y la violencia contra la vida (Sur y Periferia): En las grandes UPZ residenciales de Estrato Bajo (1 y 2) en el sur y occidente (Bosa, Ciudad Bolívar, Usme, San Cristóbal, Kennedy), las tasas de hurto denunciado por cada 10.000 habitantes parecen bajas porque el denominador poblacional supera los 150.000 o 250.000 residentes por UPZ y existe mayor subregistro (Pregunta 1). Pero es allí donde más del 74% de los hogares se siente inseguro (Pregunta 3). Ese miedo no es infundado: responde a entornos con mayor presencia de lotes oscuros o baldíos (Pregunta 4), mayor exposición a expendios de droga (“ollas”) que multiplican por 6,5 veces la tasa mediana de homicidios (Pregunta 5), hogares jóvenes y más densos donde la violencia intrafamiliar y las lesiones personales duplican las tasas del norte (Preguntas 6 y 7), y una mayor lejanía a pie hasta un CAI de policía, un centro médico o una ciclorruta (Pregunta 8).

Pregunta Hallazgo Principal Conectado (Evidencia en las 112 UPZ) Indicador Clave
P1 Las UPZ con más casos (La Sabana: 5.441, Chicó Lago: 4.985) tienen pocos residentes; las más pobladas (El Rincón: 295k hab) diluyen su tasa. \(\rho(\text{pob}, \text{casos}) = +0,56\)
\(\rho(\text{pob}, \text{tasa}) = -0,56\)
P2 El quintil crítico de hurto a personas (> 237 / 10k hab) forma un corredor continuo en el centro-oriente y el eje Calle 26 - El Dorado. Mediana Bogotá: 100,6 / 10k
Q5: 237 a 6.333 / 10k
P3 70 de las 112 UPZ (62,5%) viven en desconexión entre denuncia y miedo: 35 en el sur (alto miedo, baja denuncia) y 35 en el norte (alta denuncia, bajo miedo). \(\rho = -0,37\)
P4 La cercanía a lotes baldíos u oscuros impulsa sistemáticamente la percepción de inseguridad vecinal y se agrava con menor densidad lumínica. \(\rho = +0,33\)
P5 La mediana de homicidios sube de 0,17 en el cuartil con menos “ollas” a 1,12 / 10k hab en el cuartil con mayor presencia de “ollas”. \(\rho = +0,53\) (6,5x más alta)
P6 En Estrato Medio/Alto se denuncian 3 veces más hurtos (153 vs. 50,5); en Estrato Bajo hay 2,4 veces más violencia intrafamiliar (22,5 vs. 9,4). \(\rho(\text{salario}, \text{hurto}) = +0,66\)
\(\rho(\text{pobreza}, \text{VIF}) = +0,65\)
P7 Las UPZ con más niños (pct_0_14) sufren más violencia intrafamiliar; las UPZ con más adultos mayores (pct_60_mas) sufren más hurto a residencias. \(\rho_{\text{niños, VIF}} = +0,46\)
\(\rho_{\text{60+, resid}} = +0,43\)
P8 Un CAI policial está a 14,7 min en Estrato Alto pero a 18,8 min en Estrato Bajo; salud y cultura superan los 31 min en los sectores vulnerables. Brecha CAI: +4,1 min
Brecha Ciclorruta: +13,3 min

5. Limitaciones y conclusión

5.1 Limitaciones metodológicas (Qué NO se puede concluir de estos datos)

Siguiendo el principio de honestidad analítica, toda decisión basada en este estudio debe tener en cuenta cinco limitaciones estructurales del conjunto de datos:

  1. Una denuncia no es igual a un delito ocurrido (Sesgo de subregistro): Los registros de la Secretaría Distrital de Seguridad corresponden a denuncias formales, no a la totalidad de delitos cometidos. La propensión a denunciar aumenta cuando existe un seguro de por medio (vehículos, celulares de gama alta, comercios, viviendas de estrato alto) o mayor acceso institucional, y disminuye en sectores donde hay desconfianza hacia las autoridades o temor a represalias. Por ello, las menores tasas de hurto en el sur no significan ausencia de robos, sino en parte menor denuncia formal.
  2. Denominador de población residente vs. población flotante: Las tasas están divididas por la población que duerme en la UPZ (poblacion DANE 2023), no por la población que transita o trabaja allí durante el día. En las 8 UPZ con menos de 5.000 habitantes (El Mochuelo, Aeropuerto El Dorado, Parque Simón Bolívar, Parque Salitre, Jardín Botánico) y en el centro histórico/financiero, las tasas reflejan la relación entre delitos sufridos por visitantes y un número muy pequeño de residentes.
  3. Desfase temporal entre fuentes (2021 vs. 2023) y corte parcial del año: Las variables de la Encuesta Multipropósito y de luminarias corresponden a 2021, mientras que la población proyectada y las denuncias corresponden a 2023 (y los delitos cubren únicamente 7 meses: enero a julio de 2023, por lo que las tasas no son anuales). Además, el delito de delitos sexuales no está incluido porque la fuente oficial no lo reporta por UPZ para 2023.
  4. Agrupación muestral en 32 UPZ (em_agrupada == TRUE): En 32 de las 112 UPZ (28,6%), la Encuesta Multipropósito no tiene muestra independiente sino agregada con UPZ vecinas, asignándoles el mismo promedio de grupo en variables de percepción, ingresos y tiempos de acceso.
  5. Correlación no implica causalidad (Falacia ecológica): Que a nivel agregado de UPZ exista correlación positiva entre cercanía a “ollas” y homicidios (\(\rho = +0,53\)), o entre envejecimiento poblacional y hurto a residencias (\(\rho = +0,43\)), describe una coexistencia territorial (ecológica) a escala zonal, pero no permite inferir causalidad directa a nivel de individuos u hogares sin un diseño longitudinal o cuasi-experimental.

5.2 Conclusión general

El análisis exploratorio de las 112 UPZ de Bogotá demuestra que una política de seguridad urbana no puede guiarse por un único indicador global. Si solo se mira el mapa de tasas brutas, los recursos se concentrarían en parques y en el aeropuerto por el efecto denominador; si solo se mira el mapa de denuncias de hurto, se atenderían los nodos comerciales y de altos ingresos dejando desprotegida la periferia; y si se cruzan los 5 bloques de información, queda claro que Bogotá requiere una estrategia diferenciada: prevención situacional y control de mercados de receptación en el corredor comercial central-norte, e intervención social, iluminación, recuperación de lotes oscuros, desarticulación de “ollas”, prevención de violencia intrafamiliar y cercanía de equipamiento policial y de salud en las UPZ residenciales vulnerables del sur y occidente.