Visualização de Dados

Visualização de Dados

Não se deve menosprezar a nossa capacidade para detectar padrões em dados.

        x      y
1  -0.978  0.211
2   1.000 -0.013
3  -0.928 -0.373
4  -0.541 -0.841
5   0.628 -0.779
6  -0.191  0.982
7  -0.236  0.972
8   0.926  0.377
9  -0.961 -0.276
10 -0.883  0.469
11  0.902  0.433
12 -0.485  0.875
13  0.748 -0.663
14  0.640 -0.768
15 -0.523  0.853
16 -0.345 -0.939
17  0.473  0.881
18  0.644  0.765
19 -0.449 -0.894
20  0.610 -0.792
21  0.958 -0.286
22 -0.827  0.562
23  0.790 -0.613
24 -0.952 -0.306
25  0.675 -0.738

Apresentados neste formato é difícil discernir padrões, mas…

Visualização de Dados

A melhor forma para o cérebro detectar padrões é através do uso de gráficos:




        x      y
1  -0.978  0.211
2   1.000 -0.013
3  -0.928 -0.373
4  -0.541 -0.841
5   0.628 -0.779
6  -0.191  0.982
7  -0.236  0.972
8   0.926  0.377
9  -0.961 -0.276
10 -0.883  0.469
11  0.902  0.433
12 -0.485  0.875
13  0.748 -0.663
14  0.640 -0.768
15 -0.523  0.853
16 -0.345 -0.939
17  0.473  0.881
18  0.644  0.765
19 -0.449 -0.894
20  0.610 -0.792
21  0.958 -0.286
22 -0.827  0.562
23  0.790 -0.613
24 -0.952 -0.306
25  0.675 -0.738




plot of chunk unnamed-chunk-3

Pacote ggplot2

As funções base do R possuem múltiplas funções para visualização: plot, hist, …

Aqui iremos usar o pacote ggplot2 que fornece uma gramática para a construção de gráficos.

# install.packages("ggplot2")
library(ggplot2)

O gráfico anterior foi construído pelo seguinte código:

ggplot(data=points) + 
  geom_point(mapping=aes(x=x, y=y)) +
  theme_bw()

onde o operador + tem um funcionamento similar ao operador %>%.

Conceitos

Estes são os conceitos importantes da gramática de gráficos implementada pelo pacote ggplot2:

  • Estéticas (aes) – descrevem qual o aspecto dos dados: a sua cor, forma, posição vertical ou horizontal

  • Objectos geométricos (geoms) – objectos que se vêm no gráfico, como linhas ou pontos

  • Estatísticas (stats) – são sumários dos dados

  • Escalas (scales) – são funções que mapeiam os dados nas estéticas (eg, definir eixos lineares ou logarítmicos), para cada estética tem de haver uma escala

  • Sistemas de coordenadas (coord)

  • Facetas (facets) – que permitem separar os dados em subcategorias, cada uma com um gráfico associado

Um exemplo de dados: Diamonds

Este dataset está incluído no pacote ggplot2 e contém 54000 diamantes com vários atributos e respectivo preço:

set.seed(101)
d <- diamonds[sample(nrow(diamonds), 100), ]  # usar apenas alguns exemplos do dataset
head(d, 12)
      carat       cut color clarity depth table price    x    y    z
20077  1.00 Very Good     F    VVS2  60.0    62  8553 6.43 6.46 3.87
2364   0.90   Premium     J     VS1  62.3    56  3175 6.23 6.19 3.87
38279  0.21   Premium     D     VS2  59.1    62   386 3.89 3.86 2.29
35474  0.39     Ideal     G    VVS2  61.9    56   902 4.68 4.70 2.90
13477  1.15     Ideal     I     VS2  61.7    57  5534 6.72 6.74 4.15
16184  1.10   Premium     D     SI1  60.7    55  6468 6.74 6.71 4.08
31545  0.30     Ideal     E    VVS2  61.6    58   766 4.28 4.33 2.65
17985  1.07     Ideal     G     VS2  61.9    55  7275 6.55 6.57 4.06
33547  0.35     Ideal     D     VS2  62.4    55   829 4.48 4.52 2.81
29438  0.38   Premium     I     VS1  59.9    60   700 4.66 4.72 2.81
47448  0.53     Ideal     D     VS2  61.2    56  1857 5.20 5.23 3.19
38122  0.30   Premium     G    VVS1  60.7    59  1013 4.37 4.33 2.64

Criar um objeto gráfico com ggplot

A função ggplot cria um gráfico mas ainda sem visualização:

ggplot(d, aes(carat, price, colour=cut))

plot of chunk unnamed-chunk-7

Já foi fornecida uma estética: a cor de cada diamante é determinada pela variável categórica cut.

Mas ainda não estabelecemos qual o objecto gráfico, qual o geom, que queremos.

Aplicar um objecto geométrico

Podemos definir o geom como sendo pontos:

ggplot(d, aes(carat,price,colour=cut)) +
  geom_point()

plot of chunk unnamed-chunk-8

Ou podemos definir o geom como sendo linhas:

ggplot(d, aes(carat,price,colour=cut)) +
  geom_line()

plot of chunk unnamed-chunk-9

Aplicar mais que um geom

Ou podemos aplicar os dois geoms anteriores ao mesmo tempo:

ggplot(d, aes(carat, price, colour=cut)) +
  geom_point(aes(size=price)) +
  geom_line()

plot of chunk unnamed-chunk-10

Aplicar mais que um geom

Outro exemplo:

ggplot(d, aes(x*y*z, price)) +   # x*y*z é uma aproximação do volume do diamante
  geom_point(aes(shape=cut)) +
  geom_smooth(level=0.95)

plot of chunk unnamed-chunk-11

O geom geom_smooth cria automaticamente um intervalo de confiança com o nível desejado.

Aplicar mais que um geom

O mesmo exemplo mas salientando a qualidade do diamante:

ggplot(d, aes(x*y*z, price)) +
  geom_point(aes(colour=cut), size=1.5) +
  geom_smooth(level=0.95)

plot of chunk unnamed-chunk-12

Separar em grupos

Podemos separar os dados em grupos distintos (no exemplo seguinte dividimos por qualidade do corte) e podemos visualizar cada grupo de forma distinta (por exemplo, com cores ou padrões diferentes):

ggplot(d, aes(carat, price, colour=cut, group=cut)) +
  geom_point() +
  geom_smooth(method="lm", level=0.5)

plot of chunk unnamed-chunk-13

Separar em grupos

Outro exemplo. Neste caso o geom geom_boxplot faz o agrupamento automaticamente:

ggplot(d, aes(cut, price)) +
  geom_boxplot() 

plot of chunk unnamed-chunk-14

Restringir os dados

É também possível restringir os dados num geom. Aqui apenas fazemos a regressão linear para os diamantes com corte ideal:

ggplot(d, aes(carat, price)) +
  geom_point(aes(colour=cut)) +
  geom_smooth(data=subset(d, cut=="Ideal"), method="lm")

plot of chunk unnamed-chunk-15

O geom gráfico de barras

Este geom produz um gráfico de barras:

ggplot(diamonds) + 
  geom_bar(aes(x=cut, fill=cut))

plot of chunk unnamed-chunk-16

O geom gráfico de barras

Se dermos ao argumento fill outro campo, o ggplot2 faz um gráfico de barras empilhado:

ggplot(diamonds) + 
  geom_bar(aes(x=cut, fill=clarity))

plot of chunk unnamed-chunk-17

O geom gráfico de barras

Se, no entanto, quisermos as barras ao lado umas das outras é preciso explorar outras opções:

ggplot(diamonds) + 
  geom_bar(aes(x=cut, fill=clarity), position="dodge")

plot of chunk unnamed-chunk-18

Nota: existem muitas opções e é preciso explorar os ficheiros de ajuda, livros ou tutoriais na internet para encontrar o que queremos.

O geom histograma

ggplot(diamonds, aes(x=carat)) +
  geom_histogram(binwidth=0.1, fill="steelblue") 

plot of chunk unnamed-chunk-19

O geom densidade

ggplot(d, aes(x=carat)) +
  geom_density() 

plot of chunk unnamed-chunk-20

Conectar objectos geométricos com estatísticas

Cada geom calcula uma estatística, um stats, para apresentar o respectivo gráfico.

Alguns usam os dados directamente (como o geom_point) outros calculam estatísticas dos dados para mostrar essa contagem (como o geom_bar que soma os valores, ou o geom_boxplot que calcula quartis).

É possivel mudar essa estatística dizendo ao ggplot o que calcular.

ggplot(diamonds, aes(carat)) + 
  xlim(0, 3) + 
  geom_area(stat="density")

plot of chunk unnamed-chunk-21

Conectar objectos geométricos com estatísticas

O mesmo gráfico com outra estatística (bin conta os vários elementos que se encontram em intervalos sucessivos):

ggplot(diamonds, aes(carat)) + 
  xlim(0, 3) + 
  geom_area(stat="bin", binwidth=0.1)

plot of chunk unnamed-chunk-22

Conectar objectos geométricos com estatísticas

Algumas estatísticas são calculadas a partir das funções stat_XX do ggplot2:

p <- ggplot(d, aes(carat, price))
p + geom_point()
p + geom_density2d(stat="density2d")
p + stat_binhex(bins=10)

plot of chunk unnamed-chunk-24

Mudança de coordenadas

ggplot(data = diamonds) + 
  geom_bar(aes(x=cut, fill=cut), width=1) + 
  coord_polar()

plot of chunk unnamed-chunk-25

ggplot(data = diamonds) + 
  geom_bar(aes(x=factor(1), fill=cut), width=1) + # fica só com uma coluna
  coord_polar(theta="y")

plot of chunk unnamed-chunk-26

Mudança de coordenadas

Um exemplo mais complexo com mapas:

library(maps)

m <- map_data("italy")
p <- ggplot(m, aes(x=long, y=lat, group=group)) +
        geom_polygon(fill="white", colour="black")
p                # coordenadas cartesianas
p + coord_map()  # projecao de marcator

plot of chunk unnamed-chunk-28

Facetas

As facetas permitem multiplicar os gráficos por cada categoria:

ggplot(d, aes(carat, price, colour=cut, group=cut)) +
  geom_point() +
  geom_smooth(method="lm", level=0.5) +
  facet_wrap(~ cut)

plot of chunk unnamed-chunk-29

Facetas

Esta técnica salienta os dados de cada categoria:

df <- dplyr::select(iris, -Species)

ggplot(iris, aes(Sepal.Length, Petal.Length)) + theme_bw() +
  geom_point(data=df, colour="grey70") +
  geom_point(aes(colour=Species)) +
  facet_wrap(~ Species)

plot of chunk unnamed-chunk-30

Estrutura de um gráfico ggplot

O gráfico típico em ggplot segue este padrão:

ggplot(data = <DATA>) + 
  <GEOM_FUNCTION>( mapping  = aes(<MAPPINGS>),
                   stat     = <STAT>, 
                   position = <POSITION> ) +
  <COORDINATE_FUNCTION> +
  <FACET_FUNCTION>

Links úteis: