Questão 2
Manipulação de dados
Item a)
::p_load(tidyverse, data.table, dtplyr, microbenchmark, geobr) pacman
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
<- geobr::read_health_region(year = 2013) r_saude
# ler arquivos com map e fread(select = c(nome das colunas))
<- function(x) {
read_select fread(x, select = c("estabelecimento_uf", "vacina_descricao_dose", "estabelecimento_municipio_codigo"))
}
<- map_df(arquivos, read_select) %>%
tabela 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
$cod_ibge <- as.character(tabela$cod_ibge)
tabela
# 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
<- fread("../../dados_de_trabalhos/lista_1/Tabela_codigos.csv",
codigos select = c("Cód IBGE", "Cód Região de Saúde")) %>%
::clean_names() %>%
janitorsetnames('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
<- merge(codigos, r_saude, by = "code_health_region")
joins <- merge(joins, tabela[, .N, "cod_ibge"], by = "cod_ibge")
joins
#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[, .(N = sum(N)), code_health_region][, cobertura := ifelse(N > median(N), 'alta', 'baixa')][order(code_health_region),]%>%
joins group_by(cobertura) %>%
slice_max(order_by = N, n = 5)
%>%
joins ::kable(
knitralign = "c",
booktabs = TRUE,
longtable = TRUE,
linesep = "",
escape = FALSE,
col.names = c("Região de saúde", "Vacinações", "Cobertura")
%>%
) ::kable_styling(
kableExtraposition = "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
::kable(
knitralign = "c",
booktabs = TRUE,
longtable = TRUE,
linesep = "",
escape = FALSE,
col.names = c("Região de saúde", "Vacinações", "Cobertura")
%>%
) ::kable_styling(
kableExtraposition = "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