alt text

GET00183 - Visualização de Dados

Jony Arrais Pinto Junior

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.