Introdução

O objetivo do post é mostrar como obter e apresentar dados de locomoção a partir de smartphones da Apple. Primeiramente, meus agradecimentos ao blog Learning Machines, a partir do qual eu obtive este aprendizado e compartilho aqui com vocês.

O banco de dados está no site da Apple Relatórios de Tendências de Movimentação. Basta clicar em Todos os dados CSV, fazer o download do arquivo e salvá-lo no diretório de trabalho que o software R utilizará.

Mas, antes de colocar a mão na massa, é útil apresentar uma breve explanação sobre o banco de dados. Ele tem início no dia 13 de janeiro de 2020; antes, portanto, da declaração de pandemia pela Organização Mundial de Saúde. São apresentados dados de 152 países, e três tipos de locomoção: de carro; de transporte público; e a pé. Os dados refletem solicitações de direções no Mapas da Apple. Quanto à privacidade, a Apple lembra que o Mapas não associa os dados ao ID Apple dos usuários, e não mantém um histórico de onde eles estiveram.

Desenvolvimento

Primeiramente, vamos obter os dados e fazer uma breve inspeção:

# ler o banco de dados
mobility <- read.csv("./applemobilitytrends-2021-04-06.csv")

# ver a estrutura do banco de dados
str(mobility, list.len=10)
## 'data.frame':    4691 obs. of  456 variables:
##  $ geo_type           : chr  "country/region" "country/region" "country/region" "country/region" ...
##  $ region             : chr  "Albania" "Albania" "Argentina" "Argentina" ...
##  $ transportation_type: chr  "driving" "walking" "driving" "walking" ...
##  $ alternative_name   : chr  "" "" "" "" ...
##  $ sub.region         : chr  "" "" "" "" ...
##  $ country            : chr  "" "" "" "" ...
##  $ X2020.01.13        : num  100 100 100 100 100 100 100 100 100 100 ...
##  $ X2020.01.14        : num  95.3 100.7 97.1 95.1 103 ...
##  $ X2020.01.15        : num  101.4 98.9 102.5 101.4 104.2 ...
##  $ X2020.01.16        : num  97.2 98.5 111.2 112.7 108.6 ...
##   [list output truncated]

Trata-se, portanto, de um banco de dados de 4.691 observações e 456 variáveis. Quase a totalidade das variáveis referem-se às datas. Nas primeiras 6 variáveis encontram-se os dados dos países e o tipo de locomoção.

Reparar que o primeiro dia (13 de janeiro de 2020) contém o valor 100 para todas as localidades; ou seja, os dias subsequentes devem ser entendidos como variações para cima ou para baixo na mobilidade em relação a este marco inicial. Na continuidade, construiremos um gráfico com os 3 tipos de locomoção (de carro, transporte público, e a pé) no Brasil. Os gráficos terão uma linha que suaviza as variações bruscas diárias (função “addsmooth”).

# construção do gráfico "locomoção de carro"
mobi_trends_d <- function(reg = "Brazil", trans = "driving", plot = TRUE, addsmooth = TRUE) {
  data <- subset(mobility, region == reg & transportation_type == trans)[4:ncol(mobility)]
  dates <- as.Date(sapply(names(data), function(x) substr(x, start = 2, stop = 11)), "%Y.%m.%d")
  values <- as.numeric(data)
  series <- setNames(values, dates)
  if (plot) {
    plot(dates, values, main = "Brasil - de carro", xlab = "", ylab = "", type = "l", col = "blue", lwd = 3)
    if (addsmooth) {
      lines(dates, values, col = "lightblue", lwd = 3)
      lines(supsmu(dates, values), col = "blue", lwd = 2)
    }
    abline(h = 100)
    abline(h = c(0, 20, 40, 60, 80, 120, 140, 160, 180, 200), lty = 3)
    invisible(series)
  } else series
}

# construção do gráfico "locomoção de transporte público"
mobi_trends_t <- function(reg = "Brazil", trans = "transit", plot = TRUE, addsmooth = TRUE) {
  data <- subset(mobility, region == reg & transportation_type == trans)[4:ncol(mobility)]
  dates <- as.Date(sapply(names(data), function(x) substr(x, start = 2, stop = 11)), "%Y.%m.%d")
  values <- as.numeric(data)
  series <- setNames(values, dates)
  if (plot) {
    plot(dates, values, main = "Brasil - transporte público", xlab = "", ylab = "", type = "l", col = "blue", lwd = 3)
    if (addsmooth) {
      lines(dates, values, col = "lightblue", lwd = 3)
      lines(supsmu(dates, values), col = "blue", lwd = 2)
    }
    abline(h = 100)
    abline(h = c(0, 20, 40, 60, 80, 120, 140, 160, 180, 200), lty = 3)
    invisible(series)
  } else series
}

# construção do gráfico "locomoção a pé"
mobi_trends_p <- function(reg = "Brazil", trans = "transit", plot = TRUE, addsmooth = TRUE) {
  data <- subset(mobility, region == reg & transportation_type == trans)[4:ncol(mobility)]
  dates <- as.Date(sapply(names(data), function(x) substr(x, start = 2, stop = 11)), "%Y.%m.%d")
  values <- as.numeric(data)
  series <- setNames(values, dates)
  if (plot) {
    plot(dates, values, main = "Brasil - a pé", xlab = "", ylab = "", type = "l", col = "blue", lwd = 3)
    if (addsmooth) {
      lines(dates, values, col = "lightblue", lwd = 3)
      lines(supsmu(dates, values), col = "blue", lwd = 2)
    }
    abline(h = 100)
    abline(h = c(0, 20, 40, 60, 80, 120, 140, 160, 180, 200), lty = 3)
    invisible(series)
  } else series
}

# plotar os três gráficos construídos no mesmo painel (de uma linha e 3 colunas)
par(mfrow = c(1,3))
mobi_trends_d()
mobi_trends_t()
mobi_trends_p()

É possível ver que as locomoções a pé e de transporte público caíram drasticamente desde o dia 13 de janeiro de 2020, e desde então não se recuperaram. No momento, elas estão 60% abaixo do início da série. Por outro lado, em relação às movimentações com automóveis, apesar de elas se encontrarem 20% abaixo do marco inicial, neste ínterim elas chegaram inclusive a ultrapassar os níveis pré-pandemia (especialmente no último trimestre de 2020).

Agora selecionaremos apenas as movimentações com automóveis, e compararemos o Brasil com outros países (México, Israel e Estados Unidos). México foi escolhido porque é um país emergente latino-americano tal como o Brasil e, neste momento, conta com um número de mortes por milhão de habitantes muito semelhante ao brasileiro. Israel foi escolhido porque é o país mais avançado em termos de vacinação, proporcionalmente ao tamanho da população. Estados Unidos foi escolhido porque foi o país com o maior número de mortes durante certo tempo, mas “virou a chave” do combate à pandemia a partir de 2021, e desde então é um dos países com a vacinação mais acelerada.

# construção do gráfico de Israel
mobi_trends_Israel_d <- function(reg = "Israel", trans = "driving", plot = TRUE, addsmooth = TRUE) {
  data <- subset(mobility, region == reg & transportation_type == trans)[4:ncol(mobility)]
  dates <- as.Date(sapply(names(data), function(x) substr(x, start = 2, stop = 11)), "%Y.%m.%d")
  values <- as.numeric(data)
  series <- setNames(values, dates)
  if (plot) {
    plot(dates, values, main = "Israel - de carro", xlab = "", ylab = "", type = "l", col = "blue", lwd = 3)
    if (addsmooth) {
      lines(dates, values, col = "lightblue", lwd = 3)
      lines(supsmu(dates, values), col = "blue", lwd = 2)
    }
    abline(h = 100)
    abline(h = c(0, 20, 40, 60, 80, 120, 140, 160, 180, 200), lty = 3)
    invisible(series)
  } else series
}

# construção do gráfico dos Estados Unidos
mobi_trends_USA_d <- function(reg = "United States", trans = "driving", plot = TRUE, addsmooth = TRUE) {
  data <- subset(mobility, region == reg & transportation_type == trans)[4:ncol(mobility)]
  dates <- as.Date(sapply(names(data), function(x) substr(x, start = 2, stop = 11)), "%Y.%m.%d")
  values <- as.numeric(data)
  series <- setNames(values, dates)
  if (plot) {
    plot(dates, values, main = "Estados Unidos - de carro", xlab = "", ylab = "", type = "l", col = "blue", lwd = 3)
    if (addsmooth) {
      lines(dates, values, col = "lightblue", lwd = 3)
      lines(supsmu(dates, values), col = "blue", lwd = 2)
    }
    abline(h = 100)
    abline(h = c(0, 20, 40, 60, 80, 120, 140, 160, 180, 200), lty = 3)
    invisible(series)
  } else series
}

# construção do gráfico do México
mobi_trends_Mexico_d <- function(reg = "Mexico", trans = "driving", plot = TRUE, addsmooth = TRUE) {
  data <- subset(mobility, region == reg & transportation_type == trans)[4:ncol(mobility)]
  dates <- as.Date(sapply(names(data), function(x) substr(x, start = 2, stop = 11)), "%Y.%m.%d")
  values <- as.numeric(data)
  series <- setNames(values, dates)
  if (plot) {
    plot(dates, values, main = "Mexico - de carro", xlab = "", ylab = "", type = "l", col = "blue", lwd = 3)
    if (addsmooth) {
      lines(dates, values, col = "lightblue", lwd = 3)
      lines(supsmu(dates, values), col = "blue", lwd = 2)
    }
    abline(h = 100)
    abline(h = c(0, 20, 40, 60, 80, 120, 140, 160, 180, 200), lty = 3)
    invisible(series)
  } else series
}

# plotar os três gráficos construídos no mesmo painel (de uma linha e 3 colunas)
par(mfrow = c(2,2))
mobi_trends_d()
mobi_trends_Mexico_d()
mobi_trends_USA_d()
mobi_trends_Israel_d()

Como se vê, México, Estados Unidos e Israel estão com movimentações acima dos níveis pré-pandemia (especialmente os Estados Unidos). Contudo, os dois últimos estão com vacinação bastante avançada; o mesmo não pode ser dito do México. É provável que o retorno à vida como era antes nos Estados e em Israel seja mais sustentável, em virtude da vacinação mais avançada. A movimentação no Brasil, por outro lado, está em queda, fruto do fato de estarmos vivendo o pico da pandemia no país (em número de novos casos e de mortes).