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ícateDiagramas 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 rellenopch = 2
: triángulo vacíopch = 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.
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
Introducción Y Entorno
Introducción A R
Introducción Y Entorno
Operadores
Sintaxis
Estructuras De Datos
Sintaxis
Funciones
Sintaxis
Estructuras De Control Iterativo
Sintaxis
Scopes Y Closures
Sintaxis
Estructuras De Control Condicional
Sintaxis
Funciones Anónimas
Sintaxis
Tipos De Datos Y Variables
Sintaxis
Sistema R6: Clases Referenciales Y Encapsulamiento
Programación Orientada A Objetos
Sistema S4: Clases Formales Y Validación
Programación Orientada A Objetos
Herencia Y Polimorfismo En R
Programación Orientada A Objetos
Sistemas De Oop En R
Programación Orientada A Objetos
Sistema S3: Clases Implícitas Y Métodos Genéricos
Programación Orientada A Objetos
Tidyverse Para Transformación De Datos
Manipulación De Datos
Lubridate Para Fechas Y Tiempo
Manipulación De Datos
Group_by Y Summarize Para Agrupación Y Resumen
Manipulación De Datos
Stringr Para Expresiones Regulares
Manipulación De Datos
Tidyr Para Limpieza De Valores Faltantes
Manipulación De Datos
Joins En R Para Combinación Y Relaciones De Tablas
Manipulación De Datos
Pivot_longer Y Pivot_wider Para Reestructuración
Manipulación De Datos
Mutate Y Transmute Para Transformación
Manipulación De Datos
Dplyr Para Filtrado Y Selección
Manipulación De Datos
Readr Y Read.csv Para Importar Datos
Manipulación De Datos
Gráficos Bivariantes En R
Visualización De Datos
Gráficos Univariantes En R
Visualización De Datos
Facetas En Ggplot2
Visualización De Datos
Personalización Y Temas
Visualización De Datos
Ggplot2 Para Visualización De Datos
Visualización De Datos
Gráficos Multivariantes En R
Visualización De Datos
Correlación En R
Estadística
Regresión Lineal En R
Estadística
Pruebas De Hipótesis En R
Estadística
Anova En R
Estadística
Estadística Descriptiva En R
Estadística
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.