Download e Preparação dos Dados

Mário Olímpio de Menezes

20 September, 2022

library(tidyverse)
library(magrittr)
library(lubridate)
library(ggpubr)
library(readxl)
library(knitr)
library(kableExtra)
library(stringi)
library(rvest)
library(countrycode)

Download das bases

As bases de dados utilizadas são:

  • EU Open Data Portal
  • John Hopkins University - CCSSE
  • Worldometer
  • Kaggle - Raphael Fontes

EU Open Data Portal

Os dados desta seção vieram do Europe Open Data Portalhttps://data.europa.eu/euodp/en/

2020-03-26: Houve uma mudança na nomenclatura dos arquivos; a partir da atualização de 25 de Março de 2020 o arquivo não mais tem o sufixo no formato da data, por exemplo, “…2020-03-24.xlsx”. Assim, algumas partes do código estão sendo mudadas para refletir esta mudança. Não sei se é uma mudança permanente ou alguém esqueceu de colocar o nome correto do arquivo.

# alteracoes na nomenclatura dos arquivos e adicao de mais uma coluna (populacao do pais - base 2018 Banco Mundial)
#covid19URLbase <- "https://www.ecdc.europa.eu/sites/default/files/documents/COVID-19-geographic-disbtribution-worldwide-"
covid19URLbase <- "https://www.ecdc.europa.eu/sites/default/files/documents/COVID-19-geographic-disbtribution-worldwide"
hoje <- format(today(), "%Y-%m-%d")   # vou manter para anexar no nome e saber cada atualização feita.
#hoje <- "2020-03-24"
arqdest <- paste("COVID-19-geographic-distribution-worldwide-",hoje,".xlsx",sep="")
# para fazer o download da base; acerte os caminhos e execute este chunk

if (!file.exists(paste("~/datasets/ECDC_Europe",arqdest,sep="/")) || !file.exists(paste("./data",arqdest,sep="/"))) {
  curl::curl_download(paste(covid19URLbase,".xlsx",sep=""), paste("~/datasets/ECDC_Europe",arqdest,sep="/"))
  print(paste("Fazendo download do arquivo", arqdest,sep=":"))
  file.copy(paste("~/datasets/ECDC_Europe",arqdest,sep="/"), paste("./data",arqdest, sep="/"))
} else {
  hoje <- format(Sys.time() - 1, "%Y-%m-%d")   # vou manter para anexar no nome e saber cada atualização feita.
  arqdest <- paste("COVID-19-geographic-distribution-worldwide-",hoje,".xlsx",sep="")
}
## [1] "Fazendo download do arquivo:COVID-19-geographic-distribution-worldwide-2022-09-20.xlsx"
## [1] TRUE
covid19prep <- read_excel(paste("./data",arqdest,sep="/"))

A estrutura dos dados é:

str(covid19prep)
## tibble[,12] [61,900 × 12] (S3: tbl_df/tbl/data.frame)
##  $ dateRep                                                   : POSIXct[1:61900], format: "2020-12-14" "2020-12-13" ...
##  $ day                                                       : num [1:61900] 14 13 12 11 10 9 8 7 6 5 ...
##  $ month                                                     : num [1:61900] 12 12 12 12 12 12 12 12 12 12 ...
##  $ year                                                      : num [1:61900] 2020 2020 2020 2020 2020 2020 2020 2020 2020 2020 ...
##  $ cases                                                     : num [1:61900] 746 298 113 63 202 135 200 210 234 235 ...
##  $ deaths                                                    : num [1:61900] 6 9 11 10 16 13 6 26 10 18 ...
##  $ countriesAndTerritories                                   : chr [1:61900] "Afghanistan" "Afghanistan" "Afghanistan" "Afghanistan" ...
##  $ geoId                                                     : chr [1:61900] "AF" "AF" "AF" "AF" ...
##  $ countryterritoryCode                                      : chr [1:61900] "AFG" "AFG" "AFG" "AFG" ...
##  $ popData2019                                               : num [1:61900] 3.8e+07 3.8e+07 3.8e+07 3.8e+07 3.8e+07 ...
##  $ continentExp                                              : chr [1:61900] "Asia" "Asia" "Asia" "Asia" ...
##  $ Cumulative_number_for_14_days_of_COVID-19_cases_per_100000: num [1:61900] 9.01 7.05 6.87 7.13 6.97 ...

A partir de 18 de junho de 2020, o ECDC passou a incluir a coluna popData2019 ao invés da popData2018. Como os dados são cumulativos, vou alterar o nome da coluna para popData.

covid19prep <- rename(covid19prep, Country = `countriesAndTerritories`, DateRep = dateRep, 
                      Cases = cases, Deaths = deaths, Day = day, Month = month) %>% 
  select(Country, DateRep, Cases, Deaths, countryterritoryCode, popData=starts_with("popData"))
str(covid19prep)
## tibble[,6] [61,900 × 6] (S3: tbl_df/tbl/data.frame)
##  $ Country             : chr [1:61900] "Afghanistan" "Afghanistan" "Afghanistan" "Afghanistan" ...
##  $ DateRep             : POSIXct[1:61900], format: "2020-12-14" "2020-12-13" ...
##  $ Cases               : num [1:61900] 746 298 113 63 202 135 200 210 234 235 ...
##  $ Deaths              : num [1:61900] 6 9 11 10 16 13 6 26 10 18 ...
##  $ countryterritoryCode: chr [1:61900] "AFG" "AFG" "AFG" "AFG" ...
##  $ popData             : num [1:61900] 3.8e+07 3.8e+07 3.8e+07 3.8e+07 3.8e+07 ...

Como a base do EU Open Data Portal contém o código ISO3C dos países, vou utilizar o pacote countrycode para uniformizar os nomes dos países e adicionar os continentes. Vou retirar aqueles que não estiverem nesta base.

covid19prep <- covid19prep %>% 
  mutate(Country = if_else(!is.na(countrycode(sourcevar = countryterritoryCode, origin = "iso3c", 
                                              destination = "country.name")), 
                           countrycode(sourcevar = countryterritoryCode, origin = "iso3c", 
                                       destination = "country.name"), Country), 
         Continent = countrycode(sourcevar = countryterritoryCode, origin = "iso3c", 
                                 destination = "continent"))

Existem alguns problemas na base de dados, que não vou tratar aqui; simplesmente vou gravar deste modo. Na análise decide-se o que será feito com estes dados.

covid19prep %>% filter(is.na(Continent))
## # A tibble: 1,017 x 7
##    Country   DateRep             Cases Deaths countryterritor… popData Continent
##    <chr>     <dttm>              <dbl>  <dbl> <chr>              <dbl> <chr>    
##  1 Cases_on… 2020-03-10 00:00:00    -9      1 <NA>                  NA <NA>     
##  2 Cases_on… 2020-03-02 00:00:00     0      0 <NA>                  NA <NA>     
##  3 Cases_on… 2020-03-01 00:00:00     0      0 <NA>                  NA <NA>     
##  4 Cases_on… 2020-02-29 00:00:00     0      2 <NA>                  NA <NA>     
##  5 Cases_on… 2020-02-28 00:00:00     0      0 <NA>                  NA <NA>     
##  6 Cases_on… 2020-02-27 00:00:00    14      0 <NA>                  NA <NA>     
##  7 Cases_on… 2020-02-26 00:00:00     0      1 <NA>                  NA <NA>     
##  8 Cases_on… 2020-02-25 00:00:00     0      0 <NA>                  NA <NA>     
##  9 Cases_on… 2020-02-24 00:00:00    57      1 <NA>                  NA <NA>     
## 10 Cases_on… 2020-02-23 00:00:00     0      0 <NA>                  NA <NA>     
## # … with 1,007 more rows

Agora vou salvar este data.frame para ser utilizado nas análises. Vou utilizar um nome que indique sempre o último conjunto de dados disponível para esta fonte: eeuucovid19_last.csv

write_csv(covid19prep, "./data/eeuucovid19_last.csv")

Base de dados da John Hopkins University

O JHU tem um site de monitoramento em tempo real (talvez o mais atualizado) no endereço https://coronavirus.jhu.edu/map.html. Os dados utilizados para o mapa estão em um GitHub https://github.com/CSSEGISandData/COVID-19. Tem dados com atualização diária (parece que no mapa as atualizações são mais constantes; no final do dia são atualizados no GitHub).

Este é o link onde aparece o mapa também: https://data.humdata.org/dataset/novel-coronavirus-2019-ncov-cases

Fazendo o download dos arquivos diários ao invés destes consolidados (não tem o Recovered na última atualização)

O JHU mantém pelo menos 2 formatos dos dados: diários e consolidados (time series). Eu tentei utilizar o formato time series inicialmente, mas mudei para o formato diário, de modo que eu mesmo faço a consolidação. Isso permitiu um pouco mais de controle sobre os dados baixados.

Os dados são mantidos neste repositório GitHub:

https://github.com/CSSEGISandData/COVID-19/raw/master/csse_covid_19_data/csse_covid_19_daily_reports/

O nome dos arquivos é MM-DD-YYYY.csv, começando a partir de 22 de Janeiro de 2020.

hj <- today()
ontem <- hj - 1
diainicio <- mdy("01-22-2020")
dia <- diainicio
while(dia <= hj) {
  ultarq <- paste(format(dia,"%m-%d-%Y"),".csv",sep="")
  CSSEbasepath <- "~/datasets/CSSEGISandData/COVID-19/csse_covid_19_daily_reports/"
  ultarq_fullname <- paste(CSSEbasepath,ultarq,sep="") 
  CSSEURLbase <- "https://github.com/CSSEGISandData/COVID-19/raw/master/csse_covid_19_data/csse_covid_19_daily_reports/"
  if (!file.exists(ultarq_fullname)) {
    tryCatch(expr = {
    curl::curl_download(paste(CSSEURLbase,ultarq,sep=""),ultarq_fullname)
    print(paste("Fazendo dowload do arquivo",ultarq_fullname,sep=":"))
    }, 
    error = function(e) {
      if(dia == hj) { print(e)} else { stop()}
    }
    )
  }
  dia <- dia + 1
}
## [1] "Fazendo dowload do arquivo:~/datasets/CSSEGISandData/COVID-19/csse_covid_19_daily_reports/09-19-2022.csv"
## <simpleError in curl::curl_download(paste(CSSEURLbase, ultarq, sep = ""), ultarq_fullname): HTTP error 404.>

Depois de feito o download de todos os arquivos, é preciso juntá-los em um único data.frame. O processo começa com a leitura de todos os csv, colocando-os todos em uma list.

dia <- diainicio
dias <- list()
# mudança de formato a partir de 22 de março de 2020
datamudanca <- ymd("2020-03-22")
while (dia < datamudanca) {
  d1 <- read_csv(paste(CSSEbasepath,format(dia,"%m-%d-%Y"),".csv",sep=""))
  d1 <- rename(d1, Country = `Country/Region`)
  d1 <- group_by(d1,Country) %>% summarise(ConfCases = sum(Confirmed, na.rm = T),
                                           TotDeaths = sum(Deaths, na.rm = T), 
                                           TotRecov = sum(Recovered, na.rm = T)) %>% 
    mutate(DateRep = dia)
  dias <- append(dias,list(d1))
  dia <- dia + 1
}
# novo formato
while(dia <= ontem) {
  d1 <- read_csv(paste(CSSEbasepath,format(dia,"%m-%d-%Y"),".csv",sep=""))
  d1 <- rename(d1, Country = Country_Region)
  d1 <- group_by(d1,Country) %>% summarise(ConfCases = sum(Confirmed, na.rm = T), 
                                           TotDeaths = sum(Deaths, na.rm = T), 
                                           TotRecov = sum(Recovered, na.rm = T)) %>% 
    mutate(DateRep = dia)
  dias <- append(dias, list(d1))
  dia <- dia + 1
  }

Com a lista de todos os arquivos (data.frames) diários, a função bind_rows do dplyr faz a concatenação. Algumas correções de nomes de países são também realizadas, visando normalizar e acertar grafias.

X <- bind_rows(dias) %>% arrange(DateRep,Country)
assign("jhucovid19prep",X)
jhucovid19prep <- select(jhucovid19prep, Country, DateRep, ConfirmedCases = ConfCases, Deaths = TotDeaths, Recovered = TotRecov)
jhucovid19prep$Country <- stri_replace_all_regex(jhucovid19prep$Country,"Mainland China", "China", vectorize_all = TRUE)
jhucovid19prep$Country <- stri_replace_all_regex(jhucovid19prep$Country, "UK", "United Kingdom", vectorize_all = TRUE)
rm(X)

Vou atribuir um continente fictício para os países não encontrados pela função countrycode: Outro

jhucovid19prep <- jhucovid19prep %>% mutate(Continent = if_else(is.na(countrycode(sourcevar = Country, origin = "country.name", destination = "continent")), "Outro", countrycode(sourcevar = Country, origin = "country.name", destination = "continent")))

Alguns países estão com nomes com grafia diferente na base da JHU. Preciso uniformizar isso. Como exemplo, a Korea do Sul.

jhucovid19prep %>% select(Country) %>% filter(grepl("Korea",Country)) %>% unique()
## # A tibble: 4 x 1
##   Country          
##   <chr>            
## 1 South Korea      
## 2 Republic of Korea
## 3 Korea, South     
## 4 Korea, North

O Iran também parece que está com nomes grafados de forma diferentes:

jhucovid19prep %>% select(Country) %>% filter(grepl("Iran",Country)) %>% unique()
## # A tibble: 2 x 1
##   Country                   
##   <chr>                     
## 1 Iran                      
## 2 Iran (Islamic Republic of)

Ou seja, estes nomes diferentes geram buracos nos tratamentos quando fazemos um group_by Country. Então precisamos uniformizar. Para isso, vou utilizar a função countrycode do pacote de mesmo nome. A estratégia é gerar os códigos dos países e depois gerar os nomes dos países de volta. Esta estratégia funciona porque a função é esperta e conhece muitas grafias diferentes para os nomes dos países de modo a gerar o código correto. E quando faço a conversão de volta, ela gera o nome padronizado. Fantástico este pacote countrycode para trabalhar com bases de dados com nomes de países. Como já detectamos acima, alguns países não são países de verdade; para estes vou deixar o nome original, já que o continente respectivo está identificado como Outro de modo a manter a base completa, mas identificando estes casos estranhos.

jhucovid19prep %<>% mutate(Code = countrycode(sourcevar = Country, origin = "country.name", destination = "iso3c"), Country = countrycode(sourcevar = Code, origin = "iso3c", destination = "country.name", nomatch = Country))

Verificando quais países ficaram sem nome nesta uniformização, ou seja, mantive os nomes originais.

jhucovid19prep %>% select(Country, Code, Continent) %>% filter(Continent == "Outro") %>% unique() %>%
  kable() %>% kable_styling(full_width = F)
Country Code Continent
Others NA Outro
North Ireland NA Outro
St. Martin NA Outro
Channel Islands NA Outro
Saint Martin NA Outro
Cruise Ship NA Outro
Kosovo NA Outro
Diamond Princess NA Outro
MS Zaandam NA Outro
NA NA Outro
Micronesia NA Outro
Summer Olympics 2020 NA Outro
Winter Olympics 2022 NA Outro
Antarctica ATA Outro

Estes casos correspondem a este número de observações e casos confirmados:

jhucovid19prep %>% select(Country, ConfirmedCases, Continent) %>% 
  filter(Continent == "Outro") %>%
  group_by(Country) %>%
  summarise(TotCasos = last(ConfirmedCases), N = n()) %>% 
  kable() %>% kable_styling(full_width = F)
Country TotCasos N
Antarctica 11 223
Channel Islands 1 1
Cruise Ship 712 13
Diamond Princess 712 909
Kosovo 272001 915
Micronesia 10010 607
MS Zaandam 9 906
North Ireland 1 1
Others 696 33
Saint Martin 2 1
St. Martin 2 1
Summer Olympics 2020 865 453
Winter Olympics 2022 535 224
NA 0 1

Total de Casos

jhucovid19prep %>% select(Country, ConfirmedCases, Continent) %>% 
  filter(Continent == "Outro") %>%
  group_by(Country) %>%
  summarise(TotCasos = last(ConfirmedCases), N = n()) %>% 
  summarise(Total = sum(TotCasos)) %>% 
  kable() %>% kable_styling(full_width = F)
Total
285557
jhucovid19prep <- jhucovid19prep %>%  group_by(DateRep, Country) %>% 
  mutate(ConfirmedCases = sum(ConfirmedCases), Deaths = sum(Deaths), Recovered = sum(Recovered)) %>% 
  ungroup() %>% ungroup()

Salvando o arquivo do dia

write_csv(jhucovid19prep,paste("./data/","jhucovid19-",ontem,".csv",sep=""))

Salvando como último arquivo para ser lido nos outros notebooks.

write_csv(jhucovid19prep, glue::glue("./data/","jhucovid19_last.csv"))

Base de Dados do Kaggle - Coronavirus - Brazil

Estes dados são mantidos pelo Raphael Fontes, com uma atualização constante.

Link: https://www.kaggle.com/unanimad/corona-virus-brazil

O link direto para os dados é: https://www.kaggle.com/unanimad/corona-virus-brazil/download que fornece um arquivo zip com o CSV.

O download da base de dados é feita com a API do Kaggle; é um pacote do Python. A base vem compactada, então depois de fazer o download, utilizo o pacote zip para extraí-la.

hoje <- today()
system("cd data;/home/mario/.local/bin/kaggle datasets download --force unanimad/corona-virus-brazil")
zip::unzip("./data/corona-virus-brazil.zip", exdir = "./data")

Base de Dados do Brasil a partir do Projeto Brasil.io

https://data.brasil.io/dataset/covid19/caso_full.csv.gz

setwd("/datahome/mario/docs/analytics/covid19")
 tryCatch(expr = {
       curl::curl_download("https://data.brasil.io/dataset/covid19/caso_full.csv.gz", destfile = "./data/caso_full.csv.gz") 
       system("cd data;gunzip -f caso_full.csv.gz;cd ..")
    }, 
    error = function(e) {
      print(e)
    }
    )

Base de Dados População Mundial

# populacao mundial - https://population.un.org/wpp/Download/Standard/CSV/
# filtrei apenas 2019 e 2020, peguei os últimos valores de cada ano por pais (Location)
# mantive valores por sexo e também densidade populacional
# baixei este arquivo em 20200419
populacao <- read_csv("./data/WPP2019_TotalPopulationBySex.csv")

Filtrei apenas os anos de 2019 e 2020 (previsão). Removi regiões estranhas que contém a palavra “dependencies”.

pop1920 <- populacao %>% 
  filter(!grepl("dependencies", Location, ignore.case = T), !grepl("develop",Location, ignore.case = T), !grepl("SIDS", Location, ignore.case = T)) %>% 
  filter(Time == 2019 | Time == 2020, Variant == "Medium") %>%
  group_by(Location, Time) %>% 
  summarise(Year = max(Time), PopMale = last(PopMale), PopFemale = last(PopFemale), PopTotal = last(PopTotal), PopDensity = last(PopDensity), VarID = last(VarID), LocID = last(LocID)) %>% 
  select(-Time) %>% dplyr::ungroup()

Adicionei uma coluna “Continent” e removi a observações sem continentes (agrupamentos de países ou regiões).

pop1920 <- pop1920 %>% mutate(Continent = if_else(is.na(countrycode(sourcevar = Location, origin = "country.name", destination = "continent")), "Outro", countrycode(sourcevar = Location, origin = "country.name", destination = "continent"))) %>% mutate(Continent = case_when(Location == "Africa" ~ "Africa", Location == "Asia" ~ "Asia", Location == "Europe" ~"Europe", Location == "Central America" ~ "Central America", Location == "North America" ~ "North America", Location == "South America" ~ "South America", Location == "Oceania"  ~ "Oceania", TRUE ~ Continent)) %>% filter(Continent %in% c("Africa","Asia","Europe","Americas","Oceania","North America","South America","Central America"))
pop1920 <- pop1920 %>% mutate(Code = countrycode(sourcevar = Location, origin = "country.name", destination = "iso3c"), Country = countrycode(sourcevar = Code, origin = "iso3c", destination = "country.name", nomatch = Location)) %>% select(Country, Code, Year, PopMale, PopFemale, PopTotal, PopDensity, Continent)

Gravei este arquivo limpo e preparado para poder utilizar nas análises.

write_csv(pop1920, "./data/populacao20192020.csv")

HOME HOME Página gerada em: “Tue 20 Sep 2022 03:02:03 AM -03”