#install.packages(c("tidyverse", "knitr", "scales"))
# 1. Instala el paquete de R
#install.packages("tinytex")
# 2. Descarga e instala el motor mínimo de LaTeX en tu sistema
#tinytex::install_tinytex()
#bases de datos #
library(readxl)
BD1 <- read_excel("BD1.xlsx")
View(BD1)
BD2 <- read_excel("BD2.xlsx")
View(BD2)
# Unir las bases de datos mediante la llave compartida REGISTRO
datos_completos <- inner_join(BD1, BD2, by = "REGISTRO")
# Recodificación y etiquetado de variables críticas según el Diccionario de Datos
datos_procesados <- datos_completos %>%
mutate(
# Variable Género
GENERO_LAB = case_when(
GENERO == 1 ~ "Masculino",
GENERO == 2 ~ "Femenino",
TRUE ~ "No responde"
),
# Variable Rango de Edad
EDAD_RANGO_LAB = case_when(
EDAD_RANGO == 1 ~ "16-17",
EDAD_RANGO == 2 ~ "18-24",
EDAD_RANGO == 3 ~ "25-28",
EDAD_RANGO == 4 ~ "29-34",
EDAD_RANGO == 5 ~ "35-38",
EDAD_RANGO == 6 ~ "39-44",
EDAD_RANGO == 7 ~ "45-54",
EDAD_RANGO == 8 ~ "55-59",
EDAD_RANGO == 9 ~ "60-66",
EDAD_RANGO == 10 ~ "67 o más",
TRUE ~ "No informa"
),
# Variable Estrato
ESTRATO_LAB = case_when(
ESTRATO == 1 ~ "Estrato 1",
ESTRATO == 2 ~ "Estrato 2",
ESTRATO == 3 ~ "Estrato 3",
ESTRATO == 4 ~ "Estrato 4",
ESTRATO == 5 ~ "Estrato 5",
ESTRATO == 6 ~ "Estrato 6",
TRUE ~ "Sin Estrato / NR"
),
# Variable Ocupación (PD)
OCUPACION_LAB = case_when(
PD == 1 ~ "Empleado/Asalariado",
PD == 2 ~ "Trabajador Independiente",
PD == 3 ~ "Retirado/Jubilado",
PD == 4 ~ "Desempleado",
PD == 5 ~ "Ama de Casa",
PD == 6 ~ "Estudiante",
PD == 10 ~ "Incapacitado",
PD == 11 ~ "Cuidado de familiares",
TRUE ~ "Otros / No responde"
),
# Variable Percepción de Seguridad en el Barrio (P1)
PERCEPCION_BARRIO = case_when(
P1 == 1 ~ "Muy seguro",
P1 == 2 ~ "Seguro",
P1 == 3 ~ "Inseguro",
P1 == 4 ~ "Muy inseguro",
TRUE ~ "NS/NR"
)
) %>%
# Convertir a factores ordenados para asegurar una presentación lógica en tablas y gráficos
mutate(
PERCEPCION_BARRIO = factor(PERCEPCION_BARRIO, levels = c("Muy seguro", "Seguro", "Inseguro", "Muy inseguro", "NS/NR")),
ESTRATO_LAB = factor(ESTRATO_LAB, levels = c("Estrato 1", "Estrato 2", "Estrato 3", "Estrato 4", "Estrato 5", "Estrato 6", "Sin Estrato / NR")),
EDAD_RANGO_LAB = factor(EDAD_RANGO_LAB, levels = c("16-17", "18-24", "25-28", "29-34", "35-38", "39-44", "45-54", "55-59", "60-66", "67 o más", "No informa"))
)
#caracterizacion#
tabla_demo <- datos_procesados %>%
group_by(EDAD_RANGO_LAB, GENERO_LAB) %>%
summarise(Cantidad = n(), .groups = 'drop') %>%
group_by(EDAD_RANGO_LAB) %>%
mutate(Porcentaje = Cantidad / sum(Cantidad)) %>%
ungroup()
# Mostrar estados en formato Consola/Markdown
kable(
tabla_demo,
caption = "Tabla 1: Distribución cruzada por Rango de Edad y Género de los encuestados",
col.names = c("Rango de Edad", "Género", "Frecuencia Absoluta", "Porcentaje Relativo"),
digits = 3
)
Tabla 1: Distribución cruzada por Rango de Edad y Género de los
encuestados
| 16-17 |
Femenino |
40 |
0.357 |
| 16-17 |
Masculino |
72 |
0.643 |
| 18-24 |
Femenino |
263 |
0.414 |
| 18-24 |
Masculino |
373 |
0.586 |
| 25-28 |
Femenino |
164 |
0.473 |
| 25-28 |
Masculino |
183 |
0.527 |
| 29-34 |
Femenino |
219 |
0.489 |
| 29-34 |
Masculino |
229 |
0.511 |
| 35-38 |
Femenino |
138 |
0.507 |
| 35-38 |
Masculino |
134 |
0.493 |
| 39-44 |
Femenino |
170 |
0.489 |
| 39-44 |
Masculino |
178 |
0.511 |
| 45-54 |
Femenino |
377 |
0.554 |
| 45-54 |
Masculino |
304 |
0.446 |
| 55-59 |
Femenino |
263 |
0.595 |
| 55-59 |
Masculino |
179 |
0.405 |
| 60-66 |
Femenino |
327 |
0.532 |
| 60-66 |
Masculino |
288 |
0.468 |
| 67 o más |
Femenino |
422 |
0.547 |
| 67 o más |
Masculino |
350 |
0.453 |
#estrato#
# Resumen por Estrato
tabla_estrato <- datos_procesados %>%
count(ESTRATO_LAB) %>%
mutate(Porcentaje = n / sum(n))
kable(
tabla_estrato,
caption = "Tabla 2: muestra según Estrato Socioeconómico",
col.names = c("Estrato Habitacional", "Frecuencia Absoluta", "Proporción"),
digits = 3
)
Tabla 2: muestra según Estrato Socioeconómico
| Sin Estrato / NR |
4673 |
1 |
#ocupacion#
# Resumen por Ocupación
tabla_ocupacion <- datos_procesados %>%
count(OCUPACION_LAB) %>%
arrange(desc(n)) %>%
mutate(Porcentaje = n / sum(n))
kable(
tabla_ocupacion,
caption = "Tabla 3: Distribución de los encuestados por Ocupación u Oficio principal",
col.names = c("Ocupación", "Frecuencia Absoluta", "Proporción"),
digits = 3
)
Tabla 3: Distribución de los encuestados por Ocupación u Oficio
principal
| Ama de Casa |
1343 |
0.287 |
| Empleado/Asalariado |
1123 |
0.240 |
| Trabajador Independiente |
1001 |
0.214 |
| Desempleado |
427 |
0.091 |
| Retirado/Jubilado |
360 |
0.077 |
| Estudiante |
304 |
0.065 |
| Otros / No responde |
93 |
0.020 |
| Incapacitado |
16 |
0.003 |
| Cuidado de familiares |
6 |
0.001 |
#percepcion de seguridad en el barrio#
tabla_seguridad <- datos_procesados %>%
count(PERCEPCION_BARRIO) %>%
mutate(Porcentaje = n / sum(n))
kable(
tabla_seguridad,
caption = "Tabla 4: Sentimiento general de seguridad de los ciudadanos en su propio barrio",
col.names = c("Nivel de Percepción", "Cantidad", "Porcentaje"),
digits = 3
)
Tabla 4: Sentimiento general de seguridad de los ciudadanos en
su propio barrio
| Muy seguro |
484 |
0.104 |
| Seguro |
3426 |
0.733 |
| Inseguro |
642 |
0.137 |
| Muy inseguro |
121 |
0.026 |
#grafico#
ggplot(tabla_seguridad, aes(x = PERCEPCION_BARRIO, y = Porcentaje, fill = PERCEPCION_BARRIO)) +
geom_col(show.legend = FALSE, color = "black", width = 0.6) +
scale_y_continuous(labels = percent) +
scale_fill_brewer(palette = "RdYlGn", direction = -1) +
labs(
title = "Distribución Percepción de Seguridad en el Barrio",
subtitle = "Estudio de Seguridad",
x = "Sentimiento de Seguridad",
y = "Porcentaje de Encuestados",
caption = "Fuente: Banco de datos unificado de Seguridad "
) +
theme_minimal() +
theme(plot.title = element_text(face = "bold", size = 14))

#cambia la persepcion segun el gnero#
cruce_genero <- datos_procesados %>%
filter(PERCEPCION_BARRIO != "NS/NR") %>%
group_by(GENERO_LAB, PERCEPCION_BARRIO) %>%
summarise(Cantidad = n(), .groups = 'drop') %>%
group_by(GENERO_LAB) %>%
mutate(Porcentaje = Cantidad / sum(Cantidad)) %>%
ungroup()
kable(
cruce_genero,
caption = "Tabla 5: Matriz cruzada de Percepción de Seguridad Barrial por Género",
col.names = c("Género", "Percepción de Seguridad", "Casos", "Porcentaje dentro del Género"),
digits = 3
)
Tabla 5: Matriz cruzada de Percepción de Seguridad Barrial por
Género
| Femenino |
Muy seguro |
207 |
0.087 |
| Femenino |
Seguro |
1740 |
0.730 |
| Femenino |
Inseguro |
359 |
0.151 |
| Femenino |
Muy inseguro |
77 |
0.032 |
| Masculino |
Muy seguro |
277 |
0.121 |
| Masculino |
Seguro |
1686 |
0.736 |
| Masculino |
Inseguro |
283 |
0.124 |
| Masculino |
Muy inseguro |
44 |
0.019 |
#grafica percepcion segun gnero#
ggplot(cruce_genero, aes(x = GENERO_LAB, y = Porcentaje, fill = PERCEPCION_BARRIO)) +
geom_col(position = "dodge", color = "black", width = 0.7) +
scale_y_continuous(labels = percent) +
scale_fill_viridis_d(option = "plasma", name = "Respuesta") +
labs(
title = "Percepción de Seguridad Barrial en función del Género del Informante",
x = "Género",
y = "Porcentaje Equivalente",
caption = "Fuente: Cruce de variables BD1 y BD2 (2023)"
) +
theme_light() +
theme(legend.position = "bottom")

#formula#
# Creamos una variable binaria: 1 si fue víctima (P20A == 1), 0 en cualquier otro caso
base_analisis <- datos_procesados %>%
mutate(
victima_binaria = if_else(P20A == 1, 1, 0)
)
# CALCULO 1: ÍNDICE DE VICTIMIZACIÓN GLOBAL (Para la Ciudad Castellana)
# =========================================================================
resultado_global <-datos_procesados %>%
summarise(
Numerador_Pond = sum(P20A * FACTOR, na.rm = TRUE),
Denominador_Pond = sum(FACTOR, na.rm = TRUE),
Indice_Global = (Numerador_Pond / Denominador_Pond) * 100)
# Extraemos el valor para poder usarlo en el texto explicativo
valor_global <- round(resultado_global$Indice_Global, 2)
# =========================================================================
# CALCULO 2: ÍNDICE DE VICTIMIZACIÓN DESAGREGADO POR COMUNAS
# =========================================================================
tabla_comunas <- datos_completos %>%
group_by(COMUNA) %>%
summarise(
`Hogares Víctimas (Ponderado)` = sum(P20A * FACTOR, na.rm = TRUE),
`Población Total (Ponderada)`= sum(FACTOR, na.rm = TRUE),
`Índice de Victimización (%)` = (`Hogares Víctimas (Ponderado)` / `Población Total (Ponderada)`) * 100,
.groups = 'drop'
) %>%
# Ordenamos de mayor a menor índice para responder la pregunta del taller
arrange(desc(`Índice de Victimización (%)`))
#graficar#
# Graficamos la tabla de comunas
ggplot(tabla_comunas, aes(x = reorder(COMUNA, `Índice de Victimización (%)`), y = `Índice de Victimización (%)`)) +
# Barras para cada comuna
geom_bar(stat = "identity", fill = "steelblue") +
# Agregamos etiquetas con el valor exacto al final de cada barra
geom_text(aes(label = paste0(round(`Índice de Victimización (%)`, 1), "%")),
hjust = -0.2, size = 3.5, color = "black") +
# Linea de referencia
geom_hline(yintercept = valor_global, lintent = "dashed", color = "orange", linewidth = 0.8) +
# linea
annotate("text", x = 1, y = valor_global + 1,
label = paste0("Promedio Global: ", valor_global, "%"),
color = "orange", hjust = 0, fontface = "bold") +
# cambiar ejes
coord_flip() +
# titulos
labs(
title = "Índice de Victimización por Comunas",
subtitle = "Comparativa frente al promedio global ponderado",
x = "Comuna",
y = "Índice de Victimización (%)",
caption = "Fuente: Cálculos propios basados en datos procesados"
) +
# estilo
theme_minimal() +
theme(
plot.title = element_text(face = "bold", size = 14),
axis.text = element_text(size = 10),
panel.grid.minor = element_blank()
)

#cambia percepcion segun estrato#
cruce_estrato <- datos_procesados %>%
filter(PERCEPCION_BARRIO != "NS/NR") %>%
group_by(ESTRATO_LAB, PERCEPCION_BARRIO) %>%
summarise(Cantidad = n(), .groups = 'drop') %>%
group_by(ESTRATO_LAB) %>%
mutate(Porcentaje = Cantidad / sum(Cantidad)) %>%
ungroup()
kable(
cruce_estrato,
caption = "Tabla 6: Matriz cruzada de Percepción de Seguridad Barrial por Estrato Socioeconómico",
col.names = c("Estrato", "Percepción de Seguridad", "Casos", "Porcentaje dentro del Estrato"),
digits = 3
)
Tabla 6: Matriz cruzada de Percepción de Seguridad Barrial por
Estrato Socioeconómico
| Sin Estrato / NR |
Muy seguro |
484 |
0.104 |
| Sin Estrato / NR |
Seguro |
3426 |
0.733 |
| Sin Estrato / NR |
Inseguro |
642 |
0.137 |
| Sin Estrato / NR |
Muy inseguro |
121 |
0.026 |
#informe socieconomico#
##grafica
ggplot(cruce_estrato, aes(x = ESTRATO_LAB, y = Porcentaje, fill = PERCEPCION_BARRIO)) +
geom_col(position = "dodge", color = "blue", width = 0.8) +
scale_y_continuous(labels = percent) +
scale_fill_brewer(palette = "Blue", name = "Percepción") +
labs(
title = "Análisis Estructural: Percepción de Seguridad por Estrato Social",
subtitle = "Estructura de respuestas proporcionales al 100%",
x = "Estrato Socioeconómico",
y = "Distribución Proporcional",
caption = "Fuente: Datos procesados."
) +
theme_light() +
theme(legend.position = "botom")
