ExercĂ­cios

ExercĂ­cio

Mapear a epidemia do vĂ­rus Zika no Brasil usando os dados disponĂ­veis em

https://github.com/cdcepi/zika

ExercĂ­cio

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>

ExercĂ­cio

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) 

ExercĂ­cio

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

ExercĂ­cio

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")

plot of chunk unnamed-chunk-4

ExercĂ­cio

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

ExercĂ­cio

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)))

plot of chunk unnamed-chunk-8

ExercĂ­cio

É 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)

"brasil zika animation"