library(readxl)
library(tidyverse)
library(lubridate)
library(dplyr)
library(data.table)
library(caTools)
library(tidyr)
library(ggplot2)
library(ggthemes)
library(caret)
library(margins)
library(rpart)
library(rpart.plot)
library(factoextra)
library(dbscan)
library(rgdal)
library(KernSmooth)
library(classInt)
library(jtools)
library(moderndive)
library(knitr)
library(GGally)
library(sf)
library(sp)
library(spdep)
library(rgdal)
library(rgeos)
library(tmap)
library(tmaptools)
library(spgwr)
library(grid)
library(gridExtra)
library(ggpubr)
#france
library(rgdal)
library(spdep)
library(maptools)
Base_Venta_propiedades <- readRDS("C:/Users/ext_frjorque/Desktop/Modelos Iniciales Meli en R/Propiedades_RM (1).rds")
Base_Zonas <- readRDS("C:/Users/ext_frjorque/Desktop/Modelos Iniciales Meli en R/zc_censo2017 (2).rds")
Base_Indice <- read_excel("C:/Users/ext_frjorque/Desktop/Modelos Iniciales Meli en R/api.ibt.uai.asimov.cl.xlsx")
Base_Venta_propiedades <- rename(Base_Venta_propiedades, COMUNA = codigo_comuna)
Base_Venta_propiedades <- (filter(Base_Venta_propiedades,COMUNA == 13130 | COMUNA == 13101 | COMUNA == 13129 | COMUNA == 13121 | COMUNA == 13116 | COMUNA == 13109 | COMUNA == 13131 | COMUNA == 13111 ))
Base_Zonas <- (filter(Base_Zonas,COMUNA == 13130 | COMUNA == 13101 | COMUNA == 13129 | COMUNA == 13121 | COMUNA == 13116 | COMUNA == 13109 | COMUNA == 13131 | COMUNA == 13111 ))
Base_Indice <- (filter(Base_Indice,cod_com == 13130 | cod_com == 13101 | cod_com == 13129 | cod_com == 13121 | cod_com == 13116 | cod_com == 13109 | cod_com == 13131 | cod_com == 13111 ))
#Barrera 1: Cluster Espacial Agrupo por zona censales el Indice de bienestar territorial. El anterior estará optimizado una vez obtenida la data por Manzana. De esta manera, no será necesario generar un promedio por zona, sino que será mucho más específico.
ibt <- Base_Indice %>%
group_by(codigo_Zona) %>%
summarise(
ibt = mean(ibt)
)
Composición del índice
Base_Indice$codigo_Zona <- as.numeric(Base_Indice$codigo_Zona)
ibt$codigo_Zona <- as.numeric(ibt$codigo_Zona )
EECC <- Base_Zonas %>%
dplyr::select(COD_INE_15) %>%
left_join(dplyr::select(ibt,codigo_Zona, ibt), by = c("COD_INE_15"="codigo_Zona"))
EECC <- EECC[!is.na(EECC$ibt),]
Vusta exploratoria
mapa_ibt <- tm_shape(EECC) +
tm_fill("ibt",palette = "Reds", title="", n=5, style = "quantile") + #n=5 es el default
tm_borders() +
tm_layout(legend.position = c("right", "bottom"))+
tm_layout(main.title = "ibt ", title.size = 1.5,main.title.position="left")
#mapa_ibt
Definimos métodos de coorenadas
crs_latlon <- "+proj=longlat +datum=WGS84 +no_defs"
crs_utm <- "+proj=utm +zone=19 +south +datum=WGS84 +units=m +no_defs +ellps=WGS84 +towgs84=0,0,0"
Tranformamos la base del indice a base de datos espacial
crs_utm <- "+proj=utm +zone=19 +south +datum=WGS84 +units=m +no_defs +ellps=WGS84 +towgs84=0,0,0"
#El paquete trabaja con coordenadas UTM, así es que transformaremos el datum
ae_sf <- st_as_sf(EECC, zero.policy = TRUE) %>%
st_transform(crs_utm) %>%
as_Spatial()
#plot(ae_sf,border=gray(0.5))
vars <- c("ibt")
dat <- data.frame(ae_sf@data[,vars])
Estandarizamos
sdat <- scale(dat)
Lista de vecinos
EECC_NB <- poly2nb(ae_sf)
#plot(ae_sf,border=gray(.5))
#plot(EECC_NB,coordinates(ae_sf),col="blue",add=TRUE)
Edge cost
lcosts <- nbcosts(EECC_NB,sdat)
EECC_w <- nb2listw(EECC_NB,lcosts,style="B")
Minimum spanning tree
EECC_mst <- mstree(EECC_w)
#plot(EECC_mst,coordinates(ae_sf),col="blue",
# cex.lab=0.7)
#plot(ae_sf,border=gray(.5),add=TRUE)
K=12
clus4 <- skater(EECC_mst[,1:2],sdat, method = "euclidean",11) # clusterizador
Vemos los clusteres en una tabla
ccs4 <- clus4$groups
matrix <- as.matrix(ccs4)
matrix <- as.data.frame(matrix)
ae_sf_dt <- as.data.frame(ae_sf)
matrix$ID <- seq_along(matrix[,1])
ae_sf_dt$ID <- seq_along(ae_sf_dt[,1])
Extraemos los datos del cluster espacial
i <- cbind.Spatial(ae_sf,matrix)
i <- as.data.frame(i)
X <- merge(i,Base_Zonas, by="COD_INE_15")
X <- st_as_sf(X)
copy_1 = Base_Venta_propiedades
copy_1 <- rename(copy_1, COD_INE_15 = codigo_zona)
copy_1 <- st_as_sf(copy_1, coords = c('longitud','latitud'), crs = 4326, agr = 'identity')
Base_Scrapping_2 <- st_make_valid(copy_1) %>% #corrige vértices duplicados o geometrías "invalidas"
st_join( # cruce de datos por operacion geografica
transmute( # seleccion de variables a asignar
X, # poligonos area de estudio
V1 # seleccionamos codigo de zona
),
join = st_intersects, # asignaremos por interseccion
left = FALSE # filtra valores donde no hubo interseccion
)
X %>%
ggplot() + # inicia grafico
geom_sf(aes(fill = V1), colour = NA) +
geom_sf(data=Base_Scrapping_2, color= 'orange', size = 0.5) +
labs( title= "Distribución viviendas en zonas con sus precios promedios", subtitle = 'Fuente: Censo 2017')
propiedad seleccionada provisoria
selective <- Base_Scrapping_2[6,]
cluster_espacial_propiedad <- selective$V1
Nos quedamos únicamente con las propiedades en el mismo cluster espacial
Base_Scrapping_2 <- filter(Base_Scrapping_2, V1 == cluster_espacial_propiedad)
Enfoque clásico
Elimino todas las variables que contengan información sobre la comuna, dejando solo el área funcional
Base_Venta_propiedades = Base_Scrapping_2
Base_Venta_propiedades$COD_INE_15 <- NULL
Base_Venta_propiedades$codigo_region <- NULL
Base_Venta_propiedades$COMUNA <- NULL
Base_Venta_propiedades$d_proyecto <- NULL
Realizamos el Cluster por atributos en Base a Kmeans
#recupero lalitud y longitud
Base_Venta_propiedades <- Base_Venta_propiedades %>%
st_as_sf() %>%
st_jitter() %>%
dplyr::mutate(x = sf::st_coordinates(.)[,1],
y = sf::st_coordinates(.)[,2]) %>%
sf::st_set_geometry(NULL)
set.seed(1000)
km.res <- kmeans(Base_Venta_propiedades, 12, nstart = 25)
Agregamos el Cluster respectivo a cada observacion de la Base original
Base_con_clusters <- cbind(Base_Venta_propiedades, cluster = km.res$cluster)
Georeferenciamos geometricamente en puntos las cordenadas de latitud y longitud
Base_con_clusters <- rename(Base_con_clusters, longitud = x )
Base_con_clusters <- rename(Base_con_clusters, latitud = y )
Base_geo_clus <- st_as_sf(Base_con_clusters, coords = c('longitud','latitud'), crs = 4326, agr = 'identity')
selective <- Base_geo_clus[6,]
ae <- Base_Zonas %>%
dplyr::filter(AREA == 1)
grafo_base <-
ae %>%
ggplot() +
geom_sf(fill = NA) +
theme_bw()
grafo_base +
geom_sf(data = Base_geo_clus, color = alpha("orange", 0.8) ,size = 0.5) +
geom_sf(data = selective, color = alpha("red", 0.8) ,size = 2) +
ggtitle('Referencias disponibles en area de estudio')
Buscamos las 5 más cercanas mediante una matriz de contiguedad euclidiana
Propiedad seleccionada por el usuario
Propiedad_seleciconada = selective
Selecciona solo las propiedades del mismo cluster
Numero_Cluster = unique(Propiedad_seleciconada$cluster)
Propiedades_del_mismo_cluster <- filter(Base_geo_clus, cluster == Numero_Cluster)
Distancias entre propiedad seleccionada y el resto.
mat1 <- st_distance(Propiedades_del_mismo_cluster, Propiedad_seleciconada)
Asignamos las distancias desde cada propiedad. NOtar que la propiedad seleccionada tiene una distancia de 0.
Propiedades_del_mismo_cluster$dist_propiedad <- apply(mat1, 1, min)
Generamos la lista para el mailing centralizado
data_mod<- Propiedades_del_mismo_cluster %>%
arrange(desc(dist_propiedad)) %>%
group_by(dist_propiedad) %>%
slice(1:3)
Lista_Propiedades_similares <- data_mod[1:10,]
Lista_Propiedades_similares
## Simple feature collection with 10 features and 12 fields
## Geometry type: POINT
## Dimension: XY
## Bounding box: xmin: -70.66585 ymin: -33.52811 xmax: -70.65787 ymax: -33.52262
## Geodetic CRS: WGS 84
## # A tibble: 10 × 13
## # Groups: dist_propiedad [10]
## ID uf m2_const sup_terreno dormito…¹ baños estac…² bodegas d_casa V1
## <int> <dbl> <dbl> <dbl> <int> <int> <int> <int> <int> <dbl>
## 1 730 6457. 111 341 5 1 4 0 1 2
## 2 760 3180 135 150 2 1 0 0 1 2
## 3 748 5600 120 160 4 2 2 0 1 2
## 4 751 5600 110 150 4 2 0 0 1 2
## 5 735 6135. 90 200 4 2 3 0 1 2
## 6 754 5166. 125 196 4 2 2 0 1 2
## 7 782 6000 275 275 4 2 4 1 1 2
## 8 727 6296. 105 338 4 3 3 0 1 2
## 9 867 6135. 197 198 5 2 0 0 1 2
## 10 861 5760 157 210 4 2 2 1 1 2
## # … with 3 more variables: cluster <int>, dist_propiedad <dbl>,
## # geometry <POINT [°]>, and abbreviated variable names ¹dormitorios,
## # ²estacionamientos
## # ℹ Use `colnames()` to see all variable names