Enunciado

Maria comenzó como agente de bienes raíces en Cali hace 10 años. Después de laborar dos años para una empresa nacional, se traslado a Bogotá y trabajó para otra agencia de bienes raíces. Sus amigos y familiares la convencieron de que con su experiencia y conocimientos del negocio debía abrir su propia agencia. Terminó por adquirir la licencia de intermediario y al poco tiempo fundó su propia compañía, C&A (Casas y Apartamentos) en Cali. Santiago y Lina, dos vendedores de la empresa anterior aceptaron trabajar en la nueva compaña. En la actualidad ocho agentes de bienes raíces colaboran con ella en C&A.

Actualmente las ventas de bienes raíces en Cali se han visto disminuidas de manera significativa en lo corrido del año. Durante este periodo muchas instituciones bancarias de ahorro y vivienda están prestando grandes sumas de dinero para la industria y la construcción comercial y residencial. Cuando el efecto producto de las tensiones políticas y sociales disminuya, se espera que la actividad económica de este sector se reactive.

Hace dos días, María recibió una carta solicitando asesoría para la compra de dos viviendas por parte de una compañía internacional que desea ubicar a dos de sus empleados con sus familias en la ciudad. Las solicitudes incluyen las siguientes condiciones:

Ayude a María a responder la solicitud, mediante técnicas modelación que usted conoce. Ella requiere le envíe un informe ejecutivo donde analice los dos casos y sus recomendaciones (Informe). Como soporte del informe debe anexar las estimaciones, validaciones y comparación de modelos requeridos (Anexos) .

0.1 Punto 1

Realice un filtro a la base de datos e incluya solo las ofertas de : base1: casas, de la zona norte de la ciudad. Presente los primeros 3 registros de las bases y algunas tablas que comprueben la consulta. (Adicional un mapa con los puntos de las bases. Discutir si todos los puntos se ubican en la zona correspondiente o se presentan valores en otras zonas, por que?).

0.1.1 Casas Zona Norte

Como primera aproximación ubicaremos sobre el mapa de Santiago de Cali todos los inmuebles que están marcados como “casas” y se ubican en la zona norte de la ciudad.

vivienda_c1 = vivienda[vivienda$tipo == "Casa" & vivienda$zona == "Zona Norte", ]

library(leaflet)

oferta <- data.frame(
  lat = vivienda_c1$latitud,
  long = vivienda_c1$longitud
)

# Crea un mapa
map <- leaflet(oferta) %>%
  addTiles() %>%
  addMarkers(
    lng = ~long,
    lat = ~lat,
    popup = ~as.character(lat) # Puedes personalizar el contenido del popup aquí
  )

map # Muestra el mapa

Se observa que las casas de la zona norte de la ciduad se encuentran dispersas por lo largo y ancho de la ciduad y no en una ubicación especifica. Al hacer zoom sobre el mapa esto se observa con mayor detalle.

0.1.2 Viviendas que cumplen con los requisitos de la oferta 1.

Se genera una sub-base con los requisitos que se solicitan para la vivienda 1. Cada una de las caracterísitcas se incluyó con la lógica de mínimo lo que están pidiendo. Así, los resultados también se graficaron sobre el mapa.

#Incluimos los condicionales

vivienda2 = vivienda[vivienda$tipo == "Casa" & vivienda$areaconst >= 200 & vivienda$parqueaderos >= 1 & vivienda$banios >= 2 & vivienda$habitaciones >= 4 & (vivienda$estrato == 4 | vivienda$estrato == 5) & vivienda$zona == "Zona Norte" & vivienda$preciom <= 350, ]

vivienda <- vivienda2[complete.cases(vivienda2[,1]),]
head(vivienda,n=3)
## # A tibble: 3 × 13
##      id zona    piso  estrato preciom areaconst parqueaderos banios habitaciones
##   <dbl> <chr>   <chr>   <dbl>   <dbl>     <dbl>        <dbl>  <dbl>        <dbl>
## 1  4210 Zona N… 01          5     350       200            3      3            4
## 2  4267 Zona N… 01          5     335       202            1      4            5
## 3  4800 Zona N… 01          5     340       250            2      4            4
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
library(leaflet)

oferta <- data.frame(
  lat = vivienda$latitud,
  long = vivienda$longitud
)

# Crea un mapa
map <- leaflet(oferta) %>%
  addTiles() %>%
  addMarkers(
    lng = ~long,
    lat = ~lat,
    popup = ~as.character(lat) # Puedes personalizar el contenido del popup aquí
  )

map # Muestra el mapa

Como resultado se obtuvieron 34 casas que cumplen con los requisitos solicitados a la empresa. Sin embargo, al ubicar espacialmente los inmuebles se observa que algunos de ellos están en la zona centro y sur de la ciudad. Esto se puede asociar a una mala marcación de los inmuebles en la base de datos y que no se ha validado la información de longitud y latitud de cada inmueble.

0.2 Punto 2

Realice un análisis exploratorio de datos enfocado en la correlación entre la variable respuesta (precio de la casa) en función del área construida, estrato, numero de baños, numero de habitaciones y zona donde se ubica la vivienda. Use gráficos interactivos con el paquete plotly e interprete los resultados.

0.2.1 Correlación entre variables de interés tipo: casa

#Gráfico de correlaciones para casas

library(paqueteMODELOS)
library(ggcorrplot)
library(plotly)
data("vivienda")

dfn<-select(vivienda, preciom, areaconst, estrato, banios, habitaciones, parqueaderos, zona, tipo)
dfn<-dfn[dfn$tipo == "Casa",]

summary(dfn)
##     preciom       areaconst         estrato          banios      
##  Min.   :  77   Min.   :  30.0   Min.   :3.000   Min.   : 0.000  
##  1st Qu.: 300   1st Qu.: 154.0   1st Qu.:3.000   1st Qu.: 3.000  
##  Median : 430   Median : 240.0   Median :5.000   Median : 4.000  
##  Mean   : 540   Mean   : 273.4   Mean   :4.485   Mean   : 3.894  
##  3rd Qu.: 670   3rd Qu.: 350.0   3rd Qu.:5.000   3rd Qu.: 5.000  
##  Max.   :1999   Max.   :1745.0   Max.   :6.000   Max.   :10.000  
##  NA's   :3      NA's   :3        NA's   :3       NA's   :3       
##   habitaciones    parqueaderos       zona               tipo          
##  Min.   : 0.00   Min.   : 1.00   Length:3222        Length:3222       
##  1st Qu.: 3.00   1st Qu.: 1.00   Class :character   Class :character  
##  Median : 4.00   Median : 2.00   Mode  :character   Mode  :character  
##  Mean   : 4.61   Mean   : 2.29                                        
##  3rd Qu.: 5.00   3rd Qu.: 3.00                                        
##  Max.   :10.00   Max.   :10.00                                        
##  NA's   :3       NA's   :736
dfn<-data.frame(dfn)
sum(is.na(dfn))
## [1] 757
delete.na <- function(df, n=0) {
  df[rowSums(is.na(df)) <= n,]
}
dfn <- delete.na(dfn)

r<-cor(dfn[1:6])

p<-ggcorrplot(r,type="lower",
              title="Correlaciones casas",
              colors=c("red","yellow","blue"),
              outline.color="black", ggtheme = theme_test() + theme(text = element_text(size = 7)))

plotly::ggplotly(p)

0.2.2 Correlación entre variables de interés tipo: casa por zona

#Gráfico por zonas

#Zona Norte

dfn_zn<-dfn[dfn$zona == "Zona Norte",]

r<-cor(dfn_zn[1:6])

p<-ggcorrplot(r,type="lower",
              title="Correlaciones casas - zona norte",
              colors=c("red","yellow","blue"),
              outline.color="black", ggtheme = theme_test() + theme(text = element_text(size = 7)))

plotly::ggplotly(p)
#Zona Sur
dfn_zs<-dfn[dfn$zona == "Zona Sur",]

r<-cor(dfn_zs[1:6])

p<-ggcorrplot(r,type="lower",
              title="Correlaciones casas - zona sur",
              colors=c("red","yellow","blue"),
              outline.color="black", ggtheme = theme_test() + theme(text = element_text(size = 7)))

plotly::ggplotly(p)
#Zona Oriente
dfn_zor<-dfn[dfn$zona == "Zona Oriente",]

r<-cor(dfn_zor[1:6])

p<-ggcorrplot(r,type="lower",
              title="Correlaciones casas - zona oriente",
              colors=c("red","yellow","blue"),
              outline.color="black", ggtheme = theme_test() + theme(text = element_text(size = 7)))

plotly::ggplotly(p)
#Zona Oeste
dfn_zoe<-dfn[dfn$zona == "Zona Oeste",]

r<-cor(dfn_zoe[1:6])

p<-ggcorrplot(r,type="lower",
              title="Correlaciones casas - zona oeste",
              colors=c("red","yellow","blue"),
              outline.color="black", ggtheme = theme_test() + theme(text = element_text(size = 7)))

plotly::ggplotly(p)
#Zona Centro
dfn_zc<-dfn[dfn$zona == "Zona Centro",]

r<-cor(dfn_zc[1:6])

p<-ggcorrplot(r,type="lower",
              title="Correlaciones casas - zona centro",
              colors=c("red","yellow","blue"),
              outline.color="black", ggtheme = theme_test() + theme(text = element_text(size = 7)))

plotly::ggplotly(p)

Resultados:

Casas: al tomar todos los inmuebles marcados como casas de la base de datos y analizar sus correlaciones, se encuentra qué, la mayor correlación (0.64) se encuentra entre las variables de preciom (precio metro cuadrado) y las variables área construida, estrato y parqueaderos por igual. Por el contrario, la correlación más baja y en este caso negativa (-0.15), se da entre las variables de habitaciones y estrato.

Casas zona norte: al tomar todos los inmuebles marcados como casas y ubicados en la zona norte de la ciudad, se analizó sus correlaciones y se encontró qué, la mayor correlación (0.69) se encuentra entre las variables de preciom (precio metro cuadrado) y areaconst (área construida) de la propiedad. Por el contrario, la correlación más baja (0.06), se da entre las variables de habitaciones y estrato.

Casas zona sur: al tomar todos los inmuebles marcados como casas y ubicados en la zona sur de la ciudad, se analizó sus correlaciones y se encontró qué, la mayor correlación (0.68) se encuentra entre las variables de preciom (precio metro cuadrado) y areaconst (área construida) y parqueaderos de la propiedad por igual. Por el contrario, la correlación más baja y en este caso negativa (-0.10), se da entre las variables de habitaciones y estrato.

Casas zona oriente: al tomar todos los inmuebles marcados como casas y ubicados en la zona oriente de la ciudad, se analizó sus correlaciones y se encontró qué, la mayor correlación (0.65) se encuentra entre las variables de habitaciones y banios (número de baños) de la propiedad. Por el contrario, la correlación más baja y en este caso negativa (-0.06), se da entre las variables de habitaciones y estrato. Adicionalmente, la correlación entre las variables preciom (precio metro cuadrado) y el estrato en esta zona de la ciudad es cercana a cero (-0.01).

Casas zona oeste: al tomar todos los inmuebles marcados como casas y ubicados en la zona oeste de la ciudad, se analizó sus correlaciones y se encontró qué, la mayor correlación (0.65) se encuentra entre las variables de preciom (precio metro cuadrado) y parqueaderos de la propiedad. Por el contrario, la correlación más baja y en este caso negativa (-0.28), se da entre las variables de habitaciones y estrato.

Casas zona centro: al tomar todos los inmuebles marcados como casas y ubicados en la zona centro de la ciudad, se analizó sus correlaciones y se encontró qué, la mayor correlación (0.52) se encuentra entre las variables de habitaciones y banios (número de baños) de la propiedad. Por el contrario, la correlación más baja (-0.13), se da entre las variables de habitaciones y estrato.

0.2.3 Otras opciones de visualización de relación entre variables:

library(paqueteMODELOS)
library(ggcorrplot)
library(plotly)
data("vivienda")

delete.na <- function(df, n=0) {
  df[rowSums(is.na(df)) <= n,]
}
vivienda <- delete.na(vivienda)
vivienda<-vivienda[vivienda$tipo == "Casa",]


vivienda %>% 
  plot_ly(x = ~preciom, y = ~areaconst, color = ~zona) %>%
  add_markers(marker = list(size = 4, symbol = "diamond")) %>%
  layout(title = "Precio vs área construida")
vivienda %>% 
  plot_ly(x = ~preciom, y = ~estrato, color = ~zona) %>%
  add_markers(marker = list(size = 4, symbol = "diamond")) %>%
  layout(title = "Precio vs estrato")
vivienda %>% 
  plot_ly(x = ~preciom, y = ~banios, color = ~zona) %>%
  add_markers(marker = list(size = 4, symbol = "diamond")) %>%
  layout(title = "Precio vs número de baños")
vivienda %>% 
  plot_ly(x = ~preciom, y = ~habitaciones, color = ~zona) %>%
  add_markers(marker = list(size = 4, symbol = "diamond")) %>%
  layout(title = "Precio vs número de habitaciones")
vivienda %>% 
  plot_ly(x = ~preciom, y = ~parqueaderos, color = ~zona) %>%
  add_markers(marker = list(size = 4, symbol = "diamond")) %>%
  layout(title = "Precio vs número de parqueaderos")

0.3 Punto 3

Estime un modelo de regresión lineal múltiple con las variables del punto anterior (precio = f(área construida, estrato, número de cuartos, número de parqueaderos, número de baños)) e interprete los coeficientes si son estadísticamente significativos. Las interpretaciones deben están contextualizadas y discutir si los resultados son lógicos. Adicionalmente interprete el coeficiente R2 y discuta el ajuste del modelo e implicaciones (que podrían hacer para mejorarlo).

library(paqueteMODELOS)
library(ggcorrplot)
library(plotly)
data("vivienda")

delete.na <- function(df, n=0) {
  df[rowSums(is.na(df)) <= n,]
}
vivienda <- delete.na(vivienda)
vivienda<-vivienda[vivienda$tipo == "Casa" & vivienda$zona == "Zona Norte",]

modelo1 <- lm(preciom ~ areaconst + estrato + habitaciones + parqueaderos + banios, data = vivienda)

summary(modelo1)
## 
## Call:
## lm(formula = preciom ~ areaconst + estrato + habitaciones + parqueaderos + 
##     banios, data = vivienda)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -761.11  -84.10  -16.36   52.22  925.67 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -245.62878   60.86958  -4.035 7.27e-05 ***
## areaconst       0.66444    0.06703   9.913  < 2e-16 ***
## estrato        85.58184   13.17690   6.495 4.51e-10 ***
## habitaciones    8.91428    7.14129   1.248    0.213    
## parqueaderos   28.05949    6.77575   4.141 4.74e-05 ***
## banios         11.49860    9.51130   1.209    0.228    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 152.8 on 248 degrees of freedom
## Multiple R-squared:  0.5952, Adjusted R-squared:  0.587 
## F-statistic: 72.92 on 5 and 248 DF,  p-value: < 2.2e-16

Resultados:

De acuerdo con el modelo que se construyó para el total de casas ubicadas en la zona norte de la ciudad, se observa que:

  1. Las variables de área construida, estrato y parqueaderos son estadísticamente significativas.

  2. Las variables relacionadas con el número de habitaciones y baños de la vivienda no fueron significativas en el modelo.

  3. De acuerdo con el modelo a mayor área construida del inmueble, en promedio el precio del metro cuadrado aumenta. Aunque el valor estimado del parámetro es bajo (0.66444), si se estudia a fondo la relación entre estas variables, debe existir un punto “óptimo” de precio y área construida, y después de este el precio del metro cuadrado no varía sin importar que se agregen más metros de área construdia.

  4. De acuerdo con el modelo a mayor estrato en que está ubicado el inmueble, en promedio el precio del metro cuadrado aumenta. Esta relación guarda lógica con los resultados que se esperan obtener previamente.

  5. De acuerdo con el modelo a mayor número de parqueaderos del inmueble, en promedio el precio del metro cuadrado aumenta. Esta relación guarda lógica con las demandas de las personas que cuentan con varios vehículos y que estarían dispuestos a pagar demás para conseguir más espacio de parqueo.

  6. En relación con la no significancia de las variables de número de habitaciones y baños, este resultado parece algo contra intuitivo, dado que a mayor área construida el precio aumenta, esta construcción no estaría relacionada con habitaciones o baños. Desde otra perspectiva, esta no significancia puede responder a los nuevos tamaños de los hogares en las ciudades capitales, que para el caso de hogares unipersonales va en aumento.

  7. Una definición sencilla del \(R^{2}\) es: el porcentaje de la variación en la variable de respuesta que es explicado por un modelo. Así las cosas, el actual modelo explica en un 59,52\(\%\) (en caso de tomar el \(R^{2}\) ajustado este valor sería de 58,7\(\%\)) la variación en el precio del metro cuadrado en casas de la zona norte de Cali.

  8. El valor del \(R^{2}\) indica que con el actual modelo existe cerca de un 40\(\%\) de la variación del precio del metro cuadrado en casas de la zona norte de Cali que no se está explicando. Esto podría llevar a pensar en modificación o combinación de variables o de la especificación del mismo modelo.

  9. p-value del modelo es significativo (2.2e-16) por lo que se puede aceptar que el modelo no es por azar, al menos uno de los coeficientes parciales de regresión es distinto de 0.

0.4 Punto 4

Realice la validación de supuestos del modelo e interprete los resultados (no es necesario corregir en caso de presentar problemas, solo realizar sugerencias de que se podría hacer).

library(paqueteMODELOS)
library(ggcorrplot)
library(plotly)
library(car)
data("vivienda")

delete.na <- function(df, n=0) {
  df[rowSums(is.na(df)) <= n,]
}
vivienda <- delete.na(vivienda)
vivienda<-vivienda[vivienda$tipo == "Casa" & vivienda$zona == "Zona Norte",]

modelo1 <- lm(preciom ~ areaconst + estrato + habitaciones + parqueaderos + banios, data = vivienda)


#Distribución normal de los residuos:

qqPlot(modelo1$residuals, 
       distribution = "norm",
       main = "Q-Q PLOT de residuos del modelo 1",
       xlab = "cuantiles teóricos",
       ylab = "cuantiles de la muestra",
       id = FALSE, grid = TRUE,
       envelope = 0.95, col = carPalette()[1], col.lines = carPalette()[3],
       pch = 20,
       cex = 1,
       lwd = 2)
qqline(modelo1$residuals,
       col = "blue",
       lty = 1,
       lwd = 2)   

shapiro.test(modelo1$residuals)
## 
##  Shapiro-Wilk normality test
## 
## data:  modelo1$residuals
## W = 0.87822, p-value = 2.263e-13
#Homocedasticidad

ggplot(data = vivienda, aes(modelo1$fitted.values, modelo1$residuals)) +
  geom_point() +
  geom_smooth(color = "firebrick", se = FALSE) +
  geom_hline(yintercept = 0) +
  theme_bw()

library(lmtest)
bptest(modelo1)
## 
##  studentized Breusch-Pagan test
## 
## data:  modelo1
## BP = 51.686, df = 5, p-value = 6.257e-10
#Multicolinealidad

library(corrplot)
corrplot(cor(dplyr::select(vivienda, areaconst, estrato, habitaciones, parqueaderos, banios)),
         method = "number", tl.col = "black")

#Análisis de inflación de varianza

library(car)
vif(modelo1)
##    areaconst      estrato habitaciones parqueaderos       banios 
##     1.415331     1.214737     1.818227     1.215609     1.961650
#Autocorrelación

library(car)
dwt(modelo1, alternative = "two.sided")
##  lag Autocorrelation D-W Statistic p-value
##    1      0.03325503      1.930942   0.494
##  Alternative hypothesis: rho != 0
library(lmtest)
dwtest(modelo1, alternative="two.sided",iterations=1000)
## 
##  Durbin-Watson test
## 
## data:  modelo1
## DW = 1.9309, p-value = 0.536
## alternative hypothesis: true autocorrelation is not 0

Resultados:

  1. Los residuales se salen de las bandas que se contruyeron en la gráfica de Q Q Plot para ellos, esto puede indicar de manera visual que estos no son normales.
  2. De acuerdo con los resultados de la prueba Shapiro-Wilk test, el p-valor de la prueba es menor a un alfa de 0.05 (5\(\%\)), lo cual indica que se rechaza la hipótesis nula y por tanto los residuales no tienen un comportamiento normal.
  3. Se observa que el valor-P es menor que el nivel de significancia usual de 0.05 (5\(\%\)), por lo tanto, hay evidencia para decir que no existe homosedasticidad en los residuales del modelo.
  4. Con base en la gráfica de las correlaciones no se observa de manera visual indicios de multicolinealidad en el modelo.
  5. En relación con el punto anterior, el Análisis de inflación de varianza arrojó resultados bajos para todas las variables del modelo, lo cual podría indicar que no hay problemas de colinealidad entre las variables.
  6. Por último, en términos de autocorrelación y dado que el valor-P en ambas pruebas fue mayor a 0.05 (5\(\%\)), se puede rechazar la presencia de autocorrelacion. Es decir, no se rechaza la hipotesis Ho.

0.5 Punto 5

Con el modelo identificado debe predecir el precio de la vivienda con las características de la primera solicitud.

De acuerdo con el modelo obtenido en el punto 3, tenemos que:

preciom = \(\beta_0\) + areaconst + estrato + habitaciones + parqueaderos + banios + \(\varepsilon_i\)

Ahora reemplazamos los valores obtenidos, tenemos:

preciom = -245.62878 + 0.6644 + 85.58184 + 8.91428 + 28.05949 + 11.4986

Al incluir las características de la vivienda, tenemos:

preciom = -245.62878 + 0.6644(200) + 85.58184(4) + 8.91428(4) + 28.05949(1) + 11.4986(2)

Preciom = 316.29 millones (este precio aplica para una vivienda estrato 4)

Preciom = 401.87 millones (este precio aplica para una vivienda estrato 5)

0.6 Punto 6

Con las predicciones del modelo sugiera potenciales ofertas que responda a la solicitud de la vivienda 1. Tenga encuentra que la empresa tiene crédito pre-aprobado de máximo 350 millones de pesos. Realice un análisis y presente en un mapa al menos 5 ofertas potenciales que debe discutir.

De acuerdo con el mapa del punto 1, existen varias viviendas que cumplen con la solicitud hecha a la empresa. Por tanto, se debe tomar una decisión de cuales son las viviendas que mejor se ajustan a los requerimientos. Para esto, se propone utilizar la metodología de cluster con el objetivo de tomar por medio de la longuitud y latitud puntos ubicados en el norte la ciudad y quitar las demás viviendas que aún estando marcadas como “zona norte” se encuentran lejos de esta.

library(ggplot2)
library(car)
library(dplyr)
library(factoextra)
library(cluster)
library(simstudy)
library(data.table)
library(tidyverse)
library(PerformanceAnalytics)
library(corrr)
library(paqueteMODELOS)
library(ggcorrplot)
library(plotly)
data("vivienda")

delete.na <- function(df, n=0) {
  df[rowSums(is.na(df)) <= n,]
}
vivienda <- delete.na(vivienda)

vivienda2 = vivienda[vivienda$tipo == "Casa" & vivienda$areaconst >= 200 & vivienda$parqueaderos >= 1 & vivienda$banios >= 2 & vivienda$habitaciones >= 4 & (vivienda$estrato == 4 | vivienda$estrato == 5) & vivienda$zona == "Zona Norte" & vivienda$preciom <= 350 & vivienda$preciom >= 316.30, ]

d2 <- scale(vivienda2[,12:13])
rownames(d2) <- vivienda2$id
fviz_nbclust(x = d2, FUNcluster = kmeans, method = "wss", k.max = 15, 
             diss = get_dist(d2, method = "euclidean"), nstart = 50)

d2f=data.frame(d2)
km_clusters <- kmeans(x = d2f, centers = 3, nstart = 50)

# Las funciones del paquete factoextra emplean el nombre de las filas del
# dataframe que contiene los datos como identificador de las observaciones.
# Esto permite añadir labels a los gráficos.
fviz_cluster(object = km_clusters, data = d2f, show.clust.cent = TRUE,
             ellipse.type = "euclid", star.plot = TRUE, repel = TRUE,
             pointsize=0.5,outlier.color="darkred") +
  labs(title = "Resultados clustering K-means") +
  theme_bw() +  theme(legend.position = "none")

require(cluster)
pam.res <- pam(d2f, 3)
# Visualización
fviz_cluster(pam.res, geom = "point", ellipse.type = "norm",
             show.clust.cent = TRUE,star.plot = TRUE)+
  labs(title = "Resultados clustering K-means")+ theme_bw()

indi = km_clusters$cluster

base = data.frame(vivienda2, indi)
base2 = base[base$indi == 2, ]

base2
##        id       zona piso estrato preciom areaconst parqueaderos banios
## 819   819 Zona Norte   02       5     350       264            2      3
## 1343 1343 Zona Norte   02       5     320       200            2      4
## 937   937 Zona Norte   02       4     350       280            2      3
## 952   952 Zona Norte   02       4     330       275            2      3
## 1108 1108 Zona Norte   02       4     330       260            1      3
## 1887 1887 Zona Norte   01       5     340       203            2      3
## 1842 1842 Zona Norte   02       5     350       240            2      3
##      habitaciones tipo    barrio  longitud latitud indi
## 819             4 Casa  la flora -76.50330 3.46412    2
## 1343            4 Casa  la flora -76.51524 3.48893    2
## 937             4 Casa la merced -76.50603 3.46643    2
## 952             5 Casa la merced -76.50647 3.47516    2
## 1108            4 Casa la merced -76.51060 3.48108    2
## 1887            4 Casa    vipasa -76.51803 3.48257    2
## 1842            4 Casa    vipasa -76.51800 3.48100    2
library(leaflet)

oferta <- data.frame(
  lat = base2$latitud,
  long = base2$longitud
)

# Crea un mapa
map <- leaflet(oferta) %>%
  addTiles() %>%
  addMarkers(
    lng = ~long,
    lat = ~lat,
    popup = ~as.character(lat) # Puedes personalizar el contenido del popup aquí
  )

map # Muestra el mapa

Resultados:

  1. Se contruyeron 3 clusters para poder definir que viviendas estaban ubicadas en el norte de la ciudad y no era un error de marcación en la base de datos.

  2. Con base en los resultados, se dejaron por fuera del análisis los clusters 1 y 3. El primero de estos estaba compuestos por viviendas que estaban cercanas al norte de la ciudad pero no específicamente allí, y el otro cluster estaba compuesto por una única vivienda en la zona sur de la ciudad.

  3. Se tomaron las viviendas que cumplian con las características exigidas pero que espacialmente se cuentran ubicadas más al norte de la ciudad. De estas viviendas se puede observar que:

3.1. Seis de las siete viviendas tienen dos pisos.

3.2. Cuatro de siete pertenecen al estrato 5.

3.3. Todas cumplen con el condicional de la restricción presupuestal y una de ella se aproxima al valor de 316 millones de arrojó el modelo (id: 1343).

3.4. Las demás características se cumplen de acuerdo a la solicitud. Asimismo, se resalta que seis de las siete viviendas superan los 200 metros de área construida que fue solicitada.

0.7 Punto 7

Realice los pasos del 1 al 6. Para la segunda solicitud que tiene un crédito pre-aprobado por valor de $850 millones.

0.7.1 Punto 7.1

Realice un filtro a la base de datos e incluya solo las ofertas de : base2: apartamentos, de la zona sur de la ciudad. Presente los primeros 3 registros de las bases y algunas tablas que comprueben la consulta. (Adicional un mapa con los puntos de las bases. Discutir si todos los puntos se ubican en la zona correspondiente o se presentan valores en otras zonas, por que?).

0.7.2 Apartamentos Zona Sur

Como primera aproximación ubicaremos sobre el mapa de Santiago de Cali todos los inmuebles que están marcados como “apartamentos” y se ubican en la zona sur de la ciudad.

vivienda_c1 = vivienda[vivienda$tipo == "Apartamento" & vivienda$zona == "Zona Sur", ]

library(leaflet)

oferta <- data.frame(
  lat = vivienda_c1$latitud,
  long = vivienda_c1$longitud
)

# Crea un mapa
map <- leaflet(oferta) %>%
  addTiles() %>%
  addMarkers(
    lng = ~long,
    lat = ~lat,
    popup = ~as.character(lat) # Puedes personalizar el contenido del popup aquí
  )

map # Muestra el mapa

Se observa que los apartamentos de la zona sur de la ciduad se encuentran dispersas por lo largo y ancho de la ciduad y no en una ubicación especifica. Al hacer zoom sobre el mapa esto se observa con mayor detalle.

0.7.3 Viviendas que cumplen con los requisitos de la oferta 2.

Se genera una sub-base con los requisitos que se solicitan para la vivienda 2. Cada una de las caracterísitcas se incluyó con la lógica de mínimo lo que están pidiendo. Así, los resultados también se graficaron sobre el mapa.

#Incluimos los condicionales

vivienda2 = vivienda[vivienda$tipo == "Apartamento" & vivienda$areaconst >= 300 & vivienda$parqueaderos >= 3 & vivienda$banios >= 3 & vivienda$habitaciones >= 5 & (vivienda$estrato == 5 | vivienda$estrato == 6) & vivienda$zona == "Zona Sur" & vivienda$preciom <= 850, ]

vivienda <- vivienda2[complete.cases(vivienda2[,1]),]
head(vivienda,n=3)
## # A tibble: 0 × 13
## # ℹ 13 variables: id <dbl>, zona <chr>, piso <chr>, estrato <dbl>,
## #   preciom <dbl>, areaconst <dbl>, parqueaderos <dbl>, banios <dbl>,
## #   habitaciones <dbl>, tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
library(leaflet)

oferta <- data.frame(
  lat = vivienda$latitud,
  long = vivienda$longitud
)

# Crea un mapa
map <- leaflet(oferta) %>%
  addTiles() %>%
  addMarkers(
    lng = ~long,
    lat = ~lat,
    popup = ~as.character(lat) # Puedes personalizar el contenido del popup aquí
  )

map # Muestra el mapa

Como resultado se obtuvo que ningún apartamentos de la base de datos cumplen con los requisitos solicitados a la empresa.

0.7.4 Punto 7.2

Realice un análisis exploratorio de datos enfocado en la correlación entre la variable respuesta (precio del apartamento) en función del área construida, estrato, numero de baños, numero de habitaciones y zona donde se ubica la vivienda. Use gráficos interactivos con el paquete plotly e interprete los resultados.

0.7.5 Correlación entre variables de interés tipo: apartamento

#Gráfico de correlaciones para apartamentos

library(paqueteMODELOS)
library(ggcorrplot)
library(plotly)
data("vivienda")

dfn<-select(vivienda, preciom, areaconst, estrato, banios, habitaciones, parqueaderos, zona, tipo)
dfn<-dfn[dfn$tipo == "Apartamento",]

summary(dfn)
##     preciom         areaconst        estrato          banios     
##  Min.   :  58.0   Min.   : 35.0   Min.   :3.000   Min.   :0.000  
##  1st Qu.: 175.0   1st Qu.: 68.0   1st Qu.:4.000   1st Qu.:2.000  
##  Median : 279.0   Median : 90.0   Median :5.000   Median :2.000  
##  Mean   : 366.9   Mean   :112.8   Mean   :4.727   Mean   :2.617  
##  3rd Qu.: 430.0   3rd Qu.:130.0   3rd Qu.:6.000   3rd Qu.:3.000  
##  Max.   :1950.0   Max.   :932.0   Max.   :6.000   Max.   :8.000  
##  NA's   :3        NA's   :3       NA's   :3       NA's   :3      
##   habitaciones    parqueaderos        zona               tipo          
##  Min.   :0.000   Min.   : 1.000   Length:5103        Length:5103       
##  1st Qu.:3.000   1st Qu.: 1.000   Class :character   Class :character  
##  Median :3.000   Median : 1.000   Mode  :character   Mode  :character  
##  Mean   :2.971   Mean   : 1.568                                        
##  3rd Qu.:3.000   3rd Qu.: 2.000                                        
##  Max.   :9.000   Max.   :10.000                                        
##  NA's   :3       NA's   :872
dfn<-data.frame(dfn)
sum(is.na(dfn))
## [1] 893
delete.na <- function(df, n=0) {
  df[rowSums(is.na(df)) <= n,]
}
dfn <- delete.na(dfn)

r<-cor(dfn[1:6])

p<-ggcorrplot(r,type="lower",
              title="Correlaciones apartamentos",
              colors=c("red","yellow","blue"),
              outline.color="black", ggtheme = theme_test() + theme(text = element_text(size = 7)))

plotly::ggplotly(p)

0.7.6 Correlación entre variables de interés tipo: apartamentos por zona

#Gráfico por zonas

#Zona Norte

dfn_zn<-dfn[dfn$zona == "Zona Norte",]

r<-cor(dfn_zn[1:6])

p<-ggcorrplot(r,type="lower",
              title="Correlaciones apartamentos - zona norte",
              colors=c("red","yellow","blue"),
              outline.color="black", ggtheme = theme_test() + theme(text = element_text(size = 7)))

plotly::ggplotly(p)
#Zona Sur
dfn_zs<-dfn[dfn$zona == "Zona Sur",]

r<-cor(dfn_zs[1:6])

p<-ggcorrplot(r,type="lower",
              title="Correlaciones apartamentos - zona sur",
              colors=c("red","yellow","blue"),
              outline.color="black", ggtheme = theme_test() + theme(text = element_text(size = 7)))

plotly::ggplotly(p)
#Zona Oriente
dfn_zor<-dfn[dfn$zona == "Zona Oriente",]

r<-cor(dfn_zor[1:6])

p<-ggcorrplot(r,type="lower",
              title="Correlaciones apartamentos - zona oriente",
              colors=c("red","yellow","blue"),
              outline.color="black", ggtheme = theme_test() + theme(text = element_text(size = 7)))

plotly::ggplotly(p)
#Zona Oeste
dfn_zoe<-dfn[dfn$zona == "Zona Oeste",]

r<-cor(dfn_zoe[1:6])

p<-ggcorrplot(r,type="lower",
              title="Correlaciones apartamentos - zona oeste",
              colors=c("red","yellow","blue"),
              outline.color="black", ggtheme = theme_test() + theme(text = element_text(size = 7)))

plotly::ggplotly(p)
#Zona Centro
dfn_zc<-dfn[dfn$zona == "Zona Centro",]

r<-cor(dfn_zc[1:6])

p<-ggcorrplot(r,type="lower",
              title="Correlaciones apartamentos - zona centro",
              colors=c("red","yellow","blue"),
              outline.color="black", ggtheme = theme_test() + theme(text = element_text(size = 7)))

plotly::ggplotly(p)

Resultados:

Apartamentos: al tomar todos los inmuebles marcados como apartamentos de la base de datos y analizar sus correlaciones, se encuentra qué, la mayor correlación (0.82) se encuentra entre las variables de preciom (precio metro cuadrado) y las variables área construida. Por el contrario, la correlación más baja y en este caso negativa (0.16), se da entre las variables de habitaciones y estrato.

Apartamentos zona norte: al tomar todos los inmuebles marcados como apartamentos y ubicados en la zona norte de la ciudad, se analizó sus correlaciones y se encontró qué, la mayor correlación (0.79) se encuentra entre las variables de preciom (precio metro cuadrado) y areaconst (área construida) de la propiedad. Por el contrario, la correlación más baja (0.07), se da entre las variables de habitaciones y estrato.

Apartamentos zona sur: al tomar todos los inmuebles marcados como apartamentos y ubicados en la zona sur de la ciudad, se analizó sus correlaciones y se encontró qué, la mayor correlación (0.74) se encuentra entre las variables de preciom (precio metro cuadrado) y areaconst (área construida). Por el contrario, la correlación más baja y en este caso negativa (0.18), se da entre las variables de habitaciones y estrato.

Apartamentos zona oriente: al tomar todos los inmuebles marcados como apartamentos y ubicados en la zona oriente de la ciudad, se analizó sus correlaciones y se encontró qué, la mayor correlación (0.80) se encuentra entre las variables de área construída y parqueaderos de la propiedad. Por el contrario, la correlación más baja y en este caso negativa (-0.1), se da entre las variables de habitaciones y estrato.

Apartamentos zona oeste: al tomar todos los inmuebles marcados como apartamentos y ubicados en la zona oeste de la ciudad, se analizó sus correlaciones y se encontró qué, la mayor correlación (0.81) se encuentra entre las variables de preciom (precio metro cuadrado) y área construída de la propiedad. Por el contrario, la correlación más baja y en este caso negativa (0.18), se da entre las variables de habitaciones y estrato.

Apartamentos zona centro: al tomar todos los inmuebles marcados como apartamentos y ubicados en la zona centro de la ciudad, se analizó sus correlaciones y se encontró qué, la mayor correlación (0.84) se encuentra entre las variables de preciom (precio metro cuadrado) y área construída de la propiedad. Por el contrario, la correlación más baja (0.00), se da entre las variables de habitaciones y estrato.

0.7.7 Otras opciones de visualización de relación entre variables:

library(paqueteMODELOS)
library(ggcorrplot)
library(plotly)
data("vivienda")

delete.na <- function(df, n=0) {
  df[rowSums(is.na(df)) <= n,]
}
vivienda <- delete.na(vivienda)
vivienda<-vivienda[vivienda$tipo == "Apartamento",]


vivienda %>% 
  plot_ly(x = ~preciom, y = ~areaconst, color = ~zona) %>%
  add_markers(marker = list(size = 4, symbol = "diamond")) %>%
  layout(title = "Precio vs área construida")
vivienda %>% 
  plot_ly(x = ~preciom, y = ~estrato, color = ~zona) %>%
  add_markers(marker = list(size = 4, symbol = "diamond")) %>%
  layout(title = "Precio vs estrato")
vivienda %>% 
  plot_ly(x = ~preciom, y = ~banios, color = ~zona) %>%
  add_markers(marker = list(size = 4, symbol = "diamond")) %>%
  layout(title = "Precio vs número de baños")
vivienda %>% 
  plot_ly(x = ~preciom, y = ~habitaciones, color = ~zona) %>%
  add_markers(marker = list(size = 4, symbol = "diamond")) %>%
  layout(title = "Precio vs número de habitaciones")
vivienda %>% 
  plot_ly(x = ~preciom, y = ~parqueaderos, color = ~zona) %>%
  add_markers(marker = list(size = 4, symbol = "diamond")) %>%
  layout(title = "Precio vs número de parqueaderos")

0.7.8 Punto 7.3

Estime un modelo de regresión lineal múltiple con las variables del punto anterior (precio = f(área construida, estrato, número de cuartos, número de parqueaderos, número de baños)) e interprete los coeficientes si son estadísticamente significativos. Las interpretaciones deben están contextualizadas y discutir si los resultados son lógicos. Adicionalmente interprete el coeficiente R2 y discuta el ajuste del modelo e implicaciones (que podrían hacer para mejorarlo).

library(paqueteMODELOS)
library(ggcorrplot)
library(plotly)
data("vivienda")

delete.na <- function(df, n=0) {
  df[rowSums(is.na(df)) <= n,]
}
vivienda <- delete.na(vivienda)
vivienda<-vivienda[vivienda$tipo == "Apartamento" & vivienda$zona == "Zona Sur",]

modelo1 <- lm(preciom ~ areaconst + estrato + habitaciones + parqueaderos + banios, data = vivienda)

summary(modelo1)
## 
## Call:
## lm(formula = preciom ~ areaconst + estrato + habitaciones + parqueaderos + 
##     banios, data = vivienda)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1023.81   -41.49    -1.62    40.43   935.25 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -265.88631   16.98801 -15.651  < 2e-16 ***
## areaconst       1.21225    0.06101  19.870  < 2e-16 ***
## estrato        57.95258    3.46882  16.707  < 2e-16 ***
## habitaciones  -18.60682    4.29409  -4.333 1.55e-05 ***
## parqueaderos   82.36047    5.06287  16.268  < 2e-16 ***
## banios         47.52768    3.87136  12.277  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 95.6 on 1854 degrees of freedom
## Multiple R-squared:  0.7367, Adjusted R-squared:  0.736 
## F-statistic:  1038 on 5 and 1854 DF,  p-value: < 2.2e-16

Resultados:

De acuerdo con el modelo que se construyó para el total de apartamentos ubicados en la zona sur de la ciudad, se observa que:

  1. Todas las variables del modelo son estadísticamente significativas.

  2. De acuerdo con el modelo a mayor área construida del inmueble, en promedio el precio del metro cuadrado aumenta. Aunque el valor estimado del parámetro es bajo (1.2125), si se estudia a fondo la relación entre estas variables, debe existir un punto “óptimo” de precio y área construida, y después de este el precio del metro cuadrado no varía sin importar que se agregen más metros de área construdia.

  3. De acuerdo con el modelo a mayor estrato en que está ubicado el inmueble, en promedio el precio del metro cuadrado aumenta. Esta relación guarda lógica con los resultados que se esperan obtener previamente.

  4. De acuerdo con el modelo a mayor número de parqueaderos del inmueble, en promedio el precio del metro cuadrado aumenta. Esta relación guarda lógica con las demandas de las personas que cuentan con varios vehículos y que estarían dispuestos a pagar demás para conseguir más espacio de parqueo.

  5. En relación con las variables de número de habitaciones y baños, este resultado indica que estas son significativas y a mayor número de estos el precio de la vivienda aumenta.

  6. Una definición sencilla del \(R^{2}\) es: el porcentaje de la variación en la variable de respuesta que es explicado por un modelo. Así las cosas, el actual modelo explica en un 73,67\(\%\) (en caso de tomar el \(R^{2}\) ajustado este valor sería de 73,6\(\%\)) la variación en el precio del metro cuadrado en apartamentos de la zona sur de Cali.

  7. El valor del \(R^{2}\) indica que con el actual modelo existe cerca de un 27\(\%\) de la variación del precio del metro cuadrado en apartamentos de la zona sur de Cali que no se está explicando. Esto podría llevar a pensar en modificación o combinación de variables o de la especificación del mismo modelo.

  8. p-value del modelo es significativo (2.2e-16) por lo que se puede aceptar que el modelo no es por azar, al menos uno de los coeficientes parciales de regresión es distinto de 0.

0.7.9 Punto 7.4

Realice la validación de supuestos del modelo e interprete los resultados (no es necesario corregir en caso de presentar problemas, solo realizar sugerencias de que se podría hacer).

library(paqueteMODELOS)
library(ggcorrplot)
library(plotly)
library(car)
data("vivienda")

delete.na <- function(df, n=0) {
  df[rowSums(is.na(df)) <= n,]
}
vivienda <- delete.na(vivienda)
vivienda<-vivienda[vivienda$tipo == "Apartamento" & vivienda$zona == "Zona Sur",]

modelo1 <- lm(preciom ~ areaconst + estrato + habitaciones + parqueaderos + banios, data = vivienda)


#Distribución normal de los residuos:

qqPlot(modelo1$residuals, 
       distribution = "norm",
       main = "Q-Q PLOT de residuos del modelo 1",
       xlab = "cuantiles teóricos",
       ylab = "cuantiles de la muestra",
       id = FALSE, grid = TRUE,
       envelope = 0.95, col = carPalette()[1], col.lines = carPalette()[3],
       pch = 20,
       cex = 1,
       lwd = 2)
qqline(modelo1$residuals,
       col = "blue",
       lty = 1,
       lwd = 2)   

shapiro.test(modelo1$residuals)
## 
##  Shapiro-Wilk normality test
## 
## data:  modelo1$residuals
## W = 0.77889, p-value < 2.2e-16
#Homocedasticidad

ggplot(data = vivienda, aes(modelo1$fitted.values, modelo1$residuals)) +
  geom_point() +
  geom_smooth(color = "firebrick", se = FALSE) +
  geom_hline(yintercept = 0) +
  theme_bw()

library(lmtest)
bptest(modelo1)
## 
##  studentized Breusch-Pagan test
## 
## data:  modelo1
## BP = 647.63, df = 5, p-value < 2.2e-16
#Multicolinealidad

library(corrplot)
corrplot(cor(dplyr::select(vivienda, areaconst, estrato, habitaciones, parqueaderos, banios)),
         method = "number", tl.col = "black")

#Análisis de inflación de varianza

library(car)
vif(modelo1)
##    areaconst      estrato habitaciones parqueaderos       banios 
##     1.930364     1.568912     1.386783     1.867256     2.557984
#Autocorrelación

library(car)
dwt(modelo1, alternative = "two.sided")
##  lag Autocorrelation D-W Statistic p-value
##    1       0.2446106      1.510238       0
##  Alternative hypothesis: rho != 0
library(lmtest)
dwtest(modelo1, alternative="two.sided",iterations=1000)
## 
##  Durbin-Watson test
## 
## data:  modelo1
## DW = 1.5102, p-value < 2.2e-16
## alternative hypothesis: true autocorrelation is not 0

Resultados:

  1. Los residuales se salen de las bandas que se contruyeron en la gráfica de Q Q Plot para ellos, esto puede indicar de manera visual que estos no son normales.

  2. De acuerdo con los resultados de la prueba Shapiro-Wilk test, el p-valor de la prueba es menor a un alfa de 0.05 (5\(\%\)), lo cual indica que se rechaza la hipótesis nula y por tanto los residuales no tienen un comportamiento normal.

  3. Se observa que el valor-P es menor que el nivel de significancia usual de 0.05 (5\(\%\)), por lo tanto, hay evidencia para decir que no existe homosedasticidad en los residuales del modelo.

  4. Con base en la gráfica de las correlaciones no se observa de manera visual indicios de multicolinealidad en el modelo.

  5. En relación con el punto anterior, el Análisis de inflación de varianza arrojó resultados bajos para todas las variables del modelo, lo cual podría indicar que no hay problemas de colinealidad entre las variables.

  6. Por último, en términos de autocorrelación y dado que el valor-P en ambas pruebas fue menor a 0.05 (5\(\%\)), no se puede rechazar la presencia de autocorrelacion. Es decir, se rechaza la hipotesis Ho.

0.7.10 Punto 7.5

Con el modelo identificado debe predecir el precio de la vivienda con las características de la segunda solicitud.

De acuerdo con el modelo obtenido en el punto 7.3, tenemos que:

preciom = \(\beta_0\) + areaconst + estrato + habitaciones + parqueaderos + banios + \(\varepsilon_i\)

Ahora reemplazamos los valores obtenidos, tenemos:

preciom = -265.88631 + 1.21225 + 57.95258 + -18.60682 + 82.36047 + 47.52768

Al incluir las características de la vivienda, tenemos:

preciom = -265.88631 + 1.21225(300) + 57.95258(5) + -18.60682(5) + 82.36047(3) + 47.52768(3)

Preciom = 684.18 millones (este precio aplica para una vivienda estrato 5)

Preciom = 742.13 millones (este precio aplica para una vivienda estrato 6)

0.7.11 Punto 7.6

Con las predicciones del modelo sugiera potenciales ofertas que responda a la solicitud de la vivienda 2. Tenga encuentra que la empresa tiene crédito pre-aprobado de máximo 850 millones de pesos. Realice un análisis y presente en un mapa al menos 5 ofertas potenciales que debe discutir.

De acuerdo con el mapa del punto 7.1, no existen viviendas que cumplán con la solicitud hecha a la empresa. Por tanto, no se presentan resultados en este punto.