1 Carga de paquetes y datos

library(readxl)
library(tidyverse)
library(knitr)
library(kableExtra)
library(scales)
library(ggplot2)
# Cargar las dos bases y el diccionario
BD1 <- read_excel("C:/Users/joans/Downloads/BD1.xlsx")
BD2 <- read_excel("C:/Users/joans/Downloads/BD2.xlsx")

# Unir por la llave REGISTRO
df <- BD1 %>% left_join(BD2, by = "REGISTRO")

cat("Dimensiones de la base unificada:", nrow(df), "filas x", ncol(df), "columnas\n")
## Dimensiones de la base unificada: 4673 filas x 422 columnas
# Etiquetas de variables categoricas
seg_levels <- c("Muy seguro", "Seguro", "Inseguro", "Muy inseguro")

df$GENERO_LBL <- factor(df$GENERO,
                        levels = c(1, 2),
                        labels = c("Masculino", "Femenino"))

df$ESTRATO_LBL <- factor(df$ESTRATO_DEC,
                         levels = 1:7,
                         labels = c("Estrato 1","Estrato 2","Estrato 3",
                                    "Estrato 4","Estrato 5","Estrato 6",
                                    "Sin estrato"))

df$EDAD_LBL <- factor(df$EDAD_RANGO,
                      levels = 1:10,
                      labels = c("16-17","18-24","25-28","29-34",
                                 "35-38","39-44","45-54","55-59",
                                 "60-66","67 o mas"))

df$OCUPACION_LBL <- factor(df$PD,
                           levels = c(1,2,3,4,5,6,10,11,77,88,99),
                           labels = c("Empleado/asalariado",
                                      "Independiente/propietario",
                                      "Retirado/Jubilado",
                                      "Desempleado",
                                      "Ama de Casa",
                                      "Estudiante",
                                      "Incapacitado/discapacitado",
                                      "Cuidado de familiares",
                                      "Otros",
                                      "Ninguno",
                                      "No responde"))

df$P1_LBL <- factor(df$P1, levels = 1:4, labels = seg_levels)
df$P3_LBL <- factor(df$P3, levels = 1:4, labels = seg_levels)
df$P5_LBL <- factor(df$P5, levels = 1:4, labels = seg_levels)

2 Caracterización socioeconómica de la población encuestada (Punto a)

En esta sección se describe la población encuestada a partir de las variables de género, edad, estrato y ocupación, apoyados en estadísticas descriptivas, tablas y gráficos.

2.1 Distribución por género

tab_genero <- df %>%
  count(GENERO_LBL) %>%
  mutate(Porcentaje = n / sum(n) * 100) %>%
  rename(Genero = GENERO_LBL, Frecuencia = n)

tab_genero %>%
  kable(caption = "Tabla 1. Distribucion por genero",
        digits  = 1,
        format.args = list(big.mark = ",")) %>%
  kable_styling(bootstrap_options = c("striped","hover","condensed"),
                full_width = FALSE)
Tabla 1. Distribucion por genero
Genero Frecuencia Porcentaje
Masculino 2,290 49
Femenino 2,383 51
ggplot(tab_genero, aes(x = Genero, y = Porcentaje, fill = Genero)) +
  geom_col(width = 0.5, show.legend = FALSE) +
  geom_text(aes(label = paste0(round(Porcentaje, 1), "%")),
            vjust = -0.4, size = 4) +
  scale_fill_manual(values = c("#3A86FF","#FF006E")) +
  labs(title = "Distribucion por genero",
       x = NULL, y = "Porcentaje (%)") +
  theme_minimal(base_size = 12)
Figura 1. Distribucion por genero de la poblacion encuestada.

Figura 1. Distribucion por genero de la poblacion encuestada.

2.2 Distribución por rango de edad

tab_edad <- df %>%
  count(EDAD_LBL) %>%
  mutate(Porcentaje = n / sum(n) * 100) %>%
  rename(Rango_edad = EDAD_LBL, Frecuencia = n)

tab_edad %>%
  kable(caption = "Tabla 2. Distribucion por rango de edad",
        digits  = 1) %>%
  kable_styling(bootstrap_options = c("striped","hover","condensed"),
                full_width = FALSE)
Tabla 2. Distribucion por rango de edad
Rango_edad Frecuencia Porcentaje
16-17 112 2.4
18-24 636 13.6
25-28 347 7.4
29-34 448 9.6
35-38 272 5.8
39-44 348 7.4
45-54 681 14.6
55-59 442 9.5
60-66 615 13.2
67 o mas 772 16.5
ggplot(tab_edad, aes(x = Rango_edad, y = Porcentaje, fill = Rango_edad)) +
  geom_col(show.legend = FALSE) +
  geom_text(aes(label = paste0(round(Porcentaje, 1), "%")),
            vjust = -0.4, size = 3) +
  scale_fill_viridis_d(option = "plasma") +
  labs(title = "Distribucion por rango de edad",
       x = "Rango_edad", y = "Porcentaje (%)") +
  theme_minimal(base_size = 11) +
  theme(axis.text.x = element_text(angle = 30, hjust = 1))
Figura 2. Distribucion por rango de edad.

Figura 2. Distribucion por rango de edad.

2.3 Distribución por estrato socioeconómico

tab_estrato <- df %>%
  filter(!is.na(ESTRATO_LBL)) %>%
  count(ESTRATO_LBL) %>%
  mutate(Porcentaje = n / sum(n) * 100) %>%
  rename(Estrato = ESTRATO_LBL, Frecuencia = n)

tab_estrato %>%
  kable(caption = "Tabla 3. Distribucion por estrato socioeconomico",
        digits  = 1) %>%
  kable_styling(bootstrap_options = c("striped","hover","condensed"),
                full_width = FALSE)
Tabla 3. Distribucion por estrato socioeconomico
Estrato Frecuencia Porcentaje
Estrato 1 753 16.1
Estrato 2 2026 43.4
Estrato 3 1282 27.4
Estrato 4 141 3.0
Estrato 5 82 1.8
Estrato 6 3 0.1
Sin estrato 386 8.3
ggplot(tab_estrato, aes(x = Estrato, y = Porcentaje, fill = Estrato)) +
  geom_col(show.legend = FALSE) +
  geom_text(aes(label = paste0(round(Porcentaje, 1), "%")),
            vjust = -0.4, size = 3.5) +
  scale_fill_brewer(palette = "Blues") +
  labs(title = "Distribucion por estrato socioeconomico",
       x = NULL, y = "Porcentaje (%)") +
  theme_minimal(base_size = 11) +
  theme(axis.text.x = element_text(angle = 20, hjust = 1))
Figura 3. Distribucion por estrato socioeconomico.

Figura 3. Distribucion por estrato socioeconomico.

2.4 Distribución por ocupación

tab_ocup <- df %>%
  filter(!is.na(OCUPACION_LBL),
         !OCUPACION_LBL %in% c("Ninguno","No responde")) %>%
  count(OCUPACION_LBL) %>%
  mutate(Porcentaje = n / sum(n) * 100) %>%
  arrange(desc(Porcentaje)) %>%
  rename(Ocupacion = OCUPACION_LBL, Frecuencia = n)

tab_ocup %>%
  kable(caption = "Tabla 4. Distribucion por ocupacion",
        digits  = 1) %>%
  kable_styling(bootstrap_options = c("striped","hover","condensed"),
                full_width = FALSE)
Tabla 4. Distribucion por ocupacion
Ocupacion Frecuencia Porcentaje
Ama de Casa 1343 29.3
Empleado/asalariado 1123 24.5
Independiente/propietario 1001 21.8
Desempleado 427 9.3
Retirado/Jubilado 360 7.9
Estudiante 304 6.6
Incapacitado/discapacitado 16 0.3
Cuidado de familiares 6 0.1
Otros 4 0.1
ggplot(tab_ocup,
       aes(x = reorder(Ocupacion, Porcentaje), y = Porcentaje, fill = Ocupacion)) +
  geom_col(show.legend = FALSE) +
  geom_text(aes(label = paste0(round(Porcentaje, 1), "%")),
            hjust = -0.1, size = 3) +
  scale_fill_brewer(palette = "Set2") +
  coord_flip() +
  labs(title = "Distribucion por ocupacion",
       x = NULL, y = "Porcentaje (%)") +
  theme_minimal(base_size = 11)
Figura 4. Distribucion por ocupacion.

Figura 4. Distribucion por ocupacion.

2.5 Distribución por nivel educativo

## Nivel educativo


df$EDUC_LBL <- factor(df$P110,
                      levels = c(1, 2, 3, 4, 5, 6, 990),
                      labels = c("Preescolar",
                                 "Primaria",
                                 "Secundaria",
                                 "Tecnico",
                                 "Superior/universitario",
                                 "Postgrado",
                                 "Ninguno"))

tab_educ <- df %>%
  filter(!is.na(EDUC_LBL)) %>%
  count(EDUC_LBL) %>%
  mutate(Porcentaje = round(n / sum(n) * 100, 1)) %>%
  arrange(desc(Porcentaje)) %>%
  rename(Nivel_educativo = EDUC_LBL, Frecuencia = n)

tab_educ %>%
  kable(caption = "Tabla 5. Distribucion por nivel educativo",
        digits  = 1) %>%
  kable_styling(bootstrap_options = c("striped","hover","condensed"),
                full_width = FALSE)
Tabla 5. Distribucion por nivel educativo
Nivel_educativo Frecuencia Porcentaje
Secundaria 1984 42.5
Primaria 1149 24.6
Tecnico 787 16.8
Superior/universitario 477 10.2
Ninguno 122 2.6
Postgrado 114 2.4
Preescolar 40 0.9
ggplot(tab_educ,
       aes(x = reorder(Nivel_educativo, Porcentaje),
           y = Porcentaje,
           fill = Nivel_educativo)) +
  geom_col(show.legend = FALSE) +
  geom_text(aes(label = paste0(Porcentaje, "%")),
            hjust = -0.1, size = 3.5) +
  coord_flip() +
  scale_fill_brewer(palette = "Greens") +
  labs(title = "Distribucion por nivel educativo",
       x = NULL, y = "Porcentaje (%)") +
  theme_minimal(base_size = 11)
Figura 5. Distribucion por nivel educativo.

Figura 5. Distribucion por nivel educativo.

2.6 Distribución por ingreso mensual del hogar

df$INGRESO_LBL <- factor(df$P111,
                         levels = c(1, 2, 3, 4, 5, 6, 7, 8, 999),
                         labels = c("Menos de $100.000",
                                    "$100.000 - $350.000",
                                    "$350.001 - $700.000",
                                    "$700.001 - $1.000.000",
                                    "$1.000.001 - $2.000.000",
                                    "$2.000.001 - $3.500.000",
                                    "$3.500.001 - $5.000.000",
                                    "Mas de $5.000.000",
                                    "Ns/Nr"))

tab_ingreso <- df %>%
  filter(!is.na(INGRESO_LBL), INGRESO_LBL != "Ns/Nr") %>%
  count(INGRESO_LBL) %>%
  mutate(Porcentaje = round(n / sum(n) * 100, 1)) %>%
  rename(Rango_ingreso = INGRESO_LBL, Frecuencia = n)

tab_ingreso %>%
  kable(caption = "Tabla 6. Distribucion por ingreso mensual del hogar",
        digits  = 1) %>%
  kable_styling(bootstrap_options = c("striped","hover","condensed"),
                full_width = FALSE)
Tabla 6. Distribucion por ingreso mensual del hogar
Rango_ingreso Frecuencia Porcentaje
Menos de $100.000 164 3.8
$100.000 - $350.000 334 7.7
$350.001 - $700.000 515 11.9
$700.001 - $1.000.000 1158 26.8
$1.000.001 - $2.000.000 1422 32.9
$2.000.001 - $3.500.000 450 10.4
$3.500.001 - $5.000.000 189 4.4
Mas de $5.000.000 92 2.1
ggplot(tab_ingreso,
       aes(x = Rango_ingreso, y = Porcentaje, fill = Porcentaje)) +
  geom_col(show.legend = FALSE) +
  geom_text(aes(label = paste0(Porcentaje, "%")),
            vjust = -0.4, size = 3) +
  scale_fill_gradient(low = "#a8dadc", high = "#1d3557") +
  scale_x_discrete(limits = levels(tab_ingreso$Rango_ingreso)) +
  labs(title = "Distribucion por ingreso mensual del hogar",
       x = "Rango de ingreso", y = "Porcentaje (%)") +
  theme_minimal(base_size = 10) +
  theme(axis.text.x = element_text(angle = 35, hjust = 1))
Figura 6. Distribucion por ingreso mensual del hogar.

Figura 6. Distribucion por ingreso mensual del hogar.

La muestra está compuesta 4673 observaciones de las cuales 2290 pertenecen al género masculino y 2383 al género femenino, lo que refleja una distribución relativamente equilibrada entre géneros como se puede observar en la Figura 1. Los grupos de edad con mayor representación son los rangos intermedios (45-54 y 18-24 años) y el rango de edades superiores, mientras que los extremos (16-17 ) concentran la menor proporción de encuestados todo lo anterior se puede observar en la Figura 2. En la figura 3 la mayor parte de los encuestados pertenece a los estratos 2 y 3, los estratos 4, 5 y 6 tienen una participación considerablemente menor. En la Figura 4 y Tabla 4 las ocupaciones más frecuentes son Ama de Casa, Empleado/asalariado e Independiente/propietario, lo que refleja la estructura laboral predominante entre los jefes de hogar encuestados y que recibieron las encuestas. El nivel educativo predominante entre los encuestados es Secundaria, seguido de Primaria y técnico. Una proporción menor cuenta con educación superior o universitaria, lo que refleja el perfil socioeducativo de los jefes de hogar de la ciudad Castellana. Por último, en la Figura 6 muestra que en la distribución del ingreso mensual la mayoría de los hogares encuestados se concentra en los rangos de ingreso medio-bajo (entre $700.001 y $2.000.000), lo que es coherente con el perfil de estratos 2 y 3 predominante en la muestra. Los hogares con ingresos superiores a $3.500.000 representan una minoría.’


3 Percepción de seguridad en barrios, comunas y ciudad (Punto b)

Las variables P1, P3 y P5 miden cómo se sienten los encuestados en su barrio, comuna y ciudad, respectivamente (escala: Muy seguro – Seguro – Inseguro – Muy inseguro).

# Construir tabla larga para comparacion
seg_long <- df %>%
  select(P1_LBL, P3_LBL, P5_LBL) %>%
  pivot_longer(cols      = everything(),
               names_to  = "Ambito",
               values_to = "Percepcion") %>%
  mutate(Ambito = recode(Ambito,
                         P1_LBL = "Barrio",
                         P3_LBL = "Comuna",
                         P5_LBL = "Ciudad")) %>%
  filter(!is.na(Percepcion))

tab_seg <- seg_long %>%
  count(Ambito, Percepcion) %>%
  group_by(Ambito) %>%
  mutate(Porcentaje = n / sum(n) * 100) %>%
  ungroup()

# Tabla resumen
tab_seg %>%
  select(Ambito, Percepcion, Frecuencia = n, Porcentaje) %>%
  pivot_wider(names_from  = Ambito,
              values_from = c(Frecuencia, Porcentaje)) %>%
  kable(caption = "Tabla 7. Percepcion de seguridad por ambito (frecuencias y %)",
        digits  = 1) %>%
  kable_styling(bootstrap_options = c("striped","hover","condensed"))
Tabla 7. Percepcion de seguridad por ambito (frecuencias y %)
Percepcion Frecuencia_Barrio Frecuencia_Ciudad Frecuencia_Comuna Porcentaje_Barrio Porcentaje_Ciudad Porcentaje_Comuna
Muy seguro 484 193 347 10.4 4.1 7.4
Seguro 3426 2029 3363 73.3 43.4 72.0
Inseguro 642 1923 773 13.7 41.2 16.5
Muy inseguro 121 528 190 2.6 11.3 4.1
ggplot(tab_seg,
       aes(x    = Percepcion,
           y    = Porcentaje,
           fill = Ambito)) +
  geom_col(position = "dodge") +
  geom_text(aes(label = paste0(round(Porcentaje, 1), "%")),
            position = position_dodge(width = 0.9),
            vjust = -0.4, size = 2.8) +
  scale_fill_manual(values = c("#4361EE","#F72585","#4CC9F0")) +
  labs(title = "Percepcion de seguridad por ambito",
       x     = "Percepcion",
       y     = "Porcentaje (%)",
       fill  = "Ambito") +
  theme_minimal(base_size = 11)
Figura 7. Percepcion de seguridad por ambito.

Figura 7. Percepcion de seguridad por ambito.

Como se puede observar en la Figura 7 y Tabla 7, la sensación de “Seguro” predomina tanto en el barrio como en la comuna. Sin embargo, la percepción de seguridad disminuye a medida que el ámbito se amplía: en la ciudad, la proporción de encuestados que se sienten “Inseguros” o “Muy inseguros” es notablemente mayor que en el barrio y la comuna, sugiriendo que los ciudadanos perciben su entorno más inmediato como más seguro que la ciudad en su conjunto.


4 Percepción de seguridad según género y estrato (Punto c)

4.1 Percepción por género

# Barrio (P1) por genero
tab_gen_seg <- df %>%
  filter(!is.na(P1_LBL), !is.na(GENERO_LBL)) %>%
  count(GENERO_LBL, P1_LBL) %>%
  group_by(GENERO_LBL) %>%
  mutate(Porcentaje = n / sum(n) * 100) %>%
  ungroup()

tab_gen_seg %>%
  select(Genero = GENERO_LBL, Percepcion = P1_LBL,
         Frecuencia = n, Porcentaje) %>%
  kable(caption = "Tabla 8. Percepcion de seguridad en el barrio por genero",
        digits  = 1) %>%
  kable_styling(bootstrap_options = c("striped","hover","condensed"),
                full_width = FALSE)
Tabla 8. Percepcion de seguridad en el barrio por genero
Genero Percepcion Frecuencia Porcentaje
Masculino Muy seguro 277 12.1
Masculino Seguro 1686 73.6
Masculino Inseguro 283 12.4
Masculino Muy inseguro 44 1.9
Femenino Muy seguro 207 8.7
Femenino Seguro 1740 73.0
Femenino Inseguro 359 15.1
Femenino Muy inseguro 77 3.2
ggplot(tab_gen_seg,
       aes(x = P1_LBL, y = Porcentaje, fill = GENERO_LBL)) +
  geom_col(position = "dodge") +
  geom_text(aes(label = paste0(round(Porcentaje,1),"%")),
            position = position_dodge(0.9), vjust = -0.4, size = 3) +
  scale_fill_manual(values = c("#3A86FF","#FF006E"),
                    name = "Genero") +
  labs(title = "Percepcion de seguridad en el barrio segun genero",
       x = "Percepcion", y = "Porcentaje (%)") +
  theme_minimal(base_size = 11)
Figura 8. Percepcion de seguridad en el barrio segun genero.

Figura 8. Percepcion de seguridad en el barrio segun genero.

# Ciudad (P5) por genero
tab_gen_ciu <- df %>%
  filter(!is.na(P5_LBL), !is.na(GENERO_LBL)) %>%
  count(GENERO_LBL, P5_LBL) %>%
  group_by(GENERO_LBL) %>%
  mutate(Porcentaje = n / sum(n) * 100) %>%
  ungroup()

tab_gen_ciu %>%
   select(Genero = GENERO_LBL, Percepcion = P5_LBL,
         Frecuencia = n, Porcentaje) %>%
  kable(caption = "Tabla 9. Percepcion de seguridad en la ciudad por genero",
        digits  = 1) %>%
  kable_styling(bootstrap_options = c("striped","hover","condensed"),
                full_width = FALSE)
Tabla 9. Percepcion de seguridad en la ciudad por genero
Genero Percepcion Frecuencia Porcentaje
Masculino Muy seguro 104 4.5
Masculino Seguro 1086 47.4
Masculino Inseguro 894 39.0
Masculino Muy inseguro 206 9.0
Femenino Muy seguro 89 3.7
Femenino Seguro 943 39.6
Femenino Inseguro 1029 43.2
Femenino Muy inseguro 322 13.5
ggplot(tab_gen_ciu,
       aes(x = P5_LBL, y = Porcentaje, fill = GENERO_LBL)) +
  geom_col(position = "dodge") +
  geom_text(aes(label = paste0(round(Porcentaje,1),"%")),
            position = position_dodge(0.9), vjust = -0.4, size = 3) +
  scale_fill_manual(values = c("#3A86FF","#FF006E"),
                    name = "Genero") +
  labs(title = "Percepcion de seguridad en la ciudad segun genero",
       x = "Percepcion", y = "Porcentaje (%)") +
  theme_minimal(base_size = 11)
Figura 9. Percepcion de seguridad en la ciudad segun genero.

Figura 9. Percepcion de seguridad en la ciudad segun genero.

En las Figuras 8 y 9 se observa que las mujeres tienden a reportar una mayor percepción de inseguridad que los hombres, tanto en el barrio como en la ciudad. Esto es consistente con evidencia empírica que documenta que las mujeres experimentan el espacio público de manera distinta, asociada a factores como el acoso y la violencia de género.

4.2 Percepción por estrato socioeconómico

tab_est_seg <- df %>%
  filter(!is.na(P1_LBL),
         !is.na(ESTRATO_LBL),
         ESTRATO_LBL != "Sin estrato") %>%
  count(ESTRATO_LBL, P1_LBL) %>%
  group_by(ESTRATO_LBL) %>%
  mutate(Porcentaje = n / sum(n) * 100) %>%
  ungroup()

tab_est_seg %>%
  select(Estrato = ESTRATO_LBL, Percepcion = P1_LBL,
         Frecuencia = n, Porcentaje) %>%
  kable(caption = "Tabla 10. Percepcion de seguridad en el barrio por estrato",
        digits  = 1) %>%
  kable_styling(bootstrap_options = c("striped","hover","condensed"),
                full_width = FALSE) %>%
  scroll_box(height = "300px")
Tabla 10. Percepcion de seguridad en el barrio por estrato
Estrato Percepcion Frecuencia Porcentaje
Estrato 1 Muy seguro 63 8.4
Estrato 1 Seguro 580 77.0
Estrato 1 Inseguro 100 13.3
Estrato 1 Muy inseguro 10 1.3
Estrato 2 Muy seguro 228 11.3
Estrato 2 Seguro 1516 74.8
Estrato 2 Inseguro 241 11.9
Estrato 2 Muy inseguro 41 2.0
Estrato 3 Muy seguro 126 9.8
Estrato 3 Seguro 887 69.2
Estrato 3 Inseguro 222 17.3
Estrato 3 Muy inseguro 47 3.7
Estrato 4 Muy seguro 9 6.4
Estrato 4 Seguro 98 69.5
Estrato 4 Inseguro 26 18.4
Estrato 4 Muy inseguro 8 5.7
Estrato 5 Muy seguro 6 7.3
Estrato 5 Seguro 51 62.2
Estrato 5 Inseguro 19 23.2
Estrato 5 Muy inseguro 6 7.3
Estrato 6 Muy seguro 1 33.3
Estrato 6 Seguro 2 66.7
ggplot(tab_est_seg,
       aes(x = ESTRATO_LBL, y = Porcentaje, fill = P1_LBL)) +
  geom_col(position = "fill") +
  scale_y_continuous(labels = percent_format()) +
  scale_fill_brewer(palette = "RdYlGn", direction = -1,
                    name = "Percepcion") +
  labs(title    = "Percepcion de seguridad en el barrio segun estrato",
       subtitle = "Grafico de barras apiladas al 100%",
       x = "Estrato", y = "Proporcion") +
  theme_minimal(base_size = 11) +
  theme(axis.text.x = element_text(angle = 20, hjust = 1))
Figura 10. Percepcion de seguridad en el barrio segun estrato.

Figura 10. Percepcion de seguridad en el barrio segun estrato.

Interpretación – En la Figura 10 y Tabla 10 se puede observar que la percepción de seguridad varía notablemente según el estrato: los estratos bajos (1 y 2) muestran una mayor proporción de respuestas “Inseguro” y “Muy inseguro”, mientras que en los estratos medios y altos (4, 5 y 6) predomina la percepción de “Seguro”. Esto sugiere una desigualdad territorial en las condiciones de seguridad percibida.


5 Índice de Victimización (Punto d)

El Índice de Victimización mide la proporción ponderada de hogares que han sido víctimas de al menos uno de los siguientes delitos: hurto a personas, hurto a residencias, hurto a establecimientos comerciales, hurto de vehículos o extorsiones/vacunas (P20A = 1, 2, 3, 4 o 6). Su fórmula es:

\[\text{Índice de Victimización} = \frac{\sum_{i=1}^{4{,}673} \mathbf{1}(P20A_i = 1) \times w_i}{\sum_{i=1}^{4{,}673} w_i}\]

donde \(w_i\) es el factor de ponderación (FACTOR) del hogar \(i\).

5.1 Índice para la ciudad Castellana

# Construir indicador de victimizacion
# P20A = 1 (hurto personas), 2 (residencias), 3 (establecimientos),
#          4 (vehiculos), 6 (extorsiones/vacunas)
delitos_victimizacion <- c(1, 2, 3, 4, 6)

df <- df %>%
  mutate(
    VICTIMA = if_else(P20A %in% delitos_victimizacion, 1L, 0L)
  )

indice_ciudad <- sum(df$VICTIMA * df$FACTOR, na.rm = TRUE) /
                 sum(df$FACTOR,                na.rm = TRUE)

cat(sprintf("Indice de Victimizacion – Ciudad Castellana: %.4f (%.2f%%)\n",
            indice_ciudad, indice_ciudad * 100))
## Indice de Victimizacion – Ciudad Castellana: 0.1996 (19.96%)

El índice de victimización para la ciudad Castellana es de aproximadamente 19.96%, lo que significa que cerca de ese porcentaje de los hogares han sido víctimas de al menos uno de los delitos considerados.

5.2 Índice de victimización por comunas

indice_comunas <- df %>%
  group_by(COMUNA) %>%
  summarise(
    Victimas_pond   = sum(VICTIMA * FACTOR, na.rm = TRUE),
    Total_pond      = sum(FACTOR,           na.rm = TRUE),
    Indice          = Victimas_pond / Total_pond,
    .groups = "drop"
  ) %>%
  arrange(desc(Indice)) %>%
  mutate(
    Porcentaje = Indice * 100,
    Rango      = row_number()
  )

indice_comunas %>%
  select(Rango, COMUNA, `Indice` = Indice, `Porcentaje (%)` = Porcentaje) %>%
  kable(caption = "Tabla 11. Indice de Victimizacion por comuna",
        digits  = 4) %>%
  kable_styling(bootstrap_options = c("striped","hover","condensed"),
                full_width = FALSE) %>%
  row_spec(1, bold = TRUE, color = "white", background = "#d62828") %>%
  row_spec(nrow(indice_comunas), bold = TRUE, color = "white",
           background = "#2d6a4f")
Tabla 11. Indice de Victimizacion por comuna
Rango COMUNA Indice Porcentaje (%)
1 5 0.2757 27.5735
2 7 0.2344 23.4415
3 60 0.2295 22.9498
4 4 0.2252 22.5247
5 8 0.2157 21.5679
6 13 0.2079 20.7877
7 16 0.2078 20.7770
8 3 0.2052 20.5160
9 2 0.1968 19.6810
10 9 0.1890 18.8964
11 1 0.1818 18.1827
12 10 0.1800 18.0033
13 80 0.1698 16.9776
14 12 0.1512 15.1208
15 90 0.1428 14.2799
16 6 0.1376 13.7626
17 11 0.1314 13.1406
18 70 0.1271 12.7091
19 15 0.1128 11.2756
20 50 0.0000 0.0000
ggplot(indice_comunas,
       aes(x    = reorder(factor(COMUNA), Porcentaje),
           y    = Porcentaje,
           fill = Porcentaje)) +
  geom_col() +
  geom_text(aes(label = paste0(round(Porcentaje, 1), "%")),
            hjust = -0.15, size = 3) +
  scale_fill_gradient(low = "#a8dadc", high = "#e63946",
                      name = "% Victimas") +
  coord_flip() +
  labs(title    = "Indice de Victimizacion por comuna",
       subtitle = "Ciudad Castellana",
       x        = "Comuna",
       y        = "Indice de Victimizacion (%)") +
  theme_minimal(base_size = 11)
Figura 11. Indice de victimizacion por comuna.

Figura 11. Indice de victimizacion por comuna.

comuna_max <- indice_comunas %>% slice_max(Indice, n = 1)
comuna_min <- indice_comunas %>% slice_min(Indice, n = 1)

cat(sprintf(">> Comuna con MAYOR indice de victimizacion: Comuna %s (%.2f%%)\n",
            comuna_max$COMUNA, comuna_max$Porcentaje))
## >> Comuna con MAYOR indice de victimizacion: Comuna 5 (27.57%)
cat(sprintf(">> Comuna con MENOR indice de victimizacion: Comuna %s (%.2f%%)\n",
            comuna_min$COMUNA, comuna_min$Porcentaje))
## >> Comuna con MENOR indice de victimizacion: Comuna 50 (0.00%)

Se puede identificar en Figura 11 el índice de victimización varía considerablemente entre comunas. La Comuna 5 registra el mayor nivel (27.57%), lo que la identifica como el territorio con mayor proporción ponderada de hogares victimizados. En contraste, la Comuna 50 presenta el índice más bajo (0.00%), sugiriendo condiciones de seguridad relativamente mejores. Estas diferencias intermunicipales apuntan a la necesidad de focalizar políticas de seguridad ciudadana en las comunas con mayor victimización.*


Fuente: Encuesta de Seguridad, Convivencia Ciudadana y Confianza Institucional – Ciudad Castellana.