Cuando limpiemos una base de datos es recomendable tener en mente con que fin la estamos limpiando.
Para este ejemplo tengamos en mente que lo que buscamos es detectar las problemáticas más relevantes a ser atendidas por el alcalde de algún municipio.
Seleccionamos variables de interés para poder comprender cuáles son las principales causas por las que se aprueba o desaprueba el trabajo de un alcalde y al detectarlas poder priorizarlas. En este caso nos concentraremos solamente en servicios públicos.
library(dplyr)
eav21 <- read.csv("EAV_2021.csv")
#Municipio
#P112. En términos generales, ¿aprueba o desaprueba el trabajo que hizo (Nombre de ALCALDE/ALCALDESA saliente)?
#P41. De acuerdo con su experiencia en su municipio, qué tan satisfecho está con los siguientes servicios públicos. Evalúe, en una escala del 1 al 10, en donde 1 es "muy malo" y 10 "muy bueno".
#P41.1. Alumbrado público.
#P41.2. Condición de las calles y avenidas.
#P41.4. Parques, plazas y áreas verdes.
#P41.5. Drenaje pluvial.
#P41.6. Recolección de basura.
#P96. De acuerdo con su percepción, ¿Mencione cuál es el principal problema de SEGURIDAD que se vive en su municipio? 1 Delitos de alto impacto (homicidio, secuestro, violación). 2 Robos patrimoniales (robo a casa, vehículo, negocio o persona). 3 Delincuencia Organizada (venta de drogas, extorsiones, cobro de piso, presencia de grupos armados). 4 Violencia familiar y/o violencia contra la mujer. 5 Violencia en la colonia (riñas, conflicto entre vecinos, pandillerismo). 6 Todas. 7 Ninguno. 8 NS. 9 NC
#p128 1 Sin ingreso. 2 Menos de 1 SM ($1 - $4,250). 3 1-2 SM (4,251 - 8,501). 4 2-3 SM (8,502 - 12,752). 5 3-4 SM (12,753 - 17,003). 6 4-5 SM (17,004 - 21,254). 7 5-6 SM (21,255 - 25,505). 8 6-7 SM (25,506 - 29,756). 9 7-8 SM (29,757 - 34,007). 10 8-9 SM (34,008 - 38,258). 11 9-10 SM (38,259 - 42,509). 12 10 o más SM (42,510 o más). 13 No contesto
variables.seleccionadas <- eav21%>%
select(m05_nom, p112, p114, p41_1, p41_2, p41_4, p41_5, p41_6, p128, p96, p114)
Omitamos las variables NA de nuestra base de variables seleccionadas
variables.seleccionadas<-na.omit(variables.seleccionadas)
Cambiaremos el nombre de las variables a algo más entendible, además revisaremos el tipo de variables que tenemos y las transformaremos a cómo las necesitamos creando nuevas variables
base.corregida<-variables.seleccionadas%>%
#Seleccionaremos el municipio con el que queremos trabajar, para este ejemplo seleccionaré Apodaca
filter(m05_nom=='Apodaca')%>%
#Ahora creo una nueva variable que se llame municipio la transformo a factor
mutate(municipio=as.factor(m05_nom))%>%
#Eliminamos los 8 y 9 que son no sabe y no contestó de la pregunta de aprobación
filter(p112!=8)%>%
filter(p112!=9)%>%
#Agrego una nueva variable que se llamará aprobación
mutate(aprobacion=ifelse(p112=='1', 'aprobado', 'desaprobado'))%>%
mutate(aprobacion=as.factor(aprobacion))%>%
#Agrego variables para cada servicio
mutate(alumbrado.publico=as.numeric(p41_1))%>%
mutate(calles=as.numeric(p41_2))%>%
mutate(parques=as.numeric(p41_4))%>%
mutate(pluvial=as.numeric(p41_5))%>%
mutate(recoleccion.basura=as.numeric(p41_6))%>%
mutate(maximo.ingreso=ifelse(p128=='1', 0,
ifelse(p128=='2', 4250,
ifelse(p128=='3', 8501,
ifelse(p128=='4', 12752,
ifelse(p128=='5', 17003,
ifelse(p128=='6', 21254,
ifelse(p128=='7', 25505,
ifelse(p128=='8', 29756,
ifelse(p128=='9', 34007,
ifelse(p128=='10', 38258,
ifelse(p128=='11', 42509,
ifelse(p128=='12', 50000,'NA')))))))))))))%>%
filter(maximo.ingreso!='NA')%>%
mutate(maximo.ingreso=as.numeric(maximo.ingreso))%>%
mutate(problemas.de.inseguridad=ifelse(p96=='1', 'delitos.alto.impacto',
ifelse(p96=='2', 'robo',
ifelse(p96=='3', 'delincuencia.organizada',
ifelse(p96=='4', 'violencia.familiar',
ifelse(p96=='5', 'violencia.en.la.colonia','NA'))))))%>%
filter(problemas.de.inseguridad!='NA')%>%
mutate(problemas.de.inseguridad=as.factor(problemas.de.inseguridad))%>%
mutate(prioridades=ifelse(p114=='1', 'seguridad',
ifelse(p114=='2', 'servicios.publicos',
ifelse(p114=='3', 'calidad.aire',
ifelse(p114=='5', 'infraestructura.movilidad',
ifelse(p114=='6', 'parques',
ifelse(p114=='10', 'tercera.edad',
ifelse(p114=='11', 'educación',
ifelse(p114=='12', 'mujeres',
ifelse(p114=='13', 'empleos',
ifelse(p114=='14', 'visitar.colonias',
ifelse(p114=='15', 'recoger.animales.callejeros',
ifelse(p114=='16', 'cumplir.promesas.campaña',
ifelse(p114=='19', 'mas hospitales', 'NA'))))))))))))))%>%
filter(prioridades!='NA')%>%
mutate(prioridades=as.factor(prioridades))%>%
select(municipio,aprobacion, alumbrado.publico,calles,parques, pluvial,recoleccion.basura, problemas.de.inseguridad, prioridades)
Crearemos un árbol de decisión y para esto cargaremos las librerías que utilizaremos para este fin
library(tree)
library(randomForest)
Para nuestro arbol de decisión utilizaremos aprobación como respuesta a predecir
eav.tree<-tree(aprobacion~., data=base.corregida)
summary(eav.tree)
##
## Classification tree:
## tree(formula = aprobacion ~ ., data = base.corregida)
## Variables actually used in tree construction:
## [1] "prioridades" "calles"
## [3] "recoleccion.basura" "problemas.de.inseguridad"
## [5] "alumbrado.publico" "pluvial"
## Number of terminal nodes: 13
## Residual mean deviance: 0.5572 = 125.9 / 226
## Misclassification error rate: 0.1046 = 25 / 239
Ploteamos nuestro arbol
plot(eav.tree)
text(eav.tree, pretty=0, cex=0.5)
Apliquemos ahora Random Forest
set.seed(555)
rf.eav<-randomForest(aprobacion~.-municipio,data=base.corregida,mtry=3,importance=TRUE)
rf.eav
##
## Call:
## randomForest(formula = aprobacion ~ . - municipio, data = base.corregida, mtry = 3, importance = TRUE)
## Type of random forest: classification
## Number of trees: 500
## No. of variables tried at each split: 3
##
## OOB estimate of error rate: 13.81%
## Confusion matrix:
## aprobado desaprobado class.error
## aprobado 204 7 0.03317536
## desaprobado 26 2 0.92857143
Verificamos su importancia
importance(rf.eav)
## aprobado desaprobado MeanDecreaseAccuracy
## alumbrado.publico 2.1201875 -2.7931399 0.9058731
## calles 8.2676208 -5.8207480 6.1043697
## parques -0.6203642 0.6810551 -0.2102313
## pluvial -4.5027914 -2.3628072 -5.1233772
## recoleccion.basura -2.9648021 3.7918603 -1.1349120
## problemas.de.inseguridad -1.5308235 2.4274419 -0.5483212
## prioridades 1.2112085 -0.5599519 0.6831862
## MeanDecreaseGini
## alumbrado.publico 6.547771
## calles 8.969899
## parques 6.823151
## pluvial 6.475308
## recoleccion.basura 6.766865
## problemas.de.inseguridad 3.927308
## prioridades 6.063672
varImpPlot(rf.eav)
Mi mejor recomendación: ¡GOOGLEA!, estoy seguro que el problema o requerimiento que estás necesitando alguien más ya lo vivió antes y su experiencia te podrá ayudar a resolver tus dudas.
Si deseas realizar una tarea específica en R, te recomiendo que busques en google el nombre de la tarea en inglés acompañado del texto “in R”. Algunos ejemplos “graphs in R”, “webscrapping in R”, “word clouds in R”, “system dynamics in R”, “financial analysis in R”, etc. Encontrarás tutoriales fantásticos y que puedes ir resolviendo paso a paso para luego extrapolar a tu caso.
Mi última recomendación: ¡NO TE FRUSTRES!. Los errores en el código sólo indican que hay cosas que se deben mejorar, busca el error, trabaja en resolverlo y si por más que le das vuelta no encuentras la razón, recuerda que siempre habrá alguien que tenga un poco más de experiencia o que ya haya pasado por el mismo error que tu y a quién le puedas pedir le eche un ojito a tu código.