#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()
setwd("C:/Users/Fintrade2/Documents/R/Taller1")#bases de datos #
library(readxl)
BD1 <- read_excel("BD1.xlsx")
View(BD1)
BD2 <- read_excel("BD2.xlsx")
View(BD2)##Cruce de base de datos + conversion de datos con diccionario
# 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"))
)##Punto a: Caracterizacion Caracterice social y económicamente la población encuestada (seleccione las variables que considere importantes para este análisis (por ejemplo, caracterice la población por género, edad, estrato y ocupación). Apóyese de gráficos, estadísticas descriptivas, tablas o herramientas que considere necesarias).
#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
)| Rango de Edad | Género | Frecuencia Absoluta | Porcentaje Relativo |
|---|---|---|---|
| 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 |
##Resumen por estrato
#estrato#
tabla_estrato <- datos_procesados %>%
count(ESTRATO_LAB) %>%
mutate(Porcentaje = n / sum(n))
kable(
tabla_estrato,
caption = "Tabla 2: Composición de la muestra según Estrato Socioeconómico",
col.names = c("Estrato Habitacional", "Frecuencia Absoluta", "Proporción"),
digits = 3
)| Estrato Habitacional | Frecuencia Absoluta | Proporción |
|---|---|---|
| Sin Estrato / NR | 4673 | 1 |
#Resumen por ocupacion
#ocupacion#
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
)| Ocupación | Frecuencia Absoluta | Proporción |
|---|---|---|
| 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 |
##Punto B Percepcion de Seguridad
¿Cómo se sienten los encuestados (percepción de seguridad) en sus barrios, comunas y ciudad?
#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
)| Nivel de Percepción | Cantidad | Porcentaje |
|---|---|---|
| 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 = "green", width = 0.6) +
scale_y_continuous(labels = percent) +
scale_fill_brewer(palette = "RdYlGn", direction = -1) +
labs(
title = "Distribución General de la Percepción de Seguridad en el Barrio",
subtitle = "Medellín, Estudio de Seguridad 2023",
x = "Sentimiento de Seguridad",
y = "Porcentaje de Encuestados",
caption = "Fuente: Banco de datos unificado de Seguridad (2023)"
) +
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
)| Género | Percepción de Seguridad | Casos | Porcentaje dentro del 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")##Punto C Percepción según el estrato
¿Cambia esta percepción según el género del informante? ¿Según el estrato?
#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
)| Estrato | Percepción de Seguridad | Casos | Porcentaje dentro del Estrato |
|---|---|---|---|
| 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#
ggplot(cruce_estrato, aes(x = ESTRATO_LAB, y = Porcentaje, fill = PERCEPCION_BARRIO)) +
geom_col(position = "dodge", color = "purple", width = 0.8) +
scale_y_continuous(labels = percent) +
scale_fill_brewer(palette = "plasma", 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")##Punto D Indice 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. Su fórmula es la siguiente (Pregunta P20A):
#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 (puedes cambiar el color en 'fill')
geom_bar(stat = "identity", fill = "black") +
# 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") +
# LÍNEA DE REFERENCIA: Aquí metemos tu 'valor_global'
geom_hline(yintercept = valor_global, lintent = "dashed", color = "green", linewidth = 0.8) +
# Etiqueta para la línea global
annotate("text", x = 1, y = valor_global + 1,
label = paste0("Promedio Global: ", valor_global, "%"),
color = "green", hjust = 0, fontface = "bold") +
# Invertimos los ejes para que las comunas se lean de arriba a abajo (fácil lectura)
coord_flip() +
# Personalización de títulos y etiquetas
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"
) +
# Un tema limpio y moderno
theme_minimal() +
theme(
plot.title = element_text(face = "bold", size = 20),
axis.text = element_text(size = 10),
panel.grid.minor = element_blank()
)