Bogotá, 15 de Septiembre de 2023
Señores INMOBILIARIA C&A Junta Directiva Cali
Referencia: Informe Construcción de Modelo sobre precios de Inmuebles.
Respetados Señores,
A continuación, el informe de los hallazgos frente a la construcción del modelo de precios de inmuebles después de revisada la Base de datos enviada por sus asesores:
Definición del Problema: Con base en los datos de ofertas de vivienda descargadas de la base de datos, requieren el apoyo en la construcción de un modelo que les oriente sobre los precios de los inmuebles para la compañia internacional que desea ubicar a dos de sus empleados con sus familias en la ciudad.
Revisión de la data Disponible: Se recibe un dataset (o base de datos) en formato R con 8.322 filas y 13 variables disponibles para evaluar entre ellas: Zona , Estrato, Precio M2, Área Construida, Tipo de Inmueble, etc.
Frente a los requermientos del cliente evaluamos estas como las mejores opciones:
Casa No. 1: Precio de Venta $321 Millones , area construida 249 m2,
parqueaderos 1, baños 5, habitaciones 5, Barrio la merced que se
encontaria ubicado en la comuna 3 de cali empezando
la zona norte de Cali, es una zona de bastante historica y puede que la
casa sea un poco
vieja por lo cual es importante hacer la visita tecnica para evaluar las
condiciones de la misma.
Casa No. 2: Precio de Venta $250 Millones , area construida 243 m2,
parqueaderos 1, baños 4, habitaciones 5, Barrio el bosque que se
encontaria ubicado en la comuna 2 de cali es un
barrio de 53 años aprox. donde habitan principalmente personas
pensionadas cobn parques grandes alrededor.
Casa No. 3: Precio de Venta $330 Millones , area construida 260 m2,
parqueaderos 1, baños 3, habitaciones 4, Barrio la merced que se
encontaria ubicado en la comuna 3 de cali empezando
la zona norte de Cali, es una zona de bastante historica y puede que la
casa sea un poco
vieja por lo cual es importante hacer la visita tecnica para evaluar las
condiciones de la misma.
Casa No. 4: Precio de Venta $350 Millones , area construida 346 m2, parqueaderos 1, baños 2, habitaciones 4, Barrio vipasa ubicado en la comuna 3 de cali muy cerca a los cerros el bosque y los altos de menga se conoce por sus multiples parques y sus zonas verdes.
Casa No. 5: Precio de Venta $35 Millones , area construida 202 m2,
parqueaderos 1, baños 4, habitaciones 5, Barrio el bosque que se
encontaria ubicado en la comuna 2 de cali es un
barrio de 53 años aprox. donde habitan principalmente personas
pensionadas cobn parques grandes alrededor.
Apartamento No. 1: Precio de Venta $730 Millones , area construida
573 m2, parqueaderos 3,
baños 8, habitaciones 5, Barrio Guadalupe ubicado en la comuna 19 de
cali en el sector hay clases socioeconómicas media y alta en el extremo
sur de la ciudad.
Apartamento No. 2: Precio de Venta $670 Millones , area construida
300 m2, parqueaderos 3,
baños 5, habitaciones 6, Barrio seminario ubicado en la comuna 19 de
cali en el sector hay clases socioeconómicas media y alta en el extremo
sur de la ciudad.
Frente a la definición del problema inicial en la construcción de un modelo que les oriente sobre los precios de los inmuebles con la data evaluada y los diferentes modelos se puede concluir que se sugiere que se debe buscar otro tipo de modelo diferentes a los evaluados que permitan explicar esa variable de precio debido a que esta no es explicada en buena medida solo por el área construida y estrato en su gran medida.
Adicional es claro que en el data set entregado no se contemplaron todas las variables del estudio por lo cual seria importante ver si desde la fuente existen otras variables que no se contemplaron y que nos permitirían acercarnos de manera más precisa al modelo en este caso parace importamte tener en cuenta el año del predio debido a que esta variable nos permitiria ver en funcion del precio realmente que es lo mas conveniente para los clientes.
Se adjuntan documento R-Mark Down con las líneas de código de las variables y funciones evaluadas que acompañan cada una de las interpretaciones de los gráficos y tablas relacionadas en este informe, todas realizadas en el programa R estudio.
Quedo atenta a sus comentarios,
Laura Yohanna Bermúdez Murillo
Data Science Independiente
A continuación, se muestran los resultados del análisis de los datos:
Revision de los requerimientos por parte de una compañía internacional que desea ubicar a dos de sus empleados con sus familias en la ciudad con las siguientes condiciones:
# Cargar el paquete knitr
library(knitr)
## Warning: package 'knitr' was built under R version 4.2.3
# Crear un conjunto de datos con las características de las viviendas
caracteristicas_viviendas <- data.frame(
Características = c("Tipo", "Área construida", "Parqueaderos", "Baños", "Habitaciones", "Estrato", "Zona", "Crédito preaprobado"),
Vivienda_1 = c("Casa", 200, 1, 2, 4, "4 o 5", "Norte", "350 millones"),
Vivienda_2 = c("Apartamento", 300, 3, 3, 5, "5 o 6", "Sur", "850 millones"))
# Crear la tabla con kable
tabla_caracteristicas <- kable(caracteristicas_viviendas, format = "markdown", col.names = c("", "Vivienda 1", "Vivienda 2"))
# Imprimir la tabla
print(tabla_caracteristicas)
##
##
## | |Vivienda 1 |Vivienda 2 |
## |:-------------------|:------------|:------------|
## |Tipo |Casa |Apartamento |
## |Área construida |200 |300 |
## |Parqueaderos |1 |3 |
## |Baños |2 |3 |
## |Habitaciones |4 |5 |
## |Estrato |4 o 5 |5 o 6 |
## |Zona |Norte |Sur |
## |Crédito preaprobado |350 millones |850 millones |
Pasos requeridos para la obtención de los resultados
DataVivienda <-read.csv("C:/Users/lberm/OneDrive/Documentos/MAESTRIA/MODELOS_APRENDIZAJE_ESTADIS/vivienda.csv")
str(DataVivienda)
## 'data.frame': 8322 obs. of 13 variables:
## $ id : int 8312 8311 8307 8296 8297 8298 8299 8300 8286 8287 ...
## $ zona : chr "Zona Oeste" "Zona Oeste" "Zona Oeste" "Zona Sur" ...
## $ piso : int 4 1 NA 2 NA NA 2 NA NA 2 ...
## $ estrato : int 6 6 5 3 5 5 6 5 5 5 ...
## $ preciom : int 1300 480 1200 220 330 1350 305 480 275 285 ...
## $ areaconst: num 318 300 800 150 112 390 125 280 74 120 ...
## $ parquea : int 2 1 4 1 2 8 2 4 1 2 ...
## $ banios : int 4 4 7 2 4 10 3 4 2 4 ...
## $ habitac : int 2 4 5 4 3 10 3 4 3 3 ...
## $ tipo : chr "Apartamento" "Casa" "Casa" "Casa" ...
## $ barrio : chr "arboleda" "normandía" "miraflores" "el guabal" ...
## $ longitud : num -76576 -76571 -76568 -76565 -76565 ...
## $ latitud : num 3454 3454 3455 3417 3408 ...
Se excluye de la base de datos la columna piso ya que no es relevante dentro del informe.
borrar <- c("piso")
DataVivienda <- DataVivienda[ ,!(names(DataVivienda) %in% borrar)]
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.2.3
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
DataVivienda1 <- DataVivienda %>%
mutate(tipo = case_when(
tipo %in% c("CASA", "Casa") ~ "casa",
tipo %in% c("APARTAMENTO", "apto") ~ "Apartamento",
TRUE ~ tipo # Mantén cualquier otro valor tal como está
))
valores_unicos <- unique(DataVivienda1$tipo)
print(valores_unicos)
## [1] "Apartamento" "casa" NA
# filtros punto 1: casas de la zona norte de la ciudad
library(dplyr)
punto_1 <- filter(DataVivienda1,zona == "Zona Norte" & tipo == "casa")
head(punto_1, 3)
## id zona estrato preciom areaconst parquea banios habitac tipo
## 1 8088 Zona Norte 3 149 130 NA 2 3 casa
## 2 6812 Zona Norte 4 670 470 4 5 5 casa
## 3 6673 Zona Norte 5 750 300 2 3 5 casa
## barrio longitud latitud
## 1 brisas de los -76555 3417.00
## 2 tejares de san -76545 3.44
## 3 el gran limonar -76544 3397.00
str(punto_1)
## 'data.frame': 722 obs. of 12 variables:
## $ id : int 8088 6812 6673 6479 6338 6340 6141 6143 6155 5710 ...
## $ zona : chr "Zona Norte" "Zona Norte" "Zona Norte" "Zona Norte" ...
## $ estrato : int 3 4 5 3 4 4 5 3 6 5 ...
## $ preciom : int 149 670 750 155 540 530 390 1100 550 1530 ...
## $ areaconst: num 130 470 300 80 306 400 265 500 395 776 ...
## $ parquea : int NA 4 2 NA 3 4 1 NA NA 6 ...
## $ banios : int 2 5 3 2 4 3 4 8 8 6 ...
## $ habitac : int 3 5 5 3 4 3 6 5 6 10 ...
## $ tipo : chr "casa" "casa" "casa" "casa" ...
## $ barrio : chr "brisas de los" "tejares de san" "el gran limonar" "villa del prado" ...
## $ longitud : num -76555 -76545 -76544 -76543 -76542 ...
## $ latitud : num 3417 3.44 3397 3449 3422 ...
require(leaflet)
## Loading required package: leaflet
## Warning: package 'leaflet' was built under R version 4.2.3
leaflet() %>% addTiles() %>%
setView(lng = -76.51595234451665, lat = 3.436834062816008, zoom = 10) %>%
addCircleMarkers(lng = punto_1$longitud,
lat = punto_1$latitud,
stroke = FALSE,
fillOpacity = 0.5,
radius = 4,
color = 'blue')
Se observan con los filtros 717 datos y en mapa la mayor concentracion de puntos se
ubican en el Norte de la ciudad de Cali, si se ven otros dispersos por toda la ciudad
esto se debe a varias posibilidades, entre las principales que destaco: el dataframe fue obtenido por la tecnica de web scraping lo que puede generar errores en la obtencion de la data, otro problema es que hay errores de identificacion de los barrios o de las coordenadas
del mismo por eso tendria que hacerse una re-verificacion para saber que tan confiable es la data.
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.
library(knitr)
punto_2 <-summary(punto_1[, c("preciom", "areaconst", "estrato", "banios", "habitac", "zona")])
knitr::kable(punto_2, caption = "ANALISIS DE LAS VARIABLES")
| preciom | areaconst | estrato | banios | habitac | zona | |
|---|---|---|---|---|---|---|
| Min. : 89.0 | Min. : 30.0 | Min. :3.000 | Min. : 0.000 | Min. : 0.000 | Length:722 | |
| 1st Qu.: 261.2 | 1st Qu.: 140.0 | 1st Qu.:3.000 | 1st Qu.: 2.000 | 1st Qu.: 3.000 | Class :character | |
| Median : 390.0 | Median : 240.0 | Median :4.000 | Median : 3.000 | Median : 4.000 | Mode :character | |
| Mean : 445.9 | Mean : 264.9 | Mean :4.202 | Mean : 3.555 | Mean : 4.507 | NA | |
| 3rd Qu.: 550.0 | 3rd Qu.: 336.8 | 3rd Qu.:5.000 | 3rd Qu.: 4.000 | 3rd Qu.: 5.000 | NA | |
| Max. :1940.0 | Max. :1440.0 | Max. :6.000 | Max. :10.000 | Max. :10.000 | NA |
head(punto_2)
## preciom areaconst estrato banios
## Min. : 89.0 Min. : 30.0 Min. :3.000 Min. : 0.000
## 1st Qu.: 261.2 1st Qu.: 140.0 1st Qu.:3.000 1st Qu.: 2.000
## Median : 390.0 Median : 240.0 Median :4.000 Median : 3.000
## Mean : 445.9 Mean : 264.9 Mean :4.202 Mean : 3.555
## 3rd Qu.: 550.0 3rd Qu.: 336.8 3rd Qu.:5.000 3rd Qu.: 4.000
## Max. :1940.0 Max. :1440.0 Max. :6.000 Max. :10.000
## habitac zona
## Min. : 0.000 Length:722
## 1st Qu.: 3.000 Class :character
## Median : 4.000 Mode :character
## Mean : 4.507
## 3rd Qu.: 5.000
## Max. :10.000
punto_2.1 <- punto_1[c("preciom", "areaconst", "estrato", "banios", "habitac", "zona")]
punto_2.1_df <- as.data.frame(punto_2.1)
punto_2.1_df <- punto_2.1_df[complete.cases(punto_2.1_df),]
sum(is.na(punto_2.1_df)) # Conteo de valores faltantes
## [1] 0
View(punto_2.1_df)
library(plotly)
## Warning: package 'plotly' was built under R version 4.2.3
## Loading required package: ggplot2
##
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
##
## last_plot
## The following object is masked from 'package:stats':
##
## filter
## The following object is masked from 'package:graphics':
##
## layout
plot <- plot_ly(punto_2.1_df, type = "histogram")
plot <- plot %>% add_trace(x = ~preciom, name = "Precio M2 Casa")
plot
plot <- plot_ly(punto_2.1_df, type = "histogram")
plot <- plot %>% add_trace(x = ~areaconst, name = "Area_construida")
plot
options(warn = -1)
plot_estrato <- plot_ly(data = punto_2.1_df, x = ~estrato, y = ~preciom, color = ~zona,
type = "box", boxpoints = "all",
text = ~paste("Precio:", preciom, "<br>Estrato:", estrato)) %>%
layout(title = "Relación entre Precio y Estrato",
xaxis = list(title = "Estrato"),
yaxis = list(title = "Precio (millones COP)")) %>%
style(marker = list(color = "purple"))
options(warn = 0)
plot_estrato
library(GGally)
## Warning: package 'GGally' was built under R version 4.2.3
## Registered S3 method overwritten by 'GGally':
## method from
## +.gg ggplot2
corr <-punto_2.1_df[,c("preciom","areaconst","estrato","banios","habitac")]
ggpairs(corr, title="Grafica de correlacion entre variable respuesta(precio) Vs otras variables ")
Precio Vs Area Construida: Correlacion positiva 0.731 lo que indica que ambas variables tienden a incrementarses junta, a Mayor Precio mayor area construida.
Precio Vs Estrato: Correlacion positiva 0.612 lo que indica que ambas variables tienden a incrementarses junta, a Mayor Precio mayor estrato.
Precio Vs Baños: Correlacion positiva 0.523 lo que indica que ambas variables tienden a incrementarses junta, a Mayor Precio mayor estrato.
Precio Vs habitaciones: Correlacion positiva 0.323 (debil) lo que indica que ambas variables tienden a incrementarses pero en una menor proporcion a Mayor Precio mas habitaciones.
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 deber 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).
punto_3_MV = lm(preciom ~ areaconst + estrato + banios+ habitac, data = punto_2.1_df )
summary(punto_3_MV)
##
## Call:
## lm(formula = preciom ~ areaconst + estrato + banios + habitac,
## data = punto_2.1_df)
##
## Residuals:
## Min 1Q Median 3Q Max
## -961.17 -79.37 -17.71 49.14 1072.88
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -234.04276 29.69581 -7.881 1.2e-14 ***
## areaconst 0.82516 0.04346 18.986 < 2e-16 ***
## estrato 85.77820 7.20303 11.909 < 2e-16 ***
## banios 26.82962 5.32670 5.037 6.0e-07 ***
## habitac 1.23258 4.12582 0.299 0.765
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 159 on 717 degrees of freedom
## Multiple R-squared: 0.6507, Adjusted R-squared: 0.6488
## F-statistic: 334 on 4 and 717 DF, p-value: < 2.2e-16
Precio=−234.04+0.8256(areaconst)+85.778(estrato)+26.82(baños)+1.23(habitaciones)
Intercept (Intercepto): El intercepto es el valor esperado de la variable de respuesta cuando todas las variables predictoras son iguales a cero. En este caso, el intercepto es -234.04276. Esto significa que cuando todas las demás variables son cero, el precio medio es de -234.04276. Sin embargo, en la mayoría de los contextos, un precio negativo no tendría sentido, lo que podría indicar un problema en el modelo o en los datos.
areaconst: El coeficiente de “areaconst” es 0.82516. Esto significa que, manteniendo constantes las otras variables, se espera que un aumento de una unidad en “areaconst” esté asociado con un aumento de 0.82516 en el precio medio.
estrato: El coeficiente de “estrato” es 85.77820. Esto significa que, manteniendo constantes las otras variables, se espera que un aumento de una unidad en “estrato” esté asociado con un aumento de 85.77820 en el precio medio.
banios: El coeficiente de “banios” es 26.82962. Esto significa que, manteniendo constantes las otras variables, se espera que un aumento de una unidad en “banios” esté asociado con un aumento de 26.82962 en el precio medio.
habitac: El coeficiente de “habitac” es 1.23258. Esto significa que, manteniendo constantes las otras variables, se espera que un aumento de una unidad en “habitac” esté asociado con un aumento de 1.23258 en el precio medio.
Es importante destacar que el coeficiente de “habitac” tiene un valor p (Pr(>|t|)) muy alto (0.765), lo que indica que no es estadísticamente significativo en el modelo. Esto sugiere que “habitac” puede no estar contribuyendo significativamente a la predicción del precio y podría considerarse para su eliminación del modelo si no es relevante en el contexto de tu análisis.
En términos generales, los resultados son lógicos en el sentido de que los coeficientes tienen signos esperados y magnitudes que sugieren relaciones proporcionales. Sin embargo, debes prestar atención al coeficiente de “habitac” debido a su falta de significancia estadística.
es igual a 0.6507 lo que obtenemos que hay un 65% que las variables mencionadas tiene relacion con el precio del inmueble.
Hipótesis para ßo:Ho:βo=0,Ha:β0≠0
Donde el P Valor=2.2e−16 Ya que P Valor<0.05 , se rechaza H0:ß0=0
Hipótesis para ß1:H0:β1=0,Ha:β1≠0
P Valor=2.2e−16 Ya que P Valor<0.05 , se rechaza Ho:ß2=0
Hipótesis para ß2:Ho:β2=0,Ha:β2≠0
P Valor=2.2e−16 ya que P Valor<0.05 , se rechaza Ho:ß2=0
Hipótesis para ß3:Ho:β3=0,Ha:β3≠0
P Valor=2.2e−16 Ya que P Valor<0.05 , se rechaza Ho:ß3=0
Para mejorar el modelo podemos plantear quitar o evaluar algunas variables que realmente expliquen de mejor manera el modelo, por ejemplo solo dejar las relaciones posotivas fuertes en este caso precio Vs estrato + baños y con eso determinar si obtenemos un mejor resultado de R2. Tambien podemos hacer pruebas cruzadas para ajustar mejor la ecuacion y la prediccion del modelo de tal manera que nos permita buscar las variables optimas.
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).
par(mfrow = c(2,2))
plot(punto_3_MV)
1.Los errores del modelo tienen media cero E[ε]=0
R/Si se observa la grafica 1 se observan que los errores tienen una media cero y tienen un comportamiento aleatorio.
2.Los errores del modelo tienen varianza constante V[ε]=σ2
R/Si observamos el grafico de residuales vs. valores ajustados se
observa que existe una
varianza constante, ya que no muestran ningun patron.
R/Supuesto: Los residuos siguen una distribución normal. Validacion:
Observando el grafico de normalidad vemos que la nube de puntos en la
escala
normal se puede agustar por una linea recta, por lo que se establece que
los errores tiene una distribución normal.
R: Supuesto: La varianza de los residuos es constante a lo largo de los valores de las variables predictoras.
Validación:
residuos <- residuals(punto_3_MV)
valores_ajustados <- fitted(punto_3_MV)
plot(valores_ajustados, residuos, col = "blue", main = "Grafico de Residuos vs. Valores Ajustados")
abline(h = 0, col = "red")
Aplicacion de prueba de Breusch-Pagan
library(lmtest)
## Warning: package 'lmtest' was built under R version 4.2.3
## Loading required package: zoo
## Warning: package 'zoo' was built under R version 4.2.3
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
resultado_bp <- bptest(punto_3_MV)
print(resultado_bp)
##
## studentized Breusch-Pagan test
##
## data: punto_3_MV
## BP = 134.62, df = 4, p-value < 2.2e-16
La hipótesis nula (H0) en el test de Breusch-Pagan es que no hay heteroscedasticidad, lo que significa que la varianza de los errores es constante (homocedasticidad). La hipótesis alternativa (H1) es que hay heteroscedasticidad, es decir, la varianza de los errores no es constante y varía con respecto a una o más variables predictoras.
Dado que el valor p es muy pequeño (p-value < 2.2e-16), podemos rechazar la hipótesis nula (H0) y concluir que hay evidencia suficiente para afirmar que existe heteroscedasticidad en el modelo de regresión. En otras palabras, la varianza de los errores no es constante en todas las combinaciones de valores de las variables predictoras, lo que sugiere que el modelo de regresión lineal puede no ser adecuado para describir los datos correctamente.
Cuando se detecta heteroscedasticidad en un modelo de regresión, es importante considerar la posibilidad de transformar las variables.
Con el modelo identificado debe predecir el precio de la vivienda con las características de la primera solicitud.
punto_5 <- DataVivienda1[c("tipo","areaconst","parquea", "banios", "habitac","estrato", "zona","preciom")]
punto_5df <- as.data.frame(punto_5)
punto_5df <- punto_5df[complete.cases(punto_5df),]
sum(is.na(punto_5df)) # Conteo de valores faltantes
## [1] 0
punto_5_MV = lm(preciom ~ areaconst + estrato + banios+ habitac+tipo+parquea+zona,data = punto_5df )
summary(punto_5_MV)
##
## Call:
## lm(formula = preciom ~ areaconst + estrato + banios + habitac +
## tipo + parquea + zona, data = punto_5df)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1488.92 -84.59 -11.64 57.49 1018.00
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -246.00687 24.84273 -9.903 < 2e-16 ***
## areaconst 0.88111 0.02277 38.696 < 2e-16 ***
## estrato 83.40364 3.03554 27.476 < 2e-16 ***
## banios 61.09020 2.57666 23.709 < 2e-16 ***
## habitac -27.53702 2.27477 -12.105 < 2e-16 ***
## tipocasa -24.35638 6.05323 -4.024 5.79e-05 ***
## parquea 75.21846 2.51375 29.923 < 2e-16 ***
## zonaZona Norte -103.19182 22.38207 -4.610 4.09e-06 ***
## zonaZona Oeste 17.25003 23.17100 0.744 0.4566
## zonaZona Oriente -52.09916 25.34955 -2.055 0.0399 *
## zonaZona Sur -94.65016 22.13295 -4.276 1.93e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 171.7 on 6706 degrees of freedom
## Multiple R-squared: 0.7378, Adjusted R-squared: 0.7374
## F-statistic: 1887 on 10 and 6706 DF, p-value: < 2.2e-16
predict(punto_5_MV,list(tipo ="casa",areaconst=200,parquea=1, banios=2, habitac= 4,estrato=(5),zona="Zona Norte"))
## 1
## 306.9356
El precio para un inmueble de las caracteristicas descritas tendria un precio aproximado de $ 306 Millones.
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.
punto_6 <- filter(DataVivienda1, tipo == "casa" & parquea==1 & banios>=2 & areaconst>=200
& habitac >= 4 & estrato >=4 & zona == "Zona Norte" & preciom <= 350)
punto_6df <- as.data.frame(punto_6)
punto_6df <- punto_6df[complete.cases(punto_6df),]
sum(is.na(punto_6df)) # Conteo de valores faltantes
## [1] 0
#punto_6df <- punto_6df[order(-Punto_6df$areaconst),]
punto_6df <- head(punto_6df, 5)
head(punto_6df, 10)
## id zona estrato preciom areaconst parquea banios habitac tipo
## 1 766 Zona Norte 5 321 249 1 5 5 casa
## 2 1009 Zona Norte 5 250 243 1 4 5 casa
## 3 1108 Zona Norte 4 330 260 1 3 4 casa
## 4 1943 Zona Norte 5 350 346 1 2 4 casa
## 5 4267 Zona Norte 5 335 202 1 4 5 casa
## barrio longitud latitud
## 1 la merced -76.50291 3.46757
## 2 el bosque -76.50755 3.47838
## 3 la merced -76.51060 3.48108
## 4 vipasa -76.51847 3.47503
## 5 el bosque -76.53044 3.48399
View(punto_6df)
leaflet() %>% addTiles() %>%
setView(lng = -76.51595234451665, lat = 3.436834062816008, zoom = 10) %>%
addCircleMarkers(lng = punto_6df$longitud,
lat = punto_6df$latitud,
stroke = FALSE,
fillOpacity = 0.5,
radius = 7,
color = 'blue')
Con los fitros solicitados por el cliente obtuvimos 4 potenciales propiedades que podrian definirse asi,
Casa No. 1: Precio de Venta $321 Millones , area construida 249 m2,
parqueaderos 1, baños 5, habitaciones 5, Barrio la merced que se
encontaria ubicado en la comuna 3 de cali empezando
la zona norte de Cali, es una zona de bastante historica y puede que la
casa sea un poco
vieja por lo cual es importante hacer la visita tecnica para evaluar las
condiciones de la misma.
Casa No. 2: Precio de Venta $250 Millones , area construida 243 m2,
parqueaderos 1, baños 4, habitaciones 5, Barrio el bosque que se
encontaria ubicado en la comuna 2 de cali es un
barrio de 53 años aprox. donde habitan principalmente personas
pensionadas cobn parques grandes alrededor.
Casa No. 3: Precio de Venta $330 Millones , area construida 260 m2,
parqueaderos 1, baños 3, habitaciones 4, Barrio la merced que se
encontaria ubicado en la comuna 3 de cali empezando
la zona norte de Cali, es una zona de bastante historica y puede que la
casa sea un poco
vieja por lo cual es importante hacer la visita tecnica para evaluar las
condiciones de la misma.
Casa No. 4: Precio de Venta $350 Millones , area construida 346 m2, parqueaderos 1, baños 2, habitaciones 4, Barrio vipasa ubicado en la comuna 3 de cali muy cerca a los cerros el bosque y los altos de menga se conoce por sus multiples parques y sus zonas verdes.
Casa No. 5: Precio de Venta $35 Millones , area construida 202 m2,
parqueaderos 1, baños 4, habitaciones 5, Barrio el bosque que se
encontaria ubicado en la comuna 2 de cali es un
barrio de 53 años aprox. donde habitan principalmente personas
pensionadas cobn parques grandes alrededor.
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?).
DataVivienda <-read.csv("C:/Users/lberm/OneDrive/Documentos/MAESTRIA/MODELOS_APRENDIZAJE_ESTADIS/vivienda.csv")
str(DataVivienda)
## 'data.frame': 8322 obs. of 13 variables:
## $ id : int 8312 8311 8307 8296 8297 8298 8299 8300 8286 8287 ...
## $ zona : chr "Zona Oeste" "Zona Oeste" "Zona Oeste" "Zona Sur" ...
## $ piso : int 4 1 NA 2 NA NA 2 NA NA 2 ...
## $ estrato : int 6 6 5 3 5 5 6 5 5 5 ...
## $ preciom : int 1300 480 1200 220 330 1350 305 480 275 285 ...
## $ areaconst: num 318 300 800 150 112 390 125 280 74 120 ...
## $ parquea : int 2 1 4 1 2 8 2 4 1 2 ...
## $ banios : int 4 4 7 2 4 10 3 4 2 4 ...
## $ habitac : int 2 4 5 4 3 10 3 4 3 3 ...
## $ tipo : chr "Apartamento" "Casa" "Casa" "Casa" ...
## $ barrio : chr "arboleda" "normandía" "miraflores" "el guabal" ...
## $ longitud : num -76576 -76571 -76568 -76565 -76565 ...
## $ latitud : num 3454 3454 3455 3417 3408 ...
####b. Se revisa que la informacion tenga consitencia en los datos antes de hacer los filtros correpondientes, como lo podemos evidencia en tipo Casa tenemos varias connotaciones para casa entonces procedemos a dejar una sola, en el caso Zona si se evidencia un solo nombre para zona norte, Corregimos los diferentes nombres de casa antes de aplicar los filtros:
library(dplyr)
DataVivienda1 <- DataVivienda %>%
mutate(tipo = case_when(
tipo %in% c("CASA", "Casa") ~ "casa",
tipo %in% c("APARTAMENTO", "apto") ~ "Apartamento",
TRUE ~ tipo # Mantén cualquier otro valor tal como está
))
valores_unicos <- unique(DataVivienda1$tipo)
print(valores_unicos)
## [1] "Apartamento" "casa" NA
# filtros punto 1: casas de la zona norte de la ciudad
library(dplyr)
punto_7.1 <- filter(DataVivienda1,zona == "Zona Sur" & tipo == "Apartamento")
head(punto_1, 3)
## id zona estrato preciom areaconst parquea banios habitac tipo
## 1 8088 Zona Norte 3 149 130 NA 2 3 casa
## 2 6812 Zona Norte 4 670 470 4 5 5 casa
## 3 6673 Zona Norte 5 750 300 2 3 5 casa
## barrio longitud latitud
## 1 brisas de los -76555 3417.00
## 2 tejares de san -76545 3.44
## 3 el gran limonar -76544 3397.00
str(punto_7.1)
## 'data.frame': 2786 obs. of 13 variables:
## $ id : int 8299 8286 8287 8288 8228 8229 8191 8192 8193 8199 ...
## $ zona : chr "Zona Sur" "Zona Sur" "Zona Sur" "Zona Sur" ...
## $ piso : int 2 NA 2 1 1 8 NA 5 5 NA ...
## $ estrato : int 6 5 5 5 3 4 6 4 4 6 ...
## $ preciom : int 305 275 285 310 145 240 800 225 310 875 ...
## $ areaconst: num 125 74 120 166 60 90 221 74 100 194 ...
## $ parquea : int 2 1 2 2 1 1 2 1 2 2 ...
## $ banios : int 3 2 4 4 2 2 4 2 2 5 ...
## $ habitac : int 3 3 3 3 3 3 3 3 4 3 ...
## $ tipo : chr "Apartamento" "Apartamento" "Apartamento" "Apartamento" ...
## $ barrio : chr "bella suiza" "valle del lili" "bella suiza" "bella suiza" ...
## $ longitud : num -76565 -76564 -76564 -76564 -76559 ...
## $ latitud : num 3408 3409 3.41 3.41 3386 ...
require(leaflet)
leaflet() %>% addTiles() %>%
setView(lng = -76.51595234451665, lat = 3.436834062816008, zoom = 10) %>%
addCircleMarkers(lng = punto_7.1$longitud,
lat = punto_7.1$latitud,
stroke = FALSE,
fillOpacity = 0.5,
radius = 4,
color = 'red')
#####Se observan con los filtros 2786 datos y en mapa la mayor concentracion de puntos se ubican en la Zona Sur de la ciudad de Cali, si se ven otros dispersos por toda la ciudad esto se debe a varias posibilidades, entre las principales que destaco: el dataframe fue obtenido por la tecnica de web scraping lo que puede generar errores en la obtencion de la data, otro problema es que hay errores de identificacion de los barrios o de las coordenadas del mismo por eso tendria que hacerse una re-verificacion para saber que tan confiable es la data.
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.
library(knitr)
punto_7.2 <-summary(punto_7.1[, c("preciom", "areaconst", "estrato", "banios", "habitac", "zona")])
knitr::kable(punto_7.2, caption = "ANALISIS DE LAS VARIABLES")
| preciom | areaconst | estrato | banios | habitac | zona | |
|---|---|---|---|---|---|---|
| Min. : 75.0 | Min. : 40.00 | Min. :3.00 | Min. :0.000 | Min. :0.000 | Length:2786 | |
| 1st Qu.: 175.0 | 1st Qu.: 65.00 | 1st Qu.:4.00 | 1st Qu.:2.000 | 1st Qu.:3.000 | Class :character | |
| Median : 245.0 | Median : 85.00 | Median :5.00 | Median :2.000 | Median :3.000 | Mode :character | |
| Mean : 297.4 | Mean : 97.49 | Mean :4.63 | Mean :2.489 | Mean :2.966 | NA | |
| 3rd Qu.: 335.0 | 3rd Qu.:110.00 | 3rd Qu.:5.00 | 3rd Qu.:3.000 | 3rd Qu.:3.000 | NA | |
| Max. :1750.0 | Max. :932.00 | Max. :6.00 | Max. :8.000 | Max. :6.000 | NA |
head(punto_7.2)
## preciom areaconst estrato banios
## Min. : 75.0 Min. : 40.00 Min. :3.00 Min. :0.000
## 1st Qu.: 175.0 1st Qu.: 65.00 1st Qu.:4.00 1st Qu.:2.000
## Median : 245.0 Median : 85.00 Median :5.00 Median :2.000
## Mean : 297.4 Mean : 97.49 Mean :4.63 Mean :2.489
## 3rd Qu.: 335.0 3rd Qu.:110.00 3rd Qu.:5.00 3rd Qu.:3.000
## Max. :1750.0 Max. :932.00 Max. :6.00 Max. :8.000
## habitac zona
## Min. :0.000 Length:2786
## 1st Qu.:3.000 Class :character
## Median :3.000 Mode :character
## Mean :2.966
## 3rd Qu.:3.000
## Max. :6.000
punto_7.2 <- DataVivienda[c("preciom", "areaconst", "estrato", "banios", "habitac", "zona")]
punto_7.2_df <- as.data.frame(punto_7.1)
punto_7.2_df <- punto_7.2_df[complete.cases(punto_7.2_df),]
sum(is.na(punto_2.1_df)) # Conteo de valores faltantes
## [1] 0
View(punto_7.2_df)
View(punto_7.2)
library(plotly)
plot <- plot_ly(punto_7.2_df, type = "histogram")
plot <- plot %>% add_trace(x = ~preciom, name = "Precio M2 Casa")
plot
plot <- plot_ly(punto_7.2_df, type = "histogram")
plot <- plot %>% add_trace(x = ~areaconst, name = "Area_construida")
plot
options(warn = -1)
plot_estrato <- plot_ly(data = punto_7.2_df, x = ~estrato, y = ~preciom, color = ~zona,
type = "box", boxpoints = "all",
text = ~paste("Precio:", preciom, "<br>Estrato:", estrato)) %>%
layout(title = "Relación entre Precio y Estrato",
xaxis = list(title = "Estrato"),
yaxis = list(title = "Precio (millones COP)")) %>%
style(marker = list(color = "purple"))
options(warn = 0)
plot_estrato
library(GGally)
corr <-punto_7.2_df[,c("preciom","areaconst","estrato","banios","habitac")]
ggpairs(corr, title="Grafica de correlacion entre variable respuesta(precio) Vs otras variables ")
Precio Vs Area Construida: Correlacion positiva 0.724 lo que indica que ambas variables tienden a incrementarses junta, a Mayor Precio mayor area construida.
Precio Vs Estrato: Correlacion positiva 0.652 lo que indica que ambas variables tienden a incrementarses junta, a Mayor Precio mayor estrato.
Precio Vs Baños: Correlacion positiva 0.715 lo que indica que ambas variables tienden a incrementarses junta, a Mayor Precio mayor estrato.
Precio Vs habitaciones: Correlacion positiva 0.315 (debil) lo que indica que ambas variables tienden a incrementarses pero en una menor proporcion a Mayor Precio mas habitaciones.
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 deber 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).
punto_7.3_MV = lm(preciom ~ areaconst + estrato + banios+ habitac, data = punto_7.2_df )
summary(punto_7.3_MV)
##
## Call:
## lm(formula = preciom ~ areaconst + estrato + banios + habitac,
## data = punto_7.2_df)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1294.48 -45.43 -2.83 40.75 973.04
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -272.20021 18.15035 -14.997 < 2e-16 ***
## areaconst 1.48498 0.06269 23.688 < 2e-16 ***
## estrato 70.45157 3.61505 19.488 < 2e-16 ***
## banios 66.38680 3.94746 16.818 < 2e-16 ***
## habitac -23.24546 4.57897 -5.077 4.23e-07 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 102.2 on 1855 degrees of freedom
## Multiple R-squared: 0.6992, Adjusted R-squared: 0.6985
## F-statistic: 1078 on 4 and 1855 DF, p-value: < 2.2e-16
Precio=−272.20+1.484(areaconst)+70.451(estrato)+66.38(baños)-23.24(habitaciones)
Intercept (Intercepto): El intercepto es el valor esperado de la variable de respuesta cuando todas las variables predictoras son iguales a cero. En este caso, el intercepto es -272.20021, lo que significa que cuando todas las demás variables son cero, el precio medio es de -272.20021. Sin embargo, en la mayoría de los contextos, un precio negativo no tendría sentido, lo que podría indicar un problema en el modelo o en los datos.
areaconst: El coeficiente de “areaconst” es 1.48498. Esto significa que, manteniendo constantes las otras variables, se espera que un aumento de una unidad en “areaconst” esté asociado con un aumento de 1.48498 en el precio medio.
estrato: El coeficiente de “estrato” es 70.45157. Esto significa que, manteniendo constantes las otras variables, se espera que un aumento de una unidad en “estrato” esté asociado con un aumento de 70.45157 en el precio medio.
banios: El coeficiente de “banios” es 66.38680. Esto significa que, manteniendo constantes las otras variables, se espera que un aumento de una unidad en “banios” esté asociado con un aumento de 66.38680 en el precio medio.
habitac: El coeficiente de “habitac” es -23.24546. Esto significa que, manteniendo constantes las otras variables, se espera que un aumento de una unidad en “habitac” esté asociado con una disminución de 23.24546 en el precio medio.
En general, los resultados son lógicos en el sentido de que los coeficientes tienen signos esperados y magnitudes que sugieren relaciones proporcionales. Sin embargo, el intercepto negativo es inusual y podría indicar un problema en el modelo o en los datos.
es igual a 0.6992 lo que obtenemos que hay un 65% que las variables mencionadas tiene relacion con el precio del inmueble.
Hipótesis para ßo:Ho:βo=0,Ha:β0≠0
Donde el P Valor=2.2e−16 Ya que P Valor<0.05 , se rechaza H0:ß0=0
Hipótesis para ß1:H0:β1=0,Ha:β1≠0
P Valor=2.2e−16 Ya que P Valor<0.05 , se rechaza Ho:ß2=0
Hipótesis para ß2:Ho:β2=0,Ha:β2≠0
P Valor=2.2e−16 ya que P Valor<0.05 , se rechaza Ho:ß2=0
Hipótesis para ß3:Ho:β3=0,Ha:β3≠0
P Valor=2.2e−16 Ya que P Valor<0.05 , se rechaza Ho:ß3=0
Para mejorar el modelo podemos plantear quitar o evaluar algunas variables que realmente expliquen de mejor manera el modelo, por ejemplo solo dejar las relaciones posotivas fuertes en este caso precio Vs estrato + baños y con eso determinar si obtenemos un mejor resultado de R2. Tambien podemos hacer pruebas cruzadas para ajustar mejor la ecuacion y la prediccion del modelo de tal manera que nos permita buscar las variables optimas.
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).
par(mfrow = c(2,2))
plot(punto_7.3_MV)
R: Supuesto: La varianza de los residuos es constante a lo largo de los valores de las variables predictoras.
Validación:
residuos <- residuals(punto_7.3_MV)
valores_ajustados <- fitted(punto_7.3_MV)
plot(valores_ajustados, residuos, col = "blue", main = "Grafico de Residuos vs. Valores Ajustados")
abline(h = 0, col = "red")
Aplicacion de prueba de Breusch-Pagan
library(lmtest)
resultado_bp <- bptest(punto_7.3_MV)
print(resultado_bp)
##
## studentized Breusch-Pagan test
##
## data: punto_7.3_MV
## BP = 749.72, df = 4, p-value < 2.2e-16
La hipótesis nula (H0) en el test de Breusch-Pagan es que no hay heteroscedasticidad, lo que significa que la varianza de los errores es constante (homocedasticidad). La hipótesis alternativa (H1) es que hay heteroscedasticidad, es decir, la varianza de los errores no es constante y varía con respecto a una o más variables predictoras.
Dado que el valor p es muy pequeño (p-value < 2.2e-16), podemos rechazar la hipótesis nula (H0) y concluir que hay evidencia suficiente para afirmar que existe heteroscedasticidad en el modelo de regresión. En otras palabras, la varianza de los errores no es constante en todas las combinaciones de valores de las variables predictoras, lo que sugiere que el modelo de regresión lineal puede no ser adecuado para describir los datos correctamente.
En este caso tendriamos que considerar la posibilidad de transformar las variables o utilizar técnicas alternativas para abordar el problema.
Con el modelo identificado debe predecir el precio de la vivienda con las características de la primera solicitud.
punto_5 <- DataVivienda1[c("tipo","areaconst","parquea", "banios", "habitac","estrato", "zona","preciom")]
punto_5df <- as.data.frame(punto_5)
punto_5df <- punto_5df[complete.cases(punto_5df),]
sum(is.na(punto_5df)) # Conteo de valores faltantes
## [1] 0
punto_7.5_MV = lm(preciom ~ areaconst + estrato + banios+ habitac+tipo+parquea+zona,data = punto_5df )
summary(punto_7.5_MV)
##
## Call:
## lm(formula = preciom ~ areaconst + estrato + banios + habitac +
## tipo + parquea + zona, data = punto_5df)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1488.92 -84.59 -11.64 57.49 1018.00
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -246.00687 24.84273 -9.903 < 2e-16 ***
## areaconst 0.88111 0.02277 38.696 < 2e-16 ***
## estrato 83.40364 3.03554 27.476 < 2e-16 ***
## banios 61.09020 2.57666 23.709 < 2e-16 ***
## habitac -27.53702 2.27477 -12.105 < 2e-16 ***
## tipocasa -24.35638 6.05323 -4.024 5.79e-05 ***
## parquea 75.21846 2.51375 29.923 < 2e-16 ***
## zonaZona Norte -103.19182 22.38207 -4.610 4.09e-06 ***
## zonaZona Oeste 17.25003 23.17100 0.744 0.4566
## zonaZona Oriente -52.09916 25.34955 -2.055 0.0399 *
## zonaZona Sur -94.65016 22.13295 -4.276 1.93e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 171.7 on 6706 degrees of freedom
## Multiple R-squared: 0.7378, Adjusted R-squared: 0.7374
## F-statistic: 1887 on 10 and 6706 DF, p-value: < 2.2e-16
predict(punto_7.5_MV,list(tipo ="Apartamento",areaconst=300,parquea=3, banios=3, habitac= 5,estrato=(6),zona="Zona Sur"))
## 1
## 695.3382
El precio para un inmueble de las caracteristicas descritas tendria un precio aproximado de $ 695 Millones.
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.
punto_7.6 <- filter(DataVivienda1, tipo =="Apartamento" & zona =="Zona Sur" & banios>=3 & parquea>=3 & habitac>=5 & estrato >=4 & areaconst>=300 & preciom <=850)
punto_7.6df <- as.data.frame(punto_7.6)
punto_7.6df <- punto_7.6df[complete.cases(punto_7.6df),]
sum(is.na(punto_6df)) # Conteo de valores faltantes
## [1] 0
punto_7.6df <- head(punto_7.6df, 5)
head(punto_7.6df, 10)
## [1] id zona piso estrato preciom areaconst parquea
## [8] banios habitac tipo barrio longitud latitud
## <0 rows> (or 0-length row.names)
leaflet() %>% addTiles() %>%
setView(lng = -76.51595234451665, lat = 3.436834062816008, zoom = 10) %>%
addCircleMarkers(lng = punto_7.6df$longitud,
lat = punto_7.6df$latitud,
stroke = FALSE,
fillOpacity = 0.5,
radius = 7,
color = 'blue')
Con los fitros solicitados por el cliente obtuvimos 3 potenciales propiedades que podrian definirse asi,
Apartamento No. 1: Precio de Venta $730 Millones , area construida
573 m2, parqueaderos 3,
baños 8, habitaciones 5, Barrio Guadalupe ubicado en la comuna 19 de
cali en el sector hay clases socioeconómicas media y alta en el extremo
sur de la ciudad.
Apartamento No. 2: Precio de Venta $670 Millones , area construida
300 m2, parqueaderos 3,
baños 5, habitaciones 6, Barrio seminario ubicado en la comuna 19 de
cali en el sector hay clases socioeconómicas media y alta en el extremo
sur de la ciudad.