knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>",
  fig.path = "man/figures/README-",
  out.width = "100%"
)

milton

Lifecycle: experimental R-CMD-check Codecov test coverage

O objetivo de milton é oferecer ferramentas para facilitar o georreferenciamento de dados no Brasil.

Instalação

Você pode instalar a versão de desenvolvimento de milton do GitHub com o código abaixo:

# install.packages("devtools")
devtools::install_github("tomasbarcellos/milton")
library(milton)

Georreferenciando endereços

O pacote permite que você georrefenrencie seus dados com:

  1. Endereço
  2. CEP
av <- get_addr("Avenida pequeno príncipe")
av
# CEP da avenida pequeno principe
get_addr("88063-000")

Identificando pertencimento

Carregando funções de utilidade para ler e manipular dados.

library(tidyverse)

Também é possível identificar o município e o setor censitário de um endereço. Para tanto precisamos dos endereços que vamos localizar e as geometrias em que eles devem ser identificados.

mun <- readRDS("tests/testthat/mun.rds") %>%
  sf::st_transform(crs = 4674) %>% 
  rename(geometry = geom)
mun <- geobr::read_municipality(year = 2018) %>% 
  rename(geometry = geom)

A função geopart permite fazê-lo.

geo_av <- geopart(av, mun)
ggplot(mun[geo_av, ]) +
  geom_sf() +
  theme_void()

A API do pacote foi construída buscando permitir o uso do pipe (%>%).

geo_museu <- get_addr("Museu da Língua Portuguesa") %>% 
  geopart(mun)

ggplot(mun[geo_museu, ]) +
  geom_sf() +
  theme_void()

Para a identificação do setor censitário também é possível usar a mesma função. Para tanto deve-se usar como segundo argumento os polígonos dos setores censitários. Uma forma fácil de acessar esses polígonos é usando o pacote geobr: geobr::read_census_tract.

setores <- readRDS("tests/testthat/censo.rds") %>%
  sf::st_transform(crs = 4674) %>% 
  rename(geometry = geom)
setores <- geobr::read_census_tract(3550308) %>% 
  rename(geometry = geom)

Com estes polígonos em mãos é possível identificar o setor censitário ao qual determinado endereço pertence.

epm <- get_addr("Rua botucatu, 740")

geo_epm <- geopart(epm, setores)

ggplot(setores[geo_epm, ]) +
  geom_sf() +
  theme_void()

Outra funcionalidade do pacote permite relacionar endereços distintos, medindo suas distâncias ou identificando o local mais próximo.

Suponhamos que tenhamos uma tabela com os endereços os pacientes A, B e C:

pacientes <- tibble(
  paciente = LETTERS[1:3],
  endereco = c(
    "Av. Dr. Altino Arantes, 941",
    "Rua Gandavo, 349, São Paulo",
    "Rua Bela cruz, 40"
  )
) %>% 
  mutate(latlon = get_addr(endereco))

pacientes

E agora é possível calcular a distância entre esses pontos e a Escola Paulista de Medicina.

pacientes %>% 
  mutate(distancia_km = distancia(latlon, epm))

Há um conjunto de funções que permite identificar, por exemplo, o local mais adequado para tratar determinado paciente:

  1. min_dist retorna a menor distância;
  2. nearplace retorna o local mais próximo.

Desse modo, dado um conjunto de hospitais:

hospitais <- c("Hospital São Paulo", 
               "Hospital Dom Alvarenga",
               "Hospital Paulistano")

geo_hospitais <- get_addr(hospitais)

É possível identificar a distância dos hospitais para o paciente C:

paciente_C <- pacientes$latlon[3]
distancia(paciente_C, geo_hospitais)

Assim como o hospital de menor distância.

min_dist(paciente_C, geo_hospitais)

E o hospital mais próximo.

prox <- nearplace(paciente_C, geo_hospitais)
idx <- which(prox == geo_hospitais)
hospitais[idx]

Usando CEPs

Tomemos um conjunto qualquer de CEPs.

df_ceps <- tibble(
  ceps = c("01215010", "01508010", "01519000", "01526010", "02180080", 
          "02849170", "03347070", "03380150", "03590080", "03737230", 
          "04011060", "04018000", "04050060", "04108001", "04111000",
          "04233140", "04421150", "04433180", "04633030", "04813190",
          "04853185", "05010000", "05409002", "05540020", "05790230",
          "06000150", "07717170", "07858150", "07865115", "08062320", 
          "08140000", "08142710", "08370220", "08421520", "08700000",
          "08770130", "08790000", "08793030", "09911550")
)

Assumamos que representam o endereço de pacientes cujas condições estão apresentadas na tabela abaixo.

set.seed(123)
df_pacientes <- df_ceps %>% 
  mutate(
    id = seq_along(ceps),
    condicao = sample(c(0, 1), length(ceps), replace = TRUE)
  )

df_pacientes

Agora usemos as funções do pacote para complementar nosso bando de dados com:

  1. Georreferenciamento dos pacientes
  2. Identificação do setor censitário em que os pacientes estão localizados
  3. Relacionamento com dados do IPVS do referido setor censitário
  4. Identificação do ponto mais próximo de cada paciente (dado uma lista)
  5. Cálculo da distância entre os pacitentes e o ponto definido em 4)
  6. Criar mapa dos pacientes (leaflet)

1. Georreferenciamento dos pacientes

geo_pacientes <- df_pacientes %>% 
  mutate(endereco = cep(ceps),
         ponto = get_addr(endereco))
geo_pacientes

2. Identificação do setor censitário em que os pacientes estão localizados

setor_paciente <- geo_pacientes %>% 
  mutate(idx = map_int(ponto, geopart, setores),
         setor = setores$code_tract[idx])
setor_paciente

3. Relacionamento com dados do IPVS do referido setor censitário

Ler dados do Índice Paulista de Vulnerabilidade Social (IPVS).

ipvs <- ler_ipvs() %>% 
  select(setor = codigo_do_setor_censitario, 
         idade_media_setor = idade_media_das_pessoas_responsaveis, 
         p_renda_meio_sm_setor =  proporcao_de_domicilios_particulares_com_rendimento_nominal_mensal_de_ate_1_2_s_m,
         p_alfabetizadas_setor = proporcao_de_pessoas_responsaveis_alfabetizadas)

Relacionar com dados dos pacientes

paciente_ipvs <- setor_paciente %>% 
  left_join(ipvs, by = "setor")
glimpse(paciente_ipvs)

4. Identificação do ponto mais próximo de cada paciente (dado uma lista)

Dados dois pontos, identificar aquele mais próximo de cada paciente.

ps <- get_addr(c("04017-030", "Hospital Albert Einstein"))
nomes_ps <- c("Caism Vila Mariana", "Einstein")

paciente_ipvs %>% 
  select(id, condicao, ceps, endereco, ponto) %>% 
  mutate(prox = nearplace(ponto, ps),
         nome_prox = nomes_ps[which_nearplace(ponto, ps)]) %>% 
  glimpse()

5. Cálculo da distância entre os pacitentes e o ponto definido em 4)

paciente_ipvs %>% 
  select(id, condicao, ceps, endereco, ponto) %>% 
  # Em quilometros
  mutate(distancias = distancia(ponto, ps)) %>%  
  glimpse()

6. Criar mapa dos pacientes (leaflet)

library(leaflet)
lat_ps <- unlist(ps[[1]])[2]
lon_ps <- unlist(ps[[1]])[1]

paciente_ipvs %>% 
  mutate(lon = map_dbl(ponto, ~unlist(.x)[1]),
         lat = map_dbl(ponto, ~unlist(.x)[2])) %>% 
  leaflet() %>%
  addTiles() %>%  # Add default OpenStreetMap map tiles
  addCircleMarkers(~lon, ~lat, label = ~p_renda_meio_sm_setor, color = ~ifelse(condicao == 1, "red", "blue")) %>% 
  addMarkers(lon_ps, lat_ps, label = "Caism Vila Mariana") %>% 
  addLegend(colors = c("red", "blue"), labels = c("Com condição", "Sem condição"))



tomasbarcellos/milton documentation built on Nov. 23, 2023, 1:27 a.m.