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)

Bases de datos

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")

Delimitamos San Miguel y sus vecinos

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)

Segunda Barrera: Kmeans por atributos

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')

3° Barerra de selección.

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