Introducción

Este informe analiza la encuesta sobre seguridad, convivencia ciudadana y confianza institucional aplicada a jefes de hogar de la ciudad de Castellana. La información viene en dos archivos: BD1 (datos de identificación y sociodemográficos) y BD2 (preguntas de percepción, victimización y el factor de expansión). Los dos se unen con la variable REGISTRO. Todos los porcentajes se calculan ponderados con el factor de expansión (FACTOR).

Preparación de los datos

library(readxl)     
library(dplyr)       
library(tidyr)       
library(ggplot2)     
library(knitr)      
library(kableExtra)  
library(scales)     
# 1. Leer las dos bases y unirlas por REGISTRO
bd1 <- read_excel("BD1.xlsx")
bd2 <- read_excel("BD2.xlsx")

# BD2 tiene más de 400 columnas: se guardan solo las que se usan (menos memoria)
bd2 <- bd2 %>%
  select(REGISTRO, P1, P2, P3, P4, P5, P6, P20A, P110, P111, FACTOR)
gc()
##           used (Mb) gc trigger  (Mb) max used  (Mb)
## Ncells 1154994 61.7    2367372 126.5  2367372 126.5
## Vcells 2135505 16.3    8388608  64.0  8388306  64.0
datos <- inner_join(bd1, bd2, by = "REGISTRO")

dim(datos)  # número de encuestas y de variables
## [1] 4673   24
# 2. Poner nombres de etiquetas a los códigos, según el diccionario de datos
esc_seg  <- c("Muy seguro", "Seguro", "Inseguro", "Muy inseguro")
esc_anio <- c("Más seguro", "Menos seguro", "Igual", "NS/NR")

datos <- datos %>%
  mutate(
    genero = factor(GENERO, levels = 1:2, labels = c("Masculino", "Femenino")),
    estrato = factor(ESTRATO_DEC, levels = 1:7,
                     labels = c(paste("Estrato", 1:6), "Sin estrato")),
    edad_rango = 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")),
    ocupacion = factor(PD, levels = c(1, 2, 3, 4, 5, 6, 10, 11, 77, 88, 99),
                       labels = c("Empleado/asalariado", "Independiente/propietario",
                                  "Retirado/jubilado", "Desempleado", "Ama de casa",
                                  "Estudiante", "Incapacitado", "Cuidado de familiares",
                                  "Otros", "Ninguno", "No responde")),
    educacion = factor(P110, levels = c(1:6, 990),
                       labels = c("Preescolar", "Primaria", "Secundaria", "Técnico",
                                  "Superior o universitario", "Postgrado", "Ninguno")),
    ingreso = factor(P111, levels = c(1:8, 999),
                     labels = c("Menos de $100.000", "$100.000 a $350.000",
                                "$350.001 a $700.000", "$700.001 a $1.000.000",
                                "$1.000.001 a $2.000.000", "$2.000.001 a $3.500.000",
                                "$3.500.001 a $5.000.000", "Más de $5.000.000",
                                "NS/NR")),
    # Comunas (códigos 1 a 16) y corregimientos (códigos 50 a 90)
    comuna = ifelse(COMUNA < 50, paste("Comuna", COMUNA),
                    paste("Corregimiento", COMUNA)),
    comuna = factor(comuna, levels = unique(comuna[order(COMUNA)])),
    # Percepción de seguridad (P1 barrio, P3 comuna, P5 ciudad)
    barrio = factor(P1, levels = 1:4, labels = esc_seg),
    comuna_seg = factor(P3, levels = 1:4, labels = esc_seg),
    ciudad = factor(P5, levels = 1:4, labels = esc_seg),
    # Comparación con hace un año (P2 barrio, P4 comuna, P6 ciudad)
    barrio_anio = factor(P2, levels = c(1, 2, 3, 999), labels = esc_anio),
    comuna_anio = factor(P4, levels = c(1, 2, 3, 999), labels = esc_anio),
    ciudad_anio = factor(P6, levels = c(1, 2, 3, 999), labels = esc_anio),
    # 1 = se siente seguro (muy seguro o seguro), 0 = inseguro
    seg_barrio = as.integer(P1 %in% 1:2),
    seg_comuna = as.integer(P3 %in% 1:2),
    seg_ciudad = as.integer(P5 %in% 1:2)
  )

# 3. Fuentes de tablas
fuente <- paste("Elaboración propia",
                "(BD1 y BD2).")
fuente_fig <- paste("Fuente:", fuente)

# Formato de números en español: coma decimal y punto de miles
fmt <- function(x, d = 1) formatC(x, format = "f", digits = d,
                                  decimal.mark = ",", big.mark = ".")

# Porcentaje ponderado de cada categoría de una variable
pct_pond <- function(df, var) {
  df %>%
    filter(!is.na({{ var }})) %>%
    group_by({{ var }}) %>%
    summarise(encuestas = n(), poblacion = sum(FACTOR), .groups = "drop") %>%
    mutate(porcentaje = 100 * poblacion / sum(poblacion))
}

# Tabla con formato, numerada y con fuente
tabla <- function(df, titulo, align = c("l", rep("r", ncol(df) - 1))) {
  formato <- if (knitr::is_latex_output()) "latex" else "html"
  kable(df, format = formato, caption = titulo, booktabs = TRUE, align = align) %>%
    kable_styling(latex_options = c("HOLD_position", "striped"),
                  bootstrap_options = c("striped", "hover", "condensed"),
                  full_width = FALSE) %>%
    footnote(general = fuente, general_title = "Fuente:",
             footnote_as_chunk = TRUE,
             threeparttable = knitr::is_latex_output())
}

poblacion_total <- sum(datos$FACTOR)

La base final tiene 4.673 encuestas.

a) Caracterización social y económica de la población

Género y estrato

g <- pct_pond(datos, genero) %>% rename(Categoría = genero)
e <- pct_pond(datos, estrato) %>% rename(Categoría = estrato)

bind_rows(g, e) %>%
  mutate(
    encuestas = fmt(encuestas, 0),
    poblacion = fmt(poblacion, 0),
    porcentaje = fmt(porcentaje)
  ) %>%
  rename(
    Encuestas = encuestas,
    `Población expandida` = poblacion,
    `%` = porcentaje
  ) %>%
  tabla("Distribución de la población por género y estrato")
Distribución de la población por género y estrato
Categoría Encuestas Población expandida %
Masculino 2.290 669.165 45,9
Femenino 2.383 789.736 54,1
Estrato 1 753 191.004 13,1
Estrato 2 2.026 625.237 42,9
Estrato 3 1.282 427.090 29,3
Estrato 4 141 64.823 4,4
Estrato 5 82 24.433 1,7
Estrato 6 3 532 0,0
Sin estrato 386 125.780 8,6
Fuente: Elaboración propia (BD1 y BD2).
ggplot(e, aes(x = Categoría, y = porcentaje / 100)) +
  geom_col(fill = "blue") +
  geom_text(aes(label = paste0(fmt(porcentaje), "%")), vjust = -0.4, size = 3.5) +
  scale_y_continuous(labels = percent_format(), expand = expansion(mult = c(0, 0.1))) +
  labs(x = NULL, y = "Porcentaje de la población", caption = fuente_fig) +
  theme_minimal()
Distribución de la población por estrato socioeconómico

Distribución de la población por estrato socioeconómico

Como muestra la Tabla la población está repartida de forma casi pareja entre los géneros: el 54% son mujeres y el 46% hombres. En cuanto al estrato se evidencia que es una ciudad de estratos bajos y medios: la mayoría de la población vive en estratos 1, 2 y 3. El estrato 2 es el más común con un 42%, seguido del estrato 3 29%.

Edad

tab_edad <- datos %>%
  group_by(Grupo = as.character(genero)) %>%
  summarise(
    Encuestas = sum(!is.na(PC_EDAD)),
    `Media ponderada` = weighted.mean(PC_EDAD, FACTOR, na.rm = TRUE),
    Mediana = median(PC_EDAD, na.rm = TRUE),
    `Desv. estándar` = sd(PC_EDAD, na.rm = TRUE),
    Mínimo = min(PC_EDAD, na.rm = TRUE),
    Máximo = max(PC_EDAD, na.rm = TRUE),
    .groups = "drop"
  )

tab_edad %>%
  mutate(
    Encuestas = fmt(Encuestas, 0),
    `Media ponderada` = fmt(`Media ponderada`),
    `Desv. estándar` = fmt(`Desv. estándar`)
  ) %>%
  tabla("Estadísticas descriptivas de la edad (años) por género")
Estadísticas descriptivas de la edad (años) por género
Grupo Encuestas Media ponderada Mediana Desv. estándar Mínimo Máximo
Femenino 2.376 44,0 50 18,2 16 98
Masculino 2.289 38,8 44 19,0 15 92
Fuente: Elaboración propia (BD1 y BD2).

Según la Tabla los encuestados tienen en promedio 44 años las mujeres y 39 años los hombres y entre los encuestados hay edades minimas de 15 años hasta 98, lo que muestra que se encuestaron personas de todas las edades.

Ocupación

ocu <- pct_pond(datos, ocupacion) %>%
  filter(porcentaje >= 0.5)   # se omiten categorías con menos de 0,5%

ggplot(ocu, aes(x = reorder(ocupacion, porcentaje), y = porcentaje / 100)) +
  geom_col(fill = "pink") +
  geom_text(aes(label = paste0(fmt(porcentaje), "%")), hjust = -0.1, size = 3.5) +
  coord_flip() +
  scale_y_continuous(labels = percent_format(), expand = expansion(mult = c(0, 0.15))) +
  labs(x = NULL, y = "Porcentaje de la población", caption = fuente_fig) +
  theme_minimal()
Ocupación principal de la población encuestada

Ocupación principal de la población encuestada

La grafica muestra que la ocupación más común es ama de casa, seguida de empleado asalariado y trabajador independiente. En total, el 48,8% de la población trabaja (empleados más independientes). El 8,7% está desempleado. Que haya tantas amas de casa coincide con que la mayoría de los encuestados son mujeres.

Nivel educativo e ingreso del hogar

ed <- pct_pond(datos, educacion) %>% rename(Categoría = educacion)
ing <- pct_pond(datos, ingreso) %>% rename(Categoría = ingreso)

bind_rows(ed, ing) %>%
  mutate(
    encuestas = fmt(encuestas, 0),
    poblacion = fmt(poblacion, 0),
    porcentaje = fmt(porcentaje)
  ) %>%
  rename(
    Encuestas = encuestas,
    `Población expandida` = poblacion,
    `%` = porcentaje
  ) %>%
  tabla("Nivel educativo de la persona encuestada e ingreso mensual del hogar")
Nivel educativo de la persona encuestada e ingreso mensual del hogar
Categoría Encuestas Población expandida %
Preescolar 40 10.625 0,7
Primaria 1.149 275.925 18,9
Secundaria 1.984 641.540 44,0
Técnico 787 291.158 20,0
Superior o universitario 477 169.265 11,6
Postgrado 114 46.129 3,2
Ninguno 122 24.259 1,7
Menos de $100.000 164 45.177 3,1
$100.000 a $350.000 334 95.007 6,5
$350.001 a $700.000 515 151.077 10,4
$700.001 a $1.000.000 1.158 338.184 23,2
$1.000.001 a $2.000.000 1.422 436.364 29,9
$2.000.001 a $3.500.000 450 179.370 12,3
$3.500.001 a $5.000.000 189 77.386 5,3
Más de $5.000.000 92 39.253 2,7
NS/NR 349 97.081 6,7
Fuente: Elaboración propia (BD1 y BD2).

La Tabla muestra que el nivel educativo más frecuente es la secundaria, seguido de la primaria. Solo el 35% alcanzó estudios técnicos, universitarios o de postgrado. En cuanto al ingreso, el grupo más grande gana entre 1.000.000 y 2.000.000 al mes. El 43% de los hogares recibe 1.000.000 o menos, y apenas el 8% supera los 3.500.000.

En resumen, con los analisis realiados del punto a) la población es sobre todo de estratos 1 a 3, tiene un nivel educativo básico o medio e ingresos bajos y medios. Hay más de mujeres que de hombres y una edad promedio cercana a los 42 años.

b) Percepción de seguridad en el barrio, la comuna y la ciudad

percep <- bind_rows(
  pct_pond(datos, barrio) %>%
    rename(nivel = barrio) %>%
    mutate(ambito = "Barrio"),

  pct_pond(datos, comuna_seg) %>%
    rename(nivel = comuna_seg) %>%
    mutate(ambito = "Comuna"),

  pct_pond(datos, ciudad) %>%
    rename(nivel = ciudad) %>%
    mutate(ambito = "Ciudad")
)

percep %>%
  select(ambito, nivel, porcentaje) %>%
  mutate(porcentaje = fmt(porcentaje)) %>%
  rename(
    Ámbito = ambito,
    `¿Cómo se siente?` = nivel,
    `%` = porcentaje
  ) %>%
  tabla("Percepción de seguridad en el barrio, la comuna y la ciudad (% de la población)")
Percepción de seguridad en el barrio, la comuna y la ciudad (% de la población)
Ámbito ¿Cómo se siente? %
Barrio Muy seguro 10,8
Barrio Seguro 72,2
Barrio Inseguro 13,6
Barrio Muy inseguro 3,4
Comuna Muy seguro 8,2
Comuna Seguro 70,4
Comuna Inseguro 16,9
Comuna Muy inseguro 4,5
Ciudad Muy seguro 4,3
Ciudad Seguro 44,9
Ciudad Inseguro 40,2
Ciudad Muy inseguro 10,6
Fuente: Elaboración propia (BD1 y BD2).
ggplot(percep, aes(x = ambito, y = porcentaje / 100, fill = nivel)) +
  geom_col(width = 0.6) +
  scale_y_continuous(labels = percent_format()) +
  scale_fill_brewer(palette = "Set2") +
  labs(
    x = NULL,
    y = "Porcentaje de la población",
    fill = NULL,
    caption = fuente_fig
  ) +
  theme_minimal() +
  theme(legend.position = "bottom")
Percepción de seguridad según el ámbito territorial

Percepción de seguridad según el ámbito territorial

La Tabla y la grafica muestran que mientras más lejos de su entorno, menos segura se siente la gente: en el barrio el 83,0% se siente seguro o muy seguro, en la comuna el 78,6% y en la ciudad solo el 49,2%, es decir, cerca de la mitad de la población se siente insegura o muy insegura en la ciudad. Esto pasa porque las personas conocen su barrio y a sus vecinos, mientras que la ciudad les parece más lejana y peligrosa, en parte por lo que ven en las noticias.

c) ¿Cambia la percepción según el género y el estrato?

Según el género

seg_genero <- datos %>%
  group_by(genero) %>%
  summarise(
    Barrio = 100 * weighted.mean(seg_barrio, FACTOR),
    Comuna = 100 * weighted.mean(seg_comuna, FACTOR),
    Ciudad = 100 * weighted.mean(seg_ciudad, FACTOR),
    .groups = "drop"
  )

seg_genero %>%
  mutate(across(-genero, ~ fmt(.x))) %>%
  rename(Género = genero) %>%
  tabla("Porcentaje de personas que se sienten seguras o muy seguras, por género")
Porcentaje de personas que se sienten seguras o muy seguras, por género
Género Barrio Comuna Ciudad
Masculino 86,9 82,0 56,6
Femenino 79,6 75,7 42,9
Fuente: Elaboración propia (BD1 y BD2).

Sí, la percepción cambia según el género. Como se ve en la Tabla, las mujeres se sienten menos seguras que los hombres en los tres ámbitos; la mayor diferencia está en la ciudad.

Según el estrato

seg_estrato <- datos %>%
  group_by(estrato) %>%
  summarise(
    Encuestas = n(),
    Barrio = 100 * weighted.mean(seg_barrio, FACTOR),
    Comuna = 100 * weighted.mean(seg_comuna, FACTOR),
    Ciudad = 100 * weighted.mean(seg_ciudad, FACTOR),
    .groups = "drop"
  )

seg_estrato %>%
  mutate(
    Encuestas = fmt(Encuestas, 0),
    across(c(Barrio, Comuna, Ciudad), ~ fmt(.x))
  ) %>%
  rename(Estrato = estrato) %>%
  tabla("Porcentaje de personas que se sienten seguras o muy seguras, por estrato")
Porcentaje de personas que se sienten seguras o muy seguras, por estrato
Estrato Encuestas Barrio Comuna Ciudad
Estrato 1 753 83,3 80,7 54,2
Estrato 2 2.026 85,9 81,1 51,2
Estrato 3 1.282 80,3 76,2 44,5
Estrato 4 141 70,9 64,5 35,8
Estrato 5 82 60,0 55,5 41,1
Estrato 6 3 100,0 68,1 57,9
Sin estrato 386 87,8 83,2 56,2
Fuente: Elaboración propia (BD1 y BD2).

Sí, también cambia según el estrato. La Tabla @ref(tab:tab-estrato-seg) muestra que los estratos altos se sienten menos seguros que los bajos.

d) Índice de victimización

El índice de victimización identifica si un hogar fue víctima de por lo menos uno de estos delitos: hurto a personas, hurto a residencias, hurto a establecimientos comerciales, hurto de vehículos o extorsiones/vacunas. Su fórmula es:

Según el diccionario, en P20A los códigos de esos delitos son 1, 2, 3, 4 y 6.

datos <- datos %>%
  mutate(victima = as.integer(P20A %in% c(1, 2, 3, 4, 6)))

# Índice para toda la ciudad (en porcentaje)
indice_ciudad <- 100 * sum(datos$victima * datos$FACTOR) / sum(datos$FACTOR)
indice_ciudad
## [1] 19.95605

Índice para la ciudad de Castellana

tibble(Indicador = c("Encuestas", "Hogares víctimas",
                     "Población", "Población víctima",
                     "Índice de victimización"),
       Valor = c(fmt(nrow(datos), 0), fmt(sum(datos$victima), 0),
                 fmt(sum(datos$FACTOR), 0),
                 fmt(sum(datos$victima * datos$FACTOR), 0),
                 paste0(fmt(indice_ciudad, 2), "%"))) %>%
  tabla("Índice de victimización de la ciudad de Castellana", align = "lr")
Índice de victimización de la ciudad de Castellana
Indicador Valor
Encuestas 4.673
Hogares víctimas 850
Población 1.458.900
Población víctima 291.139
Índice de victimización 19,96%
Fuente: Elaboración propia (BD1 y BD2).

Como se ve en la Tabla @ref(tab:tab-indice-ciudad), el índice de victimización de Castellana es 19.96%. Es decir, aproximadamente 1 de cada 5 hogares fue víctima de al menos uno de los delitos evaluados.

Índice por comunas

ind_comuna <- datos %>%
  group_by(comuna) %>%
  summarise(Encuestas = n(),
            Víctimas = sum(victima),
            Índice = 100 * sum(victima * FACTOR) / sum(FACTOR)) %>%
  arrange(desc(Índice))

ind_comuna %>%
  mutate(Índice = paste0(fmt(Índice, 2), "%")) %>%
  rename(`Comuna / Corregimiento` = comuna) %>%
  tabla("Índice de victimización por comuna y corregimiento (de mayor a menor)")
Índice de victimización por comuna y corregimiento (de mayor a menor)
Comuna / Corregimiento Encuestas Víctimas Índice
Comuna 5 219 51 27,57%
Comuna 7 293 63 23,44%
Corregimiento 60 156 35 22,95%
Comuna 4 404 76 22,52%
Comuna 8 375 82 21,57%
Comuna 13 393 57 20,79%
Comuna 16 268 48 20,78%
Comuna 3 373 76 20,52%
Comuna 2 405 79 19,68%
Comuna 9 389 71 18,90%
Comuna 1 282 40 18,18%
Comuna 10 109 24 18,00%
Corregimiento 80 250 43 16,98%
Comuna 12 44 7 15,12%
Corregimiento 90 31 3 14,28%
Comuna 6 394 56 13,76%
Comuna 11 62 13 13,14%
Corregimiento 70 129 13 12,71%
Comuna 15 94 13 11,28%
Corregimiento 50 3 0 0,00%
Fuente: Elaboración propia (BD1 y BD2).
ggplot(ind_comuna, aes(x = reorder(comuna, Índice), y = Índice / 100)) +
  geom_col(aes(fill = Índice > indice_ciudad)) +
  geom_hline(yintercept = indice_ciudad / 100, linetype = "dashed") +
  annotate("text", x = 2, y = indice_ciudad / 100, hjust = -0.05, size = 3.3,
           label = paste0("Ciudad: ", fmt(indice_ciudad), "%")) +
  geom_text(aes(label = paste0(fmt(Índice), "%")), hjust = -0.1, size = 3) +
  coord_flip() +
  scale_y_continuous(labels = percent_format(), expand = expansion(mult = c(0, 0.15))) +
  scale_fill_manual(values = c("FALSE" = "#7cc09f", "TRUE" = "#c0392b"),
                    labels = c("Por debajo de la ciudad", "Por encima de la ciudad")) +
  labs(x = NULL, y = "Índice de victimización", fill = NULL, caption = fuente_fig) +
  theme_minimal() +
  theme(legend.position = "bottom")
Índice de victimización por comuna y corregimiento

Índice de victimización por comuna y corregimiento

La Tabla y la grafica muestran el índice por comuna.

  • ¿En qué comuna es mayor el índice? En la comuna 5, con un índice de 27,6%.
  • ¿En qué comuna es menor? El valor más bajo es el de la comuna 15, con 11,3%. (El corregimiento 50 aparece con 0%, pero solo tiene 3 encuestas, muy pocas para tenerlo en cuenta.)

Conclusiones

  1. La población encuestada de la cuidad es sobre todo de estratos 1 a 3, con educación secundaria o menos e ingresos del hogar casi siempre por debajo de 2.000.000. Hay más de mujeres encuestadas y la edad promedio es de 42 años.
  2. La sensación de seguridad es baja a medida que el territorio se aleja de la casa.
  3. Las mujeres y los estratos altos se sienten más inseguros.
  4. El índice de victimización de la ciudad es 19,96%. La comuna 5 es la más afectada (27,6%) y la comuna 15 la menos afectada (11,3%).