R

R

Tutorial R: Gráficos bivariantes en R

Aprende a crear y personalizar gráficos bivariantes en R para analizar relaciones entre variables con diagramas de dispersión y matrices de correlación.

Aprende R y certifícate

Diagramas de dispersión (scatter plots)

Los diagramas de dispersión son una de las herramientas más útiles para visualizar la relación entre dos variables numéricas. Estos gráficos representan cada observación como un punto en un plano cartesiano, donde la posición en el eje X corresponde al valor de una variable y la posición en el eje Y al valor de la otra.

Creación básica de diagramas de dispersión

En R, podemos crear diagramas de dispersión de forma sencilla utilizando la función plot(). Esta función forma parte del paquete base de R, por lo que no necesitamos instalar paquetes adicionales para empezar.

Veamos un ejemplo básico utilizando el conjunto de datos mtcars, que viene incluido en R:

# Diagrama de dispersión básico
plot(mtcars$wt, mtcars$mpg)

Este código genera un gráfico que muestra la relación entre el peso de los coches (wt, en miles de libras) y su consumo de combustible (mpg, millas por galón). Cada punto representa un modelo de coche diferente.

Para mejorar la interpretación del gráfico, podemos añadir títulos y etiquetas a los ejes:

plot(mtcars$wt, mtcars$mpg,
     main = "Relación entre peso y consumo",
     xlab = "Peso (miles de libras)",
     ylab = "Consumo (millas por galón)",
     pch = 16)  # pch cambia el tipo de punto

El parámetro pch (plot character) nos permite cambiar el tipo de símbolo utilizado para los puntos. Algunos valores comunes son:

  • pch = 1: círculo vacío (predeterminado)
  • pch = 16: círculo relleno
  • pch = 2: triángulo vacío
  • pch = 17: triángulo relleno

Personalización de los puntos

Podemos personalizar aún más nuestro diagrama de dispersión modificando el color, tamaño y transparencia de los puntos:

plot(mtcars$wt, mtcars$mpg,
     main = "Relación entre peso y consumo",
     xlab = "Peso (miles de libras)",
     ylab = "Consumo (millas por galón)",
     pch = 16,
     col = "blue",         # Color de los puntos
     cex = 1.5)            # Tamaño de los puntos (1 es el tamaño normal)

Si queremos diferenciar los puntos según una tercera variable categórica, podemos asignar colores diferentes:

# Coloreamos según el número de cilindros
cylinders <- as.factor(mtcars$cyl)
plot(mtcars$wt, mtcars$mpg,
     main = "Relación entre peso y consumo por cilindros",
     xlab = "Peso (miles de libras)",
     ylab = "Consumo (millas por galón)",
     pch = 16,
     col = cylinders)      # Asigna un color por cada nivel del factor

# Añadimos una leyenda
legend("topright", 
       legend = levels(cylinders),
       col = 1:length(levels(cylinders)),
       pch = 16,
       title = "Cilindros")

Identificación de patrones

Los diagramas de dispersión nos permiten identificar varios tipos de patrones en los datos:

  • Correlación positiva: cuando una variable aumenta, la otra también tiende a aumentar
  • Correlación negativa: cuando una variable aumenta, la otra tiende a disminuir
  • Sin correlación: no hay un patrón claro entre las variables
  • Agrupaciones: puntos que se concentran en ciertas áreas del gráfico
  • Valores atípicos: puntos que se alejan significativamente del patrón general

En nuestro ejemplo de mtcars, podemos observar una correlación negativa entre el peso y el consumo: a mayor peso del coche, menor rendimiento de combustible (menos millas por galón).

Añadiendo líneas de tendencia

Para visualizar mejor la relación entre variables, podemos añadir una línea de tendencia (o línea de regresión) a nuestro diagrama:

# Creamos el diagrama de dispersión
plot(mtcars$wt, mtcars$mpg,
     main = "Relación entre peso y consumo",
     xlab = "Peso (miles de libras)",
     ylab = "Consumo (millas por galón)",
     pch = 16)

# Añadimos una línea de tendencia lineal
modelo <- lm(mpg ~ wt, data = mtcars)
abline(modelo, col = "red", lwd = 2)

La función lm() crea un modelo lineal que describe la relación entre las variables, y abline() añade esta línea al gráfico existente.

Diagramas de dispersión con ggplot2

Aunque la función plot() es muy útil, el paquete ggplot2 ofrece mayor flexibilidad y opciones de personalización para crear diagramas de dispersión más elaborados:

# Instalamos y cargamos ggplot2 si no lo tenemos
# install.packages("ggplot2")
library(ggplot2)

# Creamos un diagrama de dispersión básico
ggplot(mtcars, aes(x = wt, y = mpg)) +
  geom_point() +
  labs(title = "Relación entre peso y consumo",
       x = "Peso (miles de libras)",
       y = "Consumo (millas por galón)")

Con ggplot2 podemos añadir fácilmente una línea de tendencia y personalizar por grupos:

ggplot(mtcars, aes(x = wt, y = mpg, color = as.factor(cyl))) +
  geom_point(size = 3) +
  geom_smooth(method = "lm", se = FALSE) +
  labs(title = "Relación entre peso y consumo por cilindros",
       x = "Peso (miles de libras)",
       y = "Consumo (millas por galón)",
       color = "Cilindros") +
  theme_minimal()

En este ejemplo, geom_smooth() añade una línea de tendencia para cada grupo de cilindros, y se = FALSE elimina las bandas de confianza para mantener el gráfico más limpio.

Casos de uso prácticos

Los diagramas de dispersión son especialmente útiles en estos escenarios:

  • Análisis exploratorio: para descubrir relaciones entre variables numéricas
  • Validación de supuestos: para verificar si existe linealidad entre variables
  • Detección de valores atípicos: para identificar observaciones inusuales
  • Segmentación: para visualizar si existen grupos naturales en los datos

Por ejemplo, podemos explorar si existe relación entre la potencia y la aceleración de los coches:

plot(mtcars$hp, mtcars$qsec,
     main = "Relación entre potencia y aceleración",
     xlab = "Potencia (hp)",
     ylab = "Tiempo en 1/4 milla (segundos)",
     pch = 16,
     col = "darkgreen")

# Añadimos una línea de tendencia
abline(lm(qsec ~ hp, data = mtcars), col = "red")

Este gráfico nos mostraría si los coches más potentes tienden a completar el cuarto de milla en menos tiempo (mejor aceleración).

Diagramas de dispersión con múltiples dimensiones

Aunque estamos trabajando con gráficos bivariantes, podemos representar información adicional mediante:

  • Color: para representar una tercera variable categórica
  • Tamaño: para representar una tercera variable numérica
  • Forma: para representar otra variable categórica
# Con ggplot2 podemos visualizar más dimensiones
ggplot(mtcars, aes(x = wt, y = mpg, 
                   color = as.factor(cyl),  # Color por cilindros
                   size = hp)) +            # Tamaño por potencia
  geom_point(alpha = 0.7) +                 # Transparencia
  labs(title = "Relación multidimensional",
       x = "Peso (miles de libras)",
       y = "Consumo (millas por galón)",
       color = "Cilindros",
       size = "Potencia (hp)") +
  theme_light()

Este enfoque nos permite visualizar cuatro variables simultáneamente (peso, consumo, cilindros y potencia) en un solo gráfico, manteniendo la naturaleza bivariante del diagrama de dispersión.

Líneas temporales y tendencias

Las series temporales son un tipo especial de datos donde las observaciones se registran a lo largo del tiempo. En R, podemos crear visualizaciones que nos permiten analizar la evolución temporal de una variable y su relación con otra, identificando patrones, tendencias y cambios estacionales.

Gráficos de líneas para datos temporales

El gráfico de líneas es la representación más común para visualizar datos a lo largo del tiempo. Conecta puntos secuenciales para mostrar la trayectoria de los valores.

Veamos un ejemplo básico utilizando datos económicos simulados:

# Creamos datos de ejemplo
fechas <- seq(as.Date("2020-01-01"), as.Date("2021-12-31"), by = "month")
ventas <- c(120, 115, 130, 140, 160, 170, 190, 185, 165, 145, 140, 150,
            155, 160, 175, 190, 210, 230, 240, 220, 200, 180, 170, 185)

# Creamos un data frame
datos_ventas <- data.frame(fecha = fechas, ventas = ventas)

# Gráfico de líneas básico
plot(datos_ventas$fecha, datos_ventas$ventas, 
     type = "l",  # 'l' indica línea en lugar de puntos
     col = "blue",
     lwd = 2,     # ancho de línea
     main = "Evolución de ventas mensuales",
     xlab = "Fecha",
     ylab = "Ventas (miles €)")

# Añadimos puntos para destacar las observaciones
points(datos_ventas$fecha, datos_ventas$ventas, 
       pch = 16, 
       col = "darkblue")

El parámetro type = "l" indica a R que dibuje una línea en lugar de puntos. Podemos combinar líneas y puntos para crear visualizaciones más informativas.

Comparación de múltiples series temporales

A menudo necesitamos comparar la evolución simultánea de dos variables a lo largo del tiempo. Esto nos permite identificar relaciones, desfases o comportamientos divergentes.

# Añadimos una segunda variable (beneficios)
beneficios <- c(20, 18, 22, 25, 30, 32, 40, 38, 31, 26, 24, 27,
                29, 32, 36, 42, 48, 52, 55, 49, 43, 38, 35, 40)
datos_ventas$beneficios <- beneficios

# Creamos el primer gráfico (ventas)
plot(datos_ventas$fecha, datos_ventas$ventas,
     type = "l",
     col = "blue",
     lwd = 2,
     main = "Comparativa de ventas y beneficios",
     xlab = "Fecha",
     ylab = "Ventas (miles €)",
     ylim = c(0, max(datos_ventas$ventas) * 1.1))  # Ajustamos el límite vertical

# Añadimos un segundo eje Y para los beneficios
par(new = TRUE)  # Permite superponer gráficos

# Dibujamos la línea de beneficios
plot(datos_ventas$fecha, datos_ventas$beneficios,
     type = "l",
     col = "darkgreen",
     lwd = 2,
     axes = FALSE,  # No dibujamos ejes adicionales
     xlab = "",
     ylab = "")

# Añadimos el eje derecho para beneficios
axis(side = 4)
mtext("Beneficios (miles €)", side = 4, line = 3, col = "darkgreen")

# Añadimos leyenda
legend("topleft", 
       legend = c("Ventas", "Beneficios"),
       col = c("blue", "darkgreen"),
       lwd = 2)

El parámetro par(new = TRUE) permite superponer gráficos, lo que nos ayuda a crear visualizaciones con ejes duales. Esto es especialmente útil cuando las variables tienen escalas diferentes.

Visualización de tendencias

Para identificar la dirección general de una serie temporal, podemos añadir líneas de tendencia que simplifiquen la interpretación de los datos:

# Gráfico base
plot(datos_ventas$fecha, datos_ventas$ventas, 
     type = "l",
     col = "gray60",
     lwd = 1.5,
     main = "Ventas mensuales con tendencia",
     xlab = "Fecha",
     ylab = "Ventas (miles €)")

# Añadimos puntos
points(datos_ventas$fecha, datos_ventas$ventas, 
       pch = 16, 
       col = "darkblue",
       cex = 0.8)

# Creamos un índice numérico para el tiempo
tiempo <- 1:length(datos_ventas$fecha)

# Calculamos la tendencia lineal
tendencia <- lm(ventas ~ tiempo, data = datos_ventas)

# Añadimos la línea de tendencia
lines(datos_ventas$fecha, predict(tendencia), 
      col = "red", 
      lwd = 2)

# Añadimos leyenda
legend("topleft", 
       legend = c("Datos mensuales", "Tendencia"),
       col = c("darkblue", "red"),
       lty = c(NA, 1),
       pch = c(16, NA),
       lwd = c(NA, 2))

La función lm() calcula una regresión lineal que representa la tendencia general de los datos. Esta línea nos ayuda a visualizar si la serie está creciendo, decreciendo o se mantiene estable a lo largo del tiempo.

Suavizado de series temporales

Las series temporales a menudo contienen fluctuaciones que pueden dificultar la identificación de patrones. El suavizado nos permite reducir el ruido y visualizar mejor la tendencia subyacente:

# Gráfico base
plot(datos_ventas$fecha, datos_ventas$ventas, 
     type = "l",
     col = "gray70",
     lwd = 1,
     main = "Ventas mensuales con suavizado",
     xlab = "Fecha",
     ylab = "Ventas (miles €)")

# Calculamos una media móvil (promedio de 3 meses)
media_movil <- stats::filter(datos_ventas$ventas, 
                            rep(1/3, 3),
                            sides = 2)  # Considera valores antes y después

# Añadimos la línea suavizada
lines(datos_ventas$fecha, media_movil, 
      col = "darkred", 
      lwd = 2.5)

# Añadimos leyenda
legend("topleft", 
       legend = c("Datos originales", "Media móvil (3 meses)"),
       col = c("gray70", "darkred"),
       lwd = c(1, 2.5))

La función filter() del paquete stats nos permite calcular una media móvil, que promedia los valores en una ventana deslizante (en este caso, 3 meses). Esto suaviza las fluctuaciones a corto plazo y resalta la tendencia general.

Visualización de estacionalidad

Muchas series temporales muestran patrones estacionales que se repiten en intervalos regulares. Podemos visualizar estos patrones agrupando los datos por periodo:

# Extraemos el mes de cada fecha
datos_ventas$mes <- format(datos_ventas$fecha, "%m")
datos_ventas$año <- format(datos_ventas$fecha, "%Y")

# Creamos un gráfico para visualizar la estacionalidad
# Primero, separamos los datos por año
ventas_2020 <- datos_ventas$ventas[datos_ventas$año == "2020"]
ventas_2021 <- datos_ventas$ventas[datos_ventas$año == "2021"]
meses <- 1:12

# Creamos el gráfico
plot(meses, ventas_2020, 
     type = "o",  # 'o' combina líneas y puntos
     col = "blue",
     pch = 16,
     lwd = 1.5,
     main = "Patrón estacional de ventas",
     xlab = "Mes",
     ylab = "Ventas (miles €)",
     xaxt = "n")  # No mostrar eje X automático

# Añadimos etiquetas de meses
axis(1, at = 1:12, labels = month.abb)

# Añadimos la línea del segundo año
lines(meses, ventas_2021, 
      type = "o",
      col = "darkgreen",
      pch = 17,
      lwd = 1.5)

# Añadimos leyenda
legend("topleft", 
       legend = c("2020", "2021"),
       col = c("blue", "darkgreen"),
       pch = c(16, 17),
       lwd = 1.5)

Este gráfico nos permite comparar el comportamiento mensual de las ventas en diferentes años, facilitando la identificación de patrones estacionales recurrentes.

Visualización con ggplot2

El paquete ggplot2 ofrece una sintaxis más flexible para crear gráficos temporales avanzados:

# Cargamos ggplot2
library(ggplot2)

# Gráfico de líneas básico
ggplot(datos_ventas, aes(x = fecha, y = ventas)) +
  geom_line(color = "blue", size = 1) +
  geom_point(color = "darkblue", size = 2) +
  labs(title = "Evolución de ventas mensuales",
       x = "Fecha",
       y = "Ventas (miles €)") +
  theme_light()

Para comparar dos variables temporales:

# Convertimos a formato largo para facilitar la visualización
datos_largo <- reshape2::melt(datos_ventas[, c("fecha", "ventas", "beneficios")],
                             id.vars = "fecha",
                             variable.name = "métrica",
                             value.name = "valor")

# Creamos el gráfico
ggplot(datos_largo, aes(x = fecha, y = valor, color = métrica, group = métrica)) +
  geom_line(size = 1) +
  geom_point(size = 2) +
  scale_color_manual(values = c("ventas" = "blue", "beneficios" = "darkgreen")) +
  labs(title = "Evolución de ventas y beneficios",
       x = "Fecha",
       y = "Valor (miles €)",
       color = "Métrica") +
  theme_minimal()

Detección de cambios de tendencia

Un aspecto importante del análisis temporal es identificar puntos de inflexión donde la tendencia cambia:

# Calculamos la diferencia entre meses consecutivos
datos_ventas$cambio <- c(NA, diff(datos_ventas$ventas))

# Gráfico de ventas
plot(datos_ventas$fecha, datos_ventas$ventas, 
     type = "l",
     col = "blue",
     lwd = 2,
     main = "Detección de cambios de tendencia",
     xlab = "Fecha",
     ylab = "Ventas (miles €)")

# Identificamos puntos de inflexión (cambio de signo en la diferencia)
cambios_signo <- which(datos_ventas$cambio[-1] * c(NA, datos_ventas$cambio[-length(datos_ventas$cambio)]) < 0) + 1

# Marcamos los puntos de inflexión
points(datos_ventas$fecha[cambios_signo], 
       datos_ventas$ventas[cambios_signo],
       pch = 19,
       col = "red",
       cex = 1.5)

# Añadimos leyenda
legend("topleft", 
       legend = c("Ventas", "Puntos de inflexión"),
       col = c("blue", "red"),
       pch = c(NA, 19),
       lwd = c(2, NA))

Este gráfico resalta los momentos clave donde la tendencia de las ventas cambia de creciente a decreciente o viceversa, lo que puede ser útil para identificar factores que influyen en el comportamiento de la serie.

Proyección de tendencias futuras

Podemos utilizar modelos simples para extrapolar tendencias y visualizar posibles escenarios futuros:

# Creamos un índice de tiempo
tiempo <- 1:nrow(datos_ventas)

# Ajustamos un modelo de regresión
modelo <- lm(ventas ~ tiempo, data = datos_ventas)

# Creamos datos para la proyección (6 meses adicionales)
nuevos_meses <- seq(max(datos_ventas$fecha), by = "month", length.out = 7)[-1]
nuevos_indices <- (nrow(datos_ventas) + 1):(nrow(datos_ventas) + 6)

# Calculamos la proyección
proyeccion <- predict(modelo, newdata = data.frame(tiempo = nuevos_indices))

# Gráfico con datos históricos
plot(datos_ventas$fecha, datos_ventas$ventas, 
     type = "l",
     col = "blue",
     lwd = 2,
     xlim = c(min(datos_ventas$fecha), max(nuevos_meses)),
     ylim = c(min(datos_ventas$ventas), max(c(datos_ventas$ventas, proyeccion)) * 1.1),
     main = "Proyección de tendencia futura",
     xlab = "Fecha",
     ylab = "Ventas (miles €)")

# Añadimos la proyección
lines(nuevos_meses, proyeccion, 
      col = "red", 
      lwd = 2,
      lty = 2)  # Línea punteada

# Añadimos una línea vertical para separar datos históricos de proyección
abline(v = max(datos_ventas$fecha), lty = 3, col = "gray50")

# Añadimos leyenda
legend("topleft", 
       legend = c("Datos históricos", "Proyección"),
       col = c("blue", "red"),
       lwd = 2,
       lty = c(1, 2))

Este gráfico muestra tanto los datos históricos como una proyección lineal simple para los próximos meses, lo que puede ayudar en la planificación y toma de decisiones.

Visualización de correlaciones y asociaciones

La visualización de correlaciones es fundamental para entender cómo se relacionan dos variables entre sí. Mientras que los diagramas de dispersión nos muestran la forma de la relación, existen herramientas específicas en R que nos permiten cuantificar y visualizar estas asociaciones de manera más estructurada.

Matrices de correlación

Una matriz de correlación nos permite examinar las relaciones lineales entre múltiples variables numéricas simultáneamente. Primero, calculemos las correlaciones entre algunas variables del conjunto de datos mtcars:

# Calculamos la matriz de correlación
cor_matrix <- cor(mtcars[, c("mpg", "disp", "hp", "wt")])
print(round(cor_matrix, 2))

Para visualizar esta matriz, podemos utilizar la función corrplot del paquete del mismo nombre:

# Instalamos y cargamos el paquete si es necesario
# install.packages("corrplot")
library(corrplot)

# Visualizamos la matriz de correlación
corrplot(cor_matrix, 
         method = "circle",    # Tipo de visualización
         type = "upper",       # Solo muestra la mitad superior
         tl.col = "black",     # Color del texto de las etiquetas
         addCoef.col = "black") # Añade coeficientes numéricos

Este gráfico muestra círculos cuyo tamaño y color representan la fuerza y dirección de la correlación:

  • Azul indica correlación positiva (cuando una variable aumenta, la otra también)
  • Rojo indica correlación negativa (cuando una variable aumenta, la otra disminuye)
  • El tamaño del círculo representa la magnitud de la correlación

Heatmaps de correlación

Los heatmaps (mapas de calor) son otra forma efectiva de visualizar matrices de correlación, especialmente cuando trabajamos con muchas variables:

# Usando corrplot para crear un heatmap
corrplot(cor_matrix, 
         method = "color",     # Visualización como mapa de calor
         addCoef.col = "black", # Añade coeficientes numéricos
         tl.col = "black",     # Color del texto
         col = colorRampPalette(c("#D73027", "#FFFFFF", "#4575B4"))(100))

También podemos usar ggplot2 para crear heatmaps más personalizados:

# Convertimos la matriz a formato largo para ggplot2
library(reshape2)
cor_long <- melt(cor_matrix)

# Creamos el heatmap con ggplot2
library(ggplot2)
ggplot(cor_long, aes(x = Var1, y = Var2, fill = value)) +
  geom_tile() +
  scale_fill_gradient2(low = "#D73027", mid = "white", high = "#4575B4", 
                      midpoint = 0, limits = c(-1, 1)) +
  geom_text(aes(label = round(value, 2)), color = "black") +
  theme_minimal() +
  labs(title = "Matriz de correlación",
       x = "", y = "", fill = "Correlación") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

Gráficos de correlación con ggcorrplot

El paquete ggcorrplot combina la flexibilidad de ggplot2 con funcionalidades específicas para visualizar correlaciones:

# install.packages("ggcorrplot")
library(ggcorrplot)

# Creamos un gráfico de correlación
ggcorrplot(cor_matrix, 
           hc.order = TRUE,           # Ordenamiento jerárquico
           type = "lower",            # Solo mitad inferior
           lab = TRUE,                # Mostrar valores
           lab_size = 3,              # Tamaño del texto
           colors = c("#D73027", "white", "#4575B4"),
           title = "Correlaciones entre variables de mtcars")

El parámetro hc.order = TRUE reordena las variables según un agrupamiento jerárquico, lo que ayuda a identificar grupos de variables que están fuertemente correlacionadas entre sí.

Visualización de la fuerza de asociación

Para visualizar específicamente la fuerza de la asociación entre dos variables, podemos combinar un diagrama de dispersión con información sobre la correlación:

# Creamos un gráfico de dispersión con línea de regresión y valor de correlación
plot(mtcars$wt, mtcars$mpg, 
     main = paste("Correlación:", round(cor(mtcars$wt, mtcars$mpg), 2)),
     xlab = "Peso (miles de libras)",
     ylab = "Consumo (millas por galón)",
     pch = 16,
     col = "darkblue")

# Añadimos línea de regresión
abline(lm(mpg ~ wt, data = mtcars), col = "red", lwd = 2)

# Añadimos bandas de confianza
modelo <- lm(mpg ~ wt, data = mtcars)
nuevos_datos <- data.frame(wt = seq(min(mtcars$wt), max(mtcars$wt), length.out = 100))
predicciones <- predict(modelo, nuevos_datos, interval = "confidence")

# Dibujamos las bandas de confianza
lines(nuevos_datos$wt, predicciones[, "lwr"], lty = 2, col = "darkgray")
lines(nuevos_datos$wt, predicciones[, "upr"], lty = 2, col = "darkgray")

Las bandas de confianza nos muestran el rango donde esperamos que se encuentre la verdadera línea de regresión con un 95% de confianza. Cuanto más estrecha sea esta banda, más precisa es nuestra estimación de la relación.

Gráficos de correlación parcial

Las correlaciones parciales miden la relación entre dos variables mientras se controla el efecto de una o más variables adicionales:

# install.packages("ppcor")
library(ppcor)

# Calculamos correlaciones parciales
cor_parcial <- pcor(mtcars[, c("mpg", "disp", "hp", "wt")])
print(round(cor_parcial$estimate, 2))

Podemos visualizar estas correlaciones parciales de manera similar a las correlaciones simples:

# Visualizamos la matriz de correlaciones parciales
corrplot(cor_parcial$estimate, 
         method = "circle",
         type = "upper",
         tl.col = "black",
         p.mat = cor_parcial$p.value,  # Matriz de valores p
         sig.level = 0.05,             # Nivel de significancia
         insig = "blank")              # No mostrar correlaciones no significativas

Este gráfico solo muestra las correlaciones que son estadísticamente significativas (p < 0.05), lo que nos ayuda a identificar las relaciones más robustas.

Visualización de asociaciones no lineales

No todas las relaciones entre variables son lineales. Para detectar asociaciones no lineales, podemos utilizar el coeficiente de correlación de Spearman, que mide la fuerza de las relaciones monótonas:

# Calculamos correlaciones de Spearman
spearman_cor <- cor(mtcars[, c("mpg", "disp", "hp", "wt")], method = "spearman")

# Comparamos con correlaciones de Pearson
pearson_cor <- cor(mtcars[, c("mpg", "disp", "hp", "wt")], method = "pearson")

# Creamos un data frame para comparar
comparacion <- data.frame(
  Variable1 = rep(rownames(spearman_cor), each = ncol(spearman_cor)),
  Variable2 = rep(colnames(spearman_cor), times = nrow(spearman_cor)),
  Pearson = as.vector(pearson_cor),
  Spearman = as.vector(spearman_cor)
)

# Filtramos para eliminar duplicados y autocorrelaciones
comparacion <- comparacion[comparacion$Variable1 < comparacion$Variable2, ]

# Visualizamos la comparación
library(ggplot2)
ggplot(comparacion, aes(x = Pearson, y = Spearman)) +
  geom_point(size = 3, color = "darkblue") +
  geom_text(aes(label = paste(Variable1, "-", Variable2)), 
            vjust = -0.8, size = 3) +
  geom_abline(intercept = 0, slope = 1, linetype = "dashed", color = "gray") +
  xlim(-1, 1) + ylim(-1, 1) +
  labs(title = "Comparación de correlaciones Pearson vs Spearman",
       x = "Correlación de Pearson",
       y = "Correlación de Spearman") +
  theme_light()

Las diferencias significativas entre las correlaciones de Pearson y Spearman pueden indicar la presencia de relaciones no lineales. Cuando los puntos se alejan de la línea diagonal, significa que una medida detecta una asociación que la otra no capta completamente.

Visualización de asociaciones entre variables categóricas y numéricas

Para visualizar la asociación entre una variable categórica y una numérica, podemos utilizar diagramas de caja (boxplots):

# Convertimos cilindros a factor
mtcars$cyl <- as.factor(mtcars$cyl)

# Creamos un boxplot
boxplot(mpg ~ cyl, data = mtcars,
        main = "Consumo por número de cilindros",
        xlab = "Número de cilindros",
        ylab = "Consumo (millas por galón)",
        col = c("lightblue", "lightgreen", "salmon"))

# Añadimos los puntos individuales
stripchart(mpg ~ cyl, data = mtcars,
           vertical = TRUE,
           method = "jitter",
           add = TRUE,
           pch = 16,
           col = "darkblue")

Para cuantificar esta asociación, podemos utilizar el coeficiente eta cuadrado (η²), que mide la proporción de la varianza en la variable dependiente explicada por la variable categórica:

# Calculamos eta cuadrado
modelo_anova <- aov(mpg ~ cyl, data = mtcars)
eta_cuadrado <- summary(modelo_anova)[[1]]["Sum Sq"][1, ] / 
                sum(summary(modelo_anova)[[1]]["Sum Sq"])

# Añadimos el valor al título del gráfico
title(sub = paste("η² =", round(eta_cuadrado, 2)))

Visualización de asociaciones entre variables categóricas

Para visualizar la asociación entre dos variables categóricas, podemos utilizar gráficos de mosaico:

# Creamos una tabla de contingencia
mtcars$am <- as.factor(mtcars$am)
tabla <- table(mtcars$cyl, mtcars$am)

# Creamos un gráfico de mosaico
mosaicplot(tabla,
           main = "Relación entre cilindros y transmisión",
           xlab = "Número de cilindros",
           ylab = "Tipo de transmisión (0=Auto, 1=Manual)",
           col = c("lightblue", "salmon", "lightgreen"))

El tamaño de cada rectángulo en el gráfico de mosaico representa la frecuencia de esa combinación particular de categorías. Para cuantificar esta asociación, podemos calcular el estadístico chi-cuadrado:

# Realizamos prueba chi-cuadrado
resultado_chi <- chisq.test(tabla)

# Añadimos el valor p al gráfico
title(sub = paste("p-valor =", round(resultado_chi$p.value, 3)))

Un p-valor bajo indica una asociación estadísticamente significativa entre las variables categóricas.

Visualización de correlaciones con ggpairs

El paquete GGally proporciona la función ggpairs, que crea una matriz de gráficos para visualizar múltiples relaciones simultáneamente:

# install.packages("GGally")
library(GGally)

# Creamos una matriz de gráficos
ggpairs(mtcars[, c("mpg", "disp", "hp", "wt", "cyl")],
        mapping = ggplot2::aes(color = as.factor(mtcars$cyl)),
        upper = list(continuous = "cor"),
        diag = list(continuous = "densityDiag"),
        lower = list(continuous = "points"),
        title = "Matriz de relaciones entre variables")

Este gráfico muestra:

  • Diagonal: Distribuciones de cada variable
  • Triángulo inferior: Diagramas de dispersión entre pares de variables
  • Triángulo superior: Coeficientes de correlación entre pares de variables

La coloración por grupos (en este caso, por número de cilindros) nos permite identificar patrones específicos dentro de cada categoría.

Interpretación de correlaciones y asociaciones

Al interpretar visualizaciones de correlación, es importante recordar:

  • La correlación no implica causalidad - dos variables pueden estar correlacionadas sin que una cause la otra
  • Las correlaciones pueden ser espurias - causadas por una tercera variable no considerada
  • La fuerza de la correlación se interpreta generalmente como:
  • 0.00-0.19: muy débil
  • 0.20-0.39: débil
  • 0.40-0.59: moderada
  • 0.60-0.79: fuerte
  • 0.80-1.00: muy fuerte
  • El signo de la correlación (positivo o negativo) indica la dirección de la relación

Estas visualizaciones nos ayudan a identificar patrones y relaciones en nuestros datos, que luego pueden guiar análisis más profundos y la construcción de modelos predictivos.

Aprende R online

Otros ejercicios de programación de R

Evalúa tus conocimientos de esta lección Gráficos bivariantes en R con nuestros retos de programación de tipo Test, Puzzle, Código y Proyecto con VSCode, guiados por IA.

Todas las lecciones de R

Accede a todas las lecciones de R y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.

Instalación De R Y Rstudio

R

Introducción Y Entorno

Introducción A R

R

Introducción Y Entorno

Operadores

R

Sintaxis

Estructuras De Datos

R

Sintaxis

Funciones

R

Sintaxis

Estructuras De Control Iterativo

R

Sintaxis

Scopes Y Closures

R

Sintaxis

Estructuras De Control Condicional

R

Sintaxis

Funciones Anónimas

R

Sintaxis

Tipos De Datos Y Variables

R

Sintaxis

Sistema R6: Clases Referenciales Y Encapsulamiento

R

Programación Orientada A Objetos

Sistema S4: Clases Formales Y Validación

R

Programación Orientada A Objetos

Herencia Y Polimorfismo En R

R

Programación Orientada A Objetos

Sistemas De Oop En R

R

Programación Orientada A Objetos

Sistema S3: Clases Implícitas Y Métodos Genéricos

R

Programación Orientada A Objetos

Tidyverse Para Transformación De Datos

R

Manipulación De Datos

Lubridate Para Fechas Y Tiempo

R

Manipulación De Datos

Group_by Y Summarize Para Agrupación Y Resumen

R

Manipulación De Datos

Stringr Para Expresiones Regulares

R

Manipulación De Datos

Tidyr Para Limpieza De Valores Faltantes

R

Manipulación De Datos

Joins En R Para Combinación Y Relaciones De Tablas

R

Manipulación De Datos

Pivot_longer Y Pivot_wider Para Reestructuración

R

Manipulación De Datos

Mutate Y Transmute Para Transformación

R

Manipulación De Datos

Dplyr Para Filtrado Y Selección

R

Manipulación De Datos

Readr Y Read.csv Para Importar Datos

R

Manipulación De Datos

Gráficos Bivariantes En R

R

Visualización De Datos

Gráficos Univariantes En R

R

Visualización De Datos

Facetas En Ggplot2

R

Visualización De Datos

Personalización Y Temas

R

Visualización De Datos

Ggplot2 Para Visualización De Datos

R

Visualización De Datos

Gráficos Multivariantes En R

R

Visualización De Datos

Correlación En R

R

Estadística

Regresión Lineal En R

R

Estadística

Pruebas De Hipótesis En R

R

Estadística

Anova En R

R

Estadística

Estadística Descriptiva En R

R

Estadística

Accede GRATIS a R y certifícate

En esta lección

Objetivos de aprendizaje de esta lección

  • Comprender y crear diagramas de dispersión básicos y personalizados en R.
  • Analizar patrones y relaciones entre variables mediante gráficos bivariantes.
  • Visualizar y comparar series temporales con gráficos de líneas y técnicas de suavizado.
  • Interpretar matrices de correlación y utilizar herramientas para visualizar asociaciones entre variables.
  • Aplicar técnicas avanzadas para representar múltiples dimensiones y asociaciones no lineales en datos.