La recodificación de variables es una tarea esencial en
el análisis de datos que nos permite transformar datos continuos en categorías
más interpretables, facilitando tanto el análisis como la visualización. En
este artículo, exploraremos diferentes técnicas para recodificar variables
utilizando el poderoso ecosistema tidyverse en R.
1. Preparación
del entorno
Primero, cargamos las librerías necesarias y el conjunto
de datos con el que trabajaremos:
# Cargamos las
librerías necesarias para manipulación de datos
library(tidyselect) # Para selección avanzada de variables
library(wooldridge) # Paquete con datos de ejemplos
econométricos
# Cargamos el
dataset wage1 (datos sobre salarios)
data("wage1")
# Visualizamos los
datos
wage1 |> View()
El conjunto de datos wage1 contiene información sobre
salarios, educación, experiencia laboral y otras variables socioeconómicas.
Antes de cualquier recodificación, resulta útil explorar la relación entre las
variables existentes.
2. Exploración
visual previa
Primero, examinemos la relación entre los años de
educación (educ), el logaritmo del salario (lwage) y el género (female) (es siempre muy importante estudiar las relaciones y las características
de las variables):
# Visualizamos la
relación entre educación y salario por género
wage1 |>
# dplyr::filter(educ<=5) |>
ggplot(aes(x=educ,
y=lwage, color=factor(female))) +
geom_point() +
geom_jitter(width = 0.4, height = 0, alpha = 0.6)
+
geom_smooth(method = "lm")
Este gráfico nos muestra cómo el logaritmo del salario
tiende a aumentar con los años de educación, y cómo esta relación varía según
el género. La función geom_jitter() añade una pequeña dispersión horizontal
para evitar la superposición de puntos, mejorando la visualización.
3. Recodificación
Categórica con case_when()
La primera estrategia que exploraremos utiliza la función
case_when() para crear categorías educativas basadas en rangos de años de
estudio:
# Opción 1:
Recodificación arbitraria basada en niveles educativos estándar
wage1 <- wage1 |>
mutate(rango_Educ = case_when(
educ == 0 ~ "0 esco", # Sin escolaridad
educ >= 1 & educ <= 6 ~ "Primaria", # Educación primaria (1-6 años)
educ >= 7 & educ <= 12 ~ "aSecundaria",
# Educación secundaria (7-12 a)
educ >= 13 ~ "Terciaria" # Educación superior (13+ años)
),
# Convertimos a factor con orden específico
rango_Educ = factor(rango_Educ, levels = c("0
esco", "Primaria", "aSecundaria", "Terciaria"))
)
Esta recodificación utiliza case_when() para crear
categorías educativas significativas. La función evalúa cada condición
secuencialmente y asigna la categoría correspondiente. Luego, convertimos la
nueva variable en un factor ordenado para mantener la jerarquía natural de los
niveles educativos.
Visualicemos cómo se relacionan estos rangos educativos
con el salario:
# Visualizamos la mediante
boxplots
wage1 |>
ggplot(aes(x=rango_Educ, y=wage)) +
geom_boxplot()
Los diagramas de caja nos permiten comparar la
distribución salarial entre los diferentes niveles educativos, mostrando la
mediana, los cuartiles y los valores atípicos para cada grupo.
4. Recodificación
por Cuantiles con ntile()
Una alternativa a la categorización arbitraria es dividir
los datos en cuantiles utilizando la función ntile():
# Opción 2:
Recodificación basada en quintiles (divide los datos en 5 grupos de igual
tamaño)
wage1 <- wage1 |>
mutate(rango_Educ2 = ntile(educ, 5))
Esta técnica divide la variable educ en cinco grupos con
aproximadamente el mismo número de observaciones en cada uno. Es especialmente
útil cuando buscamos crear grupos balanceados sin imponer puntos de corte
arbitrarios.
Visualicemos esta nueva categorización:
# Visualizamos la
relación entre quintiles educativos y salario
wage1 |>
ggplot(aes(x=factor(rango_Educ2), y=wage)) +
geom_boxplot()
Finalmente, calculemos algunas estadísticas por grupo
para evaluar las diferencias entre los quintiles educativos:
# Calculamos
estadísticas descriptivas por quintil educativo
wage1 |>
group_by(rango_Educ2) |>
summarise(obs = n(), # Número de observaciones
meand_educ = mean(wage, na.rm=T), # Salario medio
vol_educ =
meand_educ/sd(wage, na.rm=T))
Este análisis nos proporciona el número de observaciones,
el salario medio y una medida de volatilidad relativa para cada quintil
educativo.
5. Recodificación
con intervalos específicos usando cut()
La función cut() nos permite dividir una variable
numérica en intervalos específicos, ofreciendo mayor control sobre los puntos
de corte:
# Opción 3:
Recodificación con intervalos específicos usando cut()
wage1 <- wage1
|>
mutate(rango_Educ3 = cut(educ,
breaks = c(0, 6, 12, 16,
Inf), # Puntos de corte específicos
labels = c("Básica",
"Media", "Universitaria", "Posgrado"),
include.lowest = TRUE, # Incluye el valor mínimo
right =
FALSE)) # Intervalos cerrados a la
izquierda
# Visualizamos la
nueva categorización
wage1 |>
ggplot(aes(x=rango_Educ3, y=wage)) +
geom_boxplot() +
labs(title = "Distribución de salarios
por nivel educativo",
x = "Nivel educativo",
y = "Salario por hora ($)")
Esta técnica nos permite definir manualmente los límites
de cada categoría, lo que es ideal cuando tenemos umbrales específicos basados
en conocimiento del dominio (como los niveles educativos estándar). El
parámetro include.lowest = TRUE asegura que el valor mínimo (0 en este caso) se
incluya en el primer intervalo, mientras que right = FALSE define intervalos
cerrados a la izquierda.
6. Creación
de variables dummy con if_else()
Para análisis estadísticos como regresiones, a menudo
necesitamos variables binarias (0/1):
# Opción 4: Creación
de variables dummy utilizando if_else()
wage1 <- wage1
|>
mutate(
# Educación superior (binaria)
educ_superior = if_else(educ >= 13, 1,
0),
# Alta experiencia (binaria)
exper_alta = if_else(exper >
median(exper), 1, 0),
# Interacción entre educación superior y
género
educ_sup_mujer = educ_superior * female
)
# Visualizamos el
efecto de la educación superior en el salario por género
wage1 |>
ggplot(aes(x = factor(educ_superior), y =
wage, fill = factor(female))) +
geom_boxplot() +
labs(title = "Efecto de educación
superior en salarios por género",
x = "Educación superior",
y = "Salario por hora ($)",
fill = "Mujer")
La función if_else() es perfecta para crear variables
binarias, ya que evalúa una condición y asigna un valor para los casos
verdaderos y otro para los falsos. En este ejemplo, creamos indicadores para
educación superior, alta experiencia, y una interacción entre educación superior
y género.
7. Normalización
para análisis de desviaciones estándar
La normalización nos permite expresar los valores en
términos de cuántas desviaciones estándar se alejan de la media:
# Opción 5:
Normalización de variables para análisis de desviaciones estándar
wage1 <- wage1 |>
mutate(
# Z-score de educación (normalización)
educ_z = (educ - mean(educ)) / sd(educ),
# Z-score de experiencia
exper_z = (exper - mean(exper)) / sd(exper),
# Z-score de salario
wage_z = (wage - mean(wage)) / sd(wage)
)
# Visualizamos
distribución de valores normalizados
wage1 |>
select(educ_z, exper_z, wage_z) |>
pivot_longer(cols = everything(), names_to = "variable",
values_to = "valor_z") |>
ggplot(aes(x = valor_z, fill = variable)) +
geom_density(alpha = 0.5) +
geom_vline(xintercept = 0, linetype = "dashed")
+
labs(title = "Distribución de variables
normalizadas",
x = "Desviaciones estándar desde la
media",
y = "Densidad")
La normalización (cálculo de z-scores) convierte los
valores a una escala común donde 0 representa la media y cada unidad representa
una desviación estándar. Esto facilita la comparación de variables con
diferentes unidades o escalas, y es especialmente útil para identificar valores
atípicos y para ciertos modelos estadísticos.