Mapear a epidemia do vĂrus Zika no Brasil usando os dados disponĂveis em
Existem sete ficheiros, cada um correspondendo a uma semana de recolha de dados
library(readr)
library(purrr)
library(dplyr)
library(tidyr)
library(ggplot2)
library(ggmap)
url <- paste0("https://raw.githubusercontent.com/cdcepi/zika/master/Brazil/",
"Epidemiological_Bulletin/data/Epidemiological_Bulletin-<DATE>.csv")
dates <- c("2016-04-02", "2016-04-23", "2016-04-30",
"2016-05-07", "2016-05-14", "2016-05-21", "2016-05-28")
file.names <- map_chr(dates, function(x) gsub("<DATE>",x,url))
zika.full <- invoke_map_df(read_csv, file.names)
zika.full %>% print(n=12)
# A tibble: 231 x 9
report_date location location_type data_field
<date> <chr> <chr> <chr>
1 2016-04-02 Norte region zika_reported
2 2016-04-02 Brazil-Rondonia state zika_reported
3 2016-04-02 Brazil-Acre state zika_reported
4 2016-04-02 Brazil-Amazonas state zika_reported
5 2016-04-02 Brazil-Roraima state zika_reported
6 2016-04-02 Brazil-Para state zika_reported
7 2016-04-02 Brazil-Amapa state zika_reported
8 2016-04-02 Brazil-Tocantins state zika_reported
9 2016-04-02 Nordeste region zika_reported
10 2016-04-02 Brazil-Maranhao state zika_reported
11 2016-04-02 Brazil-Piaui state zika_reported
12 2016-04-02 Brazil-Ceara state zika_reported
# ... with 219 more rows, and 5 more variables: data_field_code <chr>,
# time_period <chr>, time_period_type <chr>, value <int>, unit <chr>
A tabela está num formato confuso, misturando regiões, estados e o total do paĂs (que se encontra na Ăşltima linha da tabela). Vamos simplificar a tabela para podermos aceder aos dados de forma mais eficiente.
A primeira tarefa Ă© colocar a respectiva regiĂŁo para cada um dos estados do Brasil:
# onde estão as linhas das regiões?
region.idxs <- which(zika.full$location_type=="region")
# quantos estados tĂŞm cada regiĂŁo
rep.amount <- diff(region.idxs)
# incluir a dimensĂŁo da Ăşltima regiĂŁo
rep.amount <- c(rep.amount, nrow(zika.full)-region.idxs[length(region.idxs)])
# repetir o nome da regiĂŁo para cada estado respectivo
regions <- rep(zika.full[region.idxs,]$location, rep.amount)
# a Ăşltima linha Ă© a do Brasil
zika.full$region <- c(regions,NA)
Agora vamos filtrar apenas as colunas dos estados, e apagar as colunas que nĂŁo nos interessam:
zika.full %>%
dplyr::filter(location_type=="state") %>%
dplyr::filter(location!="Brazil") %>%
separate("location", into=c("Country", "State"), sep="-") %>%
select(-c(2,4:8,10)) -> zika.states
zika.states
# A tibble: 189 x 4
report_date State value region
* <date> <chr> <int> <chr>
1 2016-04-02 Rondonia 618 Norte
2 2016-04-02 Acre 375 Norte
3 2016-04-02 Amazonas 1520 Norte
4 2016-04-02 Roraima 44 Norte
5 2016-04-02 Para 771 Norte
6 2016-04-02 Amapa 74 Norte
7 2016-04-02 Tocantins 2893 Norte
8 2016-04-02 Maranhao 1202 Nordeste
9 2016-04-02 Piaui 7 Nordeste
10 2016-04-02 Ceara 156 Nordeste
# ... with 179 more rows
Já podemos apresentar esta informação:
zika.states %>%
group_by(report_date, region) %>%
summarize(cases=sum(value)) %>%
ggplot(aes(x=report_date, y=cases, group=region, color=region)) +
geom_line() +
geom_point() +
ggtitle("Casos do Zika por RegiĂŁo")
Vamos agora apresentar os dados geograficamente. Primeiro é necessário recolher as coordenadas GPS dos vários estados brasileiros:
library(ggmap)
# pesquisar coordenadas de cada estado e colocar na tabela 'longlat'
longlat <- geocode(paste(unique(zika.states$State), " Brazil"))
longlat$Loc <- unique(zika.states$State)
# unir as tabelas fazendo um join pelo nome do estado
zika.states %>%
inner_join(longlat, by=c("State"="Loc")) -> zika.states2
zika.states2
# A tibble: 189 x 6
report_date State value region lon lat
<date> <chr> <int> <chr> <dbl> <dbl>
1 2016-04-02 Rondonia 618 Norte -63.58061 -11.505734
2 2016-04-02 Acre 375 Norte -70.81200 -9.023796
3 2016-04-02 Amazonas 1520 Norte -65.85606 -3.416843
4 2016-04-02 Roraima 44 Norte -62.07510 2.737597
5 2016-04-02 Para 771 Norte -54.93062 -1.998127
6 2016-04-02 Amapa 74 Norte -50.78742 2.044740
7 2016-04-02 Tocantins 2893 Norte -48.29825 -10.175280
8 2016-04-02 Maranhao 1202 Nordeste -45.27442 -4.960950
9 2016-04-02 Piaui 7 Nordeste -42.72892 -7.718340
10 2016-04-02 Ceara 156 Nordeste -39.32062 -5.498398
11 2016-04-02 Rio_Grande_do_Norte 640 Nordeste -36.95411 -5.402580
12 2016-04-02 Paraiba 1060 Nordeste -36.78195 -7.239961
# ... with 177 more rows
Vejamos os dados recolhidos na primeira semana:
plot.data <-
zika.states2 %>%
dplyr::filter(report_date==dates[1])
brazil <-
get_map(location = "Brazil", zoom = 4)
map <-
ggmap(brazil) +
geom_point(data=plot.data, alpha=0.5,
aes(x=lon, y=lat, size=value,
color=region)) +
scale_size_continuous(range = c(4, 10)) +
guides(colour = guide_legend(override.aes = list(size=5)))
É possĂvel animar a visualização com gganimate
, uma extensĂŁo do ggplot
:
# ref: https://github.com/dgrtwo/gganimate
# install: devtools::install_github("dgrtwo/gganimate")
map2 <-
ggmap(brazil) +
geom_point(data=zika.states2, alpha=0.5,
aes(x=lon, y=lat, size=value,
color=region,
frame=report_date)) + # !!
scale_size_continuous(range = c(4, 10)) +
guides(colour = guide_legend(override.aes = list(size=5)))
library(gganimate)
gg_animate(map2, interval=1.5)