1. Pasos previos

Antes de empezar a trabajar, tenemos que realizar las siguientes acciones:

#1 Eliminar variables existentes
rm(list = ls())

#2 Cerrar gráficos anteriores
graphics.off()

#3 Desactivar advertencias
options(warn = -1)
# Creamos una lista de los paquetes a utilizar
paquetes=c("scales","survey","ggsurvey","forcats","haven","readxl","readxl","fastDummies","readr", "dplyr", "foreign", "tidyr", "ggplot2", "writexl","openxlsx","gridExtra")

# Utilizamos la librería easypackages para instalar y cargar los paquetes
# install.packages("easypackages")
library(easypackages)
packages(paquetes)
## Cargando paquete requerido: scales
## Cargando paquete requerido: survey
## Cargando paquete requerido: grid
## Cargando paquete requerido: Matrix
## Cargando paquete requerido: survival
## 
## Adjuntando el paquete: 'survey'
## The following object is masked from 'package:graphics':
## 
##     dotchart
## Cargando paquete requerido: ggsurvey
## Cargando paquete requerido: ggplot2
## Cargando paquete requerido: hexbin
## Cargando paquete requerido: dplyr
## 
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
## Cargando paquete requerido: forcats
## Cargando paquete requerido: haven
## Cargando paquete requerido: readxl
## Cargando paquete requerido: fastDummies
## Thank you for using fastDummies!
## To acknowledge our work, please cite the package:
## Kaplan, J. & Schlegel, B. (2023). fastDummies: Fast Creation of Dummy (Binary) Columns and Rows from Categorical Variables. Version 1.7.1. URL: https://github.com/jacobkap/fastDummies, https://jacobkap.github.io/fastDummies/.
## Cargando paquete requerido: readr
## 
## Adjuntando el paquete: 'readr'
## The following object is masked from 'package:scales':
## 
##     col_factor
## Cargando paquete requerido: foreign
## Cargando paquete requerido: tidyr
## 
## Adjuntando el paquete: 'tidyr'
## The following objects are masked from 'package:Matrix':
## 
##     expand, pack, unpack
## Cargando paquete requerido: writexl
## Cargando paquete requerido: openxlsx
## Cargando paquete requerido: gridExtra
## 
## Adjuntando el paquete: 'gridExtra'
## The following object is masked from 'package:dplyr':
## 
##     combine
## All packages loaded successfully
libraries(paquetes)
## All packages loaded successfully
setwd("G:/Unidades compartidas/SPPC/Curso R 2024")
enoe=read_dta("ENOE_SDEMT423.dta")

2. Preparación de datos

Dentro de la ENOE, solo trabajaremos con datos de personas que:

Para ello creamos una variable dentro de la base de datos para identificar a las personas que cumplen con estas características.

La función mutate permite crear nuevas columnas a partir de variables existentes. Por su parte, la función filter se utiliza para crear un subconjunto de la ENOE con las observaciones que satisfacen ciertas condiciones.

# Primero creamos una variable que distinga entre personas que cumplen con las características que buscamos y aquellas que no

enoe <- enoe %>%
  mutate(filtro = r_def == 0 & (c_res == 1 | c_res == 3) & eda >= 15 & eda <= 98)


#Posteriormente, filtramos la base de datos para tener solamente a las personas con las características que buscamos

enoe=enoe %>% filter(filtro==1)

A continuación, creamos un subconjunto únicamente con la información de las personas ocupadas, para ello utilizaremos la variable clase2 en la cual se clasifica a la población en ocupada, desocupada, disponible y no disponible.

enoe$clase2=as.numeric(enoe$clase2)
ocupados=enoe%>%filter(clase2==1)

Como resultado tenemos una base de datos con 192,399 observaciones y 115 variables

dim(ocupados)
## [1] 192399    115

Para elaborar las gráficas, seleccionaremos la variable sex, que contiene información sobre el sexo de las personas, y EMP_PPAL, que clasifica al empleo según su condición de formalidad laboral.

ocupados<-ocupados %>%
  mutate(sex=fct_recode(factor(sex),
                        Hombre="1",
                        Mujer="2"))

ocupados<-ocupados %>%
  mutate(emp_ppal=fct_recode(factor(emp_ppal),
                             Informal="1",
                             Formal="2"))

3. Graficas con ggplot

3.1 Con 1 variable discreta

Primero crearemos un gráfico utilizando una variable discreta, en este caso la variable sex. La sintaxis de este gráfico se compone de tres elementos:

  • Datos: ggplot(ocupados)

  • Estética: aes(sex)

  • Geometría: geom_bar(fill="orange")

ggplot(ocupados) + aes(sex) + geom_bar(fill="orange")

De manera predeterminada, R asigna nombres a los ejes según la información con la que cuenta la variable utilizada. En el ejemplo anterior, el eje X corresponde a la variable sex a la que previamente habíamos asignado etiquetas a sus valores; el eje Y representa el número de observaciones con las que cuenta cada valor de la variable sex en la encuesta.

Para mayor claridad, podemos personificar las etiquetas de estos ejes, asignar un título y nota al pie del gráfico con la función labs. Esta función cuenta con cuatro elementos:

  • x: Asigna una etiqueta al eje X

  • y: Asigna una etiqueta al eje Y

  • title: Establece un título al gráfico

  • caption: Agrega una nota al pie del gráfico

# Crearemos un objeto llamado "tag_g0" que utilizaremos para incluir las mismas etiquetas en los siguientes gráficos

tag_g0<-labs(x="Sexo", 
                y="Personas", 
                title="Personas ocupadas por sexo",
                caption="Nota: población de 15 años y más\nFuente: ENOE cuarto trimestre 2023")

Asimismo, podemos definir la apariencia de nuestras gráficas con las funciones:

  • theme_classic(base_size = 16): Define el color de fondo, los ejes y la cuadrícula del gráfico

  • theme(plot.title = element_text(face="bold", hjust = 0.5)): Da formato de negritas al título y lo centra horizontalmente.

  • strip.background=element_rect(...) y strip.text=element_text(): Dan formato al gráfico cuando lo dividimos con facet_wrap

# Para el tema o apariencia de nuestras gráficas crearemos "tema1"
tema1<-theme_classic(base_size = 16) + 
  theme(plot.title = element_text(face="bold", 
                                  hjust=0), 
        strip.background=element_rect(fill="gray",
                                      color = "darkgray",
                                      linewidth=1),
        strip.text=element_text(face="bold", 
                                size = 14),
        plot.subtitle=element_text(size=12, 
                                   color="darkgray", 
                                   hjust=0, 
                                   face="bold"))

Por último, podemos personalizar el formato de las etiquetas de datos con las siguientes opciones dentro de la función geom_text:

  • aes(label = scales::comma(after_stat(count)): Separa con comas los números en miles

  • position = position_dodge(0.5): Ajusta la posición del texto moviéndolo ligeramente

  • vjust = -0.5: Ajusta la posición vertical del texto

  • scale_y_continuous(labels=comma): Agrega comas para separar los valores del eje Y

ggplot(ocupados) + 
  aes(sex) + 
  geom_bar(fill="orange") + 
  geom_text(aes(label = scales::comma(..count..)), 
            stat = 'count',
            position = position_dodge(0.5), 
            vjust = -0.5, 
            size = 3) +
  tema1 +
  tag_g0 +
  scale_y_continuous(labels=comma)

Otra forma de mostrar los datos es a través de porcentajes, para ello tenemos que indicar dentro de la estética (aes) el formato de porcentaje para el eje Y. Es importante utilizar la opción group=1 para especificar que el cálculo del porcentaje se haga considerando todas las observaciones de la base de datos.

# Sin group = 1
ggplot(ocupados) + 
  aes(x = sex, y = ..prop.. * 100) +
  geom_bar(fill="orange", 
          position = "dodge", 
          stat = "count") +
  geom_text(aes(label = scales::percent(..prop..)), 
           stat = 'count', 
           vjust = -0.5,
           position = position_dodge(0.5), 
           size = 3) +
  labs(title="Sin group=1")

# Con group = 1
ggplot(ocupados) + 
  aes(x = sex, y = ..prop.. * 100, group = 1) +
  geom_bar(fill="orange", 
          position = "dodge", 
          stat = "count") +
  geom_text(aes(label = scales::percent(..prop..)), 
           stat = 'count', 
           vjust = -0.5,
           position = position_dodge(0.5), 
           size = 3) +
  labs(title="Con group=1")

Las siguientes funciones nos permiten dar formato a etiquetas de los ejes, título y valores del eje Y:

  • plot.title = element_text(hjust = 0.5): para centrar el título horizontalmente

  • plot.caption = element_text(hjust = 0, size = 9): para cambiar el tamaño y posición de la nota al pie del gráfico

  • scale_y_continuous(labels = scales::percent_format(scale = 1)): para cambiar el formato de los valores del eje Y

ggplot(ocupados) + 
  aes(x = sex, y = ..prop.. * 100, group = 1) +
  geom_bar(fill="orange",
           position = "dodge",
           stat = "count") + 
  geom_text(aes(label = scales::percent(..prop..)), 
           stat = 'count', 
           vjust = -0.5,
           position = position_dodge(0.5), 
           size = 3) + 
  tema1 +
  theme(plot.title = element_text(hjust = 0.5),
        plot.caption = element_text(hjust = 0, 
                                    size = 9)) +
  scale_y_continuous(labels = scales::percent_format(scale = 1)) +
  tag_g0

3.2 Con 2 variables discretas

Antes de trabajar con dos variables discretas, vamos a crear un elemento que contenga los datos y la estética que utilizaremos; y otro que contenga las etiquetas del gráfico.

# Para los datos y la estética utilizaremos g1
g1<-ggplot(ocupados) +
  aes(emp_ppal)

# Para las etiquetas utilizaremos tag_g1
tag_g1<-labs(x="Categoría de empleo principal", 
             y="Personas", 
             title="Categoría de empleo principal por sexo", 
             size=12)

3.2.1 Pantalla dividida

La primera opción para trabajar con dos variables es la función facet_wrap que nos permite dividir el gráfico en función de una variable.

g1 +
  geom_bar(fill="orange") +
  facet_wrap(~ sex) + 
  geom_text(aes(label=scales::comma(..count..)), 
            stat='count',
            position=position_dodge(0.5),
            vjust=-0.5, 
            size=3) +
  tema1 +
  tag_g1 +
  scale_y_continuous(labels=comma)

3.2.2 Barras juntas

Otra opción es mostrar de manera contigua una barra por cada categoría de nuestra variable.

g2<-ggplot(ocupados, aes(x=emp_ppal, fill=sex))

g2 +
  geom_bar(position="dodge", stat="count") +
  geom_text(aes(label = scales::comma(..count..)), 
            stat = "count", 
            position = position_dodge(width = 0.9), 
            vjust = -0.5, size = 3) +
  scale_y_continuous(labels=scales::comma) +
  tag_g1+
  tema1

3.2.3 Barras apiladas

Para hacer un gráfico de barras apiladas es necesario contar con los datos agrupados por las variables que nos interesan, utilizamos:

  • group_by: para agrupar datos por variables de interés

  • summarise: crea una nueva base de datos mediante la agrupación de datos

  • count: cuenta el número de observaciones

  • sum: suma todos los valores indicados

# Construimos la base de datos ocupados_r con la estructura que necesitamos
ocupados_r<-ocupados %>%
  group_by(emp_ppal, sex) %>%
  summarise(count=n(), .groups = "drop") %>%
  group_by(emp_ppal) %>%
  mutate(percent=count/sum(count)*100)

g3<-ggplot(ocupados_r, aes(x=emp_ppal, y=percent, fill=sex))

g3 + 
  geom_bar(stat="identity", position="fill") +
  geom_text(aes(label=scales::percent(percent/100, accuracy = 0.1)), 
            position=position_fill(vjust=0.5),
            size=5)+
  tema1 +
  scale_y_continuous(labels=scales::percent_format(accuracy = 1)) +
  labs(x="Categoría de empleo principal", 
       y="Porcentaje", 
       title="Categoría de empleo principal por sexo",
       subtitle = "Porcentajes", 
       size=12) +
  scale_fill_discrete(name="Sexo")