6 Modelos Gráficos

6.1 Gráfico de Barras

  • O gráfico de barras é adequado para variáveis qualitativas (nominais ou ordinais) e também para variáveis quantitativas discretas.

  • Exemplo 1: Variável Qualitativa Nominal (Gênero de filme)

Gênero Freq FreqRel
Aventura 8 0.3478261
Ação 2 0.0869565
Comédia 4 0.1739130
Drama 3 0.1304348
Esporte 3 0.1304348
Ficção Científica 1 0.0434783
Musical 2 0.0869565
graf_genero_f <- filmes_pixar %>% 
  ggplot() + theme_bw() + xlab("genero") + ylab("Freqûencia") +
  geom_bar(aes(x = genero, fill= genero)) + 
  scale_fill_manual("genero", values = c("Aventura" = "deeppink", 
                   "Comédia" = "magenta", "Ação" = "coral2", 
                   "Esporte" = "seagreen1", "Drama" = "turquoise3", 
                   "Musical" = "maroon3", "Ficção Científica" = "royalblue"))

graf_genero_p <- tab_genero %>% 
  ggplot() + theme_bw() + xlab("genero") + ylab("Proporção") +
  geom_bar(aes(x= Gênero, fill= Gênero, y=FreqRel), stat="identity") + 
  scale_fill_manual("genero", values = c("Aventura" = "deeppink", 
                    "Comédia" = "magenta", "Ação" = "coral2", 
                    "Esporte" = "seagreen1", "Drama" = "turquoise3", 
                    "Musical" = "maroon3", "Ficção Científica" = "royalblue"))

# ggpubr::ggarrange(graf_genero_f,graf_genero_p, legend="none")
ggpubr::ggarrange(graf_genero_f, graf_genero_p, legend = "none", ncol = 1)

  • Exemplo 2: Variável Quantitativa (duração do filme)
Faixa_duracao Freq FreqRel
[81,86] 1 0.0434783
(91,96] 7 0.3043478
(96,101] 5 0.2173913
(101,106] 6 0.2608696
(106,111] 1 0.0434783
(111,116] 1 0.0434783
NA 2 0.0869565
tab_duracao %>% 
  ggplot() + theme_bw() + xlab("Duração do filme") + ylab("Proporção") +
  geom_bar(aes(x= Faixa_duracao, y= FreqRel), fill="royalblue", stat="identity")


6.2 Gráfico de Setores (Pizza)

  • Pode ser utilizado para variáveis qualitativas.
pizza_genero <- tab_genero %>% 
  mutate(Porc = scales::percent(FreqRel)) %>% 
  ggplot(aes(x = "", y = FreqRel, fill = Gênero)) +
  geom_col(color = "white") + 
  geom_label(aes(label = Porc), #color = c(1, "white", "white"),
        position = position_stack(vjust = 0.5),
        show.legend = FALSE) + guides(fill = guide_legend(title = "")) +
        scale_fill_manual("Gênero dos filmes", values =c("Aventura" = "deeppink", 
                        "Comédia" = "magenta", "Ação" = "coral2", 
                        "Esporte" = "seagreen1", "Drama" = "turquoise3", 
                        "Musical" = "maroon3", "Ficção Científica" = "royalblue1")) +
  coord_polar(theta = "y") + ggtitle("Gênero dos filmes") +
  theme_void() + theme(legend.position="bottom", 
                       plot.title = element_text(hjust = 0.5))

ggpubr::ggarrange(pizza_genero)

  • Por que deve ser evitado?
    • Quando as frequências são muito pequenas (abaixo de 5%, por exemplo), as fatias se tornam de difícil visualização.
    • Dependem do uso de cores. Isso pode dificultar a escolha de cores que sejam suficientemente contrastantes para uma melhor visualização. Isso pode ser ainda mais prejudicado dependendo do dispotitivo que for visualizar o gráfico (se a impressão ou o monitor for de baixa qualidade, por exemplo). Por fim, isso pode dificultar a visualização por pessoas que tem dificuldades em enxergar cores (cerca de 8% da população masculina é daltônica, por exemplo).
    • A comparação direta entre dois gráficos de pizza é bem mais difícil que em gráficos de barras. No segundo é bem mais facil visualizar diferenças, se esse for seu objetivo.
    • Ainda assim, podem ser utilizados em casos específicos onde os problemas anteriores não ocorrem (quando há poucas categorias, nenhuma delas com frequencias muito baixas e as diferenças são muito evidentes ou o objetivo não é fazer comparações).

6.3 Histograma

  • Adequado para variáveis quantitativas (contínuas).
  • Apesar de ser parecido com o gráfico de barras, no histograma as bases dos retângulos são proporcionais aos intervalos das classes e as áreas de cada retângulo devem ser proporcionais às frequências de cada classe.
Bilheteria_Mundial Freq FreqRel
1.1 bilhão |– 1.3 bilhão 1 0.0434783
300 milhões |– 500 milhões 8 0.3478261
500 milhões |– 700 milhões 6 0.2608696
700 milhões |– 900 milhões 5 0.2173913
900 milhões |– 1.1 bilhão 3 0.1304348
filmes_pixar %>% ggplot() + theme_bw() +
  geom_histogram(aes(bilheteria_mundial), color="black", fill="royalblue", 
                 breaks= c(300000000, 500000000, 700000000, 900000000, 
                           1100000000, 1300000000))

  • Quando as faixas tem tamanhos diferentes, não é adequado usar as frequências absolutas ou relativas no eixo y pois a área do gráfico correspondente pode dar a impressão de que as frequências são maiores do que efetivamente foi observado. É possível ver isso no gráfico a seguir.
  • Neste caso, o ideal é utilizar a densidade de frequência no eixo y, dada por \(d_i = \frac{f_i}{\delta_i}\), onde \(\delta_i\) é o comprimento da faixa.
Bilheteria_Mundial Freq FreqRel delta Dens
1.1 bilhão |– 1.3 bilhão 1 0.0434783 0.2 0.2173913
300 milhões |– 500 milhões 8 0.3478261 0.1 3.4782609
500 milhões |– 700 milhões 6 0.2608696 0.1 2.6086957
700 milhões |– 900 milhões 5 0.2173913 0.1 2.1739130
900 milhões |– 1.1 bilhão 3 0.1304348 0.1 1.3043478
#hist_bilheteria_c <- 
filmes_pixar %>% ggplot() + theme_bw() +
  geom_histogram(aes(bilheteria_mundial), color="black", fill="royalblue", 
                 breaks= c(300000000, 500000000, 700000000, 900000000, 
                           1100000000, 1300000000))

#hist_bilheteria_m <- 
filmes_pixar %>% ggplot() + theme_bw() +
  geom_histogram(aes(bilheteria_mundial,after_stat(density)), 
                 color="black", fill="royalblue", 
                 breaks= c(300000000, 500000000, 700000000, 900000000, 
                           1100000000, 1300000000))

#ggpubr::ggarrange(hist_bilheteria_c, hist_bilheteria_m, ncol=1)
  • Note que desta forma, a área total do histograma é igual a 1.

6.3.1 Números de faixas e largura

Para construir um histograma, não existe um número correto de faixas, e diferentes larguras podem revelar diferentes aspectos dos dados. Faixas mais largas ajudam a reduzir o ruído onde há poucos dados, enquanto faixas mais estreitas aumentam a precisão onde há muitos dados. Existem diferentes métodos para fazer essa escolha, alguns exemplos são:

Fórmula de Sturges:

Uma opção simples é usar a Fórmula de Sturges, que calcula o número de faixas a partir do tamanho da amostra:

\[ k = \lceil \log_2 n \rceil + 1 \] Esse é o método padrão usado pelo R base. Como esse método calcula o número de faixas com base no tamanho da amostra \(n\), ela pode ter um desempenho ruim quando \(n < 30\), pois gera poucas faixas, o que dificulta a visualização de tendências. Para grandes conjunto de dados, ela pode superestimar a largura das faixas, gerando um histogramas execivamente suavizado. Além disso, pode não funcionar bem para dados que não seguem uma distribuição normal.

Regra de Referência Normal de Scoot:

Outra método é a Regra de Referência Normal de Scott, que busca minimizar o erro na estimativa da densidade. Ela define a largura \(h\) das faixas como:

\[ h = \frac{3,49 \cdot \text{desvio padrão}}{\sqrt[3]{n}} \]

Essa abordagem é melhor para dados com variabilidade semelhante à de uma distribuição normal.

Regra de Freedman-Diaconis:

Outro exemplo é a regra de Freedman–Diaconis, que é mais robusta a dados assimétricos ou com outliers, usando o intervalo interquartil (IQR) no lugar do desvio padrão, ele define a largura \(h\) das faixas como:

\[ h = 2 \cdot \frac{\text{IQR}(x)}{\sqrt[3]{n}} \]

Ela se adapta melhor a distribuições que não são tão bem comportadas.

Exemplo no R:

Para criar um histograma no R usando o número de faixas (ou largura das faixas) usando a fórmula desejada, é possível calcular o valor manualmente e depois passá-lo para o argumento breaks da função hist().

# Exemplo usando a fórmula de Sturges:
n <- length(dados)  # Tamanho da amostra
k_sturges <- 1 + log2(n)  # Fórmula de Sturges

hist(dados, breaks = k_sturges)

Além disso, também é possível usar um número de faixas diretamente, colocando o valor de breaks como um número inteiro.

Assim, dependendo do tipo de dado e do objetivo da análise, podemos escolher o método mais adequado para definir o número de faixas no histograma. Para encontrar outros métodos e fórmulas, basta acessar o site aqui.


6.4 Ramos e Folhas

  • Similar a um histograma mas com menos perda de informação.
duracao
81
92
92
93
93
95
95
96
97
98
100
100
100
102
102
103
104
105
106
111
115
117
118
stem(filmes_pixar$duracao)
## 
##   The decimal point is 1 digit(s) to the right of the |
## 
##    8 | 1
##    9 | 223355678
##   10 | 000223456
##   11 | 1578
Bilheteria_Mundial Freq FreqRel delta Dens
1.1 bilhão |– 1.3 bilhão 1 0.0434783 0.1 0.4347826
300 milhões |– 500 milhões 8 0.3478261 0.1 3.4782609
500 milhões |– 700 milhões 6 0.2608696 0.1 2.6086957
700 milhões |– 900 milhões 5 0.2173913 0.1 2.1739130
900 milhões |– 1.1 bilhão 3 0.1304348 0.1 1.3043478
stem(filmes_pixar$bilheteria_mundial / 1e9) 
## 
##   The decimal point is at the |
## 
##   0 | 113444
##   0 | 5555666677899
##   1 | 0112
  • Não é adequado quando temos grandes bancos de dados e não tem o mesmo efeito visual de um boxplot.

6.5 Box-Plot

  • Utilizado para representar graficamente os quartis, além dos valores mínimo e máximo.
filmes_pixar %>% ggplot() + theme_bw() + 
  geom_boxplot(aes(y=duracao), color="black", fill="royalblue") 

  • No retângulo estão representados os quartis \(q_1\), \(q_2\) e \(q_3\).

  • A reta acima do retângulo se estende até o valor máximo observado, desde que esse não seja maior que \(q_3 + 1.5 \cdot d_q\).

  • Do mesmo modo, a reta abaixo do retângulo do retângulo se estende até o mínimo, desde que esse não seja menor que \(q_1 - 1.5 \cdot d_q\).

  • Se houver valores que excedam os limites acima propostos, a reta acima (abaixo) do retângulo vai até o maior (menor) valor menor (maior) que \(q_3 + 1.5 \cdot d_q\) \(\left(q_1 - 1.5 \cdot d_q\right)\).

  • Os valores fora destes limites serão representados por asteriscos e são chamados de outliers (ou valores atípicos)

  • É possivel incluir os pontos observados no boxplot para não ter perda de informação.

filmes_pixar %>% ggplot(aes(x="",y=duracao)) + theme_bw() + 
  geom_boxplot(color="black", fill="royalblue") + 
  ggbeeswarm::geom_beeswarm(cex=3,size=3,method = "center")

  #geom_dotplot(binaxis= "y",stackdir = "center",fill = 1,dotsize = 0.8,stackratio=2)
  #geom_jitter(color="black", size=1, alpha=0.9)

6.6 Gráficos e simetria

set.seed(13)

simul <- tibble(y = rnorm(150,2.5,1))
lim = c(min(simul$y),max(simul$y))

hist <- simul %>% ggplot() + theme_classic() + xlab("") + xlim(lim[1],lim[2]) + 
  ggtitle("Simetria") +
  geom_histogram(aes(y,after_stat(density)), 
                 color="black", fill="royalblue", bins=8)

box <- simul %>% ggplot(aes(x="",y=y)) + 
  theme_classic() + coord_flip() + xlab("") + ylab("") + ylim(lim[1],lim[2]) +
  geom_boxplot(color="black", fill="royalblue")  
  #ggbeeswarm::geom_beeswarm(cex=1,size=1,method = "center")

ggpubr::ggarrange(hist, box, heights = c(2, 1), nrow=2, align = "v")

set.seed(13)

simul <- tibble(y = rgamma(150,2.5,1))
lim = c(min(simul$y),max(simul$y))

hist <- simul %>% ggplot() + theme_classic() + xlab("") + xlim(lim[1],lim[2]) +
  ggtitle("Assimetria à Direita") +
  geom_histogram(aes(y,after_stat(density)), 
                 color="black", fill="royalblue", bins=10)

box <- simul %>% ggplot(aes(x="",y=y)) + 
  theme_classic() + coord_flip() + xlab("") + ylab("") + ylim(lim[1],lim[2]) +
  geom_boxplot(color="black", fill="royalblue")  
  #ggbeeswarm::geom_beeswarm(cex=1,size=1,method = "center")

ggpubr::ggarrange(hist, box, heights = c(2, 1), nrow=2, align = "v")

simul <- lim[2]-simul+lim[1]
lim = c(min(simul$y),max(simul$y))

hist <- simul %>% ggplot() + theme_classic() + xlab("") + xlim(lim[1],lim[2]) +
  ggtitle("Assimetria à Esquerda") +
  geom_histogram(aes(y,after_stat(density)), 
                 color="black", fill="royalblue", bins=10)

box <- simul %>% ggplot(aes(x="",y=y)) + 
  theme_classic() + coord_flip() + xlab("") + ylab("") + ylim(lim[1],lim[2]) +
  geom_boxplot(color="black", fill="royalblue")  
  #ggbeeswarm::geom_beeswarm(cex=1,size=1,method = "center")

ggpubr::ggarrange(hist, box, heights = c(2, 1), nrow=2, align = "v")

  • Os quartis são medidas de posição que auxiliam na avaliação da simetria dos dados. Para uma distribuição aproximadamente simétrica, espera-se que

    • \(q_2 - x(1) ~\approx~ x(n)-q_2\) ,
    • \(q_2 - q_1 ~\approx~ q_3-q_2\) ,
    • \(q_1 - x(1) ~\approx~ x(n)-q_3\) .
  • A distribiuição dos dados é dita assimétrica à direita se as diferenças entre os quantis situados a direita da mediana e a mediana são maiores que as diferenças entre a mediana e os quantis situados à esquerda da mediana. Se o contrário ocorre, dizemos que a distribuição é assimétrica à esquerda.

  • Além disso, se uma distribuição é aproximadamente simétrica,

    • \(q_2-x_{(i)} ~\approx~ x_{(n+1-i)}-q_2\) , \(i=1,\ldots,\lfloor(n+1)/2\rfloor\) , em que \(\lfloor y \rfloor\) é o maior inteiro menor ou igual a \(y\).
  • Assim, defina \(u_i = q_2-x_{(i)}\) e \(v_i = x_{(n+1-i)}-q_2\), para \(i=1,\ldots,\lfloor(n+1)/2\rfloor\). Então,

    • Se a distribuição é simetrica, espera-se que \(u_i \approx v_i\) ;
    • Se a distribuição é assimetrica à direira, espera-se que \(u_i \leq v_i\) ;
    • Se a distribuição é assimetrica à esquerda, espera-se que \(u_i \geq v_i\).
  • Uma forma de fazer essa avaliação é fazer um gráfico dos pares \((u_i,v_i)\).

tibble(u = 100.6522 - sort(filmes_pixar$duracao)[1:5],
       v = sort(filmes_pixar$duracao,decreasing=TRUE)[1:5] - 100.6522) %>% 
  ggplot() + theme_bw() + 
  geom_point(aes(x=u,y=v)) + 
  geom_line(aes(x=u,y=u))


6.7 Exercícios

  1. Escolha um banco de dados de sua preferência no R ou na internet contendo pelo menos duas variáveis quantitativas (preferencialmente contínuas). Crie um arquivo de RMarkdown e faça:
  1. um histograma
  2. um boxplot