Gráficos con encuestas probabilísticas
Julio César
El objetivo de este tutorial es explorar las herramientas para una efectiva visualización de datos en R. El curso está dirigido a un público variado que incluye tanto a estudiantes como a profesionales interesados en enriquecer sus habilidades en este ámbito. Iniciamos con una introducción a los principios básicos de la creación de gráficos y avanzamos hacia el manejo de técnicas más sofisticadas, como el análisis de datos provenientes de encuestas. Nuestro enfoque es capacitar a los participantes no solo para crear gráficos básicos, sino también para ajustar sus visualizaciones de forma que reflejen el diseño muestral de las encuestas, lo cual es esencial para garantizar interpretaciones confiables.
Durante el curso, utilizaremos la base de datos del cuarto trimestre de 2023 de 2023 de la Encuesta Nacional de Ocupación y Empleo (ENOE). Esta base contiene información exhaustiva sobre las condiciones laborales de la población y es clave para los ejemplos y ejercicios prácticos que desarrollaremos a lo largo del tutorial.
El material de trabajo se encuentra disponible en:
Los paquetes que vamos a utilizar son los siguientes:
tidyverse
: Una colección de paquetes para la
manipulación y visualización de datos en R.data.table
: Proporciona una manera eficiente de manejar
y procesar conjuntos de datos grandes en R.foreign
y haven
: Permiten trabajar con
datos de SPSS, Stata y SAS.survey
: Especializado en el análisis de encuestas
complejas.forcats
: Parte de tidyverse
, diseñado para
manejar factores de manera eficiente.tidyr
: Ayuda a organizar los datos en formatos limpios
y comprensibles.gridExtra
: Herramientas adicionales para mejorar las
visualizaciones creadas con ggplot2
.knitr
y kableExtra
: Crea tablas dinámicas
y formateadas para informes.Antes de comenzar, eliminamos las variables existentes, cerramos los gráficos anteriores y desactivamos las advertencias. Esto nos ofrece un entorno limpio para comenzar a trabajar y garantiza una ejecución más fluida del código.
rm(list=ls()); graphics.off(); options(warn=-1)
# Lista de paquetes a utilizar
paquetes = c("tidyverse", "data.table", "foreign", "haven", "survey", "forcats", "dplyr", "tidyr", "ggplot2", "gridExtra", "knitr", "kableExtra")
# Verificar e instalar paquetes faltantes
for (i in paquetes) {
if (!require(i, character.only = TRUE)) {
install.packages(i)
library(i, character.only = TRUE)
} else {
library(i, character.only = TRUE)
}
}
enoe=read_dta("ENOE_SDEMT423.dta")
El contenido de la base de datos es el siguiente:
r_def | loc | mun | est | est_d_tri | est_d_men | ageb | t_loc_tri | t_loc_men | cd_a | ent | con | upm | d_sem | n_pro_viv | v_sel | n_hog | h_mud | n_ent | per | n_ren | c_res | par_c | sex | eda | nac_dia | nac_mes | nac_anio | l_nac_c | cs_p12 | cs_p13_1 | cs_p13_2 | cs_p14_c | cs_p15 | cs_p16 | cs_p17 | n_hij | e_con | cs_p20a_1 | cs_p20a_c | cs_p20b_1 | cs_p20b_c | cs_p20c_1 | cs_ad_mot | cs_p21_des | cs_ad_des | cs_nr_mot | cs_p23_des | cs_nr_ori | ur | zona | salario | fac_tri | fac_men | clase1 | clase2 | clase3 | pos_ocu | seg_soc | rama | c_ocu11c | ing7c | dur9c | emple7c | medica5c | buscar5c | rama_est1 | rama_est2 | dur_est | ambito1 | ambito2 | tue1 | tue2 | tue3 | busqueda | d_ant_lab | d_cexp_est | dur_des | sub_o | s_clasifi | remune2c | pre_asa | tip_con | dispo | nodispo | c_inac5c | pnea_est | niv_ins | eda5c | eda7c | eda12c | eda19c | hij5c | domestico | anios_esc | hrsocup | ingocup | ing_x_hrs | tpg_p8a | tcco | cp_anoc | imssissste | ma48me1sm | p14apoyos | scian | t_tra | emp_ppal | tue_ppal | trans_ppal | mh_fil2 | mh_col | sec_ins | tipo | mes_cal |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | NA | 2 | 20 | 123 | 109 | 0 | 1 | 1 | 1 | 9 | 4021 | 900534 | 107 | 81 | 5 | 1 | 0 | 5 | 423 | 4 | 1 | 301 | 2 | 10 | 1 | 6 | 2013 | 9 | 1 | 2 | 3 | NA | NA | 1 | NA | NA | 1 | 9 | 1 | 2 | NA | NA | NA | NA | NA | 1 | 2 | 6223 | 1638 | 5593 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 4 | 0 | 0 | 0 | 0 | 0 | 0.00000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 2 | 11 | |||
0 | NA | 8 | 30 | 124 | 109 | 0 | 1 | 1 | 1 | 9 | 4282 | 911056 | 211 | 95 | 5 | 1 | 0 | 4 | 423 | 3 | 1 | 301 | 2 | 0 | 29 | 1 | 2023 | 9 | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | 1 | 2 | 6223 | 1214 | 4143 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0.00000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 2 | 12 | |||
0 | NA | 10 | 30 | 124 | NA | 0 | 1 | NA | 1 | 9 | 40002 | 912033 | 101 | 76 | 4 | 1 | 0 | 5 | 423 | 3 | 1 | 401 | 2 | 93 | 10 | 2 | 1930 | 21 | 1 | 6 | 3 | 21600 | 1 | 1 | 2 | 7 | 4 | 1 | 9 | 1 | 10 | NA | NA | NA | NA | NA | 1 | 2 | 6223 | 1058 | 0 | 2 | 4 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 3 | 5 | 6 | 2 | 4 | 6 | 11 | 18 | 4 | 6 | 9 | 0 | 0 | 0.00000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 99 | ||
0 | NA | 13 | 30 | 124 | NA | 0 | 1 | NA | 1 | 9 | 40013 | 915488 | 201 | 54 | 3 | 1 | 0 | 4 | 423 | 1 | 1 | 101 | 2 | 67 | 1 | 9 | 1956 | 13 | 1 | 2 | 6 | NA | NA | 2 | 4 | 2 | 1 | 9 | 1 | 13 | NA | NA | NA | NA | NA | 1 | 2 | 6223 | 1109 | 0 | 1 | 1 | 1 | 1 | 1 | 4 | 8 | 2 | 6 | 5 | 3 | 4 | 3 | 10 | 4 | 2 | 4 | 2 | 3 | 0 | 2 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 3 | 0 | 0 | 0 | 0 | 2 | 4 | 6 | 11 | 16 | 3 | 3 | 6 | 45 | 0 | 0.00000 | 0 | 0 | 0 | 1 | 0 | 0 | 19 | 1 | 2 | 2 | 0 | 3 | 2 | 6 | 1 | 99 | |||
0 | NA | 5 | 20 | 123 | NA | 0 | 1 | NA | 1 | 9 | 40032 | 902860 | 401 | 85 | 5 | 1 | 0 | 2 | 423 | 1 | 1 | 101 | 1 | 43 | 15 | 6 | 1980 | 9 | 1 | 3 | 3 | NA | NA | 2 | NA | 5 | 1 | 9 | 1 | 5 | NA | NA | NA | NA | NA | 1 | 2 | 6223 | 907 | 0 | 1 | 1 | 1 | 1 | 2 | 3 | 6 | 4 | 6 | 2 | 4 | 4 | 3 | 5 | 4 | 2 | 3 | 1 | 2 | 0 | 2 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 5 | 0 | 0 | 0 | 0 | 3 | 2 | 4 | 6 | 11 | 0 | 4 | 9 | 48 | 20000 | 96.89922 | 0 | 0 | 0 | 4 | 0 | 0 | 7 | 2 | 1 | 2 | 0 | 3 | 1 | 4 | 1 | 99 | |||
0 | NA | 7 | 30 | 124 | NA | 0 | 1 | NA | 1 | 9 | 40035 | 909615 | 401 | 36 | 4 | 1 | 0 | 2 | 423 | 4 | 1 | 408 | 2 | 27 | 2 | 7 | 1996 | 9 | 1 | 4 | 3 | NA | NA | 2 | 0 | 6 | 1 | 9 | 1 | 7 | NA | NA | NA | NA | NA | 1 | 2 | 6223 | 896 | 0 | 1 | 1 | 1 | 1 | 1 | 4 | 4 | 2 | 6 | 7 | 3 | 4 | 3 | 8 | 4 | 3 | 0 | 1 | 1 | 0 | 2 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 3 | 0 | 0 | 0 | 0 | 4 | 2 | 2 | 3 | 8 | 1 | 3 | 12 | 44 | 0 | 0.00000 | 0 | 0 | 0 | 1 | 0 | 0 | 14 | 1 | 2 | 2 | 0 | 3 | 2 | 2 | 1 | 99 |
Para replicar los tabulados publicados, filtramos los datos en el
dataframe enoe
creando una columna llamada f
que identifica las filas que cumplen las condiciones específicas. En
particular, validamos que se trate de una entrevista completa y que las
personas sea residentes habituales del hogar. Utilizamos la función
mutate()
para evaluar si r_def
es igual a 0,
lo que indica que la entrevista fue completada satisfactoriamente.
Verificamos que c_res
sea 1 o 3, donde 1 corresponde a
residentes habituales y 3 a nuevos residentes. Además, restringimos el
rango de edad (eda
) a individuos entre 15 y 98 años.
enoe <- enoe %>%
mutate(f = r_def == 0 & (c_res == 1 | c_res == 3) & eda >= 15 & eda <= 98)
enoe=enoe %>% filter(f==1)
Para enfocar el análisis en los individuos ocupados dentro del
conjunto de datos enoe
, filtramos según la condición de
ocupación que identifica la variable clase2
. Esta variable
categoriza a las personas de acuerdo con su situación laboral actual
mediante los códigos: 1 para Ocupado, 2 para Desocupado, 3 para
Disponible y 4 para No disponible.
Dado que nuestro interés reside en los individuos ocupados,
procedemos a crear un subconjunto de datos específico. Inicialmente,
transformamos clase2
en un dato numérico para garantizar
que las operaciones posteriores se ejecuten sin errores:
enoe$clase2 = as.numeric(enoe$clase2)
Luego, filtramos el dataframe para incluir solamente a los individuos
que están ocupados (clase2 == 1
), ya que este grupo será el
foco de análisis posterior:
ocupados = enoe %>% filter(clase2 == 1)
Dentro del subconjunto de datos ocupados
recodificamos
algunas variables para simplificar su interpretación. En particular,
asignamos las etiquetas a las variables exo (sex
)
considerando: 1 Hombre y 2 Mujer. Así como a la posición en la
ocupación (pos_ocu
), cuyas etiquetas son: 0 No Aplica,
1 Subordinado, 2 Empleadores, 3 Cuenta propia y 4 Sin pago.
ocupados <- ocupados %>%
mutate(sex = fct_recode(factor(sex),
"Hombre" = "1",
"Mujer" = "2"))
ocupados <- ocupados %>%
mutate(pos_ocu = fct_recode(factor(pos_ocu),
"No Aplica" = "0",
"Suborninado" = "1",
"Empleadores" = "2",
"Cuenta propia" = "3",
"Sin pago" = "4"))
Nota Importante: Al recodificar directamente en las mismas variables, los valores originales se pierden. Esto es adecuado cuando los códigos numéricos no tienen relevancia más allá de su representación en las etiquetas asignadas y no se requieren para análisis futuros. Si se necesita conservar la información original, considera crear nuevas columnas para las versiones recodificadas de estas variables.
sex | pos_ocu |
---|---|
Mujer | Suborninado |
Hombre | Suborninado |
Mujer | Suborninado |
Hombre | Suborninado |
Hombre | Suborninado |
Hombre | Suborninado |
Las gráficas son herramientas poderosas para contar una historia visualmente, permitiendo presentar datos de manera que se comprenda rápida y eficazmente. Los elementos básicos que componen una gráfica efectiva incluyen:
Título: Descripción del contenido y propósito del gráfico.
Etiquetas de los ejes: Unidades de medida para cada variable.
Leyenda: Texto que explique los colores, símbolos o líneas si el gráfico contiene múltiples categorías.
Notas: Sirve para clarar la fuente de los datos o proporcionar información adicional relevante.
Estos puntos se deben tener en cuenta para que el gráfico sea autocontenido y comprensible sin necesidad de referencias adicionales del texto.
Tener una visualización clara de los datos es crucial, ya que
facilita la identificación de patrones y mejora significativamente la
comunicación de resultados. En el entorno de R, existen múltiples
librerías diseñadas para la elaboración de gráficos, sin embargo,
ggplot2
se destaca como una de las opciones más robustas
debido a su capacidad para generar visualizaciones estéticamente
agradables y su simplicidad de uso.
La metodología de ggplot2
se basa en la idea de
construcción por capas. Cada capa se puede ajustar individualmente, lo
que permite una gran flexibilidad para manipular los datos. Para diseñar
un gráfico los pasos básicos incluyen:
Seleccionar el conjunto de datos: Esto se
realiza con el comando ggplot(data = base)
, donde
base
es el dataframe que se desea utilizar.
Definir los aspectos estéticos: Se utiliza la
función aes()
para especificar qué variables se emplearán
en el gráfico. Aquí se pueden asignar características como el color,
tamaño y forma, dependiendo de cómo se quiera representar cada
variable.
Elegir el tipo de gráfico Esta decisión depende
del mensaje que se desea comunicar con los datos y de la naturaleza de
los datos mismos. Algunas de las opciones más recurrentes son
geom_bar()
para gráficos de barras,
geom_line()
para gráficos de líneas o
geom_point()
para diagramas de dispersión.
Vamos a crear un gráfico con la variable sex
, por lo que
el primer paso es verificar su formato:
class(ocupados$sex)
## [1] "factor"
Creamos un gráfico de barras simple que muestra la distribución de hombres y mujeres. Para ello, las funciones y argumentos requerímos son:
ggplot(ocupados)
: Indicar el dataframe de
referencia.aes(sex)
: Definir la variable que deseamos
graficar.geom_bar(fill="yellowgreen")
: Agregar una gráfica de
barras al gráfico, el argumento fill="yellowgreen"
especifica el color de las barras.ggplot(ocupados) + aes(sex) + geom_bar(fill="yellowgreen")
Para hacerlo más legible hay varios ajustes que podemos implementar. Estos cambios aumentan la claridad visual y facilitan la interpretación de los datos por parte de los usuarios. Aquí están los ajustes:
xlab("Sexo")
y ylab("Personas")
: Nombre
los ejes.ggtitle("Total de mujeres y hombres")
: Título del
gráfico.geom_text(aes(label = scales::comma(..count..)), ...
:
Etiquetas numéricas de las barras que muestran el conteo de personas en
cada categoría. scales::comma(..count..)
convierte los
conteos en un formato numérico con comas para mejorar la legibilidad. El
stat = 'count'
indica que las etiquetas deben basarse en el
conteo de observaciones en cada barra. position_dodge(0.5)
separa las etiquetas en barras adyacentes para evitar solapamientos, y
vjust = -0.5
ajusta la posición vertical de las etiquetas
para que aparezcan justo encima de cada barra.theme_minimal(base_size = 14)
: Aplica un tema
minimalista al gráfico con un tamaño base de fuente de 14, lo que hace
que el diseño general sea fácil de leer.theme(plot.title = element_text(hjust = 0.5))
: Centra
horizontalmente el título del gráfico.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',
position = position_dodge(0.5), vjust = -0.5, size = 3.5) +
theme_minimal(base_size = 14) +
theme(plot.title = element_text(hjust = 0.5))
En el grafico anterior mostramos los totales, ahora nos vamos a enfocar en los porcentajes de hombres y mujeres. Para ello, vamos a modificar el código anterior con los siguientes argumentos:
ggplot(ocupados, aes(x = sex, y = ..prop.. * 100, group = 1))
ggplot()
: Función principal para crear gráficos basada
en la gramática de gráficos.
ocupados
: Conjunto de datos que se utiliza para el
gráfico.aes()
: Define las estéticas del gráfico.
x = sex
: Asigna la variable sex
al eje
x.y = ..prop.. * 100
: Calcula el porcentaje de cada grupo
en sex
para el eje y.group = 1
: Fuerza que todos los datos sean considerados
como parte de un único grupo.geom_bar(aes(fill = sex), position = "dodge", stat = "count")
geom_bar()
: Crea un gráfico de barras.
aes(fill = sex)
: Usa la variable sex
para
determinar el color de las barras.position = "dodge"
: Coloca las barras lado a lado en
lugar de apiladas.stat = "count"
: Utiliza el recuento de observaciones
para determinar la altura de las barras.geom_text(aes(label = scales::percent(..prop..)), stat = 'count', vjust = -0.5, position = position_dodge(0.5), size = 3.5)
geom_text()
: Añade texto a las posiciones especificadas
en el gráfico.
aes(label = scales::percent(..prop..))
: Muestra el
porcentaje de cada grupo como etiqueta.stat = 'count'
: Cuenta las observaciones para el
cálculo de ..prop..
.vjust = -0.5
: Ajusta verticalmente el texto para que
aparezca justo encima de cada barra.position = position_dodge(0.5)
: Alinea el texto con las
barras correspondientes.size = 3.5
: Tamaño de la fuente del texto.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")
labs()
: Define las etiquetas y títulos del gráfico.
x, y, title, caption
: Textos para el eje x, el eje y,
el título del gráfico y el pie de página, respectivamente.theme_minimal(base_size = 14)
theme_minimal()
: Aplica un tema minimalista al gráfico.
base_size = 14
: Tamaño base de la fuente para el texto
del gráfico.theme(plot.title = element_text(hjust = 0.5), plot.caption = element_text(hjust = 0, size = 9))
La función theme()
en ggplot2 permite personalizar
varios aspectos estéticos de un gráfico. Los argumentos que has incluido
sirven para ajustar el texto del título y el texto del pie de página
(caption) de tu gráfico. Aquí te detallo cómo funcionan estos ajustes
específicos:
plot.title = element_text(hjust = 0.5)
: Este ajuste
personaliza el texto del título del gráfico.
element_text()
: Se usa para definir las propiedades del
texto.hjust = 0.5
: Este parámetro controla la alineación
horizontal del texto. Un valor de 0.5
significa que el
texto estará centrado horizontalmente. hjust
(horizontal
justify) toma valores de 0 a 1, donde 0 alinea el texto a la izquierda,
1 lo alinea a la derecha y 0.5 es el centro.plot.caption = element_text(hjust = 0, size = 9)
: Este
ajuste personaliza el texto del pie de página del gráfico.
hjust = 0
: Aquí, el texto del pie de página se alineará
completamente a la izquierda (justificación horizontal).size = 9
: Establece el tamaño del texto del pie de
página a 9.Estos ajustes son muy útiles para mejorar la presentación y la legibilidad del gráfico, asegurando que tanto el título como el pie de página no solo proporcionen información relevante sino que también estén alineados de manera que complementen la disposición general del gráfico.
scale_y_continuous(labels = scales::percent_format(scale = 1))
scale_y_continuous()
: Configura la escala del eje y.
labels = scales::percent_format(scale = 1)
: Formatea
las etiquetas del eje y como porcentajes, adecuado para la
representación en el gráfico.ggplot(ocupados, aes(x = sex, y = ..prop.. * 100, group = 1)) +
geom_bar(aes(fill = sex), position = "dodge", stat = "count") +
geom_text(aes(label = scales::percent(..prop..)), stat = 'count',
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") +
theme_minimal(base_size = 14) +
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))
Para crear una gráfica que compare dos variables discretas, en este caso la posición en la ocupación por sexo. Exploramos tres opciones diferentes, cada una adaptada para ofrecer una perspectiva visual clara y comparativa. Estos métodos son especialmente útiles para analizar las similitudes en la distribución de las ocupaciones entre hombres y mujeres.
A continuación, describimos cada opción y cómo se implementa para obtener los resultados más informativos.
Opción 1: Pantalla Dividida
Esta opción utiliza facet_wrap
para separar los gráficos
por sexo, lo que permite una comparación visual directa entre hombres y
mujeres en distintas posiciones de ocupación.
# Base de gráfico con datos y variable posición de ocupación
g1 <- ggplot(ocupados, aes(pos_ocu))
# Añadir barras, configurar etiquetas y título
g1 + geom_bar(fill="yellowgreen") +
facet_wrap(~ sex) + # Separa gráficos por sexo
ggtitle("Ocupación por Sexo") +
xlab("Posición de la Ocupación") +
ylab("Personas") +
geom_text(aes(label=..count..), stat='count',
position=position_dodge(0.5),
vjust=-0.5,
size=3.5) # Añadir etiquetas numéricas sobre las barras
Opción 2: Barras Separadas
Este enfoque muestra barras para hombres y mujeres en la misma gráfica, diferenciadas por color y separadas horizontalmente para evitar solapamientos y facilitar la comparación.
# Base de gráfico con datos, variable y color por sexo
g2 <- ggplot(ocupados, aes(x=pos_ocu, fill=sex))
# Configurar barras, etiquetas y título
g2 + geom_bar(position = "dodge") +
ggtitle("Ocupación por Sexo") +
xlab("Posición de la Ocupación") +
ylab("Personas") +
scale_fill_brewer(palette = "Blues") +
scale_y_continuous(labels = scales::comma) +
geom_text(aes(label = scales::comma(..count..)), stat = "count", position = position_dodge(width = 0.9), vjust = -0.5, size = 2.5) # Etiquetas numéricas
Opción 3: Barras Apiladas por Porcentajes
Aquí, las barras se apilan para mostrar la proporción de hombres y
mujeres en cada categoría de ocupación. Para ello, primero creamos el
subonjunto de datos llamado ocupados_r
. Para ello, primero
calcular porcentajes de ocupación por sexo dentro de cada categoría de
posición ocupacional (pos_ocu)
. Esto prepara los datos para
el cálculo de agregaciones específicas por cada combinación de posición
y sexo.Después de agrupar los datos, summarise() se utiliza para
calcular el número total de observaciones (count)
en cada
grupo. El argumento .groups = 'drop'
indica que la
estructura de grupos creada por group_by()
debe descartarse
después de completar la operación de sumarización. Esto resulta en un
dataframe que contiene las columnas pos_ocu
,
sex
y count
, donde este último refleja el
número de personas en cada categoría de posición y sexo.
# Preparar los datos para mostrar porcentajes
ocupados_r <- ocupados %>%
group_by(pos_ocu, sex) %>%
summarise(count = n(), .groups = 'drop') %>%
group_by(pos_ocu) %>%
mutate(percent = count / sum(count) * 100)
Posteriormente, usamos la base ocupados_r
para crear el
gráfico
# Base de gráfico con datos preparados
g3 <- ggplot(ocupados_r, aes(x = pos_ocu, y = percent, fill = sex))
# Configurar gráfico apilado con etiquetas y título
g3 + geom_bar(stat = "identity", position = "fill") + # Barras apiladas por porcentajes
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 eje Y como porcentaje
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5))
Estas opciones ofrecen distintas perspectivas sobre los mismos datos, facilitando análisis específicos según las necesidades del estudio o la presentación de resultados.
Nos centramos ahora en el análisis de variables continuas, las cuales
proporcionan un enfoque detallado sobre atributos cuantitativos dentro
de un conjunto de datos. Como ejemplo utilizaremos la variable
eda
para demostrar el manejo y la visualización de este
tipo de variables. Aunque las variables continuas difieren de las
discretas en su naturaleza, la metodología para representarlas
gráficamente sigue principios análogos.
Para iniciar, este código verifica y, de ser necesario, convierte la
variable eda
a formato numérico, un paso esencial para
realizar análisis gráficos de variables continuas.
class(ocupados$eda)
## [1] "numeric"
ocupados$eda <- as.numeric(ocupados$eda) # Asegura que la variable edad es numérica
class(ocupados$eda)
## [1] "numeric"
Primero seleccionamos la base de datos ocupados
y la
variable eda
. Guardamos esta definición en g4
con el objetivo de reutilizarla y evitar repetir el proceso en cada
ocasión.
g4 <- ggplot(ocupados, aes(eda))
Así, g4
se establece como una base para múltiples
gráficos que visualizan la distribución de la edad.
Gráfico de Área
El gráfico de área se construye sobre la base preparada en
g4
aprovechando la configuración inicial. En este código,
geom_area(stat="bin")
permite visualizar la acumulación de
frecuencias de edad agrupadas en intervalos y la opción
stat="bin"
organiza los datos.
g4 + geom_area(stat="bin")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
Gráfico de Frecuencia Poligonal
El gráfico de frecuencia poligonal ofrece una perspectiva alternativa
al gráfico de área. Conectando los centros de cada bin del histograma
con líneas, este gráfico facilita la identificación de picos y valles en
la distribución de la edad.Este fragmento de código utiliza
geom_freqpoly()
para crear el gráfico de frecuencia
poligonal. Al igual que con el gráfico de área, se emplea la
configuración base g4
para mantener la consistencia en la
manipulación de datos.
g4 + geom_freqpoly()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
Histograma El histograma que presentaremos ajusta el
ancho de cada bin a 5 rangos. Esta especificación permite una
segmentación adecuada de los datos, facilitando la observación de las
tendencias principales y proporcionando una comparación clara entre
diferentes rangos de edad.La función
geom_histogram(binwidth = 5)
crea el histograma dividido en
5 años.
g4 + geom_histogram(binwidth = 5)
Ahora avanzaremos en nuestro análisis incorporando dos variables
continuas, lo que nos permitirá explorar relaciones más complejos dentro
del conjunto de datos. Utilizaremos eda
, que representa la
edad de los individuos y ing_x_hrs
que indica los ingresos
por hora.
El código para visualizar las relaciones entre dos variables
continuas usa la función
geom_point(alpha = 0.5, color = "blue")
, la cual crea un
diagrama de dispersión en donde cada punto representa una observación en
el espacio definido por las dos variables. alpha = 0.5
ajusta la transparencia de los puntos en el gráfico. Al establecer un
valor de 0.5, los puntos son semi-transparentes, lo que permite
visualizar la superposición de datos sin perder claridad.
color = "blue"
define el color de los puntos usando el
color azul.
ggplot(ocupados, aes(x = eda, y = ing_x_hrs)) +
geom_point(alpha = 0.5, color = "blue") +
ggtitle("Relación entre edad e ingresos por Hora") +
xlab("Edad (años)") +
ylab("Ingresos por hora") +
theme_minimal()
En construcción !
González, C. G., & Lise, A. V. (2013). Gráficos estadísticos y mapas con R. Ediciones Díaz de Santos.
Hilfiger, J. J. (2015). Graphing Data with R: An Introduction. ” O’Reilly Media, Inc.”.
Kabacoff, R. (2022). R in action: Data analysis and graphics with R and Tidyverse. Simon and Schuster.
Te invito a visitar mi canal de YouTube Link donde comparto videos sobre estadística multivariada y demografía. Si consideras que el contenido es de tu interés y utilidad, te agradecería mucho si decides suscribirte.