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/s12e09/Desktop/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

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" = "#1D3557",
      "Femenino" = "#E76F51"
    )
  ) +
  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(
      "#264653",
      "#2A9D8F",
      "#8AB17D",
      "#A7C957",
      "#E9C46A",
      "#F4A261",
      "#E76F51",
      "#D62828",
      "#9D4EDD",
      "#4361EE"
    )
  ) +
  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 muestra la distribución de los encuestados según estrato socioeconómico. Los resultados permiten caracterizar las condiciones socioeconómicas de los hogares participantes y evaluar la representatividad de los distintos niveles de ingreso dentro del estudio. El estrato constituye una variable relevante para comprender diferencias en las experiencias y percepciones relacionadas con 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(
      "#0B3954",
      "#1F7A8C",
      "#BFD7EA",
      "#FFB703",
      "#FB8500",
      "#D62828",
      "#6D597A"
    )
  ) +
  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 según su ocupación principal. Se identifican las actividades laborales predominantes dentro de la muestra, destacándose los grupos con mayor representación. Esta información permite contextualizar las condiciones socioeconómicas de la población estudiada y analizar posibles asociaciones entre situación laboral y percepción de seguridad.

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(
      "#4895EF",
      "#7209B7",
      "#4361EE",
      "#9D4EDD",
      "#D62828",
      "#E76F51",
      "#F4A261",
      "#E9C46A",
      "#A7C957",
      "#8AB17D",
      "#2A9D8F",
      "#264653"
    )
  ) +
  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 frecuencia fue Empleado/asalariado con 1.850 personas (39,6%), seguida de Trabaja independiente/propietario con 1.120 personas (24,0%). En contraste, las categorías con menor participación fueron Incapacitado/discapacitado y Cuidado de familiares, las cuales representaron menos del 2% de la muestra. Estos resultados evidencian una concentración de los encuestados en actividades laborales formales e independientes.

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

3 Percepción de Seguridad

3.0.1 Percepción Actual del Barrio

La Figura 5 presenta la percepción actual de seguridad en el barrio de residencia de los encuestados. Los resultados permiten identificar el nivel de seguridad percibido en el entorno más cercano y determinar la proporción de personas que consideran su barrio 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(
    "#003049",  # azul oscuro
    "#669BBC",  # azul medio
    "#A8DADC",  # azul claro
    "#E9F5F9"   # azul muy claro
  )
) +
  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
    )
  )

3.0.2 Percepción actual de la Comuna

La Figura 6 muestra la percepción actual de seguridad en la comuna. Este resultado permite comparar la sensación de seguridad cuando los encuestados evalúan un territorio más amplio que su barrio de residencia.

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(
    "#264653",  # azul petróleo
    "#2A9D8F",  # verde azulado
    "#E9C46A",  # amarillo suave
    "#E76F51"   # naranja coral
  )
) +
  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
    )
  )

3.0.3 Percepción actual de la seguridad cuidadana

La Figura 7 presenta la percepción actual de seguridad en la ciudad. Este indicador permite identificar cómo los ciudadanos valoran las condiciones generales de seguridad a escala urbana y compararlas con las percepciones reportadas para 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
    )
  )

3.0.4 Comparacion Entre Barrio, Comuna y Cuidad

La Figura 8 compara simultáneamente la percepción de seguridad en el barrio, la comuna y la ciudad. El análisis permite identificar cambios en la sensación de seguridad a medida que aumenta la escala territorial evaluada y facilita la identificación de posibles diferencias entre el entorno inmediato y el contexto urbano 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"   = "#264653",  # azul petróleo
    "Seguro"       = "#2A9D8F",  # verde azulado
    "Inseguro"     = "#E9C46A",  # amarillo suave
    "Muy inseguro" = "#E76F51"   # naranja coral
  )
) +
  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
    )
  )

4 Indice de Victimización

4.0.1 ¿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 indica que aproximadamente 22 de cada 100 hogares reportaron haber sido víctimas de al menos un delito durante el período de referencia.

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

4.0.2 ¿Cuál es el índice de victimización por comunas?

La tabla presenta el índice de victimización por comuna. Se observa que las comunas con mayores valores registran una mayor proporción de hogares víctimas de al menos un delito, mientras que las comunas con menores valores presentan una menor incidencia 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

4.0.3 ¿En qué comuna es mayor este índice?

La comuna 5 registró el mayor índice de victimización, con un valor de 27.7%. Esto indica que, en comparación con las demás comunas de la ciudad de Castellana, 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

4.0.4 ¿En qué comuna es menor?

La comuna 50 registró el menor índice de victimización, con un valor de 0%, lo que indica una menor proporción de hogares víctimas de al menos un delito en comparación con las demás comunas evaluadas.

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

4.0.5 Í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 = "#A8DADC",
    high = "#264653"
  ) +
  labs(
    title = "Í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
    )
  )




UNIVERSIDAD CATÓLICA DE COLOMBIA

Elaborado por

Nicole Eliana Jiménez Varón

Bogotá D. C.
2025