Menu

Gráfico de Dispersão no R: plot(), Retas de Regressão e pairs()

Como fazer um gráfico de dispersão no R - plotar duas variáveis com plot(), adicionar uma reta de regressão com abline(lm()), suavizar com lowess() e montar uma matriz pairs().

Esta página tem editores executáveis - edite, execute e veja a saída na hora.

O Que um Gráfico de Dispersão Mostra

Um gráfico de dispersão exibe a relação entre duas variáveis numéricas: cada observação vira um ponto, posicionado pelo seu primeiro valor ao longo do eixo horizontal e pelo segundo valor ao longo do eixo vertical. Se as duas variáveis se movem juntas, os pontos formam um padrão; se não, você tem uma nuvem sem forma. É o primeiro olhar padrão antes de ajustar qualquer modelo - e o R desenha um com a mesma função plot() coberta no guia do plot().

Vamos usar o mtcars, um conjunto de dados embutido com 32 carros, e fazer uma pergunta física: carros mais pesados têm motores mais potentes?

Fazendo o Gráfico

wt é o peso em milhares de libras, hp é a potência em cavalos:

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

A imagem: trinta e dois pontos sólidos subindo do canto inferior do gráfico (carros leves, em torno de 1,5 na escala de peso, perto de 60–90 cavalos) rumo aos carros pesados acima de 5, que passam dos 200 cavalos. A subida é inconfundível, mas não é arrumada - para um mesmo peso, os pontos se espalham por uma faixa razoável de potência.

A estilização é o kit de sempre do gráfico base: pch = 19 para círculos sólidos (o padrão vazado some em capturas de tela), col para a cor, cex = 1.3 se os pontos precisarem ser maiores. Para colorir os pontos por uma terceira variável categórica, indexe um vetor de cores com um fator - col = c("tomato", "steelblue", "darkgreen")[factor(mtcars$cyl)] dá a cada contagem de cilindros sua própria cor.

Lendo o Gráfico: Direção, Força, Forma

Três perguntas, nesta ordem, toda vez que você olha um gráfico de dispersão:

  • Direção. Os pontos sobem (relação positiva) ou descem (negativa) conforme você percorre o eixo horizontal? Aqui eles sobem: mais pesado significa mais potente. Plote mpg contra wt e a nuvem desce - mais pesado significa mais sedento.
  • Força. Quão apertados os pontos abraçam um único caminho? Uma faixa fina como um lápis é uma relação forte; um borrifo solto é uma relação fraca. Essa nuvem é moderadamente apertada.
  • Forma e surpresas. O caminho é reto ou curvo? Há agrupamentos, ou pontos distantes de todo o resto? No mtcars, o Maserati Bora fica visivelmente acima do pelotão - 335 cavalos com um peso mediano. Um único ponto desses pode arrastar perceptivelmente uma reta ajustada, que é exatamente por que você olha antes de ajustar.

Adicionando a Linha de Tendência

Um gráfico de dispersão enuncia uma relação; uma reta atravessando-o resume a afirmação. Ajuste um modelo linear e entregue-o direto 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 a reta de mínimos quadrados - leia a fórmula como "hp explicado por wt", com a variável do eixo vertical antes do ~ - e abline() a desenha atravessando o gráfico. A reta sobe cerca de 46 cavalos por mil libras. O que esse modelo significa, e como ler seu resumo, é o assunto da regressão linear.

Se você não quiser assumir uma reta, lowess() desenha uma curva suave que segue os dados por onde eles forem:

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

Quando a curva lowess e a reta concordam aproximadamente, um resumo linear é justo. Quando a curva se desvia, a relação é não linear e uma reta a representaria mal.

Conferindo os Números com cor()

O gráfico te dá a forma; cor() te dá a força como um número. Esse passo é pura saída de texto, então rode-o aqui:

Peso e potência têm correlação de cerca de 0,66 - a nuvem ascendente moderadamente apertada, em forma de número. A matriz acrescenta que mpg se correlaciona fortemente de forma negativa com ambos (cerca de −0,87 com o peso). Mantenha a ordem das operações, porém: primeiro o gráfico, depois o coeficiente. Um único valor de r pode esconder uma curva ou ser inflado por um outlier - veja correlação para as formas clássicas em que ele engana.

A Matriz de Dispersão: pairs()

Com várias colunas numéricas, desenhar cada par à mão cansa. pairs() faz isso em uma chamada:

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

O resultado é uma grade 3 × 3: os nomes das variáveis correm pela diagonal, e cada painel fora da diagonal é o gráfico de dispersão de um par - mpg contra wt, mpg contra hp, wt contra hp, cada um aparecendo duas vezes com os eixos trocados. É o jeito mais rápido de triar um conjunto de dados novo: um olhar mostra quais pares são relacionados, quais relações curvam e onde se escondem os outliers. Faça o subconjunto das colunas antes, como aqui - acima de seis ou sete variáveis os painéis encolhem além da legibilidade.

A Versão em ggplot2

No ggplot2, o gráfico de dispersão mais uma reta ajustada são duas camadas:

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") é o abline(lm(...)) com um bônus: uma faixa de confiança sombreada em torno da reta. Deixe method sem definir e ele ajusta uma curva loess - a contraparte do lowess() no ggplot2. O R base ganha em velocidade de digitação para um olhar rápido; o ggplot2 ganha no momento em que você quer os pontos coloridos por grupo com uma legenda automática.

O Que Você Leva Daqui

  • plot(x, y) com dois vetores numéricos é um gráfico de dispersão; pch = 19 e eixos rotulados o deixam apresentável.
  • Leia direção, força e forma - e identifique outliers - antes de calcular qualquer coisa.
  • abline(lm(y ~ x, data = df)) adiciona a reta de regressão; lines(lowess(x, y)) adiciona uma curva que não pressupõe retidão.
  • cor() quantifica o que o gráfico mostra; o gráfico mantém o número honesto.
  • pairs(df[, cols]) desenha todos os gráficos de dispersão par a par de uma vez - a triagem mais rápida de um conjunto de dados novo.

A seguir: o gráfico de barras - deixando para trás os pares numéricos para comparar contagens entre categorias.

Perguntas frequentes

Como fazer um gráfico de dispersão no R?

Chame plot(x, y) com dois vetores numéricos - por exemplo plot(mtcars$wt, mtcars$hp). Cada observação vira um ponto. Acrescente pch = 19 para pontos sólidos e main, xlab, ylab para os rótulos.

Como adicionar uma reta de regressão a um gráfico de dispersão no R?

Ajuste o modelo e entregue-o a abline(): abline(lm(hp ~ wt, data = mtcars)) desenha a reta de mínimos quadrados sobre o gráfico existente. Repare na ordem da fórmula - a variável do eixo vertical vem antes do ~.

Como plotar muitos pares de variáveis de uma vez no R?

pairs(df) desenha uma matriz de gráficos de dispersão: um pequeno painel para cada par de colunas. Faça um subconjunto antes - pairs(mtcars[, c("mpg", "wt", "hp")]) - porque acima de seis ou sete colunas os painéis ficam pequenos demais para ler.

O que um gráfico de dispersão mostra que a correlação não mostra?

A forma. Um coeficiente de correlação é um número só e pode ser idêntico para uma reta limpa, uma curva ou uma nuvem com um outlier extremo. O gráfico de dispersão mostra curvatura, agrupamentos e outliers diretamente - e é por isso que você plota primeiro e calcula cor() depois.

Coddy programming languages illustration

Aprenda a programar com o Coddy

COMEÇAR