Data Visualization


Análise Exploratória de Dados (EDA)

  • Os gráficos para análise exploratória abrangem os 4 primeiros objetivos, ou seja, não são para comunicar um resultado final do seu trabalho.
  • Características:
    1. Feitas rapidamente e em grande quantidade
    2. O objetivo é o entendimento dos dados
    3. Eixos/legendas normalmente são retiradas
    4. Cores/tamanhos são primariamente usadas para informação
  • Principais gráficos:
    1. Diagrama de caixa (Boxplot)
    2. Histogramas
    3. Gráfico de barra (Barplot)
    4. Gráfico de dispersão (Scatterplot)

Como exemplo, usaremos dados da Agência de Proteção Ambiental dos EUA (EPA), avgpm25.csv, que informa a quantidade de poluição por partícula fina (PM2.5). A média anual de PM2.5 que não pode exceder 12 $\mu g/m^3$.

pollution = read.csv("https://fhnishida.netlify.app/project/rec5004/avgpm25.csv")
summary(pollution)
##       pm25             fips          region            longitude      
##  Min.   : 3.383   Min.   : 1003   Length:576         Min.   :-158.04  
##  1st Qu.: 8.549   1st Qu.:16038   Class :character   1st Qu.: -97.38  
##  Median :10.047   Median :28034   Mode  :character   Median : -87.37  
##  Mean   : 9.836   Mean   :28431                      Mean   : -91.65  
##  3rd Qu.:11.356   3rd Qu.:41045                      3rd Qu.: -80.72  
##  Max.   :18.441   Max.   :56039                      Max.   : -68.26  
##     latitude    
##  Min.   :19.68  
##  1st Qu.:35.30  
##  Median :39.09  
##  Mean   :38.56  
##  3rd Qu.:41.75  
##  Max.   :64.82

Diagrama de caixa (Boxplot)

  • Apresenta mínimo, máximo, os quartis e outliers.
boxplot(pollution$pm25, col="blue")
abline(h=12, col="red") # Linha horizontal no valor 12
- Para múltiplos boxplots, usamos ` ~ `:
boxplot(pollution$pm25 ~ pollution$region, col="blue")
abline(h=12, col="red") # Linha horizontal no valor 12

Histograma

hist(pollution$pm25, col="green")
hist(pollution$pm25, col="green", breaks=100) # 100 quebras
rug(pollution$pm25) # Traços dos valores da amostra abaixo do histograma 
abline(v=12, col="red") # Linha vertical no valor 12
- Podemos colocar mais de um gráfico numa figura usando a função `par(mfrow, mar)`:
par(mfrow=c(2, 1), mar=c(4, 4, 2, 1)) # Criando figura com 2 linhas e 1 coluna + margens

pol_west = pollution[pollution$region == "west",]
pol_east = pollution[pollution$region == "east",]

hist(pol_west$pm25, col="green")
hist(pol_east$pm25, col="green")
  • Note que você precisa usar par(mfrow=c(1, 1)) para voltar a incluir apenas 1 gráfico na figura.

Gráfico de barra (Barplot)

barplot(table(pollution$region), col="wheat",
        main="Nº de países em cada região")

Gráfico de dispersão (Scatterplot)

  • Gera gráficos sob 2 dimensões
plot(pollution$latitude, pollution$pm25)
abline(h=12, lwd=1.5, lty=2, col="red")
abline(lm(pm25 ~ latitude, data=pollution), col="blue")
par(mfrow=c(1, 2), mar=c(4, 4, 2, 1)) # Criando figura com 1 linha e 2 colunas + margens

plot(pol_west$latitude, pol_west$pm25, main="West")
plot(pol_east$latitude, pol_east$pm25, main="East")
  • Também é possível adicionar objetos gráficos e textos no gráfico gerado por plot():
    • abline(): adiciona linhas horizontal, vertical ou de regressão
    • points(): adiciona pontos ao gráfico
    • lines(): adiciona linhas ao gráfico
    • text(): adiciona texto ao gráfico
    • title(): adiciona anotações aos eixos, título, subtítulo e margem exterior
    • mtext(): adiciona texto às margens (interna e externa) do gráfico
    • axis(): adiciona traços/rótulos aos eixos
par(mfrow=c(1, 1)) # Retornando ao padrão

air_may = airquality[airquality$Month==5,]
air_other = airquality[airquality$Month!=5,]

plot(airquality$Wind, airquality$Ozone, main="Ozone and Wind in NYC")
points(air_may$Wind, air_may$Ozone, col="blue")
points(air_other$Wind, air_other$Ozone, col="red")
legend("topright", pch=1, col=c("blue", "red"),
       legend=c("May", "Other Months"))

Alguns parâmetros gráficos importantes:

  • pch: símbolo dos pontos gráficos (padrão é círculo)
  • lty: tipo da linha (padrão é linha sólida, mais pode ser pontilhado, etc.)
  • lwd: grossura da linha (integer)
  • col: cor, especificada como número, texto ou código hex (função colors() dá um vetor de cores por nome)
  • xlab: rótulo do eixo x
  • ylab: rótulo do eixo y
  • par(): função que especifica parâmetros globais que afetam todas figuras:
    • las: orientação dos rótulos
    • bg: cor de fundo
    • mar: tamanho da margem
    • oma: tamanho da margem externa (padrão é 0)
    • mfrow: número de gráficos por linha
    • mfcol: número de gráficos por coluna

Grammar of Graphics (ggplot2)

  1. Data Frame
head(mtcars)
##                    mpg cyl disp  hp drat    wt  qsec vs am gear carb
## Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
## Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
## Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
## Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
## Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
## Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1
  1. Base do Gráfico (ggplot())
    • dados que serão incluídos no gráfico
    • toda vez que for incluir uma variável, é necessário precisa usar a função aes() sobre elas
library(ggplot2)
g = ggplot(data=mtcars, aes(mpg, wt)) # Criando a base do gráfico
g
  1. Layer geomético (geom)
    • incluindos formas, linhas e pontos
    • caso não sejam informadas novas variáveis, a função para criar um objeto geométrico irá usar as variáveis-base definidas na função ggplot() inicial
    • Junta-se a base do gráfico com outras layers usando o sinal +
g + geom_point()
  1. Layer de suavização/tendência (smooth)
g + geom_point() + geom_smooth(method="lm") # suavização a partir de OLS
## `geom_smooth()` using formula = 'y ~ x'
  1. Layers condicionais (facets)
g + geom_point() + geom_smooth(method="lm") + facet_grid(. ~ cyl) # agrupando por nº cilindros horizontalmente
## `geom_smooth()` using formula = 'y ~ x'
g + geom_point() + geom_smooth(method="lm") + facet_grid(cyl ~ .) # agrupando por nº cilindros verticalmente
## `geom_smooth()` using formula = 'y ~ x'
  1. Anotações
    • Rótulos: xlab(), ylab(), labs(), ggtitle()
    • Cada geom tem opções para modificar, mas use theme() para opções globais do gráfico. Use ?theme e veja a quantidade de configurações você pode fazer no seu gráfico.
    • Se quiser temas pré-definidos, há 2 templates padrão theme_gray() e theme_bw() (preto/branco). Também é possível usar outros usando o pacote ggthemes.
g + geom_point() + ggthemes::theme_economist() + 
    ylab("Peso (libras)") + xlab("Milhas por galão") +
    ggtitle("Milhas por galão X Peso do carro")
  1. Modificando Estética
    • Dentro de cada geom, podemos definir a cor (color), o tamanho (size) e a transparência (alpha)
g + geom_point(color="steelblue", size=9, alpha=0.4)
g + geom_point(aes(color=cyl), size=9, alpha=0.4) # colorindo por variável - precisa usar aes()