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 claro 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 no eixo vertical.

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 a função install.packages("ggplot2").

A cada vez que abrimos o R precisamos carregar os pacotes adicionais que instalamos previamente. Isto pode parecer trabalhoso à primeira vista: por que o R não automaticamente carrega todos os pacotes instalados? Isto seria ruim por diversos motivos.

Considere que cada projeto de R tem um objetivo diferente. Neste projeto, por exemplo, queremos visualizar dados, então não precisamos de outros

library(ggplot2)

Vamos aproveitar uma das bases de dados que já vem embutida no R. A base swiss contém informações sobre a taxa de fertilidade de províncias da Suécia, junto com informações socio-econômicas destas províncias. Visualização e análise de dados são habilidades complementares. Começamos explorando a estrutura geral dos dados

Visualização e análise de dados são habilidades complementares.

A função head(), quando aplicada a um objeto data.frame mostra as primeiras linhas da tabela.

head(swiss)
##              Fertility Agriculture Examination Education Catholic
## Courtelary        80.2        17.0          15        12     9.96
## Delemont          83.1        45.1           6         9    84.84
## Franches-Mnt      92.5        39.7           5         5    93.40
## Moutier           85.8        36.5          12         7    33.77
## Neuveville        76.9        43.5          17        15     5.16
## Porrentruy        76.1        35.3           9         7    90.57
##              Infant.Mortality
## Courtelary               22.2
## Delemont                 22.2
## Franches-Mnt             20.2
## Moutier                  20.3
## Neuveville               20.6
## Porrentruy               26.6
  • Dados
  • Função aes()
  • Objeto geométrico (geom)
ggplot(data = swiss, aes(x = Education, y = Fertility))+
  geom_point()

Renomeando os eixos do gráfico

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

  • title
  • subtitle
  • x
  • y
  • caption
  • tag
ggplot(data = swiss, aes(x = Education, y = Fertility))+
  geom_point()+
  labs(title = "Relação entre fertilidade e educação",
       x = "Percentual de pessoas com pelo menos ensino primário",
       y = "Medida normalizada de fertilidade",
       caption = "Fonte: https://opr.princeton.edu/archive/pefp/switz.aspx"
       )

Incluindo uma linha de regressão

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).

ggplot(data = swiss, aes(x = Education, y = Fertility))+
  geom_point()+
  geom_smooth(method = "lm")

Pode-se especificar uma forma específica para a regressão. No caso abaixo faço uma regressão polinomial de terceira ordem usando a função poly.

ggplot(data = swiss, aes(x = Education, y = Fertility))+
  geom_point()+
  geom_smooth(formula = y ~ poly(x, 3), method = "lm")

Poupança e renda disponível

head(LifeCycleSavings)
##              sr pop15 pop75     dpi ddpi
## Australia 11.43 29.35  2.87 2329.68 2.87
## Austria   12.07 23.32  4.41 1507.99 3.93
## Belgium   13.17 23.80  4.43 2108.47 3.82
## Bolivia    5.75 41.89  1.67  189.13 0.22
## Brazil    12.88 42.19  0.83  728.47 4.56
## Canada     8.79 31.72  2.85 2982.88 2.43
ggplot(data = LifeCycleSavings, aes(x = sr, y = ddpi))+
  geom_point()+
  geom_smooth(method = "lm")+
  labs(x = "Poupança indvidual", y = "Renda disponível per capita")

Note que há dois outliers notáveis. Quais países serão eles?

head(LifeCycleSavings[order(LifeCycleSavings$ddpi, decreasing = T), ])
##                sr pop15 pop75     dpi  ddpi
## Libya        8.89 43.69  2.07  123.58 16.71
## Jamaica      7.72 41.12  1.73  380.47 10.23
## Japan       21.10 27.01  1.91 1257.28  8.21
## Malta       15.48 32.54  2.47  601.05  8.12
## Netherlands 14.65 24.71  3.25 1740.70  7.66
## Portugal    12.49 28.96  2.85  579.51  7.48

A sintaxe pode parecer esotérica, mas com o tempo ele se tornará compreensível. Da mesma forma que há pacotes alternativos para visualização de dados, há outros para manipulação de dados, com sintaxes mais “intuitivas” que as funções base do R.

library(tidyverse)

LifeCycleSavings %>%
  arrange(desc(ddpi)) %>%
  head()
##      sr pop15 pop75     dpi  ddpi
## 1  8.89 43.69  2.07  123.58 16.71
## 2  7.72 41.12  1.73  380.47 10.23
## 3 21.10 27.01  1.91 1257.28  8.21
## 4 15.48 32.54  2.47  601.05  8.12
## 5 14.65 24.71  3.25 1740.70  7.66
## 6 12.49 28.96  2.85  579.51  7.48

plot e qplot

Qualidade do ar

Ozone Solar.R Wind Temp Month Day
41 190 7.4 67 5 1
36 118 8.0 72 5 2
12 149 12.6 74 5 3
18 313 11.5 62 5 4
NA NA 14.3 56 5 5
28 NA 14.9 66 5 6
plot(x = airquality$Temp, y = airquality$Ozone)

qplot(x = Temp, y = Ozone, data = airquality, geom = 'point')

qplot(x = Temp, y = Ozone, data = airquality, geom = 'point')+
  geom_smooth(method = "loess")+
  labs(x = "Temperatura (°F)", y = "Concentração de ozônio (partes por bilhão)")

Pétalas de flores

Ainda que um gráfico de dispersão típico esteja limitado a duas dimensões podemos incluir mais informações alterando as cores, os formatos e os tamanhos dos pontos.

ggplot(data = iris, aes(Petal.Width, Petal.Length))+
  geom_point(aes(colour = Species))

ggplot(data = airquality, aes(x = Temp, y = Ozone, colour = as.factor(Month), shape = as.factor(Month)))+
  geom_point()

library(gapminder); library(dplyr)
d <- filter(gapminder, year == 2007)
ggplot(d, aes(x = log10(gdpPercap), y = lifeExp))+
  geom_point(aes(colour = continent, size = pop))