¡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
#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"
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)
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.
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)
Vamos a empezar a revisar los gráficos para variables cuantitativas.
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
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")
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"))
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
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))
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)
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
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
Envía el código. Comenta brevemente los resultados del gráfico https://www.dropbox.com/request/4cz2UDhAdf13UeG97ezW