Algunos hacks:

Crear nuevo chunk = Ctrl + Alt + i En Mac = Cmd (o Options) + Alt + i

Flecha rápida <- Alt + - (guión)

Estructura de la sesión

  1. Cargar librerías y base de datos
  2. Análisis de una variable a la vez
  3. Función table
  4. Manipulación de bases de datos data.frame, función “select”, función “filter”
  5. Transformación de variables en bases de datos función “mutate”, as.factor, as.numeric, función “ifelse”
  6. Significado del operador %>% (pipe) y limpieza general de datos
  7. Árboles de decisión
  8. Random Forest

1. Cargamos las librerías a utilizar y la base de datos

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(tree)
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:dplyr':
## 
##     combine
eav21 <- read.csv("EAV_2021.csv")

¿Cómo saber si se cargó bien la base de datos? Imprime las primeras 6 filas:

# head(eav21)

2. ¿Cómo analizar solo una variable a la vez?

2 formas: ### Signo de pesos

head(eav21$m18_sex)
## [1] "Hombre" "Hombre" "Hombre" "Hombre" "Hombre" "Hombre"
head(eav21$p83)
## [1] 3 2 2 2 2 1

Función attach

attach(eav21)
head(m18_sex)
## [1] "Hombre" "Hombre" "Hombre" "Hombre" "Hombre" "Hombre"
head(p83)
## [1] 3 2 2 2 2 1

La función attach te permite escribir solo 1 vez el nombre de la base de datos, para motivos de practicidad y rapidez. Así puedes llamar a varias variables al mismo tiempo e incluirlas más rápidamente en una función o acción.

3. Función table

attach(eav21)
table(m05_nom)
## m05_nom
##                  An\xe1huac                    Mar\xedn 
##                          16                           4 
##        Ci\xe9nega de Flores                   Garc\xeda 
##                          52                         354 
##                     Allende            General Ter\xe1n 
##                          12                           4 
##                     Apodaca                   Ju\xe1rez 
##                         351                         354 
##                Pesquer\xeda San Nicol\xe1s de los Garza 
##                          80                         354 
##        Cadereyta Jim\xe9nez   San Pedro Garza Garc\xeda 
##                         353                         346 
##                   Aramberri                  Bustamante 
##                           4                           4 
##               Doctor Arroyo                   El Carmen 
##                           8                          52 
##                     Galeana               General Bravo 
##                          12                           8 
##            General Escobedo              General Zuazua 
##                         354                          52 
##                   Guadalupe                     Hidalgo 
##                         354                           8 
##                 Hualahuises                     Linares 
##                           4                          64 
##                 Los Ramones              Melchor Ocampo 
##                           4                           4 
##              Mier y Noriega                Montemorelos 
##                           4                          44 
##                   Monterrey                     Rayones 
##                         354                           4 
##             Sabinas Hidalgo            Salinas Victoria 
##                          28                          50 
##              Santa Catarina                    Santiago 
##                         354                         348 
##                  Villaldama 
##                           8

La función table te permite observar la frecuencia de cada término en una base de datos. En este caso, estamos analizando qué tantas encuestas se hicieron en cada municipio. Cuenta las coincidencias de caracteres y los convierte en una clase a cada una de estas.

Se pueden hacer incluso tablas cruzadas, es decir, cruzar una variable con otra y ver qué frecuencia tiene este cruce.

table(m05_nom, p83)
##                              p83
## m05_nom                         1   2   3   4   8   9
##   An\xe1huac                    0  14   1   1   0   0
##   Mar\xedn                      0   4   0   0   0   0
##   Ci\xe9nega de Flores          0  19  31   2   0   0
##   Garc\xeda                    14 204 132   3   1   0
##   Allende                       2   9   1   0   0   0
##   General Ter\xe1n              3   1   0   0   0   0
##   Apodaca                      31 263  51   5   1   0
##   Ju\xe1rez                    13 198 135   8   0   0
##   Pesquer\xeda                  1  43  34   2   0   0
##   San Nicol\xe1s de los Garza  45 243  61   4   1   0
##   Cadereyta Jim\xe9nez          9 160 161  21   1   1
##   San Pedro Garza Garc\xeda   121 211  13   1   0   0
##   Aramberri                     1   1   2   0   0   0
##   Bustamante                    0   4   0   0   0   0
##   Doctor Arroyo                 0   7   1   0   0   0
##   El Carmen                     0  36  16   0   0   0
##   Galeana                       0  12   0   0   0   0
##   General Bravo                 1   5   1   1   0   0
##   General Escobedo             29 200 116   8   1   0
##   General Zuazua                6  32   5   9   0   0
##   Guadalupe                    15 221 108   9   0   1
##   Hidalgo                       0   5   2   1   0   0
##   Hualahuises                   0   4   0   0   0   0
##   Linares                       4  50   6   4   0   0
##   Los Ramones                   0   3   1   0   0   0
##   Melchor Ocampo                0   3   1   0   0   0
##   Mier y Noriega                0   3   1   0   0   0
##   Montemorelos                  2  30  11   1   0   0
##   Monterrey                    37 227  84   6   0   0
##   Rayones                       2   2   0   0   0   0
##   Sabinas Hidalgo               0  23   5   0   0   0
##   Salinas Victoria              0  35  15   0   0   0
##   Santa Catarina               52 228  62  11   0   1
##   Santiago                     46 256  42   3   1   0
##   Villaldama                    1   7   0   0   0   0

4. Manipulación de bases de datos

Función data.frame

attach(eav21)
dataframe_eav <- data.frame(m05_nom, m18_sex, p83, p96, p128)

Crea un dataframe, es decir, una tabla de datos con las variables que ingreses. Aún no la hemos asignado a una variable; esto es simplemente por motivos de exploración de los datos.

Función select

La siguiente función puede hacer lo mismo que la anterior. Sin embargo, select puede encadenarse con otras funciones en una “gran función”. Esto se verá en la sección “operador % (pipe)”

select_eav <- select(eav21, m05_nom, m18_sex, p83, p96, p128)

Función filter

Te permite seleccionar del data frame solo aquellas observaciones que cumplan con la condición de ser del municipio de San Pedro Garza García.

observaciones_spgg <- filter(eav21,
       m05_nom == 'San Pedro Garza Garcia')

Pequeño ejercicio: ¿Cómo podrías filtrar solamente las observaciones que corresponden al municipio de Juarez? Pista: es parecido al filtro realizado en el chunk anterior

5. Transformación de variables en bases de datos

Función mutate

Las variables en nuestra base de datos que corresponden a, por ejemplo, los municipios, son meros caracteres. R no sabrá cómo interpretarlos, pues para éste son simples letras sin un sentido o patrón aparente, aunque nosotrxs sepamos que corresponden a nombres de municipios.

¿Cómo podemos facilitar la labor de interpretación a R? #### Función as.factor

municipios <- mutate(eav21, m05_nom = as.factor(m05_nom))

Ahora R podrá fácilmente identificar todos estos caracteres como una clase o clasificación. Por lo tanto, Juarez será un factor diferente a Santa Catarina, y ahora podremos tener un análisis más profundo y rico de nuestros datos.

¿Puedes pensar en otras variables que puedan ser consideradas por R como factor para facilitar su análisis?

Función as.numeric

De igual manera, existen variables en nuestra base de datos que pueden ser consideradas no numéricas, pero que en realidad consisten en valores numéricos. En su caso, se tendría que usar “as.numeric()”, sin embargo, son raros estos casos, pues normalmente R lee las variables numéricas como “integers” por default.

Sin embargo, puede haber casos en los que algunos caracteres se hayan mezclado con valores numéricos en tu columna de observaciones, y por lo tanto as.numeric() jugaría un rol importante.

En este ejercicio, no lo usaremos puesto que R leyó todas las variables numéricas como lo que son, numéricas.

Función ifelse

seguridad_transporte <- select(eav21, p29_1_3)

## Filtrar todos los no sé, no contestó y no aplica porque no son relevantes para este ejercicio
seguridad_transporte <- filter(seguridad_transporte, !p29_1_3 %in% c(8, 9, 99))

seguridad_transporte <- mutate(seguridad_transporte, seguro.en.transporte = ifelse(p29_1_3 == '0','Inseguro','Seguro'))

seguridad_transporte <- mutate(seguridad_transporte, seguro.en.transporte = as.factor(seguro.en.transporte))

Todo lo anterior es muy cansado :( Nos llevó alrededor de 4 líneas llenas de texto para hacer lo que queríamos hacer.

6. ¿Se podría realizar todo lo anterior de manera más eficiente? ¡¡Síííí!!

Se puede utilizar un operador muy útil: %>% (pipe)

seguridad_transporte <- select(eav21, p29_1_3) %>% 
  filter(p29_1_3 %in% c(0, 1)) %>% # Aquí estamos filtrando 8, 9 y 99 a la vez sin necesidad de emplear varias líneas de código
  mutate(seguro.en.transporte = as.factor(ifelse(p29_1_3 == '0','Inseguro','Seguro')))

Lo que estamos haciendo en el anterior chunk es encadenar