Análise Espacial com o R: viés nos preços dos imóveis em São Luís
@ Tiago Matos · Sunday, Feb 14, 2021 · 3 minute read · Update at Feb 14, 2021

“Nois vamo a São Paulo
Que a coisa tá feia
Por terras alheias
Nós vamos vagar”

Patativa do Assaré, A Triste Partida (1964).

Este é mais um texto em que eu desenvolvo um código, processos bem simples, fácil de fazer em casa e não custa nada (só algumas requisições em uma API). Pois bem, o objetivo deste post é mostrar como fazer a coleta de informações do site da OLX e usá-las para visualizar o viés preço-local, que é aquele que os anunciantes assumem quando publicam um imóvel. Por exemplo, quanto mais elevado for o preço anunciado naquela região, haverá um viés de comportamento para que novos anunciantes mantenham os preços elevados. O que é mais interessante disso é que as regiões vizinhas, por não serem “hypadas” acabam ficando com preços menores e isso faz com que o custo benefício fique semelhante ao das regiões mais caras (custo de oportunidade).

Primeiramente, você deve carregar os pacotes abaixo e “setar a chave” de API da empresa Here, especialista em serviços de geocodificação.

require(tidyverse)
require(rvest)
require(magrittr)
require(hereR)

set_key("COPIA_NÃO_COMÉDIA")

Em seguida partimos para o processo de webscrapping (raspagem da Web). No site da OLX os anúncios são apresentados em caixas. Poderíamos selecionar (usando a opção do navegador “Inspecionar elemento”) os dados dos imóveis individualmente. Porém, ocorre que algumas caixas não dispõe de todas as informações e isso gera um desequilíbrio no número de linhas do data.frame ideal, impossibilitando sua criação.

Dessa forma, é necessário selecionar todo o conteúdo da caixa e aí então extrair as informações desejadas. Neste tutorial vamos extrair: preços, bairro e proposta de negócio para os imóveis em São Luís.

df <- list()

pb <- txtProgressBar(0, 100, style = 3)

for (i in 1:100) {
  
  olx <- read_html(str_c("https://ma.olx.com.br/regiao-de-sao-luis/imoveis?o=", i))
  
  boxes <- olx %>% html_nodes(".gIEtsI") %>% html_text()
  
  prices <- parse_number(
    str_remove_all(
      str_sub(
        boxes, 
        start = str_locate(boxes, fixed("R$"))[,1]+3, 
        end = str_locate(boxes, fixed("R$"))[,2]+7
      ), "[[:punct:]]+"
    )
  )
  
  address <- str_to_title(
    str_sub(
      boxes, 
      start = str_locate(boxes, fixed("São Luís, "))[,1]+10, 
      end = str_locate(boxes, fixed("Profissional"))[,1]-1
    )
  )
  
  types <- ifelse(
    str_detect(boxes, "Venda|venda") == T, 
    "Venda",
    ifelse(
      str_detect(boxes, "Aluguel|aluguel") == T,
      "Aluguel", 
      "Outro")
    )
    
  df[[i]] <- tibble(address, prices, types)
  
  setTxtProgressBar(pb, i)
  
}

tabela <- data.table::rbindlist(df)

Utilizando o comando for criamos uma estrutura de repetição que ataca as 100 páginas disponibilizadas pela OLX retornando um tbl_df com quase 5 mil imóveis.

Agora vamos tratar essas informações, neste exemplo irei calcular a média do preço dos imóveis voltados para a venda, em cada bairro e em seguida vou fazer a geocodificação do bairro, consumindo algumas requisições da API do HERE.

tabela %<>% 
  filter(types == "Venda", 
         prices > 0, 
         str_length(address) < 30) %>% 
  remove_missing() %>% 
  group_by(address) %>% 
  summarise(builds = n(),
            price = mean(prices, na.rm = T),
            sd_price = sd(prices, na.rm = T))

geoaddress <- geocode(
  address = paste(
    tabela$address, "São Luís", "Maranhão", "Brasil", 
    sep = ", ")
  )

tabela$id <- 1:75

tabela %<>% 
  left_join(geoaddress, by = "id")

tabela$lng <- st_coordinates(tabela$geometry)[,1]
tabela$lat <- st_coordinates(tabela$geometry)[,2]

E por fim, faremos a visualização essas informações usando o pacote Leaflet:

require(sf)
require(leaflet)

leaflet(tabela) %>% 
  addProviderTiles(providers$CartoDB.Positron) %>% 
  addCircleMarkers(
    lng = ~lng,
    lat = ~lat, 
    label = ~paste("R$", format(round(price, 2), 
                                big.mark = ".", 
                                decimal.mark = ","), 
                   "-", address.x),
    popup = ~paste("R$", format(round(sd_price, 2), 
                                big.mark = ".", 
                                decimal.mark = ",")),
    radius = ~sqrt(price/1000)+5, 
    stroke = F, 
    fillOpacity = 1,
    fillColor = ~colorQuantile("YlOrRd", price)(price)
  ) %>% 
  addMeasure(
    position = "bottomleft", 
    primaryLengthUnit = "kilometers", 
    primaryAreaUnit = "hectares", 
    activeColor = "dodgerblue4", 
    completedColor = "dodgerblue"
  )

Nota-se que existem duas regiões principais sendo afetadas pelo viés: São Francisco/Renascença/Ponta D’Areia e Conjuntos/Vinhais. As localidades de tamanhos menores e cores mais claras possuem preços mais baixos e nota-se sua presença nos arredores desses centros. Em outras palavras, Jaracaty e Cohama apresentam, nesta extração, um custo benefício mais interessante para quem visa os maiores polos de negócios e empregos: Renascença e Centro.