1 Introducción

El ejercicio utiliza dos bases de encuesta que deben combinarse mediante la variable REGISTRO, junto con un diccionario de datos. Cada registro corresponde a una encuesta realizada a un jefe de hogar. El propósito es caracterizar social y económicamente a la población, analizar la percepción de seguridad en el barrio, la comuna y la ciudad, y calcular un índice ponderado de victimización.

El análisis se desarrolla íntegramente en R y está diseñado para compilar tanto a HTML como a PDF. Las tablas y figuras se presentan con numeración, título, fuente y una interpretación en el texto.

2 Preparación de los datos

2.1 Carga de las bases y del diccionario

El archivo bases_diccionario.zip contiene BD1.xlsx, BD2.xlsx y DICCIONARIO_DATOS.xlsx. El siguiente bloque permite trabajar tanto si los archivos ya fueron extraídos como si solamente se encuentra disponible el archivo comprimido.

setwd("C:/Users/s12e13/Downloads/2. bases_diccionario")

bd1 <- read_excel("BD1.xlsx")
bd2 <- read_excel("BD2.xlsx")
dic_info <- read_excel("DICCIONARIO_DATOS.xlsx", sheet = "información_variables")
dic_valores <- read_excel("DICCIONARIO_DATOS.xlsx", sheet = "valores_variables")

# Verificamos que REGISTRO sea una llave única antes de unir las bases.
if (anyDuplicated(bd1$REGISTRO) > 0 || anyDuplicated(bd2$REGISTRO) > 0) {
  stop("REGISTRO no es único en alguna de las bases. Revise la llave antes de hacer el merge.")
}

base <- inner_join(bd1, bd2, by = "REGISTRO")

dim(base)
## [1] 4673  422

La base combinada queda con 4673 registros (encuestas) y 422 variables, resultado de unir BD1.xlsx (caracterización sociodemográfica) y BD2.xlsx (percepción de seguridad, victimización y confianza institucional) mediante la llave REGISTRO.

2.2 Recodificación de variables

De acuerdo con el diccionario, vamos a recodificar las variables principales para trabajar con etiquetas comprensibles en las tablas y gráficos que se presentan a lo largo del estudio.

base <- base %>%
  mutate(
    Genero = factor(GENERO,
                    levels = c(1, 2),
                    labels = c("Masculino", "Femenino")),
    RangoEdad = factor(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 más")),
    Estrato = factor(ESTRATO_DEC,
                     levels = c(1, 2, 3, 4, 5, 6, 7),
                     labels = c("Estrato 1", "Estrato 2", "Estrato 3", "Estrato 4",
                                "Estrato 5", "Estrato 6", "Sin estrato")),
    Ocupacion = factor(PD,
                       levels = c(1, 2, 3, 4, 5, 6, 10, 11, 77, 88, 99, 996),
                       labels = c("Empleado/asalariado",
                                  "Trabaja independiente/propietario",
                                  "Retirado/Jubilado",
                                  "Desempleado",
                                  "Ama de casa",
                                  "Estudiante",
                                  "Incapacitado/discapacitado",
                                  "Cuidado de familiares",
                                  "Otros(as)",
                                  "Ninguno/nada",
                                  "No responde",
                                  "Otro ¿Cuál?")),
    P1_lab = factor(P1, levels = 1:4,
                    labels = c("Muy seguro", "Seguro", "Inseguro", "Muy inseguro")),
    P3_lab = factor(P3, levels = 1:4,
                    labels = c("Muy seguro", "Seguro", "Inseguro", "Muy inseguro")),
    P5_lab = factor(P5, levels = 1:4,
                    labels = c("Muy seguro", "Seguro", "Inseguro", "Muy inseguro")),
    P2_lab = factor(P2, levels = c(1, 2, 3, 999),
                    labels = c("Más seguro", "Menos seguro", "Igual", "NS/NR")),
    P4_lab = factor(P4, levels = c(1, 2, 3, 999),
                    labels = c("Más seguro", "Menos seguro", "Igual", "NS/NR")),
    P6_lab = factor(P6, levels = c(1, 2, 3, 999),
                    labels = c("Más seguro", "Menos seguro", "Igual", "NS/NR"))
  )

3 Caracterización social y económica

En esta sección se describe a la población encuestada según género, rango de edad, estrato socioeconómico y ocupación, con el fin de entender la composición de la muestra antes de analizar percepción de seguridad y victimización.

3.1 Caracterización por género

tab_genero <- base %>%
  count(Genero) %>%
  mutate(Porcentaje = percent(n / sum(n), accuracy = 0.1))

tabla_dual(tab_genero, "Distribución de la muestra según género")
Distribución de la muestra según género
Genero n Porcentaje
Masculino 2290 49.0%
Femenino 2383 51.0%
ggplot(base, aes(x = Genero, fill = Genero)) +
  geom_bar() +
  geom_text(stat = "count", aes(label = after_stat(count)), vjust = -0.5) +
  labs(x = NULL, y = "Número de encuestados",
       caption = "Fuente: elaboración propia a partir de BD1 y BD2.") +
  theme(legend.position = "none")
Distribución de encuestados por género

Distribución de encuestados por género

Interpretación: la muestra está prácticamente equilibrada entre géneros: 2.383 mujeres (51,0%) y 2.290 hombres (49,0%). Este balance permite comparar con confianza la percepción de seguridad entre hombres y mujeres más adelante, sin que un género esté representado por gran mayoria.

3.2 Caracterización por rango de edad

tab_edad <- base %>%
  count(RangoEdad) %>%
  mutate(Porcentaje = percent(n / sum(n), accuracy = 0.1))

tabla_dual(tab_edad, "Distribución de la muestra según rango de edad")
Distribución de la muestra según rango de edad
RangoEdad n 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 más 772 16.5%
ggplot(base, aes(x = RangoEdad)) +
  geom_bar(fill = "#006400") +
  labs(x = "Rango de edad", y = "Número de encuestados",
       caption = "Fuente: elaboración propia a partir de BD1 y BD2.") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))
Distribución de encuestados por rango de edad

Distribución de encuestados por rango de edad

Interpretación: la muestra encuestada tiende a concentrarse en los rangos de mayor edad: el grupo de 67 años o más es el más numeroso (772 personas, 16,5%), seguido del rango 45-54 (681 personas, 14,6%) y de 60-66 (615 personas, 13,2%). En contraste, el rango más joven, 16-17 años, es el menos representado (112 personas, 2,4%). Esto sugiere una población encuestada relativamente envejecida.

3.3 Caracterización por estrato

tab_estrato <- base %>%
  count(Estrato) %>%
  mutate(Porcentaje = percent(n / sum(n), accuracy = 0.1))

tabla_dual(tab_estrato, "Distribución de la muestra según estrato socioeconómico")
Distribución de la muestra según estrato socioeconómico
Estrato n 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(base, aes(x = Estrato)) +
  geom_bar(fill = "#006400") +
  labs(x = "Estrato", y = "Número de encuestados",
       caption = "Fuente: elaboración propia a partir de BD1 y BD2.") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))
Distribución de encuestados por estrato

Distribución de encuestados por estrato

Interpretación: la mayoría de los hogares encuestados pertenece a estratos medios-bajos: el 43,4% está en Estrato 2 (2.026 hogares) y el 27,4% en Estrato 3 (1.282 hogares), es decir que entre ambos concentran el 70,8% de la muestra. Los estratos altos (5 y 6) son marginales, con apenas 1,8% y 0,1% respectivamente, y un 8,3% de los encuestados no reporta estrato.

3.4 Caracterización por ocupación

tab_ocup <- base %>%
  count(Ocupacion) %>%
  mutate(Porcentaje = percent(n / sum(n), accuracy = 0.1)) %>%
  arrange(desc(n))

tabla_dual(tab_ocup, "Distribución de la muestra según ocupación")
Distribución de la muestra según ocupación
Ocupacion n Porcentaje
Ama de casa 1343 28.7%
Empleado/asalariado 1123 24.0%
Trabaja independiente/propietario 1001 21.4%
Desempleado 427 9.1%
Retirado/Jubilado 360 7.7%
Estudiante 304 6.5%
Ninguno/nada 88 1.9%
Incapacitado/discapacitado 16 0.3%
Cuidado de familiares 6 0.1%
Otros(as) 4 0.1%
No responde 1 0.0%
ggplot(tab_ocup, aes(x = fct_reorder(Ocupacion, n), y = n)) +
  geom_col(fill = "#006400") +
  coord_flip() +
  labs(x = NULL, y = "Número de encuestados",
       caption = "Fuente: elaboración propia a partir de BD1 y BD2.")
Distribución de encuestados por ocupación

Distribución de encuestados por ocupación

Interpretación: la ocupación más frecuente entre los encuestados es “Ama de casa” (1.343 personas, 28,7%), seguida de “Empleado/asalariado” (1.123 personas, 24,0%) y “Trabaja independiente/propietario” (1.001 personas, 21,4%). Entre estas tres categorías se concentra el 74,1% de la muestra. Las categorías menos frecuentes son “Cuidado de familiares”, “Otros(as)” y “No responde”, cada una con menos del 0,2% de los casos.

4 Percepción de seguridad

En esta sección se analiza cómo se sienten los encuestados en su barrio (P1), su comuna (P3) y la ciudad en general (P5), y si esa percepción cambia según el género o el estrato del encuestado.

4.1 Percepción general por nivel geográfico

percepcion_larga <- base %>%
  select(P1_lab, P3_lab, P5_lab) %>%
  pivot_longer(everything(), names_to = "Nivel", values_to = "Percepcion") %>%
  mutate(Nivel = recode(Nivel, P1_lab = "Barrio", P3_lab = "Comuna", P5_lab = "Ciudad"),
         Nivel = factor(Nivel, levels = c("Barrio", "Comuna", "Ciudad")))

tab_percepcion <- percepcion_larga %>%
  filter(!is.na(Percepcion)) %>%
  count(Nivel, Percepcion) %>%
  group_by(Nivel) %>%
  mutate(Porcentaje = percent(n / sum(n), accuracy = 0.1)) %>%
  ungroup()

tabla_dual(tab_percepcion, "Percepción de seguridad por nivel geográfico (barrio, comuna, ciudad)")
Percepción de seguridad por nivel geográfico (barrio, comuna, ciudad)
Nivel Percepcion n Porcentaje
Barrio Muy seguro 484 10.4%
Barrio Seguro 3426 73.3%
Barrio Inseguro 642 13.7%
Barrio Muy inseguro 121 2.6%
Comuna Muy seguro 347 7.4%
Comuna Seguro 3363 72.0%
Comuna Inseguro 773 16.5%
Comuna Muy inseguro 190 4.1%
Ciudad Muy seguro 193 4.1%
Ciudad Seguro 2029 43.4%
Ciudad Inseguro 1923 41.2%
Ciudad Muy inseguro 528 11.3%
ggplot(percepcion_larga %>% filter(!is.na(Percepcion)),
       aes(x = Nivel, fill = Percepcion)) +
  geom_bar(position = "fill") +
  scale_y_continuous(labels = percent) +
  scale_fill_manual(values = colores_seguridad) +
  labs(x = NULL, y = "Porcentaje", fill = "Percepción",
       caption = "Fuente: elaboración propia a partir de BD1 y BD2.")
Percepción de seguridad: barrio, comuna y ciudad

Percepción de seguridad: barrio, comuna y ciudad

Interpretación: la percepción de inseguridad (suma de “Inseguro” y “Muy inseguro”) aumenta claramente entre más se aleja el encuestado de su entorno cercano: en el barrio es del 16,3%, en la comuna sube a 20,6% y en la ciudad se dispara a 52,5%. En otras palabras, más de la mitad de los encuestados se siente insegura en la ciudad en general, mientras que en su propio barrio la mayoría (83,7%) se siente segura o muy segura. Esto es consistente con el patrón habitual en encuestas de percepción de seguridad, donde el entorno cercano y conocido genera más confianza que el espacio urbano amplio.

4.2 Percepción de seguridad en el barrio según género

tab_perc_genero <- base %>%
  filter(!is.na(P1_lab)) %>%
  count(Genero, P1_lab) %>%
  group_by(Genero) %>%
  mutate(Porcentaje = percent(n / sum(n), accuracy = 0.1)) %>%
  ungroup()

tabla_dual(tab_perc_genero, "Percepción de seguridad en el barrio según género")
Percepción de seguridad en el barrio según género
Genero P1_lab n 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(base %>% filter(!is.na(P1_lab)), aes(x = Genero, fill = P1_lab)) +
  geom_bar(position = "fill") +
  scale_y_continuous(labels = percent) +
  scale_fill_manual(values = colores_seguridad) +
  labs(x = NULL, y = "Porcentaje", fill = "Percepción",
       caption = "Fuente: elaboración propia a partir de BD1 y BD2.")
Percepción de seguridad en el barrio por género

Percepción de seguridad en el barrio por género

Interpretación: las mujeres reportan una percepción de inseguridad en el barrio ligeramente mayor que los hombres: el 18,3% de las mujeres se siente “Inseguro” o “Muy inseguro” (15,1% + 3,2%), frente a 14,3% de los hombres (12,4% + 1,9%). Aunque la diferencia no es enorme, es consistente y muestra una mayor sensación de vulnerabilidad entre las mujeres encuestadas.

4.3 Percepción de seguridad en el barrio según estrato

tab_perc_estrato <- base %>%
  filter(!is.na(P1_lab)) %>%
  count(Estrato, P1_lab) %>%
  group_by(Estrato) %>%
  mutate(Porcentaje = percent(n / sum(n), accuracy = 0.1)) %>%
  ungroup()

tabla_dual(tab_perc_estrato, "Percepción de seguridad en el barrio según estrato")
Percepción de seguridad en el barrio según estrato
Estrato P1_lab n 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%
Sin estrato Muy seguro 51 13.2%
Sin estrato Seguro 292 75.6%
Sin estrato Inseguro 34 8.8%
Sin estrato Muy inseguro 9 2.3%
ggplot(base %>% filter(!is.na(P1_lab)), aes(x = Estrato, fill = P1_lab)) +
  geom_bar(position = "fill") +
  scale_y_continuous(labels = percent) +
  scale_fill_manual(values = colores_seguridad) +
  labs(x = NULL, y = "Porcentaje", fill = "Percepción",
       caption = "Fuente: elaboración propia a partir de BD1 y BD2.") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))
Percepción de seguridad en el barrio por estrato

Percepción de seguridad en el barrio por estrato

Interpretación: la percepción de inseguridad en el barrio (suma de “Inseguro” y “Muy inseguro”) tiende a aumentar a medida que sube el estrato: pasa de 14,6% en Estrato 1 y 13,9% en Estrato 2, a 21,0% en Estrato 3, 24,1% en Estrato 4 y 30,5% en Estrato 5. El Estrato 6 no es representativo por su tamaño de muestra tan pequeño (solo 3 encuestados). Este patrón —mayor percepción de inseguridad en estratos más altos— puede parecer contraintuitivo, pero es un hallazgo frecuente en este tipo de encuestas y suele asociarse a percepciones más exigentes de seguridad o a una menor habituación a ciertos riesgos del entorno urbano.

5 Índice de victimización

El índice de victimización identifica si un hogar ha sido víctima de por lo menos uno de los siguientes delitos: hurto a personas, hurto a residencias, hurto a establecimientos comerciales, hurto de vehículos o extorsiones/vacunas (pregunta P20A). Su fórmula, ponderada por el factor de expansión (FACTOR), es:

\[ \text{Índice de Victimización} = \frac{\sum_{i=1}^{4.673}\big(P20A_i \in \{\text{delitos considerados}\}\big) \times (\text{factor de ponderación}_i)}{\sum_{i=1}^{4.673}(\text{factor de ponderación}_i)} \]

# Delitos que cuentan como victimización (Hurto a personas, Hurto a
# residencias, Hurto a establecimientos comerciales, Hurto de vehículos,
# Extorsiones/Vacunas), según los códigos de P20A en el diccionario de datos.
delitos_victimizacion <- c(1, 2, 3, 4, 6)

base <- base %>%
  mutate(Victima = if_else(P20A %in% delitos_victimizacion, 1, 0))

# i. Índice para toda la ciudad
indice_ciudad <- base %>%
  summarise(
    Indice = sum(Victima * FACTOR, na.rm = TRUE) / sum(FACTOR, na.rm = TRUE)
  ) %>%
  mutate(Indice_pct = percent(Indice, accuracy = 0.1))

tabla_dual(indice_ciudad, "Índice de victimización - ciudad Castellana")
Índice de victimización - ciudad Castellana
Indice Indice_pct
0.2 20.0%

i. Índice de victimización para la ciudad Castellana: 20.0%. Esto significa que, ponderando por el factor de expansión, aproximadamente 1 de cada 5 hogares de la ciudad Castellana ha sido víctima de al menos uno de los delitos considerados (hurto a personas, hurto a residencias, hurto a establecimientos comerciales, hurto de vehículos o extorsión/vacuna).

# ii. Índice de victimización por comuna
indice_comuna <- base %>%
  group_by(COMUNA) %>%
  summarise(
    Indice = sum(Victima * FACTOR, na.rm = TRUE) / sum(FACTOR, na.rm = TRUE)
  ) %>%
  mutate(Indice_pct = percent(Indice, accuracy = 0.1)) %>%
  arrange(desc(Indice))

tabla_dual(indice_comuna, "Índice de victimización por comuna")
Índice de victimización por comuna
COMUNA Indice Indice_pct
5 0.28 27.6%
7 0.23 23.4%
60 0.23 22.9%
4 0.23 22.5%
8 0.22 21.6%
13 0.21 20.8%
16 0.21 20.8%
3 0.21 20.5%
2 0.20 19.7%
9 0.19 18.9%
1 0.18 18.2%
10 0.18 18.0%
80 0.17 17.0%
12 0.15 15.1%
90 0.14 14.3%
6 0.14 13.8%
11 0.13 13.1%
70 0.13 12.7%
15 0.11 11.3%
50 0.00 0.0%

ii. Índice de victimización por comunas: la tabla anterior está ordenada de mayor a menor. Se observa una dispersión considerable entre comunas: los valores van desde comunas con índices superiores al 27% hasta comunas por debajo del 13%, lo que indica que la victimización no se distribuye de forma homogénea en la ciudad Castellana.

ggplot(indice_comuna, aes(x = fct_reorder(as.factor(COMUNA), Indice), y = Indice)) +
  geom_col(fill = "#C0392B") +
  coord_flip() +
  scale_y_continuous(labels = percent) +
  labs(x = "Comuna", y = "Índice de victimización",
       caption = "Fuente: elaboración propia a partir de BD1 y BD2.")
Índice de victimización por comuna

Índice de victimización por comuna

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

iii. Comuna con mayor índice de victimización: la comuna 5, con un índice de 27.6%.

iv. Comuna con menor índice de victimización: la comuna 50, con un índice de 0.0%. Es importante señalar que esta comuna tiene muy pocos encuestados en la muestra, por lo que su índice debe interpretarse con cautela y no necesariamente refleja la situación real de victimización en esa zona.