4  Gráficos Univariados

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.

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

4.1 Gráficos para variáveis qualitativas

Atividade: Crie um projeto chamado Analise survey. Após abra o Script Cap4. Use o espaço em branco no início do script para importar 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 × 10
   remuneracao educacao raca      sexo  hispanico sul   casado exper idade setor
         <dbl>    <dbl> <chr>     <chr> <chr>     <chr> <chr>  <dbl> <dbl> <chr>
 1        8.44       12 Branco    F     N         N     N          4    22 vend…
 2        5.72       12 Branco    F     N         N     S         29    47 admi…
 3        2.93       16 Branco    F     N         N     S         27    49 admi…
 4        8.34       12 Branco    F     N         N     S          5    23 serv…
 5        5.21       12 Branco    F     N         N     S         14    32 vend…
 6        9.07       17 Não Bran… F     N         N     S         32    55 admi…
 7        3.92       14 Branco    F     N         N     N         15    35 admi…
 8        4.27       12 Branco    F     N         N     S         38    56 serv…
 9        5.55       12 Branco    F     N         N     N          7    25 serv…
10        5.28       17 Branco    F     N         N     N          5    28 prof 
# ℹ 523 more rows

Atividade: Crie uma variável chamada 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 × 11
   remuneracao educacao raca      sexo  hispanico sul   casado exper idade setor
         <dbl>    <dbl> <chr>     <chr> <chr>     <chr> <chr>  <dbl> <dbl> <chr>
 1        8.44       12 Branco    F     N         N     N          4    22 vend…
 2        5.72       12 Branco    F     N         N     S         29    47 admi…
 3        2.93       16 Branco    F     N         N     S         27    49 admi…
 4        8.34       12 Branco    F     N         N     S          5    23 serv…
 5        5.21       12 Branco    F     N         N     S         14    32 vend…
 6        9.07       17 Não Bran… F     N         N     S         32    55 admi…
 7        3.92       14 Branco    F     N         N     N         15    35 admi…
 8        4.27       12 Branco    F     N         N     S         38    56 serv…
 9        5.55       12 Branco    F     N         N     N          7    25 serv…
10        5.28       17 Branco    F     N         N     N          5    28 prof 
# ℹ 523 more rows
# ℹ 1 more variable: remun_cat <fct>

4.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)) + #definindo o mapeamento, indicando a variável do eixo x
  geom_bar() #definindo a geometria do gráfico

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)) + #definindo o mapeamento, indicando a variável do eixo x
  geom_bar(fill = "Red", #defininfo a cor das barras
           color = "Blue") + #definindo a cor do contorno das barras
  labs(x = "Remuneração", #modificando o rótulo do eixo x
       y = "Frequência") #modificando o rótulo do eixo y

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)

Attaching package: 'scales'
The following object is masked from 'package:readr':

    col_factor
# Apresentando o gráfico em porcentagens.
survey |>
  ggplot(mapping = aes(x = remun_cat, #definindo a variável do eixo x
                       y = ..count../sum(..count..))) + #definindo a que será apresentado no eixo y
  geom_bar() + #definindo a geometria do gráfico
  labs(x = "Remuneração", #modificando o rótulo do eixo x
       y = "Frequência") + #modificando o rótulo do eixo y
  scale_y_continuous(labels = percent) + #indicando que o eixo y será apresentado em porcentagem
  theme_classic() #definindo um tema para o grádico
Warning: The dot-dot notation (`..count..`) was deprecated in ggplot2 3.4.0.
ℹ Please use `after_stat(count)` instead.

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 × 2
  remun_cat        n
  <fct>        <int>
1 Muito Baixa     40
2 Baixa          172
3 Satisfatória   229
4 Alta            92
# 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(mapping = 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"))

4.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 × 4
  remun_cat        n  prop rot.ypos
  <fct>        <int> <dbl>    <dbl>
1 Alta            92  17.3     8.65
2 Satisfatória   229  43      38.8 
3 Baixa          172  32.3    76.4 
4 Muito Baixa     40   7.5    96.4 
# 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(data = cont_remun, 
       mapping = aes(x = "",
                     y = prop, 
                     fill = remun_cat)) +
  geom_bar(width = 1, 
           stat = "identity", 
           color = "black") +
  geom_text(mapping = 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.

4.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 × 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(data = cont_setor, 
       mapping = aes(fill = setor,
                     area = n)) +
  geom_treemap() + 
  labs(title = "Participantes por setor")

# Incluindo os rótulos no tree map
ggplot(data = cont_setor, 
       mapping = 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")

4.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.

4.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")
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

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")
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

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 = after_stat(density))) +
  geom_histogram(fill = "Red",
                 color = "White",
                 breaks = c(10,20,30,40,50,70)) + 
  labs(title = "Participantes por idade",
       x = "Idade",
       y = "Densidade")

4.2.2 Densidade

O gráfico da densidade é um alisamento do histograma. Sendo assim, útil também para entender o formato da distribuição dos dados.

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

# Densidade da idade
dens1 = survey |> 
  ggplot(mapping = aes(x = idade)) +
  geom_density(bw = 5) + 
  labs(title = "Participantes por idade",
       x = "Idade",
       y = "Frequência")


dens2 = survey |> 
  ggplot(mapping = aes(x = idade)) +
  geom_density(bw = 15) + 
  labs(title = "Participantes por idade",
       x = "Idade",
       y = "Frequência")

#Ativando pacote
library(patchwork)

dens1 + dens2

4.2.3 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")

Para modificar a cor do gráfico.

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

4.2.4 Violino

É um gráfico semelhante ao boxplot, porém apresentam a densidade de kernel dos dados.

# Violino da idade
survey |> 
  ggplot(mapping = aes(x = 1,
                       y = idade)) +
  geom_violin() +
  labs(y = "Idade",
       x = " ")

Incluindo as caudas da densidade.

# Violino da idade
survey |> 
  ggplot(mapping = aes(x = 1,
                       y = idade)) +
  geom_violin(trim = FALSE) +
  labs(y = "Idade",
       x = " ")

Acrescentando medidas como média e mediana.

# Violino da idade com a média
vio1 = survey |> 
  ggplot(mapping = aes(x = 1,
                       y = idade)) +
  geom_violin(trim = FALSE) +
  labs(y = "Idade",
       x = " ") +
  stat_summary(fun = mean, 
               geom = "point", 
               shape = 23, 
               size = 2)

# Violino da idade com a mediana
vio2 = survey |> 
  ggplot(mapping = aes(x = 1,
                       y = idade)) +
  geom_violin(trim = FALSE) +
  labs(y = "Idade",
       x = " ") +
  stat_summary(fun = median, 
               geom = "point", 
               size = 2, 
               color = "red")

vio1 + vio2

Acresecntando os quartis no violino.

survey |> 
  ggplot(mapping = aes(x = 1,
                       y = idade)) +
  geom_violin(trim = FALSE) +
  labs(y = "Idade",
       x = " ") +
  geom_boxplot(width = 0.1)