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")
Dentro de la ENOE, solo trabajaremos con datos de personas que:
Hayan completado su entrevista satisfactoriamente
(r_def==0)
Sean residentes habituales o nuevos residentes
(c_res==1 | c_res==3)
Tengan entre 15 y 98 años de edad
(eda>=15 & eda<=98)
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"))
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
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)
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)
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
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")