La ciudad desde sus viviendas

Sentirse inseguro cerca de la casa y aparecer en un registro de denuncias son dos maneras distintas de conocer la ciudad. Al mirar las UPZ de Bogotá, esas dos lecturas no siempre coinciden.

Este informe se pregunta cómo se relacionan las condiciones de vivienda, el entorno y el acceso a servicios con la percepción de inseguridad. El recorrido comienza por las diferencias residenciales y termina contrastándolas con dos tipos de denuncia: violencia intrafamiliar y hurto de celulares. La unidad de análisis es la UPZ, una agrupación de barrios; cada observación describe un territorio, no a una persona.

66,0 %de percepción de inseguridad en la UPZ situada en la mitad de la distribución. No es el porcentaje total de Bogotá.
22,8 minde diferencia mediana entre caminar a un espacio cultural y a un parque, comparando cada UPZ consigo misma.
Dos patronesLas denuncias de violencia intrafamiliar y de hurto de celulares se relacionan de forma distinta con la percepción.

La exploración se organiza en seis preguntas. En conjunto, relacionan 14 variables de cuatro bloques: demografía, vivienda, encuesta y delitos.

Qué información tenemos

La base reúne 112 UPZ y 67 variables. La encuesta describe condiciones de 2021; la población, las viviendas y las denuncias corresponden a 2023. Estas últimas cubren únicamente enero a julio. Las preguntas se eligieron después de explorar la base, por lo que los resultados describen relaciones encontradas en los datos y no comprueban hipótesis planteadas de antemano.

Por qué elegimos estas variables

Bloque Variables seleccionadas Qué aportan a la historia
Demografía · 2 Población y densidad de población Distinguir el tamaño de una UPZ de la concentración de residentes y revisar las tasas de denuncias.
Vivienda · 2 Personas por vivienda ocupada y porcentaje de viviendas desocupadas Comparar dos rasgos de la ocupación residencial que no significan lo mismo.
Encuesta · 6 Arriendo, percepción de inseguridad, basureros cercanos, expendios de droga cercanos, tiempo a parque y tiempo a espacio cultural Relacionar la experiencia del entorno con la tenencia de vivienda y dos formas de acceso a servicios.
Delitos · 4 Denuncias y tasas de violencia intrafamiliar y de hurto de celulares Contrastar dos registros diferentes y comprobar sus tasas a partir de los casos y la población.

La selección combina características residenciales con experiencias del entorno. No pretende cubrir todas las formas de inseguridad. Se eligieron dos servicios y dos tipos de denuncia para poder comparar sus patrones con detalle, en lugar de acumular indicadores sin una pregunta que los conecte.

Lo que revisamos antes de comparar

No se encontraron celdas vacías ni códigos de UPZ repetidos. Las 112 UPZ de la tabla tienen correspondencia en el mapa. Se revisaron los tipos de las 67 columnas, sus rangos y sus distribuciones. Los porcentajes se encuentran entre 0 y 100; los conteos y los tiempos seleccionados no son negativos. Esto permite trabajar con la base, aunque tener datos completos no garantiza que todo lo ocurrido haya sido medido.

Las diferencias de tamaño son grandes: la población va desde 30 hasta 305.907 habitantes. Los conteos y las tasas de denuncias tienen valores extremos. Por eso acompañamos las medias con medianas y cuartiles: la mediana divide las UPZ en dos mitades, y el intervalo entre el primer y el tercer cuartil contiene la mitad central de los valores.

En algunas UPZ, la encuesta comparte un mismo resultado. La encuesta estudió juntas varias zonas y les asignó el dato del grupo. Esto ocurre en 32 UPZ. Si varias reciben el mismo valor, no son varias mediciones independientes que confirmen un patrón. Por eso repetimos las comparaciones usando solo las otras 80 UPZ y revisamos si la lectura cambia.

Las poblaciones muy pequeñas requieren otra precaución. En El Mochuelo, por ejemplo, la base registra 30 residentes: una sola denuncia equivale a 333,3 por cada 10.000 habitantes. Para comparar tasas usamos principalmente las 104 UPZ con al menos 5.000 residentes. Es una decisión de análisis, no una regla oficial; también revisamos qué ocurre al usar otros cortes. Las ocho UPZ restantes sí aparecen en los análisis de vivienda, encuesta y mapas.

Una primera lectura de las cifras

descriptivos <- bind_rows(lapply(variables,function(v) {
 z <- u[[v]]
 data.frame(variable=v,Media=mean(z),Mediana=median(z),DE=sd(z),
 Min=min(z),Q1=unname(quantile(z,.25)),Q3=unname(quantile(z,.75)),Max=max(z))
})) %>% left_join(ficha %>% select(variable,nombre,unidad),by="variable")
tab_des <- descriptivos %>% transmute(
 Indicador=paste0(htmltools::htmlEscape(nombre),"<small>",htmltools::htmlEscape(unidad),"</small>"),
 Media=fmt(Media),Mediana=fmt(Mediana),`Desv. est.`=fmt(DE),
 `25 % (Q1)`=fmt(Q1),`75 % (Q3)`=fmt(Q3),`Mín. – máx.`=paste(fmt(Min),fmt(Max),sep=" – "))
tabla(tab_des,"Tabla 1. Resumen de las 14 variables · 112 UPZ",escape=FALSE,clase="summary-table")
Tabla 1. Resumen de las 14 variables · 112 UPZ
Indicador Media Mediana Desv. est. 25 % (Q1) 75 % (Q3) Mín. – máx.
PoblaciónHabitantes · 2023 70.861,89 54.102,50 58.406,41 30.081,75 100.972,25 30,00 – 305.907,00
Densidad de poblaciónHab/km² · 2023 19.119,36 20.180,22 10.801,85 11.160,41 25.826,54 9,44 – 46.156,87
Personas por viviendaPersonas/vivienda ocupada · 2023 2,81 2,81 0,51 2,61 3,04 1,70 – 5,80
Viviendas desocupadas% de viviendas · 2023 6,06 4,38 6,32 1,62 7,71 0,00 – 43,88
Hogares en arriendo% de hogares · 2021 49,44 50,82 10,45 42,47 56,26 27,66 – 72,07
Percepción de inseguridad% reporta inseguridad · 2021 60,84 65,97 18,87 44,75 74,33 17,45 – 92,11
Basureros cercanos% viviendas afectadas · 2021 9,50 6,12 9,63 2,72 12,11 0,24 – 45,01
Expendios de droga cercanos% viviendas afectadas · 2021 21,59 20,55 15,85 9,05 31,11 0,31 – 75,60
Acceso a parqueMinutos caminando · 2021 8,82 8,29 3,19 6,16 10,36 4,21 – 20,04
Acceso a espacio culturalMinutos caminando · 2021 31,16 30,38 8,33 26,66 35,53 13,32 – 60,66
Denuncias de violencia intrafamiliarCasos registrados · ene–jul 2023 143,33 100,50 150,84 48,00 182,25 0,00 – 818,00
Denuncias de hurto de celularesCasos registrados · ene–jul 2023 275,95 233,50 228,52 125,00 346,50 1,00 – 1.266,00
Tasa de violencia intrafamiliarDenuncias/10.000 hab · ene–jul 2023 23,74 17,63 30,99 11,88 24,22 0,00 – 232,06
Tasa de hurto de celularesDenuncias/10.000 hab · ene–jul 2023 104,48 35,11 282,79 19,32 61,84 7,29 – 2.666,67

La desviación estándar resume cuánto se separan los valores de la media. Las unidades de cada fila importan: no se pueden comparar directamente minutos, porcentajes y denuncias. Además, cada UPZ pesa lo mismo en esta tabla, aunque no tenga la misma población. La mediana de percepción, por ejemplo, no representa el porcentaje de todos los habitantes de Bogotá.

Las distribuciones completas están en el anexo. Allí también aparecen las ocho UPZ de población baja, la revisión de las 67 columnas y las comprobaciones de las tasas.

Vivienda y entorno

01. Densidad y ocupación de las viviendas

¿Cómo cambian la ocupación y la desocupación de viviendas entre UPZ con distinta densidad de población?

Una UPZ puede concentrar muchos residentes por kilómetro cuadrado sin tener más personas dentro de cada vivienda. Para distinguir ambas situaciones, ordenamos las UPZ por densidad y formamos cuatro grupos, desde el menos denso hasta el más denso. Cada grupo contiene 28 UPZ.

lim_d <- quantile(u$densidad_hab_km2,c(0,.25,.5,.75,1))
res_viv <- u %>% select(grupo_densidad,personas_por_vivienda,pct_viviendas_desocupadas) %>%
 pivot_longer(-grupo_densidad,names_to="Indicador",values_to="valor") %>%
 mutate(Indicador=recode(Indicador,personas_por_vivienda="Personas por vivienda ocupada",
 pct_viviendas_desocupadas="Viviendas desocupadas (%)")) %>%
 group_by(grupo_densidad,Indicador) %>% summarise(N=n(),Mediana=median(valor),
 Q1=quantile(valor,.25),Q3=quantile(valor,.75),.groups="drop")
ggplot(res_viv,aes(grupo_densidad,Mediana)) +
 geom_linerange(aes(ymin=Q1,ymax=Q3),linewidth=8,color="#D4EAE7") +
 geom_line(aes(group=1),color=azul,linewidth=.6) +
 geom_point(size=3.5,color=azul) +
 geom_label(aes(label=fmt(Mediana,2)),nudge_x=.18,hjust=0,size=3.6,fontface="bold",color=azul,
 fill="white",linewidth =0,label.padding=grid::unit(.1,"lines")) +
 facet_wrap(~Indicador,scales="free_y") +
 scale_x_discrete(labels=c("Q1"="Menor\ndensidad","Q2"="Grupo 2","Q3"="Grupo 3","Q4"="Mayor\ndensidad"),expand=expansion(add=c(.5,.8))) +
 scale_y_continuous(limits=c(0,NA),expand=expansion(mult=c(0,.12)),labels=num) +
 labs(title="En las UPZ más densas hay menos viviendas desocupadas",
 subtitle="Las personas por vivienda cambian menos y no aumentan de forma continua entre los cuatro grupos.",
 x=NULL,y=NULL,caption="Punto y cifra: mediana. Franja vertical: mitad central de las UPZ (Q1–Q3). Cada panel tiene su escala.\nFuente: proyecciones de población y vivienda 2023, archivos del taller.") +
 theme(panel.grid.major.x=element_blank())
Figura 1. Vivienda y densidad de población · 112 UPZ · 2023.

Figura 1. Vivienda y densidad de población · 112 UPZ · 2023.

La mediana de viviendas desocupadas pasa de 8,05 % a 1,48 % entre los grupos de menor y mayor densidad. En personas por vivienda, la diferencia es más pequeña: 2,71 frente a 2,97. El segundo grupo incluso tiene una mediana inferior a la del primero.

La densidad se relaciona con una menor desocupación de viviendas, pero no basta para describir cómo se vive dentro de ellas. Para hablar de hacinamiento necesitaríamos, por ejemplo, saber cuántas habitaciones hay disponibles.

02. Arriendo y percepción de inseguridad

¿Qué relación hay entre la proporción de hogares en arriendo y la percepción de inseguridad?

La forma de tenencia añade otra diferencia residencial. En el gráfico, cada punto representa una UPZ; cuanto más a la derecha aparece, mayor es la proporción de hogares en arriendo. Cuanto más arriba, mayor es la percepción de inseguridad cerca de la vivienda.

etiquetas_a <- tibble::tribble(~upz_nombre,~tx,~ty,
 "Corabastos",67,97,"Bosa Central",46,96,"Casa Blanca Suba",40,11,"Tintal Sur",21,79) %>%
 left_join(u,by="upz_nombre")
ggplot(u,aes(pct_arriendo,pct_percibe_inseguridad)) +
 geom_point(aes(shape=em_agrupada),color=azul,size=2.7,alpha=.6,stroke=1) +
 geom_segment(data=etiquetas_a,aes(xend=tx,yend=ty),color="#A99AB0",linewidth=.45) +
 geom_point(data=etiquetas_a,size=3.2,color=naranja) +
 geom_label(data=etiquetas_a,aes(x=tx,y=ty,label=upz_nombre),size=3.1,color=naranja,
 fill="white",label.size=0,fontface="bold",label.padding=grid::unit(.16,"lines")) +
 scale_shape_manual(values=c("FALSE"=16,"TRUE"=1),labels=c("FALSE"="Resultado propio de la UPZ","TRUE"="Resultado compartido con otras UPZ"),name=NULL) +
 scale_y_continuous(limits=c(0,100),breaks=seq(0,100,20),labels=function(z)paste0(z," %")) +
 scale_x_continuous(limits=c(0,80),breaks=seq(0,80,20),labels=function(z)paste0(z," %")) +
 labs(title="Más arriendo suele acompañar una percepción más alta",
 subtitle="La relación es clara en conjunto, pero las UPZ no siguen una regla única.",
 x="Hogares en arriendo",y="Reporta inseguridad cerca de la vivienda",
 caption="112 UPZ. Se destacan cuatro casos para mostrar el patrón y sus contrastes. Los círculos abiertos pueden superponerse.\nFuente: Encuesta Multipropósito 2021, archivos del taller.")
Figura 2. Arriendo y percepción de inseguridad · Encuesta Multipropósito 2021.

Figura 2. Arriendo y percepción de inseguridad · Encuesta Multipropósito 2021.

Corabastos reúne valores altos de ambas variables. Tintal Sur muestra un contraste: con 32,3 % de hogares en arriendo, registra 74,4 % de percepción de inseguridad. Eso recuerda que la tenencia de vivienda no resume todo el contexto de una UPZ.

Para resumir la relación usamos la correlación de Spearman: compara el orden de las UPZ en dos variables y va de −1 a 1. Un valor positivo indica que las UPZ con cifras altas en una suelen tener cifras altas en la otra; un valor cercano a cero señala que ese orden se parece poco. Aquí es 0,65, y permanece en 0,63 al usar solo las 80 UPZ con resultados propios de encuesta.

El arriendo y la percepción se relacionan a escala territorial. Esto no significa que arrendar cause inseguridad ni que los arrendatarios generen delitos. Las dos variables podrían estar relacionadas con otras condiciones de los barrios que aquí no se han separado.

03. Los problemas reportados del entorno

¿Los reportes de basureros y expendios de droga cercanos tienen la misma frecuencia y la misma relación con la percepción?

La encuesta también pregunta por viviendas afectadas por basureros o expendios de droga cercanos. Estos porcentajes cuentan lo que se reporta sobre el entorno; no cuentan establecimientos ni sitios verificados. Para compararlos, ordenamos las 112 UPZ según su percepción de inseguridad y formamos cuatro grupos.

u <- u %>% mutate(grupo_percepcion=cuartiles(pct_percibe_inseguridad))
entorno <- u %>% select(grupo_percepcion,pct_cerca_basureros,pct_cerca_ollas) %>%
 pivot_longer(-grupo_percepcion,names_to="Reporte",values_to="valor") %>%
 mutate(Reporte=recode(Reporte,pct_cerca_basureros="Basureros",pct_cerca_ollas="Expendios de droga")) %>%
 group_by(grupo_percepcion,Reporte) %>% summarise(Mediana=median(valor),.groups="drop")
ggplot(entorno,aes(grupo_percepcion,Mediana,color=Reporte,group=Reporte)) +
 geom_line(linewidth=1.2) + geom_point(size=3.5) +
 geom_text(aes(y=Mediana+ifelse(grupo_percepcion=="Q1" & Reporte=="Expendios de droga",6,3.5),
 label=paste0(fmt(Mediana,1)," %")),size=3.7,fontface="bold",show.legend=FALSE) +
 scale_color_manual(values=c("Basureros"=azul,"Expendios de droga"=naranja)) +
 scale_x_discrete(labels=c("Q1"="Menor\npercepción","Q2"="Grupo 2","Q3"="Grupo 3","Q4"="Mayor\npercepción")) +
 scale_y_continuous(limits=c(0,45),breaks=seq(0,40,10),labels=function(z)paste0(z," %")) +
 labs(title="Los reportes del entorno aumentan entre los grupos de percepción",
 subtitle="La mediana de viviendas afectadas por expendios es mayor que la de basureros en los cuatro grupos.",
 x=NULL,y="Viviendas afectadas · mediana entre UPZ",color=NULL,
 caption="Las líneas conectan grupos ordenados, no cambios en el tiempo. Dentro de cada grupo hay diferencias entre UPZ.\nFuente: Encuesta Multipropósito 2021, archivos del taller.") +
 theme(panel.grid.major.x=element_blank())
Figura 3. Reportes del entorno en cuatro grupos de percepción · 28 UPZ por grupo · 2021.

Figura 3. Reportes del entorno en cuatro grupos de percepción · 28 UPZ por grupo · 2021.

En toda la base, la mediana es 20,6 % para expendios de droga y 6,1 % para basureros. Son frecuencias distintas, aunque ambas aumentan entre los grupos de percepción. Las correlaciones de Spearman son 0,67 y 0,61, respectivamente, y cambian poco al repetir la comparación sin las UPZ de resultado compartido.

Los problemas reportados del entorno acompañan una mayor percepción de inseguridad. Sin embargo, las tres respuestas vienen de la misma encuesta: una valoración negativa del barrio podría influir en varias de ellas. Los datos no permiten separar esa percepción general de las condiciones materiales del lugar.

Esto ayuda a entender por qué no basta con escoger la correlación más alta y convertirla en una recomendación. Una asociación más fuerte no demuestra que intervenir ese problema produciría una reducción mayor de la inseguridad.

04. El tiempo para llegar a los servicios

¿Caminar a un parque y a un espacio cultural toma un tiempo semejante, y ambos tiempos se relacionan igual con la percepción?

Los tiempos reportados permiten mirar otra parte de la vida cotidiana. La curva muestra cuántas UPZ tienen un tiempo promedio igual o menor al del eje horizontal. Por ejemplo, donde una curva cruza el 50 %, la mitad de las UPZ queda a un lado y la otra mitad al otro: ese tiempo es la mediana.

acceso <- u %>% select(min_parque,min_cultura) %>% pivot_longer(everything(),names_to="Servicio",values_to="Minutos") %>%
 mutate(Servicio=recode(Servicio,min_parque="Parque",min_cultura="Espacio cultural"))
med_acceso <- acceso %>% group_by(Servicio) %>% summarise(Minutos=median(Minutos),.groups="drop")
ggplot(acceso,aes(Minutos,color=Servicio)) +
 geom_hline(yintercept=.5,color="#AAA0B2",linetype="dashed",linewidth=.5) +
 stat_ecdf(linewidth=1.25) +
 geom_segment(data=med_acceso,aes(xend=Minutos,y=0,yend=.5),linetype="dotted",linewidth=.7) +
 geom_point(data=med_acceso,aes(y=.5),size=3.5) +
 geom_label(data=med_acceso,aes(y=.39,label=paste0(Servicio,"\nMediana: ",fmt(Minutos,1)," min")),
 size=3.4,label.size=0,fill="white",fontface="bold",show.legend=FALSE) +
 scale_color_manual(values=c("Parque"=azul,"Espacio cultural"=naranja)) +
 scale_y_continuous(labels=scales::label_percent(accuracy=1),limits=c(0,1),breaks=c(0,.25,.5,.75,1)) +
 scale_x_continuous(limits=c(0,65),breaks=seq(0,60,10),labels=num) +
 labs(title="Los espacios culturales quedan más lejos que los parques",
 subtitle="En las 112 UPZ, el tiempo a un espacio cultural supera el tiempo a un parque.",
 x="Tiempo promedio caminando (minutos)",y="UPZ con ese tiempo o menos",color=NULL,
 caption="Cada UPZ tiene el mismo peso. La curva describe territorios, no el porcentaje de personas con acceso.\nFuente: Encuesta Multipropósito 2021, archivos del taller.")
Figura 4. Tiempo promedio caminando a parques y espacios culturales · 112 UPZ · 2021.

Figura 4. Tiempo promedio caminando a parques y espacios culturales · 112 UPZ · 2021.

Al comparar ambos tiempos dentro de cada UPZ, la diferencia mediana es de 22,8 minutos. La separación es amplia y ocurre en toda la base, pero no implica que los servicios tengan la misma función o deban estar a la misma distancia.

El tiempo a parques se relaciona con la percepción de inseguridad con un coeficiente de 0,58. En cultura, la relación es más débil: 0,21, que baja a 0,10 al usar solo las 80 UPZ con resultados propios.

Estar más lejos de un servicio no tiene la misma relación con la percepción en todos los casos. Los espacios culturales requieren más tiempo de caminata, pero el acceso a parques muestra una asociación mayor. Ninguna de estas comparaciones demuestra que la cercanía de un servicio reduzca la inseguridad.

Los minutos tampoco informan sobre el estado de los parques, la programación de los espacios culturales o la seguridad del recorrido. Esas diferencias pueden importar, pero esta base no permite evaluarlas.

Percepción, denuncias y territorio

05. Dos tipos de denuncia, dos patrones

¿Las UPZ con mayor percepción de inseguridad muestran el mismo patrón de denuncias de violencia intrafamiliar y hurto de celulares?

Las preguntas anteriores describían principalmente la experiencia residencial. Ahora incorporamos los registros de denuncias. Para comparar UPZ de diferente tamaño, expresamos los casos por cada 10.000 residentes y usamos las 104 UPZ con al menos 5.000 habitantes. Los grupos se calculan de nuevo para estas 104 UPZ, ordenadas de menor a mayor percepción.

delitos <- tasas %>% select(upz_cod,grupo_percepcion,tasa_violencia_intrafamiliar,tasa_hurto_celulares) %>%
 pivot_longer(c(tasa_violencia_intrafamiliar,tasa_hurto_celulares),names_to="Tipo",values_to="Tasa") %>%
 mutate(Tipo=factor(recode(Tipo,tasa_violencia_intrafamiliar="Violencia intrafamiliar",tasa_hurto_celulares="Hurto de celulares"),
 levels=c("Violencia intrafamiliar","Hurto de celulares")))
med_del <- delitos %>% group_by(grupo_percepcion,Tipo) %>% summarise(Tasa=median(Tasa),.groups="drop")
ns <- as.numeric(table(tasas$grupo_percepcion))
ggplot(delitos,aes(grupo_percepcion,Tasa,color=Tipo)) +
 geom_boxplot(aes(fill=Tipo),alpha=.14,outlier.shape=NA,width=.52,linewidth=.55) +
 geom_point(position=position_jitter(width=.13,height=0,seed=2026),size=1.5,alpha=.4) +
 geom_label(data=med_del,aes(label=fmt(Tasa,1)),fill="white",fontface="bold",size=3.1,label.size=0) +
 facet_wrap(~Tipo) + scale_color_manual(values=c(azul,naranja)) + scale_fill_manual(values=c(azul,naranja)) +
 scale_y_continuous(trans="log1p",breaks=c(0,5,10,25,50,100,250,500),labels=num) +
 scale_x_discrete(labels=c("Q1"="Menor\npercepción","Q2"="Grupo 2","Q3"="Grupo 3","Q4"="Mayor\npercepción")) +
 labs(title="La violencia intrafamiliar sube entre grupos; el hurto de celulares baja",
 subtitle="Las cifras resaltan la mediana de cada grupo. Los puntos muestran la diversidad de las UPZ.",
 x=NULL,y="Denuncias por cada 10.000 residentes",
 caption="Cada grupo tiene 26 UPZ. Cajas: mitad central de los valores. Misma escala comprimida en ambos paneles, log(1 + tasa).\nLa compresión permite ver valores altos sin ocultar los demás. Fuente: archivos del taller.") +
 theme(legend.position="none",panel.grid.major.x=element_blank())
Figura 5. Tasas de denuncias según percepción · 104 UPZ · encuesta 2021 y denuncias de enero a julio de 2023.

Figura 5. Tasas de denuncias según percepción · 104 UPZ · encuesta 2021 y denuncias de enero a julio de 2023.

res_delitos <- tasas %>% group_by(grupo_percepcion) %>% summarise(N=n(),
 Percepcion_min=min(pct_percibe_inseguridad),Percepcion_max=max(pct_percibe_inseguridad),
 Mediana_VIF=median(tasa_violencia_intrafamiliar),Mediana_celulares=median(tasa_hurto_celulares),
 Casos_VIF=sum(casos_violencia_intrafamiliar),Casos_celulares=sum(casos_hurto_celulares),
 Poblacion=sum(poblacion),.groups="drop") %>% mutate(
 Tasa_conjunta_VIF=Casos_VIF/Poblacion*10000,
 Tasa_conjunta_celulares=Casos_celulares/Poblacion*10000)

Entre los grupos de menor y mayor percepción, la mediana de violencia intrafamiliar pasa de 9,5 a 24,0 denuncias por cada 10.000 residentes. En hurto de celulares pasa de 52,7 a 19,4. Las correlaciones por UPZ coinciden en esa diferencia de dirección: 0,68 para violencia intrafamiliar y -0,43 para hurto de celulares.

La percepción de inseguridad no acompaña de la misma manera todos los tipos de denuncia. Un solo indicador de delitos ocultaría ese contraste.

Hay varias explicaciones posibles, pero la base no permite elegir una. Los hurtos pueden ocurrir en lugares visitados por personas que viven en otra zona; la disposición a denunciar también puede variar. Además, la percepción es de 2021 y las denuncias de 2023: no estamos observando respuestas y hechos del mismo período. El gráfico no demuestra que un delito produzca más temor que otro ni que las zonas con pocas denuncias sean más seguras.

06. Las UPZ con mayor percepción

¿Dónde están las UPZ con mayor percepción de inseguridad y qué tan parecidas son sus condiciones residenciales y de entorno?

El mapa conserva las 112 UPZ. El color representa el porcentaje que reporta inseguridad cerca de la vivienda. Permite localizar los contrastes, pero no mide la probabilidad de ser víctima de un delito. Las dos vistas adicionales muestran arriendo y tiempo a un parque para comparar aspectos del mismo territorio.

mapa <- shp %>% select(upz_cod) %>% left_join(u,by="upz_cod")
map_colors <- c("#F2EAF5","#CAB6D7","#9B70AF","#705087",morado)
mp <- st_simplify(st_transform(mapa,3116),dTolerance=8,preserveTopology=TRUE)
lp <- st_simplify(st_transform(loc,3116),dTolerance=8,preserveTopology=TRUE)
bb <- st_bbox(mp); w <- 640; h <- 650; pad <- 28
escala <- min((w-2*pad)/(bb['xmax']-bb['xmin']),(h-2*pad)/(bb['ymax']-bb['ymin']))
ox <- (w-(bb['xmax']-bb['xmin'])*escala)/2
oy <- (h-(bb['ymax']-bb['ymin'])*escala)/2
path_svg <- function(g) {
 if(inherits(g,"POLYGON")) g <- list(g)
 paste(vapply(g,function(pol) paste(vapply(pol,function(ring) {
  x <- ox+(ring[,1]-bb['xmin'])*escala
  y <- h-oy-(ring[,2]-bb['ymin'])*escala
  paste0("M",paste(paste(round(x,2),round(y,2),sep=","),collapse=" L")," Z")
 },character(1)),collapse=" "),character(1)),collapse=" ")
}
paths <- vapply(st_geometry(mp),path_svg,character(1))
locpaths <- vapply(st_geometry(lp),path_svg,character(1))
col_fun <- grDevices::colorRampPalette(map_colors)(101)
poligonos <- vapply(seq_len(nrow(mp)),function(i) paste0(
 '<path class="upz-path" data-code="',mp$upz_cod[i],'" d="',paths[i],
 '" fill="',col_fun[round(mp$pct_percibe_inseguridad[i])+1],'" fill-rule="evenodd">',
 '<title>',htmltools::htmlEscape(paste0(mp$upz_nombre[i]," · ",mp$localidad[i],
 " | Percepción: ",fmt(mp$pct_percibe_inseguridad[i],1)," %")), '</title></path>'),character(1))
limites <- paste0('<path class="loc-path" d="',locpaths,'"/>',collapse="")
opciones <- u %>% arrange(upz_nombre) %>% transmute(op=paste0('<option value="',upz_cod,'">',htmltools::htmlEscape(upz_nombre),'</option>'))
datos_mapa <- u %>% select(upz_cod,upz_nombre,localidad,poblacion,pct_percibe_inseguridad,pct_arriendo,
 pct_cerca_basureros,pct_cerca_ollas,min_parque,min_cultura,em_agrupada)
cat('```{=html}\n<div class="map-card" id="mapa-upz">',
 '<p class="eyebrow">BOGOTÁ · 112 UPZ</p>',
 '<h3>Un territorio, distintas condiciones</h3>',
 '<p class="map-caption">Encuesta Multipropósito 2021. Los límites oscuros corresponden a localidades.</p>',
 '<div class="map-toolbar"><div><label for="map-variable">Ver en el mapa</label>',
 '<select id="map-variable"><option value="pct_percibe_inseguridad">Percepción de inseguridad</option>',
 '<option value="pct_arriendo">Hogares en arriendo</option><option value="min_parque">Tiempo a un parque</option></select></div>',
 '<div><label for="map-upz">Consultar una UPZ</label><select id="map-upz">',paste(opciones$op,collapse=""),'</select></div></div>',
 '<div class="map-body"><div><svg class="map-svg" viewBox="0 0 640 650" role="img" aria-label="Mapa de las 112 UPZ de Bogotá. Seleccione una zona para consultar sus cifras.">',
 paste(poligonos,collapse=""),limites,
 '<g transform="translate(592 44)" fill="#351A4F"><text x="0" y="-11" text-anchor="middle" font-size="15" font-family="Arial">N</text><path d="M0,0 L-7,22 L0,17 L7,22 Z"/></g>',
 '<g transform="translate(35 610)" stroke="#351A4F" stroke-width="2"><path d="M0,-4 V4 M0,0 H',round(5000*escala,2),' M',round(5000*escala,2),',-4 V4"/></g>',
 '<text x="35" y="631" fill="#351A4F" font-size="12" font-family="Arial">5 km</text></svg></div>',
 '<div><div class="map-detail" aria-live="polite" aria-atomic="true">',
 '<div class="eyebrow">UPZ SELECCIONADA</div><h4 id="map-name"></h4><div class="place" id="map-place"></div>',
 '<div class="big-value" id="map-value"></div><div class="map-caption" id="map-unit"></div>',
 '<dl><dt>Hogares en arriendo</dt><dd id="map-rent"></dd><dt>Basureros cercanos</dt><dd id="map-waste"></dd>',
 '<dt>Expendios cercanos</dt><dd id="map-drug"></dd><dt>Tiempo a parque</dt><dd id="map-park"></dd>',
 '<dt>Tiempo a cultura</dt><dd id="map-culture"></dd><dt>Residentes · 2023</dt><dd id="map-pop"></dd></dl>',
 '<p class="shared-note" id="map-shared"></p></div>',
 '<div class="legend-bar"></div><div class="legend-labels"><span id="legend-low">0 %</span><span id="legend-mid">50 %</span><span id="legend-high">100 %</span></div>',
 '<p class="map-instructions">Toque una zona o elija su nombre en la lista. Los colores mantienen una misma escala dentro de cada vista; las vistas tienen unidades diferentes.</p>',
 '</div></div><p class="map-caption">Figura 6. Fuente: archivos del taller. Basureros y expendios son reportes de viviendas afectadas, no conteos de lugares. Norte arriba.</p>',
 '<noscript>Para consultar una UPZ use un navegador con JavaScript. El mapa estático aparece a continuación.</noscript></div>',
 '<script id="map-data" type="application/json">',jsonlite::toJSON(datos_mapa,dataframe="rows",auto_unbox=TRUE,digits=8),'</script>\n```\n')

BOGOTÁ · 112 UPZ

Un territorio, distintas condiciones

Encuesta Multipropósito 2021. Los límites oscuros corresponden a localidades.

Corabastos · Kennedy | Percepción: 92,1 %San Cristobal Norte · Usaquén | Percepción: 49,8 %Alfonso Lopez · Usme | Percepción: 70,3 %La Floresta · Suba | Percepción: 43,2 %Jerusalem · Ciudad Bolívar | Percepción: 83,2 %Castilla · Kennedy | Percepción: 52,8 %Minuto De Dios · Engativá | Percepción: 62,7 %Bosa Central · Bosa | Percepción: 89,7 %La Gloria · San Cristóbal | Percepción: 86,0 %Doce De Octubre · Barrios Unidos | Percepción: 66,0 %Zona Industrial · Puente Aranda | Percepción: 66,3 %Timiza · Kennedy | Percepción: 66,2 %Lourdes · Santa Fe | Percepción: 81,2 %Fontibon · Fontibón | Percepción: 44,5 %Los Libertadores · San Cristóbal | Percepción: 55,0 %San Francisco · Ciudad Bolívar | Percepción: 70,0 %La Sabana · Los Mártires | Percepción: 83,5 %Diana Turbay · Rafael Uribe Uribe | Percepción: 79,6 %Las Ferias · Engativá | Percepción: 72,9 %Bavaria · Kennedy | Percepción: 52,8 %Usaquen · Usaquén | Percepción: 24,4 %Lucero · Ciudad Bolívar | Percepción: 77,2 %Gran Yomasa · Usme | Percepción: 82,7 %Tibabuyes · Suba | Percepción: 73,0 %Boyaca Real · Engativá | Percepción: 74,1 %Kennedy Central · Kennedy | Percepción: 66,0 %Garces Navas · Engativá | Percepción: 70,2 %Chapinero · Chapinero | Percepción: 50,3 %La Flora · Usme | Percepción: 77,0 %La Uribe · Usaquén | Percepción: 36,2 %Verbenal · Usaquén | Percepción: 65,4 %Ismael Perdomo · Ciudad Bolívar | Percepción: 70,9 %El Prado · Suba | Percepción: 48,8 %Venecia · Tunjuelito | Percepción: 81,1 %20 De Julio · San Cristóbal | Percepción: 82,6 %Restrepo · Antonio Nariño | Percepción: 73,3 %Comuneros · Usme | Percepción: 81,4 %Zona Franca · Fontibón | Percepción: 44,9 %Ciudad Jardin · Antonio Nariño | Percepción: 62,2 %San Jose · Rafael Uribe Uribe | Percepción: 65,4 %Americas · Kennedy | Percepción: 63,3 %San Blas · San Cristóbal | Percepción: 74,3 %Tunjuelito · Tunjuelito | Percepción: 91,8 %Patio Bonito · Kennedy | Percepción: 86,1 %Ciudad Montes · Puente Aranda | Percepción: 68,0 %El Rincon · Suba | Percepción: 78,6 %Los Alcazares · Barrios Unidos | Percepción: 69,8 %Ciudad Usme · Usme | Percepción: 70,3 %Santa Isabel · Los Mártires | Percepción: 70,0 %La Academia · Suba | Percepción: 40,9 %Tintal Norte · Kennedy | Percepción: 54,0 %Las Margaritas · Kennedy | Percepción: 72,1 %Teusaquillo · Teusaquillo | Percepción: 62,9 %Pardo Rubio · Chapinero | Percepción: 50,3 %Santa Barbara · Usaquén | Percepción: 40,7 %Modelia · Fontibón | Percepción: 49,1 %Parque Salitre · Barrios Unidos | Percepción: 66,0 %Las Nieves · Santa Fe | Percepción: 59,9 %Paseo De Los Libertadores · Usaquén | Percepción: 36,2 %Jardin Botanico · Engativá | Percepción: 76,5 %San Jose De Bavaria · Suba | Percepción: 40,9 %Calandaima · Kennedy | Percepción: 58,8 %Danubio · Usme | Percepción: 58,3 %Britalia · Suba | Percepción: 38,2 %Sagrado Corazon · Santa Fe | Percepción: 59,9 %Fontibon San Pablo · Fontibón | Percepción: 69,9 %Guaymaral · Suba | Percepción: 40,9 %Tintal Sur · Bosa | Percepción: 74,4 %Santa Cecilia · Engativá | Percepción: 76,5 %Aeropuerto El Dorado · Fontibón | Percepción: 32,6 %La Macarena · Santa Fe | Percepción: 44,8 %Sosiego · San Cristóbal | Percepción: 70,3 %Muzu · Puente Aranda | Percepción: 79,1 %El Refugio · Chapinero | Percepción: 21,5 %Parque Simon Bolivar - Can · Teusaquillo | Percepción: 33,0 %Apogeo · Bosa | Percepción: 69,4 %Las Cruces · Santa Fe | Percepción: 86,0 %Parque Entrenubes · Usme | Percepción: 58,3 %Galerias · Teusaquillo | Percepción: 48,5 %Los Cedros · Usaquén | Percepción: 41,5 %Toberin · Usaquén | Percepción: 60,4 %San Rafael · Puente Aranda | Percepción: 70,6 %Alamos · Engativá | Percepción: 76,9 %Ciudad Salitre Oriental · Teusaquillo | Percepción: 20,4 %Suba · Suba | Percepción: 44,4 %Bolivia · Engativá | Percepción: 19,4 %Niza · Suba | Percepción: 39,0 %Ciudad Salitre Occidental · Fontibón | Percepción: 26,7 %El Tesoro · Ciudad Bolívar | Percepción: 86,8 %Granjas De Techo · Fontibón | Percepción: 40,6 %Monte Blanco · Ciudad Bolívar | Percepción: 86,8 %Gran Britalia · Kennedy | Percepción: 70,7 %La Esmeralda · Teusaquillo | Percepción: 33,0 %Puente Aranda · Puente Aranda | Percepción: 66,3 %El Mochuelo · Ciudad Bolívar | Percepción: 86,8 %La Candelaria · Candelaria | Percepción: 64,7 %La Alhambra · Suba | Percepción: 34,2 %San Isidro - Patios · Chapinero | Percepción: 54,3 %Arborizadora · Ciudad Bolívar | Percepción: 63,4 %Capellania · Fontibón | Percepción: 32,6 %Los Andes · Barrios Unidos | Percepción: 37,4 %Quinta Paredes · Teusaquillo | Percepción: 34,6 %Marruecos · Rafael Uribe Uribe | Percepción: 76,7 %Carvajal · Kennedy | Percepción: 82,9 %Marco Fidel Suarez · Rafael Uribe Uribe | Percepción: 73,4 %Country Club · Usaquén | Percepción: 40,7 %Engativa · Engativá | Percepción: 74,6 %Casa Blanca Suba · Suba | Percepción: 17,4 %Chico Lago · Chapinero | Percepción: 21,5 %El Porvenir · Bosa | Percepción: 74,0 %Quiroga · Rafael Uribe Uribe | Percepción: 70,9 %Bosa Occidental · Bosa | Percepción: 74,3 % N 5 km
UPZ SELECCIONADA

Hogares en arriendo
Basureros cercanos
Expendios cercanos
Tiempo a parque
Tiempo a cultura
Residentes · 2023

0 %50 %100 %

Toque una zona o elija su nombre en la lista. Los colores mantienen una misma escala dentro de cada vista; las vistas tienen unidades diferentes.

Figura 6. Fuente: archivos del taller. Basureros y expendios son reportes de viviendas afectadas, no conteos de lugares. Norte arriba.

centros <- st_sf(localidad=loc$localidad,
 geometry=st_point_on_surface(st_geometry(st_transform(loc,3116)))) %>% st_transform(st_crs(mapa))
centros <- centros %>% filter(grepl("USAQU|CHAPINERO|SUBA|KENNEDY|USME|CIUDAD BOL|SANTA FE",toupper(iconv(localidad,to="ASCII//TRANSLIT"))))
ggplot(st_transform(mapa,3116)) +
 geom_sf(aes(fill=pct_percibe_inseguridad),color="white",linewidth=.12) +
 geom_sf(data=st_transform(loc,3116),fill=NA,color="#786A82",linewidth=.3) +
 geom_sf_label(data=st_transform(centros,3116),aes(label=localidad),inherit.aes=FALSE,
 size=2.6,color=azul,label.size=0,fill="#FFFFFFCC",fun.geometry=identity) +
 scale_fill_gradientn(colors=map_colors,limits=c(0,100),name="Percepción (%)") +
 coord_sf(datum=NA) + labs(title="La percepción cambia entre UPZ, incluso dentro de una localidad",
 subtitle="Una misma escala de 0 a 100 % para las 112 UPZ.",
 caption="Líneas oscuras: localidades. Norte arriba. En 32 UPZ, el dato de encuesta es compartido con otras zonas.\nFuente: Encuesta Multipropósito 2021 y geometrías entregadas en el taller.") +
 theme_void(base_size=12) + tema_titulos + theme(legend.position="right")
Figura 6. Percepción de inseguridad por UPZ · Encuesta Multipropósito 2021.

Figura 6. Percepción de inseguridad por UPZ · Encuesta Multipropósito 2021.

ranking <- u %>% slice_max(pct_percibe_inseguridad,n=10,with_ties=TRUE) %>%
 arrange(desc(pct_percibe_inseguridad),upz_nombre) %>% mutate(Puesto=min_rank(desc(pct_percibe_inseguridad)))
rank_tab <- ranking %>% transmute(
 Puesto=paste0('<span class="rank-pill">',Puesto,'</span>'),
 UPZ=paste0('<strong>',htmltools::htmlEscape(upz_nombre),ifelse(em_agrupada,' *',''),'</strong><small>',htmltools::htmlEscape(localidad),'</small>'),
 `Percepción`=paste0('<span class="rank-value">',fmt(pct_percibe_inseguridad,2),' %</span><span class="data-bar"><i style="width:',pct_percibe_inseguridad,'%;"></i></span>'),
 `Arriendo`=paste0(fmt(pct_arriendo,1),' %'),
 `Basureros`=paste0(fmt(pct_cerca_basureros,1),' %'),
 `Expendios`=paste0(fmt(pct_cerca_ollas,1),' %'),
 `A parque`=paste0(fmt(min_parque,1),' min'))
tabla(rank_tab,"Tabla 2. Diez UPZ con mayor percepción de inseguridad · 2021",escape=FALSE,clase="ranking")
Tabla 2. Diez UPZ con mayor percepción de inseguridad · 2021
Puesto UPZ Percepción Arriendo Basureros Expendios A parque
1 CorabastosKennedy 92,11 % 72,1 % 38,6 % 61,0 % 10,7 min
2 TunjuelitoTunjuelito 91,82 % 72,0 % 8,9 % 32,6 % 17,9 min
3 Bosa CentralBosa 89,69 % 51,6 % 4,4 % 22,6 % 7,2 min
4 El Mochuelo *Ciudad Bolívar 86,83 % 57,6 % 23,1 % 52,3 % 14,0 min
4 El Tesoro *Ciudad Bolívar 86,83 % 57,6 % 23,1 % 52,3 % 14,0 min
4 Monte Blanco *Ciudad Bolívar 86,83 % 57,6 % 23,1 % 52,3 % 14,0 min
7 Patio BonitoKennedy 86,07 % 71,2 % 13,1 % 41,2 % 9,3 min
8 La GloriaSan Cristóbal 86,04 % 54,6 % 15,2 % 23,1 % 14,4 min
9 Las CrucesSanta Fe 85,97 % 66,0 % 19,9 % 75,6 % 8,9 min
10 La SabanaLos Mártires 83,45 % 71,4 % 32,6 % 61,4 % 11,2 min

  • Resultado de encuesta compartido con otras UPZ. Los empates conservan el mismo puesto; si hubiera un empate en el corte del décimo lugar, se incluirían todas las UPZ empatadas. Basureros y expendios: viviendas afectadas por su cercanía.

Corabastos (92,1 %) y Tunjuelito (91,8 %) encabezan el ranking, pero no tienen el mismo entorno reportado. La proporción afectada por basureros es de 38,6 % en Corabastos y 8,9 % en Tunjuelito. En cambio, el tiempo a un parque es mayor en Tunjuelito: 17,9 frente a 10,7 minutos.

Bosa Central añade otro contraste: tiene una percepción de 89,7 %, con 4,4 % de viviendas afectadas por basureros y un tiempo promedio a parque de 7,2 minutos. Además, El Mochuelo, Monte Blanco y El Tesoro comparten las mismas cifras de encuesta: sus tres posiciones no deben leerse como tres confirmaciones separadas.

Una percepción parecida puede coexistir con condiciones distintas. El ranking ayuda a elegir territorios para examinar con más detalle; no establece cuáles son los más peligrosos ni decide dónde debe hacerse una intervención.

Qué se mantiene al revisar los resultados

Una relación puede parecer fuerte por unos pocos valores extremos o porque varias UPZ repiten un dato de encuesta. Revisamos ambos problemas. Para las asociaciones comparamos Pearson, que resume cuánto se ajustan los datos a una relación en línea recta, y Spearman, que compara su orden. También repetimos los cálculos con las 80 UPZ que tienen resultados propios de encuesta y cambiamos el corte de población cuando intervienen tasas.

Las asociaciones de arriendo, basureros, expendios y tiempo a parques mantienen el mismo sentido al retirar los datos compartidos. La relación con tiempo a espacios culturales, en cambio, baja de 0,21 a 0,10: queda poco vínculo entre el orden de las UPZ en esas dos variables. Las relaciones con las dos tasas de denuncias conservan sus direcciones al probar todos los cortes de población incluidos en el anexo.

Estas revisiones dan más contexto al resultado, pero no eliminan todos los problemas de medición. Al pasar de 112 a 80 UPZ también cambia la parte de la ciudad que estamos comparando. No contamos con el detalle de cómo se seleccionaron las personas encuestadas para calcular márgenes de error adecuados.

Lo que encontramos

La lectura conjunta deja una idea central: las condiciones de vivienda, los problemas del entorno y las denuncias muestran aspectos diferentes de la inseguridad. Las UPZ más densas tienen menos viviendas desocupadas, pero la densidad no describe por sí sola la ocupación de cada vivienda. El arriendo se relaciona con la percepción, aunque los contrastes entre UPZ impiden convertirlo en una explicación única.

Los reportes de basureros y expendios cercanos aumentan en los grupos de mayor percepción. El acceso a servicios añade un matiz: caminar a un espacio cultural tarda más que caminar a un parque, pero esa mayor distancia no viene acompañada de una asociación más fuerte con inseguridad. Tampoco las denuncias siguen una sola dirección: violencia intrafamiliar y hurto de celulares muestran patrones distintos.

Al volver al mapa y al ranking, esas diferencias aparecen en casos concretos. Corabastos, Tunjuelito y Bosa Central tienen percepciones altas, pero difieren en los problemas del entorno y en el tiempo a parques. Compartir un resultado alto no significa compartir las mismas condiciones ni requerir la misma respuesta.

Estos datos permiten reconocer contrastes y formular explicaciones que merecen investigarse. No permiten decidir qué condición causa inseguridad ni qué intervención la reduciría. La aportación del análisis es mostrar dónde coinciden las señales, dónde se separan y qué información falta para interpretar esas diferencias.

Hasta dónde llegan estas conclusiones

  • Se comparan lugares, no personas. Una relación entre UPZ no describe necesariamente lo que ocurre dentro de los hogares ni cómo se comportan sus residentes.
  • Las fuentes tienen fechas distintas. La encuesta es de 2021; las denuncias cubren siete meses de 2023. No medimos cambios en el tiempo ni podemos establecer qué ocurrió primero.
  • Lo denunciado es solo una parte de lo ocurrido. El registro depende de que los hechos se denuncien; además, los delitos sexuales no están disponibles en esta base.
  • Las tasas usan población residente. Visitantes, trabajadores y actividad comercial pueden cambiar cuántas personas están expuestas en una zona. Excluir poblaciones muy pequeñas no resuelve ese problema.
  • La encuesta no es una medición exacta de cada UPZ. Sus resultados se estiman a partir de una muestra y, en 32 UPZ, son compartidos. No tenemos la información para precisar su margen de error.
  • Las comparaciones no aíslan causas. Ingreso, características urbanas u otros factores pueden relacionarse con varias variables a la vez. Tampoco la cercanía de colores similares en el mapa demuestra por sí sola un patrón espacial estadístico.

Anexo de datos y cálculos

A. Variables elegidas y significado
tabla(ficha %>% select(Columna=variable,Indicador=nombre,Bloque=bloque,Unidad=unidad),
 "Tabla A1. Correspondencia entre los indicadores del informe y las columnas originales")
Tabla A1. Correspondencia entre los indicadores del informe y las columnas originales
Columna Indicador Bloque Unidad
poblacion Población Demografía Habitantes · 2023
densidad_hab_km2 Densidad de población Demografía Hab/km² · 2023
personas_por_vivienda Personas por vivienda Vivienda Personas/vivienda ocupada · 2023
pct_viviendas_desocupadas Viviendas desocupadas Vivienda % de viviendas · 2023
pct_arriendo Hogares en arriendo Encuesta % de hogares · 2021
pct_percibe_inseguridad Percepción de inseguridad Encuesta % reporta inseguridad · 2021
pct_cerca_basureros Basureros cercanos Encuesta % viviendas afectadas · 2021
pct_cerca_ollas Expendios de droga cercanos Encuesta % viviendas afectadas · 2021
min_parque Acceso a parque Encuesta Minutos caminando · 2021
min_cultura Acceso a espacio cultural Encuesta Minutos caminando · 2021
casos_violencia_intrafamiliar Denuncias de violencia intrafamiliar Delitos Casos registrados · ene–jul 2023
casos_hurto_celulares Denuncias de hurto de celulares Delitos Casos registrados · ene–jul 2023
tasa_violencia_intrafamiliar Tasa de violencia intrafamiliar Delitos Denuncias/10.000 hab · ene–jul 2023
tasa_hurto_celulares Tasa de hurto de celulares Delitos Denuncias/10.000 hab · ene–jul 2023

Las tasas se verificaron con la fórmula denuncias / población × 10.000. La diferencia respecto a la tasa entregada es menor de 0,011, compatible con el redondeo a dos decimales. Las variables de encuesta son porcentajes o promedios estimados; no son registros individuales.

B. Estructura, faltantes y rangos de las 67 variables
estructura <- data.frame(Variable=names(u)[1:67],
 Tipo=vapply(u[1:67],function(z)class(z)[1],character(1)),
 Faltantes=vapply(u[1:67],function(z)sum(is.na(z)),integer(1)),
 Distintos=vapply(u[1:67],function(z)length(unique(z)),integer(1)),
 Minimo=vapply(u[1:67],function(z)if(is.numeric(z))fmt(min(z)) else "—",character(1)),
 Maximo=vapply(u[1:67],function(z)if(is.numeric(z))fmt(max(z)) else "—",character(1)))
tabla(estructura,"Tabla A2. Tipos, valores distintos, faltantes y rango de las columnas originales")
Tabla A2. Tipos, valores distintos, faltantes y rango de las columnas originales
Variable Tipo Faltantes Distintos Minimo Maximo
upz_cod character 0 112 — —
upz_nombre character 0 112 — —
localidad_cod numeric 0 19 1,00 19,00
localidad character 0 19 — —
area_km2 numeric 0 98 0,86 9,29
poblacion numeric 0 112 30,00 305.907,00
densidad_hab_km2 numeric 0 112 9,44 46.156,87
pct_mujeres numeric 0 104 20,21 59,12
pct_0_14 numeric 0 111 7,38 31,05
pct_15_29 numeric 0 107 14,82 51,87
pct_60_mas numeric 0 109 7,53 29,94
viviendas_totales numeric 0 112 7,00 107.144,00
viviendas_ocupadas numeric 0 112 7,00 103.161,00
pct_viviendas_desocupadas numeric 0 109 0,00 43,88
personas_por_vivienda numeric 0 80 1,70 5,80
luminarias numeric 0 112 77,00 9.173,00
luminarias_km2 numeric 0 112 18,31 1.751,44
luminarias_1000hab numeric 0 112 14,11 4.366,67
pct_luminarias_led numeric 0 110 0,00 95,77
casos_homicidios numeric 0 22 0,00 47,00
casos_lesiones numeric 0 82 1,00 317,00
casos_hurto_personas numeric 0 107 5,00 3.311,00
casos_hurto_residencias numeric 0 64 0,00 193,00
casos_hurto_automotor numeric 0 47 0,00 74,00
casos_hurto_bicicletas numeric 0 67 0,00 171,00
casos_hurto_comercio numeric 0 72 1,00 217,00
casos_hurto_celulares numeric 0 99 1,00 1.266,00
casos_hurto_motos numeric 0 54 0,00 93,00
casos_violencia_intrafamiliar numeric 0 94 0,00 818,00
casos_total numeric 0 110 16,00 5.441,00
tasa_homicidios numeric 0 73 0,00 6,93
tasa_lesiones numeric 0 109 3,71 333,33
tasa_hurto_personas numeric 0 112 15,70 6.333,33
tasa_hurto_residencias numeric 0 106 0,00 26,31
tasa_hurto_automotor numeric 0 99 0,00 333,33
tasa_hurto_bicicletas numeric 0 108 0,00 333,33
tasa_hurto_comercio numeric 0 107 0,94 1.333,33
tasa_hurto_celulares numeric 0 108 7,29 2.666,67
tasa_hurto_motos numeric 0 97 0,00 79,28
tasa_violencia_intrafamiliar numeric 0 104 0,00 232,06
tasa_total numeric 0 112 64,47 11.333,33
em_agrupada logical 0 2 — —
pct_pobreza numeric 0 88 0,07 16,56
edad_promedio numeric 0 94 29,95 44,40
salario_promedio numeric 0 95 845.688,39 7.977.532,49
pct_estrato_1_2 numeric 0 83 0,00 100,00
pct_estrato_3_4 numeric 0 88 0,00 100,00
pct_estrato_5_6 numeric 0 26 0,00 98,94
pct_vivienda_propia numeric 0 94 16,01 66,50
pct_arriendo numeric 0 94 27,66 72,07
anios_educacion_15mas numeric 0 85 7,98 15,91
pct_padre_universitario numeric 0 91 0,34 42,72
pct_madre_universitaria numeric 0 89 0,17 33,60
pct_percibe_inseguridad numeric 0 95 17,45 92,11
pct_cerca_ollas numeric 0 89 0,31 75,60
pct_cerca_bares numeric 0 87 0,64 53,91
pct_cerca_lotes_oscuros numeric 0 89 0,64 59,76
pct_cerca_basureros numeric 0 88 0,24 45,01
pct_cerca_terminales numeric 0 89 0,18 85,32
pct_cerca_fabricas numeric 0 90 0,31 97,17
min_transmilenio numeric 0 93 6,32 65,59
min_sitp numeric 0 85 4,71 15,85
min_parque numeric 0 89 4,21 20,04
min_cai_policia numeric 0 90 10,06 35,11
min_centro_medico numeric 0 94 15,65 49,59
min_cultura numeric 0 94 13,32 60,66
min_ciclorruta numeric 0 92 5,78 55,39

Los códigos de territorio se usan para identificar y unir registros, aunque algunos estén almacenados como números. La marca em_agrupada es lógica: indica si la encuesta asignó a esa UPZ el resultado de un grupo de zonas.

C. Distribución de las 14 variables seleccionadas
rotulos <- setNames(paste(ficha$nombre,ficha$unidad,sep="\n"),ficha$variable)
long <- u %>% select(all_of(variables)) %>% pivot_longer(everything(),names_to="Variable",values_to="Valor")
ggplot(long,aes(Valor)) + geom_histogram(bins=18,fill=azul,color="white") +
 facet_wrap(~Variable,scales="free",ncol=3,labeller=as_labeller(rotulos)) +
 scale_x_continuous(labels=scales::label_number(scale_cut=scales::cut_short_scale(),decimal.mark=",")) +
 labs(title="Los conteos y las tasas concentran valores extremos",
 subtitle="Cada panel conserva sus unidades y su propia escala. Las barras cuentan UPZ.",
 x="Valor del indicador",y="Número de UPZ",caption="Fuente: archivos del taller. Compare la forma de cada distribución; las escalas difieren entre paneles.") +
 theme(strip.text=element_text(size=8),axis.text.x=element_text(size=8),panel.grid.major.x=element_blank())
Figura A1. Distribuciones de las 14 variables · 112 UPZ.

Figura A1. Distribuciones de las 14 variables · 112 UPZ.

En las variables de denuncia, unos pocos valores altos separan la media de la mediana. En los porcentajes y tiempos también hay diferencias de dispersión: no sería adecuado resumir todas las variables con una sola medida ni usar una misma escala para las unidades originales.

D. Poblaciones pequeñas y sus tasas
tabla(bajas %>% arrange(poblacion) %>% select(UPZ=upz_nombre,Poblacion=poblacion,
 Casos_VIF=casos_violencia_intrafamiliar,Tasa_VIF=tasa_violencia_intrafamiliar,
 Casos_celulares=casos_hurto_celulares,Tasa_celulares=tasa_hurto_celulares),
 "Tabla A3. Ocho UPZ con menos de 5.000 residentes · tasas por cada 10.000 habitantes")
Tabla A3. Ocho UPZ con menos de 5.000 residentes · tasas por cada 10.000 habitantes
UPZ Población Denuncias VIF Tasa VIF Denuncias celulares Tasa celulares
El Mochuelo 30 0 0,00 8 2.666,67
Aeropuerto El Dorado 883 1 11,33 88 996,60
Parque Entrenubes 1.169 2 17,11 1 8,55
Parque Salitre 1.442 4 27,74 50 346,74
Paseo De Los Libertadores 2.690 0 0,00 17 63,20
Guaymaral 2.692 2 7,43 9 33,43
Jardin Botanico 2.900 9 31,03 59 203,45
Parque Simon Bolivar - Can 3.323 27 81,25 240 722,24

VIF significa violencia intrafamiliar. Una tasa alta puede resultar de pocas denuncias divididas por muy pocos residentes. Un cero en denuncias, por su parte, no demuestra ausencia de hechos.

ggplot(u,aes(poblacion)) + geom_histogram(bins=24,fill=azul,color="white") +
 geom_vline(xintercept=5000,color=naranja,linetype=2,linewidth=.8) +
 scale_x_continuous(trans="log10",breaks=c(30,100,1000,5000,20000,100000,500000),labels=num) +
 labs(title="Ocho UPZ tienen menos de 5.000 residentes",
 subtitle="La línea marca el corte usado en las comparaciones principales de tasas.",
 x="Población residente · escala logarítmica",y="Número de UPZ",
 caption="La escala horizontal comprime las diferencias grandes para mostrar todo el rango. Fuente: proyecciones DANE 2023, archivos del taller.")
Figura A2. Población por UPZ · proyecciones 2023.

Figura A2. Población por UPZ · proyecciones 2023.

E. Grupos utilizados en los gráficos

Los grupos se forman con cuartiles: se ordenan los valores y se dividen en cuatro intervalos. No son clasificaciones oficiales de densidad ni de inseguridad. Se conservan juntos los empates. En la pregunta 3 se usan 112 UPZ; en la pregunta 5, 104.

tabla(data.frame(Grupo=c("Q1 · menor densidad","Q2","Q3","Q4 · mayor densidad"),
 Desde=as.numeric(lim_d[1:4]),Hasta=as.numeric(lim_d[2:5]),N=as.numeric(table(u$grupo_densidad))),
 "Tabla A4. Cortes de densidad · habitantes/km²; límite inferior exclusivo salvo Q1")
Tabla A4. Cortes de densidad · habitantes/km²; límite inferior exclusivo salvo Q1
Grupo Desde Hasta N
Q1 · menor densidad 9,44 11.160,41 28
Q2 11.160,41 20.180,22 28
Q3 20.180,22 25.826,54 28
Q4 · mayor densidad 25.826,54 46.156,87 28
tabla(u %>% group_by(grupo_percepcion) %>% summarise(N=n(),
 Minimo=min(pct_percibe_inseguridad),Maximo=max(pct_percibe_inseguridad),.groups="drop"),
 "Tabla A5. Percepción mínima y máxima observadas en los grupos de la pregunta 3 · 112 UPZ")
Tabla A5. Percepción mínima y máxima observadas en los grupos de la pregunta 3 · 112 UPZ
grupo percepcion N Minimo Maximo
Q1 28 17,45 44,54
Q2 28 44,82 65,96
Q3 28 65,97 74,30
Q4 28 74,43 92,11
tabla(res_delitos %>% select(Grupo=grupo_percepcion,N,Percepcion_min,Percepcion_max,Mediana_VIF,Mediana_celulares),
 "Tabla A6. Grupos de la pregunta 5 · 104 UPZ; tasas por cada 10.000 residentes")
Tabla A6. Grupos de la pregunta 5 · 104 UPZ; tasas por cada 10.000 residentes
Grupo N Percepción mínima (%) Percepción máxima (%) Mediana tasa VIF Mediana tasa celulares
Q1 26 17,45 44,89 9,46 52,69
Q2 26 48,52 65,97 16,36 38,97
Q3 26 66,20 74,30 21,26 30,46
Q4 26 74,43 92,11 24,05 19,38
F. Correlaciones y comparación de métodos

Spearman compara el orden de las UPZ. Pearson resume la relación lineal entre los valores originales y puede cambiar más ante observaciones extremas. Ninguno indica por sí solo que una variable cause otra. La columna de 80 UPZ repite Spearman usando únicamente resultados propios de encuesta; para las relaciones sin encuesta sirve como comparación territorial.

revision <- principal %>% select(relacion,N,Pearson,Spearman) %>% left_join(
 calcular(individuales) %>% select(relacion,Spearman_80=Spearman),by="relacion")
tabla(revision %>% rename(Relacion=relacion),
 "Tabla A7. Coeficientes por relación y muestra · N indica la muestra principal",3)
Tabla A7. Coeficientes por relación y muestra · N indica la muestra principal
Relacion N Pearson Spearman Spearman · 80 UPZ
Densidad / personas por vivienda 112 0,068 0,279 0,431
Densidad / viviendas desocupadas 112 -0,415 -0,493 -0,580
Arriendo / percepción 112 0,710 0,653 0,628
Basureros / percepción 112 0,481 0,609 0,607
Expendios / percepción 112 0,641 0,668 0,676
Parque / percepción 112 0,521 0,581 0,549
Cultura / percepción 112 0,219 0,215 0,099
VIF / percepción 104 0,223 0,679 0,681
Celulares / percepción 104 -0,145 -0,427 -0,360
cm <- cor(tasas[variables],method="spearman")
mt <- as.data.frame(as.table(cm));names(mt)<-c("x","y","r")
abreves <- c("Población","Densidad","Personas/vivienda","% desocupadas","% arriendo",
 "% percepción","% basureros","% expendios","Min parque","Min cultura","Casos VIF",
 "Casos celulares","Tasa VIF","Tasa celulares")
mt <- mt[as.integer(mt$x)>as.integer(mt$y),]
mt$x <- factor(mt$x,levels=variables,labels=abreves)
mt$y <- factor(mt$y,levels=rev(variables),labels=rev(abreves))
ggplot(mt,aes(x,y,fill=r)) + geom_tile(color="white",linewidth=.5) +
 geom_text(aes(label=fmt(r,1),color=abs(r)>.65),size=2.5) +
 scale_color_manual(values=c("FALSE"="#351A4F","TRUE"="white"),guide="none") +
 scale_fill_gradient2(low=naranja,mid="#FBF9FC",high=azul,limits=c(-1,1),name="Spearman",breaks=c(-1,-.5,0,.5,1)) +
 coord_equal() + labs(title="Las asociaciones cambian según el indicador",
 subtitle="Se muestra cada par una sola vez. Positivo: orden semejante; negativo: orden opuesto.",
 x=NULL,y=NULL,caption="VIF: violencia intrafamiliar. Los conteos y sus tasas comparten información; no son evidencias separadas.\nFuente: archivos del taller. Las correlaciones no representan efectos causales.") +
 theme(axis.text.x=element_text(angle=50,hjust=1,size=9),axis.text.y=element_text(size=9),panel.grid=element_blank())
Figura A3. Correlaciones de Spearman de las 14 variables · 104 UPZ con al menos 5.000 residentes.

Figura A3. Correlaciones de Spearman de las 14 variables · 104 UPZ con al menos 5.000 residentes.

La matriz usa 104 UPZ porque incluye tasas. Las preguntas que no usan tasas mantienen las 112 UPZ. No se presentan pruebas de significación: los resultados compartidos y la falta de información sobre el diseño de la encuesta impiden tratar todas las filas como observaciones independientes de una muestra aleatoria.

G. Qué cambia al modificar el corte de población
tabla(robustez %>% filter(es_tasa) %>% select(Muestra,Relacion=relacion,N,Pearson,Spearman),
 "Tabla A8. Asociaciones entre percepción y tasas bajo distintas selecciones de UPZ",3)
Tabla A8. Asociaciones entre percepción y tasas bajo distintas selecciones de UPZ
Muestra Relacion N Pearson Spearman
112 UPZ VIF / percepción 112 0,195 0,616
112 UPZ Celulares / percepción 112 0,003 -0,384
80 con resultado propio VIF / percepción 80 0,518 0,681
80 con resultado propio Celulares / percepción 80 -0,134 -0,360
Población ≥ 2.500 VIF / percepción 108 0,204 0,654
Población ≥ 2.500 Celulares / percepción 108 -0,184 -0,425
Población ≥ 5.000 VIF / percepción 104 0,223 0,679
Población ≥ 5.000 Celulares / percepción 104 -0,145 -0,427
Población ≥ 10.000 VIF / percepción 101 0,256 0,675
Población ≥ 10.000 Celulares / percepción 101 -0,167 -0,421

El corte de 5.000 habitantes reduce la influencia de denominadores muy pequeños, pero no separa datos “buenos” de datos “malos”. Se muestran las alternativas para que pueda evaluarse cuánto dependen las relaciones de esa decisión.

H. Denuncias y tasas conjuntas por grupo
tabla(res_delitos %>% select(Grupo=grupo_percepcion,N,Poblacion,Casos_VIF,Casos_celulares,
 Tasa_conjunta_VIF,Tasa_conjunta_celulares),
 "Tabla A9. Tasa conjunta = suma de denuncias / suma de residentes × 10.000")
Tabla A9. Tasa conjunta = suma de denuncias / suma de residentes × 10.000
Grupo N Población Denuncias VIF Denuncias celulares Tasa conjunta VIF Tasa conjunta celulares
Q1 26 1.521.544 1.709 7.801 11,23 51,27
Q2 26 1.635.657 2.739 8.744 16,75 53,46
Q3 26 2.305.138 5.127 7.565 22,24 32,82
Q4 26 2.459.064 6.433 6.324 26,16 25,72

La tasa conjunta da más peso a las UPZ con más población. Es diferente de la mediana de tasas, que describe la UPZ situada en la mitad del grupo. Se mantienen separadas las dos tipologías: no hay identificadores de hechos o personas para comprobar si sus registros se superponen.

Fuentes

Se utilizaron los archivos entregados con el taller: upz_variables.csv, el diccionario de datos y los mapas de UPZ y localidades de la carpeta input/.

Encuesta Multipropósito 2021, DANE: tenencia de vivienda, percepción, condiciones del entorno y tiempos de acceso. Proyecciones DANE basadas en el CNPV 2018: población y vivienda de 2023. Secretaría Distrital de Seguridad, Convivencia y Justicia: denuncias de enero a julio de 2023. Todos los cálculos y las visualizaciones son elaboración de Andrés Varón, Julián Quintero y Juan Sanabria a partir de esos archivos.

Entorno de ejecución
sessionInfo()
## R version 4.6.2 (2026-10-29 ucrt)
## Platform: x86_64-w64-mingw32/x64
## Running under: Windows 11 x64 (build 26200)
## 
## Matrix products: default
##   LAPACK version 3.12.1
## 
## locale:
## [1] LC_COLLATE=Spanish_Colombia.utf8  LC_CTYPE=Spanish_Colombia.utf8   
## [3] LC_MONETARY=Spanish_Colombia.utf8 LC_NUMERIC=C                     
## [5] LC_TIME=Spanish_Colombia.utf8    
## 
## time zone: America/Bogota
## tzcode source: internal
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
## [1] sf_1.1-3      tidyr_1.3.2   dplyr_1.2.1   ggplot2_4.0.3
## 
## loaded via a namespace (and not attached):
##  [1] s2_1.1.13          sass_0.4.10        generics_0.1.4     class_7.3-24      
##  [5] KernSmooth_2.23-27 hms_1.1.4          digest_0.6.39      magrittr_2.0.5    
##  [9] evaluate_1.0.5     grid_4.6.2         RColorBrewer_1.1-3 fastmap_1.2.0     
## [13] jsonlite_2.0.0     e1071_1.7-17       DBI_1.3.0          purrr_1.2.2       
## [17] scales_1.4.0       jquerylib_0.1.4    cli_3.6.6          rlang_1.3.0       
## [21] crayon_1.5.3       units_1.0-1        bit64_4.8.6        withr_3.0.3       
## [25] cachem_1.1.0       yaml_2.3.12        otel_0.2.0         tools_4.6.2       
## [29] parallel_4.6.2     tzdb_0.5.0         vctrs_0.7.3        R6_2.6.1          
## [33] proxy_0.4-29       lifecycle_1.0.5    classInt_0.4-11    bit_4.6.0         
## [37] vroom_1.7.1        pkgconfig_2.0.3    pillar_1.11.1      bslib_0.12.0      
## [41] gtable_0.3.6       glue_1.8.1         Rcpp_1.1.2         xfun_0.62         
## [45] tibble_3.3.1       tidyselect_1.2.1   rstudioapi_0.19.0  knitr_1.52        
## [49] farver_2.1.2       htmltools_0.5.9    labeling_0.4.3     rmarkdown_2.32    
## [53] wk_0.9.5           readr_2.2.0        compiler_4.6.2     S7_0.2.2