Los archivos BD1.csv y BD2_reducida.csv
deben estar guardados en la misma carpeta que este archivo
.Rmd.
ruta <- "."
bd1 <- readr::read_csv(file.path(ruta, "BD1.csv"), show_col_types = FALSE)
bd2 <- readr::read_csv(file.path(ruta, "BD2_reducida.csv"), show_col_types = FALSE)
dim(bd1)
## [1] 4673 14
dim(bd2)
## [1] 4673 9
COMUNA, GENERO, EDAD_RANGO,
PC_EDAD, ESTRATO_DEC, PD).P1 a
P6, P20A y FACTOR).REGISTRO.# Verificar que REGISTRO no esté duplicado en ninguna base
stopifnot(!anyDuplicated(bd1$REGISTRO))
stopifnot(!anyDuplicated(bd2$REGISTRO))
# Seleccionar explícitamente las variables que se necesitan de BD2
bd2_sel <- bd2 %>%
select(REGISTRO, P1, P2, P3, P4, P5, P6, P20A, FACTOR)
# Unir las bases
base <- left_join(bd1, bd2_sel, by = "REGISTRO")
# Verificaciones de la unión
nrow(base)
## [1] 4673
sum(is.na(base$FACTOR))
## [1] 0
niv_seg <- c("Muy seguro", "Seguro", "Inseguro", "Muy inseguro")
niv_cam <- c("Más seguro", "Menos seguro", "Igual", "NS/NR")
base <- base %>%
mutate(
genero = factor(
GENERO,
levels = 1:2,
labels = c("Masculino", "Femenino")
),
estrato = factor(
ESTRATO_DEC,
levels = 1:7,
labels = c(paste("Estrato", 1:6), "Sin estrato")
),
edad_rango = 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"
)
),
ocupacion = case_when(
PD == 1 ~ "Empleado/a asalariado/a",
PD == 2 ~ "Independiente/propietario/a",
PD == 3 ~ "Retirado/a o jubilado/a",
PD == 4 ~ "Desempleado/a",
PD == 5 ~ "Ama/o de casa",
PD == 6 ~ "Estudiante",
TRUE ~ "Otras/Sin dato"
),
ocupacion = factor(ocupacion),
comuna = factor(COMUNA),
seg_barrio = factor(P1, levels = 1:4, labels = niv_seg),
seg_comuna = factor(P3, levels = 1:4, labels = niv_seg),
seg_ciudad = factor(P5, levels = 1:4, labels = niv_seg),
cam_barrio = factor(if_else(P2 == 999, 4, P2), levels = 1:4, labels = niv_cam),
cam_comuna = factor(if_else(P4 == 999, 4, P4), levels = 1:4, labels = niv_cam),
cam_ciudad = factor(if_else(P6 == 999, 4, P6), levels = 1:4, labels = niv_cam),
# Mantener como NA los registros sin respuesta en P20A.
# Así no se clasifican automáticamente como hogares no victimizados.
victima = case_when(
is.na(P20A) ~ NA_real_,
P20A %in% c(1, 2, 3, 4, 6) ~ 1,
TRUE ~ 0
)
)
faltantes <- base %>%
select(
genero, estrato, edad_rango, PC_EDAD, ocupacion,
comuna, P1, P3, P5, P20A, FACTOR
) %>%
summarise(across(everything(), ~ sum(is.na(.)))) %>%
pivot_longer(
everything(),
names_to = "Variable",
values_to = "Faltantes"
) %>%
mutate(
Porcentaje = percent(Faltantes / nrow(base), accuracy = 0.1)
)
tabla_kable(
faltantes,
"Tabla 1. Valores faltantes en las variables utilizadas"
)
| Variable | Faltantes | Porcentaje |
|---|---|---|
| genero | 0 | 0.0% |
| estrato | 0 | 0.0% |
| edad_rango | 0 | 0.0% |
| PC_EDAD | 8 | 0.2% |
| ocupacion | 0 | 0.0% |
| comuna | 0 | 0.0% |
| P1 | 0 | 0.0% |
| P3 | 0 | 0.0% |
| P5 | 0 | 0.0% |
| P20A | 0 | 0.0% |
| FACTOR | 0 | 0.0% |
Fuente: BD1 y BD2. Cálculos propios.
# Crear el diseño muestral
diseno <- survey::svydesign(
ids = ~1,
weights = ~FACTOR,
data = base
)
percepcion <- base %>%
select(
FACTOR,
Barrio = seg_barrio,
Comuna = seg_comuna,
Ciudad = seg_ciudad
) %>%
pivot_longer(
cols = c(Barrio, Comuna, Ciudad),
names_to = "ambito",
values_to = "nivel"
) %>%
filter(!is.na(nivel), !is.na(FACTOR)) %>%
mutate(
ambito = factor(
ambito,
levels = c("Barrio", "Comuna", "Ciudad")
)
) %>%
group_by(ambito, nivel) %>%
summarise(pob = sum(FACTOR), .groups = "drop") %>%
group_by(ambito) %>%
mutate(p = pob / sum(pob)) %>%
ungroup()
tab_perc <- percepcion %>%
select(ambito, nivel, p) %>%
mutate(p = percent(p, accuracy = 0.1)) %>%
pivot_wider(names_from = ambito, values_from = p)
tabla_kable(
tab_perc,
"Tabla 6. Percepción de seguridad según ámbito (ponderada)"
)
| nivel | Barrio | Comuna | Ciudad |
|---|---|---|---|
| Muy seguro | 10.8% | 8.2% | 4.3% |
| Seguro | 72.2% | 70.4% | 44.9% |
| Inseguro | 13.6% | 16.9% | 40.2% |
| Muy inseguro | 3.4% | 4.5% | 10.6% |
Fuente: BD2, preguntas P1, P3 y P5. Cálculos propios con factor de expansión.
inseguro <- percepcion %>%
filter(nivel %in% c("Inseguro", "Muy inseguro")) %>%
group_by(ambito) %>%
summarise(p = sum(p), .groups = "drop") %>%
arrange(ambito)
tabla_kable(
inseguro %>% mutate(Porcentaje = percent(p, accuracy = 0.1)),
"Tabla 6A. Porcentaje de percepción de inseguridad por ámbito"
)
| ambito | p | Porcentaje |
|---|---|---|
| Barrio | 0,1703150 | 17.0% |
| Comuna | 0,2140448 | 21.4% |
| Ciudad | 0,5079558 | 50.8% |
El porcentaje que se siente inseguro o muy inseguro es de 17.0% en el barrio, 21.4% en la comuna y 50.8% en la ciudad.
ggplot(percepcion, aes(x = ambito, y = p, fill = nivel)) +
geom_col() +
geom_text(
aes(label = percent(p, accuracy = 1)),
position = position_stack(vjust = 0.5),
size = 3.5,
colour = "white"
) +
scale_y_continuous(labels = percent) +
scale_fill_manual(
values = c(
"Muy seguro" = "#1B7837",
"Seguro" = "#7FBF7B",
"Inseguro" = "#F4A582",
"Muy inseguro" = "#B2182B"
)
) +
labs(
x = NULL,
y = "Porcentaje de la población",
fill = NULL,
caption = "Fuente: BD2, P1, P3 y P5. Cálculos propios con factor de expansión."
) +
theme_minimal()
Gráfico 3. Percepción de seguridad según ámbito (ponderada)
cambio <- base %>%
select(
FACTOR,
Barrio = cam_barrio,
Comuna = cam_comuna,
Ciudad = cam_ciudad
) %>%
pivot_longer(
cols = c(Barrio, Comuna, Ciudad),
names_to = "ambito",
values_to = "nivel"
) %>%
filter(!is.na(nivel), !is.na(FACTOR)) %>%
mutate(
ambito = factor(
ambito,
levels = c("Barrio", "Comuna", "Ciudad")
)
) %>%
group_by(ambito, nivel) %>%
summarise(pob = sum(FACTOR), .groups = "drop") %>%
group_by(ambito) %>%
mutate(p = pob / sum(pob)) %>%
ungroup()
tab_cambio <- cambio %>%
select(ambito, nivel, p) %>%
mutate(p = percent(p, accuracy = 0.1)) %>%
pivot_wider(names_from = ambito, values_from = p)
tabla_kable(
tab_cambio,
"Tabla 7. Percepción de seguridad frente a hace un año (ponderada)"
)
| nivel | Barrio | Comuna | Ciudad |
|---|---|---|---|
| Más seguro | 15.7% | 14.1% | 9.8% |
| Menos seguro | 13.8% | 11.9% | 23.4% |
| Igual | 70.3% | 68.1% | 64.8% |
| NS/NR | 0.2% | 6.0% | 2.0% |
Fuente: BD2, preguntas P2, P4 y P6. Cálculos propios con factor de expansión.
La percepción de seguridad empeora a medida que el ámbito se aleja del hogar. El 83,0 % de los encuestados se siente seguro o muy seguro en su barrio y el 78,6 % en su comuna, pero solo el 49,2 % en la ciudad (Tabla 6 y Gráfico 3). Así, el porcentaje que se siente inseguro o muy inseguro es 17,0 % en el barrio, 21,4 % en la comuna y 50,8 % en la ciudad (Tabla 6A). En comparación con hace un año, la mayoría percibe que todo sigue igual, pero en la ciudad el 23,4 % cree que está menos seguro y solo el 9,8 % más seguro. En el barrio y la comuna las opiniones están más equilibradas (Tabla 7)
Se compara el porcentaje que se siente inseguro o muy inseguro (códigos 3 y 4), según género y estrato.
perc_largo <- base %>%
select(
FACTOR, genero, estrato,
Barrio = P1,
Comuna = P3,
Ciudad = P5
) %>%
pivot_longer(
cols = c(Barrio, Comuna, Ciudad),
names_to = "ambito",
values_to = "codigo"
) %>%
filter(!is.na(codigo), !is.na(FACTOR)) %>%
mutate(
ambito = factor(
ambito,
levels = c("Barrio", "Comuna", "Ciudad")
),
inseguro = codigo >= 3
)
por_genero <- perc_largo %>%
filter(!is.na(genero)) %>%
group_by(ambito, genero) %>%
summarise(
p = sum(FACTOR * inseguro) / sum(FACTOR),
.groups = "drop"
)
tab_genero_inseg <- por_genero %>%
mutate(p = percent(p, accuracy = 0.1)) %>%
pivot_wider(names_from = genero, values_from = p)
tabla_kable(
tab_genero_inseg,
"Tabla 8. Porcentaje que se siente inseguro o muy inseguro, según género"
)
| ambito | Masculino | Femenino |
|---|---|---|
| Barrio | 13.1% | 20.4% |
| Comuna | 18.0% | 24.3% |
| Ciudad | 43.4% | 57.1% |
Fuente: BD2, P1, P3 y P5. Cálculos propios con factor de expansión.
ggplot(por_genero, aes(x = ambito, y = p, fill = genero)) +
geom_col(position = "dodge") +
geom_text(
aes(label = percent(p, accuracy = 0.1)),
position = position_dodge(width = 0.9),
vjust = -0.4,
size = 3.5
) +
scale_y_continuous(
labels = percent,
expand = expansion(mult = c(0, 0.12))
) +
scale_fill_manual(values = c("#003A5D", "#F5A800")) +
labs(
x = NULL,
y = "% inseguro o muy inseguro",
fill = "Género",
caption = "Fuente: BD2, P1, P3 y P5. Cálculos propios con factor de expansión."
) +
theme_minimal()
Gráfico 4. Inseguridad percibida según género y ámbito
por_estrato <- perc_largo %>%
filter(!is.na(estrato), estrato != "Sin estrato") %>%
group_by(ambito, estrato) %>%
summarise(
p = sum(FACTOR * inseguro) / sum(FACTOR),
.groups = "drop"
)
tab_estrato_inseg <- por_estrato %>%
mutate(p = percent(p, accuracy = 0.1)) %>%
pivot_wider(names_from = ambito, values_from = p)
tabla_kable(
tab_estrato_inseg,
"Tabla 9. Porcentaje que se siente inseguro o muy inseguro, según estrato"
)
| estrato | Barrio | Comuna | Ciudad |
|---|---|---|---|
| Estrato 1 | 16.7% | 19.3% | 45.8% |
| Estrato 2 | 14.1% | 18.9% | 48.8% |
| Estrato 3 | 19.7% | 23.8% | 55.5% |
| Estrato 4 | 29.1% | 35.5% | 64.2% |
| Estrato 5 | 40.0% | 44.5% | 58.9% |
| Estrato 6 | 0.0% | 31.9% | 42.1% |
Fuente: BD2, P1, P3 y P5. Cálculos propios con factor de expansión. Se excluye “Sin estrato”.
ggplot(por_estrato, aes(x = estrato, y = p, fill = ambito)) +
geom_col(position = "dodge") +
scale_y_continuous(labels = percent) +
scale_fill_manual(values = c("#003A5D", "#5B9BD5", "#F5A800")) +
labs(
x = NULL,
y = "% inseguro o muy inseguro",
fill = "Ámbito",
caption = "Fuente: BD2, P1, P3 y P5. Cálculos propios con factor de expansión."
) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
Gráfico 5. Inseguridad percibida según estrato y ámbito
Se incorporan las variables al diseño muestral y se prueba la independencia entre la inseguridad percibida y el género y el estrato (Tabla 10).
diseno <- update(
diseno,
genero = base$genero,
estrato = base$estrato,
insegBarrio = ifelse(is.na(base$P1), NA, base$P1 >= 3),
insegComuna = ifelse(is.na(base$P3), NA, base$P3 >= 3),
insegCiudad = ifelse(is.na(base$P5), NA, base$P5 >= 3)
)
p_valores <- c(
survey::svychisq(~insegBarrio + genero, diseno)$p.value,
survey::svychisq(~insegComuna + genero, diseno)$p.value,
survey::svychisq(~insegCiudad + genero, diseno)$p.value,
survey::svychisq(~insegBarrio + estrato, diseno)$p.value,
survey::svychisq(~insegComuna + estrato, diseno)$p.value,
survey::svychisq(~insegCiudad + estrato, diseno)$p.value
)
tab_chi <- tibble(
Variable = rep(c("Género", "Estrato"), each = 3),
Ámbito = rep(c("Barrio", "Comuna", "Ciudad"), 2),
`Valor p` = round(p_valores, 4),
Conclusión = ifelse(p_valores < 0.05,
"Hay asociación (p < 0,05)",
"No hay evidencia de asociación")
)
tabla_kable(tab_chi, "Tabla 10. Pruebas chi-cuadrado ajustadas por diseño")
| Variable | Ámbito | Valor p | Conclusión |
|---|---|---|---|
| Género | Barrio | 0,0001 | Hay asociación (p < 0,05) |
| Género | Comuna | 0,0012 | Hay asociación (p < 0,05) |
| Género | Ciudad | 0,0000 | Hay asociación (p < 0,05) |
| Estrato | Barrio | 0,0014 | Hay asociación (p < 0,05) |
| Estrato | Comuna | 0,0007 | Hay asociación (p < 0,05) |
| Estrato | Ciudad | 0,0127 | Hay asociación (p < 0,05) |
Fuente: BD2. Cálculos propios con factor de expansión.
Sí cambia la percepción según el género. En los tres ámbitos las mujeres se sienten más inseguras que los hombres: 20,4 % frente a 13,1 % en el barrio, 24,3 % frente a 18,0 % en la comuna y 57,1 % frente a 43,4 % en la ciudad (Tabla 8 y Gráfico 4). La diferencia es mayor en la ciudad, con 13,7 puntos porcentuales. La prueba chi-cuadrado ajustada por diseño confirma que la asociación es significativa en los tres ámbitos (p < 0,05; Tabla 10).
También cambia según el estrato. La inseguridad percibida es más alta en los estratos 3, 4 y 5 que en los estratos 1 y 2. Por ejemplo, en el barrio pasa de 14,1 % en el estrato 2 a 40,0 % en el estrato 5, y en la ciudad el máximo es 64,2 % en el estrato 4 (Tabla 9 y Gráfico 5). Las pruebas chi-cuadrado indican asociación significativa en los tres ámbitos (Tabla 10), aunque en la ciudad es la más débil (p = 0,0127). El estrato 6 no se interpreta porque tiene solo 3 encuestas. Estas pruebas muestran que existe asociación, pero no su magnitud ni una relación de causa y efecto.
Se considera víctima si P20A toma los valores 1, 2, 3, 4
o 6. Los registros sin respuesta en P20A se excluyen del
numerador y del denominador.
# Proporción ponderada, excluyendo respuestas faltantes
base_victimas <- base %>%
filter(!is.na(victima), !is.na(FACTOR), is.finite(FACTOR))
indice_ciudad <- with(
base_victimas,
sum(victima * FACTOR) / sum(FACTOR)
)
# Intervalo de confianza al 95% con el diseño muestral
ic <- survey::svyciprop(
~I(victima == 1),
subset(diseno, !is.na(victima)),
method = "logit"
)
ic_95 <- confint(ic)
tabla_indice_ciudad <- tibble(
Indicador = "Índice de victimización - Ciudad",
Valor = percent(indice_ciudad, accuracy = 0.1),
`IC 95%` = paste0(
percent(ic_95[1], accuracy = 0.1),
" - ",
percent(ic_95[2], accuracy = 0.1)
)
)
tabla_kable(
tabla_indice_ciudad,
"Tabla 11. Índice de victimización de la ciudad"
)
| Indicador | Valor | IC 95% |
|---|---|---|
| Índice de victimización - Ciudad | 20.0% | 18.1% - 21.9% |
Fuente: BD2, P20A y FACTOR. Cálculos propios.
El índice de victimización de la ciudad es 20.0%.
indice_comuna <- base %>%
filter(!is.na(victima), !is.na(FACTOR), is.finite(FACTOR)) %>%
group_by(comuna) %>%
summarise(
Encuestas = n(),
Hogares_expandidos = sum(FACTOR),
Indice = sum(victima * FACTOR) / sum(FACTOR),
.groups = "drop"
) %>%
arrange(desc(Indice))
tabla_indice_comuna <- indice_comuna %>%
mutate(
Hogares_expandidos = round(Hogares_expandidos),
Indice = percent(Indice, accuracy = 0.1)
) %>%
rename(
Comuna = comuna,
`Hogares expandidos` = Hogares_expandidos,
`Índice de victimización` = Indice
)
tabla_kable(
tabla_indice_comuna,
"Tabla 12. Índice de victimización por comuna"
)
| Comuna | Encuestas | Hogares expandidos | Índice de victimización |
|---|---|---|---|
| 5 | 219 | 55.058 | 27.6% |
| 7 | 293 | 104.998 | 23.4% |
| 60 | 156 | 77.100 | 22.9% |
| 4 | 404 | 117.239 | 22.5% |
| 8 | 375 | 121.643 | 21.6% |
| 13 | 393 | 127.799 | 20.8% |
| 16 | 268 | 114.549 | 20.8% |
| 3 | 373 | 132.806 | 20.5% |
| 2 | 405 | 95.494 | 19.7% |
| 9 | 389 | 136.528 | 18.9% |
| 1 | 282 | 81.305 | 18.2% |
| 10 | 109 | 21.386 | 18.0% |
| 80 | 250 | 90.910 | 17.0% |
| 12 | 44 | 5.379 | 15.1% |
| 90 | 31 | 1.854 | 14.3% |
| 6 | 394 | 137.127 | 13.8% |
| 11 | 62 | 21.749 | 13.1% |
| 70 | 129 | 9.058 | 12.7% |
| 15 | 94 | 6.859 | 11.3% |
| 50 | 3 | 59 | 0.0% |
Fuente: BD1 y BD2. Cálculos propios con factor de expansión.
ggplot(
indice_comuna,
aes(x = reorder(comuna, Indice), y = Indice)
) +
geom_col(fill = "#003A5D") +
geom_hline(
yintercept = indice_ciudad,
linetype = "dashed",
colour = "#B2182B"
) +
geom_text(
aes(label = percent(Indice, accuracy = 0.1)),
hjust = -0.1,
size = 3
) +
coord_flip() +
scale_y_continuous(
labels = percent,
expand = expansion(mult = c(0, 0.15))
) +
labs(
x = "Comuna",
y = "Índice de victimización",
caption = "Línea punteada: índice de la ciudad. Fuente: BD1 y BD2."
) +
theme_minimal()
Gráfico 6. Índice de victimización por comuna
mayor <- indice_comuna %>%
slice_max(Indice, n = 1, with_ties = FALSE)
menor <- indice_comuna %>%
slice_min(Indice, n = 1, with_ties = FALSE)
menor_robusto <- indice_comuna %>%
filter(Encuestas >= 30) %>%
slice_min(Indice, n = 1, with_ties = FALSE)
El índice de victimización de la ciudad es 20,0 % (IC 95 %: 18,1 % a 21,9 %), es decir, aproximadamente uno de cada cinco hogares fue víctima de al menos un delito (Tabla 11). Por comunas, el índice más alto es el de la comuna 5, con 27,6 %, seguida de las comunas 7 (23,4 %) y 60 (22,9 %) (Tabla 12 y Gráfico 6). El índice más bajo aparece en la comuna 50 (0,0 %), pero se basa en solo 3 encuestas y no es confiable. Entre las comunas con al menos 30 encuestas, la más baja es la comuna 15, con 11,3 %
Perfil de la población: los hogares encuestados son mayoritariamente de estratos bajos (los estratos 1, 2 y 3 suman 85,5 %), con predominio de mujeres (54,1 %) y una edad promedio de 41.6 años. Las ocupaciones más frecuentes son ama/o de casa, empleado/a asalariado/a e independiente.
Percepción de seguridad: la sensación de inseguridad aumenta a medida que el ámbito se aleja del hogar. Es de 17,0 % en el barrio, 21,4 % en la comuna y 50,8 % en la ciudad. Además, en la ciudad el 23,4 % cree que la seguridad empeoró respecto a hace un año, frente a solo 9,8 % que cree que mejoró.
Diferencias por género y estrato: las mujeres se sienten más inseguras que los hombres en los tres ámbitos, con la mayor brecha en la ciudad (13,7 puntos porcentuales). La inseguridad percibida también es mayor en los estratos 3, 4 y 5 que en los estratos 1 y 2. Las pruebas chi-cuadrado ajustadas por diseño confirman que ambas asociaciones son significativas (p < 0,05), aunque no establecen causalidad.
Victimización: aproximadamente uno de cada cinco hogares (20,0 %; IC 95 %: 18,1 % a 21,9 %) fue víctima de al menos un delito. La comuna 5 tiene el índice más alto (27,6 %). El valor más bajo, de la comuna 50 (0,0 %), no es confiable porque se basa en solo 3 encuestas. Entre las comunas con muestra suficiente, la más baja es la comuna 15 (11,3 %).
Lectura conjunta: la percepción de inseguridad en la ciudad (50,8 %) es mucho mayor que la victimización efectivamente reportada (20,0 %). Esto sugiere que la sensación de inseguridad no depende solo de haber sido víctima de un delito, y que las políticas de seguridad deberían atender tanto los hechos delictivos como la percepción ciudadana, en especial la de las mujeres y la de los estratos medios.
Limitaciones: algunas categorías tienen muestras muy pequeñas (estrato 6 y comunas 50 y 90), por lo que sus resultados deben interpretarse con cautela. Las cifras corresponden a jefes de hogar encuestados, no a toda la población de la ciudad.