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-"
<- "https://www.ecdc.europa.eu/sites/default/files/documents/COVID-19-geographic-disbtribution-worldwide"
covid19URLbase <- format(today(), "%Y-%m-%d") # vou manter para anexar no nome e saber cada atualização feita.
hoje #hoje <- "2020-03-24"
<- paste("COVID-19-geographic-distribution-worldwide-",hoje,".xlsx",sep="") arqdest
# 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_download(paste(covid19URLbase,".xlsx",sep=""), paste("~/datasets/ECDC_Europe",arqdest,sep="/"))
curlprint(paste("Fazendo download do arquivo", arqdest,sep=":"))
file.copy(paste("~/datasets/ECDC_Europe",arqdest,sep="/"), paste("./data",arqdest, sep="/"))
else {
} <- format(Sys.time() - 1, "%Y-%m-%d") # vou manter para anexar no nome e saber cada atualização feita.
hoje <- paste("COVID-19-geographic-distribution-worldwide-",hoje,".xlsx",sep="")
arqdest }
## [1] "Fazendo download do arquivo:COVID-19-geographic-distribution-worldwide-2022-09-20.xlsx"
## [1] TRUE
<- read_excel(paste("./data",arqdest,sep="/")) covid19prep
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.
<- rename(covid19prep, Country = `countriesAndTerritories`, DateRep = dateRep,
covid19prep 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.
%>% filter(is.na(Continent)) covid19prep
## # 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.
<- today()
hj <- hj - 1
ontem <- mdy("01-22-2020") diainicio
<- diainicio
dia while(dia <= hj) {
<- paste(format(dia,"%m-%d-%Y"),".csv",sep="")
ultarq <- "~/datasets/CSSEGISandData/COVID-19/csse_covid_19_daily_reports/"
CSSEbasepath <- paste(CSSEbasepath,ultarq,sep="")
ultarq_fullname <- "https://github.com/CSSEGISandData/COVID-19/raw/master/csse_covid_19_data/csse_covid_19_daily_reports/"
CSSEURLbase if (!file.exists(ultarq_fullname)) {
tryCatch(expr = {
::curl_download(paste(CSSEURLbase,ultarq,sep=""),ultarq_fullname)
curlprint(paste("Fazendo dowload do arquivo",ultarq_fullname,sep=":"))
}, error = function(e) {
if(dia == hj) { print(e)} else { stop()}
}
)
}<- dia + 1
dia }
## [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
.
<- diainicio
dia <- list()
dias # mudança de formato a partir de 22 de março de 2020
<- ymd("2020-03-22")
datamudanca while (dia < datamudanca) {
<- 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),
d1 TotDeaths = sum(Deaths, na.rm = T),
TotRecov = sum(Recovered, na.rm = T)) %>%
mutate(DateRep = dia)
<- append(dias,list(d1))
dias <- dia + 1
dia
}# novo formato
while(dia <= ontem) {
<- 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),
d1 TotDeaths = sum(Deaths, na.rm = T),
TotRecov = sum(Recovered, na.rm = T)) %>%
mutate(DateRep = dia)
<- append(dias, list(d1))
dias <- dia + 1
dia }
Com a lista de todos os arquivos (data.frame
s) 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.
<- bind_rows(dias) %>% arrange(DateRep,Country)
X assign("jhucovid19prep",X)
<- 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)
jhucovid19preprm(X)
Vou atribuir um continente fictício para os países não encontrados pela função countrycode
: Outro
<- jhucovid19prep %>% mutate(Continent = if_else(is.na(countrycode(sourcevar = Country, origin = "country.name", destination = "continent")), "Outro", countrycode(sourcevar = Country, origin = "country.name", destination = "continent"))) jhucovid19prep
Alguns países estão com nomes com grafia diferente na base da JHU. Preciso uniformizar isso. Como exemplo, a Korea do Sul.
%>% select(Country) %>% filter(grepl("Korea",Country)) %>% unique() jhucovid19prep
## # 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:
%>% select(Country) %>% filter(grepl("Iran",Country)) %>% unique() jhucovid19prep
## # 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.
%<>% mutate(Code = countrycode(sourcevar = Country, origin = "country.name", destination = "iso3c"), Country = countrycode(sourcevar = Code, origin = "iso3c", destination = "country.name", nomatch = Country)) jhucovid19prep
Verificando quais países ficaram sem nome nesta uniformização, ou seja, mantive os nomes originais.
%>% select(Country, Code, Continent) %>% filter(Continent == "Outro") %>% unique() %>%
jhucovid19prep 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:
%>% select(Country, ConfirmedCases, Continent) %>%
jhucovid19prep 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
%>% select(Country, ConfirmedCases, Continent) %>%
jhucovid19prep 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 %>% group_by(DateRep, Country) %>%
jhucovid19prep 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_download("https://data.brasil.io/dataset/covid19/caso_full.csv.gz", destfile = "./data/caso_full.csv.gz")
curlsystem("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
<- read_csv("./data/WPP2019_TotalPopulationBySex.csv") populacao
Filtrei apenas os anos de 2019 e 2020 (previsão). Removi regiões estranhas que contém a palavra “dependencies”.
<- populacao %>%
pop1920 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 %>% 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) pop1920
Gravei este arquivo limpo e preparado para poder utilizar nas análises.
write_csv(pop1920, "./data/populacao20192020.csv")