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 Portal – https://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] TRUEcovid19prep <- 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 rowsAgora 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, NorthO 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 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")