1, Curso de gráficas

1.1 Gráficas con 1 variable

Para practicar en clase, utilizamos la base de datos resultante de la Encuesta Nacional de Ocupación y Empleo, que obtuvimos del INEGI. La edición que tomamos fue la del 3° trimestre de 2023.

En esta primer acercamiento a los datos, estamos utilizando los datos muestrales únicamente. Es decir, no estamos utilizando el factor de expansión que proporciona el INEGI. Por lo tanto, nuestros resultados no corresponden con la realidad.

Lo primero que hicimos, después de cargar los paquetes, fijar nuestro directorio de trabajo, fue conservar solamente a las personas que forman parte de la población ocupada.

#1. Cargar librerias

paquetes=c("scales","survey","ggsurvey","forcats","haven","readxl","readxl","fastDummies","readr", "dplyr", "foreign", "tidyr", "ggplot2", "writexl","openxlsx","gridExtra")
for (i in paquetes) {if (!require(i, character.only = TRUE)) {install.packages(i);library(i, character.only = TRUE)} else {library(i, character.only = TRUE)}}


#2.  Directorio de trabajo

setwd("~/CONEVAL/Curso de R")

enoe=read_dta("ENOE_SDEMT423.dta")

# Variable filtro

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

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


#3. Preparar datos

#3.1 Subconjuntos de datos

# CLASE2=Condicion de ocupacion
# Codigos: 1=Ocupado, 2=Desocupado, 3=Disponible, 4=No disponible

# Convertir la variable a dato numerico
enoe$clase2=as.numeric(enoe$clase2)

# Filtrar la base, necesitamos a los ocupados CLASE2=1
ocupados=enoe%>%filter(clase2==1)

Luego, etiquetamos las variables para que funcionen correctamente. Trabajamos con dos variables principales, sexo y posición en la ocupación.

#3.2 Etiquetado de variables


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

# pos_ocu=Posicion en la ocupacion
# Codigos: 1=Suborninado, 2=Independiente, 3=Disponible, 0=No aplica
ocupados <- ocupados %>%
  mutate(pos_ocu = fct_recode(factor(pos_ocu),
                              "No Aplica" = "0",
                              "Suborninado" = "1",
                              "Empleadores" = "2",
                              "Cuenta propia" = "3",
                              "Sin pago" = "4"))

Finalmente, generamos algunas gráficas.

#4. Graficas (ggplot)

#4.1 Con 1 variable discreta

class(ocupados$sex)    
## [1] "factor"
# Gráfico = Datos + Estética + Geometría.

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

# Gráfico = Datos + Estética + Geometría + Etiquetas

ggplot(ocupados) + aes(sex) + geom_bar(fill="yellowgreen") + 
  xlab("Sexo") + ylab("Personas") + ggtitle("Total de mujeres y hombres en la muestra de personas ocupadas")

# Gráfico = Datos + Estética + Geometría + Etiquetas + Ajustes


ggplot(ocupados) + aes(sex) + geom_bar(fill="yellowgreen") + 
  xlab("Sexo") + ylab("Personas") + ggtitle("Total de mujeres y hombres")+ 
  geom_text(aes(label = scales::comma(..count..)), stat = 'count',                 # Añade el número con comas
            position = position_dodge(0.5), vjust = -0.5, size = 3.5) +            # Ajusta la posición del texto moviéndolo ligeramente y ajustando su posición vertical
  theme_minimal(base_size = 14) +                                                  # Ajusta la configuración del gráfico
  theme(plot.title = element_text(hjust = 0.5))                                    # Centrar el título horizontalmente

ggplot(ocupados, aes(x = sex, y = ..prop.. * 100, group = 1)) +
  geom_bar(aes(fill = sex), position = "dodge", stat = "count") +                            # Crea barras con porcentajes
  geom_text(aes(label = scales::percent(..prop..)), stat = 'count',                          # Ajusta el número mostrado arriba de las barras
            vjust = -0.5, position = position_dodge(0.5), size = 3.5) +
  labs(x = "Sexo", y = "Porcentaje", title = "Porcentaje de mujeres y hombres", 
       caption = "Nota: población de 15 años y más\nFuente: ENOE cuarto trimestre 2023") +  # Añade la fuente y nota como pie de página
  theme_minimal(base_size = 14) +
  theme(plot.title = element_text(hjust = 0.5),                                              # Centrar el título horizontalmente
        plot.caption = element_text(hjust = 0, size = 9)) +                                  # Ajustes de estilo para la nota de fuente y la nota explicativa
  scale_y_continuous(labels = scales::percent_format(scale = 1))                             # Formatear el eje y como porcentaje

#4.2 Con 2 variables discretas


# Ahora vamos a guardar la definición de la base de datos y la variable en un elemento llamado g1
g1<-ggplot(ocupados) + aes(pos_ocu)            # Base de datos y variable


# Ya no bamos a repetir la definición, solo vamos a usar g1


# Opción 1: Pantalla dividida
g1+geom_bar(fill="yellowgreen")+
  facet_wrap(~ sex)+                          # facet_wrap divide a la pantalla
  ggtitle("Ocupacion por sexo")+
  xlab("Posicion de la ocupacion")+
  ylab("Personas")

# agregar más detalles

g1+geom_bar(fill="yellowgreen")+
  facet_wrap(~ sex)+                          # facet_wrap divide a la pantalla
  ggtitle("Ocupacion por sexo")+
  xlab("Posicion de la ocupacion")+
  ylab("Personas")+
  geom_text(aes(label=..count..), stat='count',  
            position=position_dodge(0.5), 
            vjust=-0.5, 
            size=3.5) 

# Opción 2: Separa las barras


g2<-ggplot(ocupados,aes(x=pos_ocu,fill=sex))   # Base de datos y variable

g2+geom_bar(position = "dodge")+
  ggtitle("Ocupacion por sexo")+              # position ajusta la posicion de las barras
  xlab("Posicion de la ocupacion")+
  ylab("Personas")+
  scale_fill_brewer(palette = "Blues")+
  scale_y_continuous(labels = scales::comma)

# agregar más detalles

g2+geom_bar(position = "dodge", stat = "count") +  # Barras con posición dodge y contando las ocurrencias
  geom_text(aes(label = scales::comma(..count..)), stat = "count", position = position_dodge(width = 0.9), vjust = -0.5, size = 2.5) +  # Añade etiquetas numeradas con comas
  ggtitle("Ocupación por Sexo") +  # Título del gráfico
  xlab("Posición de la Ocupación") +  # Etiqueta del eje X
  ylab("Personas") +  # Etiqueta del eje Y
  scale_fill_brewer(palette = "Blues", name = "Sexo") +  # Define la paleta de colores y titula la leyenda como "Sexo"
  scale_y_continuous(labels = scales::comma)

# Opción 3: Apila los elementos uno encima del otro


# Preparación de los datos para calcular los porcentajes correctos
ocupados_r <- ocupados %>%
  group_by(pos_ocu, sex) %>%
  summarise(count = n(), .groups = 'drop') %>%
  group_by(pos_ocu) %>%
  mutate(percent = count / sum(count) * 100)

# Creación del gráfico con los datos preparados
g3 <- ggplot(ocupados_r, aes(x = pos_ocu, y = percent, fill = sex)) 

g3+geom_bar(stat = "identity", position = "dodge") +  # Usar barras con posición dodge
  geom_text(aes(label = scales::percent(percent / 100)), position = position_dodge(width = 0.9), vjust = -0.5, size = 2.5) +
  ggtitle("Ocupación por Sexo") +
  xlab("Posición de la Ocupación") +
  ylab("Porcentaje") +
  scale_fill_brewer(palette = "Blues", name = "Sexo") +
  scale_y_continuous(labels = percent_format(scale = 1))

# Creación del gráfico con las cifras divididas entre 100
g3+geom_bar(stat = "identity", position = "fill") +  # Usar barras con posición fill para apilar los porcentajes en una barra
  geom_text(aes(label = scales::percent(percent / 100, accuracy = 0.1)), position = position_fill(vjust = 0.5), size = 3.5) +
  ggtitle("Ocupación por Sexo") +
  xlab("Posición de la Ocupación") +
  ylab("Porcentaje de Personas") +
  scale_fill_brewer(palette = "Blues", name = "Sexo") +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1)) +  # Formatear el eje Y como porcentaje
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5))