Predicción de precios de vivienda

Con la base de datos de precios de vivienda, realizar un informa que contenga los siguientes puntos

library(readxl)
datos_vivienda <- read_excel("E:/Data Science/Estadistica/Mod 1/Nueva carpeta/Datos_Vivienda.xlsx")
attach(datos_vivienda)
head(datos_vivienda)
Zona piso Estrato precio_millon Area_contruida parqueaderos Banos Habitaciones Tipo Barrio cordenada_longitud Cordenada_latitud
Zona Sur 2 6 880 237 2 5 4 Casa pance -76.46300 3.43000
Zona Oeste 2 4 1200 800 3 6 7 Casa miraflores -76.46400 3.42800
Zona Sur 3 5 250 86 NA 2 3 Apartamento multicentro -76.46400 3.42900
Zona Sur NA 6 1280 346 4 6 5 Apartamento ciudad jardv<U+2260>n -76.46400 3.43300
Zona Sur 2 6 1300 600 4 7 5 Casa pance -76.46438 3.43463
Zona Sur 3 6 513 160 2 4 4 Casa pance -76.46438 3.43463

A. Realice un filtro a la base de datos e incluya solo las ofertas de apartamentos, de la zona norte de la ciudad con precios inferiores a los 500 millones de pesos y areas menores a 300 m2, presente los primeros 3 registros de la base y algunas tablas que comprueben la consulta. (Adicional un mapa con los puntos de la base, discutir si todos los puntos se encuentran en la zona norte o se presentan valores en otras zonas, por que?

Zona piso Estrato precio_millon Area_contruida parqueaderos Banos Habitaciones Tipo Barrio cordenada_longitud Cordenada_latitud
Zona Norte 2 3 135 56 1 1 3 Apartamento torres de comfandi -76.46745 3.40763
Zona Norte NA 3 78 54 2 1 3 Apartamento chiminangos -76.47820 3.44898
Zona Norte NA 5 340 106 2 2 3 Apartamento la flora -76.48200 3.43500
##  [1] "Zona"               "piso"               "Estrato"           
##  [4] "precio_millon"      "Area_contruida"     "parqueaderos"      
##  [7] "Banos"              "Habitaciones"       "Tipo"              
## [10] "Barrio"             "cordenada_longitud" "Cordenada_latitud"
Zona precio_millon Area_contruida Tipo
Zona Norte 135 56 Apartamento
Zona Norte 78 54 Apartamento
Zona Norte 340 106 Apartamento
Zona Norte 135 103 Apartamento
Zona Norte 75 54 Apartamento

Al visualizar en el mapa la ubicación de los datos de acuerdo a sus coordenadas de latitud y longitud se observan varios puntos que no se encuentran como tal en el norte de la ciudad. Considerando que la variable zona al ser categorica puede tener sesgos entonces se adicionan filtros en las coordenadas para obtener unos datos mas coherentes con lo esperado. adicionalmente para considerar la variable parqueaderos en el modelo se realiza la tranformación de los datos existentes con valor NA en 0, de esta forma se convierte esa columna en valores numericos.

pos=which(datos_vivienda$Tipo=="Apartamento" &datos_vivienda$Zona=="Zona Norte" &datos_vivienda$precio_millon<500 &datos_vivienda$Area_contruida<300 &datos_vivienda$Cordenada_latitud>3.4630 &datos_vivienda$cordenada_longitud<76.4750)
Datos_sub=datos_vivienda[pos,]
pos1=which(Datos_sub$parqueaderos=="NA")
Datos_sub$parqueaderos[pos1]=0
Datos_sub$parqueaderos=as.numeric(Datos_sub$parqueaderos)

leaflet() %>% addCircleMarkers(lng = Datos_sub$cordenada_longitud,lat =Datos_sub$Cordenada_latitud, radius = 0.3,color = "Purple",label = Datos_sub$ID) %>% addTiles()

B. Realice un analisis exploratorio de datos enfocado en la correlación entre la variable respuesta (precio del apartamento) en función del area construida, estrato y si tiene parqueadero. use graficos interactivos con plotly e interprete los resultados.

require(ggplot2)
require(plotly)
Grafico1=ggplot(data=Datos_sub,aes(y=precio_millon,x=Area_contruida))+geom_point()+geom_smooth()
ggplotly(Grafico1)
Grafico1=ggplot(data=Datos_sub,aes(y=precio_millon,x=Estrato))+geom_point()+geom_smooth()
ggplotly(Grafico1)
Grafico1=ggplot(data=Datos_sub,aes(y=precio_millon,x=parqueaderos))+geom_point()+geom_smooth()
ggplotly(Grafico1)
correlacionArea = cor(Datos_sub$Area_contruida,Datos_sub$precio_millon, use= "complete.obs")
correlacionEstrato = cor(Datos_sub$Estrato,Datos_sub$precio_millon, use= "complete.obs")
correlacionParqueaderos = cor(Datos_sub$parqueaderos,Datos_sub$precio_millon, use= "complete.obs")
data.frame(correlacionArea,correlacionEstrato,correlacionParqueaderos)
correlacionArea correlacionEstrato correlacionParqueaderos
0.7214502 0.8368432 0.6392084

Se aprecia segun los graficos y datos de la tabla anterior, que existe correlación positiva entre el precio de los apartamentos y el área construida, es decir que a mayor area el precio tiende a aumentar. de igual manera se observa correlación positiva entre los estratos y precio. acerca de los parqueaderos tambien se tiene la tendencia en que a mayor numero de parqueaderos se incrementa el precio pero su correlación es mucho menor.

C. Estime un modelo de regresion lineal multiple con las variables del punto anterior e interprete los coeficientes si son estadisticamente significativos. las interpretaciones deben estar contextualizadas y discutir si los resultados son logicos. adicionalmente interprete el coeficiente R2 y discuta el ajuste del modelo e implicadiones. ¿Que podria hacer para mejorarlo?

modelo=lm(precio_millon~Area_contruida+Estrato+parqueaderos,data=Datos_sub)
summary(modelo)
## 
## Call:
## lm(formula = precio_millon ~ Area_contruida + Estrato + parqueaderos, 
##     data = Datos_sub)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -196.921  -30.312   -1.393   24.665  220.503 
## 
## Coefficients:
##                  Estimate Std. Error t value Pr(>|t|)    
## (Intercept)    -160.89145    9.01491 -17.847  < 2e-16 ***
## Area_contruida    1.01191    0.08495  11.911  < 2e-16 ***
## Estrato          68.50375    2.83259  24.184  < 2e-16 ***
## parqueaderos     25.86468    3.56233   7.261 9.27e-13 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 52.47 on 787 degrees of freedom
## Multiple R-squared:  0.7749, Adjusted R-squared:  0.774 
## F-statistic: 902.9 on 3 and 787 DF,  p-value: < 2.2e-16
Beta0=modelo$coefficients[1]
Beta1=modelo$coefficients[2]
Beta2=modelo$coefficients[3]
Beta3=modelo$coefficients[4]
data.frame(Beta0,Beta1,Beta2,Beta3)
Beta0 Beta1 Beta2 Beta3
(Intercept) -160.8914 1.011912 68.50375 25.86468

Modelo:

\(precioMillon = -160,89 + 1,01*AreaConstruida + 68,50*Estrato + 25,86*Parqueaderos\)

En el modelo encontrado el intercepto no puede interpretarse puesto que significaria que ante una area de cero metros y un estrato cero el precio del apartamento seria negativo

el coeficiente \(Beta_1=1,01\) indica que por cada metro de area construida el precio del apartamento aumenta en 1,01 millones

El coeficiente \(Beta_2=68,50\) indica que por cada aumento de Estrato el precio del inmueble se incrementa 68,50 millones

El coeficiente \(Beta_3=25,86\) indica que por cada aumento de numero de parqueaderos el precio del inmueble se incrementa 25,86 millones

los coeficientes \(Beta1\) y \(Beta2\) muestran una alta significancia el tener un \(valor-p:2e-16 ***\)

el coeficiente \(Beta3\) aun cuando tiene un mayor valor p, es bastante pequeño para considerar su significancia en el modelo

El coeficiente de determinación \(R^2=0,774\) nos indica que el modelo propuesto explica el 77,4% de la variación en el precio de la vivienda

Como ajuste al modelo se puede realizar la transformación mediante logaritmo con lo cual obtenemos un coeficiente de determinación de \(R^2=0,8233\)

modelo2=lm(log(precio_millon)~log (Area_contruida)+log(Estrato)+parqueaderos,data=Datos_sub)
summary(modelo2)
## 
## Call:
## lm(formula = log(precio_millon) ~ log(Area_contruida) + log(Estrato) + 
##     parqueaderos, data = Datos_sub)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.73085 -0.13764  0.02095  0.14955  0.95399 
## 
## Coefficients:
##                     Estimate Std. Error t value Pr(>|t|)    
## (Intercept)          1.40211    0.12682  11.056  < 2e-16 ***
## log(Area_contruida)  0.46283    0.03660  12.644  < 2e-16 ***
## log(Estrato)         1.29185    0.04921  26.251  < 2e-16 ***
## parqueaderos         0.10073    0.01465   6.876 1.26e-11 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.2141 on 787 degrees of freedom
## Multiple R-squared:  0.8239, Adjusted R-squared:  0.8233 
## F-statistic:  1228 on 3 and 787 DF,  p-value: < 2.2e-16

D.Realice la validación de supuestos del modelo e interprete los resultados

par(mfrow=c(2,2))
plot(modelo)

par(mfrow=c(2,2))
plot(modelo2)

Validacion de los supuestos del modelo

  1. Media cero: Se cumple por defecto.
  2. Varianza Constante: Se observa en la grafica de residuales vs ajustados que el comportamiento no presenta alguna tendencia en particular que indique problemas.
  3. Normalidad: Se observa en la grafica 2 que los datos se ajustan bien a la linea de normalidad al realizarse la transformación del modelo
  4. Independencia: Dado que estos registros no corresponden a datos en el tiempo no se tiene un orden temporal para realizar la validación de este supuesto. Se valida por definición del tipo de datos de corte transversal.

Con el modelo identificado predecir el precio de un apartamento con 100m2, de estrato 4 con parqueadero. ¿si este apartamento lo estan ofreciendo en 450 millones, cual seria su opinion con base en el resultado del modelo? ¿Considera que es buena oferta?

exp(predict(modelo2,list(Area_contruida=100,Estrato=4,parqueaderos=1),interval = "confidence",level = 0.95))
##        fit      lwr     upr
## 1 227.0373 221.9578 232.233

Los resultados del modelo indican que con un intervalo de confianza de 0,95 el valor del apartamento con las caracteristicas mencionadas estaria entre 222 y 232 millones, por lo tanto la oferta de 450 millones se encuentra muy por encima de este rango, estaria al doble del precio que nos entrega el modelo

F. Con las predicciones del modelo, sugiera potenciales ofertas para una persona interesada en un apartamento en la zona norte con mas de 100m2 de area, de estrato 4, que tenga parqueadero. tenga en cuenta que la persona tiene un credito preaprobado de maximo 400 millones de pesos. realice un analisis y presente en un mapa al menos 5 ofertas potenciales que debe discutir

pos3=which(Datos_sub$precio_millon<400 &Datos_sub$Area_contruida>100 &Datos_sub$Estrato=="4" &Datos_sub$parqueaderos!=0)
Datos_sub3=Datos_sub[pos3,]
Datos_sub3
Zona piso Estrato precio_millon Area_contruida parqueaderos Banos Habitaciones Tipo Barrio cordenada_longitud Cordenada_latitud
Zona Norte 4 4 380 123.00 1 3 3 Apartamento la flora -76.51437 3.48618
Zona Norte NA 4 350 130.00 1 2 3 Apartamento la flora -76.52100 3.49000
Zona Norte 1 4 290 108.00 1 2 3 Apartamento la flora -76.52115 3.48930
Zona Norte 4 4 185 104.00 1 3 3 Apartamento san vicente -76.52300 3.46400
Zona Norte NA 4 265 125.00 2 3 4 Apartamento la flora -76.52353 3.48157
Zona Norte 2 4 380 126.00 2 3 4 Apartamento la flora -76.52432 3.48254
Zona Norte 6 4 270 152.00 1 3 4 Apartamento versalles -76.52515 3.46334
Zona Norte NA 4 340 121.00 2 3 3 Apartamento menga -76.52566 3.49078
Zona Norte 3 4 300 287.00 1 3 4 Apartamento la campiv±a -76.52673 3.47907
Zona Norte 2 4 240 103.00 1 2 3 Apartamento versalles -76.52700 3.46500
Zona Norte 8 4 397 160.48 1 4 4 Apartamento la campiv±a -76.52741 3.48002
Zona Norte 2 4 300 163.00 1 3 3 Apartamento san vicente -76.52785 3.46701
Zona Norte 4 4 250 118.00 1 2 3 Apartamento versalles -76.52793 3.46699
Zona Norte 7 4 250 106.00 1 2 3 Apartamento versalles -76.52812 3.46362
Zona Norte 2 4 300 136.00 2 3 3 Apartamento el bosque -76.52872 3.48474
Zona Norte 2 4 300 136.00 2 2 3 Apartamento el bosque -76.52902 3.48509
Zona Norte 6 4 310 147.00 1 2 2 Apartamento santa monica -76.53098 3.46780
Zona Norte NA 4 280 173.00 2 3 3 Apartamento santa monica -76.53362 3.46337
leaflet() %>% addCircleMarkers(lng = Datos_sub3$cordenada_longitud,lat =Datos_sub3$Cordenada_latitud, radius = 0.3,color = "Purple",label = Datos_sub3$ID) %>% addTiles()