alt text

GET00183 - Visualização de Dados

Jony Arrais Pinto Junior

A escolha da “melhor” visualização de dados depende do público alvo e do objetivo desejado. Naturalmente, existem alguns pontos que são chaves para a escolha da melhor visualização, um deles é o tipo da variável, isto é, existem gráficos apropriados para variáveis qualitativas (sexo, faixa etária, estado cívil, etc) e quantitativas (idade, peso, índice de massa corporal, etc).

A seguir, iremos discutir alguns gráficos básicos para se fazer análises univariadas. Estas análises visam em geral apresentar a distribuição dos dados.

1 - Gráficos para variáveis qualitativas

A seguir serão apresentados os principais gráficos para visualizar a distribuição de uma única variável quanlitativa. Discutiremos como manipular os argumentos das funções no ggplot para melhorar/modificar os gráficos.

Atividade: Importe o arquivo survey85.csv e armazene-o em um objeto chamado survey.

A base de dados possui variáveis referentes a uma pesquisa survey realizada em 1985 contendo remuneração e outras características de trabalhadores, tais como:

  • salário por hora em dólares (remuneracao);
  • número de anos de educação (educacao);
  • sexo;
  • é hispânico? (hispanico);
  • é do sul? (sul);
  • é casado? (casado);
  • tempo de experiência de trabalho (exper);
  • idade;
  • setor de trabalho (setor).
# Visualizando o objeto
survey
# A tibble: 533 x 10
   remuneracao educacao raca   sexo  hispanico sul   casado exper idade setor   
         <dbl>    <dbl> <chr>  <chr> <chr>     <chr> <chr>  <dbl> <dbl> <chr>   
 1        9          10 Branco M     N         N     S         27    43 constru…
 2        5.5        12 Branco M     N         N     S         20    38 vendas  
 3        3.8        12 Branco F     N         N     N          4    22 vendas  
 4       10.5        12 Branco F     N         N     S         29    47 adminis…
 5       15          12 Branco M     N         N     S         40    58 constru…
 6        9          16 Branco F     N         N     S         27    49 adminis…
 7        9.57       12 Branco F     N         N     S          5    23 servico 
 8       15          14 Branco M     N         N     N         22    42 vendas  
 9       11           8 Branco M     N         N     S         42    56 fabrica 
10        5          12 Branco F     N         N     S         14    32 vendas  
# … with 523 more rows

Atividade: Crie a variável remun_cat, que assume Muito Baixa, Baixa, Satisfatória e Alta se a remuneração pertence ao interval0 (0,4], (4, 8], (8, 15] e [15, 100), respectivamente.

Após criarmos a variável a base ficará da seguinte forma.

#Visualizando o objeto
survey
# A tibble: 533 x 11
   remuneracao educacao raca   sexo  hispanico sul   casado exper idade setor   
         <dbl>    <dbl> <chr>  <chr> <chr>     <chr> <chr>  <dbl> <dbl> <chr>   
 1        9          10 Branco M     N         N     S         27    43 constru…
 2        5.5        12 Branco M     N         N     S         20    38 vendas  
 3        3.8        12 Branco F     N         N     N          4    22 vendas  
 4       10.5        12 Branco F     N         N     S         29    47 adminis…
 5       15          12 Branco M     N         N     S         40    58 constru…
 6        9          16 Branco F     N         N     S         27    49 adminis…
 7        9.57       12 Branco F     N         N     S          5    23 servico 
 8       15          14 Branco M     N         N     N         22    42 vendas  
 9       11           8 Branco M     N         N     S         42    56 fabrica 
10        5          12 Branco F     N         N     S         14    32 vendas  
# … with 523 more rows, and 1 more variable: remun_cat <fct>

1.1 - Gráfico de barras

O gráfico de barras/colunas são utilizados para fazer comparações entre as categorias da variável qualitativa. Trata-se de um gráfico de simples interpretação.

A seguir apresentamos como construir um gráfico de barras para a variável remuneração categorizada.

# Carregando pacotes
library(ggplot2)

# Criando um gráfico de barras para a remuneração categorizada.
survey |>
  ggplot(mapping = aes(x = remun_cat)) +
  geom_bar()

Podemos definir várias especificações na função geom_bar como fill e color . Eles controlam a cor da barra e do contorno da barra, respectivamente. Também vamos usar o labs para tratar os rótulos do gráfico.

# Modificando as cores e os rótulos.
survey |>
  ggplot(mapping = aes(x = remun_cat)) +
  geom_bar(fill = "Red",
           color = "Blue") +
  labs(x = "Remuneração",
       y = "Frequência")

Suponha que o nosso desejo seja apresentar as porcentagens e não as frequências de cada categoria. Para executarmos esta ação, precisamos modificar no mapeamento da função ggplot o que será apresentado no eixo y. No exemplo abaixo, utilizamos o artifício de calcular as frequências relativas expressas por ..count../sum(..count..) e por meio da função scale_y_continuous apresentar o eixo y em porcentagem.

# Carregando pacotes
library(scales)

# Apresentando o gráfico em porcentagens.
survey |>
  ggplot(mapping = aes(x = remun_cat,
                       y = ..count../sum(..count..))) +
  geom_bar() +
  labs(x = "Remuneração",
       y = "Frequência") +
  scale_y_continuous(labels = percent) +
  theme_classic()

Como apresentar o gráfico de barras, segundo a ordenação das frequências? Existem algumas formas de executar esta tarefa. A seguir, apresetamos uma forma de ordenar de forma crescente ou decrescente.

# Calculando o número de pessoaos em cada categoria de reuneração
cont_remun <- survey |>
 count(remun_cat)

# Visualizando o objeto criado
cont_remun
# A tibble: 4 x 2
  remun_cat        n
  <fct>        <int>
1 Muito Baixa     63
2 Baixa          220
3 Satisfatória   196
4 Alta            54
# Criando o gráfico em ordem crescente.
cont_remun |>
  ggplot(mapping = aes(x = reorder(remun_cat, n),
                       y = n)) +
  geom_bar(stat = "identity") +
  labs(x = "Remuneração",
       y = "Frequência") +
  theme_classic()

# Criando o gráfico em ordem crescente.
cont_remun |>
  ggplot(mapping = aes(x = reorder(remun_cat, -n),
                       y = n)) +
  geom_bar(stat = "identity") +
  labs(x = "Remuneração",
       y = "Frequência") +
  theme_classic()

Para a contrução do gráfico foi preciso criar um tibble com as frequências das categorias da variável remuneração categorizada, usando a função count, e usá-lo para a construção do gráfico. A ordenação das categorias é feita no mapeamento do eixo x, por meio da função reorder, ou seja, no mapeamento colocamos no eixo x a coluna remun_cat ordenadas segundo os valores da coluna n e no eixo y os valores da coluna n. Além disso, é preciso modificar o stat de count para identity.

Para incluir os valores observados nas barras, usamos o geom_text, que é utilizado de forma geral para incluir uma camada de texto em um gráfico do ggplot. No mapeamento do geom_text foi incluído como rótulo os valores de n e o vjust controla o alinhamento vertical.

# Criando o gráfico em ordem crescente.
cont_remun |>
  ggplot(mapping = aes(x = reorder(remun_cat, n),
                       y = n)) +
  geom_bar(stat = "identity") +
  geom_text(aes(label = n), 
            vjust=-0.5) +
  labs(x = "Remuneração",
       y = "Frequência") +
  theme_classic()

Atividade: Crie o código necessário para construir o gráfico abaixo.

A seguir, apresentamos um gráfico de barras com o cuidado de aumentar o tamanho da letra dos rótulos das categorias dos setores para melhorar a visualização. Este tratamento é extremamente necessário em diversas situações para que as pessoas consigam entender melhor o gráfico.

# Aumentando o tamanho dos rótulos das categorias
survey |>
  ggplot(mapping = aes(x = setor)) +
  geom_bar() +
  theme(text = element_text(size=20))

Entretanto, isso nos causou um problema, certo? Como resolver o problema de rótulos sobrepostos? A seguir, serão apresentadas 3 formas de melhorar a visualização sob esse aspecto.

A primeira solução é simplesmente fazer uma inversão dos eixos. Isso é feito de forma simples no ggplot2 usando o a função coord_flip.

# Invertendo os rótulos x e y
survey |>
  ggplot(mapping = aes(x = setor)) +
  geom_bar() +
  labs(y = "Frequência",
       x = "Setor") +
  theme(text = element_text(size=20)) +
  coord_flip()

Outra forma de resolver problema seria modificar o ângulo do texto no eixo x. É possível fazer essa modificação usando a função theme (é uma poderosa função para customizar componentes no gráfico).

# Modificando o ângulo do texto no eixo y 
survey |>
  ggplot(mapping = aes(x = setor)) +
  geom_bar() +
  labs(y = "Frequência",
       x = "Setor") +
  theme(text = element_text(size=20),
        axis.text.x = element_text(angle = 45, 
                                   hjust = 1))

Por fim, a função scale_x_discrete por meio do componente guide nos permite fazer um tipo de escalonamento dos rótulos, resolvendo o problema da sobreposição. Nesta mesma função, usamos o componente labels para melhorar os rótulos das categorias da variável remuneração. Percebam que a base de dados continua intacta, as modificações foram realizadas na visualização.

# Escalonando e modificando os nomes das categorias da variável setor
survey |>
  ggplot(mapping = aes(x = setor)) +
  geom_bar() +
  labs(y = "Frequência",
       x = "Setor") +
  theme(text = element_text(size=20)) +
  scale_x_discrete(guide = guide_axis(n.dodge = 2),
                   labels = c("vendas" = "Vendas",
                              "servico" = "Serviço",
                              "prof" = "Professor",
                              "outro" = "Outro",
                              "gerente" = "Gerente",
                              "fabrica" = "Fábrica",
                              "construcao" = "Construção",
                              "administrativo" = "Administrativo"))

1.2 - Gráfico de setores

O gráfico de setores (pizza) é bastante controverso quando se trata de visualização de dados. Se seu objetivo e comparar frequência das categorias de uma variável qualitativa, a visualização discutida anteriormente (gráfico de barras) é mais eficiente. Entretanto, se o seu objetivo é comparar cada categoria com o todo (por exemplo, que parte dos participantes possuem com salários altos em comparação com todos os entrevistados) e o número de categorias é pequeno, o gráfico de setores pode funcionar.

Fica um aviso, a quantidade de código para produzir um gráfico de setores interessante no R é grande.

# Criando o objeto com as proporções
cont_remun <- survey |>
  count(remun_cat) |>
  arrange(desc(remun_cat)) |>
  mutate(prop = round(n*100/sum(n), 1),
         rot.ypos = cumsum(prop) - 0.5*prop)

# Visualizando
cont_remun
# A tibble: 4 x 4
  remun_cat        n  prop rot.ypos
  <fct>        <int> <dbl>    <dbl>
1 Alta            54  10.1     5.05
2 Satisfatória   196  36.8    28.5 
3 Baixa          220  41.3    67.5 
4 Muito Baixa     63  11.8    94.1 
# Adicionando os rótulos que irão aparecer no gráfico
cont_remun$rotulo <- paste0(cont_remun$remun_cat, "\n",
                         round(cont_remun$prop), "%")

# Criando um gráfico de setores com rótulos
ggplot(cont_remun, 
       aes(x = "", 
           y = prop, 
           fill = remun_cat)) +
  geom_bar(width = 1, 
           stat = "identity", 
           color = "black") +
  geom_text(aes(y = rot.ypos, label = rotulo), 
            color = "black") +
  coord_polar("y", 
              start = 0, 
              direction = -1) +
  theme_void() +
  theme(legend.position = "FALSE") +
  labs(title = "Participantes por remuneração")

Se tirarmos as funções geom_text e o theme o gráfico vira um gráfico de setores usual, com uma legenda indicando as categorias pelas cores.

1.3 - Tree map

Uma alternativa para uma variável qualitativa com muitas categorias é o tree map.

# Carregando pacote
library(treemapify)

# Calculando as frequências dos setores
cont_setor <- survey %>%
  count(setor)

# Visualizando
cont_setor
# A tibble: 8 x 2
  setor              n
  <chr>          <int>
1 administrativo    97
2 construcao        20
3 fabrica           68
4 gerente           54
5 outro             68
6 prof             105
7 servico           83
8 vendas            38
# Criando um treemap dos setores
ggplot(cont_setor, 
       aes(fill = setor, 
           area = n)) +
  geom_treemap() + 
  labs(title = "Participantes por setor")

# Incluindo os rótulos no tree map
ggplot(cont_setor, 
       aes(fill = setor, 
           area = n,
           label = setor)) +
  geom_treemap() + 
  geom_treemap_text(colour = "white", 
                    place = "centre") +
  labs(title = "Participantes por setor") +
  theme(legend.position = "none")

2 - Gráficos para variáveis quantitativas

A seguir serão apresentados os principais gráficos para visualizar a distribuição de uma única variável quantitativa. Discutiremos como manipular os argumentos das funções no ggplot para melhorar/modificar os gráficos.

2.1 - Histograma

O histograma é uma representação gráfica que mostra o formato da distribuição de uma variável. Ele apresenta a frequência de ocorrências de valores da variável em intervalos de classe.

# Histograma da idade
survey |> 
  ggplot(mapping = aes(x = idade)) +
  geom_histogram() + 
  labs(title = "Participantes por idade",
       x = "Idade",
       y = "Frequência")

A modificações de cores é feita da mesma forma que no gráfico de barras.

# Histograma da idade
survey |> 
  ggplot(mapping = aes(x = idade)) +
  geom_histogram(fill = "Red",
                 color = "White") + 
  labs(title = "Participantes por idade",
       x = "Idade",
       y = "Frequência")

Se quisermos controlar o número de intervalos, podemos fazer isso por meio do argumento bins. O default da função é um total de 30 intervalos, mas as vezes vale a pena reduzirmos esse número para termos uma melhor noção do formato da distribuição.

# Definindo o número de intervalos de classe
survey |> 
  ggplot(mapping = aes(x = idade)) +
  geom_histogram(fill = "Red",
                 color = "White",
                 bins = 15) + 
  labs(title = "Participantes por idade",
       x = "Idade",
       y = "Frequência")

Uma forma alternativa para controlar os intervalos de classe é definir as amplitudes dos intervalos. O argumento que faz esse controle é o binwidth.

# Definindo o tamanho da amplitude dos intervalos de classes
survey |> 
  ggplot(mapping = aes(x = idade)) +
  geom_histogram(fill = "Red",
                 color = "White",
                 binwidth = 5) + 
  labs(title = "Participantes por idade",
       x = "Idade",
       y = "Frequência")

Para trabalharmos com histogramas com classes de amplitudes diferentes, precisamos lembrar que o histograma não é mais apresentado na escala de frequência e sim na de densidade. A seguir, apresentamos um exemplo para a variável idade.

# Criando intervalos de classes com amplitudes diferentes
survey |> 
  ggplot(mapping = aes(x = idade,
                       y = ..density..)) +
  geom_histogram(fill = "Red",
                 color = "White",
                 breaks = c(10,20,30,40,50,70)) + 
  labs(title = "Participantes por idade",
       x = "Idade",
       y = "Densidade")

2.2 - Boxplot

O boxplot é uma representação usada para verificar a distribuição de uma variável por meio de seus quantis. Aqui é possível verificar os valores de mínimo, máximo e os quartis. Além disso, indica a existência de valores discrepantes.

A função geom_boxplot é responsável pela geometria de um boxplot no ggplot2.

# Histograma da idade
survey |> 
  ggplot(mapping = aes(y = idade)) +
  geom_boxplot() +
  labs(y = "Idade")