VISUALIZACIÓN DE DATOS
Inseguridad y territorio en Bogotá:
¿qué nos cuentan las UPZ?
Docente: Carlos Amortegui
Para realizar la exploración de los datos se utilizarán paquetes de R que permiten importar archivos, organizar la información y realizar cálculos estadísticos.
El siguiente código instala los paquetes necesarios para trabajar con archivos Excel y CSV, manipular datos y elaborar gráficos.
# Instalación de paquetes necesarios para el proyecto
install.packages("tidyverse") # Manipulación, transformación y exploración de datos. Incluye dplyr, tidyr, ggplot2 y readr.
install.packages("sf") # Lectura y manejo de información geográfica. Permite trabajar con los polígonos de las UPZ y localidades.
install.packages("leaflet") # Creación de mapas interactivos con zoom, etiquetas y resaltado de territorios.
install.packages("scales") # Formato de números, porcentajes, tasas y escalas en gráficos.
install.packages("knitr") # Organización y presentación de tablas y resultados dentro del informe R Markdown.
Una vez instalados, los paquetes se cargan para poder utilizar sus funciones durante el análisis.
# Cargar las librerías necesarias
library(tidyverse)
library(sf)
library(leaflet)
library(scales)
library(knitr)
Configuración del comportamiento general del documento
# Definir la paleta de colores del proyecto
morado <- "#351A4F"
magenta <- "#D9006C"
turquesa <- "#168C86"
gris <- "#D9D6DD"
# Configuración general de los gráficos
tema_clase <- theme_minimal(base_size = 12) +
theme(
plot.title.position = "plot",
plot.title = element_text(
face = "bold", size = 15, color = morado
),
plot.subtitle = element_text(
size = 10.5, color = "grey35"
),
panel.grid.minor = element_blank(),
plot.caption = element_text(
hjust = 0, color = "grey45", size = 8.5
),
plot.margin = margin(10, 20, 10, 10)
)
# Opciones generales de presentación del informe
knitr::opts_chunk$set(
echo = TRUE,
warning = FALSE,
message = FALSE,
fig.align = "center",
fig.width = 8,
fig.height = 5,
dpi = 120
)
La seguridad ciudadana es una de las dimensiones que influye en la calidad de vida y en las condiciones de convivencia de una ciudad. Sin embargo, su comportamiento no necesariamente es igual en todos los territorios, ya que cada zona presenta características particulares relacionadas con su población, infraestructura, condiciones socioeconómicas y entorno urbano.
En Bogotá, las Unidades de Planeamiento Zonal (UPZ) permiten observar estas diferencias desde una perspectiva territorial. A través de ellas es posible comparar las condiciones de distintos sectores de la ciudad y explorar cómo se relacionan con los registros de delitos y la percepción de inseguridad de sus habitantes.
Este trabajo desarrolla un análisis exploratorio de datos (EDA) sobre las 112 UPZ urbanas de Bogotá, utilizando información relacionada con delitos denunciados, población, vivienda, alumbrado público y condiciones socioeconómicas.
El propósito es identificar patrones, diferencias y posibles relaciones entre las características de cada territorio y los indicadores de seguridad disponibles. Para ello, se utilizarán herramientas estadísticas y visualizaciones que faciliten la interpretación de los resultados, incluyendo representaciones geográficas que permitan reconocer las diferencias entre las zonas de la ciudad.
El análisis no busca establecer relaciones de causalidad ni afirmar que una característica territorial sea la causa directa de determinados comportamientos delictivos. Su alcance es exploratorio y pretende comprender mejor la información disponible, reconocer patrones y generar preguntas que puedan orientar investigaciones posteriores.
Explorar las condiciones de seguridad y las características territoriales, demográficas y socioeconómicas de las UPZ urbanas de Bogotá, mediante técnicas de análisis exploratorio de datos y visualización, con el propósito de identificar patrones, diferencias y posibles relaciones que permitan comprender el comportamiento de los indicadores de inseguridad en la ciudad.
Describir la estructura y las características de la información disponible para las 112 UPZ de Bogotá.
Explorar la distribución de los indicadores de delitos, población, vivienda, infraestructura y condiciones socioeconómicas.
Identificar diferencias territoriales mediante el uso de estadísticas descriptivas, comparaciones y mapas.
Examinar posibles relaciones entre los indicadores de seguridad y las características de cada UPZ.
Comunicar los principales hallazgos mediante visualizaciones y una narrativa basada en los datos.
Para desarrollar el análisis se utiliza una base de datos consolidada que contiene información de 112 Unidades de Planeamiento Zonal de Bogotá. Cada registro representa una UPZ e incluye variables relacionadas con su territorio, población, condiciones de vivienda, infraestructura, delitos denunciados y características socioeconómicas.
La información se encuentra organizada en cinco grandes bloques:
Territorio: identificación de la UPZ, localidad y extensión geográfica.
Demografía: población, densidad poblacional y composición por grupos de edad.
Vivienda e infraestructura: características de las viviendas y disponibilidad de alumbrado público.
Delitos: registros de denuncias y tasas por cada 10.000 habitantes para diez categorías de delitos.
Encuesta Multipropósito: información relacionada con pobreza, ingresos, estrato, educación, percepción de inseguridad y condiciones del entorno.
Adicionalmente, se dispone de archivos geográficos que representan los límites de las UPZ y las localidades urbanas de Bogotá. Estos archivos permitirán integrar la información estadística con su ubicación territorial.
Vamos a conectar nuestro informe con los archivos.
Se cargaran tres fuentes: 1. La base estadística de las UPZ. 2. El mapa de las UPZ. 3. El mapa de las localidades.
# 3.1. Importación de la base estadística
upz <- read_csv(
"input/upz_variables.csv",
show_col_types = FALSE
)
# 3.2. Importación de los archivos geográficos
upz_shp <- st_read(
"input/shp/upz_bogota.shp",
quiet = TRUE
)
localidades_shp <- st_read(
"input/shp/localidades_bogota.shp",
quiet = TRUE
)
Notas:
read_csv() permite importar la información estadística.
st_read() permite leer los archivos geográficos.
Los objetos terminados en **_shp** contienen geometrías que representan los límites territoriales.
Antes de realizar los análisis estadísticos y las visualizaciones, es necesario conocer la estructura de la información disponible y verificar sus características generales.
Esta primera exploración permite identificar la cantidad de registros y variables, los tipos de datos utilizados y las condiciones generales de la base. De esta manera, se busca establecer un punto de partida que facilite el desarrollo de las siguientes etapas del análisis.
La base de datos contiene información de diferentes características de las UPZ de Bogotá. Para comenzar, se revisa su dimensión general, identificando cuántos registros y variables están disponibles.
Cada registro representa una UPZ, mientras que las columnas corresponden a las diferentes características e indicadores recopilados para el análisis.
# Consultar las dimensiones generales de la base
dim(upz)
## [1] 112 67
# Identificar la cantidad de registros
nrow(upz)
## [1] 112
# Identificar la cantidad de variables
ncol(upz)
## [1] 67
# Consultar los primeros registros
head(upz)
| upz_cod | upz_nombre | localidad_cod | localidad | area_km2 | poblacion | densidad_hab_km2 | pct_mujeres | pct_0_14 | pct_15_29 | pct_60_mas | viviendas_totales | viviendas_ocupadas | pct_viviendas_desocupadas | personas_por_vivienda | luminarias | luminarias_km2 | luminarias_1000hab | pct_luminarias_led | casos_homicidios | casos_lesiones | casos_hurto_personas | casos_hurto_residencias | casos_hurto_automotor | casos_hurto_bicicletas | casos_hurto_comercio | casos_hurto_celulares | casos_hurto_motos | casos_violencia_intrafamiliar | casos_total | tasa_homicidios | tasa_lesiones | tasa_hurto_personas | tasa_hurto_residencias | tasa_hurto_automotor | tasa_hurto_bicicletas | tasa_hurto_comercio | tasa_hurto_celulares | tasa_hurto_motos | tasa_violencia_intrafamiliar | tasa_total | em_agrupada | pct_pobreza | edad_promedio | salario_promedio | pct_estrato_1_2 | pct_estrato_3_4 | pct_estrato_5_6 | pct_vivienda_propia | pct_arriendo | anios_educacion_15mas | pct_padre_universitario | pct_madre_universitaria | pct_percibe_inseguridad | pct_cerca_ollas | pct_cerca_bares | pct_cerca_lotes_oscuros | pct_cerca_basureros | pct_cerca_terminales | pct_cerca_fabricas | min_transmilenio | min_sitp | min_parque | min_cai_policia | min_centro_medico | min_cultura | min_ciclorruta |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | Paseo De Los Libertadores | 1 | Usaquén | 6.33 | 2690 | 424.81 | 51.26 | 18.85 | 26.13 | 12.94 | 1087 | 1022 | 5.98 | 2.63 | 524 | 82.75 | 194.80 | 28.44 | 0 | 8 | 44 | 1 | 0 | 1 | 3 | 17 | 0 | 0 | 74 | 0.00 | 29.74 | 163.57 | 3.72 | 0.00 | 3.72 | 11.15 | 63.20 | 0.00 | 0.00 | 275.09 | TRUE | 1.37 | 36.54 | 3937004 | 13.92 | 83.87 | 2.21 | 54.45 | 38.00 | 12.16 | 24.14 | 17.37 | 36.18 | 17.53 | 15.68 | 24.15 | 6.13 | 20.93 | 11.55 | 13.01 | 9.99 | 7.00 | 21.66 | 29.82 | 33.90 | 9.00 |
| 2 | La Academia | 11 | Suba | 6.74 | 5260 | 779.85 | 51.35 | 24.11 | 18.46 | 9.26 | 1554 | 1515 | 2.51 | 3.47 | 534 | 79.17 | 101.52 | 0.37 | 1 | 3 | 75 | 0 | 3 | 1 | 9 | 26 | 0 | 5 | 123 | 1.90 | 5.70 | 142.59 | 0.00 | 5.70 | 1.90 | 17.11 | 49.43 | 0.00 | 9.51 | 233.84 | TRUE | 0.86 | 38.71 | 4280663 | 0.63 | 87.06 | 12.31 | 57.98 | 36.81 | 13.57 | 24.16 | 14.82 | 40.88 | 7.43 | 17.03 | 16.71 | 1.35 | 26.66 | 1.70 | 10.78 | 9.56 | 5.44 | 24.50 | 34.17 | 29.61 | 13.45 |
| 3 | Guaymaral | 11 | Suba | 4.55 | 2692 | 591.30 | 51.63 | 18.31 | 20.88 | 14.04 | 789 | 698 | 11.53 | 3.86 | 184 | 40.42 | 68.35 | 0.00 | 0 | 1 | 29 | 0 | 0 | 2 | 2 | 9 | 0 | 2 | 45 | 0.00 | 3.71 | 107.73 | 0.00 | 0.00 | 7.43 | 7.43 | 33.43 | 0.00 | 7.43 | 167.16 | TRUE | 0.86 | 38.71 | 4280663 | 0.63 | 87.06 | 12.31 | 57.98 | 36.81 | 13.57 | 24.16 | 14.82 | 40.88 | 7.43 | 17.03 | 16.71 | 1.35 | 26.66 | 1.70 | 10.78 | 9.56 | 5.44 | 24.50 | 34.17 | 29.61 | 13.45 |
| 9 | Verbenal | 1 | Usaquén | 3.57 | 131999 | 36967.66 | 52.77 | 20.15 | 25.15 | 11.61 | 46809 | 45055 | 3.75 | 2.93 | 3555 | 995.61 | 26.93 | 65.77 | 3 | 104 | 386 | 29 | 19 | 17 | 26 | 125 | 30 | 205 | 944 | 0.23 | 7.88 | 29.24 | 2.20 | 1.44 | 1.29 | 1.97 | 9.47 | 2.27 | 15.53 | 71.52 | FALSE | 3.12 | 33.28 | 1933709 | 31.32 | 66.05 | 2.63 | 36.78 | 55.53 | 12.16 | 8.36 | 6.13 | 65.43 | 17.53 | 15.68 | 24.15 | 6.13 | 20.93 | 11.55 | 6.96 | 5.96 | 8.60 | 18.39 | 34.18 | 42.77 | 14.45 |
| 10 | La Uribe | 1 | Usaquén | 3.47 | 37014 | 10682.12 | 54.34 | 17.24 | 20.18 | 15.62 | 14399 | 13763 | 4.42 | 2.69 | 1328 | 383.26 | 35.88 | 49.25 | 1 | 26 | 328 | 31 | 4 | 14 | 47 | 129 | 1 | 40 | 621 | 0.27 | 7.02 | 88.62 | 8.38 | 1.08 | 3.78 | 12.70 | 34.85 | 0.27 | 10.81 | 167.77 | TRUE | 1.37 | 36.54 | 3937004 | 13.92 | 83.87 | 2.21 | 54.45 | 38.00 | 12.16 | 24.14 | 17.37 | 36.18 | 17.53 | 15.68 | 24.15 | 6.13 | 20.93 | 11.55 | 13.01 | 9.99 | 7.00 | 21.66 | 29.82 | 33.90 | 9.00 |
| 11 | San Cristobal Norte | 1 | Usaquén | 2.76 | 72939 | 26401.70 | 52.65 | 19.59 | 24.65 | 14.38 | 24886 | 24401 | 1.95 | 2.99 | 2578 | 933.16 | 35.34 | 49.34 | 4 | 73 | 351 | 27 | 5 | 11 | 39 | 117 | 9 | 157 | 793 | 0.55 | 10.01 | 48.12 | 3.70 | 0.69 | 1.51 | 5.35 | 16.04 | 1.23 | 21.52 | 108.72 | FALSE | 5.19 | 34.50 | 1368739 | 29.48 | 68.87 | 1.65 | 28.86 | 58.05 | 10.95 | 4.76 | 3.31 | 49.84 | 25.91 | 15.41 | 19.15 | 8.30 | 3.38 | 5.99 | 17.76 | 11.43 | 10.39 | 25.32 | 29.71 | 28.10 | 18.27 |
Además de conocer el tamaño de la base, es importante identificar el tipo de información que contiene cada variable.
Esta revisión permite diferenciar los campos que representan cantidades, porcentajes, tasas, categorías territoriales y otras características.
La identificación de estos tipos de datos es importante porque no todas las variables pueden analizarse de la misma manera. Por ejemplo, una variable de población permite realizar cálculos estadísticos, mientras que una variable como el nombre de la localidad se utiliza principalmente para clasificar y agrupar la información.
# Consultar la estructura y los tipos de variables
glimpse(upz)
## Rows: 112
## Columns: 67
## $ upz_cod <dbl> 1, 2, 3, 9, 10, 11, 12, 13, 14, 15, 16, …
## $ upz_nombre <chr> "Paseo De Los Libertadores", "La Academi…
## $ localidad_cod <dbl> 1, 11, 11, 1, 1, 1, 1, 1, 1, 1, 1, 11, 1…
## $ localidad <chr> "Usaquén", "Suba", "Suba", "Usaquén", "U…
## $ area_km2 <dbl> 6.33, 6.74, 4.55, 3.57, 3.47, 2.76, 2.92…
## $ poblacion <dbl> 2690, 5260, 2692, 131999, 37014, 72939, …
## $ densidad_hab_km2 <dbl> 424.81, 779.85, 591.30, 36967.66, 10682.…
## $ pct_mujeres <dbl> 51.26, 51.35, 51.63, 52.77, 54.34, 52.65…
## $ pct_0_14 <dbl> 18.85, 24.11, 18.31, 20.15, 17.24, 19.59…
## $ pct_15_29 <dbl> 26.13, 18.46, 20.88, 25.15, 20.18, 24.65…
## $ pct_60_mas <dbl> 12.94, 9.26, 14.04, 11.61, 15.62, 14.38,…
## $ viviendas_totales <dbl> 1087, 1554, 789, 46809, 14399, 24886, 24…
## $ viviendas_ocupadas <dbl> 1022, 1515, 698, 45055, 13763, 24401, 23…
## $ pct_viviendas_desocupadas <dbl> 5.98, 2.51, 11.53, 3.75, 4.42, 1.95, 3.6…
## $ personas_por_vivienda <dbl> 2.63, 3.47, 3.86, 2.93, 2.69, 2.99, 2.68…
## $ luminarias <dbl> 524, 534, 184, 3555, 1328, 2578, 2734, 5…
## $ luminarias_km2 <dbl> 82.75, 79.17, 40.42, 995.61, 383.26, 933…
## $ luminarias_1000hab <dbl> 194.80, 101.52, 68.35, 26.93, 35.88, 35.…
## $ pct_luminarias_led <dbl> 28.44, 0.37, 0.00, 65.77, 49.25, 49.34, …
## $ casos_homicidios <dbl> 0, 1, 0, 3, 1, 4, 1, 0, 0, 0, 3, 1, 2, 0…
## $ casos_lesiones <dbl> 8, 3, 1, 104, 26, 73, 52, 75, 36, 14, 49…
## $ casos_hurto_personas <dbl> 44, 75, 29, 386, 328, 351, 500, 1189, 78…
## $ casos_hurto_residencias <dbl> 1, 0, 0, 29, 31, 27, 19, 87, 35, 24, 76,…
## $ casos_hurto_automotor <dbl> 0, 3, 0, 19, 4, 5, 7, 11, 3, 1, 8, 14, 1…
## $ casos_hurto_bicicletas <dbl> 1, 1, 2, 17, 14, 11, 38, 71, 26, 12, 32,…
## $ casos_hurto_comercio <dbl> 3, 9, 2, 26, 47, 39, 58, 95, 72, 28, 125…
## $ casos_hurto_celulares <dbl> 17, 26, 9, 125, 129, 117, 170, 368, 262,…
## $ casos_hurto_motos <dbl> 0, 0, 0, 30, 1, 9, 6, 3, 3, 0, 5, 8, 8, …
## $ casos_violencia_intrafamiliar <dbl> 0, 5, 2, 205, 40, 157, 92, 92, 73, 14, 4…
## $ casos_total <dbl> 74, 123, 45, 944, 621, 793, 943, 1991, 1…
## $ tasa_homicidios <dbl> 0.00, 1.90, 0.00, 0.23, 0.27, 0.55, 0.16…
## $ tasa_lesiones <dbl> 29.74, 5.70, 3.71, 7.88, 7.02, 10.01, 8.…
## $ tasa_hurto_personas <dbl> 163.57, 142.59, 107.73, 29.24, 88.62, 48…
## $ tasa_hurto_residencias <dbl> 3.72, 0.00, 0.00, 2.20, 8.38, 3.70, 3.01…
## $ tasa_hurto_automotor <dbl> 0.00, 5.70, 0.00, 1.44, 1.08, 0.69, 1.11…
## $ tasa_hurto_bicicletas <dbl> 3.72, 1.90, 7.43, 1.29, 3.78, 1.51, 6.03…
## $ tasa_hurto_comercio <dbl> 11.15, 17.11, 7.43, 1.97, 12.70, 5.35, 9…
## $ tasa_hurto_celulares <dbl> 63.20, 49.43, 33.43, 9.47, 34.85, 16.04,…
## $ tasa_hurto_motos <dbl> 0.00, 0.00, 0.00, 2.27, 0.27, 1.23, 0.95…
## $ tasa_violencia_intrafamiliar <dbl> 0.00, 9.51, 7.43, 15.53, 10.81, 21.52, 1…
## $ tasa_total <dbl> 275.09, 233.84, 167.16, 71.52, 167.77, 1…
## $ em_agrupada <lgl> TRUE, TRUE, TRUE, FALSE, TRUE, FALSE, FA…
## $ pct_pobreza <dbl> 1.37, 0.86, 0.86, 3.12, 1.37, 5.19, 0.84…
## $ edad_promedio <dbl> 36.54, 38.71, 38.71, 33.28, 36.54, 34.50…
## $ salario_promedio <dbl> 3937004, 4280663, 4280663, 1933709, 3937…
## $ pct_estrato_1_2 <dbl> 13.92, 0.63, 0.63, 31.32, 13.92, 29.48, …
## $ pct_estrato_3_4 <dbl> 83.87, 87.06, 87.06, 66.05, 83.87, 68.87…
## $ pct_estrato_5_6 <dbl> 2.21, 12.31, 12.31, 2.63, 2.21, 1.65, 0.…
## $ pct_vivienda_propia <dbl> 54.45, 57.98, 57.98, 36.78, 54.45, 28.86…
## $ pct_arriendo <dbl> 38.00, 36.81, 36.81, 55.53, 38.00, 58.05…
## $ anios_educacion_15mas <dbl> 12.16, 13.57, 13.57, 12.16, 12.16, 10.95…
## $ pct_padre_universitario <dbl> 24.14, 24.16, 24.16, 8.36, 24.14, 4.76, …
## $ pct_madre_universitaria <dbl> 17.37, 14.82, 14.82, 6.13, 17.37, 3.31, …
## $ pct_percibe_inseguridad <dbl> 36.18, 40.88, 40.88, 65.43, 36.18, 49.84…
## $ pct_cerca_ollas <dbl> 17.53, 7.43, 7.43, 17.53, 17.53, 25.91, …
## $ pct_cerca_bares <dbl> 15.68, 17.03, 17.03, 15.68, 15.68, 15.41…
## $ pct_cerca_lotes_oscuros <dbl> 24.15, 16.71, 16.71, 24.15, 24.15, 19.15…
## $ pct_cerca_basureros <dbl> 6.13, 1.35, 1.35, 6.13, 6.13, 8.30, 11.7…
## $ pct_cerca_terminales <dbl> 20.93, 26.66, 26.66, 20.93, 20.93, 3.38,…
## $ pct_cerca_fabricas <dbl> 11.55, 1.70, 1.70, 11.55, 11.55, 5.99, 2…
## $ min_transmilenio <dbl> 13.01, 10.78, 10.78, 6.96, 13.01, 17.76,…
## $ min_sitp <dbl> 9.99, 9.56, 9.56, 5.96, 9.99, 11.43, 6.8…
## $ min_parque <dbl> 7.00, 5.44, 5.44, 8.60, 7.00, 10.39, 5.1…
## $ min_cai_policia <dbl> 21.66, 24.50, 24.50, 18.39, 21.66, 25.32…
## $ min_centro_medico <dbl> 29.82, 34.17, 34.17, 34.18, 29.82, 29.71…
## $ min_cultura <dbl> 33.90, 29.61, 29.61, 42.77, 33.90, 28.10…
## $ min_ciclorruta <dbl> 9.00, 13.45, 13.45, 14.45, 9.00, 18.27, …
Los valores faltantes representan información que no se encuentra disponible para una o varias variables. Su identificación es importante porque pueden afectar los cálculos estadísticos, las comparaciones y las relaciones entre variables.
En esta etapa se revisa la cantidad de datos faltantes en cada columna, con el propósito de determinar si existen limitaciones en la información disponible.
# Calcular la cantidad de valores faltantes por variable
faltantes <- upz %>%
summarise(
across(
everything(),
~ sum(is.na(.))
)
) %>%
pivot_longer(
cols = everything(),
names_to = "Variable",
values_to = "Cantidad_faltantes"
) %>%
filter(Cantidad_faltantes > 0) %>%
arrange(desc(Cantidad_faltantes))
# Presentar los resultados
if (nrow(faltantes) == 0) {
cat("No se encontraron valores faltantes en la base de datos.")
} else {
knitr::kable(
faltantes,
caption = "Variables con valores faltantes"
)
}
## No se encontraron valores faltantes en la base de datos.
Debido a que cada registro representa una UPZ, el código de identificación territorial debe ser único dentro de la base de datos.
Por esta razón, se revisa si existen códigos repetidos que puedan generar duplicidad de información o afectar las comparaciones posteriores.
# Identificar códigos UPZ repetidos
duplicados_upz <- upz %>%
count(upz_cod, name = "Frecuencia") %>%
filter(Frecuencia > 1)
# Presentar el resultado
if (nrow(duplicados_upz) == 0) {
cat("No se encontraron códigos UPZ duplicados.")
} else {
knitr::kable(
duplicados_upz,
caption = "Códigos UPZ duplicados"
)
}
## No se encontraron códigos UPZ duplicados.
Una vez realizadas las verificaciones iniciales, se consolida un resumen de las principales características de la base de datos.
Este resultado permite establecer las condiciones generales de la información con la que se desarrollará el análisis exploratorio.
resumen_base <- tibble(
Indicador = c(
"Cantidad de registros",
"Cantidad de variables",
"Códigos UPZ únicos",
"Valores faltantes",
"Códigos UPZ duplicados"
),
Resultado = c(
nrow(upz),
ncol(upz),
n_distinct(upz$upz_cod),
sum(is.na(upz)),
nrow(duplicados_upz)
)
)
knitr::kable(
resumen_base,
col.names = c("Indicador", "Resultado"),
caption = "Resumen de la exploración inicial"
)
| Indicador | Resultado |
|---|---|
| Cantidad de registros | 112 |
| Cantidad de variables | 67 |
| Códigos UPZ únicos | 112 |
| Valores faltantes | 0 |
| Códigos UPZ duplicados | 0 |
Los resultados muestran que la base de datos está conformada por 112 registros y 67 variables, con una correspondencia de un registro por cada código UPZ.
En la revisión realizada no se identificaron valores faltantes ni códigos territoriales duplicados. Esto representa una condición favorable para continuar con el análisis exploratorio.
Sin embargo, la ausencia de valores faltantes y duplicados no garantiza por sí sola la calidad de toda la información. Todavía es necesario revisar la distribución de las variables, identificar posibles valores extremos y evaluar la coherencia de los indicadores calculados.
Por lo tanto, esta primera revisión constituye un punto de partida para profundizar en el comportamiento estadístico de las variables.
Una vez revisada la estructura general de la información, se inicia el análisis exploratorio de las variables con el propósito de comprender su comportamiento, identificar diferencias entre los territorios y reconocer posibles patrones que puedan orientar la investigación.
En esta etapa se utilizarán estadísticas descriptivas y representaciones gráficas para examinar las principales características de las UPZ de Bogotá.
La población constituye una de las variables fundamentales para comprender las diferencias entre las UPZ, ya que permite dimensionar el tamaño de cada territorio en términos de habitantes.
Su análisis es especialmente importante para este trabajo, porque los indicadores de delitos se expresan tanto en cantidades absolutas como en tasas por cada 10.000 habitantes. Por lo tanto, conocer cómo se distribuye la población permitirá interpretar posteriormente las diferencias en los indicadores de seguridad.
Inicialmente se analiza la cantidad de habitantes registrados en cada UPZ, con el propósito de identificar las diferencias existentes entre los territorios y reconocer cuáles concentran una mayor o menor población.
Primero vamos a calcular las principales medidas estadísticas.
# Calcular las principales medidas descriptivas
# de la población de las UPZ
estadisticas_poblacion <- upz %>%
summarise(
Total_UPZ = n(),
Poblacion_total = sum(poblacion),
Media = mean(poblacion),
Mediana = median(poblacion),
Desviacion_estandar = sd(poblacion),
Minimo = min(poblacion),
Q1 = quantile(poblacion, 0.25),
Q3 = quantile(poblacion, 0.75),
Maximo = max(poblacion)
)
# Presentar resultados
estadisticas_poblacion %>%
tidyr::pivot_longer(
cols = everything(),
names_to = "Estadística",
values_to = "Valor"
) %>%
knitr::kable(
col.names = c("Estadística", "Resultado"),
caption = "Estadísticas descriptivas de población por UPZ"
)
| Estadística | Resultado |
|---|---|
| Total_UPZ | 112.00 |
| Poblacion_total | 7936532.00 |
| Media | 70861.89 |
| Mediana | 54102.50 |
| Desviacion_estandar | 58406.41 |
| Minimo | 30.00 |
| Q1 | 30081.75 |
| Q3 | 100972.25 |
| Maximo | 305907.00 |
| Medida | Qué nos permite conocer |
|---|---|
| Media | Población promedio por UPZ. |
| Mediana | Valor que divide las UPZ en dos grupos iguales. |
| Desviación estándar | Qué tan dispersa está la población respecto a la media. |
| Mínimo y máximo | Los extremos de población. |
| Q1 | El 25 % de las UPZ tiene una población igual o inferior a este valor. |
| Q3 | El 75 % de las UPZ tiene una población igual o inferior a este valor. |
Una comparación especialmente importante será la media frente a la mediana. Si la primera es considerablemente mayor, puede indicar que algunas UPZ con poblaciones muy elevadas están influyendo en el promedio.
Ahora vamos a visualizar cómo se distribuye la población entre las 112 UPZ
# Histograma de la población por UPZ
ggplot(upz, aes(x = poblacion)) +
geom_histogram(
bins = 20,
fill = magenta,
color = "white",
alpha = 0.85
) +
labs(
title = "Distribución de la población por UPZ",
subtitle = "Población proyectada para el año 2023",
x = "Cantidad de habitantes",
y = "Número de UPZ",
caption = "Fuente: Base de datos del taller."
) +
scale_x_continuous(
labels = scales::label_number(
big.mark = ".",
decimal.mark = ","
)
) +
tema_clase
El histograma nos permite observar dónde se concentra la mayor cantidad de UPZ según su población.
También nos ayuda a identificar si la distribución es simétrica o si presenta una concentración de territorios con poblaciones pequeñas y unos pocos territorios con poblaciones considerablemente mayores.
No debemos asumir que la población se distribuye de manera uniforme entre las UPZ.
Y como el histograma nos muestra el comportamiento general, pero ahora necesitamos identificar los territorios que se encuentran en los extremos.
Vamos a construir dos rankings: las 10 UPZ más pobladas y las 10 menos pobladas.
# 10 UPZ con mayor población
upz_mayor_poblacion <- upz %>%
arrange(desc(poblacion)) %>%
select(
upz_nombre,
localidad,
poblacion
) %>%
slice_head(n = 10)
# 10 UPZ con menor población
upz_menor_poblacion <- upz %>%
arrange(poblacion) %>%
select(
upz_nombre,
localidad,
poblacion
) %>%
slice_head(n = 10)
# Presentar las UPZ más pobladas
knitr::kable(
upz_mayor_poblacion,
col.names = c("UPZ", "Localidad", "Habitantes"),
caption = "Las 10 UPZ con mayor población",
digits = 0
)
| UPZ | Localidad | Habitantes |
|---|---|---|
| Tibabuyes | Suba | 305907 |
| El Rincon | Suba | 295322 |
| Bosa Central | Bosa | 237111 |
| Bosa Occidental | Bosa | 199365 |
| Suba | Suba | 186728 |
| Garces Navas | Engativá | 168657 |
| Ismael Perdomo | Ciudad Bolívar | 166602 |
| Lucero | Ciudad Bolívar | 163588 |
| El Porvenir | Bosa | 143758 |
| Engativa | Engativá | 142612 |
# Presentar las UPZ menos pobladas
knitr::kable(
upz_menor_poblacion,
col.names = c("UPZ", "Localidad", "Habitantes"),
caption = "Las 10 UPZ con menor población",
digits = 0
)
| UPZ | Localidad | Habitantes |
|---|---|---|
| El Mochuelo | Ciudad Bolívar | 30 |
| Aeropuerto El Dorado | Fontibón | 883 |
| Parque Entrenubes | Usme | 1169 |
| Parque Salitre | Barrios Unidos | 1442 |
| Paseo De Los Libertadores | Usaquén | 2690 |
| Guaymaral | Suba | 2692 |
| Jardin Botanico | Engativá | 2900 |
| Parque Simon Bolivar - Can | Teusaquillo | 3323 |
| La Academia | Suba | 5260 |
| Monte Blanco | Ciudad Bolívar | 6575 |
Ahora vamos a representar visualmente estos resultados.
# Preparar los datos de las 10 UPZ más pobladas
ggplot(
upz_mayor_poblacion,
aes(
x = reorder(upz_nombre, poblacion),
y = poblacion
)
) +
geom_col(
fill = morado,
width = 0.7
) +
coord_flip() +
labs(
title = "Las UPZ con mayor concentración de población",
subtitle = "Ranking de las 10 UPZ más pobladas de Bogotá",
x = NULL,
y = "Cantidad de habitantes",
caption = "Fuente: Base de datos del taller."
) +
scale_y_continuous(
labels = scales::label_number(
big.mark = ".",
decimal.mark = ","
)
) +
tema_clase
La cantidad de habitantes no es el único elemento que permite caracterizar un territorio. También es importante considerar su extensión geográfica para comprender qué tan concentrada se encuentra la población.
Para ello se utiliza la densidad poblacional, medida en habitantes por kilómetro cuadrado (hab/km²). Este indicador relaciona la población de cada UPZ con el área que ocupa.
Su análisis permite diferenciar territorios con grandes poblaciones y extensiones amplias de aquellos que presentan una mayor concentración de habitantes en superficies más reducidas.
# Estadísticas descriptivas de densidad poblacional
estadisticas_densidad <- upz %>%
summarise(
Media = mean(densidad_hab_km2),
Mediana = median(densidad_hab_km2),
Desviacion_estandar = sd(densidad_hab_km2),
Minimo = min(densidad_hab_km2),
Q1 = quantile(densidad_hab_km2, 0.25),
Q3 = quantile(densidad_hab_km2, 0.75),
Maximo = max(densidad_hab_km2)
)
knitr::kable(
estadisticas_densidad,
digits = 2,
caption = "Estadísticas descriptivas de la densidad poblacional"
)
| Media | Mediana | Desviacion_estandar | Minimo | Q1 | Q3 | Maximo |
|---|---|---|---|---|---|---|
| 19119.36 | 20180.22 | 10801.85 | 9.44 | 11160.41 | 25826.54 | 46156.87 |
# Identificar las UPZ con mayor densidad poblacional
ranking_densidad <- upz %>%
arrange(desc(densidad_hab_km2)) %>%
select(
upz_nombre,
localidad,
poblacion,
area_km2,
densidad_hab_km2
)
# Presentar las 10 UPZ con mayor densidad
knitr::kable(
ranking_densidad %>% slice_head(n = 10),
col.names = c(
"UPZ",
"Localidad",
"Habitantes",
"Área (km²)",
"Densidad (hab/km²)"
),
digits = 2,
caption = "Las 10 UPZ con mayor densidad poblacional"
)
| UPZ | Localidad | Habitantes | Área (km²) | Densidad (hab/km²) |
|---|---|---|---|---|
| Bosa Occidental | Bosa | 199365 | 4.32 | 46156.87 |
| Patio Bonito | Kennedy | 137776 | 3.18 | 43262.66 |
| Calandaima | Kennedy | 134340 | 3.20 | 41970.43 |
| Tibabuyes | Suba | 305907 | 7.29 | 41963.01 |
| El Rincon | Suba | 295322 | 7.13 | 41440.43 |
| San Francisco | Ciudad Bolívar | 72057 | 1.79 | 40199.86 |
| Verbenal | Usaquén | 131999 | 3.57 | 36967.66 |
| Diana Turbay | Rafael Uribe Uribe | 76093 | 2.12 | 35859.94 |
| Gran Britalia | Kennedy | 62139 | 1.81 | 34416.53 |
| Marruecos | Rafael Uribe Uribe | 123085 | 3.64 | 33796.36 |
# Presentar las 10 UPZ con menor densidad
knitr::kable(
ranking_densidad %>% arrange(densidad_hab_km2) %>% slice_head(n = 10),
col.names = c(
"UPZ",
"Localidad",
"Habitantes",
"Área (km²)",
"Densidad (hab/km²)"
),
digits = 2,
caption = "Las 10 UPZ con menor densidad poblacional"
)
| UPZ | Localidad | Habitantes | Área (km²) | Densidad (hab/km²) |
|---|---|---|---|---|
| El Mochuelo | Ciudad Bolívar | 30 | 3.18 | 9.44 |
| Aeropuerto El Dorado | Fontibón | 883 | 7.46 | 118.40 |
| Parque Entrenubes | Usme | 1169 | 4.21 | 277.97 |
| Paseo De Los Libertadores | Usaquén | 2690 | 6.33 | 424.81 |
| Guaymaral | Suba | 2692 | 4.55 | 591.30 |
| La Academia | Suba | 5260 | 6.74 | 779.85 |
| Parque Simon Bolivar - Can | Teusaquillo | 3323 | 4.00 | 830.50 |
| Parque Salitre | Barrios Unidos | 1442 | 1.66 | 869.50 |
| Monte Blanco | Ciudad Bolívar | 6575 | 6.98 | 941.73 |
| Jardin Botanico | Engativá | 2900 | 1.62 | 1786.96 |
# Visualizar las 10 UPZ con mayor densidad poblacional
ggplot(
ranking_densidad %>% slice_head(n = 10),
aes(
x = reorder(upz_nombre, densidad_hab_km2),
y = densidad_hab_km2
)
) +
geom_col(
fill = turquesa,
width = 0.7
) +
coord_flip() +
labs(
title = "Concentración de población en las UPZ",
subtitle = "Territorios con mayor densidad poblacional",
x = NULL,
y = "Habitantes por km²",
caption = "Fuente: Base de datos del taller."
) +
scale_y_continuous(
labels = scales::label_number(
big.mark = ".",
decimal.mark = ","
)
) +
tema_clase
Para complementar el análisis anterior, se examina la relación entre la población y el área geográfica de cada UPZ.
Esta comparación permite observar si los territorios con mayor extensión también concentran una mayor cantidad de habitantes o si existen diferencias importantes en la ocupación del espacio.
La visualización se realiza mediante un diagrama de dispersión, en el que cada punto representa una UPZ.
# Relación entre población y área territorial
ggplot(
upz,
aes(
x = area_km2,
y = poblacion
)
) +
geom_point(
color = magenta,
size = 2.8,
alpha = 0.75
) +
geom_smooth(
method = "lm",
se = FALSE,
color = morado,
linewidth = 0.9
) +
labs(
title = "Relación entre población y área de las UPZ",
subtitle = "Cada punto representa una unidad territorial",
x = "Área de la UPZ (km²)",
y = "Cantidad de habitantes",
caption = "Fuente: Base de datos del taller."
) +
scale_y_continuous(
labels = scales::label_number(
big.mark = ".",
decimal.mark = ","
)
) +
tema_clase
Si existe una tendencia positiva entre el área y la población.
Si las UPZ de mayor extensión concentran necesariamente más habitantes.
Si existen territorios que se apartan del comportamiento general.
La línea representa una tendencia lineal de referencia. No significa que el área territorial explique por sí sola la cantidad de habitantes.
Durante el análisis de la población es importante identificar territorios que presenten valores considerablemente diferentes al comportamiento general de las UPZ.
Para ello se utiliza el rango intercuartílico (IQR), que corresponde a la diferencia entre el tercer y el primer cuartil de la distribución.
Mediante este procedimiento se identifican posibles valores atípicos, entendidos como observaciones que se encuentran por fuera de los límites estadísticos establecidos.
La identificación de estos valores no significa que deban eliminarse de la información. Por el contrario, permite reconocer territorios con características particulares que deben considerarse en las comparaciones posteriores.
# Calcular los límites para identificar posibles valores atípicos
q1_poblacion <- quantile(upz$poblacion, 0.25)
q3_poblacion <- quantile(upz$poblacion, 0.75)
iqr_poblacion <- IQR(upz$poblacion)
limite_inferior <- q1_poblacion - 1.5 * iqr_poblacion
limite_superior <- q3_poblacion + 1.5 * iqr_poblacion
# Identificar las UPZ que se encuentran fuera de los límites
valores_extremos <- upz %>%
filter(
poblacion < limite_inferior |
poblacion > limite_superior
) %>%
select(
upz_nombre,
localidad,
poblacion,
area_km2,
densidad_hab_km2
) %>%
arrange(desc(poblacion))
# Presentar resultados
knitr::kable(
valores_extremos,
col.names = c(
"UPZ",
"Localidad",
"Habitantes",
"Área (km²)",
"Densidad (hab/km²)"
),
digits = 2,
caption = "UPZ identificadas como posibles valores atípicos en población"
)
| UPZ | Localidad | Habitantes | Área (km²) | Densidad (hab/km²) |
|---|---|---|---|---|
| Tibabuyes | Suba | 305907 | 7.29 | 41963.01 |
| El Rincon | Suba | 295322 | 7.13 | 41440.43 |
| Bosa Central | Bosa | 237111 | 7.17 | 33059.28 |
# Mostrar los límites estadísticos
cat("Límite inferior:", round(limite_inferior, 2), "\n")
## Límite inferior: -76254
cat("Límite superior:", round(limite_superior, 2), "\n")
## Límite superior: 207308
cat("Cantidad de posibles valores atípicos:", nrow(valores_extremos))
## Cantidad de posibles valores atípicos: 3
El análisis demográfico permite reconocer que las UPZ presentan características diferentes en cuanto a su población, extensión y densidad.
Estas diferencias son relevantes para el desarrollo de la investigación, debido a que los indicadores de seguridad pueden presentar comportamientos distintos dependiendo del tamaño y las características de cada territorio.
La identificación de posibles valores extremos también permite reconocer que algunas UPZ pueden tener condiciones particulares que requieren un tratamiento diferenciado al momento de realizar comparaciones estadísticas.
A partir de estos resultados será posible establecer una base más sólida para analizar los indicadores de delitos, diferenciando las cantidades absolutas de las tasas calculadas por habitante.
En este apartado se analizan las condiciones de vivienda y la infraestructura de alumbrado público de las UPZ de Bogotá. Estas variables permiten ampliar la caracterización territorial, incorporando aspectos relacionados con la ocupación residencial y las condiciones físicas del entorno urbano.
Se consideran variables como la cantidad de viviendas, el porcentaje de viviendas desocupadas, el número de personas por vivienda y la disponibilidad de luminarias por unidad de superficie.
El análisis busca identificar diferencias entre territorios y explorar posibles patrones que posteriormente puedan contrastarse con los indicadores de seguridad.
Inicialmente se realiza una descripción estadística de las variables relacionadas con la vivienda. Se consideran la cantidad total de viviendas, las viviendas ocupadas, el porcentaje de viviendas desocupadas y el promedio de personas por vivienda.
El propósito es reconocer cómo se distribuyen estas características entre las UPZ e identificar posibles diferencias territoriales.
estadisticas_vivienda <- upz %>%
summarise(
Total_UPZ = n(),
Media_viviendas = mean(viviendas_totales),
Mediana_viviendas = median(viviendas_totales),
Desv_viviendas = sd(viviendas_totales),
Q1_viviendas = quantile(viviendas_totales, 0.25),
Q3_viviendas = quantile(viviendas_totales, 0.75),
Media_ocupadas = mean(viviendas_ocupadas),
Mediana_ocupadas = median(viviendas_ocupadas),
Media_desocupacion = mean(pct_viviendas_desocupadas),
Mediana_desocupacion = median(pct_viviendas_desocupadas),
Media_personas = mean(personas_por_vivienda),
Mediana_personas = median(personas_por_vivienda)
)
knitr::kable(
estadisticas_vivienda,
digits = 2,
caption = "Estadísticas descriptivas de las variables de vivienda"
)
| Total_UPZ | Media_viviendas | Mediana_viviendas | Desv_viviendas | Q1_viviendas | Q3_viviendas | Media_ocupadas | Mediana_ocupadas | Media_desocupacion | Mediana_desocupacion | Media_personas | Mediana_personas |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 112 | 26456.44 | 21155 | 20192.39 | 12908.75 | 35986 | 25127.23 | 19897 | 6.06 | 4.38 | 2.81 | 2.82 |
El porcentaje de viviendas desocupadas permite observar qué proporción de las viviendas de cada UPZ no se encuentra ocupada.
Se utiliza un histograma para examinar la distribución de esta variable, identificar su concentración y reconocer si existen territorios con porcentajes considerablemente diferentes al comportamiento general.
ggplot(upz, aes(x = pct_viviendas_desocupadas)) +
geom_histogram(
bins = 20,
fill = magenta,
color = "white",
alpha = 0.9
) +
labs(
title = "Distribución de viviendas desocupadas por UPZ",
subtitle = "Porcentaje de viviendas desocupadas en cada territorio",
x = "Porcentaje de viviendas desocupadas",
y = "Cantidad de UPZ",
caption = "Fuente: información consolidada en la base UPZ."
) +
tema_clase
Para complementar la distribución general, se identifican las diez UPZ con mayores y menores porcentajes de viviendas desocupadas. Esto permite reconocer los territorios que presentan los valores extremos de esta característica.
mayor_desocupacion <- upz %>%
arrange(desc(pct_viviendas_desocupadas)) %>%
select(
upz_nombre,
localidad,
viviendas_totales,
viviendas_ocupadas,
pct_viviendas_desocupadas
) %>%
slice_head(n = 10)
menor_desocupacion <- upz %>%
arrange(pct_viviendas_desocupadas) %>%
select(
upz_nombre,
localidad,
viviendas_totales,
viviendas_ocupadas,
pct_viviendas_desocupadas
) %>%
slice_head(n = 10)
knitr::kable(
mayor_desocupacion,
digits = 2,
caption = "Diez UPZ con mayor porcentaje de viviendas desocupadas"
)
| upz_nombre | localidad | viviendas_totales | viviendas_ocupadas | pct_viviendas_desocupadas |
|---|---|---|---|---|
| Tintal Norte | Kennedy | 16184 | 9082 | 43.88 |
| Las Nieves | Santa Fe | 12994 | 9276 | 28.61 |
| La Macarena | Santa Fe | 7361 | 5795 | 21.27 |
| Parque Entrenubes | Usme | 449 | 355 | 20.94 |
| Parque Salitre | Barrios Unidos | 754 | 620 | 17.77 |
| El Refugio | Chapinero | 22261 | 18434 | 17.19 |
| Chico Lago | Chapinero | 23343 | 19458 | 16.64 |
| La Alhambra | Suba | 23749 | 20038 | 15.63 |
| Chapinero | Chapinero | 18209 | 15624 | 14.20 |
| Los Alcazares | Barrios Unidos | 21714 | 18946 | 12.75 |
knitr::kable(
menor_desocupacion,
digits = 2,
caption = "Diez UPZ con menor porcentaje de viviendas desocupadas"
)
| upz_nombre | localidad | viviendas_totales | viviendas_ocupadas | pct_viviendas_desocupadas |
|---|---|---|---|---|
| El Mochuelo | Ciudad Bolívar | 7 | 7 | 0.00 |
| San Francisco | Ciudad Bolívar | 25727 | 25689 | 0.15 |
| Patio Bonito | Kennedy | 46233 | 46145 | 0.19 |
| Tunjuelito | Tunjuelito | 12653 | 12614 | 0.31 |
| Bosa Central | Bosa | 74624 | 74387 | 0.32 |
| Lucero | Ciudad Bolívar | 59218 | 59024 | 0.33 |
| Minuto De Dios | Engativá | 38880 | 38721 | 0.41 |
| Apogeo | Bosa | 11249 | 11202 | 0.42 |
| Timiza | Kennedy | 45336 | 45076 | 0.57 |
| Kennedy Central | Kennedy | 33444 | 33250 | 0.58 |
El alumbrado público constituye una característica relevante de la infraestructura urbana y permite describir las condiciones físicas de los territorios.
Para este análisis se consideran tres variables: cantidad de luminarias, densidad de luminarias por kilómetro cuadrado y porcentaje de luminarias con tecnología LED.
Se diferencia entre la cantidad total de luminarias y su densidad territorial, debido a que las UPZ presentan extensiones geográficas distintas. La densidad permite realizar una comparación que considera el tamaño del territorio.
estadisticas_alumbrado <- upz %>%
summarise(
Media_luminarias = mean(luminarias),
Mediana_luminarias = median(luminarias),
Desv_luminarias = sd(luminarias),
Q1_luminarias = quantile(luminarias, 0.25),
Q3_luminarias = quantile(luminarias, 0.75),
Media_luminarias_km2 = mean(luminarias_km2),
Mediana_luminarias_km2 = median(luminarias_km2),
Media_led = mean(pct_luminarias_led),
Mediana_led = median(pct_luminarias_led)
)
knitr::kable(
estadisticas_alumbrado,
digits = 2,
caption = "Estadísticas descriptivas del alumbrado público"
)
| Media_luminarias | Mediana_luminarias | Desv_luminarias | Q1_luminarias | Q3_luminarias | Media_luminarias_km2 | Mediana_luminarias_km2 | Media_led | Mediana_led |
|---|---|---|---|---|---|---|---|---|
| 3138.54 | 2741.5 | 1875.89 | 1739 | 4530.75 | 908.47 | 1000 | 42.64 | 49.31 |
Se analiza la distribución de luminarias por kilómetro cuadrado mediante un histograma. Esta representación permite observar cómo se concentra la infraestructura de alumbrado entre las UPZ y reconocer posibles diferencias territoriales.
Esta variable resulta especialmente útil porque permite comparar la disponibilidad de luminarias teniendo en cuenta la extensión geográfica de cada UPZ.
ggplot(upz, aes(x = luminarias_km2)) +
geom_histogram(
bins = 20,
fill = turquesa,
color = "white",
alpha = 0.9
) +
labs(
title = "Distribución de la densidad de luminarias",
subtitle = "Cantidad de luminarias por kilómetro cuadrado en cada UPZ",
x = "Luminarias por km²",
y = "Cantidad de UPZ",
caption = "Fuente: información de alumbrado público, última actualización 2021."
) +
tema_clase
Para identificar las diferencias territoriales, se construyen dos rankings que permiten reconocer las diez UPZ con mayor y menor densidad de luminarias. Se incluyen también el área y la cantidad total de luminarias para facilitar la comparación.
mayor_alumbrado <- upz %>%
arrange(desc(luminarias_km2)) %>%
select(
upz_nombre,
localidad,
area_km2,
luminarias,
luminarias_km2,
pct_luminarias_led
) %>%
slice_head(n = 10)
menor_alumbrado <- upz %>%
arrange(luminarias_km2) %>%
select(
upz_nombre,
localidad,
area_km2,
luminarias,
luminarias_km2,
pct_luminarias_led
) %>%
slice_head(n = 10)
knitr::kable(
mayor_alumbrado,
digits = 2,
caption = "Diez UPZ con mayor densidad de luminarias"
)
| upz_nombre | localidad | area_km2 | luminarias | luminarias_km2 | pct_luminarias_led |
|---|---|---|---|---|---|
| Minuto De Dios | Engativá | 3.75 | 6561 | 1751.44 | 60.75 |
| Las Nieves | Santa Fe | 1.73 | 2863 | 1653.05 | 36.22 |
| Patio Bonito | Kennedy | 3.18 | 5157 | 1619.34 | 87.61 |
| Muzu | Puente Aranda | 2.54 | 4054 | 1597.74 | 75.85 |
| Diana Turbay | Rafael Uribe Uribe | 2.12 | 3269 | 1540.56 | 89.81 |
| Timiza | Kennedy | 4.32 | 6309 | 1460.46 | 81.80 |
| La Candelaria | Candelaria | 2.07 | 2985 | 1443.66 | 15.61 |
| Bosa Occidental | Bosa | 4.32 | 6110 | 1414.58 | 88.09 |
| Chico Lago | Chapinero | 4.24 | 5987 | 1412.14 | 38.85 |
| San Francisco | Ciudad Bolívar | 1.79 | 2516 | 1403.65 | 4.53 |
knitr::kable(
menor_alumbrado,
digits = 2,
caption = "Diez UPZ con menor densidad de luminarias"
)
| upz_nombre | localidad | area_km2 | luminarias | luminarias_km2 | pct_luminarias_led |
|---|---|---|---|---|---|
| Parque Entrenubes | Usme | 4.21 | 77 | 18.31 | 67.53 |
| Guaymaral | Suba | 4.55 | 184 | 40.42 | 0.00 |
| El Mochuelo | Ciudad Bolívar | 3.18 | 131 | 41.21 | 0.00 |
| Monte Blanco | Ciudad Bolívar | 6.98 | 388 | 55.57 | 11.86 |
| Aeropuerto El Dorado | Fontibón | 7.46 | 515 | 69.06 | 22.52 |
| La Academia | Suba | 6.74 | 534 | 79.17 | 0.37 |
| Paseo De Los Libertadores | Usaquén | 6.33 | 524 | 82.75 | 28.44 |
| Ciudad Usme | Usme | 9.29 | 1080 | 116.28 | 74.44 |
| Tintal Norte | Kennedy | 3.45 | 461 | 133.77 | 51.84 |
| Zona Franca | Fontibón | 4.93 | 1189 | 241.00 | 45.16 |
Finalmente, se explora la relación entre el porcentaje de viviendas desocupadas y la densidad de luminarias por kilómetro cuadrado.
Esta comparación permite observar si existen patrones entre ambas características del entorno urbano. Se incorpora una línea de tendencia como apoyo visual para identificar el comportamiento general de los datos.
Este ejercicio tiene un alcance exploratorio y no permite establecer relaciones de causalidad.
ggplot(
upz,
aes(
x = pct_viviendas_desocupadas,
y = luminarias_km2
)
) +
geom_point(
color = morado,
alpha = 0.7,
size = 2.5
) +
geom_smooth(
method = "lm",
se = FALSE,
color = magenta,
linewidth = 1
) +
labs(
title = "Viviendas desocupadas y densidad de alumbrado",
subtitle = "Relación exploratoria entre características del entorno urbano",
x = "Porcentaje de viviendas desocupadas",
y = "Luminarias por km²",
caption = "Fuente: información consolidada de las UPZ."
) +
tema_clase
Los resultados de este apartado permiten complementar la caracterización territorial de las UPZ mediante variables relacionadas con las condiciones de vivienda y la infraestructura de alumbrado público.
La interpretación se centrará en las diferencias observadas entre territorios, la distribución de las variables y los posibles patrones identificados en la comparación entre viviendas desocupadas y densidad de luminarias.
Se tendrá en cuenta que estos indicadores describen características del entorno urbano y que, por sí solos, no permiten explicar ni establecer causas del comportamiento delictivo.
En esta sección se exploran las condiciones socioeconómicas de las UPZ de Bogotá a partir de la información de la Encuesta Multipropósito de 2021.
Se analizan variables relacionadas con la pobreza, el ingreso promedio, la composición por estrato socioeconómico y el nivel educativo de la población. Estas características permiten ampliar la comprensión de las diferencias territoriales e incorporar elementos sociales y económicos al análisis de la inseguridad.
El propósito es identificar cómo se distribuyen estas condiciones entre las UPZ y reconocer posibles patrones que posteriormente puedan contrastarse con los indicadores de delitos y percepción de inseguridad.
Es importante tener en cuenta que la Encuesta Multipropósito presenta información agrupada para 32 UPZ. En estos casos, varias unidades territoriales comparten el mismo valor estimado. Por esta razón, los resultados deben interpretarse con precaución y no asumir que cada registro representa una observación socioeconómica independiente.
Antes de analizar las variables socioeconómicas, se revisa la cobertura de la información de la Encuesta Multipropósito.
Esta verificación permite identificar cuántas UPZ cuentan con información individual y cuántas reciben valores compartidos con otras unidades territoriales. Esta distinción es importante para interpretar correctamente las estadísticas y evitar asumir que todos los registros representan mediciones independientes.
# Revisar la cantidad de UPZ con información individual y agrupada
revision_encuesta <- upz %>%
count(em_agrupada) %>%
mutate(
Tipo_informacion = if_else(
em_agrupada,
"Información agrupada",
"Información individual"
),
Porcentaje = n / sum(n) * 100
) %>%
select(
Tipo_informacion,
Cantidad_UPZ = n,
Porcentaje
)
knitr::kable(
revision_encuesta,
digits = 2,
caption = "Cobertura de la Encuesta Multipropósito por tipo de información"
)
| Tipo_informacion | Cantidad_UPZ | Porcentaje |
|---|---|---|
| Información individual | 80 | 71.43 |
| Información agrupada | 32 | 28.57 |
La cantidad de UPZ que tienen información individual.
La cantidad de UPZ que comparten información con otras unidades territoriales.
La proporción que representa cada grupo sobre el total de UPZ.
Para caracterizar las condiciones socioeconómicas se seleccionan variables relacionadas con la pobreza, los ingresos, la composición por estrato y el nivel educativo.
Se calculan medidas de tendencia central y dispersión, incluyendo media, mediana, desviación estándar, cuartiles, valores mínimos y máximos. Estas medidas permiten reconocer las diferencias entre territorios y observar qué tan concentrados o dispersos se encuentran los indicadores.
La selección de estas variables busca representar diferentes dimensiones de las condiciones de vida, evitando limitar el análisis a una sola característica económica.
# Seleccionar las variables socioeconómicas de interés
variables_socioeconomicas <- upz %>%
select(
pct_pobreza,
salario_promedio,
pct_estrato_1_2,
pct_estrato_3_4,
pct_estrato_5_6,
anios_educacion_15mas
)
# Calcular estadísticas descriptivas
estadisticas_socioeconomicas <- variables_socioeconomicas %>%
summarise(
across(
everything(),
list(
Media = ~ mean(.),
Mediana = ~ median(.),
Desviacion = ~ sd(.),
Minimo = ~ min(.),
Q1 = ~ quantile(., 0.25),
Q3 = ~ quantile(., 0.75),
Maximo = ~ max(.)
)
)
) %>%
pivot_longer(
cols = everything(),
names_to = c("Variable", "Estadistica"),
names_sep = "_(?=[^_]+$)",
values_to = "Valor"
) %>%
pivot_wider(
names_from = Estadistica,
values_from = Valor
)
knitr::kable(
estadisticas_socioeconomicas,
digits = 2,
caption = "Estadísticas descriptivas de las variables socioeconómicas"
)
| Variable | Media | Mediana | Desviacion | Minimo | Q1 | Q3 | Maximo |
|---|---|---|---|---|---|---|---|
| pct_pobreza | 4.01 | 2.58 | 3.95 | 0.07 | 0.98 | 5.82 | 16.56 |
| salario_promedio | 2580110.85 | 1866476.08 | 1735971.89 | 845688.39 | 1227872.19 | 3689024.52 | 7977532.49 |
| pct_estrato_1_2 | 40.49 | 20.48 | 43.01 | 0.00 | 0.56 | 97.04 | 100.00 |
| pct_estrato_3_4 | 51.62 | 69.13 | 41.59 | 0.00 | 2.15 | 93.17 | 100.00 |
| pct_estrato_5_6 | 7.79 | 0.00 | 21.97 | 0.00 | 0.00 | 0.62 | 98.94 |
| anios_educacion_15mas | 11.89 | 11.80 | 2.23 | 7.98 | 9.89 | 13.57 | 15.91 |
El porcentaje de pobreza permite aproximarse a las condiciones económicas de la población de cada territorio.
Mediante un histograma se examina la distribución de este indicador entre las UPZ, buscando identificar dónde se concentran los valores y si existen territorios con porcentajes considerablemente superiores al comportamiento general.
Este análisis permite reconocer diferencias socioeconómicas que posteriormente podrán contrastarse con los indicadores de seguridad.
ggplot(upz, aes(x = pct_pobreza)) +
geom_histogram(
bins = 20,
fill = magenta,
color = "white",
alpha = 0.9
) +
labs(
title = "Distribución del porcentaje de pobreza por UPZ",
subtitle = "Porcentaje de personas clasificadas como pobres",
x = "Población en condición de pobreza (%)",
y = "Cantidad de UPZ",
caption = "Fuente: Encuesta Multipropósito DANE, 2021."
) +
tema_clase
Para complementar el gráfico, identificamos los territorios con mayores y menores porcentajes de pobreza.
ranking_pobreza <- upz %>%
arrange(desc(pct_pobreza)) %>%
select(
upz_nombre,
localidad,
em_agrupada,
pct_pobreza
)
knitr::kable(
ranking_pobreza %>% slice_head(n = 10),
digits = 2,
caption = "Diez UPZ con mayor porcentaje de pobreza"
)
| upz_nombre | localidad | em_agrupada | pct_pobreza |
|---|---|---|---|
| Alfonso Lopez | Usme | TRUE | 16.56 |
| Ciudad Usme | Usme | TRUE | 16.56 |
| La Flora | Usme | FALSE | 15.09 |
| Lourdes | Santa Fe | FALSE | 14.12 |
| El Mochuelo | Ciudad Bolívar | TRUE | 12.89 |
| Monte Blanco | Ciudad Bolívar | TRUE | 12.89 |
| El Tesoro | Ciudad Bolívar | TRUE | 12.89 |
| Lucero | Ciudad Bolívar | FALSE | 10.47 |
| Danubio | Usme | TRUE | 10.31 |
| Parque Entrenubes | Usme | TRUE | 10.31 |
knitr::kable(
ranking_pobreza %>%
arrange(pct_pobreza) %>%
slice_head(n = 10),
digits = 2,
caption = "Diez UPZ con menor porcentaje de pobreza"
)
| upz_nombre | localidad | em_agrupada | pct_pobreza |
|---|---|---|---|
| Country Club | Usaquén | TRUE | 0.07 |
| Santa Barbara | Usaquén | TRUE | 0.07 |
| Granjas De Techo | Fontibón | FALSE | 0.09 |
| Ciudad Salitre Oriental | Teusaquillo | FALSE | 0.12 |
| La Alhambra | Suba | FALSE | 0.22 |
| Parque Simon Bolivar - Can | Teusaquillo | TRUE | 0.26 |
| La Esmeralda | Teusaquillo | TRUE | 0.26 |
| Ciudad Salitre Occidental | Fontibón | FALSE | 0.26 |
| Modelia | Fontibón | FALSE | 0.31 |
| Teusaquillo | Teusaquillo | FALSE | 0.33 |
El salario promedio permite explorar las diferencias económicas entre los territorios.
Se utiliza un histograma para observar la distribución de los ingresos y reconocer posibles concentraciones o valores extremos. También se identifican las UPZ con mayores y menores salarios promedio.
Debido a que los ingresos pueden presentar diferencias importantes entre territorios, se compararán la media y la mediana para evaluar la influencia de los valores extremos sobre el promedio.
ggplot(upz, aes(x = salario_promedio)) +
geom_histogram(
bins = 20,
fill = turquesa,
color = "white",
alpha = 0.9
) +
labs(
title = "Distribución del salario promedio por UPZ",
subtitle = "Ingreso mensual promedio reportado en la Encuesta Multipropósito",
x = "Salario promedio mensual (pesos)",
y = "Cantidad de UPZ",
caption = "Fuente: Encuesta Multipropósito DANE, 2021."
) +
scale_x_continuous(
labels = scales::label_number(
prefix = "$",
big.mark = ".",
decimal.mark = ","
)
) +
tema_clase
Ranking de salarios:
ranking_salario <- upz %>%
arrange(desc(salario_promedio)) %>%
select(
upz_nombre,
localidad,
em_agrupada,
salario_promedio
)
knitr::kable(
ranking_salario %>% slice_head(n = 10),
digits = 0,
caption = "Diez UPZ con mayor salario promedio"
)
| upz_nombre | localidad | em_agrupada | salario_promedio |
|---|---|---|---|
| El Refugio | Chapinero | TRUE | 7977532 |
| Chico Lago | Chapinero | TRUE | 7977532 |
| Country Club | Usaquén | TRUE | 7624587 |
| Santa Barbara | Usaquén | TRUE | 7624587 |
| Usaquen | Usaquén | FALSE | 6893541 |
| La Alhambra | Suba | FALSE | 5907659 |
| Ciudad Salitre Oriental | Teusaquillo | FALSE | 5887923 |
| Niza | Suba | FALSE | 5276414 |
| Los Cedros | Usaquén | FALSE | 5226504 |
| Pardo Rubio | Chapinero | TRUE | 4981378 |
knitr::kable(
ranking_salario %>%
arrange(salario_promedio) %>%
slice_head(n = 10),
digits = 0,
caption = "Diez UPZ con menor salario promedio"
)
| upz_nombre | localidad | em_agrupada | salario_promedio |
|---|---|---|---|
| La Flora | Usme | FALSE | 845688 |
| Lucero | Ciudad Bolívar | FALSE | 949613 |
| Patio Bonito | Kennedy | FALSE | 956988 |
| El Mochuelo | Ciudad Bolívar | TRUE | 966749 |
| Monte Blanco | Ciudad Bolívar | TRUE | 966749 |
| El Tesoro | Ciudad Bolívar | TRUE | 966749 |
| Jerusalem | Ciudad Bolívar | FALSE | 985043 |
| Alfonso Lopez | Usme | TRUE | 1007783 |
| Ciudad Usme | Usme | TRUE | 1007783 |
| Diana Turbay | Rafael Uribe Uribe | FALSE | 1036645 |
La composición por estrato permite observar las características socioeconómicas de las viviendas de cada UPZ.
Para este análisis se consideran tres grupos: estratos 1 y 2, estratos 3 y 4, y estratos 5 y 6. La comparación permite identificar qué grupos tienen mayor participación en cada territorio y reconocer las diferencias en la composición socioeconómica de las UPZ.
Es importante recordar que los porcentajes representan la distribución de viviendas por grupo de estrato y no deben interpretarse como una medición directa del ingreso de todos sus habitantes.
# Calcular el promedio de participación de cada grupo de estrato
promedio_estratos <- upz %>%
summarise(
`Estratos 1 y 2` = mean(pct_estrato_1_2),
`Estratos 3 y 4` = mean(pct_estrato_3_4),
`Estratos 5 y 6` = mean(pct_estrato_5_6)
) %>%
pivot_longer(
cols = everything(),
names_to = "Grupo_estrato",
values_to = "Porcentaje_promedio"
)
knitr::kable(
promedio_estratos,
digits = 2,
caption = "Participación promedio de los grupos de estrato entre las UPZ"
)
| Grupo_estrato | Porcentaje_promedio |
|---|---|
| Estratos 1 y 2 | 40.49 |
| Estratos 3 y 4 | 51.62 |
| Estratos 5 y 6 | 7.79 |
Ahora visualizamos los resultados:
ggplot(
promedio_estratos,
aes(
x = Grupo_estrato,
y = Porcentaje_promedio
)
) +
geom_col(
fill = morado,
width = 0.65
) +
labs(
title = "Composición promedio por grupos de estrato",
subtitle = "Participación promedio de cada grupo entre las UPZ",
x = "Grupo de estrato",
y = "Porcentaje promedio (%)",
caption = "Fuente: Encuesta Multipropósito DANE, 2021."
) +
tema_clase
Una precisión: este gráfico muestra el promedio simple de los
porcentajes de las UPZ, no la distribución ponderada de todas las
viviendas de Bogotá.
El nivel educativo constituye otra dimensión importante para caracterizar las condiciones socioeconómicas de los territorios.
En este apartado se analiza el promedio de años de educación de las personas de 15 años o más. Esta variable permite explorar las diferencias educativas entre UPZ y complementar la caracterización económica realizada anteriormente.
estadisticas_educacion <- upz %>%
summarise(
Media = mean(anios_educacion_15mas),
Mediana = median(anios_educacion_15mas),
Desviacion_estandar = sd(anios_educacion_15mas),
Minimo = min(anios_educacion_15mas),
Q1 = quantile(anios_educacion_15mas, 0.25),
Q3 = quantile(anios_educacion_15mas, 0.75),
Maximo = max(anios_educacion_15mas)
)
knitr::kable(
estadisticas_educacion,
digits = 2,
caption = "Estadísticas descriptivas del nivel educativo por UPZ"
)
| Media | Mediana | Desviacion_estandar | Minimo | Q1 | Q3 | Maximo |
|---|---|---|---|---|---|---|
| 11.89 | 11.8 | 2.23 | 7.98 | 9.89 | 13.57 | 15.91 |
Distribución del nivel educativo:
ggplot(upz, aes(x = anios_educacion_15mas)) +
geom_histogram(
bins = 20,
fill = magenta,
color = "white",
alpha = 0.9
) +
labs(
title = "Distribución de los años promedio de educación",
subtitle = "Personas de 15 años o más por UPZ",
x = "Años promedio de educación",
y = "Cantidad de UPZ",
caption = "Fuente: Encuesta Multipropósito DANE, 2021."
) +
tema_clase
Para complementar la descripción individual de las variables, se explora la relación entre el porcentaje de pobreza y el salario promedio mensual de las UPZ.
Se utiliza un diagrama de dispersión, en el que cada punto representa una unidad territorial. Se incorpora una línea de tendencia para observar el comportamiento general de ambas variables.
Esta comparación permite identificar posibles asociaciones entre las condiciones de pobreza y los ingresos promedio, sin asumir que una variable sea necesariamente la causa de la otra.
ggplot(
upz,
aes(
x = pct_pobreza,
y = salario_promedio
)
) +
geom_point(
color = morado,
alpha = 0.7,
size = 2.5
) +
geom_smooth(
method = "lm",
se = FALSE,
color = magenta,
linewidth = 1
) +
labs(
title = "Relación entre pobreza y salario promedio",
subtitle = "Comparación de condiciones socioeconómicas entre UPZ",
x = "Porcentaje de pobreza (%)",
y = "Salario promedio mensual (pesos)",
caption = "Fuente: Encuesta Multipropósito DANE, 2021."
) +
scale_y_continuous(
labels = scales::label_number(
prefix = "$",
big.mark = ".",
decimal.mark = ","
)
) +
tema_clase
El análisis socioeconómico permite ampliar la caracterización de las UPZ mediante indicadores relacionados con la pobreza, los ingresos, la composición por estrato y el nivel educativo.
A partir de las estadísticas descriptivas y las visualizaciones se examinarán las diferencias entre territorios, la dispersión de los indicadores y los posibles patrones entre las condiciones económicas y educativas.
Estos resultados servirán como referencia para los análisis posteriores, especialmente al explorar posibles relaciones entre las características socioeconómicas y los indicadores de seguridad.
La percepción de inseguridad constituye una dimensión importante para comprender las condiciones de seguridad de un territorio. A diferencia de los registros de delitos denunciados, este indicador recoge la experiencia y percepción de las personas frente a los problemas de inseguridad presentes en el entorno de su vivienda.
En esta sección se exploran las diferencias entre UPZ en cuanto a la percepción de inseguridad, algunas condiciones del entorno y la accesibilidad a los servicios de policía. El propósito es identificar patrones y posibles asociaciones que permitan ampliar la comprensión de las características territoriales relacionadas con la seguridad.
Para desarrollar este análisis se seleccionamos seis variables de la Encuesta Multipropósito, relacionadas con la percepción de inseguridad, las condiciones del entorno y la accesibilidad a los servicios de policía.
La selección permite explorar diferentes características territoriales que pueden aportar información para comprender las diferencias entre las UPZ. Se analizará el porcentaje de percepción de inseguridad, la cercanía a determinados elementos del entorno y el tiempo promedio caminando hasta un CAI o estación de policía.
# Selección de variables de percepción y condiciones del entorno
variables_entorno <- upz %>%
select(
pct_percibe_inseguridad,
pct_cerca_ollas,
pct_cerca_bares,
pct_cerca_lotes_oscuros,
pct_cerca_basureros,
min_cai_policia
)
# Visualización de las primeras observaciones
head(variables_entorno)
| pct_percibe_inseguridad | pct_cerca_ollas | pct_cerca_bares | pct_cerca_lotes_oscuros | pct_cerca_basureros | min_cai_policia |
|---|---|---|---|---|---|
| 36.18 | 17.53 | 15.68 | 24.15 | 6.13 | 21.66 |
| 40.88 | 7.43 | 17.03 | 16.71 | 1.35 | 24.50 |
| 40.88 | 7.43 | 17.03 | 16.71 | 1.35 | 24.50 |
| 65.43 | 17.53 | 15.68 | 24.15 | 6.13 | 18.39 |
| 36.18 | 17.53 | 15.68 | 24.15 | 6.13 | 21.66 |
| 49.84 | 25.91 | 15.41 | 19.15 | 8.30 | 25.32 |
Como punto de partida, se calculan las principales medidas de estadística descriptiva para las variables seleccionadas. Este ejercicio permite conocer los niveles generales de percepción de inseguridad, las condiciones del entorno y los tiempos promedio de desplazamiento hasta los servicios de policía.
Se consideran medidas de tendencia central, dispersión y posición, con el propósito de identificar tanto el comportamiento general como las diferencias existentes entre las UPZ.
# Cálculo de estadísticas descriptivas
estadisticas_entorno <- variables_entorno %>%
summarise(
across(
everything(),
list(
Media = ~mean(.),
Mediana = ~median(.),
Desviacion = ~sd(.),
Minimo = ~min(.),
Q1 = ~quantile(., 0.25),
Q3 = ~quantile(., 0.75),
Maximo = ~max(.)
)
)
) %>%
pivot_longer(
cols = everything(),
names_to = c("Variable", "Estadistica"),
names_sep = "_(?=[^_]+$)",
values_to = "Valor"
) %>%
pivot_wider(
names_from = Estadistica,
values_from = Valor
)
knitr::kable(
estadisticas_entorno,
digits = 2,
caption = "Estadísticas descriptivas de percepción de inseguridad y condiciones del entorno"
)
| Variable | Media | Mediana | Desviacion | Minimo | Q1 | Q3 | Maximo |
|---|---|---|---|---|---|---|---|
| pct_percibe_inseguridad | 60.84 | 65.97 | 18.87 | 17.45 | 44.75 | 74.33 | 92.11 |
| pct_cerca_ollas | 21.59 | 20.56 | 15.85 | 0.31 | 9.05 | 31.11 | 75.60 |
| pct_cerca_bares | 14.42 | 12.96 | 10.76 | 0.64 | 5.71 | 19.40 | 53.91 |
| pct_cerca_lotes_oscuros | 19.98 | 18.16 | 12.56 | 0.64 | 11.68 | 26.01 | 59.76 |
| pct_cerca_basureros | 9.50 | 6.12 | 9.63 | 0.24 | 2.72 | 12.11 | 45.01 |
| min_cai_policia | 18.36 | 17.64 | 4.57 | 10.06 | 15.38 | 20.84 | 35.11 |
La percepción de inseguridad permite aproximarse a la manera en que los habitantes reconocen los problemas de seguridad presentes en su entorno cotidiano.
Para explorar su comportamiento entre las UPZ, se utiliza un histograma que permite visualizar la distribución de los porcentajes reportados. Esta representación facilita identificar los rangos de mayor concentración, la dispersión de los valores y posibles diferencias entre los territorios.
El análisis permite reconocer si la percepción de inseguridad presenta un comportamiento relativamente homogéneo o si existen diferencias importantes entre las zonas estudiadas.
ggplot(
upz,
aes(x = pct_percibe_inseguridad)
) +
geom_histogram(
bins = 15,
fill = magenta,
color = "white",
alpha = 0.85
) +
labs(
title = "Distribución de la percepción de inseguridad",
subtitle = "Porcentaje reportado en las UPZ de Bogotá",
x = "Percepción de inseguridad (%)",
y = "Cantidad de UPZ",
caption = "Fuente: Encuesta Multipropósito DANE, 2021."
) +
scale_x_continuous(
labels = scales::label_number(suffix = "%")
) +
tema_clase
Con el propósito de identificar las diferencias territoriales, se construyen dos rankings que permiten reconocer las diez UPZ con mayores y menores porcentajes de percepción de inseguridad.
Esta comparación facilita identificar los territorios que presentan los valores más altos y bajos del indicador, complementando la lectura general obtenida mediante el histograma.
Adicionalmente, se incluye la variable em_agrupada para
identificar las UPZ cuyos resultados provienen de estimaciones
compartidas con otros territorios, condición que debe tenerse en cuenta
al interpretar las posiciones del ranking.
# Diez UPZ con mayor percepción de inseguridad
mayor_percepcion <- upz %>%
arrange(desc(pct_percibe_inseguridad)) %>%
select(
upz_nombre,
localidad,
em_agrupada,
pct_percibe_inseguridad
) %>%
slice_head(n = 10)
knitr::kable(
mayor_percepcion,
digits = 2,
caption = "Diez UPZ con mayor percepción de inseguridad"
)
| upz_nombre | localidad | em_agrupada | pct_percibe_inseguridad |
|---|---|---|---|
| Corabastos | Kennedy | FALSE | 92.11 |
| Tunjuelito | Tunjuelito | FALSE | 91.82 |
| Bosa Central | Bosa | FALSE | 89.69 |
| El Mochuelo | Ciudad Bolívar | TRUE | 86.83 |
| Monte Blanco | Ciudad Bolívar | TRUE | 86.83 |
| El Tesoro | Ciudad Bolívar | TRUE | 86.83 |
| Patio Bonito | Kennedy | FALSE | 86.07 |
| La Gloria | San Cristóbal | FALSE | 86.04 |
| Las Cruces | Santa Fe | FALSE | 85.97 |
| La Sabana | Los Mártires | FALSE | 83.45 |
# Diez UPZ con menor percepción de inseguridad
menor_percepcion <- upz %>%
arrange(pct_percibe_inseguridad) %>%
select(
upz_nombre,
localidad,
em_agrupada,
pct_percibe_inseguridad
) %>%
slice_head(n = 10)
knitr::kable(
menor_percepcion,
digits = 2,
caption = "Diez UPZ con menor percepción de inseguridad"
)
| upz_nombre | localidad | em_agrupada | pct_percibe_inseguridad |
|---|---|---|---|
| Casa Blanca Suba | Suba | FALSE | 17.45 |
| Bolivia | Engativá | FALSE | 19.37 |
| Ciudad Salitre Oriental | Teusaquillo | FALSE | 20.37 |
| El Refugio | Chapinero | TRUE | 21.48 |
| Chico Lago | Chapinero | TRUE | 21.48 |
| Usaquen | Usaquén | FALSE | 24.45 |
| Ciudad Salitre Occidental | Fontibón | FALSE | 26.72 |
| Capellania | Fontibón | TRUE | 32.58 |
| Aeropuerto El Dorado | Fontibón | TRUE | 32.58 |
| Parque Simon Bolivar - Can | Teusaquillo | TRUE | 32.98 |
Las condiciones del entorno constituyen una dimensión complementaria para comprender las características territoriales asociadas con la percepción de inseguridad. En este apartado se analizan cuatro indicadores relacionados con la cercanía a expendios de droga, bares o prostíbulos, lotes baldíos o sitios oscuros y basureros.
Para facilitar la comparación, se calcula el promedio simple de los porcentajes reportados por las UPZ y se presentan los resultados mediante una tabla y un gráfico de barras. Esto permite reconocer cuáles de las condiciones analizadas presentan una mayor presencia promedio en los territorios estudiados.
Es importante aclarar que estos resultados corresponden al promedio de los porcentajes de las UPZ y no al porcentaje agregado de viviendas afectadas en Bogotá. Cada UPZ tiene el mismo peso en el cálculo, independientemente de su cantidad de viviendas.
# Cálculo del promedio simple de cada condición entre las UPZ
promedios_entorno <- upz %>%
summarise(
Ollas = mean(pct_cerca_ollas),
Bares = mean(pct_cerca_bares),
Lotes_oscuros = mean(pct_cerca_lotes_oscuros),
Basureros = mean(pct_cerca_basureros)
) %>%
pivot_longer(
cols = everything(),
names_to = "Condicion",
values_to = "Promedio"
) %>%
arrange(desc(Promedio))
# Presentación de resultados
knitr::kable(
promedios_entorno,
digits = 2,
caption = "Promedio simple de las condiciones del entorno por UPZ"
)
| Condicion | Promedio |
|---|---|
| Ollas | 21.59 |
| Lotes_oscuros | 19.98 |
| Bares | 14.42 |
| Basureros | 9.50 |
Ahora representamos los resultados mediante un gráfico de barras.
ggplot(
promedios_entorno,
aes(
x = reorder(Condicion, Promedio),
y = Promedio
)
) +
geom_col(
fill = turquesa,
width = 0.65
) +
coord_flip() +
labs(
title = "Condiciones del entorno reportadas en las UPZ",
subtitle = "Promedio simple de los porcentajes por UPZ",
x = NULL,
y = "Promedio (%)",
caption = "Fuente: Encuesta Multipropósito DANE, 2021."
) +
scale_y_continuous(
labels = scales::label_number(suffix = "%")
) +
tema_clase
La accesibilidad a los servicios de policía representa otra característica relevante para el análisis territorial. En este apartado se examina el tiempo promedio caminando desde las viviendas hasta un CAI o estación de policía, con el propósito de identificar diferencias entre las UPZ.
Se utilizan medidas descriptivas, un histograma y una comparación de los territorios con mayores y menores tiempos de desplazamiento. De esta manera, se busca reconocer cómo se distribuye la accesibilidad a estos servicios en las zonas estudiadas.
Este indicador representa un tiempo promedio de desplazamiento y no debe interpretarse como una medida directa de presencia policial, cobertura operativa o tiempo de respuesta ante una emergencia.
estadisticas_cai <- upz %>%
summarise(
Media = mean(min_cai_policia),
Mediana = median(min_cai_policia),
Desviacion = sd(min_cai_policia),
Minimo = min(min_cai_policia),
Q1 = quantile(min_cai_policia, 0.25),
Q3 = quantile(min_cai_policia, 0.75),
Maximo = max(min_cai_policia)
)
knitr::kable(
estadisticas_cai,
digits = 2,
caption = "Estadísticas descriptivas del tiempo de desplazamiento hasta un CAI"
)
| Media | Mediana | Desviacion | Minimo | Q1 | Q3 | Maximo |
|---|---|---|---|---|---|---|
| 18.36 | 17.64 | 4.57 | 10.06 | 15.38 | 20.84 | 35.11 |
Ahora visualizamos la distribución de los tiempos.
ggplot(
upz,
aes(x = min_cai_policia)
) +
geom_histogram(
bins = 15,
fill = morado,
color = "white",
alpha = 0.85
) +
labs(
title = "Distribución del tiempo de desplazamiento a un CAI",
subtitle = "Tiempo promedio caminando por UPZ",
x = "Minutos caminando",
y = "Cantidad de UPZ",
caption = "Fuente: Encuesta Multipropósito DANE, 2021."
) +
tema_clase
Finalmente, identificamos las diez UPZ con mayores y menores tiempos.
# Diez UPZ con mayor tiempo de desplazamiento
mayor_tiempo_cai <- upz %>%
arrange(desc(min_cai_policia)) %>%
select(
upz_nombre,
localidad,
em_agrupada,
min_cai_policia
) %>%
slice_head(n = 10)
knitr::kable(
mayor_tiempo_cai,
digits = 2,
caption = "Diez UPZ con mayor tiempo promedio caminando hasta un CAI"
)
| upz_nombre | localidad | em_agrupada | min_cai_policia |
|---|---|---|---|
| San Isidro - Patios | Chapinero | FALSE | 35.11 |
| Fontibon San Pablo | Fontibón | FALSE | 28.50 |
| Quinta Paredes | Teusaquillo | FALSE | 27.64 |
| El Mochuelo | Ciudad Bolívar | TRUE | 27.39 |
| Monte Blanco | Ciudad Bolívar | TRUE | 27.39 |
| El Tesoro | Ciudad Bolívar | TRUE | 27.39 |
| Zona Franca | Fontibón | FALSE | 27.00 |
| Capellania | Fontibón | TRUE | 26.31 |
| Aeropuerto El Dorado | Fontibón | TRUE | 26.31 |
| San Cristobal Norte | Usaquén | FALSE | 25.32 |
# Diez UPZ con menor tiempo de desplazamiento
menor_tiempo_cai <- upz %>%
arrange(min_cai_policia) %>%
select(
upz_nombre,
localidad,
em_agrupada,
min_cai_policia
) %>%
slice_head(n = 10)
knitr::kable(
menor_tiempo_cai,
digits = 2,
caption = "Diez UPZ con menor tiempo promedio caminando hasta un CAI"
)
| upz_nombre | localidad | em_agrupada | min_cai_policia |
|---|---|---|---|
| Sagrado Corazon | Santa Fe | TRUE | 10.06 |
| Las Nieves | Santa Fe | TRUE | 10.06 |
| Teusaquillo | Teusaquillo | FALSE | 10.36 |
| La Macarena | Santa Fe | FALSE | 10.95 |
| Lourdes | Santa Fe | FALSE | 11.39 |
| Restrepo | Antonio Nariño | FALSE | 12.17 |
| La Candelaria | Candelaria | FALSE | 12.73 |
| Los Alcazares | Barrios Unidos | FALSE | 12.78 |
| Galerias | Teusaquillo | FALSE | 12.79 |
| Danubio | Usme | TRUE | 12.88 |
Después de analizar individualmente la percepción de inseguridad, las condiciones del entorno y la accesibilidad a los servicios de policía, se exploran las posibles relaciones entre estas variables.
El propósito es identificar si las UPZ que presentan mayores porcentajes de percepción de inseguridad también registran mayores porcentajes de viviendas cercanas a expendios de droga, bares o prostíbulos, lotes baldíos o sitios oscuros y basureros. De igual manera, se examina la posible relación entre la percepción de inseguridad y el tiempo promedio de desplazamiento caminando hasta un CAI o estación de policía.
Para este ejercicio se utilizan gráficos de dispersión y el coeficiente de correlación de Spearman. Esta medida permite explorar la dirección y la intensidad de las asociaciones entre las variables, sin asumir necesariamente una relación lineal.
Los resultados deben interpretarse como asociaciones exploratorias y no como evidencia de causalidad. Adicionalmente, se debe considerar que algunas estimaciones de la Encuesta Multipropósito se encuentran agrupadas entre varias UPZ, lo que limita la independencia de las observaciones y exige precaución al comparar los resultados.
# Preparación de las variables para comparar las relaciones
relaciones_entorno <- upz %>%
select(
upz_nombre,
pct_percibe_inseguridad,
pct_cerca_ollas,
pct_cerca_bares,
pct_cerca_lotes_oscuros,
pct_cerca_basureros,
min_cai_policia
) %>%
pivot_longer(
cols = c(
pct_cerca_ollas,
pct_cerca_bares,
pct_cerca_lotes_oscuros,
pct_cerca_basureros,
min_cai_policia
),
names_to = "Condicion",
values_to = "Valor"
) %>%
mutate(
Condicion = recode(
Condicion,
pct_cerca_ollas = "Cercanía a expendios de droga",
pct_cerca_bares = "Cercanía a bares o prostíbulos",
pct_cerca_lotes_oscuros = "Cercanía a lotes oscuros",
pct_cerca_basureros = "Cercanía a basureros",
min_cai_policia = "Tiempo de desplazamiento a un CAI"
)
)
# Gráfico de dispersión por condición del entorno
ggplot(
relaciones_entorno,
aes(
x = Valor,
y = pct_percibe_inseguridad
)
) +
geom_point(
color = turquesa,
alpha = 0.65,
size = 2
) +
geom_smooth(
method = "lm",
se = FALSE,
color = magenta,
linewidth = 0.8
) +
facet_wrap(
~Condicion,
scales = "free_x"
) +
labs(
title = "Percepción de inseguridad y condiciones del entorno",
subtitle = "Relación exploratoria entre variables por UPZ",
x = "Valor de la condición analizada",
y = "Percepción de inseguridad (%)",
caption = "Fuente: Encuesta Multipropósito DANE, 2021."
) +
tema_clase
La línea representa una tendencia lineal de referencia. No significa que exista una relación causal.
Con este cálculo podremos complementar visualmente los gráficos y comparar la intensidad de las asociaciones mediante valores entre -1 y 1.
# Selección de variables para el análisis de correlación
datos_correlacion_entorno <- upz %>%
select(
pct_percibe_inseguridad,
pct_cerca_ollas,
pct_cerca_bares,
pct_cerca_lotes_oscuros,
pct_cerca_basureros,
min_cai_policia
)
# Cálculo de la matriz de correlaciones de Spearman
matriz_correlacion_entorno <- cor(
datos_correlacion_entorno,
method = "spearman",
use = "complete.obs"
)
# Presentación de la matriz
knitr::kable(
round(matriz_correlacion_entorno, 2),
caption = "Matriz de correlaciones de Spearman entre percepción de inseguridad y condiciones del entorno"
)
| pct_percibe_inseguridad | pct_cerca_ollas | pct_cerca_bares | pct_cerca_lotes_oscuros | pct_cerca_basureros | min_cai_policia | |
|---|---|---|---|---|---|---|
| pct_percibe_inseguridad | 1.00 | 0.67 | 0.23 | 0.33 | 0.61 | 0.02 |
| pct_cerca_ollas | 0.67 | 1.00 | 0.52 | 0.72 | 0.83 | 0.05 |
| pct_cerca_bares | 0.23 | 0.52 | 1.00 | 0.40 | 0.39 | -0.09 |
| pct_cerca_lotes_oscuros | 0.33 | 0.72 | 0.40 | 1.00 | 0.76 | 0.35 |
| pct_cerca_basureros | 0.61 | 0.83 | 0.39 | 0.76 | 1.00 | 0.04 |
| min_cai_policia | 0.02 | 0.05 | -0.09 | 0.35 | 0.04 | 1.00 |
Para complementar el análisis de las relaciones entre las variables, se construye una matriz de correlaciones representada mediante un mapa de calor. Esta visualización permite identificar de manera conjunta la dirección y la intensidad de las asociaciones entre la percepción de inseguridad, las condiciones del entorno y el tiempo de desplazamiento hasta los servicios de policía.
Se utiliza el coeficiente de correlación de Spearman, cuyos valores oscilan entre -1 y 1. Los valores positivos representan asociaciones directas, mientras que los negativos indican asociaciones inversas. Los valores cercanos a cero reflejan asociaciones monotónicas débiles.
La representación mediante colores facilita la identificación de patrones y permite comparar visualmente las relaciones entre las variables seleccionadas.
# Cálculo de la matriz de correlaciones de Spearman
matriz_correlacion_entorno <- upz %>%
select(
pct_percibe_inseguridad,
pct_cerca_ollas,
pct_cerca_bares,
pct_cerca_lotes_oscuros,
pct_cerca_basureros,
min_cai_policia
) %>%
cor(
method = "spearman",
use = "complete.obs"
)
# Transformación de la matriz a formato largo
correlaciones_largas <- as.data.frame(
as.table(matriz_correlacion_entorno)
) %>%
rename(
Variable_1 = Var1,
Variable_2 = Var2,
Correlacion = Freq
)
# Construcción del mapa de calor
ggplot(
correlaciones_largas,
aes(
x = Variable_1,
y = Variable_2,
fill = Correlacion
)
) +
geom_tile(
color = "white",
linewidth = 1
) +
geom_text(
aes(label = round(Correlacion, 2)),
color = "black",
size = 3.5
) +
scale_fill_gradient2(
low = morado,
mid = "white",
high = magenta,
midpoint = 0,
limits = c(-1, 1),
name = "Correlación"
) +
labs(
title = "Mapa de calor de correlaciones",
subtitle = "Percepción de inseguridad y condiciones del entorno",
x = NULL,
y = NULL,
caption = "Método: Spearman | Fuente: Encuesta Multipropósito DANE, 2021."
) +
coord_fixed() +
tema_clase +
theme(
axis.text.x = element_text(
angle = 45,
hjust = 1,
color = morado
),
axis.text.y = element_text(
color = morado
),
panel.grid = element_blank(),
legend.position = "right"
)
En esta sección se analiza el comportamiento de los delitos de alto impacto registrados en las UPZ de Bogotá, con el propósito de identificar diferencias territoriales en la cantidad de denuncias y en las tasas de ocurrencia por habitante.
A diferencia del análisis anterior, centrado en la percepción de inseguridad y las condiciones del entorno, este apartado utiliza registros administrativos de delitos denunciados. De esta manera, se busca complementar la exploración territorial mediante información sobre homicidios, lesiones personales, hurtos y violencia intrafamiliar, entre otras categorías.
Para el análisis se consideran dos medidas principales: el número de casos registrados y la tasa por cada 10.000 habitantes. La primera permite dimensionar el volumen de denuncias, mientras que la segunda facilita la comparación entre UPZ con tamaños poblacionales diferentes.
Es importante señalar que los registros corresponden al periodo comprendido entre enero y julio de 2023, por lo que no representan el comportamiento de todo el año. Además, se trata de denuncias y no de la totalidad de los hechos delictivos ocurridos, debido a la posible existencia de subregistro.
Finalmente, las tasas deben interpretarse con precaución en las UPZ con poblaciones reducidas, ya que un número pequeño de casos puede producir valores relativamente elevados.
# Selección de variables relacionadas con los delitos de alto impacto
variables_delitos <- upz %>%
select(
upz_cod,
upz_nombre,
localidad,
poblacion,
starts_with("casos_"),
starts_with("tasa_")
)
# Revisar las primeras observaciones
head(variables_delitos)
| upz_cod | upz_nombre | localidad | poblacion | casos_homicidios | casos_lesiones | casos_hurto_personas | casos_hurto_residencias | casos_hurto_automotor | casos_hurto_bicicletas | casos_hurto_comercio | casos_hurto_celulares | casos_hurto_motos | casos_violencia_intrafamiliar | casos_total | tasa_homicidios | tasa_lesiones | tasa_hurto_personas | tasa_hurto_residencias | tasa_hurto_automotor | tasa_hurto_bicicletas | tasa_hurto_comercio | tasa_hurto_celulares | tasa_hurto_motos | tasa_violencia_intrafamiliar | tasa_total |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | Paseo De Los Libertadores | Usaquén | 2690 | 0 | 8 | 44 | 1 | 0 | 1 | 3 | 17 | 0 | 0 | 74 | 0.00 | 29.74 | 163.57 | 3.72 | 0.00 | 3.72 | 11.15 | 63.20 | 0.00 | 0.00 | 275.09 |
| 2 | La Academia | Suba | 5260 | 1 | 3 | 75 | 0 | 3 | 1 | 9 | 26 | 0 | 5 | 123 | 1.90 | 5.70 | 142.59 | 0.00 | 5.70 | 1.90 | 17.11 | 49.43 | 0.00 | 9.51 | 233.84 |
| 3 | Guaymaral | Suba | 2692 | 0 | 1 | 29 | 0 | 0 | 2 | 2 | 9 | 0 | 2 | 45 | 0.00 | 3.71 | 107.73 | 0.00 | 0.00 | 7.43 | 7.43 | 33.43 | 0.00 | 7.43 | 167.16 |
| 9 | Verbenal | Usaquén | 131999 | 3 | 104 | 386 | 29 | 19 | 17 | 26 | 125 | 30 | 205 | 944 | 0.23 | 7.88 | 29.24 | 2.20 | 1.44 | 1.29 | 1.97 | 9.47 | 2.27 | 15.53 | 71.52 |
| 10 | La Uribe | Usaquén | 37014 | 1 | 26 | 328 | 31 | 4 | 14 | 47 | 129 | 1 | 40 | 621 | 0.27 | 7.02 | 88.62 | 8.38 | 1.08 | 3.78 | 12.70 | 34.85 | 0.27 | 10.81 | 167.77 |
| 11 | San Cristobal Norte | Usaquén | 72939 | 4 | 73 | 351 | 27 | 5 | 11 | 39 | 117 | 9 | 157 | 793 | 0.55 | 10.01 | 48.12 | 3.70 | 0.69 | 1.51 | 5.35 | 16.04 | 1.23 | 21.52 | 108.72 |
Como punto de partida, se calculan las principales medidas de estadística descriptiva para las variables relacionadas con los delitos de alto impacto. Este ejercicio permite conocer la distribución de los casos registrados y de las tasas por cada 10.000 habitantes entre las UPZ de Bogotá.
Se consideran medidas de tendencia central, dispersión y posición, como la media, la mediana, la desviación estándar, los valores mínimos y máximos, y los cuartiles primero y tercero.
El análisis de estas medidas permite identificar diferencias en el comportamiento de los delitos entre los territorios. También facilita reconocer posibles valores extremos y establecer si los registros presentan una distribución homogénea o una concentración importante en determinadas UPZ.
Es importante diferenciar la interpretación de los casos y las tasas. Mientras los casos representan el volumen de denuncias registradas, las tasas permiten comparar los territorios considerando su tamaño poblacional. Sin embargo, estas últimas pueden presentar valores elevados en UPZ con poblaciones reducidas.
# Selección de variables de casos registrados
datos_casos <- variables_delitos %>%
select(starts_with("casos_"))
# Cálculo de estadísticas descriptivas
estadisticas_casos <- datos_casos %>%
pivot_longer(
cols = everything(),
names_to = "Delito",
values_to = "Casos"
) %>%
group_by(Delito) %>%
summarise(
Media = mean(Casos),
Mediana = median(Casos),
Desviacion = sd(Casos),
Minimo = min(Casos),
Q1 = quantile(Casos, 0.25),
Q3 = quantile(Casos, 0.75),
Maximo = max(Casos),
.groups = "drop"
) %>%
arrange(desc(Media))
# Presentación de resultados
knitr::kable(
estadisticas_casos,
digits = 2,
caption = "Estadísticas descriptivas de los casos de delitos por UPZ"
)
| Delito | Media | Mediana | Desviacion | Minimo | Q1 | Q3 | Maximo |
|---|---|---|---|---|---|---|---|
| casos_total | 1453.88 | 1222.0 | 1023.07 | 16 | 779.50 | 1961.50 | 5441 |
| casos_hurto_personas | 762.48 | 597.5 | 602.99 | 5 | 358.50 | 978.75 | 3311 |
| casos_hurto_celulares | 275.95 | 233.5 | 228.52 | 1 | 125.00 | 346.50 | 1266 |
| casos_violencia_intrafamiliar | 143.33 | 100.5 | 150.84 | 0 | 48.00 | 182.25 | 818 |
| casos_lesiones | 88.34 | 74.5 | 67.44 | 1 | 38.25 | 122.00 | 317 |
| casos_hurto_comercio | 53.71 | 44.5 | 43.03 | 1 | 26.00 | 70.25 | 217 |
| casos_hurto_bicicletas | 40.95 | 30.5 | 36.55 | 0 | 11.75 | 58.25 | 171 |
| casos_hurto_residencias | 38.75 | 32.5 | 31.46 | 0 | 15.00 | 54.25 | 193 |
| casos_hurto_motos | 25.56 | 16.0 | 24.38 | 0 | 6.00 | 40.25 | 93 |
| casos_hurto_automotor | 19.46 | 14.5 | 18.05 | 0 | 5.00 | 26.25 | 74 |
| casos_homicidios | 5.35 | 3.0 | 6.81 | 0 | 1.00 | 7.00 | 47 |
# Selección de variables de tasas
datos_tasas <- variables_delitos %>%
select(starts_with("tasa_"))
# Cálculo de estadísticas descriptivas
estadisticas_tasas <- datos_tasas %>%
pivot_longer(
cols = everything(),
names_to = "Delito",
values_to = "Tasa"
) %>%
group_by(Delito) %>%
summarise(
Media = mean(Tasa),
Mediana = median(Tasa),
Desviacion = sd(Tasa),
Minimo = min(Tasa),
Q1 = quantile(Tasa, 0.25),
Q3 = quantile(Tasa, 0.75),
Maximo = max(Tasa),
.groups = "drop"
) %>%
arrange(desc(Media))
# Presentación de resultados
knitr::kable(
estadisticas_tasas,
digits = 2,
caption = "Estadísticas descriptivas de las tasas de delitos por cada 10.000 habitantes y por UPZ"
)
| Delito | Media | Mediana | Desviacion | Minimo | Q1 | Q3 | Maximo |
|---|---|---|---|---|---|---|---|
| tasa_total | 503.64 | 192.52 | 1263.44 | 64.47 | 129.51 | 287.62 | 11333.33 |
| tasa_hurto_personas | 292.23 | 100.64 | 762.34 | 15.70 | 55.44 | 167.36 | 6333.33 |
| tasa_hurto_celulares | 104.48 | 35.11 | 282.79 | 7.29 | 19.32 | 61.84 | 2666.67 |
| tasa_hurto_comercio | 25.99 | 7.42 | 126.18 | 0.94 | 3.98 | 15.63 | 1333.33 |
| tasa_violencia_intrafamiliar | 23.74 | 17.63 | 30.99 | 0.00 | 11.88 | 24.22 | 232.06 |
| tasa_lesiones | 23.58 | 12.17 | 42.59 | 3.71 | 8.32 | 16.70 | 333.33 |
| tasa_hurto_bicicletas | 14.47 | 5.81 | 40.63 | 0.00 | 2.88 | 9.38 | 333.33 |
| tasa_hurto_automotor | 7.03 | 2.52 | 31.99 | 0.00 | 1.37 | 4.10 | 333.33 |
| tasa_hurto_residencias | 6.69 | 5.98 | 4.50 | 0.00 | 3.48 | 8.78 | 26.31 |
| tasa_hurto_motos | 4.51 | 3.22 | 7.96 | 0.00 | 1.53 | 5.27 | 79.28 |
| tasa_homicidios | 0.93 | 0.56 | 1.29 | 0.00 | 0.20 | 1.15 | 6.93 |
Con el propósito de complementar las medidas descriptivas, se analiza la distribución de los casos registrados y de las tasas de delitos entre las UPZ de Bogotá.
Para ello se utilizan histogramas que permiten observar la frecuencia con la que se presentan determinados rangos de valores. Esta representación facilita identificar concentraciones, asimetrías y posibles observaciones extremas en las diferentes categorías de delitos.
En primer lugar, se examina la distribución del número de casos registrados. Posteriormente, se realiza el mismo ejercicio para las tasas por cada 10.000 habitantes, con el fin de reconocer si el comportamiento de los delitos cambia al considerar el tamaño poblacional de cada territorio.
La comparación de ambas distribuciones permite distinguir entre la concentración de denuncias y las diferencias relativas entre las UPZ. Se debe tener en cuenta que las escalas de los gráficos son independientes para facilitar la visualización de cada categoría.
# Organización de los casos en formato largo
distribucion_casos <- variables_delitos %>%
select(starts_with("casos_")) %>%
pivot_longer(
cols = everything(),
names_to = "Delito",
values_to = "Casos"
) %>%
mutate(
Delito = str_remove(Delito, "^casos_"),
Delito = str_replace_all(Delito, "_", " "),
Delito = str_to_title(Delito)
)
# Histograma de casos por categoría de delito
ggplot(
distribucion_casos,
aes(x = Casos)
) +
geom_histogram(
bins = 15,
fill = turquesa,
color = "white",
alpha = 0.85
) +
facet_wrap(
~Delito,
scales = "free_x"
) +
labs(
title = "Distribución de los casos de delitos por UPZ",
subtitle = "Número de denuncias registradas entre enero y julio de 2023",
x = "Número de casos",
y = "Cantidad de UPZ",
caption = "Fuente: Secretaría Distrital de Seguridad, Convivencia y Justicia, 2023."
) +
tema_clase
# Organización de las tasas en formato largo
distribucion_tasas <- variables_delitos %>%
select(starts_with("tasa_")) %>%
pivot_longer(
cols = everything(),
names_to = "Delito",
values_to = "Tasa"
) %>%
mutate(
Delito = str_remove(Delito, "^tasa_"),
Delito = str_replace_all(Delito, "_", " "),
Delito = str_to_title(Delito)
)
# Histograma de tasas por categoría de delito
ggplot(
distribucion_tasas,
aes(x = Tasa)
) +
geom_histogram(
bins = 15,
fill = magenta,
color = "white",
alpha = 0.85
) +
facet_wrap(
~Delito,
scales = "free_x"
) +
labs(
title = "Distribución de las tasas de delitos por UPZ",
subtitle = "Casos registrados por cada 10.000 habitantes",
x = "Tasa por cada 10.000 habitantes",
y = "Cantidad de UPZ",
caption = "Fuente: Secretaría Distrital de Seguridad, Convivencia y Justicia, 2023."
) +
tema_clase
Con el propósito de identificar cuáles categorías concentran una mayor proporción de las denuncias registradas, se analiza la composición del total de casos de delitos de alto impacto en las UPZ estudiadas.
Para este ejercicio se suman los casos registrados en cada categoría de delito y se calcula su participación porcentual frente al total de denuncias acumuladas. Los resultados se presentan mediante una tabla y un gráfico de barras que facilitan la comparación entre las diferentes categorías.
Este análisis permite reconocer la composición de los registros administrativos y establecer cuáles tipos de delitos tienen mayor participación dentro del conjunto analizado.
Para evitar duplicaciones, se excluye la variable de total de casos del cálculo, dado que esta corresponde a la suma de las categorías individuales. Los resultados se limitan al periodo comprendido entre enero y julio de 2023 y representan denuncias registradas, no necesariamente la totalidad de los hechos ocurridos.
# Sumar los casos registrados por categoría de delito
# Se excluye casos_total porque ya contiene la suma de las categorías
participacion_delitos <- variables_delitos %>%
select(starts_with("casos_"), -casos_total) %>%
summarise(
across(everything(), ~sum(.))
) %>%
pivot_longer(
cols = everything(),
names_to = "Delito",
values_to = "Casos"
) %>%
mutate(
Delito = str_remove(Delito, "^casos_"),
Delito = str_replace_all(Delito, "_", " "),
Delito = str_to_title(Delito),
Participacion = Casos / sum(Casos) * 100
) %>%
arrange(desc(Participacion))
# Presentación de resultados
knitr::kable(
participacion_delitos,
digits = 2,
col.names = c("Tipo de delito", "Casos registrados", "Participación (%)"),
caption = "Participación de cada categoría en el total de casos registrados"
)
| Tipo de delito | Casos registrados | Participación (%) |
|---|---|---|
| Hurto Personas | 85398 | 52.44 |
| Hurto Celulares | 30906 | 18.98 |
| Violencia Intrafamiliar | 16053 | 9.86 |
| Lesiones | 9894 | 6.08 |
| Hurto Comercio | 6016 | 3.69 |
| Hurto Bicicletas | 4586 | 2.82 |
| Hurto Residencias | 4340 | 2.67 |
| Hurto Motos | 2863 | 1.76 |
| Hurto Automotor | 2180 | 1.34 |
| Homicidios | 599 | 0.37 |
ggplot(
participacion_delitos,
aes(
x = reorder(Delito, Participacion),
y = Participacion
)
) +
geom_col(
fill = magenta,
width = 0.7
) +
geom_text(
aes(label = paste0(round(Participacion, 1), "%")),
hjust = -0.15,
size = 3.5,
color = morado
) +
coord_flip() +
scale_y_continuous(
labels = scales::label_number(suffix = "%"),
expand = expansion(mult = c(0, 0.15))
) +
labs(
title = "Composición de los delitos de alto impacto",
subtitle = "Participación porcentual de cada categoría en los casos registrados",
x = NULL,
y = "Participación (%)",
caption = "Fuente: Secretaría Distrital de Seguridad, Convivencia y Justicia, enero-julio de 2023."
) +
tema_clase
Una vez analizada la composición general de los delitos, se identifican las UPZ que concentran el mayor número de casos registrados durante el periodo de estudio.
Para ello se construye un ranking de las diez UPZ con mayor cantidad de denuncias por delitos de alto impacto. La comparación incorpora la población y la tasa total por cada 10.000 habitantes, con el propósito de complementar la lectura del volumen de casos con una medida relativa al tamaño poblacional.
Este ejercicio permite reconocer los territorios que acumulan más registros y explorar si su posición en el ranking coincide con tasas elevadas o si puede estar relacionada con una mayor concentración de habitantes.
La identificación de estas UPZ constituye un primer acercamiento a las diferencias territoriales en los registros de delitos. Sin embargo, el número de denuncias no debe interpretarse por sí solo como una medida de riesgo individual ni como una representación completa de los hechos delictivos ocurridos.
# Identificación de las diez UPZ con mayor número de casos
ranking_casos_delitos <- variables_delitos %>%
select(
upz_nombre,
localidad,
poblacion,
casos_total,
tasa_total
) %>%
arrange(desc(casos_total)) %>%
slice_head(n = 10)
# Presentación del ranking
knitr::kable(
ranking_casos_delitos,
digits = 2,
col.names = c(
"UPZ",
"Localidad",
"Población",
"Casos totales",
"Tasa por 10.000 hab."
),
caption = "Diez UPZ con mayor número de casos de delitos de alto impacto"
)
| UPZ | Localidad | Población | Casos totales | Tasa por 10.000 hab. |
|---|---|---|---|---|
| La Sabana | Los Mártires | 38856 | 5441 | 1400.30 |
| Chico Lago | Chapinero | 38608 | 4985 | 1291.18 |
| Las Nieves | Santa Fe | 17203 | 4033 | 2344.36 |
| El Rincon | Suba | 295322 | 3812 | 129.08 |
| Los Alcazares | Barrios Unidos | 44678 | 3495 | 782.26 |
| Bosa Central | Bosa | 237111 | 3346 | 141.12 |
| Las Ferias | Engativá | 100848 | 3139 | 311.26 |
| Galerias | Teusaquillo | 38425 | 3067 | 798.18 |
| Teusaquillo | Teusaquillo | 28881 | 2976 | 1030.44 |
| Chapinero | Chapinero | 26491 | 2901 | 1095.09 |
ggplot(
ranking_casos_delitos,
aes(
x = reorder(upz_nombre, casos_total),
y = casos_total
)
) +
geom_col(
fill = magenta,
width = 0.7
) +
geom_text(
aes(label = scales::label_number(big.mark = ".")(casos_total)),
hjust = -0.15,
size = 3.5,
color = morado
) +
coord_flip() +
scale_y_continuous(
labels = scales::label_number(big.mark = "."),
expand = expansion(mult = c(0, 0.15))
) +
labs(
title = "UPZ con mayor número de casos registrados",
subtitle = "Diez territorios con más denuncias entre enero y julio de 2023",
x = NULL,
y = "Número de casos",
caption = "Fuente: Secretaría Distrital de Seguridad, Convivencia y Justicia, 2023."
) +
tema_clase
A diferencia del ranking anterior, centrado en el volumen de denuncias, en este apartado se identifican las UPZ que presentan las mayores tasas de delitos de alto impacto por cada 10.000 habitantes.
Esta comparación permite incorporar el tamaño poblacional como elemento de referencia y reconocer territorios que, aunque no necesariamente concentran la mayor cantidad de casos, presentan valores elevados en relación con su población.
Para ello se construye un ranking de las diez UPZ con mayores tasas totales. Adicionalmente, se incluyen el número de casos registrados y la población de cada territorio, con el propósito de facilitar la interpretación de los resultados.
Se debe prestar especial atención a las UPZ con poblaciones reducidas, debido a que un número pequeño de denuncias puede generar tasas elevadas. Por esta razón, el ranking se considera una herramienta exploratoria y no una clasificación definitiva del riesgo de inseguridad de los territorios.
# Identificación de las diez UPZ con mayores tasas de delitos
ranking_tasas_delitos <- variables_delitos %>%
select(
upz_nombre,
localidad,
poblacion,
casos_total,
tasa_total
) %>%
arrange(desc(tasa_total)) %>%
slice_head(n = 10)
# Presentación del ranking
knitr::kable(
ranking_tasas_delitos,
digits = 2,
col.names = c(
"UPZ",
"Localidad",
"Población",
"Casos totales",
"Tasa por 10.000 hab."
),
caption = "Diez UPZ con mayores tasas de delitos de alto impacto"
)
| UPZ | Localidad | Población | Casos totales | Tasa por 10.000 hab. |
|---|---|---|---|---|
| El Mochuelo | Ciudad Bolívar | 30 | 34 | 11333.33 |
| Aeropuerto El Dorado | Fontibón | 883 | 545 | 6172.14 |
| Parque Simon Bolivar - Can | Teusaquillo | 3323 | 958 | 2882.94 |
| Zona Industrial | Puente Aranda | 6666 | 1573 | 2359.74 |
| Las Nieves | Santa Fe | 17203 | 4033 | 2344.36 |
| Parque Salitre | Barrios Unidos | 1442 | 233 | 1615.81 |
| Sagrado Corazon | Santa Fe | 11247 | 1707 | 1517.74 |
| La Sabana | Los Mártires | 38856 | 5441 | 1400.30 |
| Chico Lago | Chapinero | 38608 | 4985 | 1291.18 |
| Puente Aranda | Puente Aranda | 12482 | 1561 | 1250.60 |
ggplot(
ranking_tasas_delitos,
aes(
x = reorder(upz_nombre, tasa_total),
y = tasa_total
)
) +
geom_col(
fill = turquesa,
width = 0.7
) +
geom_text(
aes(label = round(tasa_total, 1)),
hjust = -0.15,
size = 3.5,
color = morado
) +
coord_flip() +
scale_y_continuous(
expand = expansion(mult = c(0, 0.15))
) +
labs(
title = "UPZ con mayores tasas de delitos",
subtitle = "Casos registrados por cada 10.000 habitantes",
x = NULL,
y = "Tasa por cada 10.000 habitantes",
caption = "Fuente: Secretaría Distrital de Seguridad, Convivencia y Justicia y proyecciones de población DANE, 2023."
) +
tema_clase
Con el propósito de profundizar en las diferencias territoriales, se realiza una comparación entre el número total de casos registrados y la tasa total de delitos por cada 10.000 habitantes.
Este ejercicio permite explorar si las UPZ que concentran mayores cantidades de denuncias también presentan tasas elevadas al considerar su tamaño poblacional. Para ello se utiliza un gráfico de dispersión en el que cada punto representa una UPZ y su tamaño permite visualizar de manera complementaria la población de cada territorio.
Adicionalmente, se incorporan líneas de referencia correspondientes a las medianas de casos y tasas, con el propósito de dividir el gráfico en cuatro cuadrantes. Esta clasificación facilita reconocer diferentes comportamientos territoriales: UPZ con valores altos en ambas medidas, territorios con muchos casos pero tasas relativamente bajas, zonas con pocos casos y tasas elevadas, y territorios con valores bajos en ambos indicadores.
Esta comparación permite comprender que el volumen de denuncias y la tasa por habitante representan dimensiones diferentes del fenómeno. Sin embargo, los resultados deben interpretarse considerando que las tasas pueden presentar valores extremos en UPZ con poblaciones reducidas y que los registros corresponden únicamente a denuncias del periodo enero-julio de 2023.
# Cálculo de las medianas como puntos de referencia
mediana_casos <- median(variables_delitos$casos_total)
mediana_tasa <- median(variables_delitos$tasa_total)
# Clasificación de las UPZ según casos y tasas
comparacion_delitos <- variables_delitos %>%
select(
upz_nombre,
localidad,
poblacion,
casos_total,
tasa_total
) %>%
mutate(
Clasificacion = case_when(
casos_total >= mediana_casos &
tasa_total >= mediana_tasa ~ "Muchos casos y tasa alta",
casos_total >= mediana_casos &
tasa_total < mediana_tasa ~ "Muchos casos y tasa baja",
casos_total < mediana_casos &
tasa_total >= mediana_tasa ~ "Pocos casos y tasa alta",
TRUE ~ "Pocos casos y tasa baja"
)
)
# Resumen de la cantidad de UPZ en cada cuadrante
resumen_cuadrantes <- comparacion_delitos %>%
count(Clasificacion, name = "Cantidad_UPZ") %>%
mutate(
Participacion = Cantidad_UPZ / sum(Cantidad_UPZ) * 100
) %>%
arrange(desc(Cantidad_UPZ))
knitr::kable(
resumen_cuadrantes,
digits = 2,
col.names = c(
"Clasificación",
"Cantidad de UPZ",
"Participación (%)"
),
caption = "Distribución de las UPZ según volumen de casos y tasa de delitos"
)
| Clasificación | Cantidad de UPZ | Participación (%) |
|---|---|---|
| Muchos casos y tasa alta | 34 | 30.36 |
| Pocos casos y tasa baja | 34 | 30.36 |
| Muchos casos y tasa baja | 22 | 19.64 |
| Pocos casos y tasa alta | 22 | 19.64 |
# Identificación de las diez UPZ con mayores tasas para etiquetarlas
upz_etiquetadas <- comparacion_delitos %>%
slice_max(
order_by = tasa_total,
n = 10,
with_ties = FALSE
)
# Gráfico de dispersión
ggplot(
comparacion_delitos,
aes(
x = casos_total,
y = tasa_total,
color = Clasificacion,
size = poblacion
)
) +
geom_point(
alpha = 0.75
) +
geom_vline(
xintercept = mediana_casos,
linetype = "dashed",
color = "grey40"
) +
geom_hline(
yintercept = mediana_tasa,
linetype = "dashed",
color = "grey40"
) +
geom_text(
data = upz_etiquetadas,
aes(label = upz_nombre),
size = 2.8,
show.legend = FALSE,
vjust = -0.8
) +
scale_color_manual(
values = c(
"Muchos casos y tasa alta" = magenta,
"Muchos casos y tasa baja" = turquesa,
"Pocos casos y tasa alta" = morado,
"Pocos casos y tasa baja" = gris
)
) +
scale_size_continuous(
range = c(2, 8),
name = "Población"
) +
scale_x_continuous(
labels = scales::label_number(big.mark = ".")
) +
labs(
title = "Relación entre casos registrados y tasas de delitos",
subtitle = "Comparación territorial de las UPZ mediante cuatro cuadrantes",
x = "Número total de casos registrados",
y = "Tasa por cada 10.000 habitantes",
color = "Clasificación",
caption = "Las líneas discontinuas representan las medianas. Fuente: Secretaría Distrital de Seguridad y proyecciones DANE, 2023."
) +
tema_clase +
theme(
legend.position = "bottom",
legend.box = "vertical"
)
Después de explorar individualmente las características demográficas, las condiciones de vivienda e infraestructura, las variables socioeconómicas, la percepción de inseguridad y los registros de delitos, se desarrolla un análisis integrado para explorar las posibles relaciones entre estas dimensiones.
El propósito es identificar patrones de asociación entre las características territoriales y los indicadores de seguridad, con el fin de ampliar la comprensión de las diferencias existentes entre las UPZ de Bogotá.
Para este análisis se seleccionan variables de diferentes bloques temáticos, incluyendo aspectos demográficos, infraestructura urbana, condiciones socioeconómicas, percepción de inseguridad y registros administrativos de delitos.
Se utiliza el coeficiente de correlación de Spearman para explorar la dirección y la intensidad de las asociaciones entre las variables. Los resultados se presentan mediante una matriz de correlaciones y un mapa de calor que facilitan la identificación de posibles patrones.
Es importante señalar que las correlaciones permiten identificar asociaciones estadísticas, pero no demuestran relaciones de causalidad. Adicionalmente, se deben considerar las diferencias en los años de referencia de las fuentes y las limitaciones relacionadas con las estimaciones agrupadas de la Encuesta Multipropósito.
Para el análisis de relaciones se seleccionaron diez variables pertenecientes a cinco dimensiones del estudio: demografía, infraestructura, condiciones socioeconómicas, percepción de inseguridad y delitos de alto impacto.
La selección busca explorar si las características poblacionales, la disponibilidad de alumbrado público, las condiciones socioeconómicas y la percepción del entorno presentan asociaciones con los indicadores de delitos registrados en las UPZ.
Las variables seleccionadas son:
Esta selección permite integrar diferentes dimensiones del territorio y explorar sus posibles relaciones. Los resultados se interpretarán de manera exploratoria, considerando las limitaciones propias de las fuentes utilizadas.
# Selección de variables para el análisis integrado
variables_integradas <- upz %>%
select(
upz_nombre,
localidad,
em_agrupada,
poblacion,
densidad_hab_km2,
luminarias_km2,
pct_pobreza,
salario_promedio,
pct_percibe_inseguridad,
pct_cerca_lotes_oscuros,
min_cai_policia,
casos_total,
tasa_total
)
# Revisión de las variables seleccionadas
glimpse(variables_integradas)
## Rows: 112
## Columns: 13
## $ upz_nombre <chr> "Paseo De Los Libertadores", "La Academia", "G…
## $ localidad <chr> "Usaquén", "Suba", "Suba", "Usaquén", "Usaquén…
## $ em_agrupada <lgl> TRUE, TRUE, TRUE, FALSE, TRUE, FALSE, FALSE, F…
## $ poblacion <dbl> 2690, 5260, 2692, 131999, 37014, 72939, 63068,…
## $ densidad_hab_km2 <dbl> 424.81, 779.85, 591.30, 36967.66, 10682.12, 26…
## $ luminarias_km2 <dbl> 82.75, 79.17, 40.42, 995.61, 383.26, 933.16, 9…
## $ pct_pobreza <dbl> 1.37, 0.86, 0.86, 3.12, 1.37, 5.19, 0.84, 0.37…
## $ salario_promedio <dbl> 3937004, 4280663, 4280663, 1933709, 3937004, 1…
## $ pct_percibe_inseguridad <dbl> 36.18, 40.88, 40.88, 65.43, 36.18, 49.84, 60.4…
## $ pct_cerca_lotes_oscuros <dbl> 24.15, 16.71, 16.71, 24.15, 24.15, 19.15, 18.8…
## $ min_cai_policia <dbl> 21.66, 24.50, 24.50, 18.39, 21.66, 25.32, 18.5…
## $ casos_total <dbl> 74, 123, 45, 944, 621, 793, 943, 1991, 1298, 4…
## $ tasa_total <dbl> 275.09, 233.84, 167.16, 71.52, 167.77, 108.72,…
# Visualización de las primeras observaciones
head(variables_integradas)
| upz_nombre | localidad | em_agrupada | poblacion | densidad_hab_km2 | luminarias_km2 | pct_pobreza | salario_promedio | pct_percibe_inseguridad | pct_cerca_lotes_oscuros | min_cai_policia | casos_total | tasa_total |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Paseo De Los Libertadores | Usaquén | TRUE | 2690 | 424.81 | 82.75 | 1.37 | 3937004 | 36.18 | 24.15 | 21.66 | 74 | 275.09 |
| La Academia | Suba | TRUE | 5260 | 779.85 | 79.17 | 0.86 | 4280663 | 40.88 | 16.71 | 24.50 | 123 | 233.84 |
| Guaymaral | Suba | TRUE | 2692 | 591.30 | 40.42 | 0.86 | 4280663 | 40.88 | 16.71 | 24.50 | 45 | 167.16 |
| Verbenal | Usaquén | FALSE | 131999 | 36967.66 | 995.61 | 3.12 | 1933709 | 65.43 | 24.15 | 18.39 | 944 | 71.52 |
| La Uribe | Usaquén | TRUE | 37014 | 10682.12 | 383.26 | 1.37 | 3937004 | 36.18 | 24.15 | 21.66 | 621 | 167.77 |
| San Cristobal Norte | Usaquén | FALSE | 72939 | 26401.70 | 933.16 | 5.19 | 1368739 | 49.84 | 19.15 | 25.32 | 793 | 108.72 |
Una vez seleccionadas las variables de los diferentes bloques temáticos, se construye una matriz de correlaciones para explorar las asociaciones existentes entre las características demográficas, la infraestructura, las condiciones socioeconómicas, la percepción de inseguridad, la accesibilidad y los delitos registrados.
Se utiliza el coeficiente de correlación de Spearman, que permite identificar asociaciones monotónicas entre las variables. Sus valores oscilan entre -1 y 1, donde los valores positivos representan asociaciones directas y los negativos asociaciones inversas.
La matriz se representa mediante un mapa de calor, en el que los colores permiten reconocer visualmente la dirección y la intensidad de las correlaciones.
Este ejercicio busca identificar relaciones que puedan orientar el desarrollo de las preguntas de investigación y los análisis posteriores. Sin embargo, las asociaciones observadas no deben interpretarse como relaciones de causalidad.
# Selección exclusiva de variables numéricas
datos_correlacion_integrada <- variables_integradas %>%
select(
poblacion,
densidad_hab_km2,
luminarias_km2,
pct_pobreza,
salario_promedio,
pct_percibe_inseguridad,
pct_cerca_lotes_oscuros,
min_cai_policia,
casos_total,
tasa_total
)
# Cálculo de la matriz de correlaciones de Spearman
matriz_correlacion_integrada <- cor(
datos_correlacion_integrada,
method = "spearman",
use = "complete.obs"
)
# Transformación de la matriz a formato largo
correlaciones_integradas_largas <- as.data.frame(
as.table(matriz_correlacion_integrada)
) %>%
rename(
Variable_1 = Var1,
Variable_2 = Var2,
Correlacion = Freq
)
# Construcción del mapa de calor
ggplot(
correlaciones_integradas_largas,
aes(
x = Variable_1,
y = Variable_2,
fill = Correlacion
)
) +
geom_tile(
color = "white",
linewidth = 1
) +
geom_text(
aes(label = round(Correlacion, 2)),
color = "black",
size = 3
) +
scale_fill_gradient2(
low = morado,
mid = "white",
high = magenta,
midpoint = 0,
limits = c(-1, 1),
name = "Correlación"
) +
labs(
title = "Relaciones entre las características territoriales",
subtitle = "Matriz de correlaciones de Spearman entre variables seleccionadas",
x = NULL,
y = NULL,
caption = "Fuente: Elaboración propia con información DANE, Secretaría Distrital de Seguridad y Datos Abiertos Bogotá."
) +
coord_fixed() +
tema_clase +
theme(
axis.text.x = element_text(
angle = 45,
hjust = 1,
color = morado,
size = 8
),
axis.text.y = element_text(
color = morado,
size = 8
),
panel.grid = element_blank(),
legend.position = "right"
)
Las características demográficas de los territorios pueden aportar elementos importantes para comprender las diferencias en los registros de delitos. Por esta razón, se exploran las relaciones entre el tamaño de la población, la densidad poblacional y los indicadores de delitos de alto impacto.
En primer lugar, se analiza la relación entre la población y el número total de casos registrados, con el propósito de identificar si las UPZ con mayor cantidad de habitantes también concentran un mayor volumen de denuncias.
En segundo lugar, se examina la relación entre la densidad poblacional y la tasa total de delitos por cada 10.000 habitantes. Este ejercicio permite explorar si las características de concentración de la población presentan alguna asociación con las diferencias territoriales en las tasas registradas.
Para complementar la visualización, se calculan los coeficientes de correlación de Spearman. Los resultados permiten identificar asociaciones entre las variables, sin establecer relaciones de causalidad.
ggplot(
variables_integradas,
aes(
x = poblacion,
y = casos_total
)
) +
geom_point(
color = turquesa,
alpha = 0.7,
size = 2.5
) +
geom_smooth(
method = "lm",
se = FALSE,
color = magenta,
linewidth = 0.9
) +
scale_x_continuous(
labels = scales::label_number(big.mark = ".")
) +
scale_y_continuous(
labels = scales::label_number(big.mark = ".")
) +
labs(
title = "Relación entre población y casos de delitos",
subtitle = "Número de habitantes y denuncias registradas por UPZ",
x = "Población",
y = "Casos totales registrados",
caption = "Fuente: Proyecciones DANE y Secretaría Distrital de Seguridad, 2023."
) +
tema_clase
ggplot(
variables_integradas,
aes(
x = densidad_hab_km2,
y = tasa_total
)
) +
geom_point(
color = magenta,
alpha = 0.7,
size = 2.5
) +
geom_smooth(
method = "lm",
se = FALSE,
color = morado,
linewidth = 0.9
) +
scale_x_continuous(
labels = scales::label_number(big.mark = ".")
) +
labs(
title = "Relación entre densidad poblacional y tasa de delitos",
subtitle = "Concentración de habitantes y casos por cada 10.000 habitantes",
x = "Densidad poblacional (habitantes por km²)",
y = "Tasa de delitos por cada 10.000 habitantes",
caption = "Fuente: Proyecciones DANE y Secretaría Distrital de Seguridad, 2023."
) +
tema_clase
Para complementar los gráficos de dispersión, se calculan los coeficientes de correlación de Spearman entre la población y los casos totales, así como entre la densidad poblacional y la tasa de delitos.
Esta comparación permite evaluar la dirección y la intensidad de las asociaciones observadas visualmente, facilitando la identificación de posibles diferencias entre el volumen de denuncias y las tasas relativas a la población.
# Cálculo de las correlaciones seleccionadas
correlaciones_demografia <- variables_integradas %>%
select(
poblacion,
casos_total,
densidad_hab_km2,
tasa_total
) %>%
cor(
method = "spearman",
use = "complete.obs"
)
# Transformación para presentar únicamente las dos relaciones de interés
resultado_correlaciones_demografia <- tibble(
Relacion = c(
"Población y casos totales",
"Densidad poblacional y tasa de delitos"
),
Correlacion = c(
correlaciones_demografia["poblacion", "casos_total"],
correlaciones_demografia["densidad_hab_km2", "tasa_total"]
)
)
knitr::kable(
resultado_correlaciones_demografia,
digits = 3,
caption = "Correlaciones de Spearman entre variables demográficas e indicadores de delitos"
)
| Relacion | Correlacion |
|---|---|
| Población y casos totales | 0.555 |
| Densidad poblacional y tasa de delitos | -0.538 |
En este apartado se explora la relación entre las condiciones del alumbrado público y la tasa de delitos de alto impacto en las UPZ de Bogotá. Para ello, se consideran tres indicadores: la cantidad de luminarias por kilómetro cuadrado, la cantidad de luminarias por cada 1.000 habitantes y el porcentaje de luminarias LED.
El propósito es identificar si existe alguna asociación estadística entre la disponibilidad y las características del alumbrado público y los niveles de criminalidad registrados en cada UPZ.
Se utiliza la correlación de Spearman, debido a que permite evaluar relaciones monotónicas sin exigir que las variables presenten una distribución normal. Adicionalmente, se emplean diagramas de dispersión para observar el comportamiento de las variables y posibles patrones o valores extremos.
Es importante considerar que los indicadores de alumbrado corresponden a 2021, mientras que los registros de delitos corresponden al periodo enero-julio de 2023. Por tanto, las relaciones encontradas deben interpretarse como asociaciones exploratorias y no como evidencia de una relación causal.
Asimismo, una mayor cantidad de luminarias no necesariamente representa mejores condiciones de iluminación en todos los espacios públicos, ya que estos indicadores no incorporan aspectos como su ubicación, funcionamiento, intensidad o distribución efectiva.
# Selección de variables de infraestructura y delitos
infraestructura_delitos <- upz %>%
select(
upz_nombre,
localidad,
luminarias_km2,
luminarias_1000hab,
pct_luminarias_led,
tasa_total
)
# Visualización de los primeros registros
kable(
head(infraestructura_delitos, 10),
digits = 2,
caption = "Indicadores de infraestructura y tasa de delitos por UPZ"
)
| upz_nombre | localidad | luminarias_km2 | luminarias_1000hab | pct_luminarias_led | tasa_total |
|---|---|---|---|---|---|
| Paseo De Los Libertadores | Usaquén | 82.75 | 194.80 | 28.44 | 275.09 |
| La Academia | Suba | 79.17 | 101.52 | 0.37 | 233.84 |
| Guaymaral | Suba | 40.42 | 68.35 | 0.00 | 167.16 |
| Verbenal | Usaquén | 995.61 | 26.93 | 65.77 | 71.52 |
| La Uribe | Usaquén | 383.26 | 35.88 | 49.25 | 167.77 |
| San Cristobal Norte | Usaquén | 933.16 | 35.34 | 49.34 | 108.72 |
| Toberin | Usaquén | 937.24 | 43.35 | 50.62 | 149.52 |
| Los Cedros | Usaquén | 768.37 | 38.41 | 53.32 | 147.51 |
| Usaquen | Usaquén | 648.58 | 74.30 | 50.42 | 300.74 |
| Country Club | Usaquén | 487.38 | 53.47 | 57.98 | 169.17 |
# Relación entre luminarias por km2 y tasa de delitos
ggplot(
infraestructura_delitos,
aes(x = luminarias_km2, y = tasa_total)
) +
geom_point(
color = "#351A4F",
alpha = 0.75,
size = 2.5
) +
geom_smooth(
method = "lm",
se = TRUE,
color = "#D9006C",
fill = "#D9006C",
alpha = 0.15
) +
labs(
title = "Densidad de luminarias y tasa de delitos",
subtitle = "Comparación entre UPZ de Bogotá",
x = "Luminarias por km²",
y = "Delitos por cada 10.000 habitantes",
caption = "Fuentes: indicadores de alumbrado 2021 y registros de delitos enero-julio 2023"
) +
tema_clase
# Relación entre luminarias por cada 1.000 habitantes y tasa de delitos
ggplot(
infraestructura_delitos,
aes(x = luminarias_1000hab, y = tasa_total)
) +
geom_point(
color = "#168C86",
alpha = 0.75,
size = 2.5
) +
geom_smooth(
method = "lm",
se = TRUE,
color = "#D9006C",
fill = "#D9006C",
alpha = 0.15
) +
labs(
title = "Disponibilidad de luminarias por habitante y tasa de delitos",
subtitle = "Luminarias por cada 1.000 habitantes",
x = "Luminarias por cada 1.000 habitantes",
y = "Delitos por cada 10.000 habitantes",
caption = "Fuentes: indicadores de alumbrado 2021 y registros de delitos enero-julio 2023"
) +
tema_clase
# Relación entre porcentaje de luminarias LED y tasa de delitos
ggplot(
infraestructura_delitos,
aes(x = pct_luminarias_led, y = tasa_total)
) +
geom_point(
color = "#351A4F",
alpha = 0.75,
size = 2.5
) +
geom_smooth(
method = "lm",
se = TRUE,
color = "#D9006C",
fill = "#D9006C",
alpha = 0.15
) +
labs(
title = "Participación de luminarias LED y tasa de delitos",
subtitle = "Comparación de la composición tecnológica del alumbrado",
x = "Luminarias LED (%)",
y = "Delitos por cada 10.000 habitantes",
caption = "Fuentes: indicadores de alumbrado 2021 y registros de delitos enero-julio 2023"
) +
tema_clase
5.6.4.4. Correlaciones entre infraestructura y delitos
# Cálculo de correlaciones de Spearman
correlaciones_infraestructura <- infraestructura_delitos %>%
summarise(
Cor_luminarias_km2 = cor(
luminarias_km2,
tasa_total,
method = "spearman",
use = "complete.obs"
),
Cor_luminarias_1000hab = cor(
luminarias_1000hab,
tasa_total,
method = "spearman",
use = "complete.obs"
),
Cor_pct_led = cor(
pct_luminarias_led,
tasa_total,
method = "spearman",
use = "complete.obs"
)
) %>%
pivot_longer(
cols = everything(),
names_to = "Relacion",
values_to = "Correlacion_Spearman"
) %>%
mutate(
Interpretacion = case_when(
abs(Correlacion_Spearman) < 0.20 ~ "Muy débil",
abs(Correlacion_Spearman) < 0.40 ~ "Débil",
abs(Correlacion_Spearman) < 0.60 ~ "Moderada",
abs(Correlacion_Spearman) < 0.80 ~ "Fuerte",
TRUE ~ "Muy fuerte"
)
)
kable(
correlaciones_infraestructura,
digits = 3,
caption = "Correlaciones de Spearman entre indicadores de alumbrado y tasa de delitos"
)
| Relacion | Correlacion_Spearman | Interpretacion |
|---|---|---|
| Cor_luminarias_km2 | 0.119 | Muy débil |
| Cor_luminarias_1000hab | 0.775 | Fuerte |
| Cor_pct_led | -0.061 | Muy débil |
En este apartado se integran variables socioeconómicas y de percepción ciudadana con los registros de delitos de alto impacto, con el propósito de explorar posibles asociaciones entre las condiciones de vida de las UPZ y los indicadores de seguridad.
Se consideran tres relaciones principales: el porcentaje de pobreza frente a la tasa total de delitos, el salario promedio frente a la tasa total de delitos y el porcentaje de percepción de inseguridad frente a la tasa total de delitos.
Estas comparaciones permiten examinar si las diferencias socioeconómicas entre territorios presentan algún patrón asociado con los niveles de criminalidad registrados y si la percepción ciudadana guarda correspondencia con las denuncias de delitos.
Para evaluar estas relaciones se utilizan diagramas de dispersión y el coeficiente de correlación de Spearman. Este último permite identificar asociaciones monotónicas entre las variables sin exigir una relación lineal.
Es importante diferenciar la percepción de inseguridad de los delitos denunciados. La primera corresponde a la proporción de personas que manifiestan percibir problemas de inseguridad en el entorno de su vivienda, mientras que la segunda representa registros administrativos de denuncias. Por tanto, ambas dimensiones describen aspectos diferentes del fenómeno de la seguridad.
Adicionalmente, los indicadores socioeconómicos y de percepción corresponden a la Encuesta Multipropósito de 2021, mientras que los delitos corresponden al periodo enero-julio de 2023. También se debe considerar que algunas estimaciones de la encuesta fueron agrupadas entre UPZ vecinas, lo que limita la independencia de las observaciones territoriales.
Primero, organizamos las variables que utilizaremos en este análisis.
# Selección de variables socioeconómicas y de seguridad
socioeconomia_seguridad <- upz %>%
select(
upz_nombre,
localidad,
em_agrupada,
pct_pobreza,
salario_promedio,
pct_percibe_inseguridad,
tasa_total
)
# Visualización de los primeros registros
knitr::kable(
head(socioeconomia_seguridad, 10),
digits = 2,
caption = "Variables socioeconómicas y de seguridad por UPZ"
)
| upz_nombre | localidad | em_agrupada | pct_pobreza | salario_promedio | pct_percibe_inseguridad | tasa_total |
|---|---|---|---|---|---|---|
| Paseo De Los Libertadores | Usaquén | TRUE | 1.37 | 3937004 | 36.18 | 275.09 |
| La Academia | Suba | TRUE | 0.86 | 4280663 | 40.88 | 233.84 |
| Guaymaral | Suba | TRUE | 0.86 | 4280663 | 40.88 | 167.16 |
| Verbenal | Usaquén | FALSE | 3.12 | 1933709 | 65.43 | 71.52 |
| La Uribe | Usaquén | TRUE | 1.37 | 3937004 | 36.18 | 167.77 |
| San Cristobal Norte | Usaquén | FALSE | 5.19 | 1368739 | 49.84 | 108.72 |
| Toberin | Usaquén | FALSE | 0.84 | 3434906 | 60.44 | 149.52 |
| Los Cedros | Usaquén | FALSE | 0.37 | 5226504 | 41.49 | 147.51 |
| Usaquen | Usaquén | FALSE | 0.67 | 6893541 | 24.45 | 300.74 |
| Country Club | Usaquén | TRUE | 0.07 | 7624587 | 40.67 | 169.17 |
ggplot(
socioeconomia_seguridad,
aes(
x = pct_pobreza,
y = tasa_total
)
) +
geom_point(
aes(color = em_agrupada),
alpha = 0.8,
size = 2.5
) +
geom_smooth(
method = "lm",
se = TRUE,
color = magenta,
fill = magenta,
alpha = 0.15
) +
scale_color_manual(
values = c(
"FALSE" = morado,
"TRUE" = turquesa
),
labels = c(
"FALSE" = "Estimación individual",
"TRUE" = "Estimación agrupada"
)
) +
labs(
title = "Relación entre pobreza y tasa de delitos",
subtitle = "Comparación de condiciones socioeconómicas entre UPZ",
x = "Población en condición de pobreza (%)",
y = "Delitos por cada 10.000 habitantes",
color = "Tipo de estimación",
caption = "Fuentes: Encuesta Multipropósito 2021 y registros de delitos enero-julio 2023"
) +
tema_clase
ggplot(
socioeconomia_seguridad,
aes(
x = salario_promedio,
y = tasa_total
)
) +
geom_point(
aes(color = em_agrupada),
alpha = 0.8,
size = 2.5
) +
geom_smooth(
method = "lm",
se = TRUE,
color = magenta,
fill = magenta,
alpha = 0.15
) +
scale_x_continuous(
labels = scales::label_number(
prefix = "$",
big.mark = ".",
decimal.mark = ","
)
) +
scale_color_manual(
values = c(
"FALSE" = morado,
"TRUE" = turquesa
),
labels = c(
"FALSE" = "Estimación individual",
"TRUE" = "Estimación agrupada"
)
) +
labs(
title = "Relación entre salario promedio y tasa de delitos",
subtitle = "Comparación de ingresos promedio entre UPZ",
x = "Salario promedio mensual",
y = "Delitos por cada 10.000 habitantes",
color = "Tipo de estimación",
caption = "Fuentes: Encuesta Multipropósito 2021 y registros de delitos enero-julio 2023"
) +
tema_clase
ggplot(
socioeconomia_seguridad,
aes(
x = pct_percibe_inseguridad,
y = tasa_total
)
) +
geom_point(
aes(color = em_agrupada),
alpha = 0.8,
size = 2.5
) +
geom_smooth(
method = "lm",
se = TRUE,
color = magenta,
fill = magenta,
alpha = 0.15
) +
scale_color_manual(
values = c(
"FALSE" = morado,
"TRUE" = turquesa
),
labels = c(
"FALSE" = "Estimación individual",
"TRUE" = "Estimación agrupada"
)
) +
labs(
title = "Percepción de inseguridad y tasa de delitos",
subtitle = "Comparación entre percepción ciudadana y registros administrativos",
x = "Personas que perciben inseguridad en su entorno (%)",
y = "Delitos por cada 10.000 habitantes",
color = "Tipo de estimación",
caption = "Fuentes: Encuesta Multipropósito 2021 y registros de delitos enero-julio 2023"
) +
tema_clase
# Selección integrada de variables
variables_correlacion <- upz %>%
select(
poblacion,
densidad_hab_km2,
luminarias_km2,
pct_pobreza,
salario_promedio,
pct_percibe_inseguridad,
pct_cerca_lotes_oscuros,
min_cai_policia,
casos_total,
tasa_total
)
# Cálculo de la matriz de correlaciones de Spearman
matriz_correlaciones <- cor(
variables_correlacion,
method = "spearman",
use = "complete.obs"
)
# Transformación de la matriz para visualizarla
matriz_larga <- as.data.frame(
as.table(matriz_correlaciones)
) %>%
rename(
Variable_1 = Var1,
Variable_2 = Var2,
Correlacion = Freq
)
# Mapa de calor de correlaciones
ggplot(
matriz_larga,
aes(
x = Variable_1,
y = Variable_2,
fill = Correlacion
)
) +
geom_tile(color = "white", linewidth = 0.5) +
geom_text(
aes(label = round(Correlacion, 2)),
color = "black",
size = 3
) +
scale_fill_gradient2(
low = morado,
mid = "white",
high = magenta,
midpoint = 0,
limits = c(-1, 1)
) +
coord_equal() +
labs(
title = "Matriz integrada de correlaciones entre variables",
subtitle = "Coeficientes de Spearman para las dimensiones territoriales y de seguridad",
x = NULL,
y = NULL,
fill = "Correlación",
caption = "Fuente: elaboración propia a partir de los indicadores de las UPZ."
) +
tema_clase +
theme(
axis.text.x = element_text(
angle = 45,
hjust = 1,
size = 9
),
axis.text.y = element_text(size = 9),
panel.grid = element_blank()
)
Después de explorar las relaciones entre las características demográficas, la infraestructura urbana, las condiciones socioeconómicas, la percepción de inseguridad y los registros de delitos, se realiza una síntesis de las correlaciones obtenidas.
El propósito de esta etapa es identificar las asociaciones estadísticas de mayor magnitud entre las variables seleccionadas y facilitar su interpretación desde una perspectiva integral del territorio.
Para ello, se organizan los coeficientes de correlación de Spearman en una tabla comparativa, ordenada según el valor absoluto de cada correlación. De esta manera, es posible reconocer las relaciones positivas y negativas de mayor intensidad, sin limitar el análisis exclusivamente a las variables relacionadas con los delitos.
Esta síntesis permite identificar patrones que pueden orientar la interpretación de los resultados y la selección de indicadores relevantes para la siguiente etapa de visualización geográfica.
Es importante señalar que la magnitud de una correlación no implica causalidad. Además, las relaciones deben interpretarse considerando las diferencias temporales entre las fuentes de información y las estimaciones socioeconómicas agrupadas para algunas UPZ.
# Convertir la matriz de correlaciones en una tabla
ranking_correlaciones <- as.data.frame(
as.table(matriz_correlaciones)
) %>%
rename(
Variable_1 = Var1,
Variable_2 = Var2,
Correlacion = Freq
) %>%
mutate(
Variable_1 = as.character(Variable_1),
Variable_2 = as.character(Variable_2)
) %>%
# Eliminar diagonal y relaciones duplicadas
filter(Variable_1 < Variable_2) %>%
# Clasificar la dirección de la relación
mutate(
Direccion = if_else(
Correlacion >= 0,
"Positiva",
"Negativa"
),
Magnitud = case_when(
abs(Correlacion) < 0.20 ~ "Muy débil",
abs(Correlacion) < 0.40 ~ "Débil",
abs(Correlacion) < 0.60 ~ "Moderada",
abs(Correlacion) < 0.80 ~ "Fuerte",
TRUE ~ "Muy fuerte"
),
Magnitud_absoluta = abs(Correlacion)
) %>%
arrange(desc(Magnitud_absoluta))
# Presentar las 10 asociaciones de mayor magnitud
top_correlaciones <- ranking_correlaciones %>%
slice_head(n = 10) %>%
select(
Variable_1,
Variable_2,
Correlacion,
Direccion,
Magnitud
)
knitr::kable(
top_correlaciones,
digits = 3,
col.names = c(
"Variable 1",
"Variable 2",
"Correlación",
"Dirección",
"Magnitud"
),
caption = "Las 10 correlaciones de mayor magnitud entre las variables analizadas"
)
| Variable 1 | Variable 2 | Correlación | Dirección | Magnitud |
|---|---|---|---|---|
| pct_pobreza | salario_promedio | -0.928 | Negativa | Muy fuerte |
| densidad_hab_km2 | poblacion | 0.833 | Positiva | Muy fuerte |
| pct_percibe_inseguridad | salario_promedio | -0.790 | Negativa | Fuerte |
| pct_percibe_inseguridad | pct_pobreza | 0.740 | Positiva | Fuerte |
| salario_promedio | tasa_total | 0.584 | Positiva | Moderada |
| pct_cerca_lotes_oscuros | pct_pobreza | 0.578 | Positiva | Moderada |
| casos_total | luminarias_km2 | 0.577 | Positiva | Moderada |
| pct_cerca_lotes_oscuros | salario_promedio | -0.572 | Negativa | Moderada |
| poblacion | tasa_total | -0.564 | Negativa | Moderada |
| densidad_hab_km2 | luminarias_km2 | 0.563 | Positiva | Moderada |
ggplot(
top_correlaciones,
aes(
x = reorder(
paste(Variable_1, "vs.", Variable_2),
Correlacion
),
y = Correlacion,
fill = Direccion
)
) +
geom_col(width = 0.7) +
geom_hline(
yintercept = 0,
color = "grey40",
linewidth = 0.5
) +
coord_flip() +
scale_fill_manual(
values = c(
"Positiva" = magenta,
"Negativa" = morado
)
) +
labs(
title = "Principales asociaciones entre variables",
subtitle = "Diez correlaciones de mayor magnitud absoluta",
x = NULL,
y = "Coeficiente de Spearman",
fill = "Dirección",
caption = "Fuente: elaboración propia a partir de los indicadores de las UPZ."
) +
tema_clase
# Identificar las variables relacionadas con la tasa total de delitos
correlaciones_tasa <- ranking_correlaciones %>%
filter(
Variable_1 == "tasa_total" |
Variable_2 == "tasa_total"
) %>%
mutate(
Variable_relacionada = if_else(
Variable_1 == "tasa_total",
Variable_2,
Variable_1
)
) %>%
arrange(desc(Magnitud_absoluta)) %>%
select(
Variable_relacionada,
Correlacion,
Direccion,
Magnitud
)
knitr::kable(
correlaciones_tasa,
digits = 3,
col.names = c(
"Variable relacionada",
"Correlación",
"Dirección",
"Magnitud"
),
caption = "Relaciones de las variables seleccionadas con la tasa total de delitos"
)
| Variable relacionada | Correlación | Dirección | Magnitud |
|---|---|---|---|
| salario_promedio | 0.584 | Positiva | Moderada |
| poblacion | -0.564 | Negativa | Moderada |
| densidad_hab_km2 | -0.538 | Negativa | Moderada |
| pct_pobreza | -0.517 | Negativa | Moderada |
| pct_cerca_lotes_oscuros | -0.365 | Negativa | Débil |
| min_cai_policia | -0.339 | Negativa | Débil |
| pct_percibe_inseguridad | -0.293 | Negativa | Débil |
| casos_total | 0.243 | Positiva | Débil |
| luminarias_km2 | 0.119 | Positiva | Muy débil |
El análisis de correlaciones permitió integrar diferentes dimensiones de las UPZ y explorar posibles asociaciones entre las características territoriales y los indicadores de seguridad.
La matriz integrada y las tablas de correlaciones facilitan la identificación de relaciones que pueden ser relevantes para comprender las diferencias entre territorios. Sin embargo, estos resultados deben interpretarse dentro del alcance exploratorio del estudio.
Las asociaciones estadísticas no permiten establecer relaciones de causalidad y tampoco garantizan que los patrones observados se mantengan en otros periodos. Adicionalmente, las diferencias temporales entre las fuentes y las estimaciones agrupadas de la Encuesta Multipropósito representan limitaciones que deben considerarse en la interpretación.
Los resultados de esta sección servirán como referencia para profundizar en la distribución espacial de los indicadores y examinar si los patrones estadísticos identificados también se manifiestan territorialmente.
El análisis geográfico permite complementar los resultados estadísticos mediante la representación espacial de los indicadores asociados con las condiciones de seguridad de las UPZ de Bogotá.
Mientras que las tablas y los gráficos anteriores permiten identificar distribuciones, diferencias y asociaciones entre variables, los mapas facilitan la comprensión de cómo se distribuyen estos comportamientos en el territorio.
Para desarrollar esta etapa se integrará la información estadística de las UPZ con los archivos geográficos que contienen sus límites territoriales. De esta manera, será posible representar indicadores como la cantidad de delitos denunciados, las tasas de criminalidad, la percepción de inseguridad y algunas características socioeconómicas y de infraestructura.
La visualización se realizará mediante mapas temáticos, utilizando escalas de color que permitan diferenciar los niveles de cada indicador entre las unidades territoriales.
El propósito no es únicamente identificar las UPZ con valores altos o bajos, sino reconocer posibles concentraciones espaciales, diferencias entre localidades y patrones territoriales que complementen los resultados del análisis exploratorio.
Es importante tener presente que la representación geográfica no modifica las limitaciones de las fuentes originales. Por tanto, los mapas deben interpretarse considerando los periodos de referencia de los datos, las diferencias en las metodologías de medición y las características de las estimaciones disponibles.
Primero debemos conocer la estructura de los archivos geográficos. Aunque ya los cargamos, necesitamos identificar sus campos, sistemas de coordenadas y características generales.
# Revisar la estructura del archivo geográfico de UPZ
cat("ESTRUCTURA DEL ARCHIVO DE UPZ\n")
## ESTRUCTURA DEL ARCHIVO DE UPZ
glimpse(upz_shp)
## Rows: 112
## Columns: 3
## $ upz_cod <int> 80, 11, 59, 25, 70, 46, 29, 85, 50, 22, 108, 48, 96, 75, 51…
## $ upz_nombre <chr> "Corabastos", "San Cristobal Norte", "Alfonso Lopez", "La F…
## $ geometry <MULTIPOLYGON [°]> MULTIPOLYGON (((-74.15509 4..., MULTIPOLYGON (…
# Identificar los campos disponibles
names(upz_shp)
## [1] "upz_cod" "upz_nombre" "geometry"
# Revisar el sistema de coordenadas
st_crs(upz_shp)
## Coordinate Reference System:
## User input: WGS 84
## wkt:
## GEOGCRS["WGS 84",
## DATUM["World Geodetic System 1984",
## ELLIPSOID["WGS 84",6378137,298.257223563,
## LENGTHUNIT["metre",1]]],
## PRIMEM["Greenwich",0,
## ANGLEUNIT["degree",0.0174532925199433]],
## CS[ellipsoidal,2],
## AXIS["latitude",north,
## ORDER[1],
## ANGLEUNIT["degree",0.0174532925199433]],
## AXIS["longitude",east,
## ORDER[2],
## ANGLEUNIT["degree",0.0174532925199433]],
## ID["EPSG",4326]]
# Consultar la cantidad de polígonos
nrow(upz_shp)
## [1] 112
# Revisar los primeros registros
head(st_drop_geometry(upz_shp), 5)
| upz_cod | upz_nombre |
|---|---|
| 80 | Corabastos |
| 11 | San Cristobal Norte |
| 59 | Alfonso Lopez |
| 25 | La Floresta |
| 70 | Jerusalem |
Ahora realizamos la misma revisión para el archivo geográfico de localidades.
# Revisar la estructura del archivo de localidades
cat("ESTRUCTURA DEL ARCHIVO DE LOCALIDADES\n")
## ESTRUCTURA DEL ARCHIVO DE LOCALIDADES
glimpse(localidades_shp)
## Rows: 19
## Columns: 3
## $ loc_cod <int> 9, 18, 17, 12, 13, 16, 14, 1, 2, 4, 5, 19, 7, 8, 10, 11, 6, …
## $ localidad <chr> "Fontibón", "Rafael Uribe Uribe", "Candelaria", "Barrios Uni…
## $ geometry <MULTIPOLYGON [°]> MULTIPOLYGON (((-74.15857 4..., MULTIPOLYGON ((…
# Identificar los campos disponibles
names(localidades_shp)
## [1] "loc_cod" "localidad" "geometry"
# Revisar el sistema de coordenadas
st_crs(localidades_shp)
## Coordinate Reference System:
## User input: WGS 84
## wkt:
## GEOGCRS["WGS 84",
## DATUM["World Geodetic System 1984",
## ELLIPSOID["WGS 84",6378137,298.257223563,
## LENGTHUNIT["metre",1]]],
## PRIMEM["Greenwich",0,
## ANGLEUNIT["degree",0.0174532925199433]],
## CS[ellipsoidal,2],
## AXIS["latitude",north,
## ORDER[1],
## ANGLEUNIT["degree",0.0174532925199433]],
## AXIS["longitude",east,
## ORDER[2],
## ANGLEUNIT["degree",0.0174532925199433]],
## ID["EPSG",4326]]
# Consultar la cantidad de polígonos
nrow(localidades_shp)
## [1] 19
# Revisar los primeros registros
head(st_drop_geometry(localidades_shp), 5)
| loc_cod | localidad |
|---|---|
| 9 | Fontibón |
| 18 | Rafael Uribe Uribe |
| 17 | Candelaria |
| 12 | Barrios Unidos |
| 13 | Teusaquillo |
Antes de integrar la información estadística, también es conveniente visualizar los polígonos originales. Esto permite comprobar que las geometrías se encuentran correctamente cargadas y que corresponden al territorio de Bogotá.
# Visualización inicial de los polígonos de las UPZ
ggplot() +
geom_sf(
data = upz_shp,
fill = "#E9E3ED",
color = morado,
linewidth = 0.25
) +
labs(
title = "División territorial de Bogotá por UPZ",
subtitle = "Representación de los polígonos geográficos disponibles",
caption = "Fuente: archivo geográfico de UPZ suministrado para el taller."
) +
tema_clase +
theme(
axis.title = element_blank(),
axis.text = element_blank(),
axis.ticks = element_blank(),
panel.grid = element_blank()
)
Una vez revisada la estructura de los archivos geográficos, se procede a integrar la información estadística de las UPZ con sus respectivos polígonos territoriales.
Para realizar esta operación se utiliza el campo
upz_cod, que funciona como identificador común entre ambas
fuentes. Este procedimiento permite incorporar los indicadores
demográficos, socioeconómicos, de infraestructura y de seguridad a cada
unidad geográfica, conservando la geometría necesaria para su
representación cartográfica.
Antes de construir los mapas temáticos, se valida que la unión conserve la totalidad de los registros, que no existan códigos sin correspondencia y que las variables estadísticas se encuentren disponibles después de la integración.
Esta validación es importante porque cualquier inconsistencia en la relación entre los datos y los polígonos podría generar representaciones territoriales incompletas o asignaciones incorrectas de los indicadores.
# Integrar la información estadística con los polígonos de las UPZ
upz_mapa <- upz_shp %>%
left_join(
upz %>% select(-upz_nombre),
by = "upz_cod"
)
# Validar la cantidad de registros y polígonos
cat("REGISTROS DE LA BASE ESTADÍSTICA:", nrow(upz), "\n")
## REGISTROS DE LA BASE ESTADÍSTICA: 112
cat("POLÍGONOS DEL ARCHIVO GEOGRÁFICO:", nrow(upz_shp), "\n")
## POLÍGONOS DEL ARCHIVO GEOGRÁFICO: 112
cat("REGISTROS DESPUÉS DE LA UNIÓN:", nrow(upz_mapa), "\n")
## REGISTROS DESPUÉS DE LA UNIÓN: 112
# Identificar códigos de la base estadística sin geometría
upz_sin_geometria <- upz %>%
anti_join(
st_drop_geometry(upz_shp),
by = "upz_cod"
)
# Identificar polígonos sin información estadística
poligonos_sin_datos <- st_drop_geometry(upz_shp) %>%
anti_join(
upz,
by = "upz_cod"
)
# Revisar valores faltantes en las variables estadísticas integradas
faltantes_integracion <- upz_mapa %>%
st_drop_geometry() %>%
summarise(
across(
everything(),
~ sum(is.na(.))
)
) %>%
pivot_longer(
cols = everything(),
names_to = "Variable",
values_to = "Valores_faltantes"
) %>%
filter(Valores_faltantes > 0)
# Presentar resultados de validación
cat("\nCÓDIGOS SIN GEOMETRÍA:", nrow(upz_sin_geometria), "\n")
##
## CÓDIGOS SIN GEOMETRÍA: 0
cat("POLÍGONOS SIN DATOS:", nrow(poligonos_sin_datos), "\n")
## POLÍGONOS SIN DATOS: 0
cat("VARIABLES CON VALORES FALTANTES:", nrow(faltantes_integracion), "\n")
## VARIABLES CON VALORES FALTANTES: 0
# Consultar los primeros registros de la base integrada
head(
st_drop_geometry(upz_mapa) %>%
select(
upz_cod,
upz_nombre,
poblacion,
casos_total,
tasa_total
),
10
)
| upz_cod | upz_nombre | poblacion | casos_total | tasa_total |
|---|---|---|---|---|
| 80 | Corabastos | 56102 | 1103 | 196.61 |
| 11 | San Cristobal Norte | 72939 | 793 | 108.72 |
| 59 | Alfonso Lopez | 53774 | 455 | 84.61 |
| 25 | La Floresta | 46543 | 886 | 190.36 |
| 70 | Jerusalem | 102981 | 1061 | 103.03 |
| 46 | Castilla | 141571 | 2646 | 186.90 |
| 29 | Minuto De Dios | 110520 | 2183 | 197.52 |
| 85 | Bosa Central | 237111 | 3346 | 141.12 |
| 50 | La Gloria | 96862 | 918 | 94.77 |
| 22 | Doce De Octubre | 75666 | 2031 | 268.42 |
Una vez integrada la información estadística y geográfica, se inicia la representación espacial de los indicadores de seguridad.
En primer lugar, se analiza la distribución de la tasa total de delitos por cada 10.000 habitantes. Este indicador permite comparar las UPZ considerando su población y evita interpretar los conteos absolutos como si fueran directamente equivalentes a una mayor intensidad delictiva.
La representación mediante un mapa coroplético permite identificar diferencias territoriales en los niveles de la tasa y reconocer posibles concentraciones espaciales. Para complementar esta lectura, también se analizará la distribución del número total de casos denunciados.
Es importante recordar que los indicadores de delitos corresponden al periodo enero-julio de 2023 y representan denuncias registradas, no necesariamente la totalidad de los hechos ocurridos.
# Mapa de la tasa total de delitos por cada 10.000 habitantes
ggplot(upz_mapa) +
geom_sf(
aes(fill = tasa_total),
color = "white",
linewidth = 0.15
) +
scale_fill_gradientn(
colours = c("#E9E3ED", "#A98DBB", "#D9006C", "#351A4F"),
name = "Tasa por\n10.000 habitantes",
labels = scales::label_number(accuracy = 0.1),
na.value = "grey85"
) +
labs(
title = "Distribución territorial de la tasa total de delitos",
subtitle = "UPZ de Bogotá · Enero a julio de 2023",
caption = "Fuente: elaboración propia con información estadística y geográfica suministrada para el taller."
) +
tema_clase +
theme(
axis.title = element_blank(),
axis.text = element_blank(),
axis.ticks = element_blank(),
panel.grid = element_blank(),
legend.position = "right"
)
# Mapa del número total de casos denunciados
ggplot(upz_mapa) +
geom_sf(
aes(fill = casos_total),
color = "white",
linewidth = 0.15
) +
scale_fill_gradientn(
colours = c("#E9E3ED", "#A98DBB", "#D9006C", "#351A4F"),
name = "Casos\ndenunciados",
labels = scales::label_comma(),
na.value = "grey85"
) +
labs(
title = "Distribución territorial de los casos denunciados",
subtitle = "UPZ de Bogotá · Enero a julio de 2023",
caption = "Fuente: elaboración propia con información estadística y geográfica suministrada para el taller."
) +
tema_clase +
theme(
axis.title = element_blank(),
axis.text = element_blank(),
axis.ticks = element_blank(),
panel.grid = element_blank(),
legend.position = "right"
)
Antes de construir la representación cartográfica definitiva, se revisó la distribución de la tasa total de delitos para identificar posibles valores extremos que pudieran afectar la interpretación visual.
Esta revisión permite reconocer que las tasas pueden presentar valores elevados cuando el número de habitantes de una UPZ es reducido. En estos casos, una cantidad relativamente pequeña de denuncias puede producir tasas considerablemente altas.
Por esta razón, se considera necesario diferenciar entre el valor numérico de la tasa y su estabilidad como indicador comparativo. Los valores originales se conservarán, pero se evaluarán alternativas de representación que permitan visualizar mejor las diferencias entre las unidades territoriales.
# Crear vector con los valores válidos
tasas_validas <- upz$tasa_total[
!is.na(upz$tasa_total) & is.finite(upz$tasa_total)
]
# Calcular asimetría mediante el tercer momento estandarizado
asimetria <- mean(
(tasas_validas - mean(tasas_validas))^3
) / sd(tasas_validas)^3
# Resumen de la distribución de la tasa total
upz %>%
summarise(
Minimo = min(tasa_total, na.rm = TRUE),
Q1 = quantile(tasa_total, 0.25, na.rm = TRUE),
Mediana = median(tasa_total, na.rm = TRUE),
Q3 = quantile(tasa_total, 0.75, na.rm = TRUE),
P90 = quantile(tasa_total, 0.90, na.rm = TRUE),
P95 = quantile(tasa_total, 0.95, na.rm = TRUE),
Maximo = max(tasa_total, na.rm = TRUE)
)
| Minimo | Q1 | Mediana | Q3 | P90 | P95 | Maximo |
|---|---|---|---|---|---|---|
| 64.47 | 129.5075 | 192.525 | 287.615 | 1019.12 | 1561.871 | 11333.33 |
# Presentar el coeficiente de asimetría
cat(
"Coeficiente de asimetría:",
round(asimetria, 3),
"\n"
)
## Coeficiente de asimetría: 6.549
# Identificar las 10 UPZ con mayores tasas
upz %>%
arrange(desc(tasa_total)) %>%
select(
upz_nombre,
poblacion,
casos_total,
tasa_total
) %>%
slice_head(n = 10)
| upz_nombre | poblacion | casos_total | tasa_total |
|---|---|---|---|
| El Mochuelo | 30 | 34 | 11333.33 |
| Aeropuerto El Dorado | 883 | 545 | 6172.14 |
| Parque Simon Bolivar - Can | 3323 | 958 | 2882.94 |
| Zona Industrial | 6666 | 1573 | 2359.74 |
| Las Nieves | 17203 | 4033 | 2344.36 |
| Parque Salitre | 1442 | 233 | 1615.81 |
| Sagrado Corazon | 11247 | 1707 | 1517.74 |
| La Sabana | 38856 | 5441 | 1400.30 |
| Chico Lago | 38608 | 4985 | 1291.18 |
| Puente Aranda | 12482 | 1561 | 1250.60 |
Debido a la asimetría identificada en la distribución de la tasa total de delitos, se propone una representación cartográfica complementaria mediante una escala logarítmica.
Esta transformación permite reducir el efecto visual de los valores extremos y mejorar la diferenciación de las UPZ que presentan tasas bajas y medias. Es importante aclarar que la transformación se aplica exclusivamente a la escala de representación y no modifica los valores originales utilizados en el análisis estadístico.
De esta manera, se busca facilitar la comparación territorial sin eliminar observaciones ni ocultar la existencia de valores elevados.
# Identificar UPZ con poblaciones más pequeñas
upz %>%
arrange(poblacion) %>%
select(
upz_nombre,
poblacion,
casos_total,
tasa_total
) %>%
slice_head(n = 15)
| upz_nombre | poblacion | casos_total | tasa_total |
|---|---|---|---|
| El Mochuelo | 30 | 34 | 11333.33 |
| Aeropuerto El Dorado | 883 | 545 | 6172.14 |
| Parque Entrenubes | 1169 | 16 | 136.87 |
| Parque Salitre | 1442 | 233 | 1615.81 |
| Paseo De Los Libertadores | 2690 | 74 | 275.09 |
| Guaymaral | 2692 | 45 | 167.16 |
| Jardin Botanico | 2900 | 266 | 917.24 |
| Parque Simon Bolivar - Can | 3323 | 958 | 2882.94 |
| La Academia | 5260 | 123 | 233.84 |
| Monte Blanco | 6575 | 80 | 121.67 |
| Zona Industrial | 6666 | 1573 | 2359.74 |
| Sagrado Corazon | 11247 | 1707 | 1517.74 |
| Alamos | 12077 | 642 | 531.59 |
| La Macarena | 12253 | 507 | 413.78 |
| Puente Aranda | 12482 | 1561 | 1250.60 |
Como alternativa a la representación mediante escalas continuas, se construye un mapa temático basado en quintiles. Esta clasificación organiza las UPZ en cinco grupos de acuerdo con la posición relativa de sus tasas de delitos.
La utilización de quintiles facilita la identificación de las unidades territoriales que presentan niveles relativamente bajos, intermedios o altos dentro del conjunto analizado.
A diferencia de la transformación logarítmica, esta clasificación no modifica la escala numérica de los datos, sino que agrupa las observaciones en categorías. Por tanto, debe interpretarse como una herramienta de comparación relativa y no como una clasificación de riesgo absoluto.
Los valores originales de las tasas se conservan para los análisis estadísticos y para la identificación de posibles valores extremos.
# Clasificar las UPZ en cinco grupos según su tasa total
upz_mapa <- upz_mapa %>%
mutate(
quintil_tasa = ntile(tasa_total, 5),
quintil_tasa = factor(
quintil_tasa,
levels = 1:5,
labels = c(
"Q1 - Muy bajo",
"Q2 - Bajo",
"Q3 - Medio",
"Q4 - Alto",
"Q5 - Muy alto"
)
)
)
# Construir mapa por quintiles
ggplot(upz_mapa) +
geom_sf(
aes(fill = quintil_tasa),
color = "white",
linewidth = 0.15
) +
scale_fill_manual(
values = c(
"Q1 - Muy bajo" = "#E9E3ED",
"Q2 - Bajo" = "#C8B5D3",
"Q3 - Medio" = "#A98DBB",
"Q4 - Alto" = "#D9006C",
"Q5 - Muy alto" = "#351A4F"
),
name = "Quintiles",
na.value = "grey85"
) +
labs(
title = "Clasificación territorial de la tasa de delitos",
subtitle = "UPZ agrupadas en cinco quintiles · Enero a julio de 2023",
caption = "Los quintiles representan posiciones relativas dentro de las UPZ analizadas. No constituyen categorías de riesgo absoluto."
) +
tema_clase +
theme(
axis.title = element_blank(),
axis.text = element_blank(),
axis.ticks = element_blank(),
panel.grid = element_blank(),
legend.position = "right"
)
upz_mapa %>%
st_drop_geometry() %>%
group_by(quintil_tasa) %>%
summarise(
Numero_UPZ = n(),
Tasa_minima = min(tasa_total, na.rm = TRUE),
Tasa_mediana = median(tasa_total, na.rm = TRUE),
Tasa_maxima = max(tasa_total, na.rm = TRUE),
Poblacion_total = sum(poblacion, na.rm = TRUE),
.groups = "drop"
)
| quintil_tasa | Numero_UPZ | Tasa_minima | Tasa_mediana | Tasa_maxima | Poblacion_total |
|---|---|---|---|---|---|
| Q1 - Muy bajo | 23 | 64.47 | 99.850 | 119.89 | 2584989 |
| Q2 - Bajo | 23 | 121.67 | 143.740 | 167.17 | 2048928 |
| Q3 - Medio | 22 | 167.77 | 195.650 | 225.79 | 1775200 |
| Q4 - Alto | 22 | 233.84 | 270.825 | 413.78 | 1068099 |
| Q5 - Muy alto | 22 | 427.21 | 1062.765 | 11333.33 | 459316 |
Antes de interpretar los mapas como una distribución territorial de inseguridad, debemos revisar el tamaño de la población que sirve como denominador de las tasas.
# Identificar las 15 UPZ con menor población
upz %>%
arrange(poblacion) %>%
select(
upz_nombre,
poblacion,
casos_total,
tasa_total
) %>%
slice_head(n = 15)
| upz_nombre | poblacion | casos_total | tasa_total |
|---|---|---|---|
| El Mochuelo | 30 | 34 | 11333.33 |
| Aeropuerto El Dorado | 883 | 545 | 6172.14 |
| Parque Entrenubes | 1169 | 16 | 136.87 |
| Parque Salitre | 1442 | 233 | 1615.81 |
| Paseo De Los Libertadores | 2690 | 74 | 275.09 |
| Guaymaral | 2692 | 45 | 167.16 |
| Jardin Botanico | 2900 | 266 | 917.24 |
| Parque Simon Bolivar - Can | 3323 | 958 | 2882.94 |
| La Academia | 5260 | 123 | 233.84 |
| Monte Blanco | 6575 | 80 | 121.67 |
| Zona Industrial | 6666 | 1573 | 2359.74 |
| Sagrado Corazon | 11247 | 1707 | 1517.74 |
| Alamos | 12077 | 642 | 531.59 |
| La Macarena | 12253 | 507 | 413.78 |
| Puente Aranda | 12482 | 1561 | 1250.60 |
# Relación entre población y tasa total
ggplot(upz, aes(x = poblacion, y = tasa_total)) +
geom_point(
color = "#D9006C",
alpha = 0.75,
size = 2.5
) +
scale_x_continuous(
labels = scales::label_comma()
) +
scale_y_continuous(
labels = scales::label_comma()
) +
labs(
title = "Población y tasa total de delitos por UPZ",
subtitle = "Evaluación de la influencia del tamaño poblacional",
x = "Población",
y = "Tasa por cada 10.000 habitantes"
) +
tema_clase
Como complemento a las representaciones cartográficas estáticas, se construye un mapa interactivo mediante la librería Leaflet. Esta herramienta permite explorar las unidades territoriales con mayor detalle y consultar información específica de cada UPZ.
La visualización utiliza la clasificación por quintiles de la tasa total de delitos, conservando la misma categorización del mapa estático. Al seleccionar o ubicar el cursor sobre cada polígono, es posible consultar el nombre de la UPZ, su población, el número de casos denunciados y la tasa registrada durante el periodo analizado.
Esta representación facilita la exploración individual de los territorios y permite contrastar los valores absolutos con las tasas relativas, sin perder de vista las limitaciones asociadas al tamaño poblacional de algunas UPZ.
# Definir la paleta de colores para los quintiles
paleta_quintiles <- colorFactor(
palette = c(
"#E9E3ED",
"#C8B5D3",
"#A98DBB",
"#D9006C",
"#351A4F"
),
domain = levels(upz_mapa$quintil_tasa),
na.color = "grey85"
)
# Construir etiquetas de las UPZ
etiquetas_upz <- paste0(
"<strong>UPZ: </strong>",
upz_mapa$upz_nombre,
"<br><strong>Población: </strong>",
scales::comma(upz_mapa$poblacion),
"<br><strong>Casos denunciados: </strong>",
scales::comma(upz_mapa$casos_total),
"<br><strong>Tasa por 10.000 habitantes: </strong>",
scales::number(upz_mapa$tasa_total, accuracy = 0.1),
"<br><strong>Clasificación: </strong>",
upz_mapa$quintil_tasa
)
# Crear mapa interactivo
leaflet(upz_mapa) %>%
addProviderTiles(
providers$OpenStreetMap.Mapnik
) %>%
addPolygons(
fillColor = ~paleta_quintiles(quintil_tasa),
fillOpacity = 0.75,
color = "white",
weight = 1,
opacity = 1,
label = lapply(etiquetas_upz, htmltools::HTML),
highlightOptions = highlightOptions(
weight = 3,
color = "#D9006C",
fillOpacity = 0.9,
bringToFront = TRUE
)
) %>%
addLegend(
position = "bottomright",
pal = paleta_quintiles,
values = ~quintil_tasa,
title = "Tasa de delitos",
opacity = 0.8
)
Las representaciones cartográficas desarrolladas permiten observar la distribución territorial de los delitos desde diferentes perspectivas.
La escala continua conserva la magnitud original de las tasas, aunque puede verse condicionada por la presencia de valores extremos. La escala logarítmica facilita la diferenciación visual de los valores bajos e intermedios, mientras que la clasificación por quintiles permite comparar la posición relativa de cada UPZ dentro del conjunto analizado.
Estas alternativas no son excluyentes, ya que responden a objetivos de visualización diferentes. Por esta razón, su interpretación debe considerar tanto la escala utilizada como las características de la población de cada unidad territorial.
En particular, las tasas calculadas sobre poblaciones pequeñas requieren precaución, debido a que pocos casos pueden generar variaciones importantes en el indicador. Por tanto, los mapas deben interpretarse como una exploración de las denuncias registradas y no como una medición definitiva de la inseguridad real de cada territorio.
Además de los registros de delitos denunciados, el análisis incorpora variables relacionadas con la percepción de inseguridad y las características del entorno urbano.
Estas dimensiones permiten ampliar la comprensión del fenómeno, considerando que la experiencia de inseguridad de los habitantes no necesariamente coincide con la cantidad de denuncias registradas en cada territorio.
En esta sección se explora la distribución geográfica de la percepción de inseguridad, la cercanía a determinados elementos del entorno y la accesibilidad a los CAI de policía. El propósito es identificar diferencias territoriales y contrastarlas con los indicadores de delitos analizados anteriormente.
# Mapa de percepción de inseguridad
ggplot(upz_mapa) +
geom_sf(
aes(fill = pct_percibe_inseguridad),
color = "white",
linewidth = 0.15
) +
scale_fill_gradientn(
colours = c("#E9E3ED", "#A98DBB", "#D9006C", "#351A4F"),
name = "Percepción\n(%)",
na.value = "grey85"
) +
labs(
title = "Percepción de inseguridad en el entorno de las UPZ",
subtitle = "Porcentaje reportado en la Encuesta Multipropósito 2021",
caption = "Fuente: Encuesta Multipropósito DANE 2021. Algunas UPZ comparten estimaciones agrupadas."
) +
tema_clase +
theme(
axis.title = element_blank(),
axis.text = element_blank(),
axis.ticks = element_blank(),
panel.grid = element_blank(),
legend.position = "right"
)
Las características del entorno pueden aportar información adicional para comprender las diferencias territoriales relacionadas con la seguridad.
Para este análisis se consideran dos indicadores de la Encuesta Multipropósito: el porcentaje de viviendas afectadas por la cercanía a lotes baldíos o sitios oscuros y el porcentaje de viviendas afectadas por la cercanía a expendios de droga.
La representación geográfica de estas variables permite explorar cómo se distribuyen dichas condiciones entre las UPZ y posteriormente contrastarlas con las tasas de delitos denunciados.
Es importante señalar que estos indicadores corresponden a percepciones o condiciones reportadas por los hogares encuestados. Por tanto, no deben interpretarse como evidencia directa de que estos elementos ocasionen mayores niveles de delincuencia.
ggplot(upz_mapa) +
geom_sf(
aes(fill = pct_cerca_lotes_oscuros),
color = "white",
linewidth = 0.15
) +
scale_fill_gradientn(
colours = c("#E9E3ED", "#A98DBB", "#D9006C", "#351A4F"),
name = "Viviendas\nafectadas (%)",
na.value = "grey85"
) +
labs(
title = "Cercanía a lotes baldíos y sitios oscuros",
subtitle = "Porcentaje de viviendas afectadas · Encuesta 2021",
caption = "Fuente: Encuesta Multipropósito DANE 2021. Algunas UPZ comparten estimaciones agrupadas."
) +
tema_clase +
theme(
axis.title = element_blank(),
axis.text = element_blank(),
axis.ticks = element_blank(),
panel.grid = element_blank(),
legend.position = "right"
)
ggplot(upz_mapa) +
geom_sf(
aes(fill = pct_cerca_ollas),
color = "white",
linewidth = 0.15
) +
scale_fill_gradientn(
colours = c("#E9E3ED", "#A98DBB", "#D9006C", "#351A4F"),
name = "Viviendas\nafectadas (%)",
na.value = "grey85"
) +
labs(
title = "Cercanía a expendios de droga",
subtitle = "Porcentaje de viviendas afectadas · Encuesta 2021",
caption = "Fuente: Encuesta Multipropósito DANE 2021. Algunas UPZ comparten estimaciones agrupadas."
) +
tema_clase +
theme(
axis.title = element_blank(),
axis.text = element_blank(),
axis.ticks = element_blank(),
panel.grid = element_blank(),
legend.position = "right"
)
La accesibilidad a los servicios de seguridad constituye otra dimensión de interés para el análisis territorial.
Para explorar esta característica se utiliza la variable
min_cai_policia, que representa el tiempo promedio
caminando desde las viviendas hasta un CAI de policía.
Su representación geográfica permite identificar diferencias en la accesibilidad territorial y contrastarlas posteriormente con los indicadores de delitos y percepción de inseguridad.
Sin embargo, este indicador debe interpretarse con precaución, ya que la distancia o el tiempo promedio de desplazamiento no representan por sí mismos la capacidad operativa de la Policía, su presencia permanente en el territorio ni los tiempos efectivos de atención.
ggplot(upz_mapa) +
geom_sf(
aes(fill = min_cai_policia),
color = "white",
linewidth = 0.15
) +
scale_fill_gradientn(
colours = c("#E9E3ED", "#A98DBB", "#D9006C", "#351A4F"),
name = "Minutos\ncaminando",
na.value = "grey85"
) +
labs(
title = "Accesibilidad territorial a los CAI de policía",
subtitle = "Tiempo promedio caminando desde las viviendas",
caption = "Fuente: Encuesta Multipropósito DANE 2021. Algunas UPZ comparten estimaciones agrupadas."
) +
tema_clase +
theme(
axis.title = element_blank(),
axis.text = element_blank(),
axis.ticks = element_blank(),
panel.grid = element_blank(),
legend.position = "right"
)
Antes de pasar a la interpretación, construimos una tabla que reúne los indicadores de seguridad, percepción y entorno. Esto nos permitirá identificar las UPZ que presentan valores destacados en diferentes dimensiones.
tabla_indicadores_territoriales <- upz %>%
select(
upz_nombre,
poblacion,
casos_total,
tasa_total,
pct_percibe_inseguridad,
pct_cerca_lotes_oscuros,
pct_cerca_ollas,
min_cai_policia,
em_agrupada
) %>%
arrange(desc(tasa_total))
knitr::kable(
head(tabla_indicadores_territoriales, 15),
digits = 2,
caption = "UPZ con mayores tasas de delitos y sus indicadores territoriales"
)
| upz_nombre | poblacion | casos_total | tasa_total | pct_percibe_inseguridad | pct_cerca_lotes_oscuros | pct_cerca_ollas | min_cai_policia | em_agrupada |
|---|---|---|---|---|---|---|---|---|
| El Mochuelo | 30 | 34 | 11333.33 | 86.83 | 44.99 | 52.33 | 27.39 | TRUE |
| Aeropuerto El Dorado | 883 | 545 | 6172.14 | 32.58 | 40.06 | 17.00 | 26.31 | TRUE |
| Parque Simon Bolivar - Can | 3323 | 958 | 2882.94 | 32.98 | 1.22 | 0.31 | 13.10 | TRUE |
| Zona Industrial | 6666 | 1573 | 2359.74 | 66.27 | 45.32 | 51.50 | 17.17 | TRUE |
| Las Nieves | 17203 | 4033 | 2344.36 | 59.85 | 18.59 | 23.13 | 10.06 | TRUE |
| Parque Salitre | 1442 | 233 | 1615.81 | 65.97 | 13.78 | 10.63 | 16.14 | TRUE |
| Sagrado Corazon | 11247 | 1707 | 1517.74 | 59.85 | 18.59 | 23.13 | 10.06 | TRUE |
| La Sabana | 38856 | 5441 | 1400.30 | 83.45 | 38.71 | 61.44 | 16.00 | FALSE |
| Chico Lago | 38608 | 4985 | 1291.18 | 21.48 | 0.64 | 3.12 | 13.11 | TRUE |
| Puente Aranda | 12482 | 1561 | 1250.60 | 66.27 | 45.32 | 51.50 | 17.17 | TRUE |
| Chapinero | 26491 | 2901 | 1095.09 | 50.28 | 10.35 | 20.92 | 15.62 | TRUE |
| Teusaquillo | 28881 | 2976 | 1030.44 | 62.90 | 5.91 | 6.04 | 10.36 | FALSE |
| Jardin Botanico | 2900 | 266 | 917.24 | 76.48 | 8.34 | 3.18 | 17.71 | TRUE |
| Galerias | 38425 | 3067 | 798.18 | 48.52 | 17.51 | 22.49 | 12.79 | FALSE |
| Los Alcazares | 44678 | 3495 | 782.26 | 69.78 | 11.13 | 18.43 | 12.78 | FALSE |
Después de explorar la distribución geográfica de los indicadores, se realiza una comparación visual entre la tasa total de delitos y algunas características sociales y urbanas de las UPZ.
El propósito es identificar si las unidades territoriales que presentan mayores niveles de percepción de inseguridad o determinadas condiciones del entorno también registran tasas de delitos más elevadas.
Este análisis complementa las correlaciones estadísticas desarrolladas anteriormente, ya que permite observar la dispersión de las observaciones, reconocer posibles valores extremos y evaluar si existe algún patrón visual entre las variables.
# Relación entre tasa de delitos y percepción de inseguridad
ggplot(
upz,
aes(
x = pct_percibe_inseguridad,
y = tasa_total,
color = em_agrupada
)
) +
geom_point(
alpha = 0.75,
size = 2.5
) +
scale_y_log10(
labels = scales::label_comma()
) +
scale_color_manual(
values = c(
"FALSE" = "#168C86",
"TRUE" = "#D9006C"
),
labels = c(
"FALSE" = "Estimación individual",
"TRUE" = "Estimación agrupada"
),
name = "Tipo de estimación"
) +
labs(
title = "Tasa de delitos y percepción de inseguridad",
subtitle = "Comparación entre UPZ · Eje vertical en escala logarítmica",
x = "Percepción de inseguridad (%)",
y = "Tasa de delitos por 10.000 habitantes",
caption = "Fuentes: Encuesta Multipropósito 2021 y registros de delitos enero-julio 2023."
) +
tema_clase
Se explora la relación entre la tasa total de delitos y dos indicadores asociados con las condiciones del entorno urbano: la cercanía a lotes baldíos o sitios oscuros y la cercanía a expendios de droga.
Estas variables permiten examinar si las UPZ donde una mayor proporción de viviendas reporta estas condiciones también presentan mayores tasas de delitos denunciados.
La comparación se realiza mediante gráficos de dispersión, manteniendo identificadas las estimaciones agrupadas de la Encuesta Multipropósito. Los resultados permiten reconocer posibles tendencias y diferencias entre las unidades territoriales, sin asumir que las condiciones observadas expliquen directamente la ocurrencia de delitos.
ggplot(
upz,
aes(
x = pct_cerca_lotes_oscuros,
y = tasa_total,
color = em_agrupada
)
) +
geom_point(
alpha = 0.75,
size = 2.5
) +
scale_y_log10(
labels = scales::label_comma()
) +
scale_color_manual(
values = c(
"FALSE" = "#168C86",
"TRUE" = "#D9006C"
),
labels = c(
"FALSE" = "Estimación individual",
"TRUE" = "Estimación agrupada"
),
name = "Tipo de estimación"
) +
labs(
title = "Cercanía a lotes oscuros y tasa de delitos",
subtitle = "Eje vertical en escala logarítmica",
x = "Viviendas afectadas por cercanía a lotes oscuros (%)",
y = "Tasa de delitos por 10.000 habitantes",
caption = "Fuentes: Encuesta Multipropósito 2021 y registros de delitos enero-julio 2023."
) +
tema_clase
ggplot(
upz,
aes(
x = pct_cerca_ollas,
y = tasa_total,
color = em_agrupada
)
) +
geom_point(
alpha = 0.75,
size = 2.5
) +
scale_y_log10(
labels = scales::label_comma()
) +
scale_color_manual(
values = c(
"FALSE" = "#168C86",
"TRUE" = "#D9006C"
),
labels = c(
"FALSE" = "Estimación individual",
"TRUE" = "Estimación agrupada"
),
name = "Tipo de estimación"
) +
labs(
title = "Cercanía a expendios de droga y tasa de delitos",
subtitle = "Eje vertical en escala logarítmica",
x = "Viviendas afectadas por cercanía a expendios de droga (%)",
y = "Tasa de delitos por 10.000 habitantes",
caption = "Fuentes: Encuesta Multipropósito 2021 y registros de delitos enero-julio 2023."
) +
tema_clase
Como última comparación se analiza la relación entre la tasa total de delitos y el tiempo promedio caminando hasta un CAI de policía.
Esta exploración permite observar si existen diferencias en las tasas de delitos entre las UPZ según su nivel de accesibilidad territorial a este servicio.
La variable utilizada representa tiempos promedio de desplazamiento y no mide directamente la cobertura policial, la cantidad de uniformados o la capacidad de respuesta institucional. Por tanto, cualquier asociación identificada debe interpretarse considerando el alcance específico del indicador.
ggplot(
upz,
aes(
x = min_cai_policia,
y = tasa_total,
color = em_agrupada
)
) +
geom_point(
alpha = 0.75,
size = 2.5
) +
scale_y_log10(
labels = scales::label_comma()
) +
scale_color_manual(
values = c(
"FALSE" = "#168C86",
"TRUE" = "#D9006C"
),
labels = c(
"FALSE" = "Estimación individual",
"TRUE" = "Estimación agrupada"
),
name = "Tipo de estimación"
) +
labs(
title = "Accesibilidad a los CAI y tasa de delitos",
subtitle = "Eje vertical en escala logarítmica",
x = "Tiempo promedio caminando hasta un CAI (minutos)",
y = "Tasa de delitos por 10.000 habitantes",
caption = "Fuentes: Encuesta Multipropósito 2021 y registros de delitos enero-julio 2023."
) +
tema_clase
Los gráficos de dispersión permiten observar el comportamiento conjunto de los indicadores de seguridad y las condiciones territoriales. Para complementar esta exploración visual, se presenta una síntesis de las correlaciones de Spearman entre la tasa total de delitos y las variables seleccionadas.
El coeficiente de Spearman permite evaluar la dirección y la intensidad de una asociación monotónica entre dos variables. Su utilización resulta conveniente en esta etapa exploratoria, debido a que los indicadores presentan distribuciones con asimetrías y posibles valores extremos.
Los coeficientes deben interpretarse como asociaciones estadísticas y no como evidencia de causalidad. Adicionalmente, las variables provenientes de la Encuesta Multipropósito tienen la limitación de contar con estimaciones agrupadas para algunas UPZ.
# Variables seleccionadas para la comparación territorial
variables_territoriales <- upz %>%
select(
tasa_total,
pct_percibe_inseguridad,
pct_cerca_lotes_oscuros,
pct_cerca_ollas,
min_cai_policia
)
# Calcular correlaciones de Spearman con la tasa total
correlaciones_territoriales <- tibble(
Variable = c(
"Percepción de inseguridad",
"Cercanía a lotes oscuros",
"Cercanía a expendios de droga",
"Tiempo de acceso a CAI"
),
rho = c(
cor(
variables_territoriales$tasa_total,
variables_territoriales$pct_percibe_inseguridad,
method = "spearman",
use = "complete.obs"
),
cor(
variables_territoriales$tasa_total,
variables_territoriales$pct_cerca_lotes_oscuros,
method = "spearman",
use = "complete.obs"
),
cor(
variables_territoriales$tasa_total,
variables_territoriales$pct_cerca_ollas,
method = "spearman",
use = "complete.obs"
),
cor(
variables_territoriales$tasa_total,
variables_territoriales$min_cai_policia,
method = "spearman",
use = "complete.obs"
)
)
) %>%
mutate(
Intensidad = case_when(
abs(rho) < 0.20 ~ "Muy débil",
abs(rho) < 0.40 ~ "Débil",
abs(rho) < 0.60 ~ "Moderada",
abs(rho) < 0.80 ~ "Fuerte",
TRUE ~ "Muy fuerte"
),
Direccion = if_else(
rho >= 0,
"Positiva",
"Negativa"
)
) %>%
arrange(desc(abs(rho)))
# Presentar resultados
knitr::kable(
correlaciones_territoriales,
digits = 3,
caption = "Correlaciones de Spearman entre tasa de delitos y condiciones territoriales"
)
| Variable | rho | Intensidad | Direccion |
|---|---|---|---|
| Cercanía a lotes oscuros | -0.365 | Débil | Negativa |
| Tiempo de acceso a CAI | -0.339 | Débil | Negativa |
| Cercanía a expendios de droga | -0.335 | Débil | Negativa |
| Percepción de inseguridad | -0.293 | Débil | Negativa |
Debido a que una parte de las UPZ comparte estimaciones provenientes de la Encuesta Multipropósito, se realiza un análisis de sensibilidad para evaluar si esta característica puede influir en las asociaciones identificadas.
Para ello, se comparan las correlaciones de Spearman calculadas con el conjunto completo de UPZ y aquellas obtenidas únicamente con las unidades territoriales que cuentan con estimaciones individuales.
La comparación permite observar si la dirección y la magnitud de las asociaciones se mantienen bajo ambos escenarios. También se considera la cantidad de observaciones utilizadas en cada cálculo, dado que la exclusión de las estimaciones agrupadas reduce el tamaño del conjunto analizado.
Este ejercicio constituye una validación complementaria de los resultados exploratorios. No obstante, el análisis con estimaciones individuales representa un subconjunto de las UPZ y no elimina necesariamente todas las limitaciones de representatividad de la encuesta.
# Definir las variables que se van a comparar
variables_sensibilidad <- c(
"pct_percibe_inseguridad",
"pct_cerca_lotes_oscuros",
"pct_cerca_ollas",
"min_cai_policia"
)
# Función para calcular las correlaciones de Spearman
calcular_correlaciones <- function(datos, escenario) {
purrr::map_dfr(variables_sensibilidad, function(variable) {
datos_validos <- datos %>%
select(
tasa_total,
all_of(variable)
) %>%
drop_na() %>%
filter(
is.finite(tasa_total),
is.finite(.data[[variable]])
)
tibble(
Escenario = escenario,
Variable = variable,
Numero_UPZ = nrow(datos_validos),
rho = if (nrow(datos_validos) >= 3) {
cor(
datos_validos$tasa_total,
datos_validos[[variable]],
method = "spearman"
)
} else {
NA_real_
}
)
})
}
# Escenario 1: todas las UPZ
correlaciones_completas <- calcular_correlaciones(
upz,
"Todas_UPZ"
)
# Escenario 2: únicamente estimaciones individuales
upz_individuales <- upz %>%
filter(em_agrupada == FALSE)
correlaciones_individuales <- calcular_correlaciones(
upz_individuales,
"UPZ_individuales"
)
# Integrar los resultados
comparacion_sensibilidad <- bind_rows(
correlaciones_completas,
correlaciones_individuales
) %>%
mutate(
Variable = recode(
Variable,
pct_percibe_inseguridad = "Percepción de inseguridad",
pct_cerca_lotes_oscuros = "Cercanía a lotes oscuros",
pct_cerca_ollas = "Cercanía a expendios de droga",
min_cai_policia = "Tiempo de acceso a CAI"
)
)
# Organizar la comparación en columnas
tabla_sensibilidad <- comparacion_sensibilidad %>%
pivot_wider(
names_from = Escenario,
values_from = c(rho, Numero_UPZ)
) %>%
mutate(
Diferencia_rho = rho_Todas_UPZ -
rho_UPZ_individuales,
Direccion_consistente = case_when(
is.na(rho_Todas_UPZ) |
is.na(rho_UPZ_individuales) ~ "No evaluable",
sign(rho_Todas_UPZ) ==
sign(rho_UPZ_individuales) ~ "Sí",
TRUE ~ "No"
)
) %>%
arrange(desc(abs(rho_Todas_UPZ)))
# Presentar resultados
knitr::kable(
tabla_sensibilidad,
digits = 3,
caption = "Análisis de sensibilidad de las correlaciones de Spearman"
)
| Variable | rho_Todas_UPZ | rho_UPZ_individuales | Numero_UPZ_Todas_UPZ | Numero_UPZ_UPZ_individuales | Diferencia_rho | Direccion_consistente |
|---|---|---|---|---|---|---|
| Cercanía a lotes oscuros | -0.365 | -0.511 | 112 | 80 | 0.145 | Sí |
| Tiempo de acceso a CAI | -0.339 | -0.455 | 112 | 80 | 0.117 | Sí |
| Cercanía a expendios de droga | -0.335 | -0.342 | 112 | 80 | 0.007 | Sí |
| Percepción de inseguridad | -0.293 | -0.253 | 112 | 80 | -0.040 | Sí |
Para complementar la comparación numérica, se presenta una visualización de los coeficientes de correlación obtenidos en ambos escenarios. Esta representación permite identificar de manera directa si las asociaciones conservan su dirección y si presentan cambios importantes en su magnitud.
ggplot(
comparacion_sensibilidad,
aes(
x = rho,
y = reorder(Variable, rho),
color = Escenario
)
) +
geom_vline(
xintercept = 0,
linetype = "dashed",
color = "grey50"
) +
geom_point(
size = 3,
position = position_dodge(width = 0.5)
) +
scale_color_manual(
values = c(
"Todas_UPZ" = "#351A4F",
"UPZ_individuales" = "#168C86"
),
labels = c(
"Todas_UPZ" = "Todas las UPZ",
"UPZ_individuales" = "Estimaciones individuales"
),
name = "Escenario"
) +
scale_x_continuous(
limits = c(-1, 1),
breaks = seq(-1, 1, by = 0.2)
) +
labs(
title = "Estabilidad de las correlaciones según tipo de estimación",
subtitle = "Comparación de los coeficientes de Spearman",
x = "Coeficiente de Spearman",
y = NULL
) +
tema_clase
El análisis exploratorio se desarrolló a partir de preguntas orientadas a comprender las diferencias territoriales en los indicadores de seguridad y su posible relación con las características demográficas, socioeconómicas y urbanas de las UPZ de Bogotá.
A partir de la información disponible, se establecieron las siguientes preguntas de investigación:
Estas preguntas articulan los análisis estadísticos y las representaciones gráficas desarrolladas en las secciones anteriores. Su propósito es integrar los resultados en una narrativa que permita comprender no solo dónde se registran más denuncias, sino también cómo se relacionan estos registros con las características de cada territorio.
Esta matriz nos permitirá demostrar que cada pregunta tiene un respaldo analítico y que no estamos incluyendo gráficos sin una finalidad concreta.
matriz_preguntas <- tibble(
Pregunta = c(
"¿Las UPZ con más denuncias también tienen mayores tasas?",
"¿Cómo influye el tamaño poblacional en las tasas?",
"¿Qué diferencias territoriales existen en los delitos?",
"¿Existe asociación entre alumbrado y delitos?",
"¿Cómo se relacionan las condiciones socioeconómicas y los delitos?",
"¿La percepción coincide con los delitos denunciados?",
"¿Qué relación tienen el entorno y la accesibilidad a los CAI?"
),
Variables = c(
"casos_total, tasa_total",
"poblacion, densidad_hab_km2, tasa_total",
"casos_total, tasa_total, upz_nombre",
"luminarias_km2, luminarias_1000hab, pct_luminarias_led, tasa_total",
"pct_pobreza, salario_promedio, pct_estrato_1_2, tasa_total",
"pct_percibe_inseguridad, tasa_total",
"pct_cerca_lotes_oscuros, pct_cerca_ollas, min_cai_policia, tasa_total"
),
Analisis = c(
"Comparación de casos y tasas",
"Distribuciones y valores extremos",
"Mapas de tasas y casos",
"Correlaciones y gráficos de dispersión",
"Estadísticas descriptivas y correlaciones",
"Mapas, dispersión y correlación",
"Mapas, dispersión y análisis de sensibilidad"
)
)
knitr::kable(
matriz_preguntas,
caption = "Relación entre preguntas de investigación, variables y análisis"
)
| Pregunta | Variables | Analisis |
|---|---|---|
| ¿Las UPZ con más denuncias también tienen mayores tasas? | casos_total, tasa_total | Comparación de casos y tasas |
| ¿Cómo influye el tamaño poblacional en las tasas? | poblacion, densidad_hab_km2, tasa_total | Distribuciones y valores extremos |
| ¿Qué diferencias territoriales existen en los delitos? | casos_total, tasa_total, upz_nombre | Mapas de tasas y casos |
| ¿Existe asociación entre alumbrado y delitos? | luminarias_km2, luminarias_1000hab, pct_luminarias_led, tasa_total | Correlaciones y gráficos de dispersión |
| ¿Cómo se relacionan las condiciones socioeconómicas y los delitos? | pct_pobreza, salario_promedio, pct_estrato_1_2, tasa_total | Estadísticas descriptivas y correlaciones |
| ¿La percepción coincide con los delitos denunciados? | pct_percibe_inseguridad, tasa_total | Mapas, dispersión y correlación |
| ¿Qué relación tienen el entorno y la accesibilidad a los CAI? | pct_cerca_lotes_oscuros, pct_cerca_ollas, min_cai_policia, tasa_total | Mapas, dispersión y análisis de sensibilidad |
La primera pregunta busca establecer si las unidades territoriales que concentran el mayor número de denuncias son también aquellas que presentan una mayor intensidad delictiva en relación con su población.
Para responderla se comparan dos indicadores: el número total de casos denunciados y la tasa de delitos por cada 10.000 habitantes. Esta distinción es importante porque el volumen de denuncias puede estar relacionado con el tamaño poblacional de cada UPZ, mientras que la tasa permite realizar una comparación relativa.
El análisis se desarrolla mediante la comparación de los rankings de casos y tasas, así como de la relación entre población y número de denuncias. De esta manera, se busca identificar si los territorios que concentran más casos también ocupan las primeras posiciones cuando se considera su población.
# Top 10 de UPZ por número de casos denunciados
ranking_casos_731 <- upz %>%
arrange(desc(casos_total)) %>%
select(
upz_nombre,
poblacion,
casos_total,
tasa_total
) %>%
slice_head(n = 10) %>%
mutate(Posicion_casos = row_number())
# Top 10 de UPZ por tasa de delitos
ranking_tasas_731 <- upz %>%
arrange(desc(tasa_total)) %>%
select(
upz_nombre,
poblacion,
casos_total,
tasa_total
) %>%
slice_head(n = 10) %>%
mutate(Posicion_tasa = row_number())
# Presentar ranking por casos
knitr::kable(
ranking_casos_731,
digits = 2,
caption = "Top 10 de UPZ según número de casos denunciados"
)
| upz_nombre | poblacion | casos_total | tasa_total | Posicion_casos |
|---|---|---|---|---|
| La Sabana | 38856 | 5441 | 1400.30 | 1 |
| Chico Lago | 38608 | 4985 | 1291.18 | 2 |
| Las Nieves | 17203 | 4033 | 2344.36 | 3 |
| El Rincon | 295322 | 3812 | 129.08 | 4 |
| Los Alcazares | 44678 | 3495 | 782.26 | 5 |
| Bosa Central | 237111 | 3346 | 141.12 | 6 |
| Las Ferias | 100848 | 3139 | 311.26 | 7 |
| Galerias | 38425 | 3067 | 798.18 | 8 |
| Teusaquillo | 28881 | 2976 | 1030.44 | 9 |
| Chapinero | 26491 | 2901 | 1095.09 | 10 |
# Presentar ranking por tasa
knitr::kable(
ranking_tasas_731,
digits = 2,
caption = "Top 10 de UPZ según tasa de delitos por 10.000 habitantes"
)
| upz_nombre | poblacion | casos_total | tasa_total | Posicion_tasa |
|---|---|---|---|---|
| El Mochuelo | 30 | 34 | 11333.33 | 1 |
| Aeropuerto El Dorado | 883 | 545 | 6172.14 | 2 |
| Parque Simon Bolivar - Can | 3323 | 958 | 2882.94 | 3 |
| Zona Industrial | 6666 | 1573 | 2359.74 | 4 |
| Las Nieves | 17203 | 4033 | 2344.36 | 5 |
| Parque Salitre | 1442 | 233 | 1615.81 | 6 |
| Sagrado Corazon | 11247 | 1707 | 1517.74 | 7 |
| La Sabana | 38856 | 5441 | 1400.30 | 8 |
| Chico Lago | 38608 | 4985 | 1291.18 | 9 |
| Puente Aranda | 12482 | 1561 | 1250.60 | 10 |
# Unir las posiciones de los dos rankings
comparacion_rankings_731 <- full_join(
ranking_casos_731 %>%
select(
upz_nombre,
Posicion_casos
),
ranking_tasas_731 %>%
select(
upz_nombre,
Posicion_tasa
),
by = "upz_nombre"
) %>%
mutate(
Grupo = case_when(
!is.na(Posicion_casos) & !is.na(Posicion_tasa) ~
"Aparece en ambos rankings",
!is.na(Posicion_casos) ~
"Solo en ranking de casos",
TRUE ~ "Solo en ranking de tasas"
)
)
# Tabla comparativa
knitr::kable(
comparacion_rankings_731,
caption = "Comparación de las UPZ que integran los dos rankings"
)
| upz_nombre | Posicion_casos | Posicion_tasa | Grupo |
|---|---|---|---|
| La Sabana | 1 | 8 | Aparece en ambos rankings |
| Chico Lago | 2 | 9 | Aparece en ambos rankings |
| Las Nieves | 3 | 5 | Aparece en ambos rankings |
| El Rincon | 4 | NA | Solo en ranking de casos |
| Los Alcazares | 5 | NA | Solo en ranking de casos |
| Bosa Central | 6 | NA | Solo en ranking de casos |
| Las Ferias | 7 | NA | Solo en ranking de casos |
| Galerias | 8 | NA | Solo en ranking de casos |
| Teusaquillo | 9 | NA | Solo en ranking de casos |
| Chapinero | 10 | NA | Solo en ranking de casos |
| El Mochuelo | NA | 1 | Solo en ranking de tasas |
| Aeropuerto El Dorado | NA | 2 | Solo en ranking de tasas |
| Parque Simon Bolivar - Can | NA | 3 | Solo en ranking de tasas |
| Zona Industrial | NA | 4 | Solo en ranking de tasas |
| Parque Salitre | NA | 6 | Solo en ranking de tasas |
| Sagrado Corazon | NA | 7 | Solo en ranking de tasas |
| Puente Aranda | NA | 10 | Solo en ranking de tasas |
# Visualización de las posiciones
ggplot(
comparacion_rankings_731,
aes(
x = Posicion_casos,
y = Posicion_tasa,
color = Grupo,
label = upz_nombre
)
) +
geom_point(
size = 3,
na.rm = TRUE
) +
scale_x_reverse(
breaks = 1:10,
limits = c(10, 1)
) +
scale_y_reverse(
breaks = 1:10,
limits = c(10, 1)
) +
scale_color_manual(
values = c(
"Aparece en ambos rankings" = "#351A4F",
"Solo en ranking de casos" = "#168C86",
"Solo en ranking de tasas" = "#D9006C"
),
name = "Participación"
) +
labs(
title = "Las UPZ con más denuncias no necesariamente lideran las tasas",
subtitle = "Posición de cada UPZ en los dos rankings",
x = "Posición en el ranking de casos",
y = "Posición en el ranking de tasas"
) +
tema_clase
# Relación entre población y número de casos denunciados
ggplot(
upz,
aes(
x = poblacion,
y = casos_total
)
) +
geom_point(
color = "#168C86",
alpha = 0.75,
size = 2.5
) +
geom_smooth(
method = "lm",
se = TRUE,
color = "#D9006C",
linewidth = 0.8
) +
scale_x_log10(
labels = scales::label_comma()
) +
scale_y_log10(
labels = scales::label_comma()
) +
labs(
title = "El volumen de denuncias debe interpretarse junto con la población",
subtitle = "Relación entre habitantes y casos denunciados por UPZ",
x = "Población de la UPZ (escala logarítmica)",
y = "Casos denunciados (escala logarítmica)",
caption = "La línea representa una tendencia lineal ajustada sobre los valores transformados."
) +
tema_clase
Insight principal: un mayor número de denuncias no implica necesariamente una mayor tasa de delitos. El ejemplo más representativo es la UPZ asociada al Aeropuerto El Dorado, donde una población residente relativamente baja puede generar una tasa elevada cuando se compara con el número de casos registrados en el territorio.
Este comportamiento plantea una consideración importante: la población residente no siempre representa la totalidad de personas expuestas a las dinámicas de un territorio. En zonas como el aeropuerto existe un flujo importante de personas que transitan diariamente, pero que no necesariamente viven allí. Esta población flotante podría contribuir a explicar por qué los registros de denuncias son elevados en proporción a los habitantes residentes.
Por lo tanto, utilizar exclusivamente el número de casos puede ocultar diferencias en la intensidad relativa de los registros, mientras que interpretar las tasas sin considerar el tamaño y las características de la población puede conducir a conclusiones equivocadas.
En consecuencia, la lectura de la inseguridad territorial debe considerar conjuntamente los casos absolutos, las tasas por habitante y las dinámicas particulares de cada territorio. El caso del Aeropuerto El Dorado evidencia la importancia de considerar factores adicionales, como la población flotante, en futuros análisis.
La segunda pregunta busca comprender cómo influye el tamaño de la población residente en la interpretación de las tasas de delitos de las UPZ.
Como se explicó anteriormente, la tasa se calcula relacionando el número de casos denunciados con la población de cada unidad territorial, expresando el resultado por cada 10.000 habitantes. Por lo tanto, cuando el denominador es reducido, una cantidad relativamente pequeña de denuncias puede generar una tasa considerablemente elevada.
Para profundizar en este comportamiento se analiza la distribución de la población, su relación con la tasa total de delitos y las características de las UPZ que presentan poblaciones más pequeñas.
Este análisis también permite reconocer una limitación del indicador: la población residente no necesariamente representa el total de personas que utilizan o transitan por un territorio. En zonas con alta circulación de población flotante, como el Aeropuerto El Dorado, los registros de denuncias pueden estar relacionados con dinámicas que no quedan representadas en el denominador poblacional.
En consecuencia, las tasas deben interpretarse conjuntamente con los casos absolutos, el tamaño poblacional y las características particulares de cada territorio.
# Ordenar las UPZ según su población
upz %>%
arrange(poblacion) %>%
mutate(
upz_nombre = factor(
upz_nombre,
levels = upz_nombre
)
) %>%
ggplot(
aes(
x = poblacion,
y = upz_nombre
)
) +
geom_col(
fill = "#168C86",
alpha = 0.85
) +
scale_x_log10(
labels = scales::label_comma()
) +
labs(
title = "La población residente presenta diferencias importantes entre UPZ",
subtitle = "Distribución de habitantes por unidad territorial",
x = "Población residente (escala logarítmica)",
y = NULL
) +
tema_clase +
theme(
axis.text.y = element_text(size = 7)
)
# Identificar el primer cuartil de población
limite_poblacion_baja <- quantile(
upz$poblacion,
0.25,
na.rm = TRUE
)
# Clasificar las UPZ según su tamaño poblacional
upz_analisis_poblacional <- upz %>%
mutate(
Grupo_poblacional = if_else(
poblacion <= limite_poblacion_baja,
"Población en el cuartil inferior",
"Resto de las UPZ"
)
)
# Construir gráfico de dispersión
ggplot(
upz_analisis_poblacional,
aes(
x = poblacion,
y = tasa_total,
color = Grupo_poblacional
)
) +
geom_point(
size = 2.7,
alpha = 0.8
) +
scale_x_log10(
labels = scales::label_comma()
) +
scale_y_log10(
labels = scales::label_comma()
) +
scale_color_manual(
values = c(
"Población en el cuartil inferior" = "#D9006C",
"Resto de las UPZ" = "#168C86"
),
name = "Tamaño poblacional"
) +
labs(
title = "Las tasas extremas deben interpretarse considerando la población",
subtitle = "Relación entre habitantes y tasa total de delitos por UPZ",
x = "Población residente (escala logarítmica)",
y = "Tasa por 10.000 habitantes (escala logarítmica)",
caption = "El grupo poblacional inferior corresponde al 25% de las UPZ con menor población."
) +
tema_clase
# Identificar las 15 UPZ con menor población
tabla_poblacion_baja <- upz %>%
arrange(poblacion) %>%
select(
upz_nombre,
poblacion,
casos_total,
tasa_total
) %>%
slice_head(n = 15)
knitr::kable(
tabla_poblacion_baja,
digits = 2,
caption = "UPZ con menor población y sus respectivos indicadores de delitos"
)
| upz_nombre | poblacion | casos_total | tasa_total |
|---|---|---|---|
| El Mochuelo | 30 | 34 | 11333.33 |
| Aeropuerto El Dorado | 883 | 545 | 6172.14 |
| Parque Entrenubes | 1169 | 16 | 136.87 |
| Parque Salitre | 1442 | 233 | 1615.81 |
| Paseo De Los Libertadores | 2690 | 74 | 275.09 |
| Guaymaral | 2692 | 45 | 167.16 |
| Jardin Botanico | 2900 | 266 | 917.24 |
| Parque Simon Bolivar - Can | 3323 | 958 | 2882.94 |
| La Academia | 5260 | 123 | 233.84 |
| Monte Blanco | 6575 | 80 | 121.67 |
| Zona Industrial | 6666 | 1573 | 2359.74 |
| Sagrado Corazon | 11247 | 1707 | 1517.74 |
| Alamos | 12077 | 642 | 531.59 |
| La Macarena | 12253 | 507 | 413.78 |
| Puente Aranda | 12482 | 1561 | 1250.60 |
# Identificar las 15 UPZ con mayores tasas
tabla_tasas_altas <- upz %>%
arrange(desc(tasa_total)) %>%
select(
upz_nombre,
poblacion,
casos_total,
tasa_total
) %>%
slice_head(n = 15)
knitr::kable(
tabla_tasas_altas,
digits = 2,
caption = "UPZ con mayores tasas de delitos y sus respectivos indicadores"
)
| upz_nombre | poblacion | casos_total | tasa_total |
|---|---|---|---|
| El Mochuelo | 30 | 34 | 11333.33 |
| Aeropuerto El Dorado | 883 | 545 | 6172.14 |
| Parque Simon Bolivar - Can | 3323 | 958 | 2882.94 |
| Zona Industrial | 6666 | 1573 | 2359.74 |
| Las Nieves | 17203 | 4033 | 2344.36 |
| Parque Salitre | 1442 | 233 | 1615.81 |
| Sagrado Corazon | 11247 | 1707 | 1517.74 |
| La Sabana | 38856 | 5441 | 1400.30 |
| Chico Lago | 38608 | 4985 | 1291.18 |
| Puente Aranda | 12482 | 1561 | 1250.60 |
| Chapinero | 26491 | 2901 | 1095.09 |
| Teusaquillo | 28881 | 2976 | 1030.44 |
| Jardin Botanico | 2900 | 266 | 917.24 |
| Galerias | 38425 | 3067 | 798.18 |
| Los Alcazares | 44678 | 3495 | 782.26 |
El análisis de la población y las tasas de delitos permite reconocer que el tamaño de la población residente tiene una influencia matemática directa en el valor del indicador. Cuando el denominador es reducido, cada caso adicional representa una proporción mayor y puede generar variaciones importantes en la tasa.
Este comportamiento se evidencia especialmente en las UPZ con poblaciones pequeñas, donde los valores deben interpretarse junto con el número absoluto de denuncias. No sería adecuado asumir que una tasa elevada representa necesariamente una mayor concentración de delitos o un mayor riesgo para sus habitantes.
Adicionalmente, el caso del Aeropuerto El Dorado permite identificar otra limitación: la población residente no siempre representa la cantidad de personas que utilizan un territorio. La circulación de viajeros, trabajadores y visitantes puede generar dinámicas que no quedan reflejadas en el denominador utilizado.
Insight principal: La tasa por habitante es una herramienta útil para comparar territorios, pero su interpretación depende del tamaño y las características de la población utilizada como denominador. En consecuencia, una tasa elevada no debe analizarse de manera aislada: es necesario considerar los casos absolutos, la población residente y las dinámicas particulares de cada UPZ.
Esta pregunta busca identificar si los delitos denunciados presentan diferencias territoriales entre las UPZ de Bogotá y reconocer las zonas donde se concentra un mayor volumen de casos o una mayor intensidad relativa de denuncias.
Para desarrollar este análisis se retoman los mapas temáticos construidos en la sección 6, especialmente la distribución de los casos totales y de las tasas de delitos por cada 10.000 habitantes. Estas representaciones permiten observar los contrastes espaciales y reconocer unidades territoriales con comportamientos diferenciados.
Adicionalmente, se realiza una consolidación de los indicadores por localidad, con el propósito de ampliar la lectura territorial y comparar el volumen de denuncias y las tasas agregadas entre estas unidades geográficas.
Los mapas permiten observar que la distribución territorial de los delitos puede presentar diferencias dependiendo del indicador utilizado. Mientras el número de casos muestra la concentración absoluta de las denuncias, la tasa permite comparar su magnitud en relación con la población residente.
La representación por quintiles complementa esta lectura al identificar la posición relativa de cada UPZ frente al conjunto analizado. Por su parte, la escala logarítmica facilita la visualización de las diferencias cuando existen valores extremos.
Para ampliar la interpretación espacial, se agrupan los registros de las UPZ según la localidad a la que pertenecen. Esta consolidación permite comparar el volumen de denuncias y la tasa agregada de delitos entre las diferentes localidades de Bogotá.
La tasa por localidad se calcula relacionando la suma de los casos registrados en sus UPZ con la población total correspondiente. De esta manera, se obtiene un indicador ponderado por población, evitando calcular el promedio simple de las tasas individuales de las UPZ.
Esta comparación permite identificar diferencias territoriales a una escala más amplia, aunque debe considerarse que la agregación por localidad puede ocultar contrastes existentes entre las UPZ que la conforman.
# Consolidar los indicadores por localidad
resumen_localidades <- upz %>%
group_by(localidad) %>%
summarise(
Numero_UPZ = n(),
Poblacion_total = sum(poblacion, na.rm = TRUE),
Casos_total = sum(casos_total, na.rm = TRUE),
Tasa_agregada = (
sum(casos_total, na.rm = TRUE) /
sum(poblacion, na.rm = TRUE)
) * 10000,
.groups = "drop"
)
# Ranking por volumen de denuncias
ranking_localidades_casos <- resumen_localidades %>%
arrange(desc(Casos_total))
knitr::kable(
ranking_localidades_casos,
digits = 2,
caption = "Indicadores de delitos denunciados por localidad"
)
| localidad | Numero_UPZ | Poblacion_total | Casos_total | Tasa_agregada |
|---|---|---|---|---|
| Suba | 12 | 1290144 | 19028 | 147.49 |
| Kennedy | 12 | 1035224 | 18517 | 178.87 |
| Engativá | 9 | 817019 | 16715 | 204.59 |
| Teusaquillo | 6 | 166428 | 9978 | 599.54 |
| Chapinero | 5 | 178317 | 9754 | 547.00 |
| Fontibón | 8 | 404252 | 9593 | 237.30 |
| Usaquén | 9 | 586346 | 9078 | 154.82 |
| Ciudad Bolívar | 8 | 650967 | 9052 | 139.05 |
| Puente Aranda | 5 | 256731 | 8562 | 333.50 |
| Bosa | 5 | 729781 | 8120 | 111.27 |
| Santa Fe | 5 | 106587 | 7705 | 722.88 |
| Barrios Unidos | 4 | 153342 | 7334 | 478.28 |
| Los Mártires | 2 | 82848 | 6643 | 801.83 |
| Rafael Uribe Uribe | 5 | 389238 | 6438 | 165.40 |
| San Cristóbal | 5 | 406428 | 4723 | 116.21 |
| Usme | 7 | 397603 | 4347 | 109.33 |
| Antonio Nariño | 2 | 83925 | 3429 | 408.58 |
| Tunjuelito | 2 | 182943 | 2448 | 133.81 |
| Candelaria | 1 | 18409 | 1371 | 744.74 |
# Gráfico de casos totales por localidad
ggplot(
resumen_localidades,
aes(
x = reorder(localidad, Casos_total),
y = Casos_total
)
) +
geom_col(
fill = "#351A4F",
alpha = 0.9
) +
coord_flip() +
scale_y_continuous(
labels = scales::label_comma()
) +
labs(
title = "Concentración de denuncias por localidad",
subtitle = "Número total de casos registrados",
x = NULL,
y = "Casos denunciados"
) +
tema_clase
# Gráfico de tasas agregadas por localidad
ggplot(
resumen_localidades,
aes(
x = reorder(localidad, Tasa_agregada),
y = Tasa_agregada
)
) +
geom_col(
fill = "#D9006C",
alpha = 0.9
) +
coord_flip() +
scale_y_continuous(
labels = scales::label_comma(accuracy = 0.1)
) +
labs(
title = "Intensidad relativa de las denuncias por localidad",
subtitle = "Tasa agregada por cada 10.000 habitantes",
x = NULL,
y = "Tasa por 10.000 habitantes"
) +
tema_clase
La representación geográfica permite reconocer diferencias territoriales en la distribución de las denuncias registradas. Al comparar los casos absolutos con las tasas, se evidencia la importancia de utilizar ambos indicadores para comprender el comportamiento de los registros en las diferentes unidades territoriales.
La consolidación por localidad permite ampliar la lectura territorial, pero también puede ocultar diferencias entre las UPZ que conforman cada localidad. Por esta razón, resulta importante conservar el análisis a escala de UPZ y utilizar la localidad como un nivel complementario de interpretación.
Insight principal: La inseguridad registrada en Bogotá no presenta una única lectura territorial. La identificación de las zonas con mayor concentración de denuncias puede ser diferente de la identificación de aquellas con mayores tasas relativas. Por ello, la escala geográfica y el indicador utilizado condicionan la interpretación de los resultados.
Esta pregunta busca explorar si la disponibilidad y las características del alumbrado público presentan alguna asociación con las tasas de delitos denunciados en las UPZ de Bogotá.
Para desarrollar el análisis se consideran tres indicadores: la cantidad de luminarias por kilómetro cuadrado, la cantidad de luminarias por cada 1.000 habitantes y el porcentaje de luminarias con tecnología LED.
La utilización de estas variables permite analizar el alumbrado desde diferentes dimensiones, considerando tanto su distribución territorial como su disponibilidad relativa frente a la población y su composición tecnológica.
Se comparan estos indicadores con la tasa total de delitos por cada 10.000 habitantes, mediante gráficos de dispersión y correlaciones de Spearman. El propósito es identificar posibles patrones y diferencias entre las unidades territoriales.
ggplot(
upz,
aes(
x = luminarias_km2,
y = tasa_total
)
) +
geom_point(
color = "#168C86",
alpha = 0.75,
size = 2.5
) +
scale_x_log10(
labels = scales::label_comma()
) +
scale_y_log10(
labels = scales::label_comma()
) +
labs(
title = "Disponibilidad espacial de alumbrado y tasa de delitos",
subtitle = "Luminarias por km² frente a denuncias por cada 10.000 habitantes",
x = "Luminarias por km² (escala logarítmica)",
y = "Tasa de delitos (escala logarítmica)"
) +
tema_clase
ggplot(
upz,
aes(
x = luminarias_1000hab,
y = tasa_total
)
) +
geom_point(
color = "#D9006C",
alpha = 0.75,
size = 2.5
) +
scale_x_log10(
labels = scales::label_comma()
) +
scale_y_log10(
labels = scales::label_comma()
) +
labs(
title = "Alumbrado por habitante y tasa de delitos",
subtitle = "Disponibilidad de luminarias por cada 1.000 habitantes",
x = "Luminarias por cada 1.000 habitantes (escala logarítmica)",
y = "Tasa de delitos (escala logarítmica)"
) +
tema_clase
ggplot(
upz,
aes(
x = pct_luminarias_led,
y = tasa_total
)
) +
geom_point(
color = "#351A4F",
alpha = 0.75,
size = 2.5
) +
scale_y_log10(
labels = scales::label_comma()
) +
labs(
title = "Participación de luminarias LED y tasa de delitos",
subtitle = "Porcentaje de luminarias LED por UPZ",
x = "Luminarias LED (%)",
y = "Tasa de delitos (escala logarítmica)"
) +
tema_clase
Para complementar la exploración visual, se calculan las correlaciones de Spearman entre los tres indicadores de alumbrado público y la tasa total de delitos.
Esta comparación permite identificar la dirección y la intensidad de las asociaciones monotónicas entre las variables, facilitando una lectura conjunta de las diferentes dimensiones de la infraestructura de iluminación.
variables_alumbrado <- c(
"luminarias_km2",
"luminarias_1000hab",
"pct_luminarias_led"
)
correlaciones_alumbrado <- purrr::map_dfr(
variables_alumbrado,
function(variable) {
datos_validos <- upz %>%
select(
tasa_total,
all_of(variable)
) %>%
drop_na()
tibble(
Indicador = variable,
Numero_UPZ = nrow(datos_validos),
rho = cor(
datos_validos$tasa_total,
datos_validos[[variable]],
method = "spearman"
)
)
}
) %>%
mutate(
Indicador = recode(
Indicador,
luminarias_km2 = "Luminarias por km²",
luminarias_1000hab = "Luminarias por 1.000 habitantes",
pct_luminarias_led = "Porcentaje de luminarias LED"
),
Direccion = if_else(
rho >= 0,
"Positiva",
"Negativa"
),
Intensidad = case_when(
abs(rho) < 0.20 ~ "Muy débil",
abs(rho) < 0.40 ~ "Débil",
abs(rho) < 0.60 ~ "Moderada",
abs(rho) < 0.80 ~ "Fuerte",
TRUE ~ "Muy fuerte"
)
) %>%
arrange(desc(abs(rho)))
knitr::kable(
correlaciones_alumbrado,
digits = 3,
caption = "Correlaciones de Spearman entre alumbrado público y tasa de delitos"
)
| Indicador | Numero_UPZ | rho | Direccion | Intensidad |
|---|---|---|---|---|
| Luminarias por 1.000 habitantes | 112 | 0.775 | Positiva | Fuerte |
| Luminarias por km² | 112 | 0.119 | Positiva | Muy débil |
| Porcentaje de luminarias LED | 112 | -0.061 | Negativa | Muy débil |
Al comparar los indicadores de alumbrado público con las tasas de delitos, no se identifica una relación visual negativa clara que permita afirmar que una mayor disponibilidad de luminarias esté asociada con menores tasas de denuncias.
En el gráfico de luminarias por kilómetro cuadrado se observa una concentración importante de UPZ en niveles relativamente altos de disponibilidad espacial de alumbrado, mientras que las tasas de delitos presentan una dispersión considerable. Esto indica que una mayor cantidad de luminarias por superficie no se traduce necesariamente en una menor tasa de delitos.
Por otra parte, en el gráfico de luminarias por cada 1.000 habitantes se aprecia una posible tendencia positiva, donde algunas UPZ con mayor disponibilidad relativa de luminarias también presentan tasas elevadas. Sin embargo, este comportamiento debe interpretarse con precaución, debido a la presencia de valores extremos y a que el indicador puede amplificarse en territorios con poblaciones residentes reducidas.
Un aspecto interesante es que la relación observada también podría plantear una hipótesis de respuesta institucional: los territorios que presentan mayores dinámicas de actividad, circulación de personas o problemáticas de seguridad podrían recibir una mayor dotación de infraestructura de iluminación. No obstante, la información disponible no permite comprobar esta hipótesis ni establecer si la infraestructura precede o responde a las condiciones de seguridad.
Insight principal: Una mayor disponibilidad de alumbrado público no implica directamente menores tasas de delitos. Los resultados muestran que la relación entre iluminación y seguridad es más compleja de lo que podría suponerse inicialmente. Incluso, la posible asociación positiva entre luminarias por habitante y tasas de delitos plantea la necesidad de estudiar si la infraestructura responde a las características y necesidades de cada territorio, en lugar de interpretar la iluminación como un factor que por sí solo determina los niveles de seguridad.
Esta pregunta busca explorar si las diferencias socioeconómicas entre las UPZ presentan alguna asociación con los indicadores de delitos denunciados.
Para desarrollar el análisis se consideran tres dimensiones: el porcentaje de población en condición de pobreza, el salario mensual promedio y la composición de las viviendas según rangos de estrato socioeconómico.
En primer lugar, se examina la relación entre estas variables y la tasa total de delitos por cada 10.000 habitantes. Posteriormente, se explora si el tipo de delito predominante presenta diferencias entre territorios con distintas características socioeconómicas.
Este análisis permite ampliar la interpretación de la inseguridad territorial, considerando que las UPZ presentan condiciones de vida y estructuras socioeconómicas diferentes.
ggplot(
upz,
aes(
x = pct_pobreza,
y = tasa_total,
color = em_agrupada
)
) +
geom_point(
alpha = 0.75,
size = 2.5
) +
scale_y_log10(
labels = scales::label_comma()
) +
scale_color_manual(
values = c(
"FALSE" = "#168C86",
"TRUE" = "#D9006C"
),
labels = c(
"FALSE" = "Estimación individual",
"TRUE" = "Estimación agrupada"
),
name = "Tipo de estimación"
) +
labs(
title = "Pobreza y tasa de delitos por UPZ",
subtitle = "Comparación entre condiciones socioeconómicas y denuncias",
x = "Población en condición de pobreza (%)",
y = "Tasa de delitos por 10.000 habitantes (escala logarítmica)"
) +
tema_clase
ggplot(
upz,
aes(
x = salario_promedio,
y = tasa_total,
color = em_agrupada
)
) +
geom_point(
alpha = 0.75,
size = 2.5
) +
scale_x_log10(
labels = scales::label_comma(prefix = "$")
) +
scale_y_log10(
labels = scales::label_comma()
) +
scale_color_manual(
values = c(
"FALSE" = "#168C86",
"TRUE" = "#D9006C"
),
labels = c(
"FALSE" = "Estimación individual",
"TRUE" = "Estimación agrupada"
),
name = "Tipo de estimación"
) +
labs(
title = "Salario promedio y tasa de delitos por UPZ",
subtitle = "Relación entre ingreso promedio y denuncias registradas",
x = "Salario mensual promedio (escala logarítmica)",
y = "Tasa de delitos por 10.000 habitantes (escala logarítmica)"
) +
tema_clase
# Transformar la composición por estrato a formato largo
datos_estratos <- upz %>%
select(
upz_nombre,
tasa_total,
pct_estrato_1_2,
pct_estrato_3_4,
pct_estrato_5_6
) %>%
pivot_longer(
cols = starts_with("pct_estrato"),
names_to = "Estrato",
values_to = "Porcentaje"
) %>%
mutate(
Estrato = recode(
Estrato,
pct_estrato_1_2 = "Estratos 1 y 2",
pct_estrato_3_4 = "Estratos 3 y 4",
pct_estrato_5_6 = "Estratos 5 y 6"
)
)
# Comparar composición socioeconómica y tasa de delitos
ggplot(
datos_estratos,
aes(
x = Porcentaje,
y = tasa_total
)
) +
geom_point(
color = "#168C86",
alpha = 0.65,
size = 2
) +
scale_y_log10(
labels = scales::label_comma()
) +
facet_wrap(
~ Estrato,
ncol = 1,
scales = "free_x"
) +
labs(
title = "Composición por estrato y tasa de delitos",
subtitle = "Participación porcentual de viviendas por rango de estrato",
x = "Viviendas del rango de estrato (%)",
y = "Tasa de delitos por 10.000 habitantes (escala logarítmica)"
) +
tema_clase
variables_socioeconomicas <- c(
"pct_pobreza",
"salario_promedio",
"pct_estrato_1_2",
"pct_estrato_3_4",
"pct_estrato_5_6"
)
correlaciones_socioeconomicas <- purrr::map_dfr(
variables_socioeconomicas,
function(variable) {
datos_validos <- upz %>%
select(
tasa_total,
all_of(variable)
) %>%
drop_na()
tibble(
Variable = variable,
Numero_UPZ = nrow(datos_validos),
rho = cor(
datos_validos$tasa_total,
datos_validos[[variable]],
method = "spearman"
)
)
}
) %>%
mutate(
Variable = recode(
Variable,
pct_pobreza = "Población en condición de pobreza",
salario_promedio = "Salario promedio",
pct_estrato_1_2 = "Viviendas en estratos 1 y 2",
pct_estrato_3_4 = "Viviendas en estratos 3 y 4",
pct_estrato_5_6 = "Viviendas en estratos 5 y 6"
),
Direccion = if_else(
rho >= 0,
"Positiva",
"Negativa"
),
Intensidad = case_when(
abs(rho) < 0.20 ~ "Muy débil",
abs(rho) < 0.40 ~ "Débil",
abs(rho) < 0.60 ~ "Moderada",
abs(rho) < 0.80 ~ "Fuerte",
TRUE ~ "Muy fuerte"
)
) %>%
arrange(desc(abs(rho)))
knitr::kable(
correlaciones_socioeconomicas,
digits = 3,
caption = "Correlaciones de Spearman entre condiciones socioeconómicas y tasa de delitos"
)
| Variable | Numero_UPZ | rho | Direccion | Intensidad |
|---|---|---|---|---|
| Viviendas en estratos 1 y 2 | 112 | -0.623 | Negativa | Fuerte |
| Viviendas en estratos 3 y 4 | 112 | 0.616 | Positiva | Fuerte |
| Salario promedio | 112 | 0.584 | Positiva | Moderada |
| Población en condición de pobreza | 112 | -0.517 | Negativa | Moderada |
| Viviendas en estratos 5 y 6 | 112 | 0.205 | Positiva | Débil |
Además de examinar la relación entre las condiciones socioeconómicas y la tasa total, se explora si el comportamiento de los distintos tipos de delitos presenta diferencias entre UPZ con niveles de salario promedio relativamente bajos y altos.
Para ello, las unidades territoriales se clasifican utilizando la mediana del salario promedio y se comparan las tasas específicas de los diez tipos de delitos incluidos en la base.
Este procedimiento permite identificar qué categorías presentan mayores tasas relativas dentro de cada grupo socioeconómico. La clasificación representa una comparación exploratoria entre territorios y no implica que el nivel de ingreso determine el tipo de delito predominante.
# Definir las tasas específicas de los delitos
variables_tasas_delitos <- c(
"tasa_homicidios",
"tasa_lesiones",
"tasa_hurto_personas",
"tasa_hurto_residencias",
"tasa_hurto_automotor",
"tasa_hurto_bicicletas",
"tasa_hurto_comercio",
"tasa_hurto_celulares",
"tasa_hurto_motos",
"tasa_violencia_intrafamiliar"
)
# Clasificar las UPZ según la mediana del salario
mediana_salario <- median(
upz$salario_promedio,
na.rm = TRUE
)
upz_grupos_salario <- upz %>%
mutate(
Grupo_salario = if_else(
salario_promedio <= mediana_salario,
"Salario bajo o igual a mediana",
"Salario superior a mediana"
)
)
# Convertir las tasas específicas a formato largo
delitos_por_salario <- upz_grupos_salario %>%
select(
upz_nombre,
Grupo_salario,
all_of(variables_tasas_delitos)
) %>%
pivot_longer(
cols = all_of(variables_tasas_delitos),
names_to = "Tipo_delito",
values_to = "Tasa"
) %>%
mutate(
Tipo_delito = recode(
Tipo_delito,
tasa_homicidios = "Homicidios",
tasa_lesiones = "Lesiones",
tasa_hurto_personas = "Hurto a personas",
tasa_hurto_residencias = "Hurto a residencias",
tasa_hurto_automotor = "Hurto de automotores",
tasa_hurto_bicicletas = "Hurto de bicicletas",
tasa_hurto_comercio = "Hurto a comercio",
tasa_hurto_celulares = "Hurto de celulares",
tasa_hurto_motos = "Hurto de motos",
tasa_violencia_intrafamiliar = "Violencia intrafamiliar"
)
)
# Calcular la mediana de cada tipo de delito por grupo salarial
resumen_delitos_salario <- delitos_por_salario %>%
group_by(
Grupo_salario,
Tipo_delito
) %>%
summarise(
Tasa_mediana = median(Tasa, na.rm = TRUE),
Numero_UPZ = sum(!is.na(Tasa)),
.groups = "drop"
) %>%
group_by(Grupo_salario) %>%
mutate(
Posicion = min_rank(desc(Tasa_mediana))
) %>%
ungroup()
# Presentar ranking de tipos de delitos por grupo
knitr::kable(
resumen_delitos_salario %>%
arrange(Grupo_salario, Posicion),
digits = 3,
caption = "Tasas medianas por tipo de delito según grupo salarial"
)
| Grupo_salario | Tipo_delito | Tasa_mediana | Numero_UPZ | Posicion |
|---|---|---|---|---|
| Salario bajo o igual a mediana | Hurto a personas | 56.710 | 56 | 1 |
| Salario bajo o igual a mediana | Violencia intrafamiliar | 22.010 | 56 | 2 |
| Salario bajo o igual a mediana | Hurto de celulares | 19.525 | 56 | 3 |
| Salario bajo o igual a mediana | Lesiones | 12.595 | 56 | 4 |
| Salario bajo o igual a mediana | Hurto a comercio | 4.285 | 56 | 5 |
| Salario bajo o igual a mediana | Hurto a residencias | 4.160 | 56 | 6 |
| Salario bajo o igual a mediana | Hurto de motos | 3.905 | 56 | 7 |
| Salario bajo o igual a mediana | Hurto de bicicletas | 3.240 | 56 | 8 |
| Salario bajo o igual a mediana | Hurto de automotores | 2.405 | 56 | 9 |
| Salario bajo o igual a mediana | Homicidios | 0.765 | 56 | 10 |
| Salario superior a mediana | Hurto a personas | 161.240 | 56 | 1 |
| Salario superior a mediana | Hurto de celulares | 59.815 | 56 | 2 |
| Salario superior a mediana | Violencia intrafamiliar | 13.300 | 56 | 3 |
| Salario superior a mediana | Hurto a comercio | 11.470 | 56 | 4 |
| Salario superior a mediana | Lesiones | 9.505 | 56 | 5 |
| Salario superior a mediana | Hurto a residencias | 7.930 | 56 | 6 |
| Salario superior a mediana | Hurto de bicicletas | 7.485 | 56 | 7 |
| Salario superior a mediana | Hurto de automotores | 2.610 | 56 | 8 |
| Salario superior a mediana | Hurto de motos | 2.445 | 56 | 9 |
| Salario superior a mediana | Homicidios | 0.240 | 56 | 10 |
# Comparación visual
ggplot(
resumen_delitos_salario,
aes(
x = reorder(Tipo_delito, Tasa_mediana),
y = Tasa_mediana,
fill = Grupo_salario
)
) +
geom_col(
position = "dodge"
) +
coord_flip() +
scale_fill_manual(
values = c(
"Salario bajo o igual a mediana" = "#168C86",
"Salario superior a mediana" = "#D9006C"
),
name = "Grupo socioeconómico"
) +
labs(
title = "Comportamiento de los delitos según grupo salarial",
subtitle = "Comparación de las tasas medianas por tipo de delito",
x = NULL,
y = "Tasa mediana por cada 10.000 habitantes"
) +
tema_clase
Los resultados obtenidos muestran un comportamiento interesante entre las condiciones socioeconómicas y las tasas de delitos denunciados. Se observa una tendencia en la que las UPZ con menores porcentajes de población en condición de pobreza presentan mayores tasas de delitos. De manera similar, las unidades territoriales con mayores salarios promedio también muestran tasas más elevadas.
Este comportamiento permite cuestionar la idea de que las condiciones socioeconómicas más favorables necesariamente se relacionan con menores niveles de inseguridad. Por el contrario, los resultados sugieren que los territorios con mayores ingresos pueden presentar una mayor intensidad de denuncias por habitante.
Una posible explicación está relacionada con la capacidad adquisitiva y las dinámicas económicas de estos territorios, que podrían influir en la exposición a determinados delitos, especialmente aquellos relacionados con el hurto. También es posible que existan diferencias en la disposición o capacidad de los habitantes para denunciar los hechos. Sin embargo, estas explicaciones constituyen hipótesis que no pueden comprobarse directamente con las variables disponibles.
Al profundizar en los tipos de delitos, se identifica que el hurto a personas y el hurto de celulares concentran los mayores registros numéricos dentro de las categorías analizadas. No obstante, al comparar las tasas medianas por tipo de delito entre los grupos de UPZ clasificados según su salario promedio, aparece un resultado particular: la violencia intrafamiliar y lesiones son los únicos delitos cuya tasa mediana es superior en el grupo de territorios con salarios por debajo de la mediana.
Este resultado resulta especialmente relevante porque muestra que las diferencias socioeconómicas no necesariamente se manifiestan de la misma manera en todas las categorías delictivas. Mientras los hurtos representan una parte importante de los registros, la violencia intrafamiliar presenta un comportamiento diferenciado que merece una lectura independiente.
Insight principal: Las UPZ con mejores condiciones económicas no necesariamente presentan menores tasas de delitos denunciados. En los resultados analizados, las mayores tasas se observan en territorios con menores porcentajes de pobreza y mayores salarios promedio. Además, el comportamiento de la violencia intrafamiliar rompe el patrón general de comparación por ingresos, al presentar una tasa mediana superior en las UPZ del grupo salarial más alto.
En conjunto, estos resultados sugieren que la relación entre condiciones socioeconómicas e inseguridad es multidimensional. El nivel de ingresos, la pobreza y la composición de los delitos aportan perspectivas diferentes para comprender las dinámicas territoriales, por lo que no sería adecuado utilizar una sola variable socioeconómica para explicar el comportamiento de la inseguridad.
Esta pregunta busca establecer si las UPZ donde se perciben mayores problemas de inseguridad son también aquellas que presentan mayores tasas de delitos denunciados.
Para desarrollar el análisis se comparan dos dimensiones: la percepción de inseguridad reportada por los habitantes y los registros administrativos de denuncias. La primera representa la valoración que las personas hacen sobre las condiciones de seguridad en el entorno de su vivienda, mientras que la segunda refleja los casos registrados por las autoridades.
Se analiza la relación entre el porcentaje de percepción de inseguridad y la tasa total de delitos por cada 10.000 habitantes. Adicionalmente, se incorpora el número absoluto de denuncias para identificar posibles diferencias entre la percepción, la concentración de casos y la intensidad relativa de los registros.
El propósito es reconocer si ambas dimensiones presentan comportamientos similares o si existen territorios donde la percepción de inseguridad no coincide con los indicadores de denuncias.
Es importante señalar que percepción y denuncia no miden exactamente el mismo fenómeno. Una persona puede percibir inseguridad sin haber sido víctima de un delito, y no todos los hechos delictivos son denunciados. Por lo tanto, las diferencias entre ambos indicadores no deben interpretarse automáticamente como errores de percepción o de registro.
ggplot(
upz,
aes(
x = pct_percibe_inseguridad,
y = tasa_total,
color = em_agrupada
)
) +
geom_point(
alpha = 0.75,
size = 2.5
) +
scale_y_log10(
labels = scales::label_comma()
) +
scale_color_manual(
values = c(
"FALSE" = "#168C86",
"TRUE" = "#D9006C"
),
labels = c(
"FALSE" = "Estimación individual",
"TRUE" = "Estimación agrupada"
),
name = "Tipo de estimación"
) +
labs(
title = "La percepción de inseguridad no necesariamente coincide con las tasas de delitos",
subtitle = "Percepción reportada frente a denuncias por cada 10.000 habitantes",
x = "Población que percibe problemas de inseguridad (%)",
y = "Tasa total de delitos (escala logarítmica)"
) +
tema_clase
ggplot(
upz,
aes(
x = pct_percibe_inseguridad,
y = casos_total,
color = em_agrupada
)
) +
geom_point(
alpha = 0.75,
size = 2.5
) +
scale_y_log10(
labels = scales::label_comma()
) +
scale_color_manual(
values = c(
"FALSE" = "#168C86",
"TRUE" = "#D9006C"
),
labels = c(
"FALSE" = "Estimación individual",
"TRUE" = "Estimación agrupada"
),
name = "Tipo de estimación"
) +
labs(
title = "Percepción de inseguridad y volumen de denuncias",
subtitle = "Comparación entre percepción y número de casos por UPZ",
x = "Población que percibe problemas de inseguridad (%)",
y = "Número de denuncias (escala logarítmica)"
) +
tema_clase
variables_percepcion <- c(
"tasa_total",
"casos_total",
"poblacion"
)
correlaciones_percepcion <- purrr::map_dfr(
variables_percepcion,
function(variable) {
datos_validos <- upz %>%
select(
pct_percibe_inseguridad,
all_of(variable)
) %>%
drop_na()
tibble(
Variable = variable,
Numero_UPZ = nrow(datos_validos),
rho = cor(
datos_validos$pct_percibe_inseguridad,
datos_validos[[variable]],
method = "spearman"
)
)
}
) %>%
mutate(
Variable = recode(
Variable,
tasa_total = "Tasa total de delitos",
casos_total = "Número de casos denunciados",
poblacion = "Población residente"
),
Direccion = if_else(
rho >= 0,
"Positiva",
"Negativa"
),
Intensidad = case_when(
abs(rho) < 0.20 ~ "Muy débil",
abs(rho) < 0.40 ~ "Débil",
abs(rho) < 0.60 ~ "Moderada",
abs(rho) < 0.80 ~ "Fuerte",
TRUE ~ "Muy fuerte"
)
)
knitr::kable(
correlaciones_percepcion,
digits = 3,
caption = "Correlaciones de Spearman entre percepción de inseguridad y variables de delitos"
)
| Variable | Numero_UPZ | rho | Direccion | Intensidad |
|---|---|---|---|---|
| Tasa total de delitos | 112 | -0.293 | Negativa | Débil |
| Número de casos denunciados | 112 | 0.063 | Positiva | Muy débil |
| Población residente | 112 | 0.289 | Positiva | Débil |
# Calcular medianas de referencia
mediana_percepcion <- median(
upz$pct_percibe_inseguridad,
na.rm = TRUE
)
mediana_tasa <- median(
upz$tasa_total,
na.rm = TRUE
)
# Clasificar las UPZ según percepción y tasa
upz_percepcion_grupos <- upz %>%
mutate(
Grupo_percepcion_tasa = case_when(
pct_percibe_inseguridad >= mediana_percepcion &
tasa_total >= mediana_tasa ~ "Percepción alta - Tasa alta",
pct_percibe_inseguridad >= mediana_percepcion &
tasa_total < mediana_tasa ~ "Percepción alta - Tasa baja",
pct_percibe_inseguridad < mediana_percepcion &
tasa_total >= mediana_tasa ~ "Percepción baja - Tasa alta",
TRUE ~ "Percepción baja - Tasa baja"
)
)
# Resumen de UPZ por grupo
resumen_percepcion_grupos <- upz_percepcion_grupos %>%
group_by(Grupo_percepcion_tasa) %>%
summarise(
Numero_UPZ = n(),
Percepcion_mediana = median(
pct_percibe_inseguridad,
na.rm = TRUE
),
Tasa_mediana = median(
tasa_total,
na.rm = TRUE
),
Casos_mediana = median(
casos_total,
na.rm = TRUE
),
.groups = "drop"
)
knitr::kable(
resumen_percepcion_grupos,
digits = 2,
caption = "Clasificación territorial según percepción y tasa de delitos"
)
| Grupo_percepcion_tasa | Numero_UPZ | Percepcion_mediana | Tasa_mediana | Casos_mediana |
|---|---|---|---|---|
| Percepción alta - Tasa alta | 24 | 73.10 | 274.20 | 1567.0 |
| Percepción alta - Tasa baja | 32 | 76.83 | 120.78 | 1181.0 |
| Percepción baja - Tasa alta | 32 | 40.88 | 299.56 | 1317.5 |
| Percepción baja - Tasa baja | 24 | 47.37 | 148.51 | 921.5 |
# Identificar las UPZ de cada grupo
tabla_upz_percepcion <- upz_percepcion_grupos %>%
select(
upz_nombre,
poblacion,
casos_total,
tasa_total,
pct_percibe_inseguridad,
Grupo_percepcion_tasa
) %>%
arrange(Grupo_percepcion_tasa)
knitr::kable(
tabla_upz_percepcion,
digits = 2,
caption = "UPZ clasificadas según percepción de inseguridad y tasa de delitos"
)
| upz_nombre | poblacion | casos_total | tasa_total | pct_percibe_inseguridad | Grupo_percepcion_tasa |
|---|---|---|---|---|---|
| Doce De Octubre | 75666 | 2031 | 268.42 | 65.97 | Percepción alta - Tasa alta |
| Las Ferias | 100848 | 3139 | 311.26 | 72.92 | Percepción alta - Tasa alta |
| Boyaca Real | 128214 | 2794 | 217.92 | 74.08 | Percepción alta - Tasa alta |
| Santa Cecilia | 67416 | 1855 | 275.16 | 76.48 | Percepción alta - Tasa alta |
| Sosiego | 44546 | 975 | 218.87 | 70.31 | Percepción alta - Tasa alta |
| Santa Isabel | 43992 | 1202 | 273.23 | 69.99 | Percepción alta - Tasa alta |
| Restrepo | 56948 | 2690 | 472.36 | 73.27 | Percepción alta - Tasa alta |
| Quiroga | 93328 | 2448 | 262.30 | 70.92 | Percepción alta - Tasa alta |
| Ciudad Montes | 103350 | 2191 | 212.00 | 68.00 | Percepción alta - Tasa alta |
| Muzu | 60006 | 1561 | 260.14 | 79.06 | Percepción alta - Tasa alta |
| San Rafael | 74227 | 1676 | 225.79 | 70.62 | Percepción alta - Tasa alta |
| Carvajal | 88914 | 1958 | 220.21 | 82.88 | Percepción alta - Tasa alta |
| Marco Fidel Suarez | 47615 | 927 | 194.69 | 73.41 | Percepción alta - Tasa alta |
| El Mochuelo | 30 | 34 | 11333.33 | 86.83 | Percepción alta - Tasa alta |
| Fontibon San Pablo | 35141 | 902 | 256.68 | 69.94 | Percepción alta - Tasa alta |
| Corabastos | 56102 | 1103 | 196.61 | 92.11 | Percepción alta - Tasa alta |
| Las Cruces | 20786 | 888 | 427.21 | 85.97 | Percepción alta - Tasa alta |
| Los Alcazares | 44678 | 3495 | 782.26 | 69.78 | Percepción alta - Tasa alta |
| La Sabana | 38856 | 5441 | 1400.30 | 83.45 | Percepción alta - Tasa alta |
| Parque Salitre | 1442 | 233 | 1615.81 | 65.97 | Percepción alta - Tasa alta |
| Jardin Botanico | 2900 | 266 | 917.24 | 76.48 | Percepción alta - Tasa alta |
| Zona Industrial | 6666 | 1573 | 2359.74 | 66.27 | Percepción alta - Tasa alta |
| Puente Aranda | 12482 | 1561 | 1250.60 | 66.27 | Percepción alta - Tasa alta |
| Alamos | 12077 | 642 | 531.59 | 76.89 | Percepción alta - Tasa alta |
| El Rincon | 295322 | 3812 | 129.08 | 78.63 | Percepción alta - Tasa baja |
| San Blas | 105092 | 955 | 90.87 | 74.26 | Percepción alta - Tasa baja |
| 20 De Julio | 81050 | 1165 | 143.74 | 82.64 | Percepción alta - Tasa baja |
| Venecia | 141537 | 1835 | 129.65 | 81.09 | Percepción alta - Tasa baja |
| Timiza | 139473 | 1604 | 115.00 | 66.20 | Percepción alta - Tasa baja |
| Apogeo | 36013 | 451 | 125.23 | 69.38 | Percepción alta - Tasa baja |
| La Gloria | 96862 | 918 | 94.77 | 86.04 | Percepción alta - Tasa baja |
| La Flora | 20151 | 189 | 93.79 | 76.97 | Percepción alta - Tasa baja |
| Marruecos | 123085 | 1229 | 99.85 | 76.68 | Percepción alta - Tasa baja |
| Diana Turbay | 76093 | 804 | 105.66 | 79.62 | Percepción alta - Tasa baja |
| Gran Yomasa | 134412 | 1477 | 109.89 | 82.71 | Percepción alta - Tasa baja |
| Comuneros | 101345 | 1215 | 119.89 | 81.41 | Percepción alta - Tasa baja |
| Alfonso Lopez | 53774 | 455 | 84.61 | 70.34 | Percepción alta - Tasa baja |
| Ciudad Usme | 28258 | 356 | 125.98 | 70.34 | Percepción alta - Tasa baja |
| Tunjuelito | 41406 | 613 | 148.05 | 91.82 | Percepción alta - Tasa baja |
| Monte Blanco | 6575 | 80 | 121.67 | 86.83 | Percepción alta - Tasa baja |
| San Francisco | 72057 | 1244 | 172.64 | 70.00 | Percepción alta - Tasa baja |
| Lucero | 163588 | 2661 | 162.66 | 77.15 | Percepción alta - Tasa baja |
| El Tesoro | 54369 | 721 | 132.61 | 86.83 | Percepción alta - Tasa baja |
| Ismael Perdomo | 166602 | 1863 | 111.82 | 70.91 | Percepción alta - Tasa baja |
| Jerusalem | 102981 | 1061 | 103.03 | 83.17 | Percepción alta - Tasa baja |
| Tibabuyes | 305907 | 2669 | 87.25 | 72.98 | Percepción alta - Tasa baja |
| Garces Navas | 168657 | 2684 | 159.14 | 70.18 | Percepción alta - Tasa baja |
| Engativa | 142612 | 1702 | 119.34 | 74.63 | Percepción alta - Tasa baja |
| Gran Britalia | 62139 | 1151 | 185.23 | 70.70 | Percepción alta - Tasa baja |
| Patio Bonito | 137776 | 2544 | 184.65 | 86.07 | Percepción alta - Tasa baja |
| Las Margaritas | 32008 | 471 | 147.15 | 72.10 | Percepción alta - Tasa baja |
| Bosa Occidental | 199365 | 2272 | 113.96 | 74.30 | Percepción alta - Tasa baja |
| Bosa Central | 237111 | 3346 | 141.12 | 89.69 | Percepción alta - Tasa baja |
| El Porvenir | 143758 | 1197 | 83.26 | 74.01 | Percepción alta - Tasa baja |
| Tintal Sur | 113534 | 854 | 75.22 | 74.43 | Percepción alta - Tasa baja |
| Lourdes | 45098 | 570 | 126.39 | 81.16 | Percepción alta - Tasa baja |
| Paseo De Los Libertadores | 2690 | 74 | 275.09 | 36.18 | Percepción baja - Tasa alta |
| La Academia | 5260 | 123 | 233.84 | 40.88 | Percepción baja - Tasa alta |
| Usaquen | 43160 | 1298 | 300.74 | 24.45 | Percepción baja - Tasa alta |
| Santa Barbara | 74375 | 1972 | 265.14 | 40.67 | Percepción baja - Tasa alta |
| San Jose De Bavaria | 52099 | 1337 | 256.63 | 40.88 | Percepción baja - Tasa alta |
| El Prado | 106920 | 2267 | 212.03 | 48.84 | Percepción baja - Tasa alta |
| La Alhambra | 43531 | 1343 | 308.52 | 34.17 | Percepción baja - Tasa alta |
| Los Andes | 31556 | 1575 | 499.11 | 37.36 | Percepción baja - Tasa alta |
| Minuto De Dios | 110520 | 2183 | 197.52 | 62.71 | Percepción baja - Tasa alta |
| Ciudad Jardin | 26977 | 739 | 273.94 | 62.16 | Percepción baja - Tasa alta |
| San Jose | 49117 | 1030 | 209.70 | 65.36 | Percepción baja - Tasa alta |
| Americas | 78380 | 2449 | 312.45 | 63.34 | Percepción baja - Tasa alta |
| Kennedy Central | 92968 | 1856 | 199.64 | 65.96 | Percepción baja - Tasa alta |
| El Refugio | 41543 | 853 | 205.33 | 21.48 | Percepción baja - Tasa alta |
| Sagrado Corazon | 11247 | 1707 | 1517.74 | 59.85 | Percepción baja - Tasa alta |
| La Macarena | 12253 | 507 | 413.78 | 44.82 | Percepción baja - Tasa alta |
| Las Nieves | 17203 | 4033 | 2344.36 | 59.85 | Percepción baja - Tasa alta |
| La Candelaria | 18409 | 1371 | 744.74 | 64.66 | Percepción baja - Tasa alta |
| Chico Lago | 38608 | 4985 | 1291.18 | 21.48 | Percepción baja - Tasa alta |
| Chapinero | 26491 | 2901 | 1095.09 | 50.28 | Percepción baja - Tasa alta |
| Galerias | 38425 | 3067 | 798.18 | 48.52 | Percepción baja - Tasa alta |
| Teusaquillo | 28881 | 2976 | 1030.44 | 62.90 | Percepción baja - Tasa alta |
| Parque Simon Bolivar - Can | 3323 | 958 | 2882.94 | 32.98 | Percepción baja - Tasa alta |
| La Esmeralda | 41130 | 1021 | 248.24 | 32.98 | Percepción baja - Tasa alta |
| Quinta Paredes | 28926 | 1285 | 444.24 | 34.58 | Percepción baja - Tasa alta |
| Ciudad Salitre Oriental | 25743 | 671 | 260.65 | 20.37 | Percepción baja - Tasa alta |
| Ciudad Salitre Occidental | 46658 | 1251 | 268.12 | 26.72 | Percepción baja - Tasa alta |
| Granjas De Techo | 53189 | 1587 | 298.37 | 40.63 | Percepción baja - Tasa alta |
| Bavaria | 41086 | 1100 | 267.73 | 52.84 | Percepción baja - Tasa alta |
| Modelia | 45171 | 1283 | 284.03 | 49.08 | Percepción baja - Tasa alta |
| Capellania | 18499 | 874 | 472.46 | 32.58 | Percepción baja - Tasa alta |
| Aeropuerto El Dorado | 883 | 545 | 6172.14 | 32.58 | Percepción baja - Tasa alta |
| Guaymaral | 2692 | 45 | 167.16 | 40.88 | Percepción baja - Tasa baja |
| Verbenal | 131999 | 944 | 71.52 | 65.43 | Percepción baja - Tasa baja |
| La Uribe | 37014 | 621 | 167.77 | 36.18 | Percepción baja - Tasa baja |
| San Cristobal Norte | 72939 | 793 | 108.72 | 49.84 | Percepción baja - Tasa baja |
| Toberin | 63068 | 943 | 149.52 | 60.44 | Percepción baja - Tasa baja |
| Los Cedros | 134973 | 1991 | 147.51 | 41.49 | Percepción baja - Tasa baja |
| Country Club | 26128 | 442 | 169.17 | 40.67 | Percepción baja - Tasa baja |
| Britalia | 97578 | 1428 | 146.34 | 38.20 | Percepción baja - Tasa baja |
| Casa Blanca Suba | 62660 | 947 | 151.13 | 17.45 | Percepción baja - Tasa baja |
| Niza | 84904 | 1584 | 186.56 | 38.99 | Percepción baja - Tasa baja |
| La Floresta | 46543 | 886 | 190.36 | 43.20 | Percepción baja - Tasa baja |
| Suba | 186728 | 2587 | 138.54 | 44.41 | Percepción baja - Tasa baja |
| Castilla | 141571 | 2646 | 186.90 | 52.84 | Percepción baja - Tasa baja |
| Los Libertadores | 78878 | 710 | 90.01 | 55.05 | Percepción baja - Tasa baja |
| Danubio | 58494 | 639 | 109.24 | 58.33 | Percepción baja - Tasa baja |
| Parque Entrenubes | 1169 | 16 | 136.87 | 58.33 | Percepción baja - Tasa baja |
| Arborizadora | 84765 | 1388 | 163.75 | 63.38 | Percepción baja - Tasa baja |
| Bolivia | 83775 | 1450 | 173.08 | 19.37 | Percepción baja - Tasa baja |
| Fontibon | 139257 | 2454 | 176.22 | 44.54 | Percepción baja - Tasa baja |
| Zona Franca | 65454 | 697 | 106.49 | 44.89 | Percepción baja - Tasa baja |
| Tintal Norte | 30467 | 420 | 137.85 | 54.05 | Percepción baja - Tasa baja |
| Calandaima | 134340 | 1215 | 90.44 | 58.77 | Percepción baja - Tasa baja |
| San Isidro - Patios | 17839 | 115 | 64.47 | 54.34 | Percepción baja - Tasa baja |
| Pardo Rubio | 53836 | 900 | 167.17 | 50.28 | Percepción baja - Tasa baja |
# Visualización de los cuatro grupos
ggplot(
upz_percepcion_grupos,
aes(
x = pct_percibe_inseguridad,
y = tasa_total,
color = Grupo_percepcion_tasa
)
) +
geom_point(
size = 2.7,
alpha = 0.8
) +
geom_vline(
xintercept = mediana_percepcion,
linetype = "dashed",
color = "grey45"
) +
geom_hline(
yintercept = mediana_tasa,
linetype = "dashed",
color = "grey45"
) +
scale_y_log10(
labels = scales::label_comma()
) +
scale_color_manual(
values = c(
"Percepción alta - Tasa alta" = "#351A4F",
"Percepción alta - Tasa baja" = "#D9006C",
"Percepción baja - Tasa alta" = "#168C86",
"Percepción baja - Tasa baja" = "#A69BAF"
),
name = "Clasificación"
) +
labs(
title = "Percepción y denuncias permiten identificar cuatro perfiles territoriales",
subtitle = "Clasificación relativa según las medianas de las variables",
x = "Percepción de inseguridad (%)",
y = "Tasa de delitos por 10.000 habitantes (escala logarítmica)"
) +
tema_clase
# Resumen ejecutivo de los cuatro grupos
resumen_cuatro_grupos <- upz_percepcion_grupos %>%
mutate(
Grupo = case_when(
Grupo_percepcion_tasa == "Percepción alta - Tasa alta" ~ "G1",
Grupo_percepcion_tasa == "Percepción alta - Tasa baja" ~ "G2",
Grupo_percepcion_tasa == "Percepción baja - Tasa alta" ~ "G3",
Grupo_percepcion_tasa == "Percepción baja - Tasa baja" ~ "G4"
)
) %>%
group_by(Grupo) %>%
summarise(
Numero_UPZ = n(),
Poblacion_total = sum(poblacion, na.rm = TRUE),
Porcentaje_UPZ = n() / nrow(upz_percepcion_grupos) * 100,
Percepcion_mediana = median(
pct_percibe_inseguridad,
na.rm = TRUE
),
Tasa_mediana = median(
tasa_total,
na.rm = TRUE
),
Casos_totales = sum(casos_total, na.rm = TRUE),
.groups = "drop"
) %>%
mutate(
Grupo = factor(Grupo, levels = c("G1", "G2", "G3", "G4")),
Participacion = paste0(
round(Porcentaje_UPZ, 1),
"%"
)
) %>%
arrange(Grupo)
# Tabla resumen
knitr::kable(
resumen_cuatro_grupos %>%
select(
Grupo,
Numero_UPZ,
Participacion,
Poblacion_total,
Percepcion_mediana,
Tasa_mediana,
Casos_totales
),
digits = 2,
col.names = c(
"Grupo",
"N.º UPZ",
"Participación",
"Población",
"Percepción mediana (%)",
"Tasa mediana",
"Casos totales"
),
caption = "Resumen de los cuatro perfiles territoriales"
)
| Grupo | N.º UPZ | Participación | Población | Percepción mediana (%) | Tasa mediana | Casos totales |
|---|---|---|---|---|---|---|
| G1 | 24 | 21.4% | 1216230 | 73.10 | 274.20 | 41585 |
| G2 | 32 | 28.6% | 3628010 | 76.83 | 120.78 | 44168 |
| G3 | 32 | 28.6% | 1255221 | 40.88 | 299.56 | 51221 |
| G4 | 24 | 21.4% | 1837071 | 47.37 | 148.51 | 25861 |
# Preparar los cuatro grupos y sus porcentajes
grafica_clasificacion_736 <- resumen_cuatro_grupos %>%
mutate(
Grupo = as.character(Grupo),
Clasificacion = case_when(
Grupo == "G1" ~ "Alta percepción - Alta tasa",
Grupo == "G2" ~ "Alta percepción - Baja tasa",
Grupo == "G3" ~ "Baja percepción - Alta tasa",
Grupo == "G4" ~ "Baja percepción - Baja tasa"
),
Etiqueta = paste0(
Grupo, "\n",
round(Porcentaje_UPZ, 1), "%\n",
Numero_UPZ, " UPZ"
)
)
# Gráfica de distribución porcentual
ggplot(
grafica_clasificacion_736,
aes(
x = 2,
y = Porcentaje_UPZ,
fill = Grupo
)
) +
geom_col(
width = 0.75,
color = "white",
linewidth = 1
) +
geom_text(
aes(label = Etiqueta),
position = position_stack(vjust = 0.5),
color = "white",
fontface = "bold",
size = 3.5
) +
coord_polar(theta = "y") +
xlim(0.5, 2.5) +
scale_fill_manual(
values = c(
"G1" = "#351A4F",
"G2" = "#D9006C",
"G3" = "#168C86",
"G4" = "#A69BAF"
),
labels = c(
"G1" = "Percepción alta - Tasa alta",
"G2" = "Percepción alta - Tasa baja",
"G3" = "Percepción baja - Tasa alta",
"G4" = "Percepción baja - Tasa baja"
),
name = "Perfil territorial"
) +
labs(
title = "Distribución de las UPZ según percepción y tasa de delitos",
subtitle = "Clasificación relativa basada en las medianas de ambas variables",
caption = "Total: 112 UPZ. Los porcentajes representan participación sobre el total."
) +
tema_clase +
theme(
axis.title = element_blank(),
axis.text = element_blank(),
axis.ticks = element_blank(),
panel.grid = element_blank(),
legend.position = "right"
)
# Agrupar los cuatro perfiles en dos categorías generales
resumen_correspondencia <- resumen_cuatro_grupos %>%
mutate(
Tipo = case_when(
Grupo %in% c("G1", "G4") ~ "Coincidencia",
Grupo %in% c("G2", "G3") ~ "Diferencia"
)
) %>%
group_by(Tipo) %>%
summarise(
Porcentaje = sum(Porcentaje_UPZ),
Numero_UPZ = sum(Numero_UPZ),
.groups = "drop"
) %>%
mutate(
Tipo = factor(
Tipo,
levels = c("Diferencia", "Coincidencia")
),
Etiqueta = paste0(
round(Porcentaje, 1), "%",
" (", Numero_UPZ, " UPZ)"
)
)
# Gráfico de correspondencia
ggplot(
resumen_correspondencia,
aes(
x = Porcentaje,
y = Tipo,
fill = Tipo
)
) +
geom_col(
width = 0.45,
color = NA
) +
geom_text(
aes(
label = Etiqueta
),
hjust = -0.12,
fontface = "bold",
size = 4
) +
scale_fill_manual(
values = c(
"Coincidencia" = "#168C86",
"Diferencia" = "#D9006C"
)
) +
scale_x_continuous(
limits = c(0, 75),
breaks = seq(0, 75, 15),
labels = function(x) paste0(x, "%"),
expand = expansion(mult = c(0, 0))
) +
labs(
title = "Correspondencia entre percepción y denuncias",
subtitle = "Coincidencia: G1 + G4 | Diferencia: G2 + G3",
x = NULL,
y = NULL,
caption = "Clasificación relativa de las 112 UPZ según las medianas de percepción y tasa."
) +
tema_clase +
theme(
legend.position = "none",
panel.grid.major.y = element_blank(),
panel.grid.minor = element_blank(),
axis.text.y = element_text(
face = "bold",
size = 11
),
axis.text.x = element_text(size = 9)
)
La clasificación de las UPZ en cuatro perfiles territoriales permite identificar diferencias importantes entre la percepción de inseguridad reportada por los habitantes y las tasas de delitos denunciados.
Uno de los resultados más relevantes es que el 57,2 % de las UPZ presenta una diferencia entre ambas dimensiones. En particular, el 28,6 % corresponde al grupo G2, caracterizado por una percepción de inseguridad superior a la mediana y tasas de denuncias inferiores a esta. Por su parte, otro 28,6 % pertenece al grupo G3, donde se observa el comportamiento contrario: una percepción relativamente baja frente a tasas de denuncias superiores a la mediana.
Los grupos G1 y G4, que representan conjuntamente el 42,8 % de las UPZ, muestran una correspondencia relativa entre percepción y registros: en el primero coinciden niveles altos de percepción y tasas, mientras que en el segundo ambas variables se ubican por debajo de sus respectivas medianas.
Este comportamiento permite reconocer que la experiencia de inseguridad de los habitantes no necesariamente coincide con los registros administrativos de denuncias. En algunos territorios, la percepción puede ser elevada incluso cuando las tasas registradas son relativamente bajas; en otros, las tasas pueden ser elevadas sin que la percepción reportada alcance niveles similares.
Una posible explicación es que la denuncia no recoge la totalidad de los hechos delictivos. También pueden intervenir factores como la disposición de las personas a denunciar, sus experiencias de inseguridad, la exposición a situaciones de riesgo y las características particulares del entorno. Sin embargo, la información disponible no permite determinar cuál de estos factores explica las diferencias identificadas.
Insight principal: La percepción de inseguridad y los delitos denunciados no representan necesariamente la misma realidad territorial. El 57,2 % de las UPZ presenta una diferencia entre ambas dimensiones, lo que evidencia que los registros administrativos, aunque fundamentales para analizar la seguridad, no son suficientes por sí solos para comprender cómo experimentan los habitantes la inseguridad en su entorno.
En consecuencia, el análisis de la seguridad territorial debe integrar tanto los registros de denuncias como la percepción de los habitantes, reconociendo que son indicadores complementarios y que ninguno representa por sí solo la totalidad del fenómeno.
Durante el desarrollo de este trabajo se utilizó ChatGPT como herramienta de apoyo para la construcción y ejecución del análisis exploratorio de datos (EDA), especialmente en la elaboración de código en R, la estructuración de procedimientos estadísticos, la generación de visualizaciones y la organización de los resultados dentro del documento R Markdown.
El desarrollo se realizó mediante un proceso de trabajo guiado, progresivo e iterativo. Los autores definieron el enfoque del proyecto, formularon las preguntas de investigación, establecieron las variables de interés, orientaron las decisiones metodológicas y determinaron los análisis que debían realizarse en función de los objetivos del taller.
ChatGPT proporcionó asistencia técnica en la escritura y corrección del código, así como en la propuesta de procedimientos estadísticos y alternativas de visualización. Esta colaboración se desarrolló paso a paso, revisando los resultados obtenidos, identificando errores, ajustando los procedimientos y profundizando en la interpretación de los hallazgos.
La selección de los análisis, la revisión de su pertinencia, la orientación de las preguntas y la interpretación crítica de los resultados estuvieron bajo el criterio y la dirección de los autores. De esta manera, la inteligencia artificial se utilizó como un recurso de acompañamiento y asistencia técnica, sin sustituir el proceso de análisis, reflexión y toma de decisiones de los estudiantes.
Los resultados y conclusiones presentados fueron construidos a partir de la ejecución del código sobre los datos del proyecto y de la revisión de las evidencias obtenidas durante el desarrollo del trabajo.