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/:
upz_cod,
upz_nombre, localidad,
area_km2).poblacion,
densidad_hab_km2, estructura por edades y sexo).personas_por_vivienda,
pct_viviendas_desocupadas, luminarias_km2,
pct_luminarias_led).casos_* y tasas por cada 10.000
habitantes tasa_* para 10 delitos y su total).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. |
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:
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:
| 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))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:
| 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.
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):
| 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)
)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()
)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):
| 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 |
| 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 |
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\)).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).
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\)).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).
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%).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.
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.< 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.
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\)).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).
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.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\)).
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.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).
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.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\)).
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:
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).
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 |
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:
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.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.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.