1 Introducción

El ejercicio utiliza dos bases de encuesta que deben combinarse mediante la variable REGISTRO, junto con un diccionario de datos. Cada registro corresponde a una encuesta realizada a un jefe de hogar. El propósito es caracterizar social y económicamente a la población, analizar la percepción de seguridad en el barrio, la comuna y la ciudad, y calcular un índice ponderado de victimización.

El análisis se desarrolla íntegramente en R y está diseñado para compilar tanto a HTML como a PDF. Las tablas y figuras se presentan con numeración, título, fuente y una interpretación en el texto.

2 Preparación de los datos

2.1 Carga de las bases y del diccionario

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/s12e07/Documents/base diccionario")

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

[1] 4673 422

2.2 Recodificación de variables

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"))
  )

2.3 caracterización social y económica

2.3.1 Genero

La Figura muestra la distribución de los encuestados según género. Se observa la participación relativa de hombres y mujeres dentro de la muestra analizada. Esta variable permite evaluar la representatividad poblacional de la encuesta y constituye un factor importante para analizar posibles diferencias en la percepción de seguridad, victimización y confianza institucional entre grupos poblacionales.

genero_tab <- base %>%
  count(Genero) %>%
  mutate(
    Porcentaje = round(n/sum(n)*100,1)
  )

ggplot(
  genero_tab,
  aes(
    x = 2,
    y = Porcentaje,
    fill = Genero
  )
) +
  geom_col(
    color = "white",
    linewidth = 1
  ) +
  coord_polar(theta = "y") +
  xlim(0.5, 2.5) +
  geom_text(
    aes(
      label = paste0(Porcentaje,"%")
    ),
    position = position_stack(vjust = 0.5),
    color = "white",
    fontface = "bold",
    size = 5
  ) +
  scale_fill_manual(
    values = c(
      "Masculino" = "#1D3592",
      "Femenino" = "#E76F92"
    )
  ) +
  labs(
    title = "Figura 1. Distribución por Género"
  ) +
  theme_void() +
  theme(
    plot.title = element_text(
      face = "bold",
      hjust = 0.5,
      size = 16
    )
  )

2.3.2 Edad

La Figura presenta la distribución porcentual de la población encuestada según grupos de edad. La composición etaria de la muestra permite identificar los segmentos con mayor participación y facilita el análisis de posibles diferencias generacionales en las percepciones de seguridad, convivencia ciudadana y confianza en las instituciones.

edad_tab <- base %>%
  count(RangoEdad) %>%
  mutate(
    Porcentaje = round(n/sum(n)*100,1)
  )

ggplot(
  edad_tab,
  aes(
    x = RangoEdad,
    y = Porcentaje,
    fill = RangoEdad
  )
) +
  geom_col(width = 0.75) +
  geom_text(
    aes(label = paste0(Porcentaje,"%")),
    vjust = -0.4,
    size = 4,
    fontface = "bold"
  ) +
  scale_fill_manual(
    values = c(
    "#1D3557",  # 16-17: Azul noche
    "#2A9D8F",  # 18-24: Verde azulado
    "#52B788",  # 25-28: Verde menta sobrio
    "#74C69D",  # 29-34: Verde claro mate
    "#E9C46A",  # 35-38: Mostaza suave
    "#F4A261",  # 39-44: Terracota claro
    "#E76F51",  # 45-54: Coral sobrio
    "#D62828",  # 55-59: Rojo vino
    "#6D597A",  # 60-66: Violeta grisáceo
    "#457B9D"   # 67 o más: Azul acero
    )
  ) +
  labs(
    title = "Figura 2. Distribución por Grupo de Edad",
    x = "Grupo de Edad",
    y = "Porcentaje (%)"
  ) +
  theme_minimal(base_size = 13) +
  theme(
    legend.position = "none",
    plot.title = element_text(
      face = "bold",
      size = 16,
      hjust = 0.5
    ),
    axis.text.x = element_text(
      angle = 45,
      hjust = 1,
      face = "bold"
    )
  )

2.3.3 Estrato Socioeconómico

La figura presenta la distribución de los encuestados según su estrato socioeconómico. Estos resultados permiten identificar la composición socioeconómica de los hogares participantes y observar la representación de los diferentes estratos dentro de la muestra. Esta variable es relevante para el análisis, ya que permite explorar posibles diferencias en las experiencias y percepciones de los encuestados frente a la seguridad ciudadana.

estrato_tab <- base %>%
  count(Estrato) %>%
  mutate(
    Porcentaje = round(n / sum(n) * 100, 1)
  )

ggplot(
  estrato_tab,
  aes(
    x = Estrato,
    y = Porcentaje,
    fill = Estrato
  )
) +
  geom_col(width = 0.7) +
  geom_text(
    aes(label = paste0(Porcentaje, "%")),
    vjust = -0.3,
    fontface = "bold"
  ) +
  scale_fill_manual(
    values = c(
    "#1D3557",  # Estrato 1: Azul noche
    "#2A9D8F",  # Estrato 2: Verde azulado
    "#457B9D",  # Estrato 3: Azul acero
    "#E9C46A",  # Estrato 4: Mostaza suave
    "#F4A261",  # Estrato 5: Terracota claro
    "#E76F51",  # Estrato 6: Coral sobrio
    "#6D597A"   # Sin estrato: Violeta grisáceo
    )
  ) +
  labs(
    title = "Figura 3. Distribución por Estrato Socioeconómico",
    x = "Estrato",
    y = "Porcentaje (%)"
  ) +
  theme_minimal() +
  theme(
    legend.position = "none",
    plot.title = element_text(
      face = "bold",
      hjust = 0.5,
      size = 16
    )
  )

2.3.4 Ocupación

La figura presenta la distribución porcentual de los encuestados de acuerdo con su ocupación principal. Se observa la participación de las diferentes actividades laborales presentes en la muestra, permitiendo identificar aquellas con mayor representación. Esta información contribuye a caracterizar las condiciones socioeconómicas de la población estudiada y proporciona un contexto para analizar posibles diferencias en la percepción de seguridad según la situación laboral.

ocupacion_tab <- base %>%
  count(Ocupacion) %>%
  mutate(
    Porcentaje = round(n/sum(n)*100,1)
  ) %>%
  arrange(Porcentaje)

ggplot(
  ocupacion_tab,
  aes(
    x = reorder(Ocupacion, Porcentaje),
    y = Porcentaje,
    fill = Ocupacion
  )
) +
  geom_col(width = 0.8) +
  geom_text(
    aes(label = paste0(Porcentaje,"%")),
    hjust = -0.15,
    fontface = "bold",
    size = 3.5
  ) +
  scale_fill_manual(
    values = c(
    "#1D3557",  # Empleado/asalariado
    "#2A9D8F",  # Trabaja independiente/propietario
    "#457B9D",  # Retirado/Jubilado
    "#52B788",  # Desempleado
    "#74C69D",  # Ama de casa
    "#E9C46A",  # Estudiante
    "#F4A261",  # Incapacitado/discapacitado
    "#E76F51",  # Cuidado de familiares
    "#D62828",  # Otros(as)
    "#6D597A",  # Ninguno/nada
    "#4A4E69",  # No responde
    "#264653"   # Otro ¿Cuál?
    )
  ) +
  coord_flip() +
  labs(
    title = "Figura 4. Distribución por Ocupación",
    subtitle = "Participación porcentual de los encuestados según ocupación",
    x = "",
    y = "Porcentaje (%)"
  ) +
  theme_minimal(base_size = 13) +
  theme(
    legend.position = "none",
    plot.title = element_text(
      face = "bold",
      size = 16,
      hjust = 0.5
    ),
    plot.subtitle = element_text(
      hjust = 0.5
    )
  )

2.3.5 TABLA DE OCUPACIONES

La ocupación con mayor representación en la muestra corresponde a Empleado/asalariado, con 1.850 personas (39,6%), seguida de Trabaja independiente/propietario, con 1.120 personas (24,0%). Por otra parte, las categorías con menor participación fueron Incapacitado/discapacitado y Cuidado de familiares, ambas con una representación inferior al 2% de la muestra. En conjunto, los resultados muestran una mayor concentración de los encuestados en actividades laborales como el empleo asalariado y el trabajo independiente.

ocupacion_tab %>%
  arrange(desc(Porcentaje)) %>%
  kable(
    caption = "Tabla 1. Distribución de los encuestados según ocupación",
    col.names = c(
      "Ocupación",
      "Frecuencia",
      "Porcentaje (%)"
    )
  ) %>%
  kable_styling(
    bootstrap_options = c(
      "striped",
      "hover",
      "condensed",
      "responsive"
    ),
    full_width = FALSE,
    position = "center"
  ) %>%
  row_spec(
    0,
    bold = TRUE,
    color = "white",
    background = "#1D3557"
  )
Tabla 1. Distribución de los encuestados según ocupación
Ocupación Frecuencia Porcentaje (%)
Ama de casa 1343 28.7
Empleado/asalariado 1123 24.0
Trabaja independiente/propietario 1001 21.4
Desempleado 427 9.1
Retirado/Jubilado 360 7.7
Estudiante 304 6.5
Ninguno/nada 88 1.9
Incapacitado/discapacitado 16 0.3
Cuidado de familiares 6 0.1
Otros(as) 4 0.1
No responde 1 0.0

2.4 Percepción de Seguridad

2.4.1 Percepción Actual del Barrio

La Figura 5 presenta la percepción de seguridad de los encuestados en su barrio de residencia. La información permite identificar cómo valoran las personas las condiciones de seguridad de su entorno más cercano, así como observar la proporción de encuestados que perciben su barrio como seguro o inseguro.

barrio_tab <- base %>%
  count(P1_lab) %>%
  mutate(
    Porcentaje = round(n/sum(n)*100,1)
  )

ggplot(
  barrio_tab,
  aes(
    x = P1_lab,
    y = Porcentaje,
    fill = P1_lab
  )
) +
  geom_col(width = 0.75) +
  geom_text(
    aes(label = paste0(Porcentaje,"%")),
    vjust = -0.3,
    fontface = "bold"
  ) +
 scale_fill_manual(
  values = c(
  "#3D2314",  # marrón oscuro (café intenso)
  "#8B5A2B",  # marrón medio (canela)
  "#C89D7C",  # marrón claro (beige cálido)
  "#F5EBE6"   # marrón muy claro (crema)
  )
) +
  labs(
    title = "Figura 5. Percepción Actual de Seguridad en el Barrio",
    x = "",
    y = "Porcentaje (%)"
  ) +
  theme_minimal() +
  theme(
    legend.position = "none",
    plot.title = element_text(
      face = "bold",
      hjust = 0.5
    )
  )

2.4.2 Percepción actual de la Comuna

La Figura 6 presenta la percepción actual de seguridad de los encuestados en su comuna de residencia. Este resultado permite analizar cómo se percibe la seguridad en un ámbito territorial más amplio que el barrio, facilitando la identificación de posibles diferencias en la percepción de seguridad según el nivel de proximidad al entorno evaluado

comuna_tab <- base %>%
  count(P3_lab) %>%
  mutate(
    Porcentaje = round(n/sum(n)*100,1)
  )

ggplot(
  comuna_tab,
  aes(
    x = P3_lab,
    y = Porcentaje,
    fill = P3_lab
  )
) +
  geom_col(width = 0.75) +
  geom_text(
    aes(label = paste0(Porcentaje,"%")),
    vjust = -0.3,
    fontface = "bold"
  ) +
 scale_fill_manual(
  values = c(
  "#4A1521",  # vino / borgoña muy oscuro
  "#7A2E22",  # terracota rojizo medio
  "#C87D55",  # marrón arcilla claro
  "#F4E3D7"   # crema cálido / beige suave
  )
) +
  labs(
    title = "Figura 6. Percepción Actual de Seguridad en la Comuna",
    x = "",
    y = "Porcentaje (%)"
  ) +
  theme_minimal() +
  theme(
    legend.position = "none",
    plot.title = element_text(
      face = "bold",
      hjust = 0.5
    )
  )

### Percepción Actual de la Seguridad en la Cuidad

La Figura 7 presenta la percepción actual de seguridad de los encuestados en la ciudad. Este indicador permite analizar cómo los ciudadanos valoran las condiciones generales de seguridad en el ámbito urbano y contrastar esta percepción con la registrada en espacios de menor escala, como el barrio y la comuna.

ciudad_tab <- base %>%
  count(P5_lab) %>%
  mutate(
    Porcentaje = round(n/sum(n)*100,1)
  )

ggplot(
  ciudad_tab,
  aes(
    x = P5_lab,
    y = Porcentaje,
    fill = P5_lab
  )
) +
  geom_col(width = 0.75) +
  geom_text(
    aes(label = paste0(Porcentaje,"%")),
    vjust = -0.3,
    fontface = "bold"
  ) +
 scale_fill_manual(
  values = c(
    "#3A0CA3",
    "#4361EE",
    "#4CC9F0",
    "#BDE0FE"
  )
) +
  labs(
    title = "Figura 7. Percepción Actual de Seguridad en la Ciudad",
    x = "",
    y = "Porcentaje (%)"
  ) +
  theme_minimal() +
  theme(
    legend.position = "none",
    plot.title = element_text(
      face = "bold",
      hjust = 0.5
    )
  )

2.4.3 ComparaciÓn Entre Barrio, Comuna y Cuidad

La Figura 8 compara la percepción de seguridad de los encuestados en tres niveles territoriales: barrio, comuna y ciudad. Esta comparación permite observar cómo varía la percepción de seguridad según el ámbito geográfico evaluado y facilita el análisis de las diferencias entre el entorno más cercano y la percepción del contexto urbano en general.

seguridad <- base %>%
  select(P1_lab, P3_lab, P5_lab) %>%
  pivot_longer(
    everything(),
    names_to = "Territorio",
    values_to = "Percepcion"
  )

seguridad$Territorio <- factor(
  seguridad$Territorio,
  levels = c("P1_lab","P3_lab","P5_lab"),
  labels = c("Barrio","Comuna","Ciudad")
)

ggplot(
  seguridad,
  aes(
    x = Territorio,
    fill = Percepcion
  )
) +
  geom_bar(position = "fill") +
  scale_y_continuous(labels = scales::percent) +
  scale_fill_manual(
  values = c(
  "Muy seguro"   = "#FCE8EC",  # crema rosado / rosa muy claro
  "Seguro"       = "#D88399",  # palo de rosa / rosa pálido
  "Inseguro"     = "#9E2A4B",  # rosa viejo / magenta sobrio
  "Muy inseguro" = "#4A1525"   # borgoña / rosa vino muy oscuro
  )
) +
  labs(
    title = "Figura 8. Comparación de la Percepción de Seguridad",
    x = "",
    y = "Porcentaje"
  ) +
  theme_minimal() +
  theme(
    legend.title = element_blank(),
    plot.title = element_text(
      face = "bold",
      hjust = 0.5
    )
  )

2.4.4 i. ¿Cuál es el índice de victimización para la ciudad Castellana?

El índice de victimización de la ciudad de Castellana fue de 22,2%, lo que significa que aproximadamente 22 de cada 100 hogares reportaron haber sido víctimas de al menos un delito durante el período de referencia. Este resultado permite dimensionar la proporción de hogares afectados por hechos delictivos dentro de la población estudiada.

base <- base %>%
  mutate(
    victima = ifelse(P20A == 10, 0, 1)
  )

library(knitr)

indice_ciudad <- base %>%
  summarise(
    `Índice de victimización (%)` =
      sum(victima * FACTOR, na.rm = TRUE) /
      sum(FACTOR, na.rm = TRUE) * 100
  ) %>%
  mutate(
    `Índice de victimización (%)` =
      round(`Índice de victimización (%)`, 1)
  )

kable(
  indice_ciudad,
  caption = "Tabla 1. Índice de victimización de la ciudad de Castellana"
)
Tabla 1. Índice de victimización de la ciudad de Castellana
Índice de victimización (%)
22.2

2.4.5 ii. ¿Cuál es el índice de victimización por comunas?

La tabla presenta el índice de victimización correspondiente a cada comuna. Los resultados permiten observar diferencias en la proporción de hogares que reportaron haber sido víctimas de al menos un delito. Las comunas con valores más altos presentan una mayor proporción de hogares victimizados, mientras que aquellas con valores más bajos registran una menor proporción de victimización.

library(dplyr)
library(knitr)

indice_comuna <- base %>%
  group_by(COMUNA) %>%
  summarise(
    `Índice de victimización (%)` =
      sum(victima * FACTOR, na.rm = TRUE) /
      sum(FACTOR, na.rm = TRUE) * 100
  ) %>%
  mutate(
    `Índice de victimización (%)` =
      round(`Índice de victimización (%)`, 1)
  ) %>%
  arrange(desc(`Índice de victimización (%)`))

kable(
  indice_comuna,
  caption = "Tabla 2. Índice de victimización por comuna"
)
Tabla 2. Índice de victimización por comuna
COMUNA Índice de victimización (%)
5 27.7
7 24.9
8 24.2
60 24.2
1 23.7
80 23.0
3 22.9
4 22.9
9 22.7
16 22.4
11 22.1
13 21.7
2 20.2
10 20.0
6 15.3
12 15.1
90 15.1
70 13.1
15 11.4
50 0.0

2.4.6 iii. ¿En qué comuna es mayor este índice?

La comuna 5 registró el mayor índice de victimización, con un valor de 27,7%. Este resultado indica que, frente a las demás comunas de la ciudad de Castellana, esta presenta la mayor proporción de hogares que reportaron haber sido víctimas de al menos un delito durante el período de referencia.

comuna_mayor <- indice_comuna %>%
  slice_max(`Índice de victimización (%)`, n = 1)

library(knitr)

comuna_mayor %>%
  mutate(
    `Índice de victimización (%)` =
      round(`Índice de victimización (%)`, 1)
  ) %>%
  kable(
    col.names = c("Comuna", "Índice de victimización (%)"),
    caption = "Tabla 3. Comuna con mayor índice de victimización"
  )
Tabla 3. Comuna con mayor índice de victimización
Comuna Índice de victimización (%)
5 27.7

2.4.7 iv. ¿En qué comuna es menor?

La comuna 50 registró el menor índice de victimización, con un valor de 0%. Este resultado indica que, dentro de la muestra analizada, no se reportaron hogares víctimas de al menos un delito en esta comuna durante el período de referencia.

library(dplyr)
library(knitr)

comuna_menor <- indice_comuna %>%
  slice_min(`Índice de victimización (%)`, n = 1)

comuna_menor %>%
  mutate(
    `Índice de victimización (%)` =
      round(`Índice de victimización (%)`, 1)
  ) %>%
  kable(
    col.names = c("Comuna", "Índice de victimización (%)"),
    caption = "Tabla 4. Comuna con menor índice de victimización"
  )
Tabla 4. Comuna con menor índice de victimización
Comuna Índice de victimización (%)
50 0

2.4.8 Figura 9. Índice de Victimización por Comuna

library(ggplot2)

ggplot(
  indice_comuna,
  aes(
    x = reorder(as.factor(COMUNA), `Índice de victimización (%)`),
    y = `Índice de victimización (%)`,
    fill = `Índice de victimización (%)`
  )
) +
  geom_col(width = 0.75) +
  geom_text(
    aes(label = round(`Índice de victimización (%)`, 1)),
    hjust = -0.2,
    fontface = "bold"
  ) +
  coord_flip() +
  scale_fill_gradient(
    low = "#FCE8EC",
    high = "#800935"
  ) +
  labs(
    title = "Figura 9. Índice de Victimización por Comuna",
    x = "Comuna",
    y = "Índice de victimización (%)"
  ) +
  theme_minimal() +
  theme(
    legend.position = "none",
    plot.title = element_text(
      face = "bold",
      hjust = 0.5
    )
  )