construcao-de-indicadores-de-acessibilidade-espacial-a-saude-com-o-pacote-asha.Rmd
bla bla bla…
Cada projeto de dados enfrenta desafios particulates. Fatores como a existência ou não dos dados, se o acesso é público, se os dados são estruturados ou não.
O problema abordado pela pesquisa foi o da relação entre o sistema municipal de atenção básica de saúde, sua organização territorial e a distribuição espacial da população. A pergunta norteadora central foi “como otimizar a acessibilidade espacial da atenção básica de saúde?”. Desta derivaram perguntas secundárias: “como avaliar a acessibilidade espacial da atenção básica de saúde?”, “quais os dados necessários, quais os dados existentes e que modelos poderiam ser utilizados?”, “dada a definição da metodologia, como viabilizar replicabilidade?”, “como lidar com a realidade de que a escassez de recursos imporá barreiras à redistribuição espacial de unidades de saúde?”, “como tornar o processo o menos custoso possível na interação com as API’s?”
Além das consultas à bibliografia, a resposta a estas perguntas envolveu um conjunto de procedimentos computacionais e estatísticos de complexidades variadas, no caso desta pesquisa realizados no R: manipulação de bases de dados espaciais, rotina de captura de informações espaciais usando as API’s do Google, criação de mapas e gráficos, geração de estatísticas descritivas e cálculo de indicadores de acessibilidade espacial.
Ao fim a metodologia foi encapsulada no pacote do R chamado asha
. A proposta deste artigo é, por meio do relato do processo de investigação, de construção da metodologia e dos indicadores, apresentar de forma prática um exemplo de uso de dados públicos para a construção de uma ferramenta propositiva para o processo de produção de políticas públicas, incluindo os desafios enfrentados e as soluções que permitiram superá-los.
“O Brasil já possui diversos casos práticos de publicação de dados na web: IBGE, Datasus, IPEA, INEP, Portal da Transparência, e muitos outros. Só que esses casos não estão aderentes às premissas dos dados abertos e da reusabilidade dos dados publicados, além de cada um fazer suas publicações em formatos e padrões diferentes.” (Miranda, p. 64)
A instalação do pacote e carregado no ambiente do R conforme indicado a seguir:
asha
knitr::kable(
tibble::tribble(
~Family, ~Function,
"Obtenção de dados", "`get_zip()`, `get_censo()`",
"Estimação de origem-destino", "asha_nn(), asha_intersect()"
),
caption = "Funcionalidades do pacote asha"
)
Family | Function |
---|---|
Obtenção de dados |
get_zip() , get_censo()
|
Estimação de origem-destino | asha_nn(), asha_intersect() |
A construção das medidas de acessibilidade disponíveis no pacote asha
depende de um conjunto específico de dados a respeito do território, da população e dos serviços de saúde pública.
As bases de dados utilizadas na pesquisa realizada com dados da cidade de São Paulo estão incorporadas ao pacote e podem servir de exemplo para os dados que deverão ser obtidos para viabilizar a modelagem e construção dos indicadores. Para ver todos os dados disponíveis no pacote digite data(package = "asha")
no console`.
Especificamente, a pesquisa baseou-se nas seguintes bases de dados:
Information | Source | Period |
---|---|---|
Census tracts mesh | Census 2010 (IBGE) | 2010 |
Habitants and income | Census 1010 aggregated by tracts (IBGE) | 2010 |
Location of primary care units | GEOSAMPA/PMSP; CNES; Google Geocode API | 2015/2016 |
Health professionals | CNES | sep/2017 |
Primary care units coverage mesh | Information request at SMS/PMSP | 2017 |
Distances in length and travel time | Google Distance Matrix API | 2017 |
Após o download dos dados e da realização do pré-processamento foram definidas as seguintes bases de dados chave:
setores
: malha de setores censitáriospopulacao
: habitantes e rendaubs_pontos
: geolocalização das UBSubs_malhas
: malha dos territórios de UBSprof_saude
: número de médicos e enfermeiros nas unidades de saúde de São PauloA base de dados final, resultado da modelagem da estrutura de origem e destino e da construção dos indicadores é a od_indicadores
, cuja estrutura é apresentada abaixo:
library(asha)
str(od_indicadores)
#> Classes 'tbl_df', 'tbl' and 'data.frame': 37906 obs. of 17 variables:
#> $ cd_geocodi : chr "355030828000139" "355030828000163" "355030887000100" "355030887000101" ...
#> $ cnes : chr "2819856" "2819856" "2819856" "2819856" ...
#> $ malha : Factor w/ 2 levels "vigente","experimento": 1 1 1 1 1 1 1 1 1 1 ...
#> $ habitantes : num 0 21 972 394 380 ...
#> $ homens : int NA 7 476 194 202 210 569 540 444 NA ...
#> $ mulheres : int NA 14 496 200 178 214 604 542 480 NA ...
#> $ renda_domicilios: chr NA "12250" "322806" "134760" ...
#> $ enfermeiros : int 8 8 8 8 8 8 8 8 8 8 ...
#> $ medicos : int 5 5 5 5 5 5 5 5 5 5 ...
#> $ oportunidades : int 13 13 13 13 13 13 13 13 13 13 ...
#> $ demanda : num 23396 23396 23396 23396 23396 ...
#> $ distancia : int NA NA 825 129 894 7179 1551 1384 1472 1088 ...
#> $ tempo : int NA NA 611 95 657 5248 1134 1011 1056 778 ...
#> $ minutos : num NA NA 10.18 1.58 10.95 ...
#> $ av : chr NA NA "Sim" "Sim" ...
#> $ av_prop : num 0.456 0.456 0.456 0.456 0.456 ...
#> $ ac : num 0.556 0.556 0.556 0.556 0.556 ...
zip
get_zip()
A função mais básica para obtenção de dados do pacote asha
é a get_zip()
. Ela é uma simples implementação conjunta das funções download.file()
e unzip()
do pacote utils
, um dos core R packages. Portanto, além de baixar qualquer arquivo .zip
da internet, ela também extrai os arquivos compactados. Além disso, a função dispõe de dois métodos para gerenciamento dos dados baixados.
O método básico é o temporário, caso em que os arquivos são locados no diretório temporário do sistema. O workflow deste método envolve o uso de duas outras funções, também disponibilizadas no pacote asha
: list_tmp()
facilita a listagem dos arquivos na pasta temporária, aceitando padrões de busca, inclusive expressões regulares e clean_tmp()
exclui o diretório temporário, caso seja preciso limpá-lo.
O segundo método é o arquivamento local dos dados. Neste caso, os arquivos são guardados no diretório indicado na função: get_zip(savedir = "path")
No caso particular da investigação, esta função foi usada para obter os pontos geolocalizados das Unidades Básicas de Saúde, shapefile disponível no portal Geosampa.
url_base <- "http://geosampa.prefeitura.sp.gov.br/PaginasPublicas/downloadArquivoOL.aspx?"
url_arquivo <- "orig=DownloadCamadas&arq=03_Equipamentos%5C%5CSa%FAde%5C%5CShapefile%5C%5CEQUIPAMENTOS_SHP_TEMA_SAUDE&arqTipo=Shapefile"
url <- paste0(url_base, url_arquivo)
get_zip(url)
O resultado mostra que os dados foram corretamente baixados. Como não indiquei nenhum diretório de salvamento os dados estão na pasta temporária. Aqui é que entra a função list_tmp()
. Com ela eu posso listar os arquivos da pasta temporária.
list_tmp()
#> [1] "/tmp/RtmpXLaA8V/file54e21ebab702.zip"
#> [2] "/tmp/RtmpXLaA8V/SAD69-96_SHP_TEMA_-_SAUDE_AMBULATORIOS_ESPECIALIZADOS.dbf"
#> [3] "/tmp/RtmpXLaA8V/SAD69-96_SHP_TEMA_-_SAUDE_AMBULATORIOS_ESPECIALIZADOS.shp"
#> [4] "/tmp/RtmpXLaA8V/SAD69-96_SHP_TEMA_-_SAUDE_AMBULATORIOS_ESPECIALIZADOS.shx"
#> [5] "/tmp/RtmpXLaA8V/SAD69-96_SHP_TEMA_-_SAUDE_HOSPITAL.dbf"
#> [6] "/tmp/RtmpXLaA8V/SAD69-96_SHP_TEMA_-_SAUDE_HOSPITAL.shp"
#> [7] "/tmp/RtmpXLaA8V/SAD69-96_SHP_TEMA_-_SAUDE_HOSPITAL.shx"
#> [8] "/tmp/RtmpXLaA8V/SAD69-96_SHP_TEMA_-_SAUDE_SAUDE_MENTAL.dbf"
#> [9] "/tmp/RtmpXLaA8V/SAD69-96_SHP_TEMA_-_SAUDE_SAUDE_MENTAL.shp"
#> [10] "/tmp/RtmpXLaA8V/SAD69-96_SHP_TEMA_-_SAUDE_SAUDE_MENTAL.shx"
#> [11] "/tmp/RtmpXLaA8V/SAD69-96_SHP_TEMA_-_SAUDE_UBS-POSTO_DE_SAUDE-CENTRO_DE_SAUDE.dbf"
#> [12] "/tmp/RtmpXLaA8V/SAD69-96_SHP_TEMA_-_SAUDE_UBS-POSTO_DE_SAUDE-CENTRO_DE_SAUDE.shp"
#> [13] "/tmp/RtmpXLaA8V/SAD69-96_SHP_TEMA_-_SAUDE_UBS-POSTO_DE_SAUDE-CENTRO_DE_SAUDE.shx"
#> [14] "/tmp/RtmpXLaA8V/SAD69-96_SHP_TEMA_-_SAUDE_UNIDADES_DST-AIDS.dbf"
#> [15] "/tmp/RtmpXLaA8V/SAD69-96_SHP_TEMA_-_SAUDE_UNIDADES_DST-AIDS.shp"
#> [16] "/tmp/RtmpXLaA8V/SAD69-96_SHP_TEMA_-_SAUDE_UNIDADES_DST-AIDS.shx"
#> [17] "/tmp/RtmpXLaA8V/SAD69-96_SHP_TEMA_-_SAUDE_URGENCIA-EMERGENCIA.dbf"
#> [18] "/tmp/RtmpXLaA8V/SAD69-96_SHP_TEMA_-_SAUDE_URGENCIA-EMERGENCIA.shp"
#> [19] "/tmp/RtmpXLaA8V/SAD69-96_SHP_TEMA_-_SAUDE_URGENCIA-EMERGENCIA.shx"
#> [20] "/tmp/RtmpXLaA8V/SAD69-96_SHP_TEMA_-_SAUDE_VIGILANCIA_EM_SAUDE.dbf"
#> [21] "/tmp/RtmpXLaA8V/SAD69-96_SHP_TEMA_-_SAUDE_VIGILANCIA_EM_SAUDE.shp"
#> [22] "/tmp/RtmpXLaA8V/SAD69-96_SHP_TEMA_-_SAUDE_VIGILANCIA_EM_SAUDE.shx"
#> [23] "/tmp/RtmpXLaA8V/SIRGAS_SHP_TEMA_-_SAUDE_AMBULATORIOS_ESPECIALIZADOS.dbf"
#> [24] "/tmp/RtmpXLaA8V/SIRGAS_SHP_TEMA_-_SAUDE_AMBULATORIOS_ESPECIALIZADOS.shp"
#> [25] "/tmp/RtmpXLaA8V/SIRGAS_SHP_TEMA_-_SAUDE_AMBULATORIOS_ESPECIALIZADOS.shx"
#> [26] "/tmp/RtmpXLaA8V/SIRGAS_SHP_TEMA_-_SAUDE_HOSPITAL.dbf"
#> [27] "/tmp/RtmpXLaA8V/SIRGAS_SHP_TEMA_-_SAUDE_HOSPITAL.shp"
#> [28] "/tmp/RtmpXLaA8V/SIRGAS_SHP_TEMA_-_SAUDE_HOSPITAL.shx"
#> [29] "/tmp/RtmpXLaA8V/SIRGAS_SHP_TEMA_-_SAUDE_SAUDE_MENTAL.dbf"
#> [30] "/tmp/RtmpXLaA8V/SIRGAS_SHP_TEMA_-_SAUDE_SAUDE_MENTAL.shp"
#> [31] "/tmp/RtmpXLaA8V/SIRGAS_SHP_TEMA_-_SAUDE_SAUDE_MENTAL.shx"
#> [32] "/tmp/RtmpXLaA8V/SIRGAS_SHP_TEMA_-_SAUDE_UBS-POSTO_DE_SAUDE-CENTRO_DE_SAUDE.dbf"
#> [33] "/tmp/RtmpXLaA8V/SIRGAS_SHP_TEMA_-_SAUDE_UBS-POSTO_DE_SAUDE-CENTRO_DE_SAUDE.shp"
#> [34] "/tmp/RtmpXLaA8V/SIRGAS_SHP_TEMA_-_SAUDE_UBS-POSTO_DE_SAUDE-CENTRO_DE_SAUDE.shx"
#> [35] "/tmp/RtmpXLaA8V/SIRGAS_SHP_TEMA_-_SAUDE_UNIDADES_DST-AIDS.dbf"
#> [36] "/tmp/RtmpXLaA8V/SIRGAS_SHP_TEMA_-_SAUDE_UNIDADES_DST-AIDS.shp"
#> [37] "/tmp/RtmpXLaA8V/SIRGAS_SHP_TEMA_-_SAUDE_UNIDADES_DST-AIDS.shx"
#> [38] "/tmp/RtmpXLaA8V/SIRGAS_SHP_TEMA_-_SAUDE_URGENCIA-EMERGENCIA.dbf"
#> [39] "/tmp/RtmpXLaA8V/SIRGAS_SHP_TEMA_-_SAUDE_URGENCIA-EMERGENCIA.shp"
#> [40] "/tmp/RtmpXLaA8V/SIRGAS_SHP_TEMA_-_SAUDE_URGENCIA-EMERGENCIA.shx"
#> [41] "/tmp/RtmpXLaA8V/SIRGAS_SHP_TEMA_-_SAUDE_VIGILANCIA_EM_SAUDE.dbf"
#> [42] "/tmp/RtmpXLaA8V/SIRGAS_SHP_TEMA_-_SAUDE_VIGILANCIA_EM_SAUDE.shp"
#> [43] "/tmp/RtmpXLaA8V/SIRGAS_SHP_TEMA_-_SAUDE_VIGILANCIA_EM_SAUDE.shx"
Além do arquivo baixado, que ganhou o nome temporário /tmp/RtmpXLaA8V/file54e21ebab702.zip, todos os arquivos que estavam compactados nele estão presentes, já descompactados.
É possível fazer buscas mais específicas. Por exemplo, para ver os arquivos .shp
:
# listar shapefiles
list_tmp("shp")
#> [1] "/tmp/RtmpXLaA8V/SAD69-96_SHP_TEMA_-_SAUDE_AMBULATORIOS_ESPECIALIZADOS.shp"
#> [2] "/tmp/RtmpXLaA8V/SAD69-96_SHP_TEMA_-_SAUDE_HOSPITAL.shp"
#> [3] "/tmp/RtmpXLaA8V/SAD69-96_SHP_TEMA_-_SAUDE_SAUDE_MENTAL.shp"
#> [4] "/tmp/RtmpXLaA8V/SAD69-96_SHP_TEMA_-_SAUDE_UBS-POSTO_DE_SAUDE-CENTRO_DE_SAUDE.shp"
#> [5] "/tmp/RtmpXLaA8V/SAD69-96_SHP_TEMA_-_SAUDE_UNIDADES_DST-AIDS.shp"
#> [6] "/tmp/RtmpXLaA8V/SAD69-96_SHP_TEMA_-_SAUDE_URGENCIA-EMERGENCIA.shp"
#> [7] "/tmp/RtmpXLaA8V/SAD69-96_SHP_TEMA_-_SAUDE_VIGILANCIA_EM_SAUDE.shp"
#> [8] "/tmp/RtmpXLaA8V/SIRGAS_SHP_TEMA_-_SAUDE_AMBULATORIOS_ESPECIALIZADOS.shp"
#> [9] "/tmp/RtmpXLaA8V/SIRGAS_SHP_TEMA_-_SAUDE_HOSPITAL.shp"
#> [10] "/tmp/RtmpXLaA8V/SIRGAS_SHP_TEMA_-_SAUDE_SAUDE_MENTAL.shp"
#> [11] "/tmp/RtmpXLaA8V/SIRGAS_SHP_TEMA_-_SAUDE_UBS-POSTO_DE_SAUDE-CENTRO_DE_SAUDE.shp"
#> [12] "/tmp/RtmpXLaA8V/SIRGAS_SHP_TEMA_-_SAUDE_UNIDADES_DST-AIDS.shp"
#> [13] "/tmp/RtmpXLaA8V/SIRGAS_SHP_TEMA_-_SAUDE_URGENCIA-EMERGENCIA.shp"
#> [14] "/tmp/RtmpXLaA8V/SIRGAS_SHP_TEMA_-_SAUDE_VIGILANCIA_EM_SAUDE.shp"
Ou para listar apenas o nome do arquivo e não o seu caminho completo:
list_tmp("shp", full = FALSE)
#> [1] "SAD69-96_SHP_TEMA_-_SAUDE_AMBULATORIOS_ESPECIALIZADOS.shp"
#> [2] "SAD69-96_SHP_TEMA_-_SAUDE_HOSPITAL.shp"
#> [3] "SAD69-96_SHP_TEMA_-_SAUDE_SAUDE_MENTAL.shp"
#> [4] "SAD69-96_SHP_TEMA_-_SAUDE_UBS-POSTO_DE_SAUDE-CENTRO_DE_SAUDE.shp"
#> [5] "SAD69-96_SHP_TEMA_-_SAUDE_UNIDADES_DST-AIDS.shp"
#> [6] "SAD69-96_SHP_TEMA_-_SAUDE_URGENCIA-EMERGENCIA.shp"
#> [7] "SAD69-96_SHP_TEMA_-_SAUDE_VIGILANCIA_EM_SAUDE.shp"
#> [8] "SIRGAS_SHP_TEMA_-_SAUDE_AMBULATORIOS_ESPECIALIZADOS.shp"
#> [9] "SIRGAS_SHP_TEMA_-_SAUDE_HOSPITAL.shp"
#> [10] "SIRGAS_SHP_TEMA_-_SAUDE_SAUDE_MENTAL.shp"
#> [11] "SIRGAS_SHP_TEMA_-_SAUDE_UBS-POSTO_DE_SAUDE-CENTRO_DE_SAUDE.shp"
#> [12] "SIRGAS_SHP_TEMA_-_SAUDE_UNIDADES_DST-AIDS.shp"
#> [13] "SIRGAS_SHP_TEMA_-_SAUDE_URGENCIA-EMERGENCIA.shp"
#> [14] "SIRGAS_SHP_TEMA_-_SAUDE_VIGILANCIA_EM_SAUDE.shp"
Como o meu interesse é apenas no shapefile de UBS, e quero os dados projetados em Sirgas, posso usar expressões regulares e criar um padrão mais específico para extrair apenas o arquivo que desejo importar.
arquivo <- list_tmp("SIRGAS*.*UBS*.*shp")
arquivo
#> [1] "/tmp/RtmpXLaA8V/SIRGAS_SHP_TEMA_-_SAUDE_UBS-POSTO_DE_SAUDE-CENTRO_DE_SAUDE.shp"
E então importar:
library(sf)
library(dplyr)
ubs_pontos <- read_sf(arquivo)
glimpse(ubs_pontos)
#> Observations: 455
#> Variables: 23
#> $ eq_cnes <chr> "2788527", "3913007", "2091348", "2091321", "2752166"…
#> $ eq_enderec <chr> "R BANDEIRA DE ARACAMBI, 704", "AV DR ABRAAO RIBEIRO,…
#> $ eq_nome <chr> "JD SAO FRANCISCO II - AMA/UBS INTEGRADA", "ALEXANDRE…
#> $ eq_bairro <chr> "JD SAO FRANCISCO", "BARRA FUNDA", "BUTANTA", "PACAE…
#> $ eq_cep <chr> "08310010\n", "01133020\n", "05503000\n", "01246904\n…
#> $ eq_setcens <chr> "355030875000151", "355030806000026", "35503081200002…
#> $ eq_ar_pond <chr> "3550308005277", "3550308005029", "3550308005105", "3…
#> $ eq_cd_dist <chr> "75", "6", "12", "45", "1", "1", "1", "2", "3", "3", …
#> $ eq_distr <chr> "SAO RAFAEL", "BARRA FUNDA", "BUTANTA", "JARDIM PAULI…
#> $ eq_cd_subp <chr> "30", "08", "10", "11", "25", "25", "25", "11", "01",…
#> $ eq_subpref <chr> "SAO MATEUS", "LAPA", "BUTANTA", "PINHEIROS", "MOOCA"…
#> $ eq_regiao5 <chr> "Leste", "Oeste", "Oeste", "Oeste", "Leste", "Leste",…
#> $ eq_regiao8 <chr> "Leste 2", "Oeste", "Oeste", "Oeste", "Leste 1", "Les…
#> $ eq_telefon <chr> "27516712", "34662502", "37267492", "30851134", "2605…
#> $ eq_cd_esfe <chr> "01", "04", "02", "02", "01", "01", "01", "01", "01",…
#> $ eq_esfera <chr> "Municipal", "Privado", "Estadual", "Estadual", "Muni…
#> $ eq_cd_tipo <chr> "045", "018", "018", "018", "045", "045", "045", "045…
#> $ eq_tipo <chr> "UNIDADE BASICA DE SAUDE", "CENTRO DE SAUDE", "CENTRO…
#> $ eq_classe <chr> "UBS-POSTO_DE_SAUDE-CENTRO_DE_SAUDE", "UBS-POSTO_DE_S…
#> $ eq_leitos <chr> "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"…
#> $ eq_cd_clas <chr> "5", "5", "5", "5", "5", "5", "5", "5", "5", "5", "5"…
#> $ eq_id <chr> "206", "216", "217", "218", "445", "446", "447", "448…
#> $ geometry <POINT> POINT (351300 7385828), POINT (330613.5 7397760), P…
Em resumo, o processo de importação deste arquivo, usando o método temporário, teria sido o seguinte:
# baixar o arquivp
url_base <- "http://geosampa.prefeitura.sp.gov.br/PaginasPublicas/downloadArquivoOL.aspx?"
url_arquivo <- "orig=DownloadCamadas&arq=03_Equipamentos%5C%5CSa%FAde%5C%5CShapefile%5C%5CEQUIPAMENTOS_SHP_TEMA_SAUDE&arqTipo=Shapefile"
url <- paste0(url_base, url_arquivo)
get_zip(url)
# importar
ubs_pontos <- read_sf(list_tmp("SIRGAS*.*UBS*.*shp"))
Já usando o método de armazenamento local o processo, seria:
# baixar o arquivp
url_base <- "http://geosampa.prefeitura.sp.gov.br/PaginasPublicas/downloadArquivoOL.aspx?"
url_arquivo <- "orig=DownloadCamadas&arq=03_Equipamentos%5C%5CSa%FAde%5C%5CShapefile%5C%5CEQUIPAMENTOS_SHP_TEMA_SAUDE&arqTipo=Shapefile"
url <- paste0(url_base, url_arquivo)
get_zip(url, savedir = "PATH DO ARQUIVO")
# importar
ubs_pontos <- read_sf("PATH DO ARQUIVO")
get_censo()
Já a função get_censo()
é específica. Ela aplica a função get_zip()
para baixar expecificamente os seguintes dados do Censo 2010:
Os dados são baixados de ftp://ftp.ibge.gob.br ou ftp://geoftp.ibge.gov.br. O primeiro disponibiliza os dados tabulares das pesquisas realizadas pelo IBGE. O segundo os dados espaciais produzidos pelo órgão, como as malhas digitais dos municípios, dos estados e dos setores censitários.
Dada a dimensão do município de São Paulo, seus arquivos são pesados. Por isto, exemplificarei o uso de get_censo()
obtendo dados do estado de Roraima.
Baixar dados tabulares
# limpar diretório temporário
# clean_tmp()
# baixa dados
get_censo(state = "rr")
# importar
file <- list_tmp("Dom*.*Renda*.*RR*.*csv")
rr_tabular <- data.table::fread(file) %>% tibble::as_tibble()
glimpse(rr_tabular)
#> Observations: 824
#> Variables: 17
#> $ Cod_setor <S3: integer64> 140002705000001, 140002705000002, 14000…
#> $ Situacao_setor <int> 1, 8, 8, 8, 5, 8, 8, 5, 8, 8, 8, 8, 8, 8, 8, 8, 8…
#> $ V001 <chr> "0", "0", "0", "0", "0", "X", "1", "0", "0", "X",…
#> $ V002 <chr> "461234", "52700", "2550", "50897", "19217", "X",…
#> $ V003 <chr> "461234", "52700", "2550", "50897", "19217", "X",…
#> $ V004 <chr> "0", "0", "0", "0", "0", "X", "0", "0", "0", "X",…
#> $ V005 <chr> "11", "3", "0", "4", "5", "X", "2", "0", "2", "X"…
#> $ V006 <chr> "35", "10", "0", "5", "5", "X", "8", "3", "2", "X…
#> $ V007 <chr> "90", "13", "3", "19", "4", "X", "13", "11", "0",…
#> $ V008 <chr> "96", "25", "0", "9", "9", "X", "9", "11", "0", "…
#> $ V009 <chr> "39", "7", "0", "4", "1", "X", "0", "4", "0", "X"…
#> $ V010 <chr> "12", "0", "0", "0", "0", "X", "1", "0", "0", "X"…
#> $ V011 <chr> "12", "0", "0", "2", "0", "X", "0", "0", "0", "X"…
#> $ V012 <chr> "4", "0", "0", "0", "0", "X", "0", "0", "0", "X",…
#> $ V013 <chr> "2", "0", "0", "1", "0", "X", "0", "0", "0", "X",…
#> $ V014 <chr> "8", "11", "2", "0", "18", "X", "27", "4", "9", "…
#> $ V17 <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
Baixar dados espaciais
Para baixar os dados espaciais (a malha de setores censitários), basta adicionar o argumento mode
na função getìbge()
.
# baixa dados
get_censo(state = "rr", datatype = "geo")
# importar
file <- list_tmp("SIR.shp")
rr_geo <- sf::read_sf(file)
glimpse(rr_geo)
#> Observations: 913
#> Variables: 14
#> $ ID <dbl> 19274, 19275, 19276, 19277, 19278, 19279, 19280, 1928…
#> $ CD_GEOCODI <chr> "140002705000001", "140002705000002", "14000270500000…
#> $ TIPO <chr> "URBANO", "RURAL", "RURAL", "RURAL", "RURAL", "RURAL"…
#> $ CD_GEOCODB <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
#> $ NM_BAIRRO <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
#> $ CD_GEOCODS <chr> "14000270500", "14000270500", "14000270500", "1400027…
#> $ NM_SUBDIST <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
#> $ CD_GEOCODD <chr> "140002705", "140002705", "140002705", "140002705", "…
#> $ NM_DISTRIT <chr> "AMAJARI", "AMAJARI", "AMAJARI", "AMAJARI", "AMAJARI"…
#> $ CD_GEOCODM <chr> "1400027", "1400027", "1400027", "1400027", "1400027"…
#> $ NM_MUNICIP <chr> "AMAJARI", "AMAJARI", "AMAJARI", "AMAJARI", "AMAJARI"…
#> $ NM_MICRO <chr> "BOA VISTA", "BOA VISTA", "BOA VISTA", "BOA VISTA", "…
#> $ NM_MESO <chr> "NORTE DE RORAIMA", "NORTE DE RORAIMA", "NORTE DE ROR…
#> $ geometry <POLYGON [°]> POLYGON ((-61.42608 3.65385..., POLYGON ((-61…
Em qualquer um dos casos basta indicar o código de outra Unidade da Federação para baixar os dados de outro estado. O exemplo abaixo, por exemplo, baixaria os dados tabulares e as malhas de setores censitários de Santa Catarina
Por fim, a função get_censo
pode ser usada para baixar outras malhas intramunicipais. Para isto é preciso indicar no argumento mesh
, aceito quando datatype = "geo"
, qual delas será obtida. Por padrão a função baixa os setores censitários, mas também aceita os argumentos “distritos”, “municipios” e “sub_distritos”. Por exemplo, para baixar os distritos de Santa Catarina:
O script de importação dos dados utilizados na pesquisa em questão pode servir de exemplo para a obtenção dos dados.
Obtenção de dados de outras fontes
Uma informação essencial para a avaliação da acessibilidade do modelo territorial do sistema municipal de atenção básica em saúde é a delimitação territorial da cobertura das UBS. No caso da cidade de São Paulo, a Secretaria Municipal de Saúde dispunha de shapefiles utilizados na gestão, porém não disponibilizados à população. Por isto foi necessário impetrar um pedido de acesso à informação no e-Sic da Prefeitura de São Paulo. Além destes, os dados de saúde também foram obtidos manualmente junto ao DATASUS/CNES.
Obtenção de dados da Google Distance Matrix API
Além destes conjuntos de dados já relacionados acima, a metodologia depende da obtenção de dados de rotas (tempos de viagem), para a modelagem da estrutra OD do sistema de atenção básica. Esta é uma das vantagens centrais adotadas na pesquisa e implementada no pacote asha
por meio da função asha_dists()
, pois baseia a modelagem espacial no tempo efetivo da rota mais próxima entre os setores censitários e as UBS e não em distâncias euclidianas como muitos trabalhos na área adotam. Isto confere maior consitência aos indicadores espaciais.
Ainda que seja também uma função de obtenção de dados, ela será apresenta mais adiante. Como o objetivo desta vinheta é apresentar a aplicação da metodologia utilizando as funções do pacote asha
de forma aplicada, esta função será apresentada na explicação sobre a modelagem da estrutura de sistema de atenção básica de saúde, mantendo-a no contexto da sua aplicação.
Após o processo de importação foi realizada a preparação dos dados, antes de proceder com a modelagem da acessibilidade espacial. Como em todo projeto de dados, esta é das mais importantes etapas, pois torna todo o trabalho posterior mais fácil e organizado. Mas é a que mais consome tempo, pois implica conhecer os dados, suas variáveis, a interrelação entre os conjuntos de dados, e definir meios de solucionar problemas que se apresentem no processo cíclico de pre-processamento.
Particularmente, as maiores dificuldades encontradas foram relacionadas à definição das UBS existentes, em função de informações desatualizadas e erros de geolocalização. Isto demandou uma série de explorações nos dados, consulta ao órgão municipal de saúde e cruzamento de informações da Prefeitura e do CNES.
Após a identificação das UBS em atividade aquelas que não existiam na base de pontos, bastou geocodificar As coordenadas espaciais foram obtidas com a Google Geocoding API por meio da função geocode
do pacote ggmap
, que estabelece interface com a API.
A parte computacional deste procedimento é simples:
# separar amostra de enderecos
enderecos <- ubs_malha$endereco[1:5]
enderecos
#> [1] "R. ADÃO MANOEL DA SILVA, 16 C, CEP 08072180"
#> [2] "R. PASQUALE GUALUPPI, 951, CEP 05660000"
#> [3] "R. MELCHIOR GIOLA, 80, CEP 05664000"
#> [4] "R. SILVEIRA SAMPAIO, 660, CEP 05656010"
#> [5] "R. FRANCISCO SOARES, 81, CEP 05774300"
# geolocalizar
library(ggmap)
geocode(enderecos)
#> # A tibble: 5 x 2
#> lon lat
#> <dbl> <dbl>
#> 1 -48.6 -27.6
#> 2 -46.7 -23.6
#> 3 -46.7 -23.6
#> 4 -46.7 -23.6
#> 5 -46.7 -23.6
Depois de finalizado, quando estabelecidas as linhas OD da malha territorial vigente, percebi que havia algumas UBS (15 ao todo) com erros graves de geolocalização. Foi então realizada mais uma rodada de consulta aos endereços destas UBS nos sites da Prefeitura e do CNES para conferência de endereços. Após obtenção dos endereços corretos eles foram geocodificados e os pontos incosistentes corrigidos.
Todo do processo de tratament dos dados está nos scripts presentes podem ser visto aqui. Ao fim, foram geradas as seguintes bases de dados.
# dados tabulares
head(populacao)
#> # A tibble: 6 x 5
#> cd_geocodi habitantes homens mulheres renda_domicilios
#> <chr> <int> <int> <int> <chr>
#> 1 355030801000001 806 378 428 907777
#> 2 355030801000002 913 418 495 846525
#> 3 355030801000003 625 296 329 505662
#> 4 355030801000004 572 276 296 446011
#> 5 355030801000005 754 355 399 615215
#> 6 355030801000006 643 312 331 507028
head(prof_saude)
#> # A tibble: 6 x 3
#> cnes enfermeiros medicos
#> <chr> <int> <int>
#> 1 2751844 8 50
#> 2 2751879 4 23
#> 3 2751887 6 16
#> 4 4050312 10 32
#> 5 3913007 10 156
#> 6 2091348 3 15
# dados espaciais
head(setores)
#> Simple feature collection with 6 features and 4 fields
#> geometry type: MULTIPOLYGON
#> dimension: XY
#> bbox: xmin: 343671.5 ymin: 7391134 xmax: 345114.6 ymax: 7392296
#> epsg (SRID): 31983
#> proj4string: +proj=utm +zone=23 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs
#> # A tibble: 6 x 5
#> cd_geocodi tipo cd_geocodd nm_distrit geometry
#> <chr> <chr> <chr> <chr> <MULTIPOLYGON [m]>
#> 1 3550308040… URBA… 355030804 ARICANDUVA (((345114.6 7391510, 345106.8 73…
#> 2 3550308040… URBA… 355030804 ARICANDUVA (((345002.9 7391487, 344983.1 73…
#> 3 3550308040… URBA… 355030804 ARICANDUVA (((344874.9 7391333, 344864.2 73…
#> 4 3550308040… URBA… 355030804 ARICANDUVA (((344746.1 7391457, 344742.5 73…
#> 5 3550308040… URBA… 355030804 ARICANDUVA (((344512.4 7391240, 344500.2 73…
#> 6 3550308040… URBA… 355030804 ARICANDUVA (((344106.5 7392083, 344105.8 73…
head(ubs_pontos)
#> Simple feature collection with 6 features and 1 field
#> geometry type: POINT
#> dimension: XY
#> bbox: xmin: 324795.4 ymin: 7385828 xmax: 351300 ymax: 7397760
#> epsg (SRID): 31983
#> proj4string: +proj=utm +zone=23 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs
#> # A tibble: 6 x 2
#> cnes geometry
#> <chr> <POINT [m]>
#> 1 2788527 (351300 7385828)
#> 2 3913007 (330613.5 7397760)
#> 3 2091348 (324795.4 7392496)
#> 4 2091321 (329183.6 7394216)
#> 5 2752166 (338737.3 7394267)
#> 6 2752344 (339203.5 7392421)
head(ubs_malha)
#> Simple feature collection with 6 features and 5 fields
#> geometry type: GEOMETRY
#> dimension: XY
#> bbox: xmin: 320720.4 ymin: 7384008 xmax: 351580 ymax: 7402907
#> epsg (SRID): 31983
#> proj4string: +proj=utm +zone=23 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs
#> cnes nomeubs sts crs
#> 1 2819856 UBS UNIÃO DE VILA NOVA II - ADÃO MANOEL SAO MIGUEL LESTE
#> 2 3956954 UBS PARAISOPOLIS II CAMPO LIMPO SUL
#> 3 2788187 UBS PARAISOPOLIS CAMPO LIMPO SUL
#> 4 6564410 UBS PARAISOPOLIS III CAMPO LIMPO SUL
#> 5 2788268 UBS PARQUE ARARIBA - CEO II CAMPO LIMPO SUL
#> 6 6329527 UBS JARDIM DAS PALMAS CAMPO LIMPO SUL
#> endereco
#> 1 R. ADÃO MANOEL DA SILVA, 16 C, CEP 08072180
#> 2 R. PASQUALE GUALUPPI, 951, CEP 05660000
#> 3 R. MELCHIOR GIOLA, 80, CEP 05664000
#> 4 R. SILVEIRA SAMPAIO, 660, CEP 05656010
#> 5 R. FRANCISCO SOARES, 81, CEP 05774300
#> 6 R. FRANCISCO DE SALES, 10, CEP 05749280
#> geometry
#> 1 POLYGON ((351580 7401277, 3...
#> 2 MULTIPOLYGON (((324101.6 73...
#> 3 MULTIPOLYGON (((323313.7 73...
#> 4 MULTIPOLYGON (((323340.4 73...
#> 5 MULTIPOLYGON (((323327.6 73...
#> 6 MULTIPOLYGON (((322079.5 73...
OD euclidiano
centroides <- st_centroid(setores) %>% select(cd_geocodi)
od_euclidiano <- asha_nn(ubs_pontos, centroides, "cnes", "cd_geocodi", 5)
od_euclidiano
#> # A tibble: 94,765 x 4
#> cd_geocodi cnes proximidade distancia
#> <chr> <chr> <int> <dbl>
#> 1 355030804000079 2787490 1 429.
#> 2 355030804000080 2787490 1 523.
#> 3 355030804000081 2787490 1 551.
#> 4 355030804000082 2788942 1 614.
#> 5 355030804000083 2788942 1 429.
#> 6 355030804000084 2788942 1 649.
#> 7 355030804000085 4049799 1 465.
#> 8 355030804000086 4049799 1 637.
#> 9 355030804000087 2789124 1 568.
#> 10 355030804000088 2789124 1 549.
#> # … with 94,755 more rows
Isto sigfica identificar as “n” UBS mais proximas de cada setor censitario. No caso estamos trabalhando com as 5 UBS mais proximas.
# Preparar base de zonas ---------------
zonas <- asha_zones(centroides, ubs_pontos, "cd_geocodi", "cnes")
head(zonas)
#> Simple feature collection with 6 features and 2 fields
#> geometry type: POINT
#> dimension: XY
#> bbox: xmin: 343921.6 ymin: 7391216 xmax: 345013.3 ymax: 7392131
#> epsg (SRID): 31983
#> proj4string: +proj=utm +zone=23 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs
#> # A tibble: 6 x 3
#> id tipo geometry
#> <chr> <chr> <POINT [m]>
#> 1 355030804000079 cd_geocodi (345013.3 7391354)
#> 2 355030804000080 cd_geocodi (344882.7 7391371)
#> 3 355030804000081 cd_geocodi (344779.2 7391291)
#> 4 355030804000082 cd_geocodi (344635 7391342)
#> 5 355030804000083 cd_geocodi (344366.9 7391216)
#> 6 355030804000084 cd_geocodi (343921.6 7392131)
tail(zonas)
#> Simple feature collection with 6 features and 2 fields
#> geometry type: POINT
#> dimension: XY
#> bbox: xmin: 321895.2 ymin: 7357235 xmax: 343578.5 ymax: 7398762
#> epsg (SRID): 31983
#> proj4string: +proj=utm +zone=23 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs
#> # A tibble: 6 x 3
#> id tipo geometry
#> <chr> <chr> <POINT [m]>
#> 1 5731143 cnes (331804.9 7380997)
#> 2 6018912 cnes (322675 7357918)
#> 3 6194990 cnes (343578.5 7398762)
#> 4 6329527 cnes (321895.2 7386516)
#> 5 6332420 cnes (331979 7358334)
#> 6 6332471 cnes (323707.7 7357235)
O levantamento de dados de rotas consiste na consulta à Google Distance Matrix API para obtenção de dados de rotas (distancia e tempo de viagem) entre as 94765 conexões de origem e destino criadas em od_euclidiano
.
## Levantar dados de rotas ---------------
# Esta etapa demora muito. Mais de um dia.
od_euclidiano_exemplo <- od_euclidiano[1:5, ]
zonas_exemplo <- zonas %>%
filter(id %in% od_euclidiano_exemplo$cnes |
id %in% od_euclidiano_exemplo$cd_geocodi)
asha_dists(od_euclidiano_exemplo, zonas_exemplo, api = Sys.getenv("GOOGLEDIST"))
#> de
#> 1 Tv. Ocaso do Mar, 8 - Vila rica, São Paulo - SP, 03911-155, Brazil
#> 2 R. Padre Miguelinho, 29 - Vila rica, São Paulo - SP, 03912-020, Brazil
#> 3 R. João Jacinto Silva, 84 - Vila rica, São Paulo - SP, 03912-240, Brazil
#> 4 R. Bartolomeu Abril, 66 - Vila rica, São Paulo - SP, 03912-180, Brazil
#> 5 Rua Isabel Garcia Marques, 139 - Parque Santo Antonio, São Paulo - SP, 03385-120, Brazil
#> para
#> 1 R. Miguel Bastos Soares, 365 - Jardim Nice, São Paulo - SP, 03910-000, Brazil
#> 2 R. Miguel Bastos Soares, 365 - Jardim Nice, São Paulo - SP, 03910-000, Brazil
#> 3 R. Miguel Bastos Soares, 365 - Jardim Nice, São Paulo - SP, 03910-000, Brazil
#> 4 Rua Terezinha, 140 - Chácara Belenzinho, São Paulo - SP, 03382-160, Brazil
#> 5 Rua Terezinha, 140 - Chácara Belenzinho, São Paulo - SP, 03382-160, Brazil
#> distancias tempo moeda tarifa
#> 1 503 339 NA NA
#> 2 785 564 NA NA
#> 3 774 584 NA NA
#> 4 1123 958 NA NA
#> 5 671 587 NA NA
## od_indicadores da malha vigente -------------------------------------------------------------
od_indicadores <- list(vigente = asha::asha_intersect(ubs_malha, centroides, "cnes", "cd_geocodi"))
#' O resultado tem 18948 setores, de 18953. Os cinco nao incluidos
#' nao estao dentro de nenhuma area de ubs, por diferencas na geometria.
#' Abaixo incluo diretamente as linhas com os setores ausentes. Busquei
#' no mapa as UBS correspondentes.
cd_setores <- setores$cd_geocodi[!(setores$cd_geocodi %in% od_indicadores$vigente$cd_geocodi)]
cd_ubs <- c("3121135", "4049934", "2788039", "2788217", "2788500")
od_indicadores$vigente <- od_indicadores$vigente %>%
rbind(tibble::tibble(cd_geocodi = cd_setores, cnes = cd_ubs)) %>%
dplyr::mutate(malha = "vigente") %>%
tibble::as_tibble()
## od_indicadores da malha experimental --------------------------------------------------------
od_indicadores$prox <- od_viagens %>%
dplyr::group_by(cd_geocodi) %>%
# ha menor tempo com distancia igual
dplyr::filter(tempo == min(tempo)) %>%
dplyr::filter(distancias == min(distancias)) %>%
dplyr::ungroup() %>%
dplyr::select(cd_geocodi, cnes) %>%
dplyr::mutate(malha = "experimento") %>%
tibble::as_tibble()
# Extrair setores ausentes
cd_setores <- setores$cd_geocodi[!(setores$cd_geocodi %in% od_indicadores$prox$cd_geocodi)]
od_euclidiano <- asha::asha_nn(ubs_pontos, centroides, "cnes", "cd_geocodi", 5)
# terminar od_indicadores da malha experimental
od_indicadores$prox <- od_indicadores$prox %>%
rbind(od_euclidiano %>%
dplyr::filter(proximidade == 1, cd_geocodi %in% cd_setores) %>%
dplyr::select(cd_geocodi, cnes) %>%
dplyr::mutate(malha = "experimento"))
# UNIR BASES od_indicadores ---------------------------------------------------------------
od_indicadores <- do.call(rbind, od_indicadores) %>%
dplyr::mutate(malha = factor(malha, levels = c("vigente", "experimento")))
od_indicadores <- od_indicadores %>%
dplyr::left_join(populacao, by = "cd_geocodi") %>%
dplyr::left_join(prof_saude, by = "cnes") %>%
dplyr::mutate(oportunidades = enfermeiros + medicos,
habitantes = tidyr::replace_na(habitantes, 0)) %>%
dplyr::group_by(cnes) %>%
dplyr::mutate(demanda = sum(habitantes, na.rm = TRUE)) %>%
dplyr::ungroup() %>%
dplyr::left_join(od_viagens[, c("cnes", "cd_geocodi", "distancias", "tempo")],
by = c("cd_geocodi", "cnes")) %>%
dplyr::rename(distancia = distancias)
# CALCULAR INDICADORES --------------------------------------------------------
## Acessibilidade viável -------------
od_indicadores <- asha::asha_av(od_indicadores, cnes, tempo, habitantes, malha, 15)
## Acessibilidade competitiva -------------
od_indicadores <- asha::asha_ac(od_indicadores, habitantes, cnes, malha, 1000)
head(od_indicadores)
#> # A tibble: 6 x 17
#> cd_geocodi cnes malha habitantes homens mulheres renda_domicilios
#> <chr> <chr> <fct> <dbl> <int> <int> <chr>
#> 1 355030828… 2819… vige… 0 NA NA <NA>
#> 2 355030828… 2819… vige… 21 7 14 12250
#> 3 355030887… 2819… vige… 972 476 496 322806
#> 4 355030887… 2819… vige… 394 194 200 134760
#> 5 355030887… 2819… vige… 380 202 178 100284
#> 6 355030887… 2819… vige… 424 210 214 186868
#> # … with 10 more variables: enfermeiros <int>, medicos <int>,
#> # oportunidades <int>, demanda <dbl>, distancia <int>, tempo <int>,
#> # minutos <dbl>, av <chr>, av_prop <dbl>, ac <dbl>