Los siguientes datos corresponden a ofertas de vivienda (casas y apartamentos) de la ciudad de Cali 2019-2 que se ofrecen por medio de la plataforma finca raíz. La base contiene 8322 registros que se han filtrado según las especificaciones de este informe.
A continuación se procede con el enfoque en un segmento de la base de datos: Ofertas en el Norte de la ciudad menores a 500 MM COP, solo apartamentos y áreas menores a 300 mt2.
Con los filtros realizados se obtienen 1077 datos.
library(readxl)
library(ggplot2)
library(plotly)
library(leaflet)
Datos_Vivienda <- read_excel("C:/Users/Isabella/Downloads/Datos_Vivienda.xlsx")
criterios=Datos_Vivienda$Zona=="Zona Norte"&Datos_Vivienda$precio_millon<500&Datos_Vivienda$Tipo=="Apartamento"&Datos_Vivienda$Area_contruida<300
Datos_filtro=Datos_Vivienda[criterios,]
table(Datos_filtro$Zona)
##
## Zona Norte
## 1077
table(Datos_filtro$Tipo)
##
## Apartamento
## 1077
summary(Datos_filtro$precio_millon)
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## 65.0 132.0 220.0 233.8 320.0 495.0 3
View(Datos_filtro)
head(Datos_filtro,3)
## # A tibble: 3 x 12
## Zona piso Estrato precio_millon Area_contruida parqueaderos Banos
## <chr> <chr> <dbl> <dbl> <dbl> <chr> <dbl>
## 1 Zona~ 2 3 135 56 1 1
## 2 Zona~ NA 3 78 54 2 1
## 3 Zona~ NA 5 340 106 2 2
## # ... with 5 more variables: Habitaciones <dbl>, Tipo <chr>, Barrio <chr>,
## # cordenada_longitud <dbl>, Cordenada_latitud <dbl>
El siguiente es el mapa con las coordenadas de los apartamentos en la Zona norte, menores a 500 MM COP y con áreas menores a 300 mt2. Se puede observar que hay un número considerable de ofertas que supuestamente deberían estar ubicadas en la zona Norte pero aparecen en el Sur, en otras Zonas de la ciudad o incluso por fuera de Cali y esto se debe a que están codificadas erróneamente en la fuente de finca raíz o quienes suben las ofertas han puesto mal la dirección:
leaflet() %>% addCircleMarkers(lng=Datos_filtro$cordenada_longitud,lat=Datos_filtro$Cordenada_latitud,radius=0.1, color = "blue", label = Datos_filtro$precio_millon, opacity = 0.9)%>% addTiles()
Se explora la relación entre precio, el area construida y el Estrato:
Datos_filtro=na.omit(Datos_filtro)
Datos_filtro$Estrato=as.character(Datos_filtro$Estrato)
g1=ggplot(Datos_filtro,aes(x=Area_contruida, y=precio_millon,color=Estrato))+geom_point()+theme_bw()+geom_smooth(method = "lm")
ggplotly(g1)
Se observa en la figura que existe una relación directa entre el precio de la vivienda y el área construida, indicando lo que se espera que a mayor área la vivienda incrementa su precio en promedio. También vemos que las líneas a medida que el Estrato aumenta tienen mayor intercepto indicando que el precio base por estrato también se incrementa. Hay que tener presente que la base es el estrato 3.
Se explora la relación entre precio, el area construida y si el apartamento tiene parqueadero
Datos_filtro$tiene_parqueadero=Datos_filtro$parqueaderos!="NA"
Datos_filtro=na.omit(Datos_filtro)
Datos_filtro$tiene_parqueadero=as.character(Datos_filtro$tiene_parqueadero)
g2=ggplot(Datos_filtro,aes(x=Area_contruida, y=precio_millon,color=tiene_parqueadero))+geom_point()+theme_bw()+geom_smooth(method = "lm")
ggplotly(g2)
Se observa en la figura que existe una relación directa entre el precio de la vivienda y el si tiene parqueadero, indicando que el precio base cambia si el apartamento tiene o no el mismo. Lo anterior tiene sentido, porque los parqueaderos normalmente cuando son propios están escriturados y pagan predial.
Datos_filtro$tiene_parqueadero=Datos_filtro$parqueaderos!="NA"
Datos_filtro$tiene_parqueadero=as.character(Datos_filtro$tiene_parqueadero)
Datos_filtro=na.omit(Datos_filtro)
Datos_filtro$Estrato=as.character(Datos_filtro$Estrato)
g3=ggplot(Datos_filtro,aes(x=Area_contruida, y=precio_millon,color=Estrato))+geom_point()+theme_bw()+geom_smooth(method = "lm")+facet_grid(~tiene_parqueadero)
ggplotly(g3)
Lo primero que hay que considerar es que acá estamos suponiendo una relación lineal entre la variable dependiente y las variables independientes o explicativas.
La base de datos incluye 12 variables:
En este caso, vamos a considerar la variable precio_millon como variable de interés y en función del área construida y de dos variables categóricas que son el estrato y si el predio tiene o no parqueaderos.
Las otras variables se descartan porque están contenidas dentro de las ya incluidas y pueden generar multicolinealidad en el modelo. Por ejemplo, la cantidad de habitaciones y baños, está contenido dentro del área. Las coordenadas y el barrio están dentro de la variable zona, la cual fue uno de los filtros iniciales a la base de datos (solo estamos trabajando con la zona norte)
Nota: cuando se corrió un modelo incluyendo todas las variables el ajuste R-cuadrado ajustado, se mantuvo en el 75%
Datos_filtro$Estrato=as.character(Datos_filtro$Estrato)
Datos_filtro$tiene_parqueadero=Datos_filtro$parqueaderos!="NA"
mod1=lm(precio_millon~Area_contruida+Estrato+tiene_parqueadero, data=Datos_filtro)
summary(mod1)
##
## Call:
## lm(formula = precio_millon ~ Area_contruida + Estrato + tiene_parqueadero,
## data = Datos_filtro)
##
## Residuals:
## Min 1Q Median 3Q Max
## -242.442 -31.795 -0.944 27.529 223.738
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 49.03852 5.03387 9.742 < 2e-16 ***
## Area_contruida 1.04332 0.06037 17.281 < 2e-16 ***
## Estrato4 61.87913 4.84558 12.770 < 2e-16 ***
## Estrato5 146.16586 4.98649 29.312 < 2e-16 ***
## Estrato6 204.47149 9.27649 22.042 < 2e-16 ***
## tiene_parqueaderoTRUE 15.54122 3.98543 3.900 0.000102 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 54.8 on 1071 degrees of freedom
## Multiple R-squared: 0.7541, Adjusted R-squared: 0.7529
## F-statistic: 656.9 on 5 and 1071 DF, p-value: < 2.2e-16
El modelo presenta un R-cuadrado ajustado de 0.7529, lo cual quiere decir que el modelo logra explicar en un 75.29% el precio en millones de la vivienda.
Antes de proceder con el análisis de los coeficientes vamos a validar los supuestos del modelo.
par(mfrow=c(2,2))
plot(mod1)
Los gráficos muestran que los supuestos del modelo están bien. El grafico QQ muestra que hay normalidad y el grafico Residual Vs Fitted value muestra que hay linealidad.En caso de que se violara algún supuesto, por ejemplo el de linealidad, se puede proceder con una transformación del modelo como lo sería el caso de una transformación logarítmica.
Teniendo en cuenta lo anterior para mejorar el R-cuadrado ajustado de la regresión lineal o mejor dicho para mejorar el ajuste del modelo, se recomienda incluir otras variables que pueden ser determinantes en el precio de la vivienda, como lo son la seguridad del sector, los parques, las vías, el acceso al transporte publico entre otras cualitativas.
Una vez validados los supuestos del modelo, se procede a validar la significancia estadística, para este caso, todos los coeficientes son estadísticamente significativos, a continuación su interpretación.
Intercepto: Teniendo en cuenta el estrato 3 como base, podemos concluir que el precio del lote es 49 millones de pesos, es decir cuando no hay nada construido, y no se tienen parqueaderos.
Coeficiente área Construida (Area_construida): Por cada metro cuadrado construido el precio de la vivienda incrementa en 1.04 millones de pesos.
Coeficiente Estrato 4: Estar en estrato 4 incrementa el precio de la vivienda en 61.87 millones de pesos con respecto al estrato 3 (categoría base).
Coeficiente Estrato 5: Estar en estrato 5 incrementa el precio de la vivienda en 146.16 millones de pesos con respecto al estrato 3 (categoría base).
Coeficiente Estrato 6: Estar en estrato 6 incrementa el precio de la vivienda en 204.47 millones de pesos con respecto al estrato 3 (categoría base).
Coeficiente Tiene_Parqueadero: Que la vivienda tenga parqueadero propio, incrementa el precio de esta en 15.54 millones de pesos.
En esta sección se procederá a predecir el precio de un apartamento con 100 mt2, de estrato 4 y con parqueadero y se analizará si este apartamento lo están ofreciendo en 450 millones es una buena oferta.
Una vez identificado que el mejor modelo es precio_millon=B0+B1Area_contruida+B2Estrato+B3Tiene_parqueadero+E se procede con la predicción solicitada.
preciomedio_estimadodemercado=predict(mod1,list(Area_contruida=100,Estrato="4",tiene_parqueadero=TRUE))
preciomedio_estimadodemercado
## 1
## 230.7909
Teniendo en cuenta que el modelo arroja que el precio estimado del mercado es 230.79 millones de pesos, la oferta está sobrevalorada en 219.21 millones de pesos y se recomienda no tomarla. La diferencia en el precio es muy significativa, ni siquiera parece poderse explicar con acabados de lujo para un apartamento en la zona norte de 100 metros cuadrados en estrato 4. dicha diferencia podría estar explicada por variables cualitativas (seguridad, transporte, etc.) como las mencionadas con anterioridad, sin embargo, es casi el doble del precio estimado de mercado, la oferta parece estar muy sobrevalorada en cualquier escenario.
Teniendo en cuanta que hay una persona interesada en un apartamento en la zona norte con más de 100 mt2 de área, de estrato 4, que tenga parqueadero y tenga encuentra que la persona tiene un crédito preaprobado de máximo 400 millones de pesos, se presentan 5 opciones de apartamentos potenciales. Tal como lo muestra el mapa las 5 se encuentran ubicadas en la Zona norte de la ciudad, es decir que no hay errores de registro de la Zona y la dirección para las mismas en la fuente Finca raíz Cali. Dos de las alternativas están ubicados en el barrio San Vicente, una en Versalles, otra en Campiña y por último en Santa Mónica.
precio_modelo=mod1$fitted.values
precio_real=Datos_filtro$precio_millon
area=Datos_filtro$Area_contruida
tiene_p=Datos_filtro$tiene_parqueadero
estrato=Datos_filtro$Estrato
potencial=precio_modelo-precio_real
target=potencial>0&precio_real>=100&precio_real<=400&area>=100&estrato=="4"&tiene_p==TRUE
table(target)
## target
## FALSE TRUE
## 1072 5
Datos_filtro$potencial=round(potencial,1)
Datos_recomendados=Datos_filtro[target,]
Datos_recomendados
## # A tibble: 5 x 14
## Zona piso Estrato precio_millon Area_contruida parqueaderos Banos
## <chr> <chr> <chr> <dbl> <dbl> <chr> <dbl>
## 1 Zona~ 4 4 185 104 1 3
## 2 Zona~ 6 4 270 152 1 3
## 3 Zona~ 3 4 300 287 1 3
## 4 Zona~ 4 4 190 104. 1 3
## 5 Zona~ NA 4 280 173 2 3
## # ... with 7 more variables: Habitaciones <dbl>, Tipo <chr>, Barrio <chr>,
## # cordenada_longitud <dbl>, Cordenada_latitud <dbl>, tiene_parqueadero <lgl>,
## # potencial <dbl>
leaflet() %>% addCircleMarkers(lng = Datos_recomendados$cordenada_longitud,lat = Datos_recomendados$Cordenada_latitud,radius = 0.05,color = "blue",label = paste("Potencial=",Datos_recomendados$potencial,";","Precio venta=",Datos_recomendados$precio_millon),opacity = 0.9)%>% addTiles()
Se intento una transformación logaritmica del modelo:
Datos_filtro$Estrato=as.character(Datos_filtro$Estrato)
Datos_filtro$tiene_parqueadero=Datos_filtro$parqueaderos!="NA"
mod2=lm(log(precio_millon)~Area_contruida+Estrato+tiene_parqueadero, data=Datos_filtro)
summary(mod2)
##
## Call:
## lm(formula = log(precio_millon) ~ Area_contruida + Estrato +
## tiene_parqueadero, data = Datos_filtro)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.88986 -0.14592 0.01888 0.16240 1.02666
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 4.4664295 0.0206619 216.17 < 2e-16 ***
## Area_contruida 0.0040291 0.0002478 16.26 < 2e-16 ***
## Estrato4 0.4225632 0.0198891 21.25 < 2e-16 ***
## Estrato5 0.7603609 0.0204675 37.15 < 2e-16 ***
## Estrato6 0.9200525 0.0380761 24.16 < 2e-16 ***
## tiene_parqueaderoTRUE 0.0966817 0.0163585 5.91 4.59e-09 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.2249 on 1071 degrees of freedom
## Multiple R-squared: 0.8006, Adjusted R-squared: 0.7997
## F-statistic: 860 on 5 and 1071 DF, p-value: < 2.2e-16
par(mfrow=c(2,2))
plot(mod2)
Con esta transformación se puede ver que los supuesto de normalidad se mantiene, el de linealidad se afecta un poco tomando una forma mas concava. Aunque el R-cuadrado ajustado mejora a un 80 % no tiene sentido transformar un modelo cuyos sipuestos estan bien.
Sacandole exponencial al modelo podemos ver como serían los coeficientes.
Intercepto=exp(4.4664295) ## Estrato 3
Intercepto
## [1] 87.04537
Coeficiente_Area_construida=exp(0.0040291)
Coeficiente_Area_construida
## [1] 1.004037
Coeficiente_Estrato4=exp(0.4225632)
Coeficiente_Estrato4
## [1] 1.525868
Coeficiente_Estrato5=exp(0.7603609)
Coeficiente_Estrato5
## [1] 2.139048
Coeficiente_Estrato6=exp(0.9200525)
Coeficiente_Estrato6
## [1] 2.509422
Coeficiente_Tiene_parqueadero=exp(0.0966817)
Coeficiente_Tiene_parqueadero
## [1] 1.10151
se corrobora que estos coeficientes no tienen mucho sentido. teniendo en cuenta que la base es el estrato 3, no lógico pensar que el cambio de estrato 3 al 6 aumente solo en 1.1 millones de pesos el precio de la vivienda de la zona norte, del mismo modo, puede pensarse de los demás coeficientes.Por tanto se toma en cuenta el primer modelo aún cuando su R-cuadrado ajustado es menor, pues el mismo se debe mejorar incluyendo otras variables importantes, como las cualitativas de seguridad, parques cercanos, transporte y etc. mas no modificando la relación entre la variable dependiente y las variables explicativas.