#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
)
Tabla 1: Distribución cruzada por Rango de Edad y Género de los encuestados
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
)
Tabla 2: Composición de la muestra según Estrato Socioeconómico
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
)
Tabla 3: Distribución de los encuestados por Ocupación u Oficio principal
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
)
Tabla 4: Sentimiento general de seguridad de los ciudadanos en su propio barrio
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
)
Tabla 5: Matriz cruzada de Percepción de Seguridad Barrial por Género
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
)
Tabla 6: Matriz cruzada de Percepción de Seguridad Barrial por Estrato Socioeconómico
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()
  )