El presente análisis tiene como objetivo caracterizar las condiciones socioeconómicas de la población, evaluar la percepción de seguridad en distintos niveles territoriales (barrio, comuna y ciudad) y construir un índice ponderado de victimización. Para ello, se integran dos fuentes de información sobre jefes de hogar mediante la llave única de identificación REGISTRO, complementadas con un diccionario de datos institucional.
Todo el procedimiento analítico se desarrolló de manera reproducible en R, estructurado para su compilación fluida en formatos HTML y PDF. La presentación de los resultados incluye tablas y figuras debidamente numeradas, tituladas y referenciadas, acompañadas de su correspondiente interpretación sintética.
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/s12e18/Downloads/Clase17_09_2026")
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
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"))
)
En esta sección se evalúa la percepción de seguridad de los
habitantes en tres escalas territoriales: el barrio (P1),
la comuna (P3) y la ciudad (P5), así como la
variación percibida en el último año (P2, P4,
P6).
# Consolidación de datos de percepción de seguridad
percepcion_resumen <- base %>%
select(P1_lab, P3_lab, P5_lab) %>%
pivot_longer(
cols = everything(),
names_to = "Nivel",
values_to = "Percepcion"
) %>%
filter(!is.na(Percepcion)) %>%
mutate(
Nivel = case_when(
Nivel == "P1_lab" ~ "Barrio",
Nivel == "P3_lab" ~ "Comuna",
Nivel == "P5_lab" ~ "Ciudad"
),
Nivel = factor(Nivel, levels = c("Barrio", "Comuna", "Ciudad"))
) %>%
group_by(Nivel, Percepcion) %>%
summarise(Conteo = n(), .groups = "drop_last") %>%
mutate(Porcentaje = round((Conteo / sum(Conteo)) * 100, 1))
# Tabla de frecuencias relativas
tabla_percepcion <- percepcion_resumen %>%
select(-Conteo) %>%
pivot_wider(names_from = Percepcion, values_from = Porcentaje, values_fill = 0)
tabla_dual(
tabla_percepcion,
titulo = "Tabla 4. Percepción de seguridad por nivel territorial (%)"
)
| Nivel | Muy seguro | Seguro | Inseguro | Muy inseguro |
|---|---|---|---|---|
| Barrio | 10.4 | 73.3 | 13.7 | 2.6 |
| Comuna | 7.4 | 72.0 | 16.5 | 4.1 |
| Ciudad | 4.1 | 43.4 | 41.2 | 11.3 |
# Paleta combinada y equilibrada para las 4 categorías
colores_percepcion <- c(
"Muy seguro" = "#000080", # Azul oscuro institucional
"Seguro" = "#B0E0E6", # Azul medio claro
"Inseguro" = "#FFEBCD", # Naranja / Coral
"Muy inseguro" = "#EE82EE" # Rojo borgoña
)
ggplot(percepcion_resumen, aes(x = Nivel, y = Porcentaje, fill = Percepcion)) +
geom_bar(stat = "identity", position = "fill", alpha = 0.9) +
scale_fill_manual(values = colores_percepcion) +
scale_y_continuous(labels = scales::percent) +
labs(
title = "Percepción de Seguridad según Nivel Territorial",
subtitle = "Comparación entre Barrio, Comuna y Ciudad",
x = "Nivel Territorial",
y = "Proporción (%)",
fill = "Percepción"
) +
theme_minimal(base_size = 11) +
theme(
plot.title = element_text(face = "bold", color = "#1F4E79"),
plot.subtitle = element_text(color = "gray30"),
legend.position = "right"
)
Figura 4. Comparativo de percepción de seguridad según nivel territorial
Interpretación de la percepción territorial
Existe un gradiente claro en la percepción de seguridad a medida que se amplía el entorno geográfico:
Barrio: Es el espacio donde los ciudadanos reportan los mayores niveles de seguridad (“Seguro” y “Muy seguro”), debido a la familiaridad con el entorno y las redes comunitarias directas.
Comuna y Ciudad: A medida que el análisis escala hacia la comuna y la ciudad, se observa un incremento progresivo en las categorías de “Inseguro” y “Muy inseguro”, siendo la ciudad el entorno percibido como más riesgoso por los encuestados.
# Consolidación de la evolución de la percepción (P2, P4, P6)
evolucion_resumen <- base %>%
select(P2_lab, P4_lab, P6_lab) %>%
pivot_longer(
cols = everything(),
names_to = "Nivel",
values_to = "Cambio"
) %>%
filter(!is.na(Cambio), Cambio != "NS/NR") %>%
mutate(
Nivel = case_when(
Nivel == "P2_lab" ~ "Barrio",
Nivel == "P4_lab" ~ "Comuna",
Nivel == "P6_lab" ~ "Ciudad"
),
Nivel = factor(Nivel, levels = c("Barrio", "Comuna", "Ciudad"))
) %>%
group_by(Nivel, Cambio) %>%
summarise(Conteo = n(), .groups = "drop_last") %>%
mutate(Porcentaje = round((Conteo / sum(Conteo)) * 100, 1))
# Gráfico de evolución
ggplot(evolucion_resumen, aes(x = Nivel, y = Porcentaje, fill = Cambio)) +
geom_bar(stat = "identity", position = "dodge", alpha = 0.85) +
geom_text(aes(label = paste0(Porcentaje, "%")),
position = position_dodge(width = 0.9), vjust = -0.5, size = 3) +
scale_fill_manual(values = c("Más seguro" = "#EE82EE", "Menos seguro" = "#8470FF", "Igual" = "#6495ED")) +
labs(
title = "Evolución de la Percepción de Seguridad en el Último Año",
x = "Nivel Territorial",
y = "Porcentaje (%)",
fill = "Cambio Percibido"
) +
scale_y_continuous(limits = c(0, max(evolucion_resumen$Porcentaje) + 10)) +
theme_minimal(base_size = 11) +
theme(plot.title = element_text(face = "bold", color = "#000000"))
Interpretación del cambio percibido
*La evaluación de la evolución de la seguridad refleja el deterioro generalizado en la percepción ciudadana a escala urbana, donde la opción “Menos seguro” predomina al calificar la ciudad, mientras que a nivel del barrio se mantiene una mayor proporción de estabilidad en la categoría “Igual”.
# Cálculo del índice de percepción de inseguridad individual
base <- base %>%
mutate(
score_p1 = case_when(P1 == 4 ~ 4, P1 == 3 ~ 3, P1 == 2 ~ 2, P1 == 1 ~ 1, TRUE ~ NA_real_),
score_p3 = case_when(P3 == 4 ~ 4, P3 == 3 ~ 3, P3 == 2 ~ 2, P3 == 1 ~ 1, TRUE ~ NA_real_),
score_p5 = case_when(P5 == 4 ~ 4, P5 == 3 ~ 3, P5 == 2 ~ 2, P5 == 1 ~ 1, TRUE ~ NA_real_),
# Índice promedio ponderado (escala de 1 a 4)
indice_inseguridad = (score_p1 * 0.2) + (score_p3 * 0.3) + (score_p5 * 0.5)
)
# Resumen estadístico del índice por Estrato
resumen_indice <- base %>%
filter(!is.na(Estrato), !is.na(indice_inseguridad)) %>%
group_by(Estrato) %>%
summarise(
`Promedio Índice` = round(mean(indice_inseguridad, na.rm = TRUE), 2),
`Desv. Estándar` = round(sd(indice_inseguridad, na.rm = TRUE), 2),
`Mediana` = round(median(indice_inseguridad, na.rm = TRUE), 2),
.groups = "drop"
)
tabla_dual(
resumen_indice,
titulo = "Tabla 5. Índice de percepción de inseguridad promedio según estrato socioeconómico"
)
| Estrato | Promedio Índice | Desv. Estándar | Mediana |
|---|---|---|---|
| Estrato 1 | 2.32 | 0.52 | 2.2 |
| Estrato 2 | 2.33 | 0.51 | 2.3 |
| Estrato 3 | 2.45 | 0.57 | 2.5 |
| Estrato 4 | 2.55 | 0.58 | 2.5 |
| Estrato 5 | 2.53 | 0.63 | 2.5 |
| Estrato 6 | 2.47 | 0.50 | 2.4 |
| Sin estrato | 2.26 | 0.51 | 2.0 |
ggplot(base %>% filter(!is.na(Estrato), !is.na(indice_inseguridad)),
aes(x = Estrato, y = indice_inseguridad, fill = Estrato)) +
geom_boxplot(alpha = 0.7, show.legend = FALSE) +
scale_fill_brewer(palette = "Blues") +
labs(
title = "Índice Ponderado de Inseguridad según Estrato Socioeconómico",
subtitle = "1 = Muy Seguro, 4 = Muy Inseguro",
x = "Estrato",
y = "Índice de Inseguridad"
) +
theme_minimal(base_size = 11) +
theme(
plot.title = element_text(face = "bold", color = "#262626"),
axis.text.x = element_text(angle = 30, hjust = 1)
)
Interpretación del Índice de Inseguridad
\[\text{Índice de Victimización} = \frac{\sum_{i=1}^{4673} (P20A_i = 1) \cdot (\text{factor de ponderación})}{\sum_{i=1}^{4673} (\text{factor de ponderación})}\]
# Nota: Asegúrate de verificar el nombre exacto de la variable del factor de expansión en tu base.
# Si en el diccionario se llama 'FACTOR_EXP' o 'FACTOR', ajusta la variable según corresponda.
# Asumiendo la variable P20A (1 = Ha sido víctima de al menos un delito, 2/0 = No)
# Asumiendo 'FACTOR' o 'FACTOR_EXP' como el factor de expansión:
base <- base %>%
mutate(
victima_dummy = ifelse(P20A == 1, 1, 0)
)
# Cálculo del índice global ponderado
# Si la columna del factor de expansión se llama FACTOR:
indice_global <- base %>%
filter(!is.na(victima_dummy), !is.na(FACTOR)) %>%
summarise(
Total_Hogares_Victimas = sum(victima_dummy * FACTOR, na.rm = TRUE),
Total_Poblacion = sum(FACTOR, na.rm = TRUE),
`Índice de Victimización (%)` = round((Total_Hogares_Victimas / Total_Poblacion) * 100, 2)
)
tabla_dual(
indice_global,
titulo = "Tabla 6. Índice de victimización global ponderado"
)
| Total_Hogares_Victimas | Total_Poblacion | Índice de Victimización (%) |
|---|---|---|
| 189180.8 | 1458900 | 12.97 |
# Desagregación del Índice de Victimización por Estrato Socioeconómico
indice_estrato <- base %>%
filter(!is.na(victima_dummy), !is.na(FACTOR), !is.na(Estrato)) %>%
group_by(Estrato) %>%
summarise(
Hogares_Victimas = sum(victima_dummy * FACTOR, na.rm = TRUE),
Total_Hogares = sum(FACTOR, na.rm = TRUE),
`Victimización (%)` = round((Hogares_Victimas / Total_Hogares) * 100, 2),
.groups = "drop"
)
tabla_dual(
indice_estrato,
titulo = "Tabla 7. Tasa de victimización ponderada según estrato socioeconómico"
)
| Estrato | Hogares_Victimas | Total_Hogares | Victimización (%) |
|---|---|---|---|
| Estrato 1 | 25271.64 | 191004.37 | 13.23 |
| Estrato 2 | 70499.35 | 625237.33 | 11.28 |
| Estrato 3 | 76156.71 | 427089.76 | 17.83 |
| Estrato 4 | 3194.17 | 64822.83 | 4.93 |
| Estrato 5 | 2274.77 | 24433.10 | 9.31 |
| Estrato 6 | 0.00 | 532.37 | 0.00 |
| Sin estrato | 11784.11 | 125780.26 | 9.37 |
ggplot(indice_estrato, aes(x = Estrato, y = `Victimización (%)`, fill = Estrato)) +
geom_bar(stat = "identity", alpha = 0.85, show.legend = FALSE) +
geom_text(aes(label = paste0(`Victimización (%)`, "%")),
vjust = -0.5, fontface = "bold", size = 3.5, color = "#6C7B8B") +
scale_fill_brewer(palette = "Blues") +
scale_y_continuous(labels = function(x) paste0(x, "%"),
limits = c(0, max(indice_estrato$`Victimización (%)`) + 8)) +
labs(
title = "Índice de Victimización Ponderado por Estrato",
subtitle = "Porcentaje de hogares victimizados ponderado por el factor de expansión",
x = "Estrato Socioeconómico",
y = "Tasa de Victimización (%)"
) +
theme_minimal(base_size = 11) +
theme(
plot.title = element_text(face = "bold", color = "#8B7B8B"),
axis.text.x = element_text(angle = 30, hjust = 1)
)
Interpretación del Índice de Victimización por Estrato
Socioeconómico
Punto crítico en Estrato 3: El Estrato 3 registra la tasa de victimización ponderada más alta de la población, donde un 17.83% de los hogares reporta haber sido víctima de al menos un delito.
Alta afectación en estratos bajos: Le siguen los estratos 1 y 2, con un 13.23% y un 11.28% de hogares victimizados respectivamente, lo que evidencia que la concentración de la problemática delictiva afecta predominantemente a los niveles socioeconómicos medios y bajos.
Menor incidencia en estratos altos: El Estrato 4 presenta la tasa más baja entre los estratos clasificados con un 4.93%, mientras que el Estrato 5 alcanza un 9.31%. El Estrato 6 registra un 0%, resultado condicionado por su baja o nula representatividad dentro del tamaño muestral.
Segmento sin estratificación: La categoría “Sin estrato” mantiene un comportamiento similar a los estratos medios, situándose en un 9.37% de victimización ponderada.
# 1. Índice de Victimización para la ciudad Castellana (Global)
ind_ciudad <- base %>%
filter(!is.na(victima_dummy), !is.na(FACTOR)) %>%
summarise(
`Índice Ciudad (%)` = round((sum(victima_dummy * FACTOR, na.rm = TRUE) / sum(FACTOR, na.rm = TRUE)) * 100, 2)
)
# 2. Índice de Victimización por Comunas
# Nota: Verifica si la variable de comuna se llama 'COMUNA' o 'P_COMUNA' en tu base.
ind_comunas <- base %>%
filter(!is.na(victima_dummy), !is.na(FACTOR), !is.na(COMUNA)) %>%
group_by(COMUNA) %>%
summarise(
`Victimización (%)` = round((sum(victima_dummy * FACTOR, na.rm = TRUE) / sum(FACTOR, na.rm = TRUE)) * 100, 2),
.groups = "drop"
) %>%
arrange(desc(`Victimización (%)`))
tabla_dual(
ind_ciudad,
titulo = "Tabla 8. Índice de victimización total para la ciudad Castellana"
)
| Índice Ciudad (%) |
|---|
| 12.97 |
tabla_dual(
ind_comunas,
titulo = "Tabla 9. Índice de victimización ponderado según comuna"
)
| COMUNA | Victimización (%) |
|---|---|
| 5 | 21.75 |
| 13 | 16.54 |
| 7 | 14.43 |
| 9 | 14.29 |
| 90 | 14.28 |
| 60 | 14.19 |
| 1 | 14.12 |
| 80 | 13.56 |
| 16 | 13.25 |
| 3 | 12.97 |
| 10 | 12.26 |
| 2 | 12.24 |
| 8 | 11.47 |
| 11 | 11.42 |
| 70 | 10.57 |
| 4 | 9.97 |
| 6 | 7.26 |
| 15 | 5.96 |
| 12 | 4.33 |
| 50 | 0.00 |