Tipos de gráfico (barplot, boxplot, scatterplot, histograma).

“Um simples gráfico traz mais informações para a mente do analista de dados do que qualquer outro dispositivo.” John Tukey, estatístico (1915-2000)

Embora o R possua vários sistemas para criar gráficos, o ggplot2 é um dos mais elegantes e mais versáteis. O link para a seção de gráficos do livro R Graphics Cookbok cobre vários tópicos relacionados à presentação gráfica e à manipulação de dados.

library(tidyverse)  # inclui ggplot2

Scatterplot

Utilizamos o scatterplot, ou gráfico de dispersão, para responder perguntas como: carros com grandes motores consomem mais combustível do que carros com motores pequenos? Você provavelmente já tem uma resposta, mas tentemos fazer com que sua resposta seja evidente. O que a relação entre o tamanho do motor e a eficiência de uso de combustível parece mostrar? A relação é positiva? Negativa? Linear? Não-linear?

O arquivo mpg contém observações coletadas pela US Environment Protection Agency de 38 modelos de automóveis. Utilizaremos as variáveis displ (tamanho do motor em litros) e hwy (desempenho na autoestradas em em milha/galão).

data(mpg, package = 'ggplot2')
head(mpg)
ggplot(data = mpg) +
  geom_point(mapping = aes(x = displ, y = hwy)) 

Algumas variações

qplot(mpg$displ, mpg$hwy, geom = "point") +
  labs(title = "Dispersão", x = "displacement", y = "highway")

ggplot(data = mpg) +
  geom_point(mapping = aes(x = displ, y = hwy, color = class))

ggplot(data = mpg) +
  geom_point(mapping = aes(x = displ, y = hwy, size = class))

ggplot(data = mpg) +
  geom_point(mapping = aes(x = displ, y = hwy, alpha = class))

ggplot(data = mpg) +
  geom_point(mapping = aes(x = displ, y = hwy, shape = class))

Utilizando facets

df <- mtcars
# Converte cyl para fator (grupo)

df$cyl <- as.factor(df$cyl)

ggplot(df, aes(x = wt, y = mpg)) +
  geom_point(aes(color = cyl, shape = cyl))+
  geom_smooth(aes(color = cyl, fill = cyl), 
              method = "lm", fullrange = TRUE) +
  facet_wrap(~ cyl) +
  scale_color_manual(values = c("#00AFBB", "#E7B800", "#FC4E07"))+
  scale_fill_manual(values = c("#00AFBB", "#E7B800", "#FC4E07")) +
  theme_bw()

Introduzindo uma camada (layer)

ggplot(data = mpg, mapping = aes(x = displ, y = hwy)) +
  geom_point(mapping = aes(color = class), lwd = 4) +
  geom_smooth(data = filter(mpg, class == "suv"), se = TRUE) +
  ggtitle("Suvs")   

Boxplot

Utilizaremos um outro arquivo muito interessante chamado Diamonds, que corresponde a preços e atributos de quase 54.000 diamantes.

diamonds
ggplot(data = diamonds, mapping = aes(x=cut, y=price)) +
  geom_boxplot()

## Simples, elegante e, caso deseje enriquecer o seu trabalho:

ggplot(data=diamonds, mapping = aes(x = cut, y = price)) +
  geom_boxplot(fill = "cornflowerblue",
               color = "black", notch = TRUE)

Retornando ao arquivo mpg, talvez você deseje saber o desempenho por classes de veículos.

ggplot(data = mpg) +
  geom_boxplot(mapping = aes(
               x = reorder(class, hwy, FUN = median),
               y = hwy)) +
    labs(title ="Boxplot", x = "class")

Barplot (gráfico de barras)

Barplot, ou gráfico de barras, refere-se a um gráfico em que as barras representam a contagem de casos em cada categoria. É semelhante a um histograma, mas com variáveis discretas ao invés de contínuas.

Toothgrowth

É possível que a vitamina C possa afetar o crescimento dos dentes. A intenção é comparar o efeito de diferentes doses de vitamina C, entregues em dois métodos no crescimento dentário de porquinhos-da-índia.

A amostra é constituída de 60 animais. Cada animal recebeu 0,5, 1 ou 2 mg/dia de vitamina C na forma de suco de laranja ou ácido ascórbico. O estudo é realizado no conjunto de dados ToothGrowth do R.

O conjunto de dados contém 60 linhas e 3 colunas. As colunas são “len”, “supp” e “dose”, que indicam o comprimento dos odontoblastos (células responsáveis pelo crescimento dentário), método de suplemento (“OJ” para suco de laranja e “VC” para ácido ascórbico) e a dose diária, respectivamente.

tg <- ToothGrowth

head(ToothGrowth)
ggplot(data = tg, aes(x = dose, y = len)) +
  geom_bar(stat = "identity", fill = 'steelblue') +
  labs(title = "Bar Plot - dose de Vitamina C", 
       subtitle = "Dose de Vitamina C e Crescimento dos Dentes")

Alternativamente

ggplot(data = tg, aes(x = dose, y = len)) +
  geom_bar(stat = "identity", fill = 'red') +
  labs(title = "Bar Plot - dose de Vitamina C", 
  subtitle = "Crescimento dos Dentes e dose de Vitamina C") + 
  coord_flip()

Nota-se uma aparente relação direta entre doses de vitamina C e o crescimento dos dentes dos porquinhos-da-índia.

Qual parece ser o melhor método? “OJ” (suco de laranja) ou “VC” (ácido ascórbico)?

ggplot(data=tg, aes(x=dose, y=len, fill=supp)) +
  geom_bar(stat="identity")

Utilizando position = position_dodge()

tg1 <- ggplot(data = tg, aes(x = dose, y = len, fill = supp)) +
         geom_bar(stat = "identity", position = position_dodge())

tg1

Retornando ao boxplot

tg2 <- ggplot(ToothGrowth, aes(x = factor(dose), y = len, fill = supp)) + 
          geom_boxplot() +
            ggtitle('Tamanho dos dentes por suplemento e dosagem') +
            xlab('Dosagem (mg)') +
            ylab('Comprimento (mm)') +
            guides(fill = guide_legend(title = 'tipo de suplemento'))

tg2

ggplot(data = ToothGrowth) +
    geom_boxplot(mapping = aes(x = supp, y = len)) +
    facet_wrap(~ dose, ncol = 3) +
    ggtitle("Tamanho dos dentes por suplemento e dosagem") 

Histograma

Um histograma divide uma série de dados em diferentes classes igualmente espaçadas e mostra a frequência de valores em cada classe. Em um gráfico, o histograma mostra diferentes barras, com bases iguais e amplitudes relativas às frequências dos dados em cada classe. O eixo das ordenadas, portanto, mostra a frequência relativa de cada classe e o eixo das abcissas os valores e intervalos das classes.

O exame do histograma pode trazer informações relevantes sobre o fenômeno estudado, uma vez que seu formato sinaliza características deste fenômeno.

No exemplo, observa-se uma distribuição simétrica dos dados, o que permite inferir a média, a mediana e a moda.

ggplot(mpg, aes(x = hwy)) + 
    geom_histogram()

ggplot(mpg, aes(x = hwy)) + 
    geom_histogram(binwidth = 5, color = "red", fill = "steelblue")

Inferindo sobre a média, mediana, moda e a função de densidade de probabilidade

Assimetria (o terceiro momento)

As três medidas de tendência central (média, moda e mediana) referem-se à simetria da distribuição dos dados. Quando a distribuição dos valores é simétrica, as ordens de grandeza das três medidas se aproximam, mas elas se distanciam à medida que ocorra assimetria para a esquerda ou para a direita, conforme retratam as figuras a seguir.

Como vimos anteriormente, o R não possui uma função para a moda. Desta forma, escrevemos um script para uma função moda:

Criando uma função para Moda:

moda <- function(v) {
  uniqv <- unique(v)
  uniqv[which.max(tabulate(match(v, uniqv)))]
}

Vamos utilizar novamente o arquivo diamonds.

v <- diamonds$price

moda(v)
## [1] 605
mean(v)
## [1] 3932.8
median(v)
## [1] 2401
ggplot(diamonds, aes(x = price, y = ..density..))  +

  geom_histogram(binwidth = 10, color = "gray", fill = "white")  +

  geom_vline(xintercept = mean(diamonds$price), color = "green", 
             linetype = "dashed", lwd = 1) +

  geom_vline(xintercept = median(diamonds$price), color = "red", 
             linetype = "dashed", lwd = 1) +

  geom_vline(xintercept = moda(diamonds$price), color = "yellow", 
             linetype = "dashed", lwd = 1) +

  geom_density(color="steelblue", lwd = 1)

Observe que a média (em verde no gráfico) é maior que a mediana (em vermelho), que, por sua vez, é maior que a moda (em amarelo). A função densidade de probabilidade permite uma visualização acurada desta distribuição. Denominamos de assimetria à direita.

Um segundo exemplo no arquivo Diamonds. A profundidade (volume) do diamante:

v <- diamonds$depth

moda(v)
## [1] 62
median(v)
## [1] 61.8
mean(v)
## [1] 61.7494
ggplot(diamonds, aes(x = v, y =..density..)) +
  geom_histogram(binwidth = 1, color = "grey") +
  geom_vline(xintercept = mean(v), color = "darkgreen", 
             linetype = "dashed", lwd = 1) +
  geom_vline(xintercept = median(v), color = "red", 
             linetype = "dashed", lwd = 1)+
  geom_vline(xintercept = moda(v), color = "yellow", 
             linetype = "dashed", lwd = 1) +
  geom_density(color = "steelblue", lwd = 1) +
  labs(title = "Simetria", x = "depth", y= "density")

A média é praticamente igual a mediana, que, por sua vez, é praticamente igual a moda. Podemos considerar a distribuição praticamente simétrica.

Curtose

O quarto momento central é a curtose e analisa as caudas (extremidades) da distribuiçãoa. As considerações são as seguintes:

  • Distribuição em formato de sino (gaussiana) apresenta um valor de curtose igual a zero.
  • Distribuição mais aplainada que a gaussiana apresenta um valor negativo.
  • Distribuição com um pico acentuado apresenta um valor positivo para a curtose

O pacote e1071 possui uma função para o cálcula da curtose.

library(e1071)       

kurtosis(diamonds$price)
## [1] 2.177191
kurtosis(diamonds$carat)
## [1] 1.25625
kurtosis(diamonds$depth)
## [1] 5.738447

Exercício: Bolsa de valores

Analisaremos a distribuição de dados do mercado financeiro neste exercício por meio do histograma, da análise de tendência central e dos terceiros e quartos momentos. Esses dados serão obtidos do sítio yahoo.finance.

library(quantmod)
library(BatchGetSymbols)

inicio <- as.Date("2016-01-02")
fim <- Sys.Date()

getSymbols("^GSPC", src = "yahoo", from = inicio, to = fim)
## [1] "^GSPC"
GSPC <- na.omit(GSPC)

retorno <- diff(log(Cl(GSPC))) # Cl() obtém o preço de fechamento
retorno <- na.omit(retorno)

ggplot(retorno, aes(x = retorno$GSPC.Close)) +
   geom_histogram(fill = 'steelblue')

Calcular o retorno anual e a volatilidade implícita ano do ativo.