SITUACIÓN PROBLEMA:
Limpieza de la base: (se limpia al inicio porque se usará para gráficos del contexto)
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(ISLR)
eav23 <- read.csv("eav23.csv")
# Filtramos la base de datos en las variables de interés
eav23 <- eav23[, c("P93","sexo_num", "NUM_MUN", "P135", "CP4_1", "P144", "P126", "P137", "P109", "P118", "P99", "P115", "P119", "P120", "P101_1", "P101_2", "P101_3", "P101_4", "P101_5", "P136", "num_acciones_participacion_ciudadana", "Factor_CVNL")]
# La volvemos a filtrar en los Municipios del AMM
AMM <- c("6", "9", "21", "18", "26", "31", "39", "46", "19", "48", "49")
eav23 <- eav23 %>%
filter(NUM_MUN %in% AMM)
#Renombramos las variables
eav23 <- eav23 %>%
rename(MUNICIPIOS = NUM_MUN,
SEXO = sexo_num,
EDAD = CP4_1,
influencia.ciudadana.estado = P135,
aprobacion.alcalde = P126,
aprobacion.gobernador = P137,
aprobacion.fiscalia = P109,
corrupcion.estado = P118,
INGRESO_MENSUAL_HOGAR = P144,
INSEGURIDAD = P93,
impunidad = P99,
transparencia.gobierno = P115,
corrupcion.municipio = P119,
corrupcion.tramites = P120,
desempeño.policia = P101_1,
desempeño.fuerza.civil = P101_2,
desempeño.guardia.nacional = P101_3,
desempeño.ejercito = P101_4,
desempeño.marina = P101_5,
influencia.ciudadana.municipio = P136,
numero.acciones.part.ciud = num_acciones_participacion_ciudadana
)%>%
mutate(MUNICIPIOS = case_when(
MUNICIPIOS == 6 ~ "APODACA",
MUNICIPIOS == 9 ~ "CADEREYTA",
MUNICIPIOS == 18 ~ "GARCIA",
MUNICIPIOS == 19 ~ "SAN PEDRO",
MUNICIPIOS == 21 ~ "ESCOBEDO",
MUNICIPIOS == 26 ~ "GUADALUPE",
MUNICIPIOS == 31 ~ "JUAREZ",
MUNICIPIOS == 39 ~ "MONTERREY",
MUNICIPIOS == 46 ~ "SAN NICOLÁS",
MUNICIPIOS == 48 ~ "SANTA CATARINA",
MUNICIPIOS == 49 ~ "SANTIAGO",
TRUE ~ "DESCONOCIDO" # Por si hay algún código no especificado
))
# Quitamos los 8888 y los 9999 y los na
eav23 <- eav23 %>%
filter(if_all(c(MUNICIPIOS, SEXO, EDAD, influencia.ciudadana.estado, aprobacion.alcalde, aprobacion.gobernador, aprobacion.fiscalia, corrupcion.estado, INGRESO_MENSUAL_HOGAR, INSEGURIDAD, impunidad, transparencia.gobierno, corrupcion.municipio, corrupcion.tramites, desempeño.policia, desempeño.fuerza.civil, desempeño.guardia.nacional, desempeño.ejercito, desempeño.marina, influencia.ciudadana.municipio, numero.acciones.part.ciud), ~ !(. %in% c("8888", "9999"))))
eav23 <- na.omit(eav23)
# Las convertimos a factores/numéricos respectivamente
eav23 <- eav23 %>%
mutate(MUNICIPIOS = as.factor(MUNICIPIOS),
SEXO = as.factor(SEXO),
EDAD = as.numeric(EDAD),
influencia.ciudadana.estado = as.numeric(influencia.ciudadana.estado),
aprobacion.alcalde = as.factor(aprobacion.alcalde),
aprobacion.gobernador = as.factor(aprobacion.gobernador),
aprobacion.fiscalia = as.factor(aprobacion.fiscalia),
corrupcion.estado = as.numeric(corrupcion.estado),
INGRESO_MENSUAL_HOGAR = as.numeric(INGRESO_MENSUAL_HOGAR),
INSEGURIDAD = as.factor(INSEGURIDAD),
impunidad = as.numeric(impunidad),
transparencia.gobierno = as.factor(transparencia.gobierno),
corrupcion.municipio = as.numeric(corrupcion.municipio),
corrupcion.tramites = as.factor(corrupcion.tramites),
desempeño.policia = as.numeric(desempeño.policia),
desempeño.fuerza.civil = as.numeric(desempeño.fuerza.civil),
desempeño.guardia.nacional = as.numeric(desempeño.guardia.nacional),
desempeño.ejercito = as.numeric(desempeño.ejercito),
desempeño.marina = as.numeric(desempeño.marina),
influencia.ciudadana.municipio = as.numeric(influencia.ciudadana.municipio),
numero.acciones.part.ciud = as.numeric(numero.acciones.part.ciud))
# Cambiamos los nombres de los factores y las dimensiones las reordenamos
eav23 <- eav23 %>%
#mutate(SEXO = ifelse(SEXO== 0, "Hombre", "Mujer")) %>%
mutate(influencia.ciudadana.estado = case_when(
influencia.ciudadana.estado == 1~4,
influencia.ciudadana.estado == 2~3,
influencia.ciudadana.estado == 3~2,
influencia.ciudadana.estado == 4~1
)) %>%
#mutate(aprobacion.alcalde = ifelse(aprobacion.alcalde== 0, "Desaprueba", "Aprueba")) %>%
#mutate(aprobacion.gobernador = ifelse(aprobacion.gobernador== 0, "Desaprueba", "Aprueba")) %>%
mutate(INSEGURIDAD = ifelse(INSEGURIDAD %in% c(1, 2), 0, 1))%>%
#mutate(aprobacion.fiscalia = ifelse(aprobacion.fiscalia== 0, "Desaprueba", "Aprueba")) %>%
mutate(corrupcion.estado = case_when(
corrupcion.estado == 1~4,
corrupcion.estado == 2~3,
corrupcion.estado == 3~2,
corrupcion.estado == 4~1
)) %>%
#mutate(transparencia.gobierno = ifelse(transparencia.gobierno== 0, "Si", "No")) %>%
mutate(corrupcion.municipio = case_when(
corrupcion.municipio == 1~4,
corrupcion.municipio == 2~3,
corrupcion.municipio == 3~2,
corrupcion.municipio == 4~1
)) %>%
mutate(corrupcion.tramites = ifelse(corrupcion.tramites== 0, "Si", "No")) %>%
mutate(influencia.ciudadana.municipio = case_when(
influencia.ciudadana.municipio == 1~4,
influencia.ciudadana.municipio == 2~3,
influencia.ciudadana.municipio == 3~2,
influencia.ciudadana.municipio == 4~1
))
eav23 <- eav23 %>%
mutate(SEXO = as.factor(ifelse(SEXO== 0, "Hombre", "Mujer"))) %>%
mutate(aprobacion.alcalde = as.factor(ifelse(aprobacion.alcalde== 0, "Desaprueba", "Aprueba"))) %>%
mutate(aprobacion.gobernador = as.factor(ifelse(aprobacion.gobernador== 0, "Desaprueba", "Aprueba"))) %>%
mutate(aprobacion.fiscalia = as.factor(ifelse(aprobacion.fiscalia== 0, "Desaprueba", "Aprueba"))) %>%
mutate(transparencia.gobierno = as.factor(ifelse(transparencia.gobierno== 0, "Si", "No"))) %>%
mutate(INSEGURIDAD = as.factor(ifelse(INSEGURIDAD== 1, "Si", "No")))
# Establecemos la semilla y conjuntos de entrenamiento/ prueba que utilizaremos en todo el modelo:
set.seed(1)
subset.train <- sample(1:nrow(eav23), nrow(eav23) * 0.7)
subset.test <- setdiff(1:nrow(eav23), subset.train)
subset.test.df <- eav23[-subset.train, ]
Inseguridad.test <- eav23$INSEGURIDAD[-subset.train]
# Establecemos un subconjunto de hombres y mujeres que nos servirá para contrastes a lo largo de la investigación:
eav23.hombre <- eav23 %>%
filter(SEXO == "Hombre")
eav23.mujer <- eav23 %>%
filter(SEXO == "Mujer")
La inseguridad es el principal tema que preocupa a las personas en México, esto al contar con dos dimensiones: por un lado, la objetiva, que se refiere a las tasas de delitos de las que se tiene registro; por otro, la dimensión subjetiva, esta se refiere al grado de temor y distintos sentimientos expresados por los individuos, que se ven encuentran presentes en distintas encuestas ( Focás & Kessler, 2015).
De acuerdo con la encuesta Así Vamos, en Nuevo León el 38% de la población del AMM se siente insegura en su municipio (ver gráfico 1).
Gráfico 1. Percepción de inseguridad en el AMM.
library(ggplot2)
# Crear el gráfico de pastel con colores personalizados y tamaño ajustado
grafico.inseg <- ggplot(eav23, aes(x = "", fill = INSEGURIDAD,)) +
geom_bar(width = 1) +
coord_polar(theta = "y") +
scale_fill_manual(values = c("blueviolet", "gold1")) + # Especificar los colores
labs(fill = "¿Se percibe Insegurx?") +
theme_void() +
theme(legend.position = "bottom",
plot.title = element_text(face = "bold", size = 10, family = "Arial")) +
ggtitle("Distribución de Percepción de Inseguridad en el AMM")+
geom_text(aes(label = paste(round((..count..)/sum(..count..) * 100), "%")),
stat = "count", position = position_stack(vjust = 0.5))
# Enseñar el gráfico:
grafico.inseg
## Warning: The dot-dot notation (`..count..`) was deprecated in ggplot2 3.4.0.
## ℹ Please use `after_stat(count)` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
Fuente: Elaboración propia con la base de datos de Cómo Vamos Nuevo León (2023).
En general, el 39% de las mujeres en el AMM dicen sentirse inseguras o muy inseguras, comparado con el 37% de los hombres.
Gráfico 2 y 3. Percepción de inseguridad en el AMM desglosada por sexo.
# Crear gráficos de pastel separados para hombres y mujeres
grafico_hombres <- ggplot(eav23.hombre, aes(x = "", fill = INSEGURIDAD)) +
geom_bar(width = 1) +
coord_polar(theta = "y") +
scale_fill_manual(values = c("blueviolet", "gold1")) + # Colores personalizados
labs(fill = "¿Se percibe Insegurx?") +
theme_void() +
theme(legend.position = "bottom",
plot.title = element_text(face = "bold", size = 10, family = "Arial")) +
ggtitle("Distribución de Percepción de Inseguridad en Hombres")+
geom_text(aes(label = paste(round((..count..)/sum(..count..) * 100), "%")),
stat = "count", position = position_stack(vjust = 0.5))
grafico_mujeres <- ggplot(eav23.mujer, aes(x = "", fill = INSEGURIDAD)) +
geom_bar(width = 1) +
coord_polar(theta = "y") +
scale_fill_manual(values = c("blueviolet", "gold1")) + # Colores personalizados
labs(fill = "¿Se percibe Insegurx?") +
theme_void() +
theme(legend.position = "bottom",
plot.title = element_text(face = "bold", size = 10, family = "Arial")) +
ggtitle("Distribución de Percepción de Inseguridad en Mujeres")+
geom_text(aes(label = paste(round((..count..)/sum(..count..) * 100), "%")),
stat = "count", position = position_stack(vjust = 0.5))
# Mostrar los gráficos de pastel por separado
grafico_hombres
grafico_mujeres
Fuente: Elaboración propia con la base de datos de Cómo Vamos Nuevo León (2023).
Es preocupante que 1 de cada 3 personas del AMM se sienta insegura. Por lo que, procederemos a ver qué factores institucionales moldean esta percepción para al final terminar con recomendaciones basadas en nuestros hallazgos.
La población de estudio comprende los municipios que conforman el área metropolitana de Monterrey, en el estado de Nuevo León, México. Estos municipios son Apodaca, Cadereyta, General Escobedo, García, Guadalupe, Juárez, Monterrey, San Nicolás de los Garza, San Pedro, Santa Catarina y Santiago. A través de este enfoque, se busca comprender cómo los factores institucionales influyen en la percepción de seguridad (ver gráfico 4).
Gráfico 4. Distribución de observaciones por municipio del AMM.
library(dplyr)
# Calcular los porcentajes por municipio
porcentajes <- eav23 %>%
count(MUNICIPIOS) %>%
mutate(porcentaje = n / sum(n) * 100)
# Crear el gráfico de pastel con porcentajes
ggplot(porcentajes, aes(x = "", y = porcentaje, fill = MUNICIPIOS)) +
geom_bar(stat = "identity", width = 1) +
geom_text(aes(label = paste0(round(porcentaje), "%")),
position = position_stack(vjust = 0.5)) +
coord_polar(theta = "y") +
labs(fill = "Municipio") +
theme_void() +
theme(legend.position = "bottom", plot.title = element_text(face = "bold", size = 13, family = "Arial")) +
ggtitle("Distribución de observaciones por Municipios en el AMM")
Fuente: Elaboración propia con la base de datos de Cómo Vamos Nuevo León (2023).
Se observa que, no se preguntó uniformemente entre municipios. Esto es bueno pues no sobrerepresenta municipios con menor población. Como por ejemplo, en Monterrey se preguntan más que en San Pedro, lo que hace sentido si comparamos la población de cada uno de estos municipios.
Una vez entendido el problema y navegado un poco en los datos de la encuesta, se procede enmarcar la problemática:
Como se estableció, nos basaremos en los factores institucionales. Los factores institucionales se refieren a las características y dinámicas de las instituciones que operan en una sociedad. Estas instituciones pueden incluir organismos gubernamentales, agencias públicas, organizaciones no gubernamentales, empresas privadas y otras entidades que desempeñan roles importantes en la sociedad y en la vida de las personas. Los factores institucionales pueden abarcar una variedad de aspectos, como la estructura organizativa, los procedimientos operativos, las políticas, las normas, la cultura organizativa y la interacción con otras instituciones y con la sociedad en general.
Éstos pueden influir significativamente en la percepción de inseguridad en un municipio de varias formas:
Eficiencia de las instituciones de seguridad: La capacidad de las instituciones locales, como la policía y los servicios de emergencia, para prevenir el crimen y responder a las emergencias puede impactar directamente en cómo perciben los residentes la seguridad en su comunidad. Si las instituciones son percibidas como efectivas y confiables, la sensación de seguridad puede aumentar. Por el contrario, si hay una percepción de corrupción, ineficiencia o falta de recursos en estas instituciones, la sensación de inseguridad puede aumentar.
Transparencia y rendición de cuentas: La transparencia en la gestión de las instituciones públicas, incluidas las encargadas de la seguridad, puede influir en la confianza que tienen los ciudadanos en ellas. Cuando las instituciones son transparentes y responsables ante la comunidad, es más probable que los residentes se sientan seguros y confiados en su capacidad para abordar los problemas de seguridad.
Participación ciudadana: La participación activa de la comunidad en la formulación de políticas de seguridad y en la colaboración con las instituciones puede contribuir a una sensación de seguridad. Cuando los residentes se sienten involucrados en la toma de decisiones y tienen la oportunidad de expresar sus preocupaciones y sugerencias, es más probable que perciban un mayor nivel de seguridad en su entorno.
Recursos y políticas de seguridad: La asignación de recursos adecuados a las instituciones de seguridad y la implementación de políticas efectivas pueden tener un impacto directo en la prevención del crimen y la reducción de la percepción de inseguridad. Si las instituciones cuentan con los recursos necesarios y adoptan políticas basadas en evidencia y mejores prácticas, es más probable que los residentes perciban un entorno más seguro.
Percepción de corrupción y abuso de poder: Cuando hay una percepción generalizada de corrupción o abuso de poder dentro de las instituciones locales, esto puede erosionar la confianza de los ciudadanos en el sistema de seguridad y contribuir a una mayor sensación de inseguridad. La percepción de que las instituciones no están trabajando en el mejor interés de la comunidad puede generar miedo y desconfianza entre los residentes.
En el siguiente apartado, se abordará cómo se buscó cada uno de estos factores en la encuesta. Se tomaron aquellos que eran similares o iguales y se da una fundamentación teórica para cada uno de ellos.
Con el marco que hemos desarrollado arriba, hemos planteado la pregunta de investigación de la siguiente manera: “¿Cómo es que los factores institucionales moldean la percepción de inseguridad en el AMM?” La pregunta de investigación plantea una indagación crucial en torno a la percepción de inseguridad entre los habitantes en el Área Metropolitana de Monterrey (AMM) y cómo esta percepción está moldeada por factores institucionales. El modelo nos llevará a la comprensión de cómo las estructuras institucionales, tales como políticas gubernamentales, sistemas legales, y servicios públicos afectan a la percecpión de seguridad.
Para realizar nuestar regresión, hemos seleccionado las siguientes variables las cuales esperemos estén relacionadas a nuestra pregunta de investigación una vez hagamos nuestra regresión. Se específica el código en el que se encuentra en la base de datos, la pregunta que contesta el encuestado y la justificación teórica para su utilización.
Variable dependiente:
-P93:
¿Qué tan seguro se siente en su municipio? Esta es nuestra variable de respuesta, ya que queremos saber qué tan inseguro perciben su municipio los individuos con respecto a otras variables.
Tipo de variable: int del 1-4 ordinal 1: muy seguro 2: seguro 3: poco seguro 4: muy inseguro
Variables independientes:
-sexo_num:
Esta variable nos sirve para ver la diferencia de la percepción de seguridad entre hombres y mujeres, pues en la encuesta de “Así vamos Nuevo León” existe una diferencia en el nivel de percepción.
Tipo de variable: int 0 = hombre 1 = mujer
-NUM_MUN:
Para poder filtrar los municipios que no son del AMM, así como para contrastar entre municipios del misma área los factores institucionales locales tal el desempeño del alcalde, etc.
Tipo de variable: int donde cada número representa a un municipio en específico de NL.
-P99:
¿Qué tan probable considera que los delitos denunciados sean investigados y castigados por las autoridades?: La percepción de inseguridad también se ve influenciada por la percepción de impunidad que existe en su entorno (Herrera, 2015).
Tipo de variable: int del 1-4 ordinal 1: muy probable 2: probable 3: poco probable 4: nada probable
-P109:
La Fiscalía General de Justicia es la responsable de investigar y perseguir los delitos en Nuevo León, en términos generales: ¿Aprueba o desaprueba el trabajo realizado por la fiscalía?: La percepción que tienen las personas sobre las autoridades es crucial en la percepción de inseguridad. Al no existir una relación estrecha autoridad-ciudadano, esto puede desembocar en malentendidos y una solución parcial al problema (Herrera, 2012).
Tipo de variable: Int dicotómica 0 = desaprueba 1 = aprueba
-P118:
La corrupción consiste en el abuso de poder para beneficio propio ya sea en el sector público o en el privado. En su opinión, en el estado de Nuevo León la corrupción es una práctica: La corrupción es sin duda un factor importante en la percepción de inseguridad de los individuos. Esto porque se tiene la creencia de que todo el gobierno es corrupto y no hace nada por cambiar la situación, lo que desemboca en impunidad y lleva consigo una mala percepción de las instituciones (Herrera, 2012).
Tipo de variable: Int ordinal del 1-4 1 = muy frecuente 2= frecuente 3= poco frecuente 4 = no ocurre
-P126:
En términos generales, ¿aprueba o desaprueba el trabajo que ha hecho Nombre de ALCALDE/ALCALDESA)?: Los funcionarios públicos juegan un rol importante al momento en que las personas definen su percepción de inseguridad, pues sienten una lejanía con el funcionario y no encuentran la forma de pedir ayuda (Herrera, 2012).
Tipo de variable: Int dicotómica 0 = desaprueba 1 = aprueba
-P135:
¿Cuánto considera que los ciudadanos pueden influir en las decisiones del gobierno del estado?: Los ciudadanos se perciben externos al sistema gubernamental y piensan que la única forma de incidir en política es a través del voto, por lo que no buscan otras formas de participación ciudadana. Esto afecta la percepción de inseguridad porque los ciudadanos no se sienten escuchados o tomados en cuenta por las autoridades (Herrera, 2012). Además, el INEGI detalló que la corrupción no sólo impacta en el derecho a un gobierno efectivo, sino que sus efectos son muy sensibles. (El Economista, 2023)
Tipo de variable: Int ordinal del 1-4 1= mucho 2= algo 3= poco 4= nada
-P137:
En términos generales, ¿aprueba o desaprueba el trabajo que ha hecho Samuel García?: La aprobación que tienen los gobernantes llega a tener cierta influencia en la percepción de seguridad de los ciudadanos. En nuestro país es de suma importancia el tema de la seguridad, por lo que una buena percepción del gobernador puede sugerir una baja percepción de inseguridad
Tipo de variable: Int dicotómica 0 = desaprueba 1 = aprueba
-P144:
Ingresos Mensuales: Nos servirá para poder contrastar las distintos outputs que nos de el modelo dependiendo del nivel económico de la muestra.
Tipo de variable: Int ordinal, mientras mayor sea la categoría, más dinero gana.
-CP4_1:
¿Cuál es tu edad?: Nos servirá para poder contrastar las distintos outputs que nos de el modelo dependiendo de la edad de los encuestados
Tipo de variable: Numérica.
Elegimos estas variables porque representan factores institucionales cruciales dentro del estado de derecho de nuestro país tales: gestión gubernamental, impunidad, corrupción, participación ciudadana, entre otros. Cada uno juega un rol muy importante en la vida cotidiana de los ciudadanos que impacta más allá de los actos cívicos o democráticos representativos tales el voto, marchas, etc. Queremos ver el impacto que éstos tienen en la percepción de seguridad, el cual es uno de los más grandes problemas comentados en la encuesta. Soria (2018) marca un vínculo teórico de estas variables. Para empezar, se habla de que la eficacia del poder ejecutivo en la implementación de políticas de seguridad, asignación de recursos y coordinación con otras instituciones (como la policía) afecta directamente la percepción de seguridad. Una gestión eficiente puede generar confianza en la capacidad del gobierno para abordar los problemas de seguridad, mientras que una gestión deficiente puede generar desconfianza y aumentar la sensación de inseguridad. Además, la capacidad de la fiscalía para investigar y procesar delitos también puede moldear la percepción ciudadana de seguridad. La corrupción dentro de las instituciones encargadas de hacer cumplir la ley socava la confianza de los ciudadanos en esas instituciones y puede generar una sensación de impunidad entre los delincuentes que se ve reflejada en su percepción de seguridad. Así mismo que, cuando los ciudadanos se sienten empoderados y participan en iniciativas comunitarias de seguridad, tienden a sentirse más seguros en sus vecindarios. Por otro lado, la falta de participación ciudadana puede llevar a una sensación de vulnerabilidad y desconfianza en las autoridades.
Por último, sería interesante ver cómo éstos pueden cambiar de acuerdo al sexo y localidad del encuestado, por lo que las pondremos a intercactuar con la variable sexo y municipio.Pues la violencia de género y respuesta institucional puede cambiar de municipio a municipio siendo que las autoridades, representantes burócraticos y gestión municipal cambia.
Limpieza de la base de datos:
La limpieza consistió basicamente en:
La selección de subconjuntos nos ayudó para ver qué predictores eran significativos y cuáles no.
# Cargar el paquete leaps
library(leaps)
# Hacemos la selección de subconjuntos.
subconjuntos <- regsubsets (INSEGURIDAD~. -MUNICIPIOS-INGRESO_MENSUAL_HOGAR-EDAD-SEXO,data=eav23 )
summary (subconjuntos)
## Subset selection object
## Call: regsubsets.formula(INSEGURIDAD ~ . - MUNICIPIOS - INGRESO_MENSUAL_HOGAR -
## EDAD - SEXO, data = eav23)
## 17 Variables (and intercept)
## Forced in Forced out
## influencia.ciudadana.estado FALSE FALSE
## aprobacion.alcaldeDesaprueba FALSE FALSE
## aprobacion.gobernadorDesaprueba FALSE FALSE
## aprobacion.fiscaliaDesaprueba FALSE FALSE
## corrupcion.estado FALSE FALSE
## impunidad FALSE FALSE
## transparencia.gobiernoSi FALSE FALSE
## corrupcion.municipio FALSE FALSE
## corrupcion.tramitesSi FALSE FALSE
## desempeño.policia FALSE FALSE
## desempeño.fuerza.civil FALSE FALSE
## desempeño.guardia.nacional FALSE FALSE
## desempeño.ejercito FALSE FALSE
## desempeño.marina FALSE FALSE
## influencia.ciudadana.municipio FALSE FALSE
## numero.acciones.part.ciud FALSE FALSE
## Factor_CVNL FALSE FALSE
## 1 subsets of each size up to 8
## Selection Algorithm: exhaustive
## influencia.ciudadana.estado aprobacion.alcaldeDesaprueba
## 1 ( 1 ) " " " "
## 2 ( 1 ) " " " "
## 3 ( 1 ) " " " "
## 4 ( 1 ) " " " "
## 5 ( 1 ) " " " "
## 6 ( 1 ) " " " "
## 7 ( 1 ) " " " "
## 8 ( 1 ) " " " "
## aprobacion.gobernadorDesaprueba aprobacion.fiscaliaDesaprueba
## 1 ( 1 ) " " " "
## 2 ( 1 ) " " "*"
## 3 ( 1 ) " " "*"
## 4 ( 1 ) " " "*"
## 5 ( 1 ) " " "*"
## 6 ( 1 ) " " "*"
## 7 ( 1 ) " " "*"
## 8 ( 1 ) " " "*"
## corrupcion.estado impunidad transparencia.gobiernoSi
## 1 ( 1 ) " " " " "*"
## 2 ( 1 ) " " " " "*"
## 3 ( 1 ) "*" " " "*"
## 4 ( 1 ) "*" " " "*"
## 5 ( 1 ) "*" " " "*"
## 6 ( 1 ) "*" " " "*"
## 7 ( 1 ) "*" "*" "*"
## 8 ( 1 ) "*" "*" "*"
## corrupcion.municipio corrupcion.tramitesSi desempeño.policia
## 1 ( 1 ) " " " " " "
## 2 ( 1 ) " " " " " "
## 3 ( 1 ) " " " " " "
## 4 ( 1 ) " " " " "*"
## 5 ( 1 ) "*" " " "*"
## 6 ( 1 ) "*" " " "*"
## 7 ( 1 ) "*" " " "*"
## 8 ( 1 ) "*" " " "*"
## desempeño.fuerza.civil desempeño.guardia.nacional desempeño.ejercito
## 1 ( 1 ) " " " " " "
## 2 ( 1 ) " " " " " "
## 3 ( 1 ) " " " " " "
## 4 ( 1 ) " " " " " "
## 5 ( 1 ) " " " " " "
## 6 ( 1 ) " " " " " "
## 7 ( 1 ) " " " " " "
## 8 ( 1 ) " " " " "*"
## desempeño.marina influencia.ciudadana.municipio
## 1 ( 1 ) " " " "
## 2 ( 1 ) " " " "
## 3 ( 1 ) " " " "
## 4 ( 1 ) " " " "
## 5 ( 1 ) " " " "
## 6 ( 1 ) " " " "
## 7 ( 1 ) " " " "
## 8 ( 1 ) " " " "
## numero.acciones.part.ciud Factor_CVNL
## 1 ( 1 ) " " " "
## 2 ( 1 ) " " " "
## 3 ( 1 ) " " " "
## 4 ( 1 ) " " " "
## 5 ( 1 ) " " " "
## 6 ( 1 ) "*" " "
## 7 ( 1 ) "*" " "
## 8 ( 1 ) "*" " "
De acuerdo a las variables significativas, armamos 3 modelos distintos (uno con 8 predictores, otro con 7 y otro con 6):
modelo1 <- glm(INSEGURIDAD~aprobacion.fiscalia+corrupcion.estado+impunidad+transparencia.gobierno+corrupcion.municipio+desempeño.policia+desempeño.ejercito+numero.acciones.part.ciud, data=eav23, family=binomial)
modelo2 <- glm(INSEGURIDAD~aprobacion.fiscalia+corrupcion.estado+impunidad+transparencia.gobierno+corrupcion.municipio+desempeño.policia+numero.acciones.part.ciud, data=eav23, family=binomial)
modelo3 <- glm(INSEGURIDAD~aprobacion.fiscalia+corrupcion.estado+transparencia.gobierno+corrupcion.municipio+desempeño.policia+numero.acciones.part.ciud, data=eav23, family=binomial)
summary(modelo1) # Nos da un AIC de 2389.3
##
## Call:
## glm(formula = INSEGURIDAD ~ aprobacion.fiscalia + corrupcion.estado +
## impunidad + transparencia.gobierno + corrupcion.municipio +
## desempeño.policia + desempeño.ejercito + numero.acciones.part.ciud,
## family = binomial, data = eav23)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.52735 0.39569 -3.860 0.000113 ***
## aprobacion.fiscaliaDesaprueba 0.64551 0.11005 5.865 4.48e-09 ***
## corrupcion.estado 0.48989 0.07629 6.421 1.35e-10 ***
## impunidad 0.22114 0.05836 3.789 0.000151 ***
## transparencia.gobiernoSi 0.78177 0.12020 6.504 7.82e-11 ***
## corrupcion.municipio -0.28125 0.07833 -3.590 0.000330 ***
## desempeño.policia -0.08084 0.02949 -2.741 0.006128 **
## desempeño.ejercito -0.06910 0.02913 -2.373 0.017664 *
## numero.acciones.part.ciud 0.14098 0.03688 3.823 0.000132 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 2701.4 on 2035 degrees of freedom
## Residual deviance: 2371.3 on 2027 degrees of freedom
## AIC: 2389.3
##
## Number of Fisher Scoring iterations: 3
summary(modelo2) # Nos da un AIC de 2392.9
##
## Call:
## glm(formula = INSEGURIDAD ~ aprobacion.fiscalia + corrupcion.estado +
## impunidad + transparencia.gobierno + corrupcion.municipio +
## desempeño.policia + numero.acciones.part.ciud, family = binomial,
## data = eav23)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.90570 0.36035 -5.289 1.23e-07 ***
## aprobacion.fiscaliaDesaprueba 0.68625 0.10866 6.316 2.69e-10 ***
## corrupcion.estado 0.52647 0.07476 7.042 1.90e-12 ***
## impunidad 0.18758 0.05653 3.318 0.000905 ***
## transparencia.gobiernoSi 0.79864 0.11996 6.657 2.79e-11 ***
## corrupcion.municipio -0.31031 0.07750 -4.004 6.23e-05 ***
## desempeño.policia -0.10236 0.02800 -3.656 0.000257 ***
## numero.acciones.part.ciud 0.14344 0.03667 3.912 9.17e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 2701.4 on 2035 degrees of freedom
## Residual deviance: 2376.9 on 2028 degrees of freedom
## AIC: 2392.9
##
## Number of Fisher Scoring iterations: 3
summary(modelo3) # Nos da una AIC de 2402
##
## Call:
## glm(formula = INSEGURIDAD ~ aprobacion.fiscalia + corrupcion.estado +
## transparencia.gobierno + corrupcion.municipio + desempeño.policia +
## numero.acciones.part.ciud, family = binomial, data = eav23)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.26468 0.30144 -4.195 2.72e-05 ***
## aprobacion.fiscaliaDesaprueba 0.72678 0.10784 6.740 1.59e-11 ***
## corrupcion.estado 0.47047 0.07231 6.506 7.71e-11 ***
## transparencia.gobiernoSi 0.82482 0.11946 6.904 5.04e-12 ***
## corrupcion.municipio -0.28530 0.07674 -3.718 0.000201 ***
## desempeño.policia -0.11554 0.02768 -4.174 2.99e-05 ***
## numero.acciones.part.ciud 0.12881 0.03602 3.577 0.000348 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 2701.4 on 2035 degrees of freedom
## Residual deviance: 2388.0 on 2029 degrees of freedom
## AIC: 2402
##
## Number of Fisher Scoring iterations: 3
# El indicador AIC es muy parecido en los tres modelos, por lo que no es un factor decisivo. Dado que son modelos logísticos, no se puede conocer la R^2.
Dado que contiene menos predictores y un AIC más grande , nos quedaremso con el segundo, el cual usa los predictores:
Esto nos sirve para ver la precisión del modelo escogido:
# Probamos con el conjunto de entrenamiento, el cual se especificó al inicio del código (un 70% de la muestra)
Modelo.train.regsubset <- glm(INSEGURIDAD~aprobacion.fiscalia+corrupcion.estado+impunidad+transparencia.gobierno+corrupcion.municipio+desempeño.policia+numero.acciones.part.ciud, data=eav23, subset= subset.train, family=binomial)
# Usamos lo del conjunto de entrenamiento pero ahora en el de prueba (el 30% restante de las observaciones)
predict.reg <- predict(Modelo.train.regsubset, newdata = subset.test.df, type = "response")
# Dado que es respuesta binaria, lo clasificamos en probabilidades, donde si es mayor a .5 lo ponemos como Si tiene una percecpción de inseguridad y menor a este valor como que no.
predicted.reg<-ifelse(predict.reg > 0.5, 'Si', 'No')
# Hacemos una matriz de confusión de los valores obtenidos en el subconjunto de prueba para ver cuántos predijimos correctamente y cuántos fueron clasificados erróneamente.
matriz.confusion.reg <- table(Predicted = predicted.reg, Actual = Inseguridad.test)
print(matriz.confusion.reg)
## Actual
## Predicted No Si
## No 295 120
## Si 84 112
(295+112)/(295+112+84+120)
## [1] 0.6661211
# El modelo tiene 66.6% de precisión
El modelo nos dio una precisión del 66.6%.
LDA nos sirve para ver cómo se distribuyen las probabilidades de que una observación pertenezca a una de las dos posibles respuestas qu tiene inseguridad. En este caso obtuvimos que:
library(MASS)
##
## Attaching package: 'MASS'
## The following object is masked from 'package:dplyr':
##
## select
lda.fitI<-lda(INSEGURIDAD~aprobacion.fiscalia+corrupcion.estado+impunidad+transparencia.gobierno+corrupcion.municipio+desempeño.policia+numero.acciones.part.ciud, data= eav23)
lda.fitI
## Call:
## lda(INSEGURIDAD ~ aprobacion.fiscalia + corrupcion.estado + impunidad +
## transparencia.gobierno + corrupcion.municipio + desempeño.policia +
## numero.acciones.part.ciud, data = eav23)
##
## Prior probabilities of groups:
## No Si
## 0.6213163 0.3786837
##
## Group means:
## aprobacion.fiscaliaDesaprueba corrupcion.estado impunidad
## No 0.4181818 2.663241 2.483004
## Si 0.6913100 3.118029 2.692607
## transparencia.gobiernoSi corrupcion.municipio desempeño.policia
## No 0.4521739 2.547826 7.413439
## Si 0.7548638 2.853437 6.494163
## numero.acciones.part.ciud
## No 0.4671937
## Si 0.6018158
##
## Coefficients of linear discriminants:
## LD1
## aprobacion.fiscaliaDesaprueba 0.8294339
## corrupcion.estado 0.6156789
## impunidad 0.2161561
## transparencia.gobiernoSi 0.9444438
## corrupcion.municipio -0.3876842
## desempeño.policia -0.1308275
## numero.acciones.part.ciud 0.1636275
plot(lda.fitI)
Estas son las probabilidades previas de los grupos en la variable
INSEGURIDAD
. Aquí, la percepción de seguridad tiene una
probabilidad de 62% y la de inseguridad tiene una probabilidad de 38%.
Esto significa que es más probable sentirse seguro en el AMM. No
obstante, es muy grande el grupo de personas que no se perciben seguros.
¡Esto es un tercio de la muestra! Veremos cómo se desglosa por sexo:
# Probamos con el conjunto de entrenamiento, el cual se especificó al inicio del código (un 70% de la muestra)
Modelo.train.LDA <- lda(INSEGURIDAD~aprobacion.fiscalia+corrupcion.estado+impunidad+transparencia.gobierno+corrupcion.municipio+desempeño.policia+numero.acciones.part.ciud, data=eav23, subset= subset.train)
# Usamos lo del conjunto de entrenamiento pero ahora en el de prueba (el 30% restante de las observaciones)
predict.lda <- predict(Modelo.train.LDA, newdata = subset.test.df, type = "response")
# Dado que es respuesta binaria, lo clasificamos en probabilidades, donde si es mayor a .5 lo ponemos como Si tiene una percecpción de inseguridad y menor a este valor como que no.
predicted.lda <- ifelse(predict.lda$posterior[, "Si"] > 0.5, 'Si', 'No')
# Hacemos una matriz de confusión de los valores obtenidos en el subconjunto de prueba para ver cuántos predijimos correctamente y cuántos fueron clasificados erróneamente.
matriz.confusion.lda <- table(Predicted = predicted.lda, Actual = Inseguridad.test)
print(matriz.confusion.lda)
## Actual
## Predicted No Si
## No 294 119
## Si 85 113
(294+113)/(294+113+119+85)
## [1] 0.6661211
# El modelo tiene 66.6% de precisión
La precisión del modelo es del 66.6% nos dio igual que la regresión lineal. Nos quedaremos con la lineal pues creemos que una regresión explica mejor que una clasificación la naturaleza del problema.
Aunque no es parte de la pregunta de investigación per se, se procede a hacer un contraste por género sólo para reflexionar en el impacto que tiene el género en la variable de respuesta inseguridad:
lda.fitmujer<-lda(INSEGURIDAD~aprobacion.fiscalia+corrupcion.estado+impunidad+transparencia.gobierno+corrupcion.municipio+desempeño.policia+numero.acciones.part.ciud, data= eav23.mujer)
lda.fithombre<-lda(INSEGURIDAD~aprobacion.fiscalia+corrupcion.estado+impunidad+transparencia.gobierno+corrupcion.municipio+desempeño.policia+numero.acciones.part.ciud, data= eav23.hombre)
Se aprecia que, la probabilidad de que la percepción de los hombres sea segura es de 63.37% frente a n 60.81% de las mujeres.
Esto nos sirve para validar la precisión del modelo, dejando sólo una observación fuera de la validación y usándola como test.
# Cargar la librería boot
library(boot)
# Realizar validación cruzada utilizando cv.glm
cv.err2 <- cv.glm(eav23, modelo2)
cv.err1 <- cv.glm(eav23, modelo1)
cv.err3 <- cv.glm(eav23, modelo3)
# Mostrar los resultados de la validación cruzada
cv.err2$delta
## [1] 0.2026416 0.2026412
cv.err1$delta
## [1] 0.2024517 0.2024512
cv.err3$delta
## [1] 0.2036811 0.2036807
Los tres modelos presentan errores parecidos después de la prueba de validación cruzada. Por lo que, nos quedaremos con el modelo 2 por lo ya establecido .
# Al iterar 5 veces, obtenemos un resultado parecido y consistente:
cv.error<-rep(0,5)
for (i in 1:5){
cv.error[i]<-cv.glm(eav23,modelo2)$delta[1]
}
cv.error
## [1] 0.2026416 0.2026416 0.2026416 0.2026416 0.2026416
El modelo escogido (el 2), tiene un error de validación cruzada de 0,2026, lo que sugiere que el modelo tiene un error de predicción estimado de aproximadamente el 20,26 %. Entre más bajo, mejor. Veremos cuánto nos da con un k-fold de 10:
Este es como leave one out, pero en vez de dejar una observación fuera, dejamos 10. Los resultados fueron los siguientes:
cv.error.kfold.2 <- rep(0, 10)
cv.error.kfold.3 <- rep(0, 10)
cv.error.kfold.1 <- rep(0, 10)
# Realizamos validación cruzada con 10 folds del modelo 2
for (i in 1:10) {
cv.error.kfold.2[i] <- cv.glm(eav23, modelo2, K = 10)$delta[1]
}
# Realizamos validación cruzada con 10 folds del modelo 3
for (i in 1:10) {
cv.error.kfold.3[i] <- cv.glm(eav23, modelo3, K = 10)$delta[1]
}
# Realizamos validación cruzada con 10 folds del modelo 1
for (i in 1:10) {
cv.error.kfold.1[i] <- cv.glm(eav23, modelo1, K = 10)$delta[1]
}
# Mostramos los errores de validación cruzada
cv.error.kfold.2
## [1] 0.2028174 0.2036562 0.2028931 0.2025419 0.2019501 0.2024897 0.2027122
## [8] 0.2029715 0.2032903 0.2029560
cv.error.kfold.3
## [1] 0.2039520 0.2035765 0.2037357 0.2037270 0.2033710 0.2038207 0.2040939
## [8] 0.2040414 0.2040506 0.2036271
cv.error.kfold.1
## [1] 0.2023175 0.2028189 0.2025481 0.2024592 0.2027189 0.2030898 0.2026581
## [8] 0.2021414 0.2022810 0.2026570
# Graficamos los errores de validación cruzada
par(mfrow = c(1, 3))
plot(cv.error.kfold.2, xlab = "Número de Folds", ylab = "Error de Validación Cruzada", main = "Error de CV ~ MODELO 2")
plot(cv.error.kfold.3, xlab = "Número de Folds", ylab = "Error de Validación Cruzada", main = "Error de CV ~ MODELO 3")
plot(cv.error.kfold.1, xlab = "Número de Folds", ylab = "Error de Validación Cruzada", main = "Error de CV ~ MODELO 1")
Los errores de los tres modelos son muy parecidos en K-fold y LOOCV, por lo que, el modelo 2 sigue siendo el predilecto.
Bootstrap es otra forma de validación del modelo. Obtuvimos que:
# Del modelo elegido
coef.boot.2 <- function(data, indices) {
d <- data[indices, ]
fit <- glm(INSEGURIDAD ~ aprobacion.fiscalia + corrupcion.estado + impunidad +
transparencia.gobierno + corrupcion.municipio + desempeño.policia +
numero.acciones.part.ciud,
data = d, family = binomial)
return(coef(fit))
}
set.seed(1)
boot.mod2 <- boot(data = eav23, statistic = coef.boot.2, R = 1000)
# De modelos alternativos
coef.boot.1 <- function(data, indices) {
d <- data[indices, ]
fit <- glm(INSEGURIDAD ~ aprobacion.fiscalia + corrupcion.estado + impunidad +
transparencia.gobierno + corrupcion.municipio + desempeño.policia +
numero.acciones.part.ciud+desempeño.ejercito,
data = d, family = binomial)
return(coef(fit))
}
set.seed(1)
boot.mod1 <- boot(data = eav23, statistic = coef.boot.1, R = 1000)
coef.boot.3 <- function(data, indices) {
d <- data[indices, ]
fit <- glm(INSEGURIDAD ~ aprobacion.fiscalia + corrupcion.estado +
transparencia.gobierno + corrupcion.municipio + desempeño.policia +
numero.acciones.part.ciud,
data = d, family = binomial)
return(coef(fit))
}
set.seed(1)
boot.mod3 <- boot(data = eav23, statistic = coef.boot.3, R = 1000)
boot.mod2
##
## ORDINARY NONPARAMETRIC BOOTSTRAP
##
##
## Call:
## boot(data = eav23, statistic = coef.boot.2, R = 1000)
##
##
## Bootstrap Statistics :
## original bias std. error
## t1* -1.9057012 0.008854964 0.39069233
## t2* 0.6862515 0.009886842 0.10940128
## t3* 0.5264673 0.002848164 0.07804771
## t4* 0.1875820 -0.001011585 0.05823672
## t5* 0.7986412 -0.004622961 0.12576930
## t6* -0.3103137 -0.003631236 0.07817644
## t7* -0.1023646 -0.001311760 0.03061966
## t8* 0.1434442 -0.001308157 0.04124938
boot.mod1
##
## ORDINARY NONPARAMETRIC BOOTSTRAP
##
##
## Call:
## boot(data = eav23, statistic = coef.boot.1, R = 1000)
##
##
## Bootstrap Statistics :
## original bias std. error
## t1* -1.52735266 0.0176188177 0.43704985
## t2* 0.64551045 0.0095717289 0.11148909
## t3* 0.48988797 0.0024595914 0.07990241
## t4* 0.22114361 -0.0004852337 0.06007460
## t5* 0.78177361 -0.0045756547 0.12648817
## t6* -0.28124905 -0.0033528178 0.07938433
## t7* -0.08083805 -0.0011217765 0.03245809
## t8* 0.14097969 -0.0013300166 0.04180969
## t9* -0.06910459 -0.0013607177 0.03172739
boot.mod3
##
## ORDINARY NONPARAMETRIC BOOTSTRAP
##
##
## Call:
## boot(data = eav23, statistic = coef.boot.3, R = 1000)
##
##
## Bootstrap Statistics :
## original bias std. error
## t1* -1.2646778 0.006246500 0.32868530
## t2* 0.7267838 0.009262144 0.10840960
## t3* 0.4704687 0.002390194 0.07506157
## t4* 0.8248235 -0.004913023 0.12520878
## t5* -0.2852973 -0.003198780 0.07630898
## t6* -0.1155383 -0.001189773 0.03049319
## t7* 0.1288133 -0.001142092 0.03953369
El modelo que presenta menos sesgo de los tres es el modelo 3. No obstante, no difiere mucho del modelo 2; por lo que, nos quedaremos con este último por lo visto con las demás validaciones.
Ridge y Lasso sirven para evaluar el desempeño del modelo escogido. En la prueba de Ridge obtuvimos que:
library(glmnet)
## Loading required package: Matrix
## Loaded glmnet 4.1-8
# Convertir INSEGURIDAD a formato binario (0 y 1) para poderlo usar en Ridge y Lasso
eav23$INSEGURIDAD <- as.numeric(eav23$INSEGURIDAD)
# Crear la matriz de predictores
x <- model.matrix(INSEGURIDAD ~ aprobacion.fiscalia + corrupcion.estado + impunidad +
transparencia.gobierno + corrupcion.municipio + desempeño.policia +
numero.acciones.part.ciud + desempeño.ejercito,
data = eav23)[, -1]
# Variable de respuesta
y <- eav23$INSEGURIDAD
inseguridad.test <- y[subset.test]
# Creamos una cuadrícula de valores que van desde λ = 10^10 a λ = 10^-2
grid <- 10^seq(10,-2,length=100)
ridge.mod <- glmnet(x,y,alpha=0,lambda=grid)
# Sacamos el mejor lambda.
set.seed(1)
cv.out <- cv.glmnet(x[subset.train ,],y[subset.train],alpha=0)
bestlam.ridge <- cv.out$lambda.min
bestlam.ridge # Es 0.026
## [1] 0.02676585
# Predicción del modelo
ridge.mod.prueba <- glmnet(x[subset.train,],y[subset.train],alpha=0,lambda=grid,thresh=1e-12)
ridge.pred <- predict(ridge.mod.prueba,s=bestlam.ridge,newx=x[subset.test,])
mean((ridge.pred-inseguridad.test)^2) # Tiene un MSE de 0.19.
## [1] 0.199152
# Sacamos el valor de los coeficientes
out <- glmnet(x,y,alpha=0)
predict(out,type="coefficients",s=bestlam.ridge)[1:8,]
## (Intercept) aprobacion.fiscaliaDesaprueba
## 1.23717525 0.13004663
## corrupcion.estado impunidad
## 0.08448593 0.04042216
## transparencia.gobiernoSi corrupcion.municipio
## 0.15193714 -0.04583154
## desempeño.policia numero.acciones.part.ciud
## -0.01716535 0.02597797
Como se esperaba, ningún coeficiente de Ridge dio cero. Las variables significativas correspoderán a nuestro modelo final si es que Lasso no las elimina:
Por otra parte, Lasso nos dio que:
cv.out.lasso <- cv.glmnet(x[subset.train,], y[subset.train], alpha = 1, family = "binomial")
# Obtener la mejor lambda para el modelo Lasso
bestlam_lasso <- cv.out.lasso$lambda.min
print(bestlam_lasso)
## [1] 0.0009181943
# Ajustar el modelo Lasso con la mejor lambda
lasso.mod <- glmnet(x[subset.train,], y[subset.train], alpha = 1, lambda = bestlam_lasso, family = "binomial")
# Realizar predicciones en el conjunto de prueba
lasso.mod.prueba <- glmnet(x[subset.train,],y[subset.train],alpha=1,lambda=grid,thresh=1e-12)
predictions_lasso <- predict(lasso.mod.prueba, s = bestlam_lasso, newx = x[subset.test,], type = "response")
mean((predictions_lasso-inseguridad.test)^2) # Tiene un MSE de 0.20.
## [1] 0.2009367
# Sacamos el valor de los coeficientes
out <- glmnet(x,y,alpha=1,lambda=grid)
lasso.coef <- predict(out,type="coefficients",s=bestlam_lasso)[1:8,]
lasso.coef
## (Intercept) aprobacion.fiscaliaDesaprueba
## 1.21397400 0.12438728
## corrupcion.estado impunidad
## 0.06081279 0.02911878
## transparencia.gobiernoSi corrupcion.municipio
## 0.14756859 -0.01472990
## desempeño.policia numero.acciones.part.ciud
## -0.01283495 0.01906017
lasso.coef[lasso.coef!=0]
## (Intercept) aprobacion.fiscaliaDesaprueba
## 1.21397400 0.12438728
## corrupcion.estado impunidad
## 0.06081279 0.02911878
## transparencia.gobiernoSi corrupcion.municipio
## 0.14756859 -0.01472990
## desempeño.policia numero.acciones.part.ciud
## -0.01283495 0.01906017
Como se aprecia, ningún coeficiente dio 0, es decir, todas son importantes para predecir la percepción de Inseguridad en el municipio. Dado que Ridge y Lasso nos ayudan a encontrar mejores predictores que best subsets porque se trata de una regresión logística, nos quedaremos con lo que estas dos funciones arrojaron (no obstante, se puede apreciar que son casi igual los predictores en las tres funciones).
Se verá si se puede mejorar el accuracy del modelo agregando exponentes a algunas de las variables predictoras del modelo. Ahora, nuestro modelo dejará de ser lineal:
# Hacemos una regresión agregando exponentes
eav23$INSEGURIDAD <- as.factor(eav23$INSEGURIDAD)
Reg.poli1<-glm(INSEGURIDAD ~ aprobacion.fiscalia + corrupcion.estado + impunidad +
transparencia.gobierno + corrupcion.municipio + poly(desempeño.policia,2) +
numero.acciones.part.ciud,
data = eav23, family = binomial)
Reg.poli2 <- glm(INSEGURIDAD ~ aprobacion.fiscalia + corrupcion.estado + impunidad +
transparencia.gobierno + corrupcion.municipio + poly(desempeño.policia,3) +
numero.acciones.part.ciud,
data = eav23, family = binomial)
Reg.poli3<- glm(INSEGURIDAD ~ aprobacion.fiscalia + corrupcion.estado + impunidad +
transparencia.gobierno + corrupcion.municipio + poly(desempeño.policia,3) +
poly(numero.acciones.part.ciud,2),
data = eav23, family = binomial)
# Hacemos una comparación Anova.
anova(modelo2, Reg.poli1, Reg.poli2, Reg.poli3)
## Analysis of Deviance Table
##
## Model 1: INSEGURIDAD ~ aprobacion.fiscalia + corrupcion.estado + impunidad +
## transparencia.gobierno + corrupcion.municipio + desempeño.policia +
## numero.acciones.part.ciud
## Model 2: INSEGURIDAD ~ aprobacion.fiscalia + corrupcion.estado + impunidad +
## transparencia.gobierno + corrupcion.municipio + poly(desempeño.policia,
## 2) + numero.acciones.part.ciud
## Model 3: INSEGURIDAD ~ aprobacion.fiscalia + corrupcion.estado + impunidad +
## transparencia.gobierno + corrupcion.municipio + poly(desempeño.policia,
## 3) + numero.acciones.part.ciud
## Model 4: INSEGURIDAD ~ aprobacion.fiscalia + corrupcion.estado + impunidad +
## transparencia.gobierno + corrupcion.municipio + poly(desempeño.policia,
## 3) + poly(numero.acciones.part.ciud, 2)
## Resid. Df Resid. Dev Df Deviance Pr(>Chi)
## 1 2028 2376.9
## 2 2027 2360.7 1 16.1538 5.84e-05 ***
## 3 2026 2359.7 1 1.0714 0.3006
## 4 2025 2359.3 1 0.3742 0.5407
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Basado en estos resultados, el Modelo 2, que incluye una transformación polinómica cuadrática de desempeño.policia, parece ser el más adecuado, ya que mejora significativamente el ajuste del modelo en comparación con el Modelo 1. Los otros cambios en el Modelo 3 y el Modelo 4 no proporcionan una mejora significativa en el ajuste del modelo.
Veremos si al hacer más flexible el modelo agregando splines aumenta su capacidad predictiva correcta:
# Cargar libreria
library(splines)
library(car)
## Loading required package: carData
##
## Attaching package: 'car'
## The following object is masked from 'package:boot':
##
## logit
## The following object is masked from 'package:dplyr':
##
## recode
# Ajustamos 3 modelos con splines
splines1<-glm(INSEGURIDAD ~ aprobacion.fiscalia+
bs(corrupcion.estado,3) +
impunidad +
transparencia.gobierno +
corrupcion.municipio +
desempeño.policia +
numero.acciones.part.ciud,
data = eav23,
family = binomial) # Sólo con spline en corrupción estado
splines2<-glm(INSEGURIDAD ~ aprobacion.fiscalia+
bs(corrupcion.estado,3) +
bs(impunidad, 3) +
transparencia.gobierno +
corrupcion.municipio +
desempeño.policia +
numero.acciones.part.ciud,
data = eav23,
family = binomial) # Con spline en corrupción a nivel estado e impunidad
splines3<-glm(INSEGURIDAD ~ aprobacion.fiscalia+
bs(corrupcion.estado,3) +
bs(impunidad, 3) +
transparencia.gobierno +
corrupcion.municipio +
desempeño.policia +
numero.acciones.part.ciud,
data = eav23,
family = binomial) # Con spline en corrupción estado y municipio e impunidad.
anova(Reg.poli1, splines1, splines2, splines3, test = "Chisq")
## Analysis of Deviance Table
##
## Model 1: INSEGURIDAD ~ aprobacion.fiscalia + corrupcion.estado + impunidad +
## transparencia.gobierno + corrupcion.municipio + poly(desempeño.policia,
## 2) + numero.acciones.part.ciud
## Model 2: INSEGURIDAD ~ aprobacion.fiscalia + bs(corrupcion.estado, 3) +
## impunidad + transparencia.gobierno + corrupcion.municipio +
## desempeño.policia + numero.acciones.part.ciud
## Model 3: INSEGURIDAD ~ aprobacion.fiscalia + bs(corrupcion.estado, 3) +
## bs(impunidad, 3) + transparencia.gobierno + corrupcion.municipio +
## desempeño.policia + numero.acciones.part.ciud
## Model 4: INSEGURIDAD ~ aprobacion.fiscalia + bs(corrupcion.estado, 3) +
## bs(impunidad, 3) + transparencia.gobierno + corrupcion.municipio +
## desempeño.policia + numero.acciones.part.ciud
## Resid. Df Resid. Dev Df Deviance Pr(>Chi)
## 1 2027 2360.7
## 2 2026 2364.6 1 -3.8992
## 3 2024 2339.5 2 25.1782 3.409e-06 ***
## 4 2024 2339.5 0 0.0000
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
El mejor modelo lo dio el de 2 splines (uno en corrupción estado y otro en impunidad).
library(gam)
## Loading required package: foreach
## Loaded gam 1.22-3
# Pondremos los splines donde en el pasado apartado salió mejor en la prueba ANOVA
modelo.gam <- gam(INSEGURIDAD ~ aprobacion.fiscalia + ns(corrupcion.estado,2) + ns(impunidad,3) +
transparencia.gobierno + corrupcion.municipio + desempeño.policia +
numero.acciones.part.ciud,
data = eav23, family= binomial)
# Mostrar el resumen del modelo
summary(modelo.gam)
##
## Call: gam(formula = INSEGURIDAD ~ aprobacion.fiscalia + ns(corrupcion.estado,
## 2) + ns(impunidad, 3) + transparencia.gobierno + corrupcion.municipio +
## desempeño.policia + numero.acciones.part.ciud, family = binomial,
## data = eav23)
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -2.0118 -0.8944 -0.5414 1.0494 2.2253
##
## (Dispersion Parameter for binomial family taken to be 1)
##
## Null Deviance: 2701.43 on 2035 degrees of freedom
## Residual Deviance: 2341.025 on 2025 degrees of freedom
## AIC: 2363.025
##
## Number of Local Scoring Iterations: 3
##
## Anova for Parametric Effects
## Df Sum Sq Mean Sq F value Pr(>F)
## aprobacion.fiscalia 1 101.92 101.920 102.8886 < 2.2e-16 ***
## ns(corrupcion.estado, 2) 2 57.57 28.787 29.0607 3.604e-13 ***
## ns(impunidad, 3) 3 48.81 16.269 16.4236 1.516e-10 ***
## transparencia.gobierno 1 49.41 49.412 49.8818 2.236e-12 ***
## corrupcion.municipio 1 4.63 4.633 4.6768 0.0306886 *
## desempeño.policia 1 14.84 14.838 14.9793 0.0001121 ***
## numero.acciones.part.ciud 1 12.95 12.946 13.0691 0.0003075 ***
## Residuals 2025 2005.94 0.991
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
El árbol de decisiones presenta de manera gráfica nuestro modelo. Su ventaja es de que es fácil de interpretar y explicar para aquellos que no saben de regresiones. Veremos si lo mejora de tal manera que sea la mejor manera de responder nuestra pregunta de investigación.
library(tree)
tree.Inseguridad<-tree(INSEGURIDAD~aprobacion.fiscalia+corrupcion.estado+impunidad+transparencia.gobierno+corrupcion.municipio+desempeño.policia+numero.acciones.part.ciud, data=eav23)
summary(tree.Inseguridad)
##
## Classification tree:
## tree(formula = INSEGURIDAD ~ aprobacion.fiscalia + corrupcion.estado +
## impunidad + transparencia.gobierno + corrupcion.municipio +
## desempeño.policia + numero.acciones.part.ciud, data = eav23)
## Variables actually used in tree construction:
## [1] "transparencia.gobierno" "corrupcion.estado"
## Number of terminal nodes: 3
## Residual mean deviance: 1.217 = 2473 / 2033
## Misclassification error rate: 0.3738 = 761 / 2036
tree.INSEG.ev<-tree(INSEGURIDAD~aprobacion.fiscalia+corrupcion.estado+impunidad+transparencia.gobierno+corrupcion.municipio+desempeño.policia+numero.acciones.part.ciud, data=eav23)
tree.pred<-predict(tree.INSEG.ev,subset.test.df,type="class")
table(tree.pred,Inseguridad.test)
## Inseguridad.test
## tree.pred No Si
## 1 207 52
## 2 172 180
(207+180)/(207+180+52+172) # La accuracy es de 63.33%. Veremos si mejora con el prunning.
## [1] 0.6333879
# Podamos el árbol:
set.seed(1)
cv.prune.inseg<- cv.tree(tree.Inseguridad, FUN=prune.misclass)
cv.prune.inseg
## $size
## [1] 3 2 1
##
## $dev
## [1] 808 808 807
##
## $k
## [1] -Inf 0 10
##
## $method
## [1] "misclass"
##
## attr(,"class")
## [1] "prune" "tree.sequence"
# La desviación estándar que usaremos es la de 3 ramas, no difiere mucho de la de 1 pero explica mejor el modelo.
# Como ya sabemos qué árbol es el mejor, lo podamos:
prune.inseg<- prune.misclass(tree.Inseguridad, best=3)
# Ahora aplicamos al conjunto de prueba el árbol podado:
tree.pred.pruned<-predict(prune.inseg, subset=subset.test, type="class")
summary(prune.inseg)
##
## Classification tree:
## tree(formula = INSEGURIDAD ~ aprobacion.fiscalia + corrupcion.estado +
## impunidad + transparencia.gobierno + corrupcion.municipio +
## desempeño.policia + numero.acciones.part.ciud, data = eav23)
## Variables actually used in tree construction:
## [1] "transparencia.gobierno" "corrupcion.estado"
## Number of terminal nodes: 3
## Residual mean deviance: 1.217 = 2473 / 2033
## Misclassification error rate: 0.3738 = 761 / 2036
Vemos que la tasa de error de clasificación es de 0.37. En este caso, el árbol tiene 3 nodos terminales. Se muestra qué variables se utilizaron para construir el árbol. En este caso, las variables “transparencia.gobierno” y “corrupcion.estado” fueron las que se utilizaron. Una tasa de error de clasificación del 37.38% indica que el modelo no clasifica correctamente un porcentaje significativo de las observaciones en los datos de entrenamiento. Esto sugiere que el modelo puede no estar capturando completamente la estructura subyacente de los datos o que podría estar sobreajustando los datos.
Vemos como queda nuestro árbol después de podar:
# Cargar las librerías necesarias
library(rpart)
library(rpart.plot)
library(RColorBrewer)
# Definir una paleta de colores
colors <- brewer.pal(3, "Set3") # Puedes elegir otra paleta de colores de RColorBrewer
# Crear el modelo de árbol de decisión pero con rpart para después poderlo graficar de una manera más bonita
tree_model <- rpart(INSEGURIDAD ~ aprobacion.fiscalia + corrupcion.estado +
impunidad + transparencia.gobierno + corrupcion.municipio +
desempeño.policia + numero.acciones.part.ciud,
data = eav23, method = "class", cp= 0.0033)
# Podamos el árbol para mejorar la precisión del modelo
prune_cp <- tree_model$cptable[which.min(tree_model$cptable[,"xerror"]), "CP"]
prune.inseg <- prune(tree_model, cp = prune_cp)
# Visualizar el árbol de decisión podado con colores
rpart.plot(prune.inseg,
type = 3, # Tipo de plot (3: gráfico de ramas anchas, que fue el que nos dio el prune que era el mejor modelo)
extra = 106, # Muestra información extra en los nodos (106: clase, probabilidad, % observaciones)
fallen.leaves = TRUE, # Coloca las hojas en la parte inferior del gráfico
box.palette = colors, # Paleta de colores para los nodos
shadow.col = "gray", # Color de sombra para los nodos
cex = 0.8, # Tamaño del texto
main= "") # Título del gráfico
# Ponemos el título del gráfico
title(main = "Árbol de decisiones de Inseguridad", col.main = "deepskyblue4", font.main = 4)
summary(prune.inseg)
## Call:
## rpart(formula = INSEGURIDAD ~ aprobacion.fiscalia + corrupcion.estado +
## impunidad + transparencia.gobierno + corrupcion.municipio +
## desempeño.policia + numero.acciones.part.ciud, data = eav23,
## method = "class", cp = 0.0033)
## n= 2036
##
## CP nsplit rel error xerror xstd
## 1 0.05188067 0 1.0000000 1.0000000 0.02838763
## 2 0.04020752 2 0.8962387 0.9948119 0.02835863
## 3 0.02464332 3 0.8560311 0.8923476 0.02768190
## 4 0.00843061 4 0.8313878 0.8404669 0.02726082
##
## Variable importance
## transparencia.gobierno aprobacion.fiscalia impunidad
## 37 16 13
## desempeño.policia corrupcion.municipio corrupcion.estado
## 13 10 10
##
## Node number 1: 2036 observations, complexity param=0.05188067
## predicted class=1 expected loss=0.3786837 P(node) =1
## class counts: 1265 771
## probabilities: 0.621 0.379
## left son=2 (882 obs) right son=3 (1154 obs)
## Primary splits:
## transparencia.gobierno splits as LR, improve=84.11307, (0 missing)
## aprobacion.fiscalia splits as LR, improve=67.38939, (0 missing)
## desempeño.policia < 7.5 to the right, improve=55.47480, (0 missing)
## corrupcion.estado < 2.5 to the left, improve=40.25435, (0 missing)
## impunidad < 2.5 to the left, improve=23.92856, (0 missing)
## Surrogate splits:
## desempeño.policia < 7.5 to the right, agree=0.712, adj=0.334, (0 split)
## aprobacion.fiscalia splits as LR, agree=0.701, adj=0.311, (0 split)
## corrupcion.municipio < 2.5 to the left, agree=0.681, adj=0.263, (0 split)
## corrupcion.estado < 2.5 to the left, agree=0.676, adj=0.253, (0 split)
## impunidad < 2.5 to the left, agree=0.627, adj=0.139, (0 split)
##
## Node number 2: 882 observations
## predicted class=1 expected loss=0.2142857 P(node) =0.4332024
## class counts: 693 189
## probabilities: 0.786 0.214
##
## Node number 3: 1154 observations, complexity param=0.05188067
## predicted class=2 expected loss=0.4956672 P(node) =0.5667976
## class counts: 572 582
## probabilities: 0.496 0.504
## left son=6 (350 obs) right son=7 (804 obs)
## Primary splits:
## aprobacion.fiscalia splits as LR, improve=10.936770, (0 missing)
## impunidad < 3.5 to the left, improve= 9.444218, (0 missing)
## corrupcion.estado < 3.5 to the left, improve= 9.039034, (0 missing)
## desempeño.policia < 8.5 to the right, improve= 8.603775, (0 missing)
## corrupcion.municipio < 1.5 to the right, improve= 1.874868, (0 missing)
## Surrogate splits:
## numero.acciones.part.ciud < 7.5 to the right, agree=0.702, adj=0.017, (0 split)
## desempeño.policia < 9.5 to the right, agree=0.698, adj=0.006, (0 split)
##
## Node number 6: 350 observations
## predicted class=1 expected loss=0.4 P(node) =0.1719057
## class counts: 210 140
## probabilities: 0.600 0.400
##
## Node number 7: 804 observations, complexity param=0.04020752
## predicted class=2 expected loss=0.4502488 P(node) =0.3948919
## class counts: 362 442
## probabilities: 0.450 0.550
## left son=14 (257 obs) right son=15 (547 obs)
## Primary splits:
## impunidad < 2.5 to the left, improve=9.151890, (0 missing)
## corrupcion.estado < 3.5 to the left, improve=3.623714, (0 missing)
## corrupcion.municipio < 2.5 to the right, improve=3.545109, (0 missing)
## numero.acciones.part.ciud < 0.5 to the left, improve=2.122661, (0 missing)
## desempeño.policia < 8.5 to the right, improve=1.543722, (0 missing)
## Surrogate splits:
## desempeño.policia < 8.5 to the right, agree=0.687, adj=0.019, (0 split)
## numero.acciones.part.ciud < 3.5 to the right, agree=0.682, adj=0.004, (0 split)
##
## Node number 14: 257 observations, complexity param=0.02464332
## predicted class=1 expected loss=0.4396887 P(node) =0.1262279
## class counts: 144 113
## probabilities: 0.560 0.440
## left son=28 (142 obs) right son=29 (115 obs)
## Primary splits:
## impunidad < 1.5 to the right, improve=8.5027320, (0 missing)
## corrupcion.estado < 3.5 to the left, improve=5.4899670, (0 missing)
## numero.acciones.part.ciud < 0.5 to the left, improve=2.5240900, (0 missing)
## desempeño.policia < 3.5 to the left, improve=2.1949560, (0 missing)
## corrupcion.municipio < 2.5 to the right, improve=0.7560333, (0 missing)
## Surrogate splits:
## corrupcion.estado < 3.5 to the left, agree=0.642, adj=0.200, (0 split)
## corrupcion.municipio < 2.5 to the right, agree=0.638, adj=0.191, (0 split)
## desempeño.policia < 6.5 to the left, agree=0.599, adj=0.104, (0 split)
## numero.acciones.part.ciud < 5.5 to the left, agree=0.560, adj=0.017, (0 split)
##
## Node number 15: 547 observations
## predicted class=2 expected loss=0.3985375 P(node) =0.268664
## class counts: 218 329
## probabilities: 0.399 0.601
##
## Node number 28: 142 observations
## predicted class=1 expected loss=0.3239437 P(node) =0.0697446
## class counts: 96 46
## probabilities: 0.676 0.324
##
## Node number 29: 115 observations
## predicted class=2 expected loss=0.4173913 P(node) =0.0564833
## class counts: 48 67
## probabilities: 0.417 0.583
# Calculamos tasa de error de clasificación
# Obtener las predicciones del modelo para los datos de prueba
predicciones <- predict(prune.inseg, newdata = subset.test.df, type = "class")
El gráfico del árbol podado nos dice que,
transparencia.gobierno
es la variable más influyente,
seguida por aprobacion.fiscalia
e
impunidad y desempeño policía
. Impunidad se desagrega más
entre mayor o igual a 2 y menor a 2. Además, vemos la incorporación de
corrupción estado como una rama secundaria.
Quienes piensan que no hay transparencia en el gobierno corresponden a 43% de las observaciones, es decir, 882. Los que si corresponden al restante 57% que se dividen en aprobación/desaprobación de la fiscalía. los que aprueban a la fiscalía a su vez se dividen en el desempeño a la policía mayor o igual a 9 y menor a 9. Los que pusieron un desempeño a la policía ≥ 9, son muy pocas observaciones. Corresponden al 2% del total. Por otra parte, el < 9, se divide en corrupción al estado mayor o igual a 4 (5% del total) y menor de 4 (10%).
Ahora, los que desaprueban a la fiscalía, se dividen en impunidad ≥ 3 (27% de las observaciones) y menor de 3, que se subdivide en impunidad ≥2 (7%) y menor a 2 (6%).
# Resumen del árbol
printcp(prune.inseg)
##
## Classification tree:
## rpart(formula = INSEGURIDAD ~ aprobacion.fiscalia + corrupcion.estado +
## impunidad + transparencia.gobierno + corrupcion.municipio +
## desempeño.policia + numero.acciones.part.ciud, data = eav23,
## method = "class", cp = 0.0033)
##
## Variables actually used in tree construction:
## [1] aprobacion.fiscalia impunidad transparencia.gobierno
##
## Root node error: 771/2036 = 0.37868
##
## n= 2036
##
## CP nsplit rel error xerror xstd
## 1 0.0518807 0 1.00000 1.00000 0.028388
## 2 0.0402075 2 0.89624 0.99481 0.028359
## 3 0.0246433 3 0.85603 0.89235 0.027682
## 4 0.0084306 4 0.83139 0.84047 0.027261
# Contar el número de nodos
num_nodos <- nrow(prune.inseg$frame)
num_nodos
## [1] 9
Este árbol tiene 7 hojas, 13 nodos y 12 ramas. Las hojas en color azul (tienen el número 1) representan aquellos con percepción de seguridad y los morados (número 2) los de inseguridad. Se aprecia que los morados son aproximandamente 1/3 de las observaciones, lo que confirma nuestros modelos previos que clasificaban así mismo. Debajo del 1 (o 2, según corresponda el color y la percecpión de inseguridad predicha) en la hoja vemos un número con decimales este representa la pérdida esperada. Ésta se refiere a la proporción de observaciones en este nodo que no pertenecen a la clase predicha. Por ejemplo, en la primer hoja que es azul con “1” y una pérdida esperada de 0.21, significa que, este nodo predice la clase 1, y su pérdida esperada es la proporción de observaciones en este nodo que pertenecen a la clase 2.
Por último, vemos una mejora significativa en la precisión del árbol podado: Bajó la tasa de error. Ahora, tiene una tasa de error de clasificación del 37.86%. Veremos si se mejora con random forest:
# Cargar la librería randomForest
library(randomForest)
## randomForest 4.7-1.1
## Type rfNews() to see new features/changes/bug fixes.
##
## Attaching package: 'randomForest'
## The following object is masked from 'package:ggplot2':
##
## margin
## The following object is masked from 'package:dplyr':
##
## combine
# Establecer la semilla para reproducibilidad
set.seed(1)
# Entrenar el modelo de Random Forest
rf_model <- randomForest(INSEGURIDAD ~ aprobacion.fiscalia + corrupcion.estado +
impunidad + transparencia.gobierno + corrupcion.municipio +
desempeño.policia + numero.acciones.part.ciud,
data = eav23, mtry = 7, importance = TRUE)
# Mostrar el modelo
print(rf_model)
##
## Call:
## randomForest(formula = INSEGURIDAD ~ aprobacion.fiscalia + corrupcion.estado + impunidad + transparencia.gobierno + corrupcion.municipio + desempeño.policia + numero.acciones.part.ciud, data = eav23, mtry = 7, importance = TRUE)
## Type of random forest: classification
## Number of trees: 500
## No. of variables tried at each split: 7
##
## OOB estimate of error rate: 33.74%
## Confusion matrix:
## 1 2 class.error
## 1 965 300 0.2371542
## 2 387 384 0.5019455
set.seed(1) # Para reproducibilidad
# Entrenar el modelo
rf_model <- randomForest(INSEGURIDAD ~ aprobacion.fiscalia + corrupcion.estado +
impunidad + transparencia.gobierno + corrupcion.municipio +
desempeño.policia + numero.acciones.part.ciud,
data = eav23, subset = subset.train)
# Realiza las predicciones
predicciones_rf <- predict(rf_model, newdata = subset.test.df)
# Calcular el MSE y generar el gráfico
mse <- mean((predicciones_rf - Inseguridad.test)^2)
## Warning in Ops.factor(predicciones_rf, Inseguridad.test): '-' not meaningful
## for factors
print(mse)
## [1] NA
# Calcular la importancia de las variables en el modelo de Random Forest
importancia <- importance(rf_model)
# Mostrar la importancia de las variables en el modelo
print(importancia)
## MeanDecreaseGini
## aprobacion.fiscalia 29.60044
## corrupcion.estado 41.58494
## impunidad 36.16317
## transparencia.gobierno 35.10102
## corrupcion.municipio 29.92165
## desempeño.policia 69.03257
## numero.acciones.part.ciud 34.12673
# Graficar la importancia de las variables
varImpPlot(rf_model)
Random Forest generó 500 árboles usando 7 variables en cada uno. El OOB (Out-Of-Bag error) fue de 33.74%.Se aprecia que, desempeño de la policía fue la variable con mayor importancia en el modelo seguida por corrupción del Estado y la impunidad.
Una vez que hicimos estas formas posibles de mejorar nuestra predicción, las someteremos a prueba para ver cuál es la mejor para quedarnos con ella al final. Al final de cada apartado, seleccionamos un único modelo, por lo que sólo nos basaremos en el modelo seleccionado por apartado:
anova(modelo2, Reg.poli1, splines2, modelo.gam)
## Analysis of Deviance Table
##
## Model 1: INSEGURIDAD ~ aprobacion.fiscalia + corrupcion.estado + impunidad +
## transparencia.gobierno + corrupcion.municipio + desempeño.policia +
## numero.acciones.part.ciud
## Model 2: INSEGURIDAD ~ aprobacion.fiscalia + corrupcion.estado + impunidad +
## transparencia.gobierno + corrupcion.municipio + poly(desempeño.policia,
## 2) + numero.acciones.part.ciud
## Model 3: INSEGURIDAD ~ aprobacion.fiscalia + bs(corrupcion.estado, 3) +
## bs(impunidad, 3) + transparencia.gobierno + corrupcion.municipio +
## desempeño.policia + numero.acciones.part.ciud
## Model 4: INSEGURIDAD ~ aprobacion.fiscalia + ns(corrupcion.estado, 2) +
## ns(impunidad, 3) + transparencia.gobierno + corrupcion.municipio +
## desempeño.policia + numero.acciones.part.ciud
## Resid. Df Resid. Dev Df Deviance Pr(>Chi)
## 1 2028 2376.9
## 2 2027 2360.7 1 16.1538 5.840e-05 ***
## 3 2024 2339.5 3 21.2789 9.213e-05 ***
## 4 2025 2341.0 -1 -1.5648 0.211
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
En la prueba ANOVA, el modelo que sale significativo de todos los hechos es el de splines, el cual tiene splines en corrupción e impunidad:
splines2<-glm(INSEGURIDAD ~ aprobacion.fiscalia+ bs(corrupcion.estado,3) + bs(impunidad, 3) + transparencia.gobierno + corrupcion.municipio + desempeño.policia + numero.acciones.part.ciud, data = eav23, family = binomial)
Dado que el objeto de estudio era entender qué factores institucionales contribuyen a la percepción de inseguridad en una comunidad, recogimos los datos de la Encuesta de Cómo Vamos Nuevo León 2023 que hablaban sobre diferentes aspectos que creemos podrían influir en cómo las personas perciben la inseguridad.
Hemos analizado varios factores:
Aprobación de la Fiscalía: Las personas que desaprueban el trabajo de la fiscalía tienden a sentir más inseguridad.
Corrupción del Estado: Hay una relación compleja, no lineal -modelada cúbicamente en el modelo-, entre la percepción de corrupción estatal y la inseguridad. Parte de esta relación sugiere que en algunos casos, cuando la percepción de corrupción es muy alta, la inseguridad percibida también aumenta significativamente.
Transparencia del Gobierno: Curiosamente, aquellos que creen que el gobierno es transparente también tienden a sentirse más inseguros. Esto podría interpretarse de varias maneras, quizás porque la transparencia revela problemas que antes no se veían. Esto NO es una invitación a los gobiernos a ser menos abiertos, más bien, aunque puede aumentar la percepción de inseguridad en corto plazo, vuelve a los ciudadanos más críticos y por ende exigentes de políticas públicas en materia de seguridad que vuelva su entorno más seguro.
Desempeño de la Policía: Las personas que creen que la policía está haciendo un buen trabajo tienden a sentirse más seguras. Curiosamente, salió significativa a diferencia de otros organismos de seguridad como fuerza civil, guardia nacional, etc.
Número de Acciones de Participación Ciudadana: Mayor número de acciones de participación ciudadana está relacionado con una mayor percepción de inseguridad. Esto podría ser porque las acciones de participación ciudadana a menudo se inician en respuesta a problemas de inseguridad.
splines.mujer<-glm(INSEGURIDAD ~ aprobacion.fiscalia+
bs(corrupcion.estado,3) +
bs(impunidad, 3) +
transparencia.gobierno +
corrupcion.municipio +
desempeño.policia +
numero.acciones.part.ciud,
data = eav23.mujer,
family = binomial)
splines.hombre<-glm(INSEGURIDAD ~ aprobacion.fiscalia+
bs(corrupcion.estado,3) +
bs(impunidad, 3) +
transparencia.gobierno +
corrupcion.municipio +
desempeño.policia +
numero.acciones.part.ciud,
data = eav23.hombre,
family = binomial)
Los mismos predictores significativos en ambos sexos se repiten pero con distintos matices. Es curioso ver que las acciones ciudadanas tienen mayor peso en los hombres que en las mujeres. El predictor con más peso en hombres fue la corrupción del estado mientras que en las mujeres fue el de la transparencia del gobierno.
Este estudio nos ayuda a entender que la percepción de inseguridad está influenciada por una variedad de factores, tanto relacionados con la gobernanza y la justicia, como con la participación de la comunidad. Las intervenciones para mejorar la percepción de seguridad también deben englobar la perspectiva institucional. Pues, se debe recordar que, la percepción de inseguridad no se debe a un solo factor, sino a una combinación de varios aspectos del gobierno y la sociedad. Mejorar la percepción de seguridad requerirá abordar estos múltiples frentes de manera integrada.
Además de aplicar una perspectiva institucional, se debe ver con un enfoque de género, sabiendo que, aunque son los mismos factores institucionales que influyen en ambos sexos, lo hacen en distinto peso.
Recomendaciones a Cómo Vamos Nuevo León: