Cargando datos

Se importan los datos previamente convertidos al Sistemas de Referencia de Coordenadas (SRC) “EPSG:5347 - POSGAR 2007/ Argentina 5” con QGIS.

casas <- sf::st_read("casas_parana.geojson", quiet = TRUE)
calles_parana <- sf::st_read("calles_parana.geojson", quiet = TRUE)
radios_censales <- sf::st_read("radios_censales_parana.geojson", quiet = TRUE)
parana_area_recortar <- sf::st_read("parana_area_recortar.geojson", quiet = TRUE)
paradas_colectivos_parana <- sf::st_read("paradas_colectivos_parana.geojson", quiet = TRUE)
escuelas_parana <- sf::st_read("escuelas_parana.geojson", quiet = TRUE)

area <- st_intersection(radios_censales, parana_area_recortar) %>% 
  mutate(escuela_privada = as.factor(escuela_privada)) %>% 
  mutate(calle_principal = as.factor(calle_principal))

calles_parana <- calles_parana %>% 
  mutate(esAvenida = as.factor(highway == 'primary' | highway=='secondary'))

Para obtener el dataset completo de paradas de colectivos, se bajaron de internet los recorridos de todas las líneas en formato KML, se unificaron en Google Earth en un único archivo y luego se convirtieron SRC “EPSG:5347 - POSGAR 2007/ Argentina 5” con QGIS. Los otros dataset utilizados son los provistos por la catedra y trabajados en clase.

Seleccionamos las casas dentro del área de estudio y generamos un radio de 300 metros con centro en cada casa.

casas_de_interes <- casas %>%
  filter(st_within(., parana_area_recortar, sparse = F))
# 480 casas en la zona de bùsqueda en Paraná
geom = st_geometry(casas_de_interes)
buf_casas <- st_buffer(geom, dist = 300)
#Armo un geom de 300 metros de radio sobre cada casa
casas_de_interes <- casas_de_interes %>% 
  mutate(buf300m = buf_casas) 
#Agrego la columna buffer

Contabilizamos totales de paradas de colectivo y totales de escuelas en cada radio de 300 metros.

colectivos <- paradas_colectivos_parana %>%
  filter(st_within(., parana_area_recortar, sparse = F))
# 2102 paradas de colectivo en la zona de bùsqueda en Paraná
colectivos_en_radio <- st_contains(casas_de_interes$buf300m, colectivos$geometry, 
                                   sparse = F, prepared = T) 
cantidad_paradas_cole <- colectivos_en_radio %>% rowSums()
casas_de_interes <- casas_de_interes %>% 
  mutate(cantidad_paradas_cole)
#Cuento cantidad de coles en radios
cantidad_escuelas <- st_contains(casas_de_interes$buf300m, escuelas_parana$geometry, 
                                 sparse = F, prepared = T) 
cantidad_escuelas <- cantidad_escuelas %>% rowSums()
casas_de_interes <- casas_de_interes %>% 
  mutate(cantidad_escuelas)
#Cuento cantidad de escuelas en radios

Filtramos las casas segun las características solicitadas.

casas_de_interes <- casas_de_interes %>% 
  filter(bedrooms > 2)  %>% 
  filter(type %in% c('Casa', 'Departamento') )

Seleccionamos las avenidas

calles <- calles_parana %>% 
  filter(st_within(., parana_area_recortar, sparse = F))

Agregamos los siguientes campos al dataset

Con estos nuevos campos se pretende conocer la densidad de población en la zona, se toma como positivo, el nivel de estudio de la zona, este último se toma como indicador de clase media/alta.

casas_de_interes <- casas_de_interes %>% 
  mutate(hab_metro2 = totalpobl/area_m2 ) %>% 
  mutate(univ_hab = (PERSONA.P09.csv_7.Universitario + 
                       PERSONA.P09.csv_8.Post.universitario)/totalpobl )

Normalizamos los datos para poder hacer un análisis con score

normalit<-function(m){
   (m - min(m))/(max(m)-min(m))
}

casas_de_interes <- casas_de_interes %>% 
  mutate(cantidad_paradas_cole = normalit(cantidad_paradas_cole) ) %>% 
  mutate(cantidad_escuelas = normalit(cantidad_escuelas) ) %>% 
  mutate(hab_metro2 = normalit(hab_metro2) ) %>% 
  mutate(univ_hab = normalit(univ_hab) ) %>% 
  distinct(id, type, lon, lat, bedrooms, bathrooms, surface_total, surface_covered, price, 
           currency, title, description, cantidad_paradas_cole, toponimo_i, hab_metro2, univ_hab)
  
avenidas <- calles_parana %>% filter(esAvenida==TRUE)

distiancia_a_avenidas <- st_distance(casas_de_interes, avenidas) %>% as.data.frame() 
distiancia_a_avenidas <- distiancia_a_avenidas %>% 
  mutate(min_distancia = pmap(distiancia_a_avenidas, min)) %>% 
  .$min_distancia
  
casas_de_interes <- casas_de_interes %>% 
  mutate(proximidad_avenidas = 1-normalit(unlist(distiancia_a_avenidas)))

Han quedado 18 casas de interés, podemos ahora ordenarlas y filtrarlas según un score definido por:

Tomamos el score como la suma de todas las variables normalizadas, dando a toda la misma importancia. En el caso de requerirse se puede ponderar de otra forma o filtrar superando un umbral en particular.

casas_de_interes <- casas_de_interes %>% 
  mutate(score = proximidad_avenidas + cantidad_paradas_cole + hab_metro2 +univ_hab)
valoración de las casas según variables consideradas

valoración de las casas según variables consideradas

Se ofrecen las siguientes alternativas

a_ofrecer <- casas_de_interes %>% filter(score>2.7) %>% arrange(desc(score)) %>% as.data.frame()
kable(a_ofrecer %>% distinct(type, bedrooms, surface_total, price, 
           currency, score))
type bedrooms surface_total price currency score
Departamento 3 160 0 NA 3.290209
Departamento 3 160 145000 USD 3.228367
Departamento 4 180 NA NA 3.166627
Departamento 3 90 170000 USD 3.129956
Departamento 3 87 95000 USD 3.117701
Casa 4 113 4650000 ARS 2.801664
Casa 7 130 NA NA 2.794085
Departamento 3 100 160000 USD 2.769696
Departamento 3 90 NA NA 2.750846
Departamento 3 303 NA NA 2.716586

Mapa Interactivo

Conclusión

En el desarrollo del trabajo pudimos aplicar diferentes funciones vistas en clase con el paquete SF que posee herramientas para trabajar con elementos geoespaciales. Se pudo ver el potencial de trabajar con datos geolocalizados y como combinar estos con otros elementos de interés como los datos censales. En el resultado final se obtuvo un listado de posibles viviendas para el cliente y que la posibilidad de cambiar los parámetros utilizados y ejecutar el código de nuevo fácilmente.