Previo

¡Recuerda poner el directorio!

setwd("/Users/anaescoto/Dropbox/2020/R_invierno")

Vamos a importar la base completa del cuestionario sociodemográfico de la Encuesta Nacional de Ocupación y Empleo, trimestre III de 2019

library(haven)
SDEMT319 <- read_dta("./datos/SDEMT319.dta")

Vamos a llamar algunas librerías básicas, el tidyverse (que son muchas librerías) y sjlabelled que nos sirve para el manejo de etiquetas

library(tidyverse)
## ── Attaching packages ──────────────────────────────────────────────────── tidyverse 1.2.1 ──
## ✔ ggplot2 3.2.1     ✔ purrr   0.3.3
## ✔ tibble  2.1.3     ✔ dplyr   0.8.3
## ✔ tidyr   1.0.0     ✔ stringr 1.4.0
## ✔ readr   1.3.1     ✔ forcats 0.4.0
## ── Conflicts ─────────────────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
library(sjlabelled)
## 
## Attaching package: 'sjlabelled'
## The following object is masked from 'package:forcats':
## 
##     as_factor
## The following object is masked from 'package:dplyr':
## 
##     as_label
## The following objects are masked from 'package:haven':
## 
##     as_factor, read_sas, read_spss, read_stata, write_sas,
##     zap_labels

Ojeando

#glimpse(SDEMT319)
glimpse(SDEMT319[,1:10]) # en corchete del lado derecho podemos ojear columnas 
## Observations: 405,449
## Variables: 10
## $ r_def <dbl+lbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ loc   <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1…
## $ mun   <dbl> 2, 6, 6, 6, 6, 11, 11, 11, 11, 10, 10, 16, 16, 16, 13, 13,…
## $ est   <dbl> 10, 20, 20, 20, 20, 20, 20, 20, 20, 30, 30, 40, 40, 40, 20…
## $ est_d <dbl> 117, 118, 118, 118, 118, 118, 118, 118, 118, 119, 119, 120…
## $ ageb  <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
## $ t_loc <dbl+lbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, …
## $ cd_a  <dbl+lbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, …
## $ ent   <dbl+lbl> 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, …
## $ con   <dbl> 40001, 40003, 40003, 40003, 40003, 40005, 40005, 40005, 40…

Podemos hacer un tipo “labelbook”, usando una función que viene de la librería “sjlabelled”, “get_labels”. Funciona para toda la base o para columnas, o para variables.

#print(get_labels(SDEMT319)) #todas
print(get_labels(SDEMT319[, 1:10])) #de las primeras 10 variables
## $r_def
## [1] "Entrevista completa"   "Entrevista suspendida"
## 
## $loc
## NULL
## 
## $mun
## NULL
## 
## $est
## NULL
## 
## $est_d
## NULL
## 
## $ageb
## NULL
## 
## $t_loc
## [1] "Localidades mayores de 100 000 habitantes"
## [2] "Localidades de 15 000 a 99 999 habitantes"
## [3] "Localidades de 2 500 a 14 999 habitantes" 
## [4] "Localidades menores de 2 500 habitantes"  
## 
## $cd_a
##  [1] "México"                    "Guadalajara"              
##  [3] "Monterrey"                 "Puebla"                   
##  [5] "León"                      "Torreón"                  
##  [7] "San Luis Potosí"           "Mérida"                   
##  [9] "Chihuahua"                 "Tampico"                  
## [11] "Veracruz"                  "Acapulco"                 
## [13] "Aguascalientes"            "Morelia"                  
## [15] "Toluca"                    "Saltillo"                 
## [17] "Villahermosa"              "Tuxtla Guutiérrez"        
## [19] "Cd. Juárez"                "Tijuana"                  
## [21] "Culiacán"                  "Hermosillo"               
## [23] "Durango"                   "Tepic"                    
## [25] "Campeche"                  "Cuernavaca"               
## [27] "Oaxaca"                    "Zacatecas"                
## [29] "Colima"                    "Querétaro"                
## [31] "Tlaxcala"                  "La Paz"                   
## [33] "Cancún"                    "Pachuca"                  
## [35] "Mexicali"                  "Reynosa"                  
## [37] "Complemento urbano-Rural"  "Complemento urbano- Rural"
## [39] "Complemento urbano- Rural" "Complemento urbano- Rural"
## [41] "Complemento urbano-Rural"  "Complemento urbano- Rural"
## 
## $ent
##  [1] "Aguascalientes"                  "Baja California"                
##  [3] "Baja California Sur"             "Campeche"                       
##  [5] "Coahuila de Zaragoza"            "Colima"                         
##  [7] "Chiapas"                         "Chihuahua"                      
##  [9] "Distrito Federal"                "Durango"                        
## [11] "Guanajuato"                      "Guerrero"                       
## [13] "Hidalgo"                         "Jalisco"                        
## [15] "México"                          "Michoacán de Ocampo"            
## [17] "Morelos"                         "Nayarit"                        
## [19] "Nuevo León"                      "Oaxaca"                         
## [21] "Puebla"                          "Querétaro"                      
## [23] "Quintana Roo"                    "San Luis Potosí"                
## [25] "Sinaloa"                         "Sonora"                         
## [27] "Tabasco"                         "Tamaulipas"                     
## [29] "Tlaxcala"                        "Veracruz de Ignacio de la Llave"
## [31] "Yucatán"                         "Zacatecas"                      
## 
## $con
## NULL
print(get_labels(SDEMT319$clase2)) #
## [1] "No aplica"            "Población ocupada"    "Población desocupada"
## [4] "Disponibles"          "No disponibles"

Selección de casos y de variables

Poco a poco vamos comprendiendo más la lógica de R. Hay varias “formas” de programar. Por lo que no te asustes si varios códigos llegan al mismo resultado

Para revisar el contenido de un data frame podemos usar, como lo hicimos anteriormente, el formato basededatos$var o usar corchete, checa como estas cuatro formas tan el mismo resultado.

x<-SDEMT319$t_loc
x<-SDEMT319[["t_loc"]]  # ¡Ojo con las comillas! 
x<-SDEMT319[,10]
x<-SDEMT319[,"t_loc"]

Ahora, con el formato de dplyr podemos llegar a lo mismo

x<-SDEMT319 %>% 
  select(t_loc)

Selección “inversa”

O sea no “botar algo”, es con el negativo. No funciona con todos los formatos

x<-SDEMT319 %>% 
  select(-t_loc)
x<-SDEMT319[,-10]

rm(x) #rm sólo bota objetos

Pero con los otros formatos podemos “asignar” valores adentro de un data.frame, y uno de eso valores puede ser “la nada”"

SDEMT319$t_loc2<-SDEMT319$t_loc
SDEMT319$t_loc2<-NULL

De aquí viene esa cuesta en el aprendizaje; tenemos que comprender en qué forma programó el que hizo la librería e incluso a veces cómo aprendió quién te está enseñando o el foro que estás leyendo.

Subsetting

Rara vez utilizamos una base de datos completa, y rara vez queremos hacer operaciones completas con ellas.

Vamos a pedir cosas más específicas y podemos seleccionar observaciones o filas. Como nuestra base de datos es muy grande, guardaremos el filtro o selección en un objeto.

subset1<-SDEMT319[SDEMT319$t_loc==4,]

También podemos seleccionar columnas

subset2<- SDEMT319[, c("n_ent", "n_ren", "ing_x_hrs")]

podemos combinar los dos tipos de selección

subset3<- SDEMT319[(SDEMT319$t_loc==4 & SDEMT319$sex==1 ), c("n_ent", "n_ren", "ing_x_hrs")]

Con dplyr, podemos usar “filter” y “select”

subset4<-SDEMT319 %>% 
  filter(t_loc==4 , sex==1) %>%
    select(n_ent, n_ren, ing_x_hrs)

Descriptivos para variables cuantitativas

Vamos a empezar a revisar los gráficos para variables cuantitativas.

Medidas numéricas básicas

5 números

summary(SDEMT319$ing_x_hrs)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    0.00    0.00    0.00   12.46   18.09 4375.00

Con pipes se pueden crear “indicadores” de nuestras variables es un tibble

SDEMT319 %>% 
  summarise(nombre_indicador=mean(ing_x_hrs))
## # A tibble: 1 x 1
##   nombre_indicador
##              <dbl>
## 1             12.5

Histograma básico

hist(SDEMT319$ing_x_hrs)

A veces, para asegurarnos que tenemos los casos, nuestro análisis lo hacemos filtrando a quiénes reportaron estar ocupados, para no cargar con los ingresos cero.

hist(SDEMT319[SDEMT319$clase2==1,]$ing_x_hrs)

Podemos modificarlo de a poco a poco. Modificar el título

hist(SDEMT319[SDEMT319$clase2==1,]$ing_x_hrs, main="Histograma de Ingresos por trabajo") 

Le podemos modificar el título del eje de las x y de las y

hist(SDEMT319[SDEMT319$clase2==1,]$ing_x_hrs, 
     main="Histograma de Ingresos por trabajo", 
     xlab="ing_x_hrs", ylab="Frecuencia") 

¡A ponerle colorcitos! Aquí hay una lista http://www.stat.columbia.edu/~tzheng/files/Rcolor.pdf

hist(SDEMT319[SDEMT319$clase2==1,]$ing_x_hrs, 
     main="Histograma de Ingresos por trabajo",
     xlab="Pesos por hora", 
     ylab="Frecuencia", col="deeppink1") 

con pipes

SDEMT319 %>% 
  filter(SDEMT319$clase2==1) %>% 
    with(hist(ing_x_hrs))

SDEMT319 %>% 
  filter(SDEMT319$clase2==1) %>% 
    with(hist(ing_x_hrs))

Cuando usamos pipes, se debe de recordar que no es necesario escribir el nombre del data.frame porque es lo primero que colocamos en uestro “pipe”.

Checa que cualquier aditamiento debe ir en el pipe donde está el comando de hist(). Ten cuidado con los paréntesis.

SDEMT319 %>% 
  filter(SDEMT319$clase2==1) %>% 
    with(hist(ing_x_hrs, main= "histograma"))

Transformando

hist(log(SDEMT319[SDEMT319$clase2==1,]$ing_x_hrs)) #ojo con los paréntesis

SDEMT319 %>% 
  filter(SDEMT319$clase2==1) %>% 
    with(hist(log(ing_x_hrs), main= "histograma"))

¿Qué pasa con el logaritmo?

table(is.infinite(SDEMT319$ing_x_hrs))
## 
##  FALSE 
## 405449
SDEMT319$log_ing_x_hrs<-log(SDEMT319$ing_x_hrs)
table(is.infinite(SDEMT319$log_ing_x_hrs))
## 
##  FALSE   TRUE 
## 121850 283599

Hay varias funciones interesantes para revisar nuestros datos. Busca en la ayuda is.na() is.nan() is.infinite() complete.cases() na.omit()

Iremos utilizándolas a lo largo del curso

ggplot2 <3

Hoy vamos a presentar a un gran paquete ¡Es de los famosos! Y tiene más de diez años. https://qz.com/1007328/all-hail-ggplot2-the-code-powering-all-those-excellent-charts-is-10-years-old/

Hay dos funciones en paquete ggplot2

qplot() – para “quick plots”, gráficos rápidos. ggplot() – Para controlar de manera “granular” todo lo de nuestros gráficos.

library(ggplot2) #esta librería se instaló junto con tidyverse

Nota: La pongo acá pero ya está arriba porque llamamos a todo el tidyverse.

ggplot2 que trabaja sólo con objetos de tipo dataframe. No funciona con matrices ni con objetos tipo table(como sí lo hace plot, barplot y demás de la base). Lo cual muchas veces implica realizar un paso más.

La idea de ggplot es crear primero el lienzo con el argumento “aes” y la variable o variables que vamos a graficar

ggplot(SDEMT319[SDEMT319$clase2==1,], aes(x=ing_x_hrs))

Gráficos univariados

Podemos hacer histogramas y gráficos de densidad, de manera fácil. La idea es agregar en nuestro “lienzo” una geometría, un valor para dibujar en él. Esto se agrega con un “+” y con la figura que se añadirá a nuestro gráfico.

ggplot(SDEMT319[SDEMT319$clase2==1,], aes(x=ing_x_hrs)) + geom_histogram()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Si queremos usar los “pipes”, debemos crear el filtro de la base

SDEMT319 %>% 
  filter(SDEMT319$clase2==1) %>% 
    ggplot(aes(x=ing_x_hrs)) +
       geom_histogram()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Como se puede observar, la lógica de las dos sintaxis de programación son consistentes. Elige tu favorita.

¡Tip!. Puedes guardar el lienzo. Esto puede ayudarte a después ir sumando las geometríasy demás opciones que iremos aprendiendo.

lienzo<-SDEMT319 %>% 
  filter(SDEMT319$clase2==1) %>% 
    ggplot(aes(x=ing_x_hrs)) 

lienzo

lienzo + geom_histogram()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Podemos ir añadiendo más opciones

lienzo + geom_histogram(color="black", fill="white")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

lienzo + geom_histogram(binwidth=50)

lienzo + geom_histogram(bins=20)

Theme Assist Addin

Existe un add-in - es decir un complemento - para que podamos modificar más fácilmente los gráficos que hacemos con ggplot. Lo tenemos que instalar. Así como hemos instalado nuestros otras paqueterías.

#install.packages("ggThemeAssist",  dependencies = TRUE)
library(ggThemeAssist)

Para utilizarlo, tenemos que nombrar el objeto que queremos editar (por eso aprendimos a guardarlo en un objeto anteriormente). Lo escribimos. Lo seleccionamos y buscamos el complemento en la pestaña “Addins”

image

Guardar un gráfico

La función es “ggsave”. Revisemos la ayuda de este comando.

grafico<-lienzo + geom_histogram(bins=20)

ggsave("grafico.png", grafico, dpi = 300)
## Saving 7 x 5 in image

Ejercicio

  1. La función “geom_density” funciona exactamente igual que “geom_histogram”, sólo que dibuja una función de densidad(que se aproxima a la frecuencia relativa). Grafica el logaritmo de los ingresos con esta geometría.
  2. Modifica ese gráfico con ggThemeAssist y colocale un título

Envía el código. Comenta brevemente los resultados del gráfico https://www.dropbox.com/request/4cz2UDhAdf13UeG97ezW