1. Contexto

En el taller de EDA encontramos que la percepción de inseguridad se relaciona más con el entorno, como la cercanía a ollas de microtráfico (0,67) y a lotes oscuros (0,35), que con las denuncias de hurto (−0,39). Por eso queremos medir el deterioro del entorno de cada UPZ con cuatro variables de la Encuesta Multipropósito: el porcentaje de viviendas que tienen cerca ollas, lotes baldíos u oscuros, basureros y bares. Un valor alto en el índice significa que una mayor parte de las viviendas de esa UPZ convive con estos factores de deterioro.

1.1 Indicadores de entorno riesgoso

Los cuatro indicadores miden el mismo concepto: qué porcentaje de las viviendas de cada UPZ tiene cerca un factor de deterioro. En los cuatro, un valor alto significa más deterioro, por eso ninguno se invierte.

indicadores <- tribble(
  ~variable,                 ~nombre,                          ~dimension,
  "pct_cerca_ollas",         "Cerca de ollas (%)",             "Microtráfico",
  "pct_cerca_lotes_oscuros", "Cerca de lotes oscuros (%)",     "Espacio público",
  "pct_cerca_basureros",     "Cerca de basureros (%)",         "Aseo y salubridad",
  "pct_cerca_bares",         "Cerca de bares o prostíbulos (%)", "Vida nocturna"
)

upz_ok |>
  select(all_of(indicadores$variable)) |>
  pivot_longer(everything(), names_to = "variable", values_to = "valor") |>
  group_by(variable) |>
  summarise(Mínimo = min(valor), Mediana = median(valor), Máximo = max(valor)) |>
  right_join(indicadores, by = "variable") |>
  transmute(Indicador = nombre, Dimensión = dimension,
            Sentido = "↑ más deterioro",
            Mínimo = num(Mínimo, 1), Mediana = num(Mediana, 1), Máximo = num(Máximo, 1)) |>
  tabla_bonita()
Indicador Dimensión Sentido Mínimo Mediana Máximo
Cerca de bares o prostíbulos (%) Vida nocturna ↑ más deterioro 0,6 13,1 53,9
Cerca de basureros (%) Aseo y salubridad ↑ más deterioro 0,2 6,1 45,0
Cerca de lotes oscuros (%) Espacio público ↑ más deterioro 0,6 18,2 59,8
Cerca de ollas (%) Microtráfico ↑ más deterioro 0,3 20,9 75,6

La diferencia entre UPZ es grande: en algunas casi ninguna vivienda tiene ollas cerca (0,3 %) y en otras tres de cada cuatro (75,6 %). Los basureros son el factor menos común (mediana de 6,1 %), pero con algunas UPZ muy altas: por eso llevan log1p() en el siguiente paso.

2. Índice de deterioro del entorno

2.1 ¿Tiene sentido hacer un PCA?

# 1. Variables del mismo concepto: deterioro del entorno de la vivienda
vars_indice <- c("pct_cerca_ollas", "pct_cerca_lotes_oscuros",
                 "pct_cerca_basureros", "pct_cerca_bares")

# 2. Orientar y transformar: las cuatro ya crecen con el deterioro (ninguna va por -1).
#    Basureros tiene cola larga (asimetría 1,8): log1p() la comprime.
X <- upz_ok |>
  select(all_of(vars_indice)) |>
  mutate(pct_cerca_basureros = log1p(pct_cerca_basureros))
nombres_ind <- c(pct_cerca_ollas         = "Ollas de microtráfico",
                 pct_cerca_lotes_oscuros = "Lotes oscuros",
                 pct_cerca_basureros     = "Basureros (log)",
                 pct_cerca_bares         = "Bares")

cor(X) |>
  as.data.frame() |>
  rownames_to_column("var1") |>
  pivot_longer(-var1, names_to = "var2", values_to = "r") |>
  mutate(var1 = factor(nombres_ind[var1], levels = nombres_ind),
         var2 = factor(nombres_ind[var2], levels = nombres_ind)) |>
  filter(as.integer(var1) >= as.integer(var2)) |>          # triángulo inferior + diagonal
  ggplot(aes(var2, fct_rev(var1), fill = r)) +
  geom_tile(color = "white", linewidth = 1) +
  geom_text(aes(label = num(r, 2), color = abs(r) > 0.5), fontface = "bold", size = 4) +
  scale_fill_gradient2(low = azul, mid = "white", high = vino, midpoint = 0,
                       limits = c(-1, 1), name = "Correlación") +
  scale_color_manual(values = c(`TRUE` = "white", `FALSE` = noche), guide = "none") +
  labs(title = "Las cuatro señales de deterioro aumentan juntas",
       subtitle = "Correlación entre las variables del índice · 104 UPZ",
       x = NULL, y = NULL, caption = fuente) +
  tema_clase +
  theme(panel.grid = element_blank(), axis.text.x = element_text(angle = 30, hjust = 1))

Todas las correlaciones son positivas (entre 0,37 y 0,81): donde hay más ollas de microtráfico cerca de las viviendas también hay más basureros, lotes oscuros y bares. La relación más fuerte es entre ollas y basureros (0,81), y la más débil entre bares y lotes oscuros (0,37).

# 3. Estandarizar (media 0, desviación 1) y revisar si vale la pena el PCA
Z <- scale(X)
kmo(Z)
## [1] 0.74

El KMO de 0,74 lo confirma: las cuatro variables comparten suficiente información para resumirlas en un solo número.

# 4. El PCA. orientar_pc1() deja PC1 de modo que alto = más deterioro
pca <- orientar_pc1(prcomp(Z))

# Cuánta información guarda cada componente
# Varianza explicada: cuánta información guarda cada componente
varianza <- tibble(
  componente = paste0("PC", seq_along(pca$sdev)),
  autovalor  = pca$sdev^2,
  pct        = 100 * autovalor / sum(autovalor),
  acumulado  = cumsum(pct)
)

varianza |>
  mutate(across(c(autovalor, pct, acumulado), ~ num(.x, 1))) |>
  tabla_bonita() |>
  row_spec(1, bold = TRUE, background = "#F8E9EC")
componente autovalor pct acumulado
PC1 2,8 70,2 70,2
PC2 0,7 17,6 87,8
PC3 0,3 8,2 96,0
PC4 0,2 4,0 100,0
# Cargas de PC1 y PC2: cuánto pesa cada variable en cada componente
pct <- 100 * pca$sdev^2 / sum(pca$sdev^2)

as_tibble(pca$rotation[, 1:2], rownames = "variable") |>
  mutate(nombre = nombres_ind[variable]) |>
  pivot_longer(c(PC1, PC2), names_to = "componente", values_to = "carga") |>
  mutate(componente = if_else(componente == "PC1",
                              paste0("PC1 · ", num(pct[1], 1), " %"),
                              paste0("PC2 · ", num(pct[2], 1), " %"))) |>
  ggplot(aes(carga, reorder(nombre, carga), fill = carga > 0)) +
  geom_col(width = 0.7) +
  geom_vline(xintercept = 0, color = "grey40") +
  geom_text(aes(label = num(carga, 2), hjust = if_else(carga > 0, -0.2, 1.2)), size = 3.4) +
  facet_wrap(~ componente) +
  scale_fill_manual(values = c(`TRUE` = vino, `FALSE` = azul), guide = "none") +
  scale_x_continuous(limits = c(-1, 1.1)) +
  labs(title = "PC1 pesa las cuatro variables en la misma dirección; PC2 separa los bares del resto",
       subtitle = "Cargas de cada variable en los dos primeros componentes",
       x = "Carga", y = NULL, caption = fuente) +
  tema_clase +
  theme(strip.text = element_text(face = "bold", size = 11))

PC1 guarda el 70 % de la información de las cuatro variables, y todas sus cargas son positivas: las cuatro aumentan juntas, así que PC1 funciona como índice. Las ollas (31 %) y los basureros (28 %) son lo que más pesa, seguidos de los lotes oscuros (25 %) y los bares (16 %).

1.4 ¿Cómo se reparte el índice?

La mitad de las UPZ tiene un índice entre 23 y 52, con una mediana de 39,7: el deterioro del entorno es bajo o medio en la mayor parte de la ciudad. El índice se dispara en un grupo pequeño de 8 UPZ que superan 70, entre ellas Corabastos, La Sabana, Las Cruces y Puente Aranda en el centro, y Comuneros, Monte Blanco y El Tesoro en el sur. Más que un problema generalizado, el deterioro alto se concentra en unos pocos territorios, que son los que conviene priorizar.

# 5. El índice de 0 a 100: 0 = la UPZ con menos deterioro, 100 = la de más deterioro
upz_ok <- upz_ok |> mutate(indice = rescale(pca$x[, 1], to = c(0, 100)))

# Control de calidad: el índice debe ir en la misma dirección que el promedio
# simple de las variables estandarizadas (correlación cercana a 1)
cor(upz_ok$indice, rowMeans(Z))
## [1] 0.9986207
mediana_indice <- median(upz_ok$indice)
n_altas        <- sum(upz_ok$indice >= 70)

ggplot(upz_ok, aes(indice, fill = indice >= 70)) +
  geom_histogram(binwidth = 4, boundary = 0, color = "white") +
  geom_vline(xintercept = mediana_indice, color = azul, linetype = "dashed", linewidth = 0.9) +
  annotate("text", x = mediana_indice - 1, y = Inf, vjust = 1.5, hjust = 1,
           label = paste0("Mediana: ", num(mediana_indice, 1)),
           color = azul, fontface = "bold", size = 3.6) +
  annotate("text", x = 85, y = 4.2,
           label = paste(n_altas, "UPZ por encima de 70"),
           color = vino, fontface = "bold", size = 3.6) +
  scale_fill_manual(values = c(`FALSE` = gris, `TRUE` = vino), guide = "none") +
  labs(title = "La mayoría de las UPZ tiene un deterioro bajo o medio; unas pocas se disparan",
       subtitle = paste0("Distribución del índice de deterioro del entorno · ", nrow(upz_ok), " UPZ"),
       x = "Índice de deterioro del entorno (0 = menos, 100 = más)",
       y = "N.º de UPZ", caption = fuente) +
  tema_clase

grafico_ranking(upz_ok, "indice",
                titulo = "Corabastos y el centro encabezan el deterioro del entorno; el norte casi no lo tiene",
                subtitulo = "Índice de deterioro del entorno (0–100) · las 10 UPZ más altas y las 10 más bajas")

¿Qué nos dice el índice? PC1 guarda el 70 % de la información de las cuatro variables y todas sus cargas son positivas, así que sirve como índice: cuando una UPZ tiene más viviendas cerca de ollas, también suele tener más cerca basureros, lotes oscuros y bares. Las ollas y los basureros son lo que más pesa.

El deterioro se concentra en dos zonas. La primera es el centro y el corredor de Corabastos: Corabastos (100), La Sabana (98,9), Las Cruces (91,1) y Puente Aranda (89,5). La segunda es la periferia sur, con Comuneros en Usme, Monte Blanco y El Tesoro en Ciudad Bolívar, y El Porvenir en Bosa. En el otro extremo, las UPZ con menos deterioro están en el norte, en Suba, Usaquén y Teusaquillo, con valores cercanos a 0. Varias de estas UPZ, como Corabastos, La Sabana y El Tesoro, ya aparecían en el taller de EDA entre las de mayor percepción de inseguridad.

Algunas UPZ tienen exactamente el mismo valor, como Zona Industrial y Puente Aranda (89,5) o tres UPZ de Usaquén (5,8). Esto pasa porque la Encuesta Multipropósito reporta valores agrupados para UPZ vecinas, no porque sean iguales en la realidad.

3.

3.1

El índice resume el deterioro del entorno en un número, pero no dice si ese deterioro va acompañado de miedo, de delitos o de condiciones de vida difíciles. Dos UPZ con el mismo índice pueden ser muy distintas. Por eso cruzamos el índice con cuatro variables: el % de viviendas de estrato 1–2 (condiciones de vida), la percepción de inseguridad, que dejamos por fuera del índice justamente para cruzarla aquí, y las dos tasas que analizamos en el EDA, hurto a personas y violencia intrafamiliar.

# 1. El índice + 4 variables de otros temas (estrato, percepción y delitos)
vars_segmento <- c("indice", "pct_estrato_1_2", "pct_percibe_inseguridad",
                   "tasa_hurto_personas", "tasa_violencia_intrafamiliar")

# 2. Estandarizar. Las dos tasas tienen colas muy largas (asimetría 3,2 y 5,7): log1p()
Z_seg <- upz_ok |>
  select(all_of(vars_segmento)) |>
  mutate(tasa_hurto_personas          = log1p(tasa_hurto_personas),
         tasa_violencia_intrafamiliar = log1p(tasa_violencia_intrafamiliar)) |>
  scale()

# 3. ¿Cuántos grupos? Codo y silhouette para K de 2 a 8, resaltando el K elegido
K <- 4

set.seed(2026)
distancias <- dist(Z_seg)
tabla_k <- map_dfr(2:8, function(k) {
  km_k <- kmeans(Z_seg, centers = k, nstart = 50)
  tibble(k = k, wss = km_k$tot.withinss,
         silhouette = mean(silhouette(km_k$cluster, distancias)[, 3]))
})

g_codo <- ggplot(tabla_k, aes(k, wss)) +
  geom_line(color = noche) +
  geom_point(color = noche, size = 2.5) +
  geom_point(data = filter(tabla_k, k == K), color = vino, size = 4) +
  scale_x_continuous(breaks = 2:8) +
  labs(title = "Codo: después de K = 4 la ganancia se aplana",
       x = "K", y = "WSS (suma de distancias²)") +
  tema_clase

g_silu <- ggplot(tabla_k, aes(k, silhouette, fill = k == K)) +
  geom_col(width = 0.7) +
  geom_text(aes(label = num(silhouette, 2)), vjust = -0.4, size = 3.2) +
  scale_fill_manual(values = c(`TRUE` = vino, `FALSE` = gris), guide = "none") +
  scale_x_continuous(breaks = 2:8) +
  labs(title = "Silhouette: K = 3 y K = 4 separan mejor",
       
       x = "K", y = "Silhouette promedio") +
  tema_clase

g_codo | g_silu

El codo muestra que la WSS baja mucho de K = 2 a K = 4 y después se aplana: agregar más grupos ya no mejora mucho. La silhouette es más alta en K = 3 (0,43) y en K = 4 (0,36) queda cerca. Elegimos K = 4 porque, además de cumplir los dos criterios, separa las UPZ de estratos altos del norte de las de estrato medio, algo que con K = 3 quedaba mezclado en un solo grupo.

# 4. El K-Means con el K elegido
set.seed(2026)
km <- kmeans(Z_seg, centers = K, nstart = 50)
upz_ok <- upz_ok |> mutate(segmento = factor(km$cluster))

# 5. Nombres: ordenamos los grupos por su índice (de menor a mayor deterioro)
orden <- upz_ok |>
  group_by(segmento) |>
  summarise(m = median(indice)) |>
  arrange(m) |>
  pull(segmento)

nombres_seg <- c("Entorno cuidado, hurto alto", "Miedo moderado, hurto medio",
                 "Más miedo, menos hurto", "Deterioro y delito al máximo")

upz_ok <- upz_ok |>
  mutate(segmento_nombre = factor(nombres_seg[match(segmento, orden)], levels = nombres_seg))

# 6. El perfil de cada segmento en valores reales
grafico_perfil(upz_ok, vars_segmento, grupo = "segmento_nombre",
               titulo = "Cuatro tipos de UPZ: el miedo es mayor en la periferia y el delito en el centro")

ejemplos(upz_ok)
Segmento UPZ más pobladas
Entorno cuidado, hurto alto Los Cedros, El Prado, Britalia, Niza
Miedo moderado, hurto medio Suba, Garces Navas, Castilla, Timiza
Más miedo, menos hurto Tibabuyes, El Rincon, Bosa Central, Bosa Occidental
Deterioro y delito al máximo La Sabana, La Candelaria, Las Nieves, Puente Aranda

2.3 Los cuatro segmentos, uno por uno

Entorno cuidado, hurto alto · 24 UPZ · 1,3 millones de personas
Se caracteriza por tener el menor deterioro del entorno (11,6) y la menor percepción de inseguridad (37 %). Son UPZ del norte, de estratos altos, con los salarios y la educación más altos. Lo que lo hace diferente es que, a pesar de su entorno cuidado, tiene la segunda tasa de hurto más alta (148), posiblemente por la población flotante de oficinas y comercio y una mayor cultura de denuncia. Ejemplos: Los Cedros, Niza, Country Club.

Miedo moderado, hurto medio · 32 UPZ · 2,5 millones de personas
Se caracteriza por ser de estrato medio, con un deterioro moderado (34,1) y una percepción de inseguridad igual a la de la UPZ típica (66 %). Lo que lo hace diferente es que todo está cerca del promedio de Bogotá: su hurto (126) es menor que el del norte y su violencia intrafamiliar es intermedia. Ejemplos: Suba, Castilla, Timiza.

Más miedo, menos hurto · 42 UPZ · 4,1 millones de personas
Se caracteriza por ser el grupo más grande: casi todas sus viviendas son de estrato 1–2, tiene un deterioro medio-alto (51,9) y la mayor percepción de inseguridad (74 %). Lo que lo hace diferente es que tiene la tasa de hurto más baja (48): aquí el miedo no viene del hurto, sino del entorno. Su violencia intrafamiliar (22,5) está por encima de la mediana. Ejemplos: Tibabuyes, Bosa Central, Lucero.

Deterioro y delito al máximo · 6 UPZ · 0,1 millones de personas
Se caracteriza por tener el mayor deterioro del entorno (73,1) y las tasas más altas de hurto (852) y de violencia intrafamiliar (63). Lo que lo hace diferente es que son UPZ del centro con pocos residentes y mucha población flotante, lo que infla sus tasas por habitante. Ejemplos: La Sabana, Las Nieves, Puente Aranda.

# Colores de los segmentos (se usan también en el mapa)
colores_segmentos <- c(azul, "#E3A21A", vino, noche)

medianas_seg <- upz_ok |>
  group_by(segmento_nombre) |>
  summarise(mediana = median(indice))

set.seed(1)


ggplot(upz_ok, aes(indice, fct_rev(segmento_nombre), color = segmento_nombre)) +
  scale_y_discrete() +
  annotate("rect", xmin = 35, xmax = 50, ymin = 0.5, ymax = 4.5,
           fill = NA, color = "grey50", linetype = "dashed") +
  annotate("text", x = 51, y = 4.4, hjust = 0, vjust = 1, size = 3.4, fontface = "bold",
           color = "grey25", label = "Mismo índice,\ncuatro realidades") +
  geom_jitter(height = 0.2, width = 0, alpha = 0.4, size = 2) +
  geom_point(data = medianas_seg, aes(mediana, fct_rev(segmento_nombre)),
             shape = 21, fill = "white", size = 5, stroke = 1.8) +
  geom_text(data = medianas_seg, aes(mediana, fct_rev(segmento_nombre), label = num(mediana)),
            nudge_y = -0.3, fontface = "bold", size = 3.6) +
  scale_color_manual(values = colores_segmentos, guide = "none") +
  scale_x_continuous(limits = c(-2, 102)) +
  labs(title = "Mismo deterioro, realidades distintas",
       subtitle = "Índice de deterioro del entorno por segmento (círculo = mediana; cada punto, una UPZ)",
       x = "Índice de deterioro del entorno (0–100)", y = NULL, caption = fuente) +
  tema_clase +
  theme(axis.text.y = element_text(face = "bold", size = 11), panel.grid.major.y = element_blank())

Entre 35 y 50 en el índice aparecen UPZ de los cuatro segmentos: el mismo nivel de deterioro puede venir con realidades muy distintas. Las Nieves, Galerías, Tibabuyes y Granjas de Techo tienen un índice cercano a 47, pero Las Nieves registra 1.488 denuncias de hurto por 10.000 habitantes y Tibabuyes solo 32, mientras que Tibabuyes tiene la mayor percepción de inseguridad (73 %). El índice dice cuánto deterioro hay; la segmentación dice con qué viene acompañado.

2.5 ¿Qué tan bien encaja cada UPZ?

sil <- silhouette(km$cluster, distancias)

datos_sil <- upz_ok |>
  mutate(silhouette = sil[, 3]) |>
  arrange(segmento_nombre, desc(silhouette)) |>
  mutate(posicion = row_number())

sil_promedio <- mean(datos_sil$silhouette)

ggplot(datos_sil, aes(posicion, silhouette, fill = segmento_nombre)) +
  geom_col(width = 1) +
  geom_hline(yintercept = 0, color = "grey60") +
  geom_hline(yintercept = sil_promedio, linetype = "dashed", color = noche) +
  scale_fill_manual(values = colores_segmentos, name = NULL) +
  labs(title = "La mayoría de las UPZ encaja en su segmento; pocas quedan «de frontera»",
       subtitle = paste0("Silhouette de cada UPZ (bajo cero = más cerca de otro segmento) · promedio = ",
                         num(sil_promedio, 2)),
       x = "UPZ, ordenadas dentro de cada segmento", y = "Silhouette", caption = fuente) +
  guides(fill = guide_legend(nrow = 2)) +
  tema_clase +
  theme(axis.text.x = element_blank(), panel.grid.major.x = element_blank(),
        legend.position = "bottom")

La silhouette mide qué tan bien encaja cada UPZ en su segmento: cerca de 1 = muy bien, cerca de 0 = en la frontera entre dos grupos, bajo cero = más parecida a otro segmento. El promedio es de 0,36 y solo dos UPZ quedan bajo cero: La Candelaria y Verbenal. “Entorno cuidado” y “Más miedo, menos hurto” son los segmentos más compactos; “Deterioro y delito al máximo” es el más heterogéneo, porque reúne pocas UPZ con valores muy extremos.

3. Nuestros mapas

Si el deterioro del entorno sigue la misma lógica que encontramos en el EDA, esperamos verlo concentrado en el sur y la periferia, donde predominan los estratos 1–2, y en el centro histórico, con poco deterioro en el norte. Los mapas permiten comprobar si los segmentos forman zonas continuas de la ciudad o si están dispersos.

3.1 Mapa del índice

mapa_continuo(upz_ok, "indice",
              titulo = "El deterioro del entorno crece hacia el sur y el centro; el norte casi no lo tiene",
              subtitulo = "Índice de deterioro del entorno (0–100) por UPZ",
              leyenda = "Índice\n(0–100)")

El índice tiene una geografía clara. Los valores más bajos forman una franja en el norte y el nororiente (Usaquén, Chapinero y Teusaquillo), y los más altos se concentran en el sur y el suroccidente (Ciudad Bolívar, Usme, Bosa y Kennedy) y en el centro histórico. El punto más oscuro es Corabastos, en Kennedy. El deterioro del entorno sigue la misma división norte–sur que vimos en el EDA con los estratos.

3.2 Mapa de los segmentos

mapa_categorico(upz_ok, "segmento_nombre",
                titulo = "Los segmentos forman anillos: norte cuidado, centro crítico y periferia con miedo",
                subtitulo = "Segmento de cada UPZ según K-Means (K = 4)")

# Un panel por segmento: cada uno en su color sobre el resto de la ciudad en gris
fondo <- upz_shp |> select(geometry)
mapa_seg <- upz_shp |> select(upz_cod) |> inner_join(upz_ok, by = "upz_cod")

ggplot() +
  geom_sf(data = fondo, fill = "#EEEEF0", color = "white", linewidth = 0.1) +
  geom_sf(data = mapa_seg, aes(fill = segmento_nombre), color = "white", linewidth = 0.1) +
  facet_wrap(~ segmento_nombre, nrow = 1) +
  scale_fill_manual(values = colores_segmentos, guide = "none") +
  labs(title = "Dónde está cada segmento",
       subtitle = "UPZ de cada segmento (en color) sobre el resto de la ciudad (gris)",
       caption = fuente) +
  tema_mapa +
  theme(strip.text = element_text(face = "bold", size = 9.5))

Los segmentos no están dispersos: forman zonas continuas. Entorno cuidado, hurto alto ocupa el norte y el nororiente, con una isla en el occidente (Ciudad Salitre, Modelia). Miedo moderado, hurto medio forma un anillo intermedio en Engativá, Kennedy, Puente Aranda y el centro de Suba. Más miedo, menos hurto rodea la ciudad por el sur, el occidente y el noroccidente (Bosa, Ciudad Bolívar, Usme, Tibabuyes). Deterioro y delito al máximo se concentra en el centro histórico. UPZ con un índice parecido, como las del centro y las de Bosa, quedaron en segmentos distintos: en el centro el deterioro viene con mucho delito; en la periferia, con miedo.

3.3 La trampa del área

peso <- upz_ok |>
  group_by(segmento_nombre) |>
  summarise(`% del territorio` = sum(area_km2),
            `% de las UPZ`      = n(),
            `% de la población` = sum(poblacion)) |>
  mutate(across(-segmento_nombre, ~ 100 * .x / sum(.x)))

peso |>
  pivot_longer(-segmento_nombre, names_to = "medida", values_to = "pct") |>
  mutate(medida = factor(medida, levels = c("% del territorio", "% de las UPZ", "% de la población"))) |>
  ggplot(aes(pct, fct_rev(segmento_nombre), fill = segmento_nombre)) +
  geom_col(width = 0.7) +
  geom_text(aes(label = paste0(num(pct, 0), " %")), hjust = -0.15, size = 3.3) +
  facet_wrap(~ medida) +
  scale_fill_manual(values = colores_segmentos, guide = "none") +
  scale_x_continuous(limits = c(0, 65), labels = function(x) paste0(x, " %")) +
  labs(title = "La mitad de la población analizada vive en el segmento con más miedo",
       subtitle = "Peso de cada segmento según territorio, número de UPZ y población",
       x = NULL, y = NULL, caption = fuente) +
  tema_clase +
  theme(strip.text = element_text(face = "bold", size = 11), axis.text.y = element_text(face = "bold"))

Más miedo, menos hurto ocupa el 43 % del territorio analizado, pero allí vive el 52 % de la población: es el segmento más grande en todo sentido. En el otro extremo, Deterioro y delito al máximo se ve llamativo en el mapa por estar en el centro, pero reúne solo el 1 % de la población. Al leer el mapa hay que recordar que el color no es gente: el problema más extendido no es el del centro, sino el de la periferia.

¿Qué muestra la segmentación que el índice solo no mostraba? En el mapa del índice, el centro y la periferia sur se ven parecidos: los dos tienen deterioro alto. La segmentación muestra que son problemas distintos: en el centro el deterioro viene con las tasas más altas de hurto y violencia intrafamiliar, y en la periferia, con la mayor percepción de inseguridad y poco hurto denunciado.