Cargar Librerias

#install.packages(c("xml2", "dplyr", "stringr", "readr"))
#install.packages("readxl")
#install.packages("writexl")
#install.packages("tidyverse")
#install.packages("knitr")

library(xml2)
library(dplyr)
library(stringr)
library(readr)
library(readxl)
library(writexl)
library(tidyverse)
library(knitr)

Base de Datos

BD1 <- read_excel("D:/R & Python/LaSalle/Taller_R/BD1.xlsx")
BD1
BD2 <- read_excel("D:/R & Python/LaSalle/Taller_R/BD2.xlsx")
BD2

Unir las bases de datos usando la llave REGISTRO

df <- inner_join(BD1, BD2, by = "REGISTRO")

Recodificar y limpiar Variables

df_clean <- df %>%
  mutate(
    # Factores sociodemográficos
    GENERO_F = factor(GENERO, levels = c(1, 2), labels = c("Masculino", "Femenino")),
    ESTRATO_F = 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 = case_when(
      PD == 1 ~ "Empleado",
      PD == 2 ~ "Independiente",
      PD == 3 ~ "Jubilado",
      PD == 4 ~ "Desempleado",
      PD == 5 ~ "Ama de Casa",
      PD == 6 ~ "Estudiante",
      TRUE ~ "Otro"
    ),
    
    # Percepción de seguridad (1 y 2 = Seguro, 3 = Inseguro, 4 = Muy Inseguro)
    PERC_BARRIO = case_when(
      P1 %in% c(1, 2) ~ "Seguro",
      P1 == 3 ~ "Inseguro",
      P1 == 4 ~ "Muy inseguro"
    ),
    PERC_COMUNA = case_when(
      P3 %in% c(1, 2) ~ "Seguro",
      P3 == 3 ~ "Inseguro",
      P3 == 4 ~ "Muy inseguro"
    ),
    PERC_CIUDAD = case_when(
      P5 %in% c(1, 2) ~ "Seguro",
      P5 == 3 ~ "Inseguro",
      P5 == 4 ~ "Muy inseguro"
    ),
    
    # Delitos: 1 (Hurto personas), 2 (Residencias), 3 (Comercio), 4 (Vehículos), 6 (Extorsión)
    Victima = ifelse(P20A %in% c(1, 2, 3, 4, 6), 1, 0)
  ) %>%
  # Convertir percepciones a factores ordenados
  mutate(across(starts_with("PERC_"), 
                ~factor(., levels = c("Seguro", "Inseguro", "Muy inseguro"))))

a) Caracterización Social y Económica de la Población

# Tabla descriptiva: Género y Estrato
tabla_demo <- df_clean %>%
  count(GENERO_F, ESTRATO_F) %>%
  mutate(Porcentaje = round((n / sum(n)) * 100, 2))

kable(tabla_demo, caption = "Tabla 1. Caracterización por Género y Estrato")
Tabla 1. Caracterización por Género y Estrato
GENERO_F ESTRATO_F n Porcentaje
Masculino Estrato 1 349 7.47
Masculino Estrato 2 975 20.86
Masculino Estrato 3 644 13.78
Masculino Estrato 4 73 1.56
Masculino Estrato 5 48 1.03
Masculino Estrato 6 1 0.02
Masculino Sin estrato 200 4.28
Femenino Estrato 1 404 8.65
Femenino Estrato 2 1051 22.49
Femenino Estrato 3 638 13.65
Femenino Estrato 4 68 1.46
Femenino Estrato 5 34 0.73
Femenino Estrato 6 2 0.04
Femenino Sin estrato 186 3.98
# Gráfico: Distribución por Ocupación
ggplot(df_clean %>% filter(!is.na(OCUPACION)), aes(x = fct_infreq(OCUPACION))) +
  geom_bar(fill = "orange", color = "black") +
  theme_minimal() +
  labs(title = "Gráfico 1. Distribución de la Población Encuestada por Ocupación",
       x = "Ocupación",
       y = "Frecuencia",
       caption = "Fuente: Elaboración propia a partir de encuestas.") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

b) Percepción de Seguridad (Barrios, Comunas y Ciudad)

# Graficar las tres percepciones juntas
df_percepcion <- df_clean %>%
  select(REGISTRO, PERC_BARRIO, PERC_COMUNA, PERC_CIUDAD) %>%
  pivot_longer(cols = starts_with("PERC_"), 
               names_to = "Nivel", 
               values_to = "Percepcion") %>%
  filter(!is.na(Percepcion)) %>%
  mutate(Nivel = str_replace(Nivel, "PERC_", ""))

# Gráfico de Percepción General
ggplot(df_percepcion, aes(x = Nivel, fill = Percepcion)) +
  geom_bar(position = "fill") +
  scale_y_continuous(labels = scales::percent_format()) +
  scale_fill_brewer(palette = "RdYlGn", direction = -1) +
  theme_minimal() +
  labs(title = "Gráfico 2. Percepción de Seguridad por Nivel Territorial",
       x = "Nivel Territorial",
       y = "Proporción",
       fill = "Percepción",
       caption = "Fuente: Elaboración propia.")

# c) Percepción de Seguridad según Género y Estrato

# Percepción en la Ciudad según Género y Estrato
ggplot(df_clean %>% filter(!is.na(PERC_CIUDAD), !is.na(ESTRATO_F)), 
       aes(x = PERC_CIUDAD, fill = GENERO_F)) +
  geom_bar(position = "dodge") +
  facet_wrap(~ESTRATO_F) +
  theme_minimal() +
  labs(title = "Gráfico 3. Percepción de Seguridad en la Ciudad por Género y Estrato",
       x = "Percepción",
       y = "Frecuencia",
       fill = "Género",
       caption = "Fuente: Elaboración propia.") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

Cálculo del Índice de Victimización

\[ \color{orange} {Indicedevictimizacion = \frac{\sum_{1}^{4673} (P20A_{i}= 1)* (factordeponderacion)}{\sum_{1}^{4673}(factordeponderacion)}} \]

# Ajuste de los datos
df_clean <- df_clean %>%
  mutate(
    
    # Creamos la variable que toma el valor de 1 si fue víctima de esos delitos, o 0 de lo contrario
    
    Victima = ifelse(P20A %in% c(1, 2, 3, 4, 6), 1, 0),
    
    FACTOR_POND = FACTOR 
  )

##¿Cual es el índice de victimización para la ciudad de Castilla?

# 1. Índice de victimización general
indice_ciudad <- df_clean %>%
  summarise(
    Total_Victimas_Pond = sum(Victima * FACTOR_POND, na.rm = TRUE),
    Poblacion_Total = sum(FACTOR_POND, na.rm = TRUE),
    Indice_Ciudad = Total_Victimas_Pond / Poblacion_Total
  )

# Mostrar el resultado
print(indice_ciudad)
## # A tibble: 1 × 3
##   Total_Victimas_Pond Poblacion_Total Indice_Ciudad
##                 <dbl>           <dbl>         <dbl>
## 1             291139.        1458900.         0.200

¿Cual es el índice de victimización por comunas?

# 2. Índice de victimización por comunas
indice_comunas <- df_clean %>%
  filter(!is.na(COMUNA)) %>% # Filtramos en caso de que haya comunas sin dato
  group_by(COMUNA) %>%
  summarise(
    Indice_Comuna = sum(Victima * FACTOR_POND, na.rm = TRUE) / sum(FACTOR_POND, na.rm = TRUE)
  ) %>%
  arrange(desc(Indice_Comuna)) # Ordenamos de mayor a menor para facilitar la lectura

# Generar la tabla para el informe en Markdown
kable(indice_comunas, 
      digits = 4, # Muestra 4 decimales
      col.names = c("Comuna", "Índice de Victimización"),
      caption = "Tabla X. Índice de victimización por comunas")
Tabla X. Índice de victimización por comunas
Comuna Índice de Victimización
5 0.2757
7 0.2344
60 0.2295
4 0.2252
8 0.2157
13 0.2079
16 0.2078
3 0.2052
2 0.1968
9 0.1890
1 0.1818
10 0.1800
80 0.1698
12 0.1512
90 0.1428
6 0.1376
11 0.1314
70 0.1271
15 0.1128
50 0.0000

¿En que comuna es mayor este índice?

# 3. Identificar la comuna con el mayor índice
comuna_mayor <- indice_comunas %>% 
  slice_max(order_by = Indice_Comuna, n = 1)

# Mostrar resultado en consola
print(comuna_mayor)
## # A tibble: 1 × 2
##   COMUNA Indice_Comuna
##    <dbl>         <dbl>
## 1      5         0.276

¿En que comuna es menor?

# 4. Identificar la comuna con el menor índice
comuna_menor <- indice_comunas %>% 
  slice_min(order_by = Indice_Comuna, n = 1)

# Mostrar resultado en consola
print(comuna_menor)
## # A tibble: 1 × 2
##   COMUNA Indice_Comuna
##    <dbl>         <dbl>
## 1     50             0

FIN !!!