Paquetería

if (!require("pacman")) install.packages("pacman")
## Loading required package: pacman
pacman::p_load("janitor", "writexl", "tidyverse", "moments", "wesanderson", "RColorBrewer")

Lectura de datos

setwd("C:/Users/molar/Dropbox/2022_Trabajos/FLACSO") #Directorio de trabajo

load("Datos/concentrado.RData") #Carga base de datos

Estadística descriptiva

Variables cualitativas

Para elaborar nuestra tabla de frecuencias, convertiremos la variable de sexo_jefe, a una variable de factor

concentrado <- concentrado %>% 
  mutate(sexo_factor=factor(concentrado$sexo_jefe, 
                            labels= c("Hombre", "Mujer")))

Hacemos la tabla de frecuencias

table(concentrado$sexo_factor)
## 
## Hombre  Mujer 
##  63230  25776
prop.table(table(concentrado$sexo_factor))
## 
##    Hombre     Mujer 
## 0.7104015 0.2895985

Con la función “tabyl”

concentrado %>% 
  tabyl(sexo_factor, show_missing_levels=F) 
##  sexo_factor     n   percent
##       Hombre 63230 0.7104015
##        Mujer 25776 0.2895985

Queremos agregar el total de casos

concentrado %>% 
  tabyl(sexo_factor, show_missing_levels=F) %>% 
  adorn_totals() 
##  sexo_factor     n   percent
##       Hombre 63230 0.7104015
##        Mujer 25776 0.2895985
##        Total 89006 1.0000000

Ahora, agregar los porcentajes

concentrado %>% 
  tabyl(sexo_factor, show_missing_levels=F) %>% 
  adorn_totals() %>% 
  adorn_pct_formatting() 
##  sexo_factor     n percent
##       Hombre 63230   71.0%
##        Mujer 25776   29.0%
##        Total 89006  100.0%

La guardamos en un objeto y exportamos a excel

tabla1 <- concentrado %>% 
  tabyl(sexo_factor, show_missing_levels=F) %>% 
  adorn_totals() %>% 
  adorn_pct_formatting() %>% 
  writexl::write_xlsx(path="tabla1.xlsx")

Ahora graficaremos los porcentajes que calculamos en la tabla.

En la parte de datos: incluiremos la variable que queremos graficar. En este caso: el sexo del jefe del hogar

concentrado %>% 
  ggplot(aes(x=sexo_jefe))

Ahora agregaremos la geometría

concentrado %>% 
  ggplot(aes(x=sexo_jefe)) +
  geom_bar()

Podemos voltear la geometría

concentrado %>% 
  ggplot(aes(x=sexo_jefe)) +
  geom_bar()+
  coord_flip()

Aunque, se ve mejor como estaba antes.

Para hacer nuestra gráfica de barras y que se vean las etiquetas con facilidad, convertiremos nuestra variable sexo_jefe en factor

concentrado <- concentrado %>% 
  mutate(sexo_factor = factor(concentrado$sexo_jefe, 
                              labels = c("Hombre", "Mujer")))

Ahora sí podemos ver las etiquetas en nuestro gráfico

concentrado %>% 
  ggplot(aes(x=sexo_factor)) +
  geom_bar()

Vamos a ponerle un color a hombre y otro a mujer y a quitar el fondo gris

concentrado %>% 
  ggplot(aes(x = sexo_factor, fill = sexo_factor)) +
  geom_bar() +
  scale_fill_manual(
    values = c(Hombre = "#440154",
               Mujer = "#3EB0F2")
  ) +
  theme_classic()

Pero, no queremos el conteo, sino los porcentajes

concentrado %>% 
  count(sexo_factor) %>% 
  mutate(pct = prop.table(n)) %>% 
  ggplot(aes(x = sexo_factor, y = pct, fill = sexo_factor, label = scales::percent(pct))) +
  geom_col(position = 'dodge') + 
  scale_y_continuous(labels = scales::percent) +
  scale_fill_manual(
    values = c(Hombre = "#440154",
               Mujer = "#3EB0F2")) +
  theme_classic()

Ahora, le agregamos las etiquetas de los datos

concentrado %>% 
  count(sexo_factor) %>% 
  mutate(pct = prop.table(n)) %>% 
  ggplot(aes(x = sexo_factor, y = pct, fill = sexo_factor, label = scales::percent(pct))) +
  geom_col(position = 'dodge') + 
  scale_y_continuous(labels = scales::percent) +
  scale_fill_manual(
    values = c(Hombre = "#440154",
               Mujer = "#3EB0F2")) +
  theme_classic()+
geom_text(position = position_dodge(width = .9),    
          vjust = -0.5,    
          size = 3,
          colour = "black")

Modificamos los títulos y ejes

concentrado %>% 
  count(sexo_factor) %>% 
  mutate(pct = prop.table(n)) %>% 
  ggplot(aes(x = sexo_factor, y = pct, fill = sexo_factor, label = scales::percent(pct))) +
  geom_col(position = 'dodge') + 
  scale_y_continuous(labels = scales::percent) +
  scale_fill_manual(
    values = c(Hombre = "#440154",
               Mujer = "#3EB0F2")) +
  theme_classic()+
  geom_text(position = position_dodge(width = .9),    
            vjust = -0.5,    
            size = 3,
            colour = "black") +
  labs(
    x = "Sexo del jefe del hogar",
    y = "Porcentaje",
    title = "Sexo de los jefes y jefas de hogar en México, 2020",
    caption = "Fuente: elaboración propia con base en ENIGH 2020",
    fill = "Sexo del jefe del hogar"
  )

Modificamos el estilo del título y la fuente

concentrado %>% 
  count(sexo_factor) %>% 
  mutate(pct = prop.table(n)) %>% 
  ggplot(aes(x = sexo_factor, y = pct, fill = sexo_factor, label = scales::percent(pct))) +
  geom_col(position = 'dodge') + 
  scale_y_continuous(labels = scales::percent) +
  scale_fill_manual(
    values = c(Hombre = "#440154",
               Mujer = "#3EB0F2")) +
  theme_classic()+
  geom_text(position = position_dodge(width = .9),    
            vjust = -0.5,    
            size = 3,
            colour = "black") +
  labs(
    x = "Sexo del jefe del hogar",
    y = "Porcentaje",
    title = "Sexo de los jefes y jefas de hogar en México, 2020",
    caption = "Fuente: elaboración propia con base en ENIGH 2020",
    fill = "Sexo del jefe del hogar"
  ) +
  theme(
    plot.title = element_text(color = "darkgreen", size = 14, face = "bold"),
    plot.caption = element_text(face = "italic")
  )

Hay un paquete que nos permite graficar de manera más amable: install.packages(“esquisse”)

Variables cuantitativas

concentrado$mujeres <- as.numeric(concentrado$mujeres)

descriptivos <- concentrado %>% 
summarise(media_mujeres=mean(mujeres, na.rm=T),
          var_mujeres=var(mujeres,na.rm=T),
          sd_mujeres=sd(mujeres, na.rm=T),
          rango_mujeres=diff(range(mujeres, na.rm=T)),
          simetria_mujeres=skewness(mujeres, na.rm=T), 
          curtosis_mujeres=kurtosis(mujeres, na.rm=T)) %>% 
  writexl::write_xlsx(path="resumen.xlsx")

Para las variables cuantitativas, las gráficas más utilizadas son los histogramas, gráficos de densidad.

Menos utilizados: de área y polígonos de frecuencias (ver https://r-graph-gallery.com/)

Bueno, en series de tiempo también se utilizan los gráficos de líneas.

Veamos primero los componentes de nuestra gramática. En los datos incluimos la variable que queremos y la base de datos que ocuparemos. En este caso es la edad del jefe del hogar.

concentrado %>% 
  ggplot(aes(x=edad_jefe))

Ahora agregaremos la geometría.

concentrado %>% 
  ggplot(aes(x=edad_jefe)) +
  geom_histogram()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Vemos que el software nos avisa cuántas clases/intervalos está utilizando. Podemos cambiarlas.

concentrado %>% 
  ggplot(aes(x=edad_jefe)) +
  geom_histogram(bins=12)

Una vez que tenemos nuestros datos y geometría, vamos a editar: primero le cambiamos el color y le quitamos el fondo gris

concentrado %>% 
  ggplot(aes(x=edad_jefe)) +
  geom_histogram(bins=12, color="#000000", fill="darkblue")+
  theme_classic()

Sobre los colores en R:Podemos agregar manualmente los colores, como lo hicimos anteriormente.

Sin embargo, existen paquetes que ya traen paletas cargadas y que se pueden utilizar dependiendo de los datos.

Una paleta es la de RColorBrewer: https://www.geeksforgeeks.org/introduction-to-color-palettes-in-r-with-rcolorbrewer/ Esta paleta de colores distingue si los datos son secuenciales, divergentes o cualitativos. Por ejemplo:

display.brewer.all(type="seq") #secuenciales

display.brewer.all(type="div") #divergentes

display.brewer.all(type="qual") #datos cualitativos

brewer.pal.info #Podemos enlistar todos los colores
##          maxcolors category colorblind
## BrBG            11      div       TRUE
## PiYG            11      div       TRUE
## PRGn            11      div       TRUE
## PuOr            11      div       TRUE
## RdBu            11      div       TRUE
## RdGy            11      div      FALSE
## RdYlBu          11      div       TRUE
## RdYlGn          11      div      FALSE
## Spectral        11      div      FALSE
## Accent           8     qual      FALSE
## Dark2            8     qual       TRUE
## Paired          12     qual       TRUE
## Pastel1          9     qual      FALSE
## Pastel2          8     qual      FALSE
## Set1             9     qual      FALSE
## Set2             8     qual       TRUE
## Set3            12     qual      FALSE
## Blues            9      seq       TRUE
## BuGn             9      seq       TRUE
## BuPu             9      seq       TRUE
## GnBu             9      seq       TRUE
## Greens           9      seq       TRUE
## Greys            9      seq       TRUE
## Oranges          9      seq       TRUE
## OrRd             9      seq       TRUE
## PuBu             9      seq       TRUE
## PuBuGn           9      seq       TRUE
## PuRd             9      seq       TRUE
## Purples          9      seq       TRUE
## RdPu             9      seq       TRUE
## Reds             9      seq       TRUE
## YlGn             9      seq       TRUE
## YlGnBu           9      seq       TRUE
## YlOrBr           9      seq       TRUE
## YlOrRd           9      seq       TRUE
display.brewer.all(colorblindFriendly=T) #La última columna nos dice si alguien con problemas para distinguir colores, los puede ver o no.

Otra paleta es la de Wesanderson, se inspira en sus peliculas: https://rforpoliticalscience.com/2020/07/26/make-wes-anderson-themed-graphs-with-wesanderson-package-in-r/ Debes escoger el nombre de la paleta y cuántos colores vas a usar.

wes_palette("Royal1")

wes_palette("GrandBudapest1")

wes_palette("Cavalcanti1")

wes_palette("Cavalcanti1", 3)

La lógica de estos paquetes es crear nuestra paleta de colores pensando en cuántos vamos a tener que utilizar. Entonces, haremos la nuestra.

pal <- wes_palette(12, name = "Royal1", type = "continuous")

Entonces, podemos volver a hacer nuestro gráfico escogiendo alguno de ellos.

concentrado %>% 
  ggplot(aes(x=edad_jefe)) +
  geom_histogram(bins=12, color="#000000", fill=pal)+
  theme_classic()

Podemos agregarle el valor mínimo, máximo y la media, pero para eso tenemos que hacer un pequeño dataframe

anotaciones <- data.frame(
  x = c(round(min(concentrado$edad_jefe), 2), round(mean(concentrado$edad_jefe), 2), round(max(concentrado$edad_jefe), 2)),
  y = c(2500, 17000, 2000),
  label = c("Min:", "Media:", "Max:")
) 

concentrado %>% 
  ggplot(aes(x=edad_jefe)) +
  geom_histogram(bins=12, color="#000000", fill="darkblue")+
  theme_classic()+
  geom_text(data = anotaciones, aes(x = x, y = y, label = paste(label, x)), size = 3.5, fontface = "bold")

También le vamos a agregar el título, subtítulo y fuente

concentrado %>% 
  ggplot(aes(x=edad_jefe)) +
  geom_histogram(bins=12, color="#000000", fill="darkblue")+
  theme_classic()+
  geom_text(data = anotaciones, aes(x = x, y = y, label = paste(label, x)), size = 3.5, fontface = "bold")+
  labs(
    x = "Edad del jefe del hogar",
    y = "Frecuencia",
    title = "Edades de los jefes y jefas de hogar en México, 2020",
    caption = "Fuente: elaboración propia con base en ENIGH 2020"
  ) 

Al título y fuente también podemos agregarle los tipos de letra

concentrado %>% 
  ggplot(aes(x=edad_jefe)) +
  geom_histogram(bins=12, color="#000000", fill="darkblue")+
  theme_classic()+
  geom_text(data = anotaciones, aes(x = x, y = y, label = paste(label, x)), size = 3.5, fontface = "bold")+
  labs(
    x = "Edad del jefe del hogar",
    y = "Frecuencia",
    title = "Edades de los jefes y jefas de hogar en México, 2020",
    caption = "Fuente: elaboración propia con base en ENIGH 2020"
  )+ 
theme(
  plot.title = element_text(color = "darkgreen", size = 14, face = "bold"),
  plot.caption = element_text(face = "italic")
)

Podemos cambiar el histograma por un gráfico de densidad, para ello cambiamos nuestra base pequeña de anotaciones.

anotaciones <- data.frame(
  x = c(round(min(concentrado$edad_jefe), 2), round(mean(concentrado$edad_jefe), 2), round(max(concentrado$edad_jefe), 2)),
  y = c(0.0025, 0.025, 0.0025),
  label = c("Min:", "Media:", "Max:")
) 

concentrado %>% 
  ggplot(aes(x=edad_jefe)) +
  geom_density(adjust = 1L, color="#000000", fill="darkblue")+
  theme_classic()+
  geom_text(data = anotaciones, aes(x = x, y = y, label = paste(label, x)), size = 3.5, fontface = "bold")+
  labs(
    x = "Edad del jefe del hogar",
    y = "Densidad",
    title = "Edades de los jefes y jefas de hogar en México, 2020",
    caption = "Fuente: elaboración propia con base en ENIGH 2020"
  )+ 
  theme(
    plot.title = element_text(color = "darkgreen", size = 14, face = "bold"),
    plot.caption = element_text(face = "italic")
  )

Por último, también podemos hacer un boxplot

anotaciones <- data.frame(
  x = c(round(min(concentrado$edad_jefe), 2), round(mean(concentrado$edad_jefe), 2), round(max(concentrado$edad_jefe), 2)),
  y = c(-0.37, 0.4, -0.37),
  label = c("Min:", "Media:", "Max:")
) 

concentrado %>% 
  ggplot(aes(x=edad_jefe)) +
  geom_boxplot(color="#000000", fill="darkblue") +
  theme_classic()+
  geom_text(data = anotaciones, aes(x = x, y = y, label = paste(label, x)), size = 3.5, fontface = "bold")+
  labs(
    x = "Edad del jefe del hogar",
    y = "",
    title = "Edades de los jefes y jefas de hogar en México, 2020",
    caption = "Fuente: elaboración propia con base en ENIGH 2020"
  )+ 
  theme(
    plot.title = element_text(color = "darkgreen", size = 14, face = "bold"),
    plot.caption = element_text(face = "italic")
  )

Además, podemos hacer un boxplot contemplando los hombres y las mujeres.

concentrado$edad_jefe <- as.numeric(concentrado$edad_jefe)

ggplot(concentrado) +
  aes(x = edad_jefe, y = sexo_factor, fill = sexo_factor) +
  geom_boxplot() +
  scale_fill_manual(
    values = c(Hombre = "#270122",
               Mujer = "#03D9AE")
  ) +
  labs(
    x = "Edad del jefe del hogar",
    y = "Sexo del jefe del hogar",
    title = "Distribución de las edades de los jefes y jefas de los hogares de México, 2020",
    subtitle = "Según sexo del jefe del hogar",
    caption = "Fuente: Elaboración propia con base en ENIGH 2020",
    fill = "Sexo del jefe del hogar"
  ) +
  theme_minimal()