1. Concluyamos la limpieza de la base de la Encuesta Así Vamos 2021.

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)

2. Árbol de decisión

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)

3. ¿Qué pasa si tengo dudas de R, necesito hacer una tarea específica, me sale algún error o mi código no corre?

  1. 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.

  2. 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.

  3. 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.