Questão 2

Manipulação de dados

Item a)

pacman::p_load(tidyverse, data.table, dtplyr, microbenchmark, geobr)

O procedimento a seguir lê novamente todos os arquivos adquiridos, mantendo apenas as colunas estabelecimento_uf, vacina_descricao_dose e estabelecimento_municipio_codigo, e obtem os dados do pacote geobr para as regiões de saúde.

#puxa dados das regioes de saudeo do geobr
r_saude <- geobr::read_health_region(year = 2013)
# ler arquivos com map e fread(select = c(nome das colunas))

read_select <- function(x) {
  fread(x, select = c("estabelecimento_uf", "vacina_descricao_dose", "estabelecimento_municipio_codigo"))
}

tabela <- map_df(arquivos, read_select) %>%
  setnames('estabelecimento_municipio_codigo', 'cod_ibge')

#usando o mutate direto no passo anterior realiza coerção
# para dtplyr step em vez de data.table. Exigiria um as_tibble
tabela$cod_ibge <- as.character(tabela$cod_ibge)

# de fato, é um data.table
class(tabela)
[1] "data.table" "data.frame"

Item b)

De acordo com sites do Governo Federal, as Regiões de Saúde são formadas por municípios fronteiriços que compartilham identidades culturais, econômicas e sociais, redes de comunicação e infraestrutura de transportes. A finalidade dessas regiões é integrar a organização, o planejamento e a execução de ações e serviços de saúde.

# leitura de tabela intermediaria de codigos
codigos <- fread("../../dados_de_trabalhos/lista_1/Tabela_codigos.csv",
                 select = c("Cód IBGE", "Cód Região de Saúde")) %>%
  janitor::clean_names() %>%
  setnames('cod_regiao_de_saude','code_health_region') %>%
  map_df(as.character)%>%
  setDT()

#faz os joins de forma mais clara que o merge
#usar o merge permitiria realizar os joins sem a sumarização do passo anterior
joins <- merge(codigos, r_saude, by = "code_health_region")
joins <- merge(joins, tabela[, .N, "cod_ibge"], by = "cod_ibge")

#quantidade de vacinados por regiao de saude
# E
#Condicionalmente, a faixa de vacinação por região de saúde (alta ou baixa, em relação à medianada distribuição de vacinações)

# utilizando operacoes encadeadas de data.table

joins <- joins[, .(N = sum(N)), code_health_region][, cobertura := ifelse(N > median(N), 'alta', 'baixa')][order(code_health_region),]%>% 
  group_by(cobertura) %>% 
  slice_max(order_by = N, n = 5)

joins %>%
  knitr::kable(
    align = "c",
    booktabs = TRUE,
    longtable = TRUE,
    linesep = "",
    escape = FALSE,
    col.names = c("Região de saúde", "Vacinações", "Cobertura")
    ) %>%
  kableExtra::kable_styling(
      position = "center",
      latex_options = c("striped", "repeat_header"),
      stripe_color = "gray!15")
Região de saúde Vacinações Cobertura
13001 5594673 alta
27001 2803602 alta
12002 1121221 alta
27007 1018179 alta
16001 942405 alta
13004 362557 baixa
27003 360353 baixa
13009 359768 baixa
27008 328312 baixa
27010 317777 baixa

Item c)

Para repetimos as operações anteriores com dtplyr, basta passar individualmente as tabelas tabela, codigos e r_saude usadas no passo anterior na função lazy_dt, realizar as operações de join já feitas com inner_join e, após os agrupamentos e sumarização necessários com verbos tidy, passar o produto das operações em pipe para %>% as_tibble(). A última função traz um objeto com todos os casos explícitos, ocupando menos espaço do o processamento de todos os objetos iniciais, grandes, em formato tibble.

tabela %>%
  lazy_dt()%>%
  group_by(cod_ibge) %>%
  summarise(N = n()) %>%
  ungroup()%>%
  inner_join(codigos, by = "cod_ibge") %>%
  inner_join(r_saude, by = "code_health_region") %>%
  group_by(code_health_region) %>%
  summarise(N = sum(N)) %>%
  mutate(cobertura = if_else(N > median(N), 'alta', 'baixa')) %>%
  group_by(cobertura) %>%
  slice_max(order_by = N, n = 5) %>% 
  as_tibble()%>%
  # ATE AQUI TEMOS O CÁLCULO. A SEGUIR APENAS ESTÉTICA
  knitr::kable(
    align = "c",
    booktabs = TRUE,
    longtable = TRUE,
    linesep = "",
    escape = FALSE,
    col.names = c("Região de saúde", "Vacinações", "Cobertura")
    ) %>%
  kableExtra::kable_styling(
      position = "center",
      latex_options = c("striped", "repeat_header"),
      stripe_color = "gray!15")
Região de saúde Vacinações Cobertura
13001 5594673 alta
27001 2803602 alta
12002 1121221 alta
27007 1018179 alta
16001 942405 alta
13004 362557 baixa
27003 360353 baixa
13009 359768 baixa
27008 328312 baixa
27010 317777 baixa

Item d)

Para este item, os procedimentos dos itens b) e c) foram transformados em funções, para simplificar a visualização. As mesmas operações foram utilizadas.

microbenchmark(
  dtplyr = func_dtplyr(),
  data.table = func_datatable(),
  times = 30
)
Unit: milliseconds
       expr      min       lq     mean   median       uq      max neval cld
     dtplyr 155.5316 179.6866 206.7437 197.1196 230.6750 363.9243    30   a
 data.table 147.7384 166.9060 192.9997 185.3823 216.9624 279.0396    30   a