GET00183 - Visualização de Dados
Uma série temporal pode ser vista como uma coleção de variáveis contínuas mensurada em intervalos regulares de tempo. A melhor representação visual para dados desse tipo são gráficos de linha, que são úteis para mostrar o comportamento de uma variável ao longo do tempo. A seguir, vamos considerar alguns gráficos que são úteis para representações de medidas ao longo do tempo.
1 - Gráfico de linhas
Como exemplo para gráficos de linha, vamos plotar a evolução de um importante indicador econômico brasileiro: o índice IPCA.
Atividade: Importe o arquivo base_SELIC_IPCA.csv e armazene-o em um objeto chamado base_BR.
A base de dados possui variáveis referentes a dois índices econômicos brasileiros:
- data - data referente a mensuração do índice;
- índice nacional de preços ao consumidor amplo (ipca);
- taxa selic (selic).
# Visualizando o objeto
base_BR# A tibble: 498 x 3
data ipca selic
<chr> <dbl> <dbl>
1 01/01/1980 6.62 NA
2 01/02/1980 4.62 NA
3 01/03/1980 6.04 NA
4 01/04/1980 5.29 NA
5 01/05/1980 5.7 NA
6 01/06/1980 5.31 NA
7 01/07/1980 5.55 NA
8 01/08/1980 4.95 NA
9 01/09/1980 4.23 NA
10 01/10/1980 9.48 NA
# … with 488 more rows
Podemos perceber que o objeto acima está assumindo que a variável data não é uma variável com classe date, ou seja, uma data. Sendo assim, é preciso transformar essa variável com a ajuda do pacote lubridate.
# Carregando pacote
library(tidyverse)
library(lubridate)
# Tratando a data
base_BR = base_BR |>
mutate(data = dmy(data))
# Visualizando o objeto
base_BR# A tibble: 498 x 3
data ipca selic
<date> <dbl> <dbl>
1 1980-01-01 6.62 NA
2 1980-02-01 4.62 NA
3 1980-03-01 6.04 NA
4 1980-04-01 5.29 NA
5 1980-05-01 5.7 NA
6 1980-06-01 5.31 NA
7 1980-07-01 5.55 NA
8 1980-08-01 4.95 NA
9 1980-09-01 4.23 NA
10 1980-10-01 9.48 NA
# … with 488 more rows
A função dmy foi usada, pois a variável estava organizada primeiro com o dia (day), depois mês (month) e por último o ano (year) - dmy. Existem diversas variações dessas funções que devem ser usadad de acordo com as ordenações de mês, dia e ano, por exemplo: ymd, ydm, myd, mdy e dym.
#Criando um gráfico de linhas
base_BR |>
ggplot(mapping = aes(x = data, y = ipca)) +
geom_line()Suponha que gostaríamos de avaliar a série somente na década de 80.
#Criando um gráfico de linhas para um período específico
base_BR |>
filter(data < dmy("01-01-1990")) |>
ggplot(mapping = aes(x = data, y = ipca)) +
geom_line()Se tivermos interessado em observar qual o comportamento da tendência desse série, podemos usar o geom_smooth com base no método loess.
#Criando um gráfico de linhas para um período específico
base_BR |>
filter(data < dmy("01-01-1990")) |>
ggplot(mapping = aes(x = data, y = ipca)) +
geom_line() +
geom_smooth(method = "loess",
se = FALSE)Suponha agora que o nosso interesse seja o de avaliar o comportamento das duas séries ao mesmo tempo? Naturalmente elas precisam estar numa mesma escala, idealmente no mesmo gráfico.
# Plotando duas séries no mesmo gráfico
base_BR |>
ggplot(mapping = aes(x = data, y = ipca)) +
geom_line() +
geom_line(aes(y = selic),
color = "blue")No gráfico acima conseguimos avaliar o comportamento das duas séries, mas ele não está completo, uma vez que não temos a indicação de quem é a série em azul e quem é a série em preto. Sendo assim, a melhor forma de fazer o gráfico é manipularmos a base com o gather.
# Plotando duas séries no mesmo gráfico
base_BR |>
gather(serie, valor, ipca:selic) %>%
ggplot(aes(x = data,
y = valor,
color = serie)) +
geom_line() +
labs(x = "Data (em mês)",
y = "Valor",
color = "Indicador")Vamos fazer a avaliação das duas séries nos anos de 2017 a 2019.
# Plotando duas séries no mesmo gráfico
base_BR |>
gather(serie, valor, ipca:selic) |>
filter(data > dmy("31-12-2016"), data < dmy("01-01-2020")) |>
ggplot(aes(x = data,
y = valor,
color = serie)) +
geom_line() +
scale_x_date(date_breaks = '3 month',
labels = scales::date_format("%m/%y")) +
labs(x = "Data (em mês)",
y = "Valor",
color = "Indicador")No gráfico acima, o scale_x_date foi usado para tratar do eixo x. Vejam que foi indicado o intervalo de espaçamento para aparecer a data e o formato foi indicado como sendo mês/ano.
2 - Gráfico de Dummbbell
Gráficos de Dummbbell são úteis para mostrar a mudança entre dois períodos de tempo para vários grupos de observações.
Nós já criamos esse gráfico anteriormente, mas agora vamos mostrar como fazê-lo usando um geom apropriado, o geom_dumbbell.
Atividade: Importe o arquivo PNUD.csv e armazene-o em um objeto chamado base_PNUD
A base de dados possui duas variáveis:
- ano;
- muni (nome do município);
- idhm (índice de desenvolvimento humano municipal);
- idhme (índice de desenvolvimento humano municipal educação);
- idhml (índice de desenvolvimento humano municipal longevidade);
- idhmr (índice de desenvolvimento humano municipal renda);
- espvida (expectativa de vida);
- rdpc (renda per capta);
- gini (índice de gini);
- pop (número de habitantes);
- lat (coordenada de latitude do centróide do município);
- lon (coordenada de longitude do centróide do município).
# Visualizando o objeto
base_PNUD# A tibble: 16,694 x 14
ano muni uf regiao idhm idhm_e idhm_l idhm_r expvida rdpc gini pop
<dbl> <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1991 ALTA… RO Norte 0.329 0.112 0.617 0.516 62.0 198. 0.63 22835
2 1991 ARIQ… RO Norte 0.432 0.199 0.684 0.593 66.0 319. 0.57 55018
3 1991 CABI… RO Norte 0.309 0.108 0.636 0.43 63.2 116. 0.7 5846
4 1991 CACO… RO Norte 0.407 0.171 0.667 0.593 65.0 320. 0.66 66534
5 1991 CERE… RO Norte 0.386 0.167 0.629 0.547 62.7 240. 0.6 19030
6 1991 COLO… RO Norte 0.376 0.151 0.658 0.536 64.5 225. 0.62 25070
7 1991 CORU… RO Norte 0.203 0.039 0.572 0.373 59.3 81.4 0.59 10737
8 1991 COST… RO Norte 0.425 0.22 0.629 0.553 62.8 250. 0.65 6902
9 1991 ESPI… RO Norte 0.388 0.159 0.653 0.561 64.2 263. 0.63 22505
10 1991 GUAJ… RO Norte 0.468 0.247 0.662 0.625 64.7 391. 0.6 31240
# … with 16,684 more rows, and 2 more variables: lat <dbl>, lon <dbl>
A seguir, vamos apresentar um gráfico de cleveland para a variável expectativa de vida média por UF no ano de 2010.
A seguir vamos criar uma base com medidas da expectativa de vida em 1991 e 2010, calculadas por UF.
# subset dados de 1991, 2000 e 2010 e calculando a média por UF
# para cada ano
base_UF <- base_PNUD |>
group_by(uf,ano) |>
summarise(expvida_media = mean(expvida, na.rm = TRUE))
#Visualizando o objeto
base_UF# A tibble: 81 x 3
# Groups: uf [27]
uf ano expvida_media
<chr> <dbl> <dbl>
1 AC 1991 63.0
2 AC 2000 66.3
3 AC 2010 71.0
4 AL 1991 57.0
5 AL 2000 63.6
6 AL 2010 69.4
7 AM 1991 61.7
8 AM 2000 65.6
9 AM 2010 70.9
10 AP 1991 63.2
# … with 71 more rows
Para usarmos o geom_dumbbell precisamos que a base esteja espalhada, logo iremos usar o spread nela.
# Espalhando a base
base_UF_Spread = base_UF |>
spread(key = ano,
value = expvida_media) |>
rename( "Ano_1991" = `1991`,
"Ano_2000" = `2000`,
"Ano_2010" = `2010`)
#Visualizando o objeto
base_UF_Spread# A tibble: 27 x 4
# Groups: uf [27]
uf Ano_1991 Ano_2000 Ano_2010
<chr> <dbl> <dbl> <dbl>
1 AC 63.0 66.3 71.0
2 AL 57.0 63.6 69.4
3 AM 61.7 65.6 70.9
4 AP 63.2 67.2 72.0
5 BA 59.1 64.2 70.6
6 CE 59.9 66.2 70.7
7 DF 68.9 73.9 77.4
8 ES 65.2 69.9 74.5
9 GO 64.9 70.4 74.5
10 MA 57.0 62.2 69.4
# … with 17 more rows
# Carregando pacote
library(ggalt)
# Criando um gráfico de dumbbell
base_UF_Spread |>
ggplot(mapping = aes(y = reorder(uf, Ano_2010),
x = Ano_1991,
xend = Ano_2010)) +
geom_dumbbell(size = 1.2,
size_x = 3,
size_xend = 3,
colour = "grey",
colour_x = "blue",
colour_xend = "red") +
theme_minimal() +
labs(title = "Mudança na Expectativa de vida",
subtitle = "1991 a 2010",
x = "Expectativa de vida (anos)",
y = "UF")Vejam que a criação do gráfico é bastante simples. Basta informarmos no mapeamento da função ggplot qual a variável do eixo y e quais as variáveis que representam o ponto inicial e o ponto final no eixo x. Tudo que foi especificado no geom_dumbell foi para modificar a estética do gráfico.
E se o interesse fosse em mostrar a evolução ao longo do tempo?
3 - Gráfico de inclinação
# os dados precisam estar organizados da seguinte forma
base_UF = base_UF |>
mutate(ano = factor(ano),
expvida_media = round(expvida_media,1))
# Carregando pacote
library(CGPfunctions)
# Gráfico de inclinação para os estados da região sudeste
base_UF |>
filter(uf %in% c("RJ","SP","ES","MG")) |>
newggslopegraph(Times = ano,
Measurement = expvida_media,
Grouping = uf) +
labs(title = "Expectativa de vida",
subtitle = "UF da Região Sudeste")4 - Gráfico de área
Em alguns contextos, é interessante apresentar o gráfico de linhas preenchido.
#Criando um gráfico de área para um período específico
base_BR |>
filter(data >= dmy("01-01-1995")) |>
ggplot(mapping = aes(x = data, y = selic)) +
geom_area(fill="lightblue",
color="black")Em muitos casos, esses gráficos são usados para comparar diferentes grupos ao longo do tempo.
Atividade: Importe o arquivo base_populacao_americana.csv e armazene-o em um objeto chamado base_pop_USA.
A base de dados possui variáveis referentes a evolução do quantitativo da população americana por grupos de faixa etária:
- Ano;
- grupo de faixa etária (Idade);
- tamanho da população em milhares (Pop_milhares).
# Visualizando o objeto
base_pop_USA# A tibble: 824 x 3
Ano Idade Pop_milhares
<dbl> <chr> <dbl>
1 1900 <5 9181
2 1900 5-14 16966
3 1900 15-24 14951
4 1900 25-34 12161
5 1900 35-44 9273
6 1900 45-54 6437
7 1900 55-64 4026
8 1900 >64 3099
9 1901 <5 9336
10 1901 5-14 17158
# … with 814 more rows
#Criando gráfico de área por grupos de faixas etárias
base_pop_USA |>
ggplot(mapping = aes(x = Ano,
y = Pop_milhares,
fill = Idade)) +
geom_area() +
labs(title = "População USA por idade",
x = "Ano",
y = "População em Milhares") +
theme_minimal()Atividade: O gráfico acima tem um problema. Qual o problema do gráfico acima? Corrija o problema! Além disso, tente modificar a escala do eixo y para que a mesma não apareça em notação científica.