GET00183 - Visualização de Dados
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")