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) .
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?).
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.
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.
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.
#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)
#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.
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")
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:
Las variables de área construida, estrato y parqueaderos son estadísticamente significativas.
Las variables relacionadas con el número de habitaciones y baños de la vivienda no fueron significativas en el modelo.
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.
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.
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.
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.
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.
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.
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.
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:
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)
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:
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.
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.
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.
Realice los pasos del 1 al 6. Para la segunda solicitud que tiene un crédito pre-aprobado por valor de $850 millones.
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?).
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.
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.
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.
#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)
#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.
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")
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:
Todas las variables del modelo son estadísticamente significativas.
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.
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.
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.
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.
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.
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.
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.
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:
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.
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.
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.
Con base en la gráfica de las correlaciones no se observa de manera visual indicios de multicolinealidad en el modelo.
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.
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.
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)
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.