“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
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))
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))
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()
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")
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, 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.
É 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")
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")
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:
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.
O quarto momento central é a curtose e analisa as caudas (extremidades) da distribuiçãoa. As considerações são as seguintes:
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
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.