Unidad 3: Descripción y Visualización de Datos
2025-09-29
case_when().pivot_longer()).left_join().En la clase anterior, aprendimos la “gramática” de dplyr para manipular tablas:
select() para columnas.filter() para filas.arrange() para ordenar.group_by() + summarise() para resúmenes por grupo.Hoy nos enfocaremos en el verbo más creativo, mutate(), y en tareas más avanzadas: crear nuevas variables a partir de condiciones, cambiar la forma de nuestras tablas y unir diferentes bases de datos.
ifelse() vs. case_when()Para crear variables basadas en condiciones, tenemos dos herramientas principales:
ifelse()
ifelse(condicion, valor_si_verdadero, valor_si_falso)case_when() en Acción: Creando Tramos de Edadcase_when() se lee como una serie de instrucciones lógicas. R evalúa cada condición en orden y asigna el valor de la primera que sea TRUE.
Sintaxis y Lógica:
~ (tilde) se lee como “entonces asigna este valor”.& significa que ambas condiciones deben ser verdaderas.TRUE ~ ...: Esta última línea es una “catch-all” o cláusula por defecto. Si ninguna de las condiciones anteriores se cumple, se asignará este valor. Es una muy buena práctica incluirla siempre.A menudo, un solo indicador (una sola pregunta de encuesta) no es suficiente para capturar la complejidad de un concepto sociológico. Para medir fenómenos como “bienestar social”, “precariedad laboral” o “capital cultural”, necesitamos combinar múltiples indicadores.
“(…) el conjunto de herramientas metodológicas que pretenden cuantificar de modo sintético las características de fenómenos sociales complejos, no directamente observables por la vía de las estadísticas sociales tradicionalmente disponibles…” (Márquez, 2006).
En esta sección, veremos dos formas de construir estas nuevas variables compuestas: Índices y Tipologías. La herramienta principal para crearlas en R seguirá siendo mutate().
Un índice es una variable compuesta, generalmente numérica, que se crea a partir de la suma o promedio de varios indicadores.
Indicadores de la BMSLSS:
1. Satisfacción con la vida familiar.
2. Satisfacción con los amigos/as.
3. Satisfacción con el barrio.
4. Satisfacción con la experiencia en el colegio.
5. Satisfacción contigo mismo/a.
6. Satisfacción con toda tu vida en general.
El índice se construye promediando las respuestas de estos 6 ítems para obtener un puntaje global de satisfacción.
Una tipología es una variable categórica (nominal u ordinal) que se crea al cruzar dos o más variables para clasificar a las observaciones en “tipos” o “perfiles” cualitativamente distintos.
La creación de una tipología es la aplicación perfecta de case_when() con condiciones complejas unidas por el operador &. El código traduce directamente las reglas de la matriz de clasificación.
# Ejemplo conceptual para crear la variable GSE
# (suponiendo que educ_psh y ocu_psh son numéricas y están codificadas según el manual de AIM)
datos %>%
mutate(
gse = case_when(
# Condición para el grupo AB (el más alto)
educ_psh >= 5 & ocu_psh >= 6 & tramo_ingreso == "YPCE7" ~ "AB",
# Dos ejemplos de condiciones para el grupo C1a
educ_psh >= 5 & ocu_psh >= 5 & tramo_ingreso == "YPCE6" ~ "C1a",
educ_psh == 4 & ocu_psh >= 6 & tramo_ingreso == "YPCE7" ~ "C1a",
# ... (y así sucesivamente para todas las demás combinaciones de la matriz)...
# Una regla por defecto para los casos que no calcen en ninguna categoría
TRUE ~ "Sin clasificación"
)
)tidyrA veces, los datos no vienen en formato “ordenado” (tidy). Un problema común es el formato ancho, donde los valores de una misma variable se distribuyen en múltiples columnas.
Ejemplo: Datos de panel sobre satisfacción con la vida.
| id | satisfaccion_2020 | satisfaccion_2021 | satisfaccion_2022 |
|---|---|---|---|
| 1 | 7 | 8 | 8 |
| 2 | 5 | 5 | 6 |
| 3 | 9 | 8 | 7 |
Problema: Este formato es difícil de analizar. No podemos, por ejemplo, calcular fácilmente la satisfacción promedio por año o graficar la evolución en el tiempo. “Año” está atrapado en los nombres de las columnas.
pivot_longer()El paquete tidyr (parte del Tidyverse) nos permite reestructurar datos. La función pivot_longer() convierte los datos de formato ancho a largo (formato tidy).
Lógica: “Toma estas columnas, y pon sus nombres en una nueva columna y sus valores en otra”.
Sintaxis: datos %>% pivot_longer(cols = columnas_a_unir, names_to = "nombre_nueva_col_categoria", values_to = "nombre_nueva_col_valor")
pivot_longer() en Acción: El ResultadoLa tabla se transforma, y ahora sí está en formato ordenado (tidy).
Tabla Original (Ancha):
| id | satisfaccion_2020 | satisfaccion_2021 | satisfaccion_2022 |
|---|---|---|---|
| 1 | 7 | 8 | 8 |
| 2 | 5 | 5 | 6 |
pivot_longer() en Acción: El ResultadoTabla Transformada (Larga):
| id | año | satisfaccion |
|---|---|---|
| 1 | satisfaccion_2020 | 7 |
| 1 | satisfaccion_2021 | 8 |
| 1 | satisfaccion_2022 | 8 |
| 2 | satisfaccion_2020 | 5 |
| 2 | satisfaccion_2021 | 5 |
Ahora, “año” y “satisfacción” son variables en sus propias columnas, lo que facilita enormemente el análisis (ej. group_by(año) %>% summarise(...)) y la visualización.
dplyrRara vez toda la información que necesitamos está en una sola tabla. En la investigación real, es muy común tener que combinar o cruzar diferentes fuentes de datos.
Ejemplos sociológicos:
key)Para que R sepa cómo conectar las filas de dos tablas, necesita una (o más) variables “llave” (key).
Ejemplos de llaves:
folio: Para unir personas con sus hogares.id_comuna: Para unir datos de encuestas con datos comunales.RUT: Para unir registros administrativos de una misma persona.La calidad de la unión depende de la calidad de la llave.
left_join(): La Unión más ComúnLas funciones _join() de dplyr nos permiten combinar tablas. La más utilizada es left_join().
Lógica: “Toma todas las filas de la tabla de la izquierda (x) y pégale la información de la tabla de la derecha (y) que coincida según la llave”.
Sintaxis: left_join(tabla_izquierda, tabla_derecha, by = "nombre_variable_llave")
NA.joinsdplyr ofrece una familia completa de joins para diferentes necesidades.
inner_join(x, y): Se queda únicamente con las filas que tienen correspondencia en ambas tablas. Es útil para “limpiar” datos y trabajar solo con los casos completos.full_join(x, y): Se queda con todas las filas de ambas tablas, rellenando con NA donde no hay correspondencia.anti_join(x, y): Una herramienta de diagnóstico muy poderosa. Devuelve todas las filas de la tabla izquierda que NO tienen correspondencia en la tabla derecha. Es ideal para encontrar problemas de codificación en las llaves.
Resumen de la sesión de hoy:
case_when().pivot_longer()._join().En el práctico de hoy:
case_when, pivot_longer, left_join) en ejercicios prácticos con la Encuesta ELPI 2017.Adelanto de la Unidad 4: - ¡Ahora que tenemos los datos listos, comenzaremos a analizarlos! La próxima unidad se centrará en la Estadística Descriptiva Univariada.
