Menu

Gráfico de dispersión en R: plot(), líneas de regresión y pairs()

Cómo hacer un gráfico de dispersión en R: grafica dos variables con plot(), añade una línea de regresión con abline(lm()), suaviza con lowess() y construye una matriz con pairs().

Esta página incluye editores ejecutables: edita, ejecuta y ve el resultado al instante.

Qué muestra un gráfico de dispersión

Un gráfico de dispersión muestra la relación entre dos variables numéricas: cada observación se convierte en un punto, posicionado por su primer valor a lo largo del eje horizontal y su segundo valor a lo largo del eje vertical. Si las dos variables se mueven juntas, los puntos forman un patrón; si no, obtienes una nube sin forma. Es el primer vistazo estándar antes de ajustar cualquier modelo, y R lo dibuja con la misma función plot() cubierta en la guía de plot().

Usaremos mtcars, un dataset integrado de 32 coches, y plantearemos una pregunta física: ¿los coches más pesados tienen motores más potentes?

Hacer el gráfico

wt es el peso en miles de libras, hp la potencia en caballos:

plot(mtcars$wt, mtcars$hp,
     main = "Horsepower vs. weight",
     xlab = "Weight (1000 lbs)",
     ylab = "Horsepower",
     pch  = 19,
     col  = "steelblue")

La imagen: treinta y dos puntos sólidos que suben desde la esquina baja del gráfico (coches ligeros, en torno a 1.5 en la escala de peso, cerca de 60–90 caballos) hacia coches pesados por encima de 5 que superan los 200 caballos. La subida es inconfundible pero no prolija: para un peso dado, los puntos se dispersan sobre una banda considerable de potencia.

El estilo es el kit habitual del graficado base: pch = 19 para círculos sólidos (el hueco por defecto desaparece en las capturas), col para el color, cex = 1.3 si los puntos necesitan ser más grandes. Para colorear los puntos según una tercera variable categórica, indexa un vector de colores con un factor: col = c("tomato", "steelblue", "darkgreen")[factor(mtcars$cyl)] da a cada número de cilindros su propio color.

Leerlo: dirección, fuerza, forma

Tres preguntas, en orden, cada vez que mires un gráfico de dispersión:

  • Dirección. ¿Los puntos suben (relación positiva) o bajan (negativa) al recorrer el eje horizontal? Aquí suben: más pesado significa más potente. Grafica mpg contra wt en su lugar y la nube cae: más pesado significa más consumo.
  • Fuerza. ¿Con qué firmeza se ciñen los puntos a un único trazado? Una banda fina como un lápiz es una relación fuerte; un rociado suelto es una débil. Esta nube es moderadamente compacta.
  • Forma y sorpresas. ¿El trazado es recto o curvo? ¿Hay grupos, o puntos lejos de todo lo demás? En mtcars, el Maserati Bora se sitúa llamativamente por encima del pelotón: 335 caballos con un peso mediano. Un solo punto así puede arrastrar notablemente una línea ajustada, que es exactamente la razón para mirar antes de ajustar.

Añadir la línea de tendencia

Un gráfico de dispersión enuncia una relación; una línea que lo atraviesa resume la afirmación. Ajusta un modelo lineal y pásaselo directamente a abline():

plot(mtcars$wt, mtcars$hp,
     pch = 19, col = "steelblue",
     xlab = "Weight (1000 lbs)", ylab = "Horsepower")

abline(lm(hp ~ wt, data = mtcars), col = "tomato", lwd = 2)

lm(hp ~ wt) ajusta la línea de mínimos cuadrados —lee la fórmula como "hp explicada por wt", con la variable del eje vertical antes de la ~— y abline() la dibuja a través del gráfico. La línea sube a razón de unos 46 caballos por cada mil libras. Qué significa ese modelo, y cómo leer su resumen, es el tema de la regresión lineal.

Si no quieres asumir una línea recta, lowess() dibuja una curva suave que sigue a los datos allá donde vayan:

lines(lowess(mtcars$wt, mtcars$hp), col = "darkgreen", lwd = 2, lty = 2)

Cuando la curva lowess y la línea recta coinciden a grandes rasgos, un resumen lineal es justo. Cuando la curva se aparta doblándose, la relación es no lineal y una línea recta la representaría mal.

Comprobar los números con cor()

El gráfico te da la forma; cor() te da la fuerza como un número. Este paso es pura salida de texto, así que ejecútalo aquí:

El peso y la potencia se correlacionan en torno a 0.66: la nube ascendente moderadamente compacta, convertida en número. La matriz añade que mpg se correlaciona fuertemente en negativo con ambas (alrededor de −0.87 con el peso). Eso sí, mantén el orden de las operaciones: primero el gráfico, después el coeficiente. Un único valor de r puede ocultar una curva o estar inflado por un atípico; consulta correlación para las maneras clásicas en que engaña.

La matriz de gráficos de dispersión: pairs()

Con varias columnas numéricas, dibujar cada emparejamiento a mano se vuelve tedioso. pairs() lo hace en una llamada:

pairs(mtcars[, c("mpg", "wt", "hp")],
      pch = 19, col = "steelblue")

El resultado es una rejilla de 3 × 3: los nombres de las variables corren por la diagonal, y cada panel fuera de la diagonal es el gráfico de dispersión de un par —mpg contra wt, mpg contra hp, wt contra hp— apareciendo cada uno dos veces con los ejes intercambiados. Es la forma más rápida de hacer un triaje de un dataset nuevo: un vistazo muestra qué pares están relacionados, qué relaciones se curvan y dónde se esconden los atípicos. Selecciona las columnas primero, como aquí: más allá de seis o siete variables los paneles se encogen hasta la ilegibilidad.

La versión en ggplot2

En ggplot2, el gráfico de dispersión más una línea ajustada son dos capas:

library(ggplot2)

ggplot(mtcars, aes(x = wt, y = hp)) +
    geom_point(color = "steelblue", size = 2) +
    geom_smooth(method = "lm", color = "tomato") +
    labs(title = "Horsepower vs. weight",
         x = "Weight (1000 lbs)", y = "Horsepower")

geom_smooth(method = "lm") es abline(lm(...)) con un extra: una banda de confianza sombreada alrededor de la línea. Deja method sin definir y ajusta una curva loess en su lugar, la contraparte en ggplot2 de lowess(). R base gana en velocidad de tecleo para un vistazo rápido; ggplot2 gana en el momento en que quieres los puntos coloreados por grupo con una leyenda automática.

Lo que te llevas

  • plot(x, y) con dos vectores numéricos es un gráfico de dispersión; pch = 19 y ejes etiquetados lo hacen presentable.
  • Lee la dirección, la fuerza y la forma —y detecta los atípicos— antes de calcular nada.
  • abline(lm(y ~ x, data = df)) añade la línea de regresión; lines(lowess(x, y)) añade una curva que no asume rectitud.
  • cor() cuantifica lo que el gráfico muestra; el gráfico mantiene honesto al número.
  • pairs(df[, cols]) dibuja todos los gráficos de dispersión por pares de una vez: el triaje más rápido de un dataset nuevo.

Lo siguiente: el gráfico de barras, dejando atrás los pares numéricos para comparar conteos entre categorías.

Preguntas frecuentes

¿Cómo se hace un gráfico de dispersión en R?

Llama a plot(x, y) con dos vectores numéricos, por ejemplo plot(mtcars$wt, mtcars$hp). Cada observación se convierte en un punto. Añade pch = 19 para puntos sólidos y main, xlab, ylab para las etiquetas.

¿Cómo se añade una línea de regresión a un gráfico de dispersión en R?

Ajusta el modelo y pásaselo a abline(): abline(lm(hp ~ wt, data = mtcars)) dibuja la línea de mínimos cuadrados sobre el gráfico existente. Fíjate en el orden de la fórmula: la variable del eje vertical va antes de la ~.

¿Cómo se grafican muchos pares de variables a la vez en R?

pairs(df) dibuja una matriz de gráficos de dispersión: un panel pequeño por cada par de columnas. Selecciona columnas primero —pairs(mtcars[, c("mpg", "wt", "hp")])— porque más allá de seis o siete columnas los paneles quedan demasiado pequeños para leerse.

¿Qué te dice un gráfico de dispersión que la correlación no?

La forma. Un coeficiente de correlación es un solo número y puede ser idéntico para una línea limpia, una curva o una nube con un atípico extremo. El gráfico de dispersión muestra la curvatura, los grupos y los atípicos directamente; por eso primero se grafica y después se calcula cor().

Coddy programming languages illustration

Aprende a programar con Coddy

COMENZAR