En esta clase se desarrollan procedimientos básicos y muy utilizados para el tratamiento de variables categóricas en R, con ejemplos aplicados al mercado laboral. La idea central es mostrar que el trabajo con variables cualitativas no consiste solo en “cambiar el tipo” de una variable, sino en decidir cómo debe representarse analíticamente.
En particular, se trabajará con cinco operaciones frecuentes:
Al finalizar la clase, serás capaz de:
cut();Nota aclaratoria: Si los paquetes utilizados en esta
guía no están instalados en el equipo, deberán instalarse previamente
con install.packages(). Una vez instalados, deberán
cargarse con la función library() al iniciar cada sesión de
trabajo.
if (!requireNamespace("dplyr", quietly = TRUE)) install.packages("dplyr")
if (!requireNamespace("forcats", quietly = TRUE)) install.packages("forcats")
if (!requireNamespace("ggplot2", quietly = TRUE)) install.packages("ggplot2")
library(dplyr)
library(forcats)
library(ggplot2)
Trabajaremos con una base pequeña, artificial y didáctica, construida con variables típicas del mercado laboral.
empleo <- data.frame(
id = 1:12,
sexo = c("Mujer", "Hombre", "Mujer", "Hombre", "Mujer", "Hombre",
"Mujer", "Hombre", "Mujer", "Hombre", "Mujer", "Hombre"),
nivel_educ = c(1, 2, 3, 2, 1, 3, 2, 1, 3, 2, 1, 3),
ingreso = c(1800000, 2500000, 3200000, 4100000, 2100000, 5300000,
2900000, 1700000, 4600000, 3500000, 2300000, 6100000),
horas = c(20, 48, 45, 52, 30, 60, 44, 25, 55, 47, 36, 58),
sector = c("Comercio", "Industria", "Servicios", "Servicios",
"Comercio", "Industria", "Servicios", "Comercio",
"Industria", "Servicios", "Comercio", "Industria")
)
empleo
## id sexo nivel_educ ingreso horas sector
## 1 1 Mujer 1 1800000 20 Comercio
## 2 2 Hombre 2 2500000 48 Industria
## 3 3 Mujer 3 3200000 45 Servicios
## 4 4 Hombre 2 4100000 52 Servicios
## 5 5 Mujer 1 2100000 30 Comercio
## 6 6 Hombre 3 5300000 60 Industria
## 7 7 Mujer 2 2900000 44 Servicios
## 8 8 Hombre 1 1700000 25 Comercio
## 9 9 Mujer 3 4600000 55 Industria
## 10 10 Hombre 2 3500000 47 Servicios
## 11 11 Mujer 1 2300000 36 Comercio
## 12 12 Hombre 3 6100000 58 Industria
str(empleo)
## 'data.frame': 12 obs. of 6 variables:
## $ id : int 1 2 3 4 5 6 7 8 9 10 ...
## $ sexo : chr "Mujer" "Hombre" "Mujer" "Hombre" ...
## $ nivel_educ: num 1 2 3 2 1 3 2 1 3 2 ...
## $ ingreso : num 1800000 2500000 3200000 4100000 2100000 5300000 2900000 1700000 4600000 3500000 ...
## $ horas : num 20 48 45 52 30 60 44 25 55 47 ...
## $ sector : chr "Comercio" "Industria" "Servicios" "Servicios" ...
A partir de esta estructura podemos observar que:
sexo y sector son variables almacenadas
como carácter, aunque conceptualmente son
cualitativas;nivel_educ es una variable numérica
codificada, pero representa categorías;ingreso y horas son variables
cuantitativas que luego transformaremos en cualitativas.Muchas variables cualitativas ingresan a R como texto. Por ejemplo:
Cuando una variable representa categorías, conviene transformarla a factor, porque así R la reconoce explícitamente como categórica. Esto afecta la forma en que se construyen tablas, gráficos y modelos.
sexo a factorclass(empleo$sexo)
## [1] "character"
empleo$sexo <- factor(empleo$sexo)
class(empleo$sexo)
## [1] "factor"
levels(empleo$sexo)
## [1] "Hombre" "Mujer"
Interpretación
La variable sexo pasó de tipo carácter a tipo factor.
Esto significa que R ya no la trata como texto libre, sino como una
variable categórica con niveles definidos.
empleo$sexo <- factor(
empleo$sexo,
levels = c("Hombre", "Mujer")
)
levels(empleo$sexo)
## [1] "Hombre" "Mujer"
Comentario
Si no se fija un orden manual, R suele ordenar los niveles alfabéticamente. Sin embargo, en algunos análisis interesa un orden sustantivo o una categoría de referencia específica.
Convertir sector en una variable factor y mostrar sus
niveles.
Solución
empleo$sector <- factor(empleo$sector)
class(empleo$sector)
## [1] "factor"
levels(empleo$sector)
## [1] "Comercio" "Industria" "Servicios"
En muchas bases de datos las variables cualitativas se almacenan como números. Por ejemplo:
Aunque estas variables estén guardadas como numéricas, su naturaleza no es cuantitativa. El número funciona como código, no como magnitud. En esos casos corresponde convertir la variable a factor y asignar etiquetas.
nivel_educSupongamos la siguiente equivalencia:
empleo$nivel_educ_cat <- factor(
empleo$nivel_educ,
levels = c(1, 2, 3),
labels = c("Primaria", "Secundaria", "Terciaria")
)
empleo$nivel_educ_cat
## [1] Primaria Secundaria Terciaria Secundaria Primaria Terciaria
## [7] Secundaria Primaria Terciaria Secundaria Primaria Terciaria
## Levels: Primaria Secundaria Terciaria
levels(empleo$nivel_educ_cat)
## [1] "Primaria" "Secundaria" "Terciaria"
Cuando las categorías tienen jerarquía natural, puede ser útil crear un factor ordenado.
empleo$nivel_educ_ord <- factor(
empleo$nivel_educ,
levels = c(1, 2, 3),
labels = c("Primaria", "Secundaria", "Terciaria"),
ordered = TRUE
)
empleo$nivel_educ_ord
## [1] Primaria Secundaria Terciaria Secundaria Primaria Terciaria
## [7] Secundaria Primaria Terciaria Secundaria Primaria Terciaria
## Levels: Primaria < Secundaria < Terciaria
is.ordered(empleo$nivel_educ_ord)
## [1] TRUE
Comentario
No toda variable numérica es cuantitativa. Si el número solo representa una etiqueta, debe tratarse como categórica.
Se dispone de una variable jornada_cod con los
siguientes códigos:
Crear un factor ordenado llamado jornada.
Solución
empleo$jornada_cod <- c(1, 2, 2, 3, 1, 3, 2, 1, 3, 2, 2, 3)
empleo$jornada <- factor(
empleo$jornada_cod,
levels = c(1, 2, 3),
labels = c("Parcial", "Completa", "Sobrecarga"),
ordered = TRUE
)
empleo$jornada
## [1] Parcial Completa Completa Sobrecarga Parcial Sobrecarga
## [7] Completa Parcial Sobrecarga Completa Completa Sobrecarga
## Levels: Parcial < Completa < Sobrecarga
Con frecuencia es útil transformar una variable cuantitativa en una categórica usando tramos previamente definidos. En el ámbito laboral esto se utiliza, por ejemplo, para construir:
La función más utilizada en R para este fin es
cut().
Queremos crear tres categorías:
empleo$tramo_ingreso <- cut(
empleo$ingreso,
breaks = c(0, 2500000, 4000000, Inf),
labels = c("Bajo", "Medio", "Alto"),
right = TRUE,
include.lowest = TRUE
)
empleo[, c("ingreso", "tramo_ingreso")]
## ingreso tramo_ingreso
## 1 1800000 Bajo
## 2 2500000 Bajo
## 3 3200000 Medio
## 4 4100000 Alto
## 5 2100000 Bajo
## 6 5300000 Alto
## 7 2900000 Medio
## 8 1700000 Bajo
## 9 4600000 Alto
## 10 3500000 Medio
## 11 2300000 Bajo
## 12 6100000 Alto
table(empleo$tramo_ingreso)
##
## Bajo Medio Alto
## 5 3 4
Interpretación
En este caso, los cortes responden a un criterio analítico fijado previamente. No dependen de la distribución de la muestra, sino de umbrales definidos por el analista.
Queremos construir la variable:
empleo$tramo_horas <- cut(
empleo$horas,
breaks = c(0, 29, 48, Inf),
labels = c("Menos de 30", "30 a 48", "Más de 48"),
right = TRUE,
include.lowest = TRUE
)
empleo[, c("horas", "tramo_horas")]
## horas tramo_horas
## 1 20 Menos de 30
## 2 48 30 a 48
## 3 45 30 a 48
## 4 52 Más de 48
## 5 30 30 a 48
## 6 60 Más de 48
## 7 44 30 a 48
## 8 25 Menos de 30
## 9 55 Más de 48
## 10 47 30 a 48
## 11 36 30 a 48
## 12 58 Más de 48
table(empleo$tramo_horas)
##
## Menos de 30 30 a 48 Más de 48
## 2 6 4
Construir una variable llamada grupo_ingreso2 con estas
categorías:
Solución
empleo$grupo_ingreso2 <- cut(
empleo$ingreso,
breaks = c(0, 2000000, 4000000, Inf),
labels = c("Hasta 2 millones", "De 2 a 4 millones", "Más de 4 millones"),
include.lowest = TRUE
)
empleo[, c("ingreso", "grupo_ingreso2")]
## ingreso grupo_ingreso2
## 1 1800000 Hasta 2 millones
## 2 2500000 De 2 a 4 millones
## 3 3200000 De 2 a 4 millones
## 4 4100000 Más de 4 millones
## 5 2100000 De 2 a 4 millones
## 6 5300000 Más de 4 millones
## 7 2900000 De 2 a 4 millones
## 8 1700000 Hasta 2 millones
## 9 4600000 Más de 4 millones
## 10 3500000 De 2 a 4 millones
## 11 2300000 De 2 a 4 millones
## 12 6100000 Más de 4 millones
table(empleo$grupo_ingreso2)
##
## Hasta 2 millones De 2 a 4 millones Más de 4 millones
## 2 6 4
A diferencia del caso anterior, aquí los cortes no se fijan por tramos sustantivos, sino por la posición relativa de cada observación en la distribución.
Esto es muy útil para construir:
En R, una estrategia habitual consiste en calcular cuantiles con
quantile() y luego utilizar esos puntos de corte en
cut().
cortes_ingreso <- quantile(
empleo$ingreso,
probs = c(0, 0.25, 0.50, 0.75, 1)
)
cortes_ingreso
## 0% 25% 50% 75% 100%
## 1700000 2250000 3050000 4225000 6100000
empleo$cuartil_ingreso <- cut(
empleo$ingreso,
breaks = cortes_ingreso,
labels = c("Q1", "Q2", "Q3", "Q4"),
include.lowest = TRUE
)
empleo[, c("ingreso", "cuartil_ingreso")]
## ingreso cuartil_ingreso
## 1 1800000 Q1
## 2 2500000 Q2
## 3 3200000 Q3
## 4 4100000 Q3
## 5 2100000 Q1
## 6 5300000 Q4
## 7 2900000 Q2
## 8 1700000 Q1
## 9 4600000 Q4
## 10 3500000 Q3
## 11 2300000 Q2
## 12 6100000 Q4
table(empleo$cuartil_ingreso)
##
## Q1 Q2 Q3 Q4
## 3 3 3 3
Interpretación
En este caso, los grupos no tienen la misma amplitud monetaria. Lo que se busca es dividir la distribución en partes con cantidades similares de observaciones.
cortes_horas <- quantile(
empleo$horas,
probs = c(0, 1/3, 2/3, 1)
)
cortes_horas
## 0% 33.33333% 66.66667% 100%
## 20.00000 41.33333 49.33333 60.00000
empleo$tercil_horas <- cut(
empleo$horas,
breaks = cortes_horas,
labels = c("Bajo", "Medio", "Alto"),
include.lowest = TRUE
)
empleo[, c("horas", "tercil_horas")]
## horas tercil_horas
## 1 20 Bajo
## 2 48 Medio
## 3 45 Medio
## 4 52 Alto
## 5 30 Bajo
## 6 60 Alto
## 7 44 Medio
## 8 25 Bajo
## 9 55 Alto
## 10 47 Medio
## 11 36 Bajo
## 12 58 Alto
table(empleo$tercil_horas)
##
## Bajo Medio Alto
## 4 4 4
Advertencia metodológica
Cuando existen muchos valores repetidos, puede ocurrir que algunos
cuantiles coincidan. En esos casos, cut() puede generar
problemas por puntos de corte duplicados. Por ello, siempre es
recomendable revisar los valores devueltos por quantile()
antes de construir la categorización.
Crear una variable de cuartiles para horas llamada
cuartil_horas.
Solución
q_horas <- quantile(empleo$horas, probs = c(0, 0.25, 0.50, 0.75, 1))
empleo$cuartil_horas <- cut(
empleo$horas,
breaks = q_horas,
labels = c("Q1", "Q2", "Q3", "Q4"),
include.lowest = TRUE
)
empleo[, c("horas", "cuartil_horas")]
## horas cuartil_horas
## 1 20 Q1
## 2 48 Q3
## 3 45 Q2
## 4 52 Q3
## 5 30 Q1
## 6 60 Q4
## 7 44 Q2
## 8 25 Q1
## 9 55 Q4
## 10 47 Q3
## 11 36 Q2
## 12 58 Q4
table(empleo$cuartil_horas)
##
## Q1 Q2 Q3 Q4
## 3 3 3 3
El orden de los niveles de un factor es importante porque puede afectar:
En R puede fijarse el orden desde factor(), pero también
puede modificarse con funciones del paquete forcats.
Queremos asegurarnos de que tramo_ingreso quede en el
orden lógico:
levels(empleo$tramo_ingreso)
## [1] "Bajo" "Medio" "Alto"
empleo$tramo_ingreso <- fct_relevel(
empleo$tramo_ingreso,
"Bajo", "Medio", "Alto"
)
levels(empleo$tramo_ingreso)
## [1] "Bajo" "Medio" "Alto"
empleo$sector_freq <- fct_infreq(empleo$sector)
levels(empleo$sector_freq)
## [1] "Comercio" "Industria" "Servicios"
table(empleo$sector_freq)
##
## Comercio Industria Servicios
## 4 4 4
Comentario
Esta opción es útil cuando se quiere presentar primero las categorías más frecuentes.
Ahora ordenaremos el sector según el ingreso promedio.
empleo$sector_ingreso <- fct_reorder(
empleo$sector,
empleo$ingreso,
.fun = mean
)
levels(empleo$sector_ingreso)
## [1] "Comercio" "Servicios" "Industria"
empleo %>%
group_by(sector_ingreso) %>%
summarise(promedio_ingreso = mean(ingreso), .groups = "drop")
## # A tibble: 3 × 2
## sector_ingreso promedio_ingreso
## <fct> <dbl>
## 1 Comercio 1975000
## 2 Servicios 3425000
## 3 Industria 4625000
Explicación conceptual
Dentro del tratamiento de variables categóricas, una tarea importante consiste en definir explícitamente una categoría de referencia en una variable de tipo factor.
Aunque en esta clase aún no se desarrollan modelos categóricos, esta operación es fundamental en la gestión de datos, ya que permite dejar preparada la base de datos para análisis posteriores y asegurar una interpretación coherente de las categorías.
La categoría de referencia es la categoría base respecto de la cual, en etapas posteriores del análisis, podrán compararse las demás. Por ello, su elección no debería ser arbitraria, sino responder a un criterio sustantivo.
En estudios del mercado laboral, algunas referencias frecuentes pueden ser:
Importancia en la gestión de datos categóricos
Definir una categoría de referencia permite:
En este sentido, la designación de una categoría de referencia puede entenderse como una forma específica de reordenación de niveles, orientada no solo a la presentación de resultados, sino también a la consistencia analítica del tratamiento de los datos.
Ejemplo aplicado al mercado laboral
Supongamos que la variable nivel_educ_cat tiene tres
categorías:
Si se desea que la categoría Primaria sea la
referencia, puede utilizarse la función relevel().
# Ver niveles actuales
levels(empleo$nivel_educ_cat)
## [1] "Primaria" "Secundaria" "Terciaria"
# Definir "Pirmaria" como categoría de referencia
empleo$nivel_educ_ref <- relevel(empleo$nivel_educ_cat, ref = "Primaria")
# Verificar el nuevo orden de niveles
levels(empleo$nivel_educ_ref)
## [1] "Primaria" "Secundaria" "Terciaria"
Interpretación
Con esta operación:
Es importante señalar que esta operación no modifica los casos observados, sino únicamente la forma en que R organiza e interpreta los niveles del factor.
Ejemplo adicional: sector de actividad
En una variable como sector, puede ser útil fijar como
referencia una categoría tradicional o sustantivamente relevante, por
ejemplo, Comercio.
# Ver niveles actuales
levels(empleo$sector)
## [1] "Comercio" "Industria" "Servicios"
# Definir "Comercio" como categoría de referencia
empleo$sector_ref <- relevel(empleo$sector, ref = "Comercio")
# Verificar el nuevo orden
levels(empleo$sector_ref)
## [1] "Comercio" "Industria" "Servicios"
Recomendación metodológica
La categoría de referencia debe elegirse de manera coherente con el objetivo del análisis. En la etapa de gestión de datos, conviene dejar explícita esta decisión, especialmente cuando se trabaja con variables que más adelante podrían utilizarse en tablas comparativas, gráficos o modelos categóricos.
Ejercicio propuesto
Tomando la variable tramo_ingreso, definir la categoría
Bajo como referencia y verificar el nuevo orden de los
niveles.
Solución
# Ver niveles actuales
levels(empleo$tramo_ingreso)
## [1] "Bajo" "Medio" "Alto"
# Definir "Bajo" como referencia
empleo$tramo_ingreso_ref <- relevel(empleo$tramo_ingreso, ref = "Bajo")
# Verificar niveles
levels(empleo$tramo_ingreso_ref)
## [1] "Bajo" "Medio" "Alto"
Idea clave para recordar
Designar una categoría de referencia es una tarea esencial en la gestión de variables categóricas, porque permite organizar los niveles del factor de manera consistente y dejar preparada la base para análisis comparativos posteriores.
A continuación se presenta una nueva base de datos ficticia con información de personas ocupadas. El objetivo es aplicar de manera integrada algunos de los principales procedimientos de gestión de variables categóricas en R.
La base contiene las siguientes variables:
tipo_empleo: tipo de empleo, registrado como texto con
las categorías Formal e Informal;categoria_ocup: categoría de ocupación, registrada
numéricamente con la siguiente codificación:
salario: ingreso laboral mensual;anios_estudio: años de estudio aprobados, medidos
cuantitativamente entre 1 y 18.library(dplyr)
library(forcats)
ocupacion <- data.frame(
id = 1:15,
tipo_empleo = c("Formal", "Informal", "Formal", "Formal", "Informal",
"Formal", "Informal", "Formal", "Informal", "Formal",
"Formal", "Informal", "Formal", "Informal", "Formal"),
categoria_ocup = c(2, 2, 1, 2, 3, 1, 3, 2, 2, 1, 2, 3, 1, 2, 2),
salario = c(3200000, 1800000, 4500000, 3800000, 1500000,
5200000, 1700000, 2900000, 2100000, 4800000,
3500000, 1600000, 6000000, 2400000, 3300000),
anios_estudio = c(12, 6, 17, 14, 5, 18, 8, 11, 7, 16, 13, 4, 15, 9, 12)
)
ocupacion
## id tipo_empleo categoria_ocup salario anios_estudio
## 1 1 Formal 2 3200000 12
## 2 2 Informal 2 1800000 6
## 3 3 Formal 1 4500000 17
## 4 4 Formal 2 3800000 14
## 5 5 Informal 3 1500000 5
## 6 6 Formal 1 5200000 18
## 7 7 Informal 3 1700000 8
## 8 8 Formal 2 2900000 11
## 9 9 Informal 2 2100000 7
## 10 10 Formal 1 4800000 16
## 11 11 Formal 2 3500000 13
## 12 12 Informal 3 1600000 4
## 13 13 Formal 1 6000000 15
## 14 14 Informal 2 2400000 9
## 15 15 Formal 2 3300000 12
A partir de la base ocupacion, realizar las siguientes
tareas:
tipo_empleo, actualmente
registrada como texto, a una variable de tipo factor.categoria_ocup, actualmente
registrada como numérica, a una variable categórica con las etiquetas:
anios_estudio en una nueva
variable cualitativa llamada nivel_educativo, con las
siguientes categorías:
nivel_educativo para que
queden en el orden:
Nota metodológica sobre el uso de funciones en R
Para el desarrollo de este ejercicio se emplea la librería
dplyr, en particular la función mutate(), como
una alternativa para la gestión y transformación de datos. Su uso
permite generar nuevas variables o modificar variables existentes de
manera clara, ordenada y consistente dentro del proceso de preparación
de datos categóricos.
ocupacion <- ocupacion %>%
mutate(
# 1. Conversión de carácter a factor
tipo_empleo = factor(tipo_empleo),
# 2. Conversión de numérico a factor con etiquetas
categoria_ocup = factor(
categoria_ocup,
levels = c(1, 2, 3),
labels = c("Público", "Privado", "Doméstico")
),
# 3. Transformación de variable cuantitativa a cualitativa
nivel_educativo = cut(
anios_estudio,
breaks = c(0, 6, 12, 18),
labels = c("Primaria", "Secundaria", "Terciaria"),
include.lowest = TRUE,
right = TRUE
)
)
ocupacion <- ocupacion %>%
mutate(
nivel_educativo = fct_relevel(
nivel_educativo,
"Primaria", "Secundaria", "Terciaria"
)
)
ocupacion
## id tipo_empleo categoria_ocup salario anios_estudio nivel_educativo
## 1 1 Formal Privado 3200000 12 Secundaria
## 2 2 Informal Privado 1800000 6 Primaria
## 3 3 Formal Público 4500000 17 Terciaria
## 4 4 Formal Privado 3800000 14 Terciaria
## 5 5 Informal Doméstico 1500000 5 Primaria
## 6 6 Formal Público 5200000 18 Terciaria
## 7 7 Informal Doméstico 1700000 8 Secundaria
## 8 8 Formal Privado 2900000 11 Secundaria
## 9 9 Informal Privado 2100000 7 Secundaria
## 10 10 Formal Público 4800000 16 Terciaria
## 11 11 Formal Privado 3500000 13 Terciaria
## 12 12 Informal Doméstico 1600000 4 Primaria
## 13 13 Formal Público 6000000 15 Terciaria
## 14 14 Informal Privado 2400000 9 Secundaria
## 15 15 Formal Privado 3300000 12 Secundaria
str(ocupacion)
## 'data.frame': 15 obs. of 6 variables:
## $ id : int 1 2 3 4 5 6 7 8 9 10 ...
## $ tipo_empleo : Factor w/ 2 levels "Formal","Informal": 1 2 1 1 2 1 2 1 2 1 ...
## $ categoria_ocup : Factor w/ 3 levels "Público","Privado",..: 2 2 1 2 3 1 3 2 2 1 ...
## $ salario : num 3200000 1800000 4500000 3800000 1500000 5200000 1700000 2900000 2100000 4800000 ...
## $ anios_estudio : num 12 6 17 14 5 18 8 11 7 16 ...
## $ nivel_educativo: Factor w/ 3 levels "Primaria","Secundaria",..: 2 1 3 3 1 3 2 2 2 3 ...
levels(ocupacion$tipo_empleo)
## [1] "Formal" "Informal"
levels(ocupacion$categoria_ocup)
## [1] "Público" "Privado" "Doméstico"
levels(ocupacion$nivel_educativo)
## [1] "Primaria" "Secundaria" "Terciaria"
Tablas de frecuencia
table(ocupacion$tipo_empleo)
##
## Formal Informal
## 9 6
table(ocupacion$categoria_ocup)
##
## Público Privado Doméstico
## 4 8 3
table(ocupacion$nivel_educativo)
##
## Primaria Secundaria Terciaria
## 3 6 6
En este ejercicio se integran tres procedimientos fundamentales en el tratamiento de variables categóricas:
Asimismo, se incorpora la reordenación de niveles, lo cual permite dejar la variable categórica organizada de forma coherente para su posterior utilización en tablas, gráficos y análisis estadísticos.
El tratamiento de variables categóricas en R no es solo un asunto técnico. Implica tomar decisiones analíticas sobre cómo representar la realidad observada. Una misma variable puede tener almacenamiento numérico, pero significado cualitativo. Del mismo modo, una variable cuantitativa puede recategorizarse de formas distintas según el propósito del análisis.
En estudios del mercado laboral, estas decisiones son especialmente importantes porque afectan la forma en que se describen y comunican fenómenos como la educación, la inserción ocupacional, los ingresos y las jornadas de trabajo.
Nota metodológica: La presente guía fue elaborada con apoyo de herramientas de inteligencia artificial generativa, específicamente ChatGPT de OpenAI, como asistencia en la estructuración y redacción del material. La selección de contenidos, la validación conceptual y la revisión final son responsabilidad del docente.
R Core Team. R: A language and environment for statistical computing. Vienna: R Foundation for Statistical Computing.
Wickham, H. et al. dplyr: A Grammar of Data Manipulation.
Wickham, H. forcats: Tools for Working with Categorical Variables.
Wickham, H. ggplot2: Elegant Graphics for Data Analysis.