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.
La exploración se organiza en seis preguntas. En conjunto, relacionan 14 variables de cuatro bloques: demografía, vivienda, encuesta y delitos.
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.
| 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.
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.
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")| 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.
¿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="#D5E8E6") +
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",label.size=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())## Warning: The `label.size` argument of `geom_label()` is deprecated as of ggplot2 3.5.0.
## ℹ Please use the `linewidth` argument instead.
## This warning is displayed once per session.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
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.
¿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="#92A8AC",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.
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.
¿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.
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.
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.
¿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="#9CB0B4",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.
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.
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.
¿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.
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.
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.
¿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("#E8F4EF","#A8D4CA","#4BA6A3","#006D77","#123A4B")
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="#163946"><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="#163946" 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="#163946" 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
Encuesta Multipropósito 2021. Los límites oscuros corresponden a localidades.
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="#62777D",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.
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")| 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 |
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 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.
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.
tabla(ficha %>% select(Columna=variable,Indicador=nombre,Bloque=bloque,Unidad=unidad),
"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.
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")| 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.
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.
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.
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")| 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.
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")| 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")| 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")| 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 |
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)| 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"="#334A51","TRUE"="white"),guide="none") +
scale_fill_gradient2(low=naranja,mid="#F6F8F8",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.
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.
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)| 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.
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")| 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.
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.
## 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