OFC Herramientas Cuantitativas para el Análisis de Datos
Ciencia Política y Relaciones Internacionales UAH
Conceptos centrales
La visualización de datos transforma información compleja en formas más simples de interpretar. Su función es explorar, analizar y comunicar; no existe un gráfico “correcto” único: la elección siempre es una decisión metodológica que depende del dato, el contexto y el receptor.
Antes de graficar es necesario identificar el tipo de variable, porque de eso depende el gráfico adecuado:
| Tipo de variable | Ejemplos |
|---|---|
| Categórica nominal | Sexo, región, partido político |
| Categórica ordinal | Nivel educativo, estrato socioeconómico |
| Cuantitativa discreta | Número de hijos, número de encuestados |
| Cuantitativa continua | Ingreso, edad, tasa de rotación laboral |
La pregunta metodológica orienta el tipo de gráfico:
| Pregunta metodológica | Gráfico sugerido |
|---|---|
| ¿Cómo se distribuye una variable? | Histograma, boxplot, violín |
| ¿Cuántos casos hay por categoría (frecuencia)? | Gráfico de barras |
| ¿Cómo se comparan grupos? | Barras, boxplot |
| ¿Cómo se relacionan dos variables? | Gráfico de dispersión |
| ¿Cómo cambia algo a través del tiempo? | Gráfico de líneas |
Correlación no implica causalidad. Un patrón conjunto entre dos variables (correlación) no explica por qué ocurre. Omitir este matiz puede llevar a correlaciones espurias y a conclusiones erróneas al comunicar resultados.
Sintaxis fundamental de ggplot2
ggplot2 construye gráficos por capas, agregadas con +:
ggplot(datos, aes(x = variable)) + # Capa 1: datos y mapeo estético
geom_histogram() + # Capa 2: forma geométrica
labs(title = "Título", x = "Eje x", y = "Eje y") + # Capa 3: etiquetas
theme_minimal(base_size = 13) # Capa 4: tema visualaes()mapea variables del data frame a elementos visuales:x,y,fill,color.- El orden de las capas no altera el resultado, pero conviene mantener una secuencia legible: datos → geometría → escalas/facetas → etiquetas → tema.
facet_wrap(~ variable)separa el gráfico en paneles según una variable categórica, útil para comparar distribuciones entre grupos.coord_flip()invierte los ejes (barras horizontales, más legibles con muchas categorías).
Transformaciones previas a la visualización
Factor ordenado, para fijar el orden de categorías en los gráficos:
datos <- datos %>%
mutate(
variable_tipo = factor(variable_tipo,
levels = c("Nivel 1", "Nivel 2", "Nivel 3"),
ordered = TRUE)
)Construcción de fechas a partir de año y mes (requiere lubridate):
meses_ordenados <- c("enero", "febrero", "marzo", ...)
datos <- datos %>%
mutate(
mes_num = match(mes, meses_ordenados),
fecha = ym(paste(anio, mes_num))
)Resumir por grupo antes de graficar barras o líneas:
resumen <- datos %>%
filter(anio >= 2022) %>%
group_by(categoria) %>%
summarise(promedio = mean(variable, na.rm = TRUE))Reordenar categorías de mayor a menor según un valor (mejora la lectura de las barras):
fct_reorder(categoria, valor)Ejemplos mínimos por tipo de gráfico
Histograma — distribución de una variable cuantitativa:
ggplot(datos, aes(x = variable_continua)) +
geom_histogram(binwidth = 2, fill = "#2C7FB8", color = "white")Barras — comparación entre categorías (usar geom_col() cuando el valor ya está resumido):
ggplot(resumen,
aes(x = fct_reorder(categoria, promedio), y = promedio, fill = signo)) +
geom_col() +
coord_flip()Boxplot — distribución comparada entre grupos:
ggplot(datos, aes(x = grupo, y = variable_continua, fill = subgrupo)) +
geom_boxplot()Violín — igual que el boxplot, añadiendo la densidad de probabilidad:
ggplot(datos, aes(x = grupo, y = variable_continua, fill = subgrupo)) +
geom_violin()Líneas — evolución de una variable en el tiempo:
ggplot(serie, aes(x = fecha, y = valor)) +
geom_line(color = "#2008d4") +
geom_point(color = "#0a0342")Dispersión — relación entre dos variables continuas, con línea de tendencia:
ggplot(datos, aes(x = variable_x, y = variable_y)) +
geom_point() +
geom_smooth(method = lm)Elegir el gráfico correcto
| Gráfico | Se usa para | Fortaleza principal | Limitación principal |
|---|---|---|---|
| Histograma | Distribución de una variable cuantitativa continua | Detecta concentración, asimetrías y valores extremos | Sensible al binwidth; no sirve para variables categóricas |
| Barras | Comparar categorías o frecuencias | Fácil de interpretar; funciona bien en comunicación pública | Muchas categorías generan saturación visual |
| Boxplot | Comparar distribución entre grupos | Resume mediana, cuartiles y rango; estandariza la comparación | No muestra la forma completa de la densidad |
| Violín | Comparar distribución entre grupos con densidad | Añade estimación de densidad de probabilidad | Menos intuitivo para audiencias no técnicas |
| Líneas | Evolución de una variable en el tiempo | Identifica tendencias y puntos de inflexión | Confuso con muchas series; requiere estructura temporal continua |
| Dispersión | Relación entre dos variables | Muestra sentido de la asociación y detecta atípicos | Correlación no implica causalidad |
Nota: un histograma no es un gráfico de barras. El histograma agrupa datos cuantitativos continuos en rangos (sin espacio entre barras); el gráfico de barras compara categorías discretas (con espacio entre barras).
Funciones principales
| Función | Paquete | Uso |
|---|---|---|
ggplot() |
ggplot2 | Inicia el gráfico y define datos/estética |
aes() |
ggplot2 | Mapea variables a elementos visuales |
geom_histogram() |
ggplot2 | Histograma |
geom_col() |
ggplot2 | Barras a partir de valores ya resumidos |
geom_boxplot() |
ggplot2 | Diagrama de caja |
geom_violin() |
ggplot2 | Diagrama de violín |
geom_line() |
ggplot2 | Gráfico de líneas |
geom_point() |
ggplot2 | Puntos / dispersión |
geom_smooth(method = lm) |
ggplot2 | Línea de tendencia (regresión lineal) |
facet_wrap(~ variable) |
ggplot2 | Paneles por categoría |
coord_flip() |
ggplot2 | Invierte ejes x/y |
labs() |
ggplot2 | Títulos y etiquetas de ejes/leyenda |
theme_minimal() |
ggplot2 | Tema visual limpio |
fct_reorder() |
forcats | Reordena niveles de un factor según otra variable |
ym() |
lubridate | Construye una fecha a partir de año y mes |
cor() |
stats | Calcula el coeficiente de correlación |
Aplicación sobre un data frame
Flujo típico de trabajo, de la importación al gráfico:
# 1. Importar y revisar
datos <- read_excel("archivo.xlsx")
glimpse(datos)
# 2. Preparar variables (factor ordenado, fechas)
datos <- datos %>%
mutate(
categoria = factor(categoria, levels = c("A", "B", "C"), ordered = TRUE),
fecha = ym(paste(anio, mes_num))
)
# 3. Resumir si el gráfico lo requiere (barras, líneas)
resumen <- datos %>%
group_by(categoria) %>%
summarise(promedio = mean(variable, na.rm = TRUE))
# 4. Graficar y etiquetar
ggplot(resumen, aes(x = fct_reorder(categoria, promedio), y = promedio)) +
geom_col() +
coord_flip() +
labs(title = "Título descriptivo", x = NULL, y = "Unidad de medida") +
theme_minimal(base_size = 13)Para evaluar la relación entre dos variables continuas, cor() entrega el coeficiente de correlación (rango -1 a 1):
cor(datos$variable_x, datos$variable_y)Filtrar el data frame antes de calcular la correlación permite comparar subgrupos (por ejemplo, un subconjunto de países o un periodo específico):
subgrupo <- datos %>% filter(categoria %in% c("A", "B", "C"))
cor(subgrupo$variable_x, subgrupo$variable_y)Referencia rápida
Visualizar
| Quiero hacer | Código |
|---|---|
| Histograma | ggplot(datos, aes(x = var)) + geom_histogram(binwidth = n) |
| Barras a partir de resumen | ggplot(datos, aes(x = cat, y = valor)) + geom_col() |
| Boxplot | ggplot(datos, aes(x = grupo, y = var, fill = sub)) + geom_boxplot() |
| Violín | ggplot(datos, aes(x = grupo, y = var, fill = sub)) + geom_violin() |
| Líneas | ggplot(datos, aes(x = fecha, y = valor)) + geom_line() |
| Dispersión con tendencia | ggplot(datos, aes(x = x, y = y)) + geom_point() + geom_smooth(method = lm) |
| Separar en paneles | + facet_wrap(~ variable, ncol = n) |
| Invertir ejes (barras horizontales) | + coord_flip() |
| Añadir títulos y etiquetas | + labs(title = "...", x = "...", y = "...") |
| Aplicar tema limpio | + theme_minimal(base_size = 13) |
Transformar y preparar
| Quiero hacer | Código |
|---|---|
| Crear factor ordenado | factor(var, levels = c(...), ordered = TRUE) |
| Construir fecha desde año/mes | ym(paste(anio, mes_num)) |
| Ubicar posición de un valor en un vector | match(valor, vector_referencia) |
| Reordenar categorías según un valor | fct_reorder(categoria, valor) |
| Filtrar filas | filter(condicion) |
| Agregar una fila manualmente | add_row(col1 = valor1, col2 = valor2) |
Resumir
| Quiero hacer | Código |
|---|---|
| Agrupar y promediar | group_by(var) %>% summarise(prom = mean(valor, na.rm = TRUE)) |
| Ver estructura del data frame | glimpse(datos) |
| Ver valores únicos de una variable | unique(datos$var) |
| Ver estadísticas descriptivas | summary(datos) |
Comparar
| Quiero hacer | Código |
|---|---|
| Calcular correlación entre dos variables | cor(datos$x, datos$y) |
| Comparar distribución entre grupos | geom_boxplot() o geom_violin() con fill = grupo |
| Comparar categorías por magnitud | geom_col() con fct_reorder() |
Importar
| Quiero hacer | Código |
|---|---|
| Cargar librerías necesarias | pacman::p_load(readxl, tidyverse, dplyr, stringr, tidyr, janitor, ggplot2, scales, forcats, lubridate, plotly) |
| Leer archivo Excel | read_excel("archivo.xlsx") |
| Ver el data frame completo | View(datos) |
# Sintaxis que conviene recordar
ggplot(datos, aes(x = var_x, y = var_y, fill = grupo)) +
geom_TIPO() +
facet_wrap(~ variable) +
coord_flip() +
labs(title = "...", subtitle = "...", x = "...", y = "...", fill = "...") +
theme_minimal(base_size = 13)