6 min read

mob plot

No último mês, a Google vem disponibilizando relatórios sobre a mobilidade das comunidades com o intuito de fornecer informações sobre o que mudou em resposta às políticas destinadas a combater o COVID-19. Os relatórios traçam tendências de movimento ao longo do tempo por região geográfica, em diferentes categorias de lugares, como varejo e recreação, compras e farmácias, parques, estações de trânsito, locais de trabalho e residenciais.

O relatório mais recente foi publicado hoje (29/01/2023). Vamos aproveitar que, junto do relatório, um arquivo CSV é disponibilizado, e vamos explorar algumas funções em R de manipulação de dados e construirmos um gráfico de mobilidade com o pacote ggplot2 para a localidade do estado do Rio Grande do Sul.

Carregando o arquivo de dados

Uma vez que baixamos o arquivo de dados, vamos importá-lo para o R.

library(readr)

mobilidade <- read_csv(
  here::here("data",
             "Global_Mobility_Report.csv"))

Aqui utilizamos a função read_csv do pacote readr que retorna um objeto do tipo tibble, mas outras funções, tal como read.table, devem dar conta do recado! Além disso, utilizamos a função here do pacote de mesmo nome. Se você ainda não conhece a função here veja este post sobre fluxo de trabalho orientado a projetos em R.

Conhecendo os dados

Existem várias formas de termos uma primeira visão dos dados. Uma delas é através da função glimpse do pacote dplyr.

library(dplyr)

glimpse(mobilidade)
## Rows: 284,489
## Columns: 11
## $ country_region_code                                <chr> "AE", "AE", "AE", "…
## $ country_region                                     <chr> "United Arab Emirat…
## $ sub_region_1                                       <chr> NA, NA, NA, NA, NA,…
## $ sub_region_2                                       <chr> NA, NA, NA, NA, NA,…
## $ date                                               <date> 2020-02-15, 2020-0…
## $ retail_and_recreation_percent_change_from_baseline <dbl> 0, 1, -1, -2, -2, -…
## $ grocery_and_pharmacy_percent_change_from_baseline  <dbl> 4, 4, 1, 1, 0, 1, 2…
## $ parks_percent_change_from_baseline                 <dbl> 5, 4, 5, 5, 4, 6, 6…
## $ transit_stations_percent_change_from_baseline      <dbl> 0, 1, 1, 0, -1, 1, …
## $ workplaces_percent_change_from_baseline            <dbl> 2, 2, 2, 2, 2, 1, -…
## $ residential_percent_change_from_baseline           <dbl> 1, 1, 1, 1, 1, 1, 1…

Esta função nos apresenta o número linhas e colunas do objeto, as colunas e a classe das mesmas, além de alguns valores das colunas.

Formatando os dados

O próximo passo é organizarmos os dados em um formato apropriado para as nossas análises. Neste sentido, vamos filtrar os dados referentes ao Rio Grande do Sul utilizando a função filter do pacote dplyr. Logo em seguida vamos “empilhar” os dados, fazendo com que os valores referentes as tendências de mobilidade fiquem armazenados em uma coluna, e o tipo/local de “mobilidade” fique armazenado em uma outra coluna. Para tal, utilizaremos a função gather do pacote tidyr.

library(tidyr)

mobilidade <- mobilidade %>% 
  filter(sub_region_1 == "State of Rio Grande do Sul") %>% 
  select(-country_region_code, -country_region, -sub_region_1, -sub_region_2) %>% 
  gather(key = "Tipo", value = "Percentual", -date)

Note que antes de empilharmos os dados, mantivemos apenas as variáveis (colunas) que tínhamos interesse de analisarmos, utilizando a função select. Agora o novo objeto possui apenas três colunas:

mobilidade
## # A tibble: 432 × 3
##    date       Tipo                                               Percentual
##    <date>     <chr>                                                   <dbl>
##  1 2020-02-15 retail_and_recreation_percent_change_from_baseline          4
##  2 2020-02-16 retail_and_recreation_percent_change_from_baseline         -2
##  3 2020-02-17 retail_and_recreation_percent_change_from_baseline         -2
##  4 2020-02-18 retail_and_recreation_percent_change_from_baseline         -3
##  5 2020-02-19 retail_and_recreation_percent_change_from_baseline          1
##  6 2020-02-20 retail_and_recreation_percent_change_from_baseline          1
##  7 2020-02-21 retail_and_recreation_percent_change_from_baseline          3
##  8 2020-02-22 retail_and_recreation_percent_change_from_baseline         -3
##  9 2020-02-23 retail_and_recreation_percent_change_from_baseline          4
## 10 2020-02-24 retail_and_recreation_percent_change_from_baseline        -16
## # … with 422 more rows

Antes de começarmos a construir o nosso gráfico, vamos formatar a variável Tipo:

mobilidade$Tipo <- factor(mobilidade$Tipo,
                          labels = c("Mercearia e farmácia",
                                     "Parques",
                                     "Residencial",
                                     "Varejo e recreação",
                                     "Estações de trânsito",
                                     "Locais de trabalho"))

O(s) gráfico(s) de mobilidade

Vamos construir um gráfico de linhas das tendências de mobilidade pelo tempo. Utilizaremos o pacote ggplot2. Se você ainda não conhece o pacote ggplot2, não deixe de conferir o material do minicurso Pintando e Bordando no R apresentado no 1º Datathon da UFRGS.

Começaremos com um gráfico simples.

library(ggplot2)

p <- ggplot(data = mobilidade,
            mapping = aes(x = date, y = Percentual, colour = Tipo)) +
  geom_line()

p

Nada mau! Mas, podemos melhorar com algumas modificações. Comecemos por uma outra apresentação (facetada) e aumentando a espessura das curvas.

p <- ggplot(data = mobilidade,
            mapping = aes(x = date, y = Percentual, colour = Tipo)) +
  geom_line(size = 1) +
  facet_wrap(~ Tipo) +
  theme(legend.position = "none")

p

Melhor? Estamos quase lá! Agora vamos vamos arrumar aqueles pequenos detalhes que fazem toda a diferença: rótulos dos eixos, formato das datas, símbolo de percentual no eixo \(y\) e uma paleta de cores diferente da padrão.

p <- ggplot(data = mobilidade,
            mapping = aes(x = date, y = Percentual, colour = Tipo)) +
  geom_line(size = 1) +
  scale_color_brewer(palette = "Set2") +
  scale_y_continuous(labels = function(x) paste0(x, "%")) +
  scale_x_date(labels = scales::date_format("%d %b")) +
  facet_wrap(~ Tipo) +
  theme(legend.position = "none",
        axis.text.x = element_text(angle = 45, hjust = 1)) +
  labs(x = "Tempo em dias",
       title = "Rio Grande do Sul",
       caption = "Fonte: Google Mobility (01/05/2020)")

p

Um outro detalhe que faz toda a diferença é inclusão de um preenchimento entre as curvas de mobilidade e o valor basal.

p <- ggplot(data = mobilidade,
            mapping = aes(x = date, y = Percentual, colour = Tipo)) +
  geom_line(size = 1) +
  geom_area(mapping = aes(fill = Tipo), alpha = 0.3) +
  scale_color_brewer(palette = "Set2") +
  scale_fill_brewer(palette = "Set2") +
  scale_y_continuous(labels = function(x) paste0(x, "%")) +
  scale_x_date(labels = scales::date_format("%d %b")) +
  facet_wrap(~ Tipo) +
  theme(legend.position = "none",
        axis.text.x = element_text(angle = 45, hjust = 1)) +
  labs(x = "Tempo em dias",
       title = "Rio Grande do Sul",
       caption = "Fonte: Google Mobility (01/05/2020)")

p

Pronto! Temos um gráfico de mobilidade! Infelizmente as conclusões não são muito animadoras. As curvas de tendência de mobilidade no estado do Rio Grande do Sul indicam um retorno ao valor basal (mobilidade pré-pandemia do COVID-19). Isso em conjunto com outros fatores (ausência de medidas de teste, isolamento e rastreio dos contatos dos infectados) podem resultar em um aumento acelerado dos casos de COVID-19. Nos mantenhamos alertas e avaliando os dados.

Você pode gerar gráficos para outras localidades do Brasil e do mundo! Experimente também outros temas do ggplot2 ou do pacote ggthemes.

library(ggthemes)

p + theme_wsj() +
   theme(legend.position = "none",
        axis.text.x = element_text(angle = 45, hjust = 1))

library(ggthemes)

p + theme_fivethirtyeight() +
   theme(legend.position = "none",
        axis.text.x = element_text(angle = 45, hjust = 1))

Tem até estilo “Old is cool”.

library(ggthemes)

p + theme_excel() +
   theme(legend.position = "none",
        axis.text.x = element_text(angle = 45, hjust = 1))

Depois é só salvar no formato e resolução que você desejar com a função ggsave!

Se cuidem! Fiquem bem! E até a próxima!