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.

path <- "../dados_de_trabalhos/lista_1/datasus/"

# verifica e cria pasta
if(!dir.exists(path)){
  dir.create(path)
}

# cria vetores sobre os quais se ira iterar
iterate <- tibble(
  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(
        path,uf, partes, ".csv"
      ))

# 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.

pacman::p_load(tidyverse, vroom)

dados1 <- vroom(paste0(path, "AC0.csv"))
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
comando_grep <- "grep -e vacina_fabricante_nome -e JANSSEN ../../dados_de_trabalhos/lista_1/datasus/AC0.csv"

dados_jan <- vroom(pipe(comando_grep), 
                     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.

Note

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
nomes_arquivos <- str_c(path, list.files(path), collapse = " ")

# leitura filtrada
comando_grep <- paste0("grep -e vacina_fabricante_nome -e JANSSEN ", nomes_arquivos)

dados_jan2 <- vroom(pipe(comando_grep), 
                     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.