Fundamentos: gráfico de dispersão

O gráfico de dispersão mapeia pares de pontos num plano bidimensional. A principal utilidade deste tipo de gráfico é deixar evidente a correlação entre as duas variáveis escolhidas.
data-visualization
ggplot2
tutorial-R
Author

Vinicius Oike

Published

July 20, 2023

Gráfico de dispersão

O gráfico de dispersão mapeia pares de pontos num plano bidimensional. A principal utilidade deste tipo de gráfico é deixar evidente qual a relação entre as duas variáveis escolhidas.

Em geral, colocamos a variável explicativa (regressor) no eixo horizontal e a variável explicada (resposta) no eixo vertical.

Neste post vamos entender como montar gráficos de dispersão no R usando o pacote ggplot2. Primeiro vamos trabalhar um exemplo, passo a passo, para explorar uma base de preços de imóveis. Vamos entender como customizar o gráfico, variando as cores, os formatos e o tamanho dos círculos; além disso, vamos montar um gráfico de dispersão junto com uma linha de regressão.

R

O primeiro passo é instalar o pacote ggplot2. O R funciona como um repositório de pacotes: cada pacote é como uma família de funções. Em geral, cada pacote tem uma finalidade específica. O ggplot2 contém uma série de funções que permitem a construção de gráficos.

O R tem um funcionalidade embutida que facilita o download e a instalação de pacotes. Usamos a função install.packages("nome_do_pacote"). Então, para instalar o ggplot2 executamos o código abaixo.

Se você estiver usando o R fora do RStudio é provável que a função abaixo solicite que você escolha um servidor a partir de uma lista. Escolha o que for mais próximo - geograficamente - de onde você está. No meu caso eu sempre utilizo o “Brazil (SP 1) [https] - University of Sao Paulo, Sao Paulo”. Se você usa o R dentro do RStudio pode ignorar este passo.

# Instalar o pacote ggplot2 (se necessário)
install.packages("ggplot2")

A cada vez que abrimos o R precisamos carregar os pacotes adicionais que instalamos previamente. Isto pode parecer trabalhoso à primeira vista, mas faz muito sentido: evita conflitos entre pacotes e é mais eficiente.

Para carregar o ggplot2 usamos a função library (biblioteca).

# Carrega o pacote ggplot2
library(ggplot2)

Enquanto a maioria dos pactoes funciona como repositórios de funções alguns servem como repositórios de bases de dados. É o caso do pacote wooldridge que carrega as bases de dados utilizadas no livro Introductory Econometrics: A Modern Approach do economista Jeffrey Wooldridge.

# Instalar o pacote ggplot2 (se necessário)
install.packages("wooldridge")
# Carregar o pacote wooldridge
library(wooldridge)

Nos primeiros exemplos abaixo vamos trabalhar com a base de dados hrpice1 que coleta informações de preços de venda de imóveis na região metropolitana de Boston, nos EUA, em 1990. Para carregar a base usamos a função data().

data("hprice1")

Visualização e análise de dados são habilidades complementares. Aqui, vamos nos focar apenas nas habilidades visuais.

A função head(), quando aplicada a um objeto data.frame mostra as primeiras linhas da tabela. Há muitas colunas mas vamos focar inicialmente na price que é o preço em milhares de dólares e na coluna sqrft que é o tamanho do imóvel em pés quadrados.

head(hprice1)
    price assess bdrms lotsize sqrft colonial   lprice  lassess llotsize
1 300.000  349.1     4    6126  2438        1 5.703783 5.855359 8.720297
2 370.000  351.5     3    9903  2076        1 5.913503 5.862210 9.200593
3 191.000  217.7     3    5200  1374        0 5.252274 5.383118 8.556414
4 195.000  231.8     3    4600  1448        1 5.273000 5.445875 8.433811
5 373.000  319.1     4    6095  2514        1 5.921578 5.765504 8.715224
6 466.275  414.5     5    8566  2754        1 6.144775 6.027073 9.055556
    lsqrft
1 7.798934
2 7.638198
3 7.225482
4 7.277938
5 7.829630
6 7.920810

ggplot2

A estrutura de um gráfico do ggplot2 parte de três elementos básicos: (1) uma base de dados, isto é, um objeto data.frame; (2) um mapeamento de variáveis, feito com auxílio da função aes(); (3) a escolha da forma do gráfico, feito com as funções geom.

O ggplot2 funciona adicionando camadas sobre um gráfico inicial.

Começamos com a função ggplot() e vamos adicionando geoms, funções auxiliares que especificam a forma do gráfico. Este processo construtivo de adicionar elementos a um gráfico é o principal diferencial do ggplot.

Ou seja, temos três elementos básicos

  1. Dados - nossa tabela de dados.
  2. Função aes() - que transforma os dados em objetos visuais.
  3. Objeto geométrico (geom) - que escolhe qual o formato destes objetos visuais.

Esta estrutura básica é esquematizada no pseudo-código abaixo.

ggplot(data = base_de_dados, aes(x = variavel_x, y = variavel_y)) +
  geom_point()

No nosso caso a base de dados é a hprice1 e as variáveis são sqrft e price.

Temos que informar isto usando data = hprice e aes(x = sqrft, y = price).

Por fim, como queremos um gráfico de dispersão escolhemos o geom_point(). Esta última chamada é adicionada à função inicial com o sinal de soma +.

O código abaixo junta todos estes elementos e resulta num gráfico de dispersão entre o tamanho do imóvel (sqrft) e seu preço de venda (price).

ggplot(data = hprice1, aes(x = sqrft, y = price)) +
  geom_point()

O gráfico acima ainda está bastante cru e podemos melhorá-lo de diversas formas. Ainda assim, ele já é interessante: revela uma relação crescente entre o tamanho do imóvel e do seu preço de venda.

Elementos estéticos

Podemos customizar um gráfico de ggplot modificando os seus elementos estéticos. Um elemento estético pode assumir dois tipos de valor: constante ou variável. Um valor constante é um número ou texto, enquanto uma variável é uma coluna da nossa base de dados.

São quatro os principais elementos estéticos que podemos manipular no caso do geom_point:

  1. color - a cor do objeto
  2. alpha - a transparência da cor
  3. size - o tamanho do objeto
  4. shape - o formato do objeto

Quando executamos o código acima o valor destes parâmetros foi definido automaticamente. Podemos modificá-los chamando eles explicitamente.

Color - cores

A maneira mais simples de alterar as cores é chamando ela por nome. No exemplo usamos a cor steelblue. Uma lista completa de cores está disponível aqui.

ggplot(data = hprice1, aes(x = sqrft, y = price)) +
  geom_point(color = "steelblue")

Também é possível escolher a cor via hexadecimal.

ggplot(data = hprice1, aes(x = sqrft, y = price)) +
  geom_point(color = "#e76f51")

Alpha - transparência

O parâmetro alpha controla o nível de transparência da cor. Este artifício costuma ser útil para evitar que muitos pontos fiquem sobrepostos (overplotting).

ggplot(data = hprice1, aes(x = sqrft, y = price)) +
  geom_point(color = "steelblue", alpha = 0.5)

Size - tamanho

Podemos manipular o tamanho dos pontos usando size e ajustando o valor numérico.

ggplot(data = hprice1, aes(x = sqrft, y = price)) +
  geom_point(color = "steelblue", size = 5)

Agora que os círculos estão maiores há mais casos de sobreposição. Uma solução para evitar isto é aplicar algum valor de alpha.

ggplot(data = hprice1, aes(x = sqrft, y = price)) +
  geom_point(color = "steelblue", size = 5, alpha = 0.5)

Shape - formato

Por padrão o formato do geom_point é um círculo mas há muitas outras opções. Para trocar o formato do objeto usamos shape = 2

ggplot(data = hprice1, aes(x = sqrft, y = price)) +
  geom_point(shape = 2)

O gráfico abaixo ilustra os principais tipos de formatos disponíveis.

Note que em alguns casos como o 21 é possível controlar tanto a cor do contorno do círculo como também da cor de dentro.

ggplot(data = hprice1, aes(x = sqrft, y = price)) +
  geom_point(shape = 21, color = "steelblue", fill = "orange")

Combinando todos os elementos

O gráfico abaixo serve apenas para ilustrar o uso de todos os parâmetros. Naturalmente, o uso destes elementos estéticos deve favorecer o melhor entendimento do gráfico e não deve ser utilizado de forma gratuita.

ggplot(data = hprice1, aes(x = sqrft, y = price)) +
  geom_point(
    shape = 21,
    color = "steelblue",
    fill = "orange",
    size = 7,
    alpha = 0.75)

Usando cores para representar variáveis

Os elementos estéticos também podem ser utilizados para representar variáveis nos dados. Vamos voltar para a função aes. Como expliquei acima, esta função “transforma” nossos dados em elementos visuais. Nos casos acima, ela mapeia as variáveis x e y nas suas respectivas coordenadas.

Mas podemos mapear as variáveis nos elementos estéticos: color, alpha, size, shape.

Vamos primeiro voltar à nossa base de dados. Olhando para as primeiras linhas vemos que há uma coluna chamada colonial que é uma variável binária que indica se o estilo arquitetônico do imóvel é colonial.

head(hprice1)
    price assess bdrms lotsize sqrft colonial   lprice  lassess llotsize
1 300.000  349.1     4    6126  2438        1 5.703783 5.855359 8.720297
2 370.000  351.5     3    9903  2076        1 5.913503 5.862210 9.200593
3 191.000  217.7     3    5200  1374        0 5.252274 5.383118 8.556414
4 195.000  231.8     3    4600  1448        1 5.273000 5.445875 8.433811
5 373.000  319.1     4    6095  2514        1 5.921578 5.765504 8.715224
6 466.275  414.5     5    8566  2754        1 6.144775 6.027073 9.055556
    lsqrft
1 7.798934
2 7.638198
3 7.225482
4 7.277938
5 7.829630
6 7.920810

Podemos plotar o mesmo gráfico de dispersão mas fazer com que a cor do círculo represente a variável colonial. No gráfico abaixo, os pontos em azul são imóveis com estilo colonial, enquanto que os pontos em vermelho (salmão) são os imóveis de outros estilos.

Vemos que parece haver uma tendência de que os imóveis coloniais vendem por valores mais elevados, pois os pontos azuis aparecem acima dos pontos vermelhos, mas há exceções. Isso sugere que imóveis de estilo colonial têm preço mais elevado do que imóveis de tamanho similar, mas construídos em estilos diferentes.

Este exemplo mostra como a visualização ajuda a formar algumas hipóteses iniciais que depois podem ser verificadas usando modelos estatísticos.

ggplot(data = hprice1, aes(x = sqrft, y = price)) +
  geom_point(aes(color = factor(colonial)))

Da mesma forma que modificamos a cor podemos modificar o tamanho segundo, por exemplo, o número de dormitórios.

No exemplo abaixo o tamanho do círculo é proporcional ao número de dormitórios.

ggplot(data = hprice1, aes(x = sqrft, y = price)) +
  geom_point(aes(size = bdrms), alpha = 0.5)

Renomeando os eixos do gráfico

É muito importante que um gráfico seja o mais auto-explicativo possível. Para isso precisamos inserir informações relevantes como título, subtítulo e fonte.

A função labs() permite facilmente renomear os eixos do gráfico. Os argumentos principais são os abaixo.

  • title - título do gráfico
  • subtitle - subtítulo do gráfico
  • x - título do eixo-x (horizontal)
  • y - título do eixo-y (vertical)
  • caption - legenda abaixo do gráfico (em geral, a fonte)

Novamente, utilizamos o sinal de soma para adicionar estes elementos ao gráfico.

ggplot(data = hprice1, aes(x = sqrft, y = price)) +
  geom_point() +
  labs(
    title = "Quanto maior, mais caro",
    subtitle = "Relação entre o preço do imóvel e sua área útil.",
    x = "Área útil (pés quadrados)",
    y = "Preço (USD milhares)",
    caption = "Fonte: Wooldridge (Boston Globe)"
    )

Incluindo uma linha de regressão

Como falamos no início do post, parte da mágica do ggplot é ir “somando” objetos. Podemos desejar incluir, por exemplo, uma linha de regressão em cima do gráfico de dispersão. No caso de uma regressão linear simples, esta linha mostra a correlação linear entre a variável no eixo horizontal com a variável no eixo vertical.

A função geom_smooth facilita a inclusão de linhas de regressão. Se não for fornecido argumento à função ela tentará uma aproximação LOESS. No exemplo abaixo eu escolho method = "lm" para que a função aproxime a relação linear (lm de linear model).

No nosso caso, a linha mostra a relação linear entre o preço do imóvel e a sua área útil. O argumento se = FALSE serve para omitir a estimativa do erro-padrão do coeficiente e deixar a visualização mais limpa.

ggplot(data = hprice1, aes(x = sqrft, y = price)) +
  geom_point() +
  geom_smooth(method = "lm", se = FALSE)

Pode-se especificar uma forma particular para a regressão. No caso abaixo faço uma regressão polinomial de segunda ordem (quadrática) usando a função poly.

ggplot(data = hprice1, aes(x = sqrft, y = price)) +
  geom_point() +
  geom_smooth(formula = y ~ poly(x, 2), method = "lm", se = FALSE)

A curva quadrática parece ter um ajuste visual melhor aos dados.

Resumo

Neste post aprendemos o básico da estrutura sintática do ggplot e conseguimos montar gráficos de dispersão sofisticados usando poucas linhas de código. Em qualquer gráfico temos três elementos básicos

  1. Dados - nossa tabela de dados.
  2. Função aes() - que transforma os dados em objetos visuais.
  3. Objeto geométrico (geom) - que escolhe qual o formato destes objetos visuais.

Seguindo esta lógica e somando os objetos podemos criar belos gráficos.

ggplot(data = hprice1, aes(x = sqrft, y = price)) +
  geom_point(color = "#e63946", alpha = 0.75, size = 2) +
  geom_smooth(formula = y ~ poly(x, 2), method = "lm", se = FALSE) +
  labs(
    title = "Quanto maior, mais caro",
    subtitle = "Relação quadrática entre o preço do imóvel e sua área útil.",
    x = "Área útil (pés quadrados)",
    y = "Preço (USD milhares)",
    caption = "Fonte: Wooldridge (Boston Globe)"
    )