Directorio de trabajo
setwd(“C:/Users/judith.ramos/OneDrive - SEMILLAS ELITE DE PALMA PARA
LAS AMÉRICAS S.A.S/Escritorio/Taller 2 R”)
library(tidyverse) library(readxl) library(knitr) library(ggplot)
###install.packages("tinytex")
####tinytex::install_tinytex()
####install.packages("ggplot")
####install.packages("tidyverse")
library(tidyverse)
library(readxl)
library(knitr)
# 1. Carga de datos y unión:
bd1 <- read_excel("BD1.xlsx")
bd2 <- read_excel("BD2.xlsx")
base_completa <- left_join(bd1, bd2, by = "REGISTRO")
# 2. Estructura unificada:
##### Punto A
base_analisis <- base_completa %>%
mutate(
# A) Género
genero_txt = case_when(
GENERO == 1 ~ "Masculino",
GENERO == 2 ~ "Femenino",
TRUE ~ "No informa"
),
# B) Estrato (usando la columna real ESTRATO_DEC)
estrato_txt = case_when(
ESTRATO_DEC == 1 ~ "Estrato 1",
ESTRATO_DEC == 2 ~ "Estrato 2",
ESTRATO_DEC == 3 ~ "Estrato 3",
ESTRATO_DEC == 4 ~ "Estrato 4",
ESTRATO_DEC == 5 ~ "Estrato 5",
ESTRATO_DEC == 6 ~ "Estrato 6",
TRUE ~ "Sin Estrato / No Sabe"
),
# C) Edad (limpiando códigos del sistema como 999)
edad_num = if_else(PC_EDAD == 999, NA_real_, as.numeric(PC_EDAD)),
# D) Ocupación (según las etiquetas del diccionario de datos)
ocupacion_txt = case_when(
PD == 1 ~ "Empleado",
PD == 2 ~ "Independiente",
PD == 3 ~ "Jubilado",
PD == 4 ~ "Desempleado",
PD == 5 ~ "Ama de Casa",
PD == 6 ~ "Estudiante",
TRUE ~ "Otra / No Responde"
)
) %>%
# Filtramos los datos sin estrato para limpiar las tablas y gráficos
filter(estrato_txt != "Sin Estrato / No Sabe")
# TABLA NUMERADA # 1
tabla_caracterizacion <- base_analisis %>%
group_by(estrato_txt, ocupacion_txt, genero_txt) %>%
summarise(
Cantidad_Hogares = n(),
Edad_Promedio = mean(edad_num, na.rm = TRUE),
.groups = 'drop'
)
kable(tabla_caracterizacion, digits = 1,
caption = "Tabla 1: Caracterización Socioeconómica de los jefes de hogar",
booktabs = TRUE)
Tabla 1: Caracterización Socioeconómica de los jefes de
hogar
| Estrato 1 |
Ama de Casa |
Femenino |
243 |
48.8 |
| Estrato 1 |
Desempleado |
Femenino |
18 |
38.2 |
| Estrato 1 |
Desempleado |
Masculino |
62 |
42.4 |
| Estrato 1 |
Empleado |
Femenino |
59 |
32.8 |
| Estrato 1 |
Empleado |
Masculino |
114 |
34.3 |
| Estrato 1 |
Estudiante |
Femenino |
18 |
18.9 |
| Estrato 1 |
Estudiante |
Masculino |
37 |
18.7 |
| Estrato 1 |
Independiente |
Femenino |
56 |
39.3 |
| Estrato 1 |
Independiente |
Masculino |
100 |
45.0 |
| Estrato 1 |
Jubilado |
Femenino |
4 |
71.0 |
| Estrato 1 |
Jubilado |
Masculino |
16 |
67.6 |
| Estrato 1 |
Otra / No Responde |
Femenino |
6 |
35.5 |
| Estrato 1 |
Otra / No Responde |
Masculino |
20 |
49.9 |
| Estrato 2 |
Ama de Casa |
Femenino |
590 |
53.7 |
| Estrato 2 |
Ama de Casa |
Masculino |
7 |
44.3 |
| Estrato 2 |
Desempleado |
Femenino |
48 |
40.5 |
| Estrato 2 |
Desempleado |
Masculino |
143 |
52.7 |
| Estrato 2 |
Empleado |
Femenino |
167 |
37.2 |
| Estrato 2 |
Empleado |
Masculino |
343 |
36.8 |
| Estrato 2 |
Estudiante |
Femenino |
54 |
20.9 |
| Estrato 2 |
Estudiante |
Masculino |
84 |
19.5 |
| Estrato 2 |
Independiente |
Femenino |
144 |
43.0 |
| Estrato 2 |
Independiente |
Masculino |
267 |
44.1 |
| Estrato 2 |
Jubilado |
Femenino |
32 |
68.5 |
| Estrato 2 |
Jubilado |
Masculino |
97 |
68.1 |
| Estrato 2 |
Otra / No Responde |
Femenino |
16 |
59.3 |
| Estrato 2 |
Otra / No Responde |
Masculino |
34 |
59.8 |
| Estrato 3 |
Ama de Casa |
Femenino |
340 |
58.9 |
| Estrato 3 |
Ama de Casa |
Masculino |
6 |
60.0 |
| Estrato 3 |
Desempleado |
Femenino |
21 |
38.5 |
| Estrato 3 |
Desempleado |
Masculino |
80 |
52.5 |
| Estrato 3 |
Empleado |
Femenino |
94 |
38.4 |
| Estrato 3 |
Empleado |
Masculino |
191 |
40.8 |
| Estrato 3 |
Estudiante |
Femenino |
29 |
19.6 |
| Estrato 3 |
Estudiante |
Masculino |
47 |
20.1 |
| Estrato 3 |
Independiente |
Femenino |
108 |
47.6 |
| Estrato 3 |
Independiente |
Masculino |
192 |
48.0 |
| Estrato 3 |
Jubilado |
Femenino |
41 |
67.8 |
| Estrato 3 |
Jubilado |
Masculino |
109 |
69.4 |
| Estrato 3 |
Otra / No Responde |
Femenino |
5 |
56.2 |
| Estrato 3 |
Otra / No Responde |
Masculino |
19 |
57.3 |
| Estrato 4 |
Ama de Casa |
Femenino |
34 |
58.5 |
| Estrato 4 |
Desempleado |
Femenino |
3 |
31.0 |
| Estrato 4 |
Desempleado |
Masculino |
6 |
56.5 |
| Estrato 4 |
Empleado |
Femenino |
12 |
43.3 |
| Estrato 4 |
Empleado |
Masculino |
20 |
46.0 |
| Estrato 4 |
Estudiante |
Femenino |
3 |
19.3 |
| Estrato 4 |
Estudiante |
Masculino |
4 |
20.5 |
| Estrato 4 |
Independiente |
Femenino |
11 |
44.7 |
| Estrato 4 |
Independiente |
Masculino |
26 |
45.6 |
| Estrato 4 |
Jubilado |
Femenino |
4 |
74.5 |
| Estrato 4 |
Jubilado |
Masculino |
15 |
69.1 |
| Estrato 4 |
Otra / No Responde |
Femenino |
1 |
18.0 |
| Estrato 4 |
Otra / No Responde |
Masculino |
2 |
68.0 |
| Estrato 5 |
Ama de Casa |
Femenino |
14 |
65.4 |
| Estrato 5 |
Ama de Casa |
Masculino |
1 |
59.0 |
| Estrato 5 |
Desempleado |
Masculino |
1 |
85.0 |
| Estrato 5 |
Empleado |
Femenino |
8 |
40.6 |
| Estrato 5 |
Empleado |
Masculino |
15 |
44.6 |
| Estrato 5 |
Estudiante |
Femenino |
2 |
21.5 |
| Estrato 5 |
Estudiante |
Masculino |
1 |
28.0 |
| Estrato 5 |
Independiente |
Femenino |
6 |
49.7 |
| Estrato 5 |
Independiente |
Masculino |
14 |
54.3 |
| Estrato 5 |
Jubilado |
Femenino |
4 |
66.8 |
| Estrato 5 |
Jubilado |
Masculino |
15 |
69.1 |
| Estrato 5 |
Otra / No Responde |
Masculino |
1 |
82.0 |
| Estrato 6 |
Ama de Casa |
Femenino |
1 |
50.0 |
| Estrato 6 |
Empleado |
Femenino |
1 |
45.0 |
| Estrato 6 |
Independiente |
Masculino |
1 |
18.0 |
# =========================================================================
# GRÁFICA 1: OCUPACIÓN
# =========================================================================
ggplot(base_analisis, aes(x = ocupacion_txt, fill = ocupacion_txt)) +
geom_bar() +
labs(
title = "Gráfica 1: Distribución según la Ocupación Actual",
x = "Ocupación",
y = "Cantidad de Encuestados",
caption = "Fuente: Elaboración propia a partir de datos de la encuesta."
) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1), legend.position = "none")

# =========================================================================
# GRÁFICA 2: ESTRATO Y GÉNERO
# =========================================================================
ggplot(base_analisis, aes(x = estrato_txt, fill = genero_txt)) +
geom_bar(position = "dodge") +
labs(
title = "Gráfica 2: Distribución por Estrato Socioeconómico y Género",
x = "Estrato",
y = "Cantidad de Hogares",
fill = "Género",
caption = "Fuente: Elaboración propia a partir de datos de la encuesta."
) +
theme_minimal()

##### Punto B
# 2. Definicion de Variables:
mis_niveles <- c("Muy seguro", "Seguro", "Inseguro", "Muy inseguro", "No responde")
# 3. Codificar variables nuevas:
base_analisis <- base_completa %>%
mutate(
# Percepción en el Barrio (P1)
percepcion_barrio = case_when(
P1 == 1 ~ "Muy seguro",
P1 == 2 ~ "Seguro",
P1 == 3 ~ "Inseguro",
P1 == 4 ~ "Muy inseguro",
TRUE ~ "No responde"
),
# Percepción en la Comuna (P3)
percepcion_comuna = case_when(
P3 == 1 ~ "Muy seguro",
P3 == 2 ~ "Seguro",
P3 == 3 ~ "Inseguro",
P3 == 4 ~ "Muy inseguro",
TRUE ~ "No responde"
),
# Percepción en la Ciudad (P5)
percepcion_ciudad = case_when(
P5 == 1 ~ "Muy seguro",
P5 == 2 ~ "Seguro",
P5 == 3 ~ "Inseguro",
P5 == 4 ~ "Muy inseguro",
TRUE ~ "No responde"
)
)
# 4. Aplicar el orden jerárquico a los factores usando la variable externa
base_analisis$percepcion_barrio <- factor(base_analisis$percepcion_barrio, levels = mis_niveles)
base_analisis$percepcion_comuna <- factor(base_analisis$percepcion_comuna, levels = mis_niveles)
base_analisis$percepcion_ciudad <- factor(base_analisis$percepcion_ciudad, levels = mis_niveles)
# =========================================================================
# GRÁFICA 3: PERCEPCIÓN DE SEGURIDAD EN EL BARRIO (P1)
# =========================================================================
ggplot(base_analisis, aes(x = percepcion_barrio, weight = FACTOR, fill = percepcion_barrio)) +
geom_bar() +
scale_fill_brewer(palette = "RdYlGn", direction = -1) +
labs(
title = "Gráfica 3: Percepción de Seguridad en el Barrio",
x = "Nivel de Percepción",
y = "Población Estimada (Ponderada)",
caption = "Fuente: Elaboración propia a partir de datos de la encuesta."
) +
theme_minimal() +
theme(legend.position = "none")

# =========================================================================
# GRÁFICA 4: PERCEPCIÓN DE SEGURIDAD EN LA COMUNA
# =========================================================================
ggplot(base_analisis, aes(x = percepcion_comuna, weight = FACTOR, fill = percepcion_comuna)) +
geom_bar() +
scale_fill_brewer(palette = "RdYlGn", direction = -1) +
labs(
title = "Gráfica 4: Percepción de Seguridad en la Comuna o Corregimiento (P3)",
x = "Nivel de Percepción",
y = "Población Estimada (Ponderada)",
caption = "Fuente: Elaboración propia a partir de datos de la encuesta."
) +
theme_minimal() +
theme(legend.position = "none")

# =========================================================================
# GRÁFICA 5: PERCEPCIÓN DE SEGURIDAD EN LA CIUDAD (P5)
# =========================================================================
ggplot(base_analisis, aes(x = percepcion_ciudad, weight = FACTOR, fill = percepcion_ciudad)) +
geom_bar() +
scale_fill_brewer(palette = "RdYlGn", direction = -1) +
labs(
title = "Gráfica 5: Percepción de Seguridad General en la Ciudad (P5)",
x = "Nivel de Percepción",
y = "Población Estimada (Ponderada)",
caption = "Fuente: Elaboración propia a partir de datos de la encuesta."
) +
theme_minimal() +
theme(legend.position = "none")

### varible seguridad, genero y estrato
base_analisis <- base_completa %>%
mutate(
genero_txt = case_when(GENERO == 1 ~ "Masculino", GENERO == 2 ~ "Femenino", TRUE ~ "No informa"),
estrato_txt = case_when(
ESTRATO_DEC == 1 ~ "Estrato 1", ESTRATO_DEC == 2 ~ "Estrato 2",
ESTRATO_DEC == 3 ~ "Estrato 3", ESTRATO_DEC == 4 ~ "Estrato 4",
ESTRATO_DEC == 5 ~ "Estrato 5", ESTRATO_DEC == 6 ~ "Estrato 6",
TRUE ~ "Sin Estrato"
),
# Creamos variables binarias (1 si se siente Inseguro o Muy Inseguro, 0 si no)
inseguro_barrio = if_else(P1 %in% c(3, 4), 1, 0),
inseguro_comuna = if_else(P3 %in% c(3, 4), 1, 0),
inseguro_ciudad = if_else(P5 %in% c(3, 4), 1, 0)
) %>%
filter(estrato_txt != "Sin Estrato")
# =========================================================================
# TABLA DE PORCENTAJES DE INSEGURIDAD CRUZA
# =========================================================================
tabla_impacto <- base_analisis %>%
group_by(estrato_txt, genero_txt) %>%
summarise(
`% Inseguridad Barrio` = (sum(inseguro_barrio * FACTOR, na.rm = TRUE) / sum(FACTOR, na.rm = TRUE)) * 100,
`% Inseguridad Comuna` = (sum(inseguro_comuna * FACTOR, na.rm = TRUE) / sum(FACTOR, na.rm = TRUE)) * 100,
`% Inseguridad Ciudad` = (sum(inseguro_ciudad * FACTOR, na.rm = TRUE) / sum(FACTOR, na.rm = TRUE)) * 100,
.groups = 'drop'
)
kable(tabla_impacto, digits = 1,
caption = "Tabla 3: Porcentaje de Percepción de Inseguridad por Estrato y Género (Datos Ponderados)",
booktabs = TRUE)
Tabla 3: Porcentaje de Percepción de Inseguridad por Estrato y
Género (Datos Ponderados)
| Estrato 1 |
Femenino |
20.4 |
19.7 |
51.1 |
| Estrato 1 |
Masculino |
11.7 |
18.7 |
38.8 |
| Estrato 2 |
Femenino |
16.8 |
23.0 |
56.4 |
| Estrato 2 |
Masculino |
11.2 |
14.5 |
40.4 |
| Estrato 3 |
Femenino |
21.0 |
24.5 |
59.2 |
| Estrato 3 |
Masculino |
18.3 |
23.1 |
51.1 |
| Estrato 4 |
Femenino |
45.5 |
43.1 |
76.2 |
| Estrato 4 |
Masculino |
6.4 |
25.1 |
47.6 |
| Estrato 5 |
Femenino |
52.0 |
57.8 |
70.1 |
| Estrato 5 |
Masculino |
21.8 |
24.1 |
41.8 |
| Estrato 6 |
Femenino |
0.0 |
43.1 |
56.9 |
| Estrato 6 |
Masculino |
0.0 |
0.0 |
0.0 |
# =========================================================================
# GRÁFICA INDEPENDIENTE: IMPACTO EN LA CIUDAD (P5)
# =========================================================================
ggplot(tabla_impacto, aes(x = estrato_txt, y = `% Inseguridad Ciudad`, fill = genero_txt)) +
geom_bar(stat = "identity", position = "dodge") +
labs(
title = "Gráfica 6: Tasa de Inseguridad en la Ciudad por Estrato y Género",
x = "Estrato Socioeconómico",
y = "Porcentaje que se siente Inseguro (%)",
fill = "Género",
caption = "Fuente: Elaboración propia basada en microdatos."
) +
theme_minimal()

####### indice de victimizacion
# 2. Adecuación de la variable de victimización (P20A)
# Creamos una variable binaria: 1 si fue víctima (P20A == 1), 0 en cualquier otro caso
base_analisis <- base_completa %>%
mutate(
victima_binaria = if_else(P20A == 1, 1, 0)
)
### varible seguridad, genero y estrato
base_analisis <- base_completa %>%
mutate(
genero_txt = case_when(GENERO == 1 ~ "Masculino", GENERO == 2 ~ "Femenino", TRUE ~ "No informa"),
estrato_txt = case_when(
ESTRATO_DEC == 1 ~ "Estrato 1", ESTRATO_DEC == 2 ~ "Estrato 2",
ESTRATO_DEC == 3 ~ "Estrato 3", ESTRATO_DEC == 4 ~ "Estrato 4",
ESTRATO_DEC == 5 ~ "Estrato 5", ESTRATO_DEC == 6 ~ "Estrato 6",
TRUE ~ "Sin Estrato"
),
# Creamos variables binarias (1 si se siente Inseguro o Muy Inseguro, 0 si no)
inseguro_barrio = if_else(P1 %in% c(3, 4), 1, 0),
inseguro_comuna = if_else(P3 %in% c(3, 4), 1, 0),
inseguro_ciudad = if_else(P5 %in% c(3, 4), 1, 0)
) %>%
filter(estrato_txt != "Sin Estrato")
# =========================================================================
# TABLA DE PORCENTAJES DE INSEGURIDAD CRUZA
# =========================================================================
tabla_impacto <- base_analisis %>%
group_by(estrato_txt, genero_txt) %>%
summarise(
`% Inseguridad Barrio` = (sum(inseguro_barrio * FACTOR, na.rm = TRUE) / sum(FACTOR, na.rm = TRUE)) * 100,
`% Inseguridad Comuna` = (sum(inseguro_comuna * FACTOR, na.rm = TRUE) / sum(FACTOR, na.rm = TRUE)) * 100,
`% Inseguridad Ciudad` = (sum(inseguro_ciudad * FACTOR, na.rm = TRUE) / sum(FACTOR, na.rm = TRUE)) * 100,
.groups = 'drop'
)
kable(tabla_impacto, digits = 1,
caption = "Tabla 3: Porcentaje de Percepción de Inseguridad por Estrato y Género (Datos Ponderados)",
booktabs = TRUE)
Tabla 3: Porcentaje de Percepción de Inseguridad por Estrato y
Género (Datos Ponderados)
| Estrato 1 |
Femenino |
20.4 |
19.7 |
51.1 |
| Estrato 1 |
Masculino |
11.7 |
18.7 |
38.8 |
| Estrato 2 |
Femenino |
16.8 |
23.0 |
56.4 |
| Estrato 2 |
Masculino |
11.2 |
14.5 |
40.4 |
| Estrato 3 |
Femenino |
21.0 |
24.5 |
59.2 |
| Estrato 3 |
Masculino |
18.3 |
23.1 |
51.1 |
| Estrato 4 |
Femenino |
45.5 |
43.1 |
76.2 |
| Estrato 4 |
Masculino |
6.4 |
25.1 |
47.6 |
| Estrato 5 |
Femenino |
52.0 |
57.8 |
70.1 |
| Estrato 5 |
Masculino |
21.8 |
24.1 |
41.8 |
| Estrato 6 |
Femenino |
0.0 |
43.1 |
56.9 |
| Estrato 6 |
Masculino |
0.0 |
0.0 |
0.0 |
# =========================================================================
# GRÁFICA INDEPENDIENTE: IMPACTO EN LA CIUDAD (P5)
# =========================================================================
ggplot(tabla_impacto, aes(x = estrato_txt, y = `% Inseguridad Ciudad`, fill = genero_txt)) +
geom_bar(stat = "identity", position = "dodge") +
labs(
title = "Gráfica 6: Tasa de Inseguridad en la Ciudad por Estrato y Género",
x = "Estrato Socioeconómico",
y = "Porcentaje que se siente Inseguro (%)",
fill = "Género",
caption = "Fuente: Elaboración propia basada en microdatos."
) +
theme_minimal()

####### indice de victimizacion
# 2. Adecuación de la variable de victimización (P20A)
# Creamos una variable binaria: 1 si fue víctima (P20A == 1), 0 en cualquier otro caso
base_analisis <- base_completa %>%
mutate(
victima_binaria = if_else(P20A == 1, 1, 0)
)
# =========================================================================
# CALCULO 1: ÍNDICE DE VICTIMIZACIÓN GLOBAL (Para la Ciudad Castellana)
# =========================================================================
resultado_global <- base_analisis %>%
summarise(
Numerador_Pond = sum(victima_binaria * 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 <- base_analisis %>%
group_by(COMUNA) %>%
summarise(
`Hogares Víctimas (Ponderado)` = sum(victima_binaria * 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 (%)`))
# Imprimir la tabla formateada de forma elegante para el PDF
kable(tabla_comunas, digits = 2,
caption = "Tabla 4: Índice de Victimización Expandido por Comuna (Ordenado de Mayor a Menor)",
booktabs = TRUE)
Tabla 4: Índice de Victimización Expandido por Comuna (Ordenado
de Mayor a Menor)
| 5 |
11973.44 |
55058.18 |
21.75 |
| 13 |
21134.45 |
127799.47 |
16.54 |
| 7 |
15153.87 |
104997.62 |
14.43 |
| 9 |
19504.85 |
136527.92 |
14.29 |
| 90 |
264.79 |
1854.27 |
14.28 |
| 60 |
10941.15 |
77100.32 |
14.19 |
| 1 |
11483.33 |
81305.06 |
14.12 |
| 80 |
12323.54 |
90909.83 |
13.56 |
| 16 |
15181.39 |
114548.67 |
13.25 |
| 3 |
17223.18 |
132806.02 |
12.97 |
| 10 |
2621.48 |
21386.19 |
12.26 |
| 2 |
11693.03 |
95494.07 |
12.24 |
| 8 |
13952.38 |
121642.54 |
11.47 |
| 11 |
2484.33 |
21749.33 |
11.42 |
| 70 |
957.81 |
9057.91 |
10.57 |
| 4 |
11690.43 |
117238.55 |
9.97 |
| 6 |
9955.54 |
137126.79 |
7.26 |
| 15 |
408.73 |
6859.35 |
5.96 |
| 12 |
233.02 |
5378.88 |
4.33 |
| 50 |
0.00 |
59.05 |
0.00 |
# Conclusiones
##### Para el Punto B, identifica que la percepcion de la seguridad del Barrio es seguro, para la comuna es seguro y para la generalidad de la ciudad tambien seguro a pesar que para varias personas lo consideran inseguro.
##### Para el Punto C, identifica que la percepcion de la seguridad por genero femenino en varios de los estratos es inseguro, esto se puede dar a la vulnerabilidad y para el genero masculino se mantiene por debajo.
##### Para el Punto D, El indice de Victimizacion para la ciudad de castellana es de 12.97%.
#### La respuesta de la comuna con el mayor indice es : la comuna 5
#### La respuesta de la comuna con el menor indice es : la comuna 50