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