Questão 1
Leitura eficiente de dados
Item a)
Verificando a página do link disponibilizado e inspecionando links de dois estados, obtém-se:
- AC parte 1 – https://s3.sa-east-1.amazonaws.com/ckan.saude.gov.br/SIPNI/COVID/uf/uf%3DAC/part-00000-cebaa94c-82a9-46e2-8c12-9cc16a61b38b.c000.csv
- AC parte 2 – https://s3.sa-east-1.amazonaws.com/ckan.saude.gov.br/SIPNI/COVID/uf/uf%3DAC/part-00001-cebaa94c-82a9-46e2-8c12-9cc16a61b38b.c000.csv –
- AL parte 1 – https://s3.sa-east-1.amazonaws.com/ckan.saude.gov.br/SIPNI/COVID/uf/uf%3DAL/part-00000-cebaa94c-82a9-46e2-8c12-9cc16a61b38b.c000.csv
Nota-se que a diferenciação quanto à UF ocorre em uf%3D**
e que a diferenciação quanto à parte do download ocorre logo em seguida em part-0000*
, iniciando a contagem em zero. Além disso, fica evidente que se trata de um arquivo .csv
.
O código a seguir cria uma pasta, caso não exista, e varre a combinação de três partes para as UF: AC, AL, AM e AP.
<- "../dados_de_trabalhos/lista_1/datasus/"
path
# verifica e cria pasta
if(!dir.exists(path)){
dir.create(path)
}
# cria vetores sobre os quais se ira iterar
<- tibble(
iterate uf = rep(c('AC', 'AL', 'AM', 'AP'), each = 3),
partes = rep(c(0:2), 4)
%>%
) transmute(caminho = paste0(
"https://s3.sa-east-1.amazonaws.com/ckan.saude.gov.br/SIPNI/COVID/uf/uf%3D",
uf,"/part-0000",
partes,"-cebaa94c-82a9-46e2-8c12-9cc16a61b38b.c000.csv"),
destfile = paste0(
".csv"
path,uf, partes,
))
# varre os vetores realizando o download
walk2(iterate$caminho, iterate$destfile,
function(x, y) download.file(url = x, destfile = y))
Vemos a seguir que houve sucesso no download:
list.files(path)
[1] "AC0.csv" "AC1.csv" "AC2.csv" "AL0.csv" "AL1.csv" "AL2.csv" "AM0.csv"
[8] "AM1.csv" "AM2.csv" "AP0.csv" "AP1.csv" "AP2.csv"
Item b)
Carregamos o pacote vroom
usando a função pacman::p_load()
e carregamos o primeiro dos arquivos, correspondente à primeira parte de dados para o estado do Acre.
Utilizando a função dplyr::glimpse()
, verificamos que há 553.953 observações de 32 variáveis neste banco de dados. Além disso, nota-se que a função vroom()
identificou com sucesso diversos tipos de dados das colunas, inclusive de datas. No entanto, colunas com números identificadores foram classificadas como números, o que pode trazer problemas se o número, como ocorre com o cadastro de pessoa física, inicia em um zero.
::p_load(tidyverse, vroom)
pacman
<- vroom(paste0(path, "AC0.csv"))
dados1 glimpse(dados1)
Rows: 553,953
Columns: 32
$ document_id <chr> "625df13b-f8c3-4ac4-8947-ee51…
$ paciente_id <chr> "7cf8dee49735df8d59d105db77d9…
$ paciente_idade <dbl> 57, 39, 9, 44, 68, 38, 43, 24…
$ paciente_dataNascimento <date> 1965-07-28, 1982-03-20, 2012…
$ paciente_enumSexoBiologico <chr> "M", "F", "M", "M", "M", "F",…
$ paciente_racaCor_codigo <chr> "04", "03", "03", "04", "01",…
$ paciente_racaCor_valor <chr> "AMARELA", "PARDA", "PARDA", …
$ paciente_endereco_coIbgeMunicipio <dbl> 120050, 120040, 120013, 12004…
$ paciente_endereco_coPais <dbl> 10, 10, 10, 10, 10, 10, 10, 1…
$ paciente_endereco_nmMunicipio <chr> "SENA MADUREIRA", "RIO BRANCO…
$ paciente_endereco_nmPais <chr> "BRASIL", "BRASIL", "BRASIL",…
$ paciente_endereco_uf <chr> "AC", "AC", "AC", "AC", "AC",…
$ paciente_endereco_cep <chr> "69940", "69919", "69926", NA…
$ paciente_nacionalidade_enumNacionalidade <chr> "B", "B", "B", "B", "B", "B",…
$ estabelecimento_valor <chr> "6697151", "6917291", "200287…
$ estabelecimento_razaoSocial <chr> "MINISTERIO DA SAUDE", "PREFE…
$ estalecimento_noFantasia <chr> "DISTRITO SANITARIO ESPECIAL …
$ estabelecimento_municipio_codigo <dbl> 120050, 120040, 120013, 12004…
$ estabelecimento_municipio_nome <chr> "SENA MADUREIRA", "RIO BRANCO…
$ estabelecimento_uf <chr> "AC", "AC", "AC", "AC", "AC",…
$ vacina_grupoAtendimento_codigo <chr> "000701", "000923", "000207",…
$ vacina_grupoAtendimento_nome <chr> "Povos indígenas em terras in…
$ vacina_categoria_codigo <dbl> 7, 9, NA, 14, 2, 2, 2, 2, 2, …
$ vacina_categoria_nome <chr> "Povos Indígenas", "Trabalhad…
$ vacina_lote <chr> "202001", "210139", "FP8290",…
$ vacina_fabricante_nome <chr> "PFIZER", "SINOVAC/BUTANTAN",…
$ vacina_fabricante_referencia <chr> "28290", "Organization/611894…
$ vacina_dataAplicacao <date> 2022-08-31, 2021-06-17, 2022…
$ vacina_descricao_dose <chr> "2º Reforço", "2ª Dose", "1ª …
$ vacina_codigo <dbl> 87, 86, 99, 86, 87, 87, 85, 8…
$ vacina_nome <chr> "COVID-19 PFIZER - COMIRNATY"…
$ sistema_origem <chr> "Novo PNI", "Novo PNI", "Novo…
Item c)
A seguir verificamos o tamanho em disco do arquivo que estamos explorando e o tamanho do objeto criado após a leitura para a memória.
Interessantemente, parece haver uma pequena economia de bytes. No entanto, o espaço ocupado em memória é proporcionalmente mais custoso em relação ao que está no disco rígido.
#tamanho em megabytes do arquivo
file.size(paste0(path, "AC0.csv"))*10^(-6)
[1] 283.0886
#tamanho do objeto
format(object.size(dados1), units = "Mb")
[1] "256.6 Mb"
Item d)
Quando filtramos o arquivo diretamente no procedimento de leitura mediante a utilização de uma conexão pipe()
para filtrar as vacinas da Janssen, verificamos que apenas 19.623 linhas foram incluídas, assim como todas as 32 variáveis que descrevem cada observação.
# leitura filtrada
<- "grep -e vacina_fabricante_nome -e JANSSEN ../../dados_de_trabalhos/lista_1/datasus/AC0.csv"
comando_grep
<- vroom(pipe(comando_grep),
dados_jan locale = locale("br", encoding = "latin1")
)
# tamanho
format(object.size(dados_jan), units = "Mb")
[1] "9.8 Mb"
Quanto ao tamanho do objeto em memória, reduzimos de format(object.size(dados1), units = "Mb")
para format(object.size(dados_jan), units = "Mb")
. Trata-se de uma redução de 96.2% de espaço necessário para alocação dos dados.
Quando se usa comandos Unix, como no caso que usamos para a conexão pipe()
, é necessário que todo o caminho do arquivo seja livre de espaços em branco. Por exemplo, o comando não funcionaria com /dados de trabalhos/
.
Item e)
Por último, realizamos a leitura de todos os arquivos obtidos do DataSUS filtrados pelo fabricante Janssen.
#obtencao de enderecos completos dos arquivos
<- str_c(path, list.files(path), collapse = " ")
nomes_arquivos
# leitura filtrada
<- paste0("grep -e vacina_fabricante_nome -e JANSSEN ", nomes_arquivos)
comando_grep
<- vroom(pipe(comando_grep),
dados_jan2 locale = locale("br", encoding = "latin1")
)
# tamanho
format(object.size(dados_jan2), units = "Mb")
[1] "224.4 Mb"
Dessa forma obtemos um objeto em memória menor do que o primeiro arquivo avaliado. Há um total de 407.582 linhas ocupando 224.4 Mb.