Vamos a importar de nuevo de la ECOVID-ML, una nueva fuente desarrollada por INEGI. https://www.inegi.org.mx/investigacion/ecovidml/2020/
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
if (!require("pacman")) install.packages("pacman") # instala pacman si se requiere
## Loading required package: pacman
pacman::p_load(tidyverse, haven, sjlabelled, foreign, janitor) #carga los paquetes necesarios para esta práctica
Por si no tuviéramos cargada la base de datos, la volveremos a cargar
ecovid0420 <- read_dta("./datos/ecovid0420.dta")
O sea no “botar algo”, es con el negativo. No funciona con todos los formatos
x<-ecovid0420 %>%
select(-pb3)
x<-ecovid0420[,-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”"
ecovid0420$pb3_2<-ecovid0420$pb3
ecovid0420$pb3_2<-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<-ecovid0420[ecovid0420$pb3>4,]
También podemos seleccionar columnas
subset2<- ecovid0420[, c("pb1", "pb2", "pb3")]
podemos combinar los dos tipos de selección
subset3<- ecovid0420[(ecovid0420$pb3>4 & ecovid0420$pb1==1 ), c("pb1", "pb2", "pb3")]
Con dplyr, podemos usar “filter” y “select”
subset4<-ecovid0420 %>%
filter(pb3>4 & pb1==1) %>%
select(pb1, pb2, pb3)
La variable nominal “pb1”, se captura con “1” para hombres y con un “2” para mujeres en la base de datos. Podemos establecer una operación de igual y además sumar los casos que cumplan con esta condición:
ecovid0420 %>% count(pb1==2) # cuentan los casos que cumplen con la condición "pb1==2"
## # A tibble: 2 x 2
## `pb1 == 2` n
## <lgl> <int>
## 1 FALSE 2393
## 2 TRUE 3200
Esto es a lo que nos referimos con contar frecuencias. Podemos contar casos que cumplan con una operación de igualdad.
ecovid0420 %>% with(table(pb1))
## pb1
## 1 2
## 2393 3200
Con “tabyl()”" de “janitor”"
ecovid0420 %>% mutate(pb1=as_label(pb1)) %>% tabyl(pb1)
## pb1 n percent
## Hombre 2393 0.4278562
## Mujer 3200 0.5721438
Para ver que esto es una distribución de frecuencias sería muy útil ver la proporción total, ello se realiza agregando un elemento más en nuestro código con una “tubería”:
ecovid0420 %>% mutate(pb1=as_label(pb1)) %>% tabyl(pb1) %>% adorn_totals()
## pb1 n percent
## Hombre 2393 0.4278562
## Mujer 3200 0.5721438
## Total 5593 1.0000000
Hoy revisamos algunos tipos de variables
class(ecovid0420$pb1) # variable sin etiqueta
## [1] "haven_labelled" "vctrs_vctr" "double"
class(as_label(ecovid0420$pb1)) # variable con etiqueta
## [1] "factor"
class(as_label(ecovid0420$pb3)) # variable ordinal
## [1] "factor"
class(as_label(ecovid0420$pe10_1)) # variable de intervalo/razón
## [1] "numeric"
En general, tendremos variables de factor que podrían ser consideradas como cualitativas y numéricas. Aunque en realidad, R tiene muchas formas de almacenamiento. Como mostramos con el comando “glimpse()” en capítulo anterior, podemos revisar una variable en específico:
glimpse(ecovid0420$pb1)
## dbl+lbl [1:5593] 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ...
## @ label : chr "Sexo"
## @ format.stata: chr "%10.0g"
## @ labels : Named num [1:2] 1 2
## ..- attr(*, "names")= chr [1:2] "Hombre" "Mujer"
ecovid0420 %>% mutate(pb1=as_label(pb1)) %>% # cambia los valores de la variable a sus etiquetas
tabyl(pb1) %>% # para hacer la tabla
adorn_totals() %>% # añade totales
adorn_pct_formatting() # nos da porcentaje en lugar de proporción
## pb1 n percent
## Hombre 2393 42.8%
## Mujer 3200 57.2%
## Total 5593 100.0%
La tubería o “pipe” %>% nos permite ir agregando elementos de manera sencilla nuestros comandos. En este caso decimos que dentro del objeto haga el cambio, luego la tabla, que le ponga porcentajes y finalmente que nos dé los totales. El total del 100% no aparece, por un elemento propio del programa.
Son variables que dan cuenta de cualidades o condiciones a través de categorías que guardan un orden entre sí.
Vamos a darle una “ojeada” a esta variable
glimpse(ecovid0420$pb3)
## dbl+lbl [1:5593] 3, 2, 2, 4, 3, 2, 3, 3, 2, 8, 2, 3, 1, 2, 2, 3, 8, 3, 0, ...
## @ label : chr "escolaridad"
## @ format.stata: chr "%33.0g"
## @ labels : Named num [1:10] 0 1 2 3 4 5 6 7 8 9
## ..- attr(*, "names")= chr [1:10] "Ninguno" "Preescolar" "Primaria" "Secundaria" ...
Hoy hacemos la tabla, con las etiquetas:
ecovid0420 %>% mutate(pb3=as_label(pb3)) %>%
tabyl(pb3)
## pb3 n percent
## Ninguno 153 0.027355623
## Preescolar 34 0.006079027
## Primaria 1173 0.209726444
## Secundaria 1526 0.272841051
## Preparatoria o bachillerato 1272 0.227427141
## Técnicos con primaria/secundaria 165 0.029501162
## Estudios técnicos con prepa 76 0.013588414
## Normal con secundaria 29 0.005185053
## Licenciatura o normal 1037 0.185410334
## Posgrado 128 0.022885750
Para que no nos salgan las categorías sin datos podemos poner una opción dentro del comando “tabyl()”
ecovid0420 %>%
mutate(pb3=as_label(pb3)) %>%
tabyl(pb3, show_missing_levels=F ) %>% # esta opción elimina los valores con 0
adorn_totals()
## pb3 n percent
## Ninguno 153 0.027355623
## Preescolar 34 0.006079027
## Primaria 1173 0.209726444
## Secundaria 1526 0.272841051
## Preparatoria o bachillerato 1272 0.227427141
## Técnicos con primaria/secundaria 165 0.029501162
## Estudios técnicos con prepa 76 0.013588414
## Normal con secundaria 29 0.005185053
## Licenciatura o normal 1037 0.185410334
## Posgrado 128 0.022885750
## Total 5593 1.000000000
Las tablas de doble entrada tiene su nombre porque en las columnas entran los valores de una variable categórica, y en las filas de una segunda. Basicamente es como hacer un conteo de todas las combinaciones posibles entre los valores de una variable con la otra.
Por ejemplo, si quisiéramos combinar las dos variables que ya estudiamos lo podemos hacer, con una tabla de doble entrada:
ecovid0420 %>%
mutate(pb3=as_label(pb3)) %>% # para que las lea como factor
mutate(pb1=as_label(pb1)) %>% # para que las lea como factor
tabyl(pb3, pb1, show_missing_levels=F ) %>% # incluimos aquí
adorn_totals()
## pb3 Hombre Mujer
## Ninguno 58 95
## Preescolar 16 18
## Primaria 465 708
## Secundaria 592 934
## Preparatoria o bachillerato 600 672
## Técnicos con primaria/secundaria 41 124
## Estudios técnicos con prepa 27 49
## Normal con secundaria 13 16
## Licenciatura o normal 510 527
## Posgrado 71 57
## Total 2393 3200
Observamos que en cada celda confluyen los casos que comparten las mismas características:
ecovid0420 %>%
count(pb3==1 & pb1==1) # nos da la segunda celda de la izquierda
## # A tibble: 2 x 2
## `pb3 == 1 & pb1 == 1` n
## <lgl> <int>
## 1 FALSE 5577
## 2 TRUE 16
De esta manera se colocan todos los datos. Si observa al poner la función “adorn_totals()” lo agregó como una nueva fila de totales, pero también podemos pedirle que agregue una columna de totales.
ecovid0420 %>%
mutate(pb3=as_label(pb3)) %>% # para que las lea como factor
mutate(pb1=as_label(pb1)) %>% # para que las lea como factor
tabyl(pb3, pb1, show_missing_levels=F ) %>% # incluimos aquí pb1o
adorn_totals("col")
## pb3 Hombre Mujer Total
## Ninguno 58 95 153
## Preescolar 16 18 34
## Primaria 465 708 1173
## Secundaria 592 934 1526
## Preparatoria o bachillerato 600 672 1272
## Técnicos con primaria/secundaria 41 124 165
## Estudios técnicos con prepa 27 49 76
## Normal con secundaria 13 16 29
## Licenciatura o normal 510 527 1037
## Posgrado 71 57 128
O bien agregar los dos, introduciendo en el argumento “c(”col“,”row“)” un vector de caracteres de las dos opciones requeridas:
ecovid0420 %>%
mutate(pb3=as_label(pb3)) %>% # para que las lea como factor
mutate(pb1=as_label(pb1)) %>% # para que las lea como factor
tabyl(pb3, pb1, show_missing_levels=F ) %>% # incluimos aquí pb1o
adorn_totals(c("col", "row"))
## pb3 Hombre Mujer Total
## Ninguno 58 95 153
## Preescolar 16 18 34
## Primaria 465 708 1173
## Secundaria 592 934 1526
## Preparatoria o bachillerato 600 672 1272
## Técnicos con primaria/secundaria 41 124 165
## Estudios técnicos con prepa 27 49 76
## Normal con secundaria 13 16 29
## Licenciatura o normal 510 527 1037
## Posgrado 71 57 128
## Total 2393 3200 5593
Del mismo modo, podemos calcular los porcentajes. Pero los podemos calcular de tres formas. Uno es que lo calculemos para los totales calculados para las filas, para las columnas o para el gran total poblacional.
Para columnas tenemos el siguiente código y los siguientes resultados:
ecovid0420 %>%
mutate(pb3=as_label(pb3)) %>% # para que las lea como factor
mutate(pb1=as_label(pb1)) %>% # para que las lea como factor
tabyl(pb3, pb1, show_missing_levels=F ) %>% # incluimos aquí sexo
adorn_totals(c("col", "row")) %>%
adorn_percentages("col") %>% # Divide los valores entre el total de la columna
adorn_pct_formatting() # lo vuelve porcentaje
## pb3 Hombre Mujer Total
## Ninguno 2.4% 3.0% 2.7%
## Preescolar 0.7% 0.6% 0.6%
## Primaria 19.4% 22.1% 21.0%
## Secundaria 24.7% 29.2% 27.3%
## Preparatoria o bachillerato 25.1% 21.0% 22.7%
## Técnicos con primaria/secundaria 1.7% 3.9% 3.0%
## Estudios técnicos con prepa 1.1% 1.5% 1.4%
## Normal con secundaria 0.5% 0.5% 0.5%
## Licenciatura o normal 21.3% 16.5% 18.5%
## Posgrado 3.0% 1.8% 2.3%
## Total 100.0% 100.0% 100.0%
Cuando se hagan cuadros de distribuciones (que todas sus partes suman 100), los porcentajes pueden ser una gran ayuda para la interpretación, sobre todos cuando se comparar poblaciones de categorías de diferente tamaño. Por lo general, queremos que los cuadros nos den información de donde están los totales y su 100%, de esta manera el lector se puede guiar de porcentaje con respecto a qué está leyendo. En este caso, vemos que el 100% es común en la última fila.
Veamos la diferencia de cómo podemos leer la misma celda, pero hoy, hemos calculado los porcentajes a nivel de fila:
ecovid0420 %>%
mutate(pb3=as_label(pb3)) %>% # para que las lea como factor
mutate(pb1=as_label(pb1)) %>% # para que las lea como factor
tabyl(pb3, pb1, show_missing_levels=F ) %>%
adorn_totals(c("col", "row")) %>%
adorn_percentages("row") %>% # Divide los valores entre el total de la fila
adorn_pct_formatting() # lo vuelve porcentaje
## pb3 Hombre Mujer Total
## Ninguno 37.9% 62.1% 100.0%
## Preescolar 47.1% 52.9% 100.0%
## Primaria 39.6% 60.4% 100.0%
## Secundaria 38.8% 61.2% 100.0%
## Preparatoria o bachillerato 47.2% 52.8% 100.0%
## Técnicos con primaria/secundaria 24.8% 75.2% 100.0%
## Estudios técnicos con prepa 35.5% 64.5% 100.0%
## Normal con secundaria 44.8% 55.2% 100.0%
## Licenciatura o normal 49.2% 50.8% 100.0%
## Posgrado 55.5% 44.5% 100.0%
## Total 42.8% 57.2% 100.0%
Finalmente, podemos calcular los porcentajes con referencia a la población total en análisis. Es decir la celda en la esquina inferior derecha de nuestra tabla original.
ecovid0420 %>%
mutate(pb3=as_label(pb3)) %>% # para que las lea como factor
mutate(pb1=as_label(pb1)) %>% # para que las lea como factor
tabyl(pb3, pb1, show_missing_levels=F ) %>% # incluimos aquí pb1o
adorn_totals(c("col", "row")) %>%
adorn_percentages("all") %>% # Divide los valores entre el total de la población
adorn_pct_formatting() # lo vuelve porcentaje
## pb3 Hombre Mujer Total
## Ninguno 1.0% 1.7% 2.7%
## Preescolar 0.3% 0.3% 0.6%
## Primaria 8.3% 12.7% 21.0%
## Secundaria 10.6% 16.7% 27.3%
## Preparatoria o bachillerato 10.7% 12.0% 22.7%
## Técnicos con primaria/secundaria 0.7% 2.2% 3.0%
## Estudios técnicos con prepa 0.5% 0.9% 1.4%
## Normal con secundaria 0.2% 0.3% 0.5%
## Licenciatura o normal 9.1% 9.4% 18.5%
## Posgrado 1.3% 1.0% 2.3%
## Total 42.8% 57.2% 100.0%
Vamos a empezar a revisar los gráficos para variables cuantitativas.
5 números
summary(ecovid0420$pe10_1) ## horas trabajadas
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## 1.00 16.00 35.00 32.65 48.00 99.00 3131
Con pipes se pueden crear “indicadores” de nuestras variables es un tibble
ecovid0420 %>%
summarise(nombre_indicador=mean(pe10_1))
## # A tibble: 1 x 1
## nombre_indicador
## <dbl>
## 1 NA
hist(ecovid0420$pe10_1)
A veces, para asegurarnos que tenemos los casos, nuestro análisis lo hacemos filtrando a quiénes reportaron estar ocupados y ese 99 parece ser una codificación de quienes no respondieron.
hist(ecovid0420[ecovid0420$clase2==1 & ecovid0420$pe10_1<99,]$pe10_1)
Podemos modificarlo de a poco a poco. Modificar el título
hist(ecovid0420[ecovid0420$clase2==1 & ecovid0420$pe10_1<99,]$pe10_1, main="Histograma de horas trabajadas")
Le podemos modificar el título del eje de las x y de las y
hist(ecovid0420[ecovid0420$clase2==1,]$pe10_1,
main="Histograma de horas trabajadas",
xlab="Hrs", ylab="Frecuencia")
¡A ponerle colorcitos! Aquí hay una lista http://www.stat.columbia.edu/~tzheng/files/Rcolor.pdf
hist(ecovid0420[ecovid0420$clase2==1 & ecovid0420$pe10_1<99,]$pe10_1,
main="Histograma de horas trabajadas",
xlab="Horas",
ylab="Frecuencia", col="deeppink1")
ecovid0420 %>%
filter(clase2==1 & pe10_1<99) %>% # filtro
with(hist(pe10_1)) # con with, para que entienda
Cuando usamos pipes, se debe de recordar que no es necesario escribir el nombre del data.frame en el filtro porque es lo primero que colocamos en nuestro “pipe”.
Checa que cualquier aditamiento debe ir en el pipe donde está el comando de hist(). Ten cuidado con los paréntesis.
ecovid0420 %>%
filter(ecovid0420$clase2==1) %>%
with(hist(pe10_1, main= "histograma"))