Se presenta el código que escribimos en la sesión del 23 de octubre para analizar la base de datos de consumos culturales. Por si no pudieron seguir el ejercicio y para que quede registro.
Carga de datos
library(tidyverse)
## ── Attaching packages ────────────────────────────────────────────────────────────────────── tidyverse 1.2.1 ──
## ✔ ggplot2 3.0.0 ✔ purrr 0.2.5
## ✔ tibble 1.4.2 ✔ dplyr 0.7.6
## ✔ tidyr 0.8.1 ✔ stringr 1.3.1
## ✔ readr 1.1.1 ✔ forcats 0.3.0
## ── Conflicts ───────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
library(readr)
consumos <- read_csv("https://raw.githubusercontent.com/martinpaladino/consumos_culturales/master/datos/base_consumos_culturales.csv") %>%
rename(escolaridad_padre = P22_1, escolaridad_madre = P22_2)
## Parsed with column specification:
## cols(
## .default = col_character(),
## Edad = col_integer()
## )
## See spec(...) for full column specifications.
Primera aproximación
Realizamos una tabla con las variables tal como vienen codificadas en las base de datos.
consumos %>%
filter(Ciudad == "Mexico") %>%
select(escolaridad_padre, escolaridad_madre) %>%
table()
## escolaridad_madre
## escolaridad_padre Bachillerato Incompleto
## Bachillerato Incompleto 22
## Bachillerato Técnico Completo 1
## Bachillerato Técnico Incompleto 2
## Diplomado / Maestria 0
## Doctorado 0
## No Contesto 4
## Preparatoria Completa 13
## Primaria Completa 0
## Primaria Incompleta 2
## Secundaria Incompleta 0
## Secundria Completa 5
## Universidad Completa 15
## Universidad Incompleta 5
## escolaridad_madre
## escolaridad_padre Bachillerato Técnico Completo
## Bachillerato Incompleto 3
## Bachillerato Técnico Completo 23
## Bachillerato Técnico Incompleto 9
## Diplomado / Maestria 1
## Doctorado 0
## No Contesto 1
## Preparatoria Completa 8
## Primaria Completa 0
## Primaria Incompleta 0
## Secundaria Incompleta 4
## Secundria Completa 7
## Universidad Completa 8
## Universidad Incompleta 3
## escolaridad_madre
## escolaridad_padre Bachillerato Técnico Incompleto
## Bachillerato Incompleto 4
## Bachillerato Técnico Completo 5
## Bachillerato Técnico Incompleto 12
## Diplomado / Maestria 1
## Doctorado 0
## No Contesto 4
## Preparatoria Completa 9
## Primaria Completa 0
## Primaria Incompleta 0
## Secundaria Incompleta 2
## Secundria Completa 3
## Universidad Completa 2
## Universidad Incompleta 3
## escolaridad_madre
## escolaridad_padre Diplomado / Maestria Doctorado
## Bachillerato Incompleto 0 0
## Bachillerato Técnico Completo 0 0
## Bachillerato Técnico Incompleto 0 0
## Diplomado / Maestria 7 0
## Doctorado 4 2
## No Contesto 8 0
## Preparatoria Completa 0 0
## Primaria Completa 0 0
## Primaria Incompleta 0 0
## Secundaria Incompleta 0 0
## Secundria Completa 0 0
## Universidad Completa 2 2
## Universidad Incompleta 0 0
## escolaridad_madre
## escolaridad_padre No Contesto Preparatoria Completa
## Bachillerato Incompleto 3 7
## Bachillerato Técnico Completo 2 6
## Bachillerato Técnico Incompleto 0 3
## Diplomado / Maestria 0 2
## Doctorado 0 5
## No Contesto 31 3
## Preparatoria Completa 5 96
## Primaria Completa 2 3
## Primaria Incompleta 2 1
## Secundaria Incompleta 0 2
## Secundria Completa 5 15
## Universidad Completa 3 33
## Universidad Incompleta 1 22
## escolaridad_madre
## escolaridad_padre Primaria Completa Primaria Incompleta
## Bachillerato Incompleto 3 0
## Bachillerato Técnico Completo 4 5
## Bachillerato Técnico Incompleto 0 4
## Diplomado / Maestria 0 0
## Doctorado 0 0
## No Contesto 9 1
## Preparatoria Completa 5 4
## Primaria Completa 27 0
## Primaria Incompleta 5 23
## Secundaria Incompleta 3 4
## Secundria Completa 17 8
## Universidad Completa 0 1
## Universidad Incompleta 0 1
## escolaridad_madre
## escolaridad_padre Secundaria Incompleta Secundria Completa
## Bachillerato Incompleto 1 13
## Bachillerato Técnico Completo 6 17
## Bachillerato Técnico Incompleto 4 4
## Diplomado / Maestria 1 0
## Doctorado 0 0
## No Contesto 5 7
## Preparatoria Completa 3 35
## Primaria Completa 3 13
## Primaria Incompleta 1 12
## Secundaria Incompleta 28 5
## Secundria Completa 7 129
## Universidad Completa 2 16
## Universidad Incompleta 1 6
## escolaridad_madre
## escolaridad_padre Universidad Completa
## Bachillerato Incompleto 1
## Bachillerato Técnico Completo 0
## Bachillerato Técnico Incompleto 0
## Diplomado / Maestria 8
## Doctorado 2
## No Contesto 4
## Preparatoria Completa 9
## Primaria Completa 0
## Primaria Incompleta 0
## Secundaria Incompleta 0
## Secundria Completa 0
## Universidad Completa 113
## Universidad Incompleta 8
## escolaridad_madre
## escolaridad_padre Universidad Incompleta
## Bachillerato Incompleto 0
## Bachillerato Técnico Completo 1
## Bachillerato Técnico Incompleto 0
## Diplomado / Maestria 1
## Doctorado 2
## No Contesto 2
## Preparatoria Completa 4
## Primaria Completa 0
## Primaria Incompleta 0
## Secundaria Incompleta 0
## Secundria Completa 0
## Universidad Completa 8
## Universidad Incompleta 18
Problemas:
- La tabla es prácticamente ilegible dado su tamaño.
- Hay demasiadas categorías.
- Muchos de los conteos cruzados están en 0. Esto reduce la fiabilidad de la prueba \(\chi^2\).
- Hay categorías con poca frecuencia.
Solución:
Reducir la dimensionalidad de las tablas compactando categorías. La idea es pasar de 13 categorías de escolaridad a 3. Se utilizan las categorías de escolaridad de la SEP: básica, media superior y superior.
consumos %>%
filter(Ciudad == "Mexico") %>%
select(escolaridad_padre, escolaridad_madre) %>%
mutate(escolaridad_madre = recode (escolaridad_madre,
"Bachillerato Incompleto" = "Media Superior",
"Bachillerato Técnico Completo" = "Media Superior",
"Bachillerato Técnico Incompleto"= "Media Superior",
"Diplomado / Maestria" = "Superior",
"Doctorado" = "Superior",
"No Contesto" = "No Contesto",
"Preparatoria Completa" = "Media Superior",
"Primaria Completa" = "Básica",
"Primaria Incompleta" = "Básica",
"Secundaria Incompleta" = "Básica",
"Secundria Completa" = "Básica",
"Universidad Completa" = "Superior",
"Universidad Incompleta" = "Superior")) %>%
mutate(escolaridad_padre = recode(escolaridad_padre,
"Bachillerato Incompleto" = "Media Superior",
"Bachillerato Técnico Completo" = "Media Superior",
"Bachillerato Técnico Incompleto"= "Media Superior",
"Diplomado / Maestria" = "Superior",
"Doctorado" = "Superior",
"No Contesto" = "No Contesto",
"Preparatoria Completa" = "Media Superior",
"Primaria Completa" = "Básica",
"Primaria Incompleta" = "Básica",
"Secundaria Incompleta" = "Básica",
"Secundria Completa" = "Básica",
"Universidad Completa" = "Superior",
"Universidad Incompleta" = "Superior")) %>%
filter(escolaridad_padre != "No Contesto") %>%
filter(escolaridad_madre != "No Contesto") %>%
table()
## escolaridad_madre
## escolaridad_padre Básica Media Superior Superior
## Básica 285 44 0
## Media Superior 108 223 15
## Superior 28 100 177
consumos %>%
filter(Ciudad == "Mexico") %>%
select(escolaridad_padre, escolaridad_madre) %>%
mutate(escolaridad_madre = recode (escolaridad_madre,
"Bachillerato Incompleto" = "Media Superior",
"Bachillerato Técnico Completo" = "Media Superior",
"Bachillerato Técnico Incompleto"= "Media Superior",
"Diplomado / Maestria" = "Superior",
"Doctorado" = "Superior",
"No Contesto" = "No Contesto",
"Preparatoria Completa" = "Media Superior",
"Primaria Completa" = "Básica",
"Primaria Incompleta" = "Básica",
"Secundaria Incompleta" = "Básica",
"Secundria Completa" = "Básica",
"Universidad Completa" = "Superior",
"Universidad Incompleta" = "Superior")) %>%
mutate(escolaridad_padre = recode(escolaridad_padre,
"Bachillerato Incompleto" = "Media Superior",
"Bachillerato Técnico Completo" = "Media Superior",
"Bachillerato Técnico Incompleto"= "Media Superior",
"Diplomado / Maestria" = "Superior",
"Doctorado" = "Superior",
"No Contesto" = "No Contesto",
"Preparatoria Completa" = "Media Superior",
"Primaria Completa" = "Básica",
"Primaria Incompleta" = "Básica",
"Secundaria Incompleta" = "Básica",
"Secundria Completa" = "Básica",
"Universidad Completa" = "Superior",
"Universidad Incompleta" = "Superior")) %>%
filter(escolaridad_padre != "No Contesto") %>%
filter(escolaridad_madre != "No Contesto") %>%
table() %>%
chisq.test()
##
## Pearson's Chi-squared test
##
## data: .
## X-squared = 693.81, df = 4, p-value < 2.2e-16
Solución avanzada
Como vamos a tener que usar esta recodificación de los datos varias veces vamos a envolver el código que lleva a cabo la recodificación en un función. En lugar de copiar y pegar el código para la recodificación cada vez o crear un objeto con los datos recodificados creamos una función que llamamos en un línea y hace el trabajo cada vez que es necesario.
De este modo no creamos objetos innecesarios en el entorno y nunca sobreescribimos nuestros datos.
# Definición de la función:
# input: un vector de cadenas de caracteres. Ver uso.
# output: un un vector de cadenas de caracteres con las recodificaciones especificadas. Regresa el vector original si no hay coincidencias. No produce un error en ese caso, user debe verificar los resultados.
# uso: dentro de cadenas de dplyr utilizar con mutate. No recibe como input un data.frame,
recodificar_escolaridad <- function(x)
{
dplyr::recode (x,
"Bachillerato Incompleto" = "Media Superior",
"Bachillerato Técnico Completo" = "Media Superior",
"Bachillerato Técnico Incompleto"= "Media Superior",
"Diplomado / Maestria" = "Superior",
"Doctorado" = "Superior",
"No Contesto" = "No Contesto",
"Preparatoria Completa" = "Media Superior",
"Primaria Completa" = "Básica",
"Primaria Incompleta" = "Básica",
"Secundaria Incompleta" = "Básica",
"Secundria Completa" = "Básica",
"Universidad Completa" = "Superior",
"Universidad Incompleta" = "Superior")
}
consumos %>%
filter(Ciudad == "Mexico") %>%
select(starts_with("escol")) %>%
mutate_all(recodificar_escolaridad) %>%
mutate_all(na_if, "No Contesto") %>% # Paso lo No Contesto a NA, desaparecen de la tabla.
table() -> tabla
prop.table(tabla, 2) #Proporciones de columna.
## escolaridad_madre
## escolaridad_padre Básica Media Superior Superior
## Básica 0.67695962 0.11989101 0.00000000
## Media Superior 0.25653207 0.60762943 0.07812500
## Superior 0.06650831 0.27247956 0.92187500
prop.table(tabla, 1) #Proporciones de fila.
## escolaridad_madre
## escolaridad_padre Básica Media Superior Superior
## Básica 0.86626140 0.13373860 0.00000000
## Media Superior 0.31213873 0.64450867 0.04335260
## Superior 0.09180328 0.32786885 0.58032787
consumos %>%
filter(Ciudad == "Mexico") %>%
select(starts_with("escol")) %>%
mutate_all(recodificar_escolaridad) %>%
mutate_all(na_if, "No Contesto") %>%
table() %>%
chisq.test()
##
## Pearson's Chi-squared test
##
## data: .
## X-squared = 693.81, df = 4, p-value < 2.2e-16