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:
En relación a lo solicitado le recomiendo las siguientes viviendas, se pueden identificar en la base de datos por medio del id. Para ver su ubicación en el mapa pueden ver el anexo.
ID: 4210 Precio: 350 Área: 200 Estrato: 5 Parq: 3 Hab: 4 Baños: 3
Excede en parqueaderos y baños a lo solicitado por el cliente, pero en el resto de demandas cumple a cabalidad, los parqueaderos y baños de más pueden ofrecer mayor comodidad al cliente.
ID: 1108 Precio: 330 Área: 260 Estrato: 4 Parq: 1 Hab: 4 Baños: 3
Este inmueble es una buena opción si el cliente busca economía, el precio es menor al pre-aprobado con el que cuenta, tiene un área grande respecto a las demás casas ofertadas , lo que se puede ver reflejado en mayor comodidad y espacios, el estrato es 4 lo que le permitirá ahorrar en ciertos cobros fijos de la casa.
ID: 1842 Precio: 350 Área: 240 Estrato: 5 Parq: 2 Hab: 4 Baños: 3
Este inmueble excede en 40 metros cuadrados lo solicitado en área pero no es un perjuicio, cumple con el valor, estrato y habitaciones solicitados. tiene un parqueadero y un baño más al requerido por el cliente.
ID: 1943 Precio: 350 Área: 346 Estrato: 5 Parq: 1 Hab: 4 Baños: 2
Tiene el área más grande de las casas ofertadas, en el resto de condiciones las cumple según los requisitos del cliente.
ID: 819 Precio: 350 Área: 264 Estrato: 5 Parq: 2 Hab: 4 Baños: 3
Este predio es similar a los ya presentados pero se ubica en un sector diferente a los demás cumple con el precio, estrato y habitaciones, y en el resto de condiciones no genera un perjuicio.
Estas cinco propuestas pueden ser de interés para el cliente según sus condicones y muestran relación directa con los datos recolectados y el modelo establecido.
D: 5574 Precio: 850 Área: 352 Estrato: 6 Parq: 4 Hab: 3 Baños: 3
Excede en parqueaderos a lo solicitado por el cliente, en el precio, baños y estrato cumple a cabalidad, el área es mayor a lo solicitado, pero en la cantidad de habitaciones no cumple la condición.
ID: 6205 Precio: 350 Área: 260 Estrato: 5 Parq: 3 Hab: 3 Baños: 3
Este inmueble es una buena opción si el cliente busca economía, el precio es menor al pre-aprobado con el que cuenta, tiene un área grande respecto a lo que solicita, lo que se puede ver reflejado en mayor comodidad y espacios, cumple las condiciones de estrato, baños y parqueaderos. No cuenta con la cantidad de habitaciones solicitadas.
ID: 7680 Precio: 450 Área: 267 Estrato: 5 Parq: 3 Hab: 3 Baños: 3
Este inmueble es 33 metros cuadrados menor al tamaño solicitado en área, cumple con el valor, estrato, parqueaderos y baños solicitados. El precio es casi la mitad del pre-aprobado, y la cantidad de habitaciones es inferior a lo solicitado.
Precio: 670 Área: 300 Estrato: 5 Parq: 3 Hab: 6 Baños: 5
Cumple con los requisitos para área, parqueaderos y estrato, excede en habitaciones y baños, pero el precio es más económico que el pronosticado. Su tendencia es a ubicarse más al centro de la ciudad.
Estas cuatro propuestas pueden ser de interés para el cliente según sus condicones y muestran relación directa con los datos recolectados y el modelo establecido.
Teniendo en cuenta la solicitud que hace la inmobiliaria y las condiciones establecidas por los clientes, se creará un modelo de predicción que genere un precio aproximado de una vivienda según dichas condiciones, para tal fin se utilizará un proceso de regresión múltiple, analizando los datos, luego se probará el modelo y por último generará una predicción.
Después de eso se hará un filtrado de la base de datos que incluya las condiciones para ambos casos, usando la información de la ubicación de los inmueble y la librería leaflet se proporcionará la ubicación de algunos inmuebles en el mapa de la ciudad para que la inmobiliaria pueda asesorar con base en los datos a su cliente.
# crear un dataframe con los datos brindados
install.packages("devtools") # solo la primera vez
## Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.3'
## (as 'lib' is unspecified)
devtools::install_github("dgonxalex80/paqueteMODELOS", force =TRUE)
## Downloading GitHub repo dgonxalex80/paqueteMODELOS@HEAD
##
## ── R CMD build ─────────────────────────────────────────────────────────────────
##
checking for file ‘/tmp/RtmpRj5EOB/remotes3044c10425d/dgonxalex80-paqueteMODELOS-5d8d1fe/DESCRIPTION’ ...
✔ checking for file ‘/tmp/RtmpRj5EOB/remotes3044c10425d/dgonxalex80-paqueteMODELOS-5d8d1fe/DESCRIPTION’ (379ms)
## ─ preparing ‘paqueteMODELOS’:
## ✔ checking DESCRIPTION meta-information
## ─ checking for LF line-endings in source and make files and shell scripts
## ─ checking for empty or unneeded directories
## ─ building ‘paqueteMODELOS_0.1.0.tar.gz’
##
Warning: invalid uid value replaced by that for user 'nobody'
##
##
## Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.3'
## (as 'lib' is unspecified)
library(paqueteMODELOS)
## Loading required package: boot
## Loading required package: broom
## Loading required package: GGally
## Loading required package: ggplot2
## Registered S3 method overwritten by 'GGally':
## method from
## +.gg ggplot2
## Loading required package: gridExtra
## Loading required package: knitr
## Loading required package: summarytools
## Warning in fun(libname, pkgname): couldn't connect to display ":0"
## system might not have X11 capabilities; in case of errors when using dfSummary(), set st_options(use.x11 = FALSE)
data("vivienda")
head(vivienda)
## # A tibble: 6 × 13
## id zona piso estrato preciom areaconst parqueaderos banios habitaciones
## <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1147 Zona O… <NA> 3 250 70 1 3 6
## 2 1169 Zona O… <NA> 3 320 120 1 2 3
## 3 1350 Zona O… <NA> 3 350 220 2 2 4
## 4 5992 Zona S… 02 4 400 280 3 5 3
## 5 1212 Zona N… 01 5 260 90 1 2 3
## 6 1724 Zona N… 01 5 240 87 1 3 3
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
# Observación del resumen de los datos
summary(vivienda)
## id zona piso estrato
## Min. : 1 Length:8322 Length:8322 Min. :3.000
## 1st Qu.:2080 Class :character Class :character 1st Qu.:4.000
## Median :4160 Mode :character Mode :character Median :5.000
## Mean :4160 Mean :4.634
## 3rd Qu.:6240 3rd Qu.:5.000
## Max. :8319 Max. :6.000
## NA's :3 NA's :3
## preciom areaconst parqueaderos banios
## Min. : 58.0 Min. : 30.0 Min. : 1.000 Min. : 0.000
## 1st Qu.: 220.0 1st Qu.: 80.0 1st Qu.: 1.000 1st Qu.: 2.000
## Median : 330.0 Median : 123.0 Median : 2.000 Median : 3.000
## Mean : 433.9 Mean : 174.9 Mean : 1.835 Mean : 3.111
## 3rd Qu.: 540.0 3rd Qu.: 229.0 3rd Qu.: 2.000 3rd Qu.: 4.000
## Max. :1999.0 Max. :1745.0 Max. :10.000 Max. :10.000
## NA's :2 NA's :3 NA's :1605 NA's :3
## habitaciones tipo barrio longitud
## Min. : 0.000 Length:8322 Length:8322 Min. :-76.59
## 1st Qu.: 3.000 Class :character Class :character 1st Qu.:-76.54
## Median : 3.000 Mode :character Mode :character Median :-76.53
## Mean : 3.605 Mean :-76.53
## 3rd Qu.: 4.000 3rd Qu.:-76.52
## Max. :10.000 Max. :-76.46
## NA's :3 NA's :3
## latitud
## Min. :3.333
## 1st Qu.:3.381
## Median :3.416
## Mean :3.418
## 3rd Qu.:3.452
## Max. :3.498
## NA's :3
# Reemplazar los valores NA en la columna "parqueaderos" con 0
vivienda$parqueaderos <- ifelse(is.na(vivienda$parqueaderos), 0, vivienda$parqueaderos)
# Eliminar filas con valores faltantes
dfv <- na.omit(vivienda)
summary(dfv)
## id zona piso estrato
## Min. : 1 Length:5684 Length:5684 Min. :3.000
## 1st Qu.:2141 Class :character Class :character 1st Qu.:4.000
## Median :4232 Mode :character Mode :character Median :5.000
## Mean :4209 Mean :4.659
## 3rd Qu.:6265 3rd Qu.:5.000
## Max. :8316 Max. :6.000
## preciom areaconst parqueaderos banios
## Min. : 58.0 Min. : 35.0 Min. : 0.000 Min. : 0.000
## 1st Qu.: 217.5 1st Qu.: 78.0 1st Qu.: 1.000 1st Qu.: 2.000
## Median : 320.0 Median : 117.0 Median : 1.000 Median : 3.000
## Mean : 423.7 Mean : 167.9 Mean : 1.535 Mean : 3.087
## 3rd Qu.: 520.0 3rd Qu.: 217.0 3rd Qu.: 2.000 3rd Qu.: 4.000
## Max. :1999.0 Max. :1500.0 Max. :10.000 Max. :10.000
## habitaciones tipo barrio longitud
## Min. : 0.000 Length:5684 Length:5684 Min. :-76.59
## 1st Qu.: 3.000 Class :character Class :character 1st Qu.:-76.54
## Median : 3.000 Mode :character Mode :character Median :-76.53
## Mean : 3.555 Mean :-76.53
## 3rd Qu.: 4.000 3rd Qu.:-76.52
## Max. :10.000 Max. :-76.46
## latitud
## Min. :3.333
## 1st Qu.:3.380
## Median :3.413
## Mean :3.416
## 3rd Qu.:3.452
## Max. :3.498
# Verificar el tipo de datos en cada columna del dataframe
tipos <- sapply(dfv, class)
print(tipos)
## id zona piso estrato preciom areaconst
## "numeric" "character" "character" "numeric" "numeric" "numeric"
## parqueaderos banios habitaciones tipo barrio longitud
## "numeric" "numeric" "numeric" "character" "character" "numeric"
## latitud
## "numeric"
# Cargar librerias
library(dplyr)
##
## Attaching package: 'dplyr'
## The following object is masked from 'package:gridExtra':
##
## combine
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(ggplot2)
library(leaflet)
library(leaflet.extras)
# Filtrar por tipo "casa" y zona "norte"
vivienda_filtrada <- vivienda %>%
filter(tipo == "Casa", zona == "Zona Norte")
vf3 <- vivienda_filtrada[1:3, ]
vf3
## # A tibble: 3 × 13
## id zona piso estrato preciom areaconst parqueaderos banios habitaciones
## <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1209 Zona N… 02 5 320 150 2 4 6
## 2 1592 Zona N… 02 5 780 380 2 3 3
## 3 4057 Zona N… 02 6 750 445 0 7 6
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
# Verificación usando gráficos
# Crear el gráfico de barras
grafico_barras <- ggplot(vivienda_filtrada, aes(x = tipo, fill = tipo)) +
geom_bar() +
labs(title = "Distribución de Tipos de Propiedades en la Zona Norte",
x = "Tipo de Propiedad",
y = "Cantidad de Registros") +
theme_minimal()
# Mostrar el gráfico
print(grafico_barras)
Se verifica que en la data filtrada las propiedades de la Zona Norte son
Casas.
# Crear el mapa con puntos de ubicación
mapa_puntos <- leaflet(vivienda_filtrada) %>%
addTiles() %>%
addMarkers(lng = ~longitud, lat = ~latitud, popup = ~paste("Zona:", zona)) # añado al popup la zona para verificar que corresponda a la Zona norte
# Mostrar el mapa
mapa_puntos
Al observar la gran cantidad de puntos es claro que no sólo se ubican en la zona norte de la ciudad, voy a crear un mapa de calor para observar de forma más limpia la distribución de los inmuebles de la “zona norte”.
# Crear un objeto de mapa
mapa_calor <- leaflet(vivienda_filtrada) %>%
addTiles() %>%
addHeatmap(lng = ~longitud, lat = ~latitud, intensity = 7, radius = 10)
# Mostrar el mapa de calor
mapa_calor
Como se puede verificar al interactuar con el mapa, las casas no sólo se ubican en la zona norte, a pesar de que están etiquetadas en esta zona.
Si el registro de las viviendas es creado por los usuarios en la página web, puede que los errores están relacionados con fallas en la misma creación de las publicaciones, es decir que los usuarios pueden poner equivocadamente la ubicación del lugar, o puede que si la localización de los inmuebles se hace desde una aplicación de GPS usando la dirección, se generen errores en ella.
#librerias
library(plotly)
##
## 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
library(dplyr)
library(GGally)
Para el análisis exploratorio se crearán un pairplot que muestre los gráficos de correlación entre las variables cuantitativas de la base de datos y un heatmap que muestre gráficamente el valor de la correlación entre la variable respuesta -precio del inmueble- con respecto al resto de variables.
# Seleccionar las variables de interés para el pair plot
variables_interes <- vivienda_filtrada %>% select(preciom, areaconst, estrato, banios, habitaciones, parqueaderos)
# Crear el pair plot
pair_plot <- ggpairs(variables_interes)
# Mostrar el pair plot
print(pair_plot)
# Seleccionar las variables cuantitativas
variables_heatmap <- vivienda_filtrada[, c("preciom", "areaconst", "estrato", "banios", "habitaciones", "parqueaderos")]
# matriz de correlación
correlacion <- cor(variables_heatmap)
# heatmap
heatmap <- plot_ly(z = correlacion,
x = colnames(correlacion),
y = colnames(correlacion),
type = "heatmap",
colorscale = "Viridis",
text = round(correlacion, 2))
# Personalizar el layout
layout <- list(title = "Matriz de Correlación entre Precio y Variables Cuantitativas",
xaxis = list(title = ""),
yaxis = list(title = ""))
# Crear la figura
figura_h <- subplot(heatmap, margin = 0.05) %>% layout(layout)
# Mostrar el heatmap
figura_h
Como se puede observar en los gráficos el precio de los inmuebles se correlaciona de mejor manera con el área contruida con 73%, Quiere decir que la correlación entre estas dos variables son positivas fuertes, reflejado en que las propiedades más grandes son más caras y visceversa.
Estrato y baños tienen una correlación dl 61% y 52%, respectivamente, mostrando ser positivas moderadas para explicar el precios de los inmuebles en esta zoana de la ciudad.
El precio se relaciona de forma positiva pero moderada con el estrato, en este caso con un 61% de correlación. Lo que significa que en promedio cada que se aumenta de estrato el precio aumenta en 61%.
Las habitaciones y parqueaderos explican en menor medida la relación con el precio con un 32% de correlación, en ambos casos. Quiere decir que son factores que no se consideran importantes, estadísticamente hablando, para el avaluo del predio. Estas variables son de tener en cuenta, pues son las que menos se relacionan con las demás.
Es importante tener presente que la correlación no implica causalidad y no se puede concluir a ciencia cierta la influencia de las variables en el precio. Por ejemplo, no es de descartar que en los estratos más altos no siempre están las casas más grandes (cor=45%) es por eso que las inmobiliarias deben identifcar aspectos adicionales relacionados con la experiencia de las personas que habitan las viviendas y que puedan generar valor.
# Definir las variables predictoras y la variable de respuesta
variables_predictoras <- vivienda_filtrada[, c("areaconst", "estrato", "habitaciones", "parqueaderos", "banios")]
variable_respuesta <- vivienda_filtrada$preciom
# Ajustar el modelo de regresión lineal múltiple
modelo_regresion <- lm(variable_respuesta ~ ., data = cbind(variable_respuesta, variables_predictoras))
# Obtener un resumen del modelo
summary(modelo_regresion)
##
## Call:
## lm(formula = variable_respuesta ~ ., data = cbind(variable_respuesta,
## variables_predictoras))
##
## Residuals:
## Min 1Q Median 3Q Max
## -964.04 -80.10 -17.08 50.06 1069.45
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -236.47551 30.36582 -7.788 2.40e-14 ***
## areaconst 0.82677 0.04368 18.926 < 2e-16 ***
## estrato 86.42579 7.39747 11.683 < 2e-16 ***
## habitaciones 1.44443 4.16411 0.347 0.729
## parqueaderos -1.67672 4.31505 -0.389 0.698
## banios 26.97978 5.34384 5.049 5.65e-07 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 159.1 on 716 degrees of freedom
## Multiple R-squared: 0.6508, Adjusted R-squared: 0.6484
## F-statistic: 266.9 on 5 and 716 DF, p-value: < 2.2e-16
##Análisis de coheficientes significativos:
Al observar los valores Pr se puede verificar que todas las variables son significativas para explicar el precio, sin embargo al interpretar en el contexto se pueden infereir elementos adicionales como:
Por cada unidad que aumenta en metros cuadrados el área del inmueble, el precio aumenta en 0.82 millones de pesos. Lo que significa que el área de un inmueble impacta de forma muy significativa y casi directa en el precio del mismo.
Por cada estrato que aumenta el inmueble, el precio de la vivienda aumenta en promedio 86 millones de pesos aproximadamente, este valor es significativo para comprender el sector inmobiliario en la zona de la ciudad.
Por cada habitación y baño que tenga la vivienda su precio aumenta en promedio 1.4 y 26 millones de pesos, respectivamente, estos es indicador de la fuerte relación de estas variables con el precio de los inmuebles. Y lo llamativo que es que impacta más en el precio la cantidad de baños que de habitaciones
Por cada parqueadero adicional el precio del inmueble baja en promedio 1.67 millones, por lo tanto a más parqueaderos, el precio puede que se vea disminuido. Este resultado puede ser el menos lógico, sin embargo, como se puede ver en el pairplot de la pregunta anterior, algunas viviendas que tienen las mismas áreas difieren en la cantidad de parqueaderos, esto puede restar metraje para habitar, lo que podría ser incómodo en algunos casos o requerir de modificaciones que resultarían en gastos adicionales, lo que devaluaría el costo de venta.
No tiene logica analizar el valor del intercepto pues supone que las variables son 0 y no veo que aporte el revisar un inmueble de 0 metros cuadrados por ejemplo.
##Interpretación de los coeficientes R2 El R2 múltiple es de 0.73, lo que significa que en conjunto las variables consideradas explican el 73% de la variación del precio de los inmuebles. Además el R2 ajustado es practicamnete el mismo, por lo que no hay variables irrelevantes en este caso.
Algo importante de revisar es que el 73% es una cantidad moderadamente buena para la explicación, pero seguramente hay más variables que puedan explicar también el precio de los inmuebles.
##Discusión del modelo Como se pudo observer con las varables predictorias tenemos una explicación moderada de la variación del precio. Ahora, para discutir el modelo se revisarán los residuales y el estadístico F. Esto hace parte de la validación de supuestos así que lo desarrollaré en el siguiente punto.
##Estadísitico F Como se puede ver el valor p es casi 0 lo que significa que el modelo es significativo para predecir, además, el valor de F es 267, lo que muestra un valor alto de comparación entre la variabilidad explicada y no explicada por el modelo.
##Residuales Se graficarán los residuales para observar su comportamiento, se aplicarán pruebas de normalidad para concluir sobre su disposción y aporte para reconocer el modelo como optimo.
# Obtener los residuales del modelo
residuales <- resid(modelo_regresion)
# Crear un histograma de los residuales
hist(residuales, breaks = 20, col = "#76EEC6", main = "Histograma de Residuales")
El gráfico muestra una acumulación de datos en el centro, sin embargo
esta acumulación es mayor que la demostrada por una distribución normal
teórica.
# Crear un Q-Q plot de los residuales
qqnorm(residuales)
qqline(residuales)
Como se puede observar en el Q-Q plot, no se observa una aproximación a la linea recta diagonal con los puntos de los cuantiles teoricos y los observados, otro indicio de que la distribución de los residuos nos es normal.
# Gráfico de residuales vs. valores ajustados
plot(modelo_regresion$fitted.values, residuales,
xlab = "Valores Ajustados", ylab = "Residuales",
main = "Gráfico de Residuales vs. Valores Ajustados")
abline(h = 0, col = "red", lty = 2)
la heterocedasticidad se puede verificar al observar una forma de
abanico en la distribución de los puntos en un grafico de residuales
frente a valores ajustados, en este caso se corrobora dicha forma, que
muetra de otra manera que la distribución de los residuos no es
normal.
library(lmtest)
## Loading required package: zoo
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
bptest(modelo_regresion)
##
## studentized Breusch-Pagan test
##
## data: modelo_regresion
## BP = 139, df = 5, p-value < 2.2e-16
Con esta prueba de homocedasticidad se encuentra evidencia estadística fuerte de que el modelo no produjo residuales que tengan variación constante.
# Aplicar la prueba de Kolmogorov-Smirnov
resultado_ks <- ks.test(residuales, "pnorm")
## Warning in ks.test.default(residuales, "pnorm"): ties should not be present for
## the Kolmogorov-Smirnov test
# Mostrar el resultado de la prueba
print(resultado_ks)
##
## Asymptotic one-sample Kolmogorov-Smirnov test
##
## data: residuales
## D = 0.56275, p-value < 2.2e-16
## alternative hypothesis: two-sided
Como se puede observar en las gráficas y pruebas realizadas, hay evidencia para inferir que los residuos no siguen una distribución normal, por lo que sería viable hacer una trasnformación en los datos que permita mejorar la homocedasticidad de los mismos(transformación logarítmica, raiz, box-cox u otra) o incuso se podrían probar otros modelos más robustos como una regresión de minimos cuadrados usando medianas, o algún otro que permita omitir la influencia de los valores atípicos.
# Crear un nuevo conjunto de datos con las características del inmueble
nuevo_inmueble4 <- data.frame(
areaconst = 200,
parqueaderos = 1,
banios = 2,
habitaciones = 4,
estrato = 4
)
nuevo_inmueble5 <- data.frame(
areaconst = 200,
parqueaderos = 1,
banios = 2,
habitaciones = 4,
estrato = 5
)
# Realizar la predicción utilizando el modelo de regresión
prediccion4 <- predict(modelo_regresion, nuevo_inmueble4)
prediccion5 <- predict(modelo_regresion, nuevo_inmueble5)
# Mostrar el valor predicho del inmueble
print(prediccion4)
## 1
## 332.643
print(prediccion5)
## 1
## 419.0688
Teniendo en cuenta el modelo con las características del inmueble solcitado se predicen dos precios, para estrato 4 de 333 millones de pesos, 17 millones por debajo del crédito pre-aprobado, por lo que sería posible encontrar viviendas en la zona con dichas condiciones. Para estrato 5 de 419 millones, que superaría por 69 millones el crédito pre-aprobado por lo que no sería opción.
# Filtrar el DataFrame para incluir solo las observaciones que cumplen con las condiciones
condiciones_filtradas <- vivienda_filtrada %>%
filter(preciom %in% c(330, 350),
estrato %in% c(4, 5),
parqueaderos >= 1,
areaconst >= 200,
habitaciones == 4,
banios >= 2)
# Crear el mapa con puntos de ubicación para las observaciones que cumplen con las condiciones
mapa_puntos_filtrado <- leaflet(condiciones_filtradas) %>%
addTiles() %>%
addMarkers(lng = ~longitud, lat = ~latitud,
popup = ~paste(
"ID:", id,
"<br>Precio:", preciom,
"<br>Área:", areaconst,
"<br>Estrato:", estrato,
"<br>Parq:", parqueaderos,
"<br>Hab:", habitaciones,
"<br>Baños:", banios
))
# Mostrar el mapa con los puntos de ubicación filtrados
mapa_puntos_filtrado
En el mapa se pueden ver las casas de la zona norte cuyo precio está entre 330 y 350 millones de pesos, estratos 4 y 5, con mínimo un parqueadero, área construida de mímino 200 metros cuadrados, cuatro habitaciones y 2 o más baños. Cada una tiene su ID para que el asesor de la inmobiliaria pueda acceder a ella en la base de datos con facilidad. Se cumplen con la solicitud del cliente en los mínimos y se tienen en cuenta casas con algunas mejores condiciones a las solciitadas para su consideración, ejemplo:
ID: 4210 Precio: 350 Área: 200 Estrato: 5 Parq: 3 Hab: 4 Baños: 3
Excede en parqueaderos y baños a lo solicitado por el cliente, pero en el resto de demandas cumple a cabalidad, los parqueaderos y baños de más pueden ofrecer mayor comodidad al cliente.
ID: 1108 Precio: 330 Área: 260 Estrato: 4 Parq: 1 Hab: 4 Baños: 3
Este inmueble es una buena opción si el cliente busca economía, el precio es menor al pre-aprobado con el que cuenta, tiene un área grande respecto a las demás casas ofertadas , lo que se puede ver reflejado en mayor comodidad y espacios, el estrato es 4 lo que le permitirá ahorrar en ciertos cobros fijos de la casa.
ID: 1842 Precio: 350 Área: 240 Estrato: 5 Parq: 2 Hab: 4 Baños: 3
Este inmueble excede en 40 metros cuadrados lo solicitado en área pero no es un perjuicio, cumple con el valor, estrato y habitaciones solicitados. tiene un parqueadero y un baño más al requerido por el cliente.
ID: 1943 Precio: 350 Área: 346 Estrato: 5 Parq: 1 Hab: 4 Baños: 2
Tiene el área más grande de las casas ofertadas, en el resto de condiciones las cumple según los requisitos del cliente.
ID: 819 Precio: 350 Área: 264 Estrato: 5 Parq: 2 Hab: 4 Baños: 3
Este predio es similar a los ya presentados pero se ubica en un sector diferente a los demás cumple con el precio, estrato y habitaciones, y en el resto de condiciones no genera un perjuicio.
Estas cinco propuestas pueden ser de interés para el cliente según sus condicones y muestran relación directa con los datos recolectados y el modelo establecido.
# Filtrar por tipo "apartamento" y zona "sur"
vivienda_filtrada2 <- vivienda %>%
filter(tipo == "Apartamento", zona == "Zona Sur")
vf32 <- vivienda_filtrada2[1:3, ]
vf32
## # A tibble: 3 × 13
## id zona piso estrato preciom areaconst parqueaderos banios habitaciones
## <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 5098 Zona S… 05 4 290 96 1 2 3
## 2 698 Zona S… 02 3 78 40 1 1 2
## 3 8199 Zona S… <NA> 6 875 194 2 5 3
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
# Verificación usando gráficos
# Crear el gráfico de barras
grafico_barras2 <- ggplot(vivienda_filtrada2, aes(x = tipo, fill = tipo)) +
geom_bar() +
labs(title = "Distribución de Tipos de Propiedades en la Zona Sur",
x = "Tipo de Propiedad",
y = "Cantidad de Registros") +
theme_minimal()
# Mostrar el gráfico
print(grafico_barras2)
Se verifica que el tipo de inmueble son Apartamentos de la Zona Sur
# Crear un objeto de mapa
mapa_calor2 <- leaflet(vivienda_filtrada2) %>%
addTiles() %>%
addHeatmap(lng = ~longitud, lat = ~latitud, intensity = 7, radius = 10)
# Mostrar el mapa de calor
mapa_calor2
Se puede observar que siguen apareciendo inmuebles de la zona Norte a pesar de haber hecho el filtrado, sin embargo la zona con más densidad de apartamentos es la Sur.
Para el análisis exploratorio se crearán un pairplot que muestre los gráficos de correlación entre las variables cuantitativas de la base de datos y un heatmap que muestre gráficamente el valor de la correlación entre la variable respuesta -precio del inmueble- con respecto al resto de variables.
# Seleccionar las variables de interés para el pair plot
variables_interes2 <- vivienda_filtrada2 %>% select(preciom, areaconst, estrato, banios, habitaciones, parqueaderos)
# Crear el pair plot
pair_plot2 <- ggpairs(variables_interes2)
# Mostrar el pair plot
print(pair_plot2)
# Seleccionar las variables cuantitativas
variables_heatmap2 <- vivienda_filtrada2[, c("preciom", "areaconst", "estrato", "banios", "habitaciones", "parqueaderos")]
# matriz de correlación
correlacion2 <- cor(variables_heatmap2)
# heatmap
heatmap2 <- plot_ly(z = correlacion2,
x = colnames(correlacion2),
y = colnames(correlacion2),
type = "heatmap",
colorscale = "Viridis",
text = round(correlacion2, 2))
# Personalizar el layout
layout2 <- list(title = "Matriz de Correlación entre Precio y Variables Cuantitativas",
xaxis = list(title = ""),
yaxis = list(title = ""))
# Crear la figura
figura_h2 <- subplot(heatmap2, margin = 0.05) %>% layout(layout2)
# Mostrar el heatmap
figura_h2
Como se puede observar en los gráficos el precio de los inmuebles se correlaciona de mejor manera con el área contruida y la canidad de baños con 75% y 72%, respectivamente, Quiere decir que la correlación entre estas dos variables con el precio son positivas fuertes, reflejado en que las propiedades más grandes y con más baños son más caras y visceversa.
Estrato y parqueaderos tienen una correlación del 67%, mostrando ser positivas moderadas para explicar el precios de los inmuebles en esta zoana de la ciudad.
Las habitaciones explican en menor medida la relación con el precio con un 33% de correlación. Quiere decir que son factores que no se consideran importantes, estadísticamente hablando, para el avaluo del predio. Estas variables son de tener en cuenta, pues son las que menos se relacionan con las demás.
Es importante tener presente que la correlación no implica causalidad y no se puede concluir a ciencia cierta la influencia de las variables en el precio. Por ejemplo, no es de descartar que en los estratos más altos no siempre están las casas más grandes (cor=48%) es por eso que las inmobiliarias deben identifcar aspectos adicionales relacionados con la experiencia de las personas que habitan las viviendas y que puedan generar valor.
##Ahora se desarrollará el modelo de regresión lineal múltiple
# Definir las variables predictoras y la variable de respuesta
variables_predictoras2 <- vivienda_filtrada2[, c("areaconst", "estrato", "habitaciones", "parqueaderos", "banios")]
variable_respuesta2 <- vivienda_filtrada2$preciom
# Ajustar el modelo de regresión lineal múltiple
modelo_regresion2 <- lm(variable_respuesta2 ~ ., data = cbind(variable_respuesta2, variables_predictoras2))
# Obtener un resumen del modelo
summary(modelo_regresion2)
##
## Call:
## lm(formula = variable_respuesta2 ~ ., data = cbind(variable_respuesta2,
## variables_predictoras2))
##
## Residuals:
## Min 1Q Median 3Q Max
## -1252.31 -42.15 -2.06 36.32 934.06
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -221.04614 13.47771 -16.401 < 2e-16 ***
## areaconst 1.46061 0.04876 29.956 < 2e-16 ***
## estrato 57.00608 2.79648 20.385 < 2e-16 ***
## habitaciones -22.71789 3.39549 -6.691 2.68e-11 ***
## parqueaderos 48.36353 3.02343 15.996 < 2e-16 ***
## banios 48.60871 3.04050 15.987 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 95.17 on 2781 degrees of freedom
## Multiple R-squared: 0.7536, Adjusted R-squared: 0.7531
## F-statistic: 1701 on 5 and 2781 DF, p-value: < 2.2e-16
##Análisis de coheficientes significativos:
Al observar los valores Pr se puede verificar que todas las variables son significativas para explicar el precio, sin embargo al interpretar en el contexto se pueden inferir elementos adicionales como:
Por cada unidad que aumenta en metros cuadrados el área del inmueble, el precio aumenta en 1.42 millones de pesos. Lo que significa que el área de un inmueble impacta de forma muy significativa y casi directa en el precio del mismo.
Por cada estrato que aumenta el inmueble, el precio de la vivienda aumenta en promedio 57 millones de pesos aproximadamente, este valor es significativo para comprender el sector inmobiliario en la zona de la ciudad.
Por cada parqueadero y baño que tenga la vivienda su precio aumenta en promedio 48 y 49 millones de pesos, respectivamente, esto es indicador de la fuerte relación de estas variables con el precio de los inmuebles. Y lo llamativo que es que la cantidad de baños y parqueaderos impactan de forma similar en el precio.
Por cada habitación adicional el precio del inmueble baja en promedio 23 millones, por lo tanto a más habitaciones, el precio puede que se vea disminuido. Este resultado puede ser el menos lógico, sin embargo, como se puede ver en el pairplot de la pregunta anterior, algunas viviendas que tienen las mismas áreas difieren en la cantidad de habitaciones, y si la mayoría de las viviendas tienen 250 metros cuadrados o menos, significaría que las habitaciones son varias pero pequeñas, lo que no es tan atractivo a la hora de vender, pues podría ser incómodo en algunos casos o requerir de modificaciones que resultarían en gastos adicionales, lo que devaluaría el costo de venta.
No tiene logica analizar el valor del intercepto pues supone que las variables son 0 y no veo que aporte el revisar un inmueble de 0 metros cuadrados, por ejemplo.
##Interpretación de los coeficientes R2 El R2 múltiple es de 0.75, lo que significa que en conjunto las variables consideradas explican el 75% de la variación del precio de los inmuebles. Además el R2 ajustado es practicamnete el mismo, por lo que no hay variables irrelevantes en este caso.
Algo importante de revisar es que el 75% es una cantidad moderadamente buena para la explicación, pero seguramente hay más variables que puedan explicar también el precio de los inmuebles.
##Discusión del modelo Como se pudo observer con las varables predictorias tenemos una explicación moderada de la variación del precio. Ahora, para discutir el modelo se revisarán los residuales y el estadístico F. Esto hace parte de la validación de supuestos.
##Estadísitico F Como se puede ver el valor p es casi 0 lo que significa que el modelo es significativo para predecir, además, el valor de F es 1701, lo que muestra un valor alto de comparación entre la variabilidad explicada y no explicada por el modelo.
##validación del modelo Para validar el modelo usaré los mismo procesos desarrollados con el otro subcojunto de datos:
##Residuales Se graficarán los residuales para observar su comportamiento, se aplicarán pruebas de normalidad para concluir sobre su disposción y aporte para reconocer el modelo como optimo.
# Obtener los residuales del modelo
residuales2 <- resid(modelo_regresion2)
# Crear un histograma de los residuales
hist(residuales2, breaks = 20, col = "#76EEC6", main = "Histograma de Residuales")
El gráfico muestra una acumulación de datos en el centro, sin embargo
esta acumulación es mayor que la demostrada por una distribución normal
teórica.
# Crear un Q-Q plot de los residuales
qqnorm(residuales2)
qqline(residuales2)
Como se puede observar en el Q-Q plot, no se observa una aproximación a
la linea recta diagonal con los puntos de los cuantiles teoricos y los
observados, otro indicio de que la distribución de los residuos no es
normal.
# Gráfico de residuales vs. valores ajustados
plot(modelo_regresion2$fitted.values, residuales2,
xlab = "Valores Ajustados", ylab = "Residuales",
main = "Gráfico de Residuales vs. Valores Ajustados")
abline(h = 0, col = "green", lty = 2)
la heterocedasticidad se puede verificar al observar una forma de
abanico en la distribución de los puntos en un grafico de residuales
frente a valores ajustados, en este caso se corrobora dicha forma, que
muetra de otra manera que la distribución de los residuos no es
normal.
library(lmtest)
bptest(modelo_regresion2)
##
## studentized Breusch-Pagan test
##
## data: modelo_regresion2
## BP = 956.83, df = 5, p-value < 2.2e-16
Con esta prueba de homocedasticidad se encuentra evidencia estadística fuerte de que el modelo no produjo residuales que tengan variación constante.
# Aplicar la prueba de Kolmogorov-Smirnov
resultado_ks2 <- ks.test(residuales2, "pnorm")
## Warning in ks.test.default(residuales2, "pnorm"): ties should not be present
## for the Kolmogorov-Smirnov test
# Mostrar el resultado de la prueba
print(resultado_ks2)
##
## Asymptotic one-sample Kolmogorov-Smirnov test
##
## data: residuales2
## D = 0.49445, p-value < 2.2e-16
## alternative hypothesis: two-sided
Como se puede observar en las gráficas y pruebas realizadas, hay evidencia para inferir que los residuos no siguen una distribución normal, por lo que sería viable hacer una trasnformación en los datos que permita mejorar la homocedasticidad de los mismos(transformación logarítmica, raiz, box-cox u otra) o incuso se podrían probar otros modelos más robustos como una regresión de minimos cuadrados usando medianas, o algún otro que permita omitir la influencia de los valores atípicos.
##Prueba del modelo
Con el modelo identificado debe predecir el precio de la vivienda con las características de la segunda solicitud.
# Crear un nuevo conjunto de datos con las características del inmueble
nuevo_inmueble4_2 <- data.frame(
areaconst = 300,
parqueaderos = 3,
banios = 3,
habitaciones = 5,
estrato = 5
)
nuevo_inmueble5_2 <- data.frame(
areaconst = 200,
parqueaderos = 3,
banios = 3,
habitaciones = 5,
estrato = 6
)
# Realizar la predicción utilizando el modelo de regresión
prediccion4_2 <- predict(modelo_regresion2, nuevo_inmueble4_2)
prediccion5_2 <- predict(modelo_regresion2, nuevo_inmueble5_2)
# Mostrar el valor predicho del inmueble
print(prediccion4_2)
## 1
## 679.4951
print(prediccion5_2)
## 1
## 590.44
Teniendo en cuenta el modelo con las características del inmueble solicitado se predicen dos precios, para estrato 5 de 679 millones de pesos, 171 millones por debajo del crédito pre-aprobado, por lo que sería posible encontrar viviendas en la zona con dichas condiciones. Para estrato 6 de 590 millones, 260 millones por debajo del crédito pre-aprobado por lo que sería una opción posible también.
Con las predicciones del modelo sugerirán potenciales ofertas que responda a la solicitud de la vivienda 2. Tenga encuenta 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.
# Filtrar el DataFrame para incluir solo las observaciones que cumplen con las condiciones
condiciones_filtradas2 <- vivienda_filtrada2 %>%
filter(preciom <= 850,
estrato %in% c(5, 6),
parqueaderos >= 3,
areaconst >= 250,
habitaciones %in% c(3,6),
banios >= 3)
# Crear el mapa con puntos de ubicación para las observaciones que cumplen con las condiciones
mapa_puntos_filtrado2 <- leaflet(condiciones_filtradas2) %>%
addTiles() %>%
addMarkers(lng = ~longitud, lat = ~latitud,
popup = ~paste(
"ID:", id,
"<br>Precio:", preciom,
"<br>Área:", areaconst,
"<br>Estrato:", estrato,
"<br>Parq:", parqueaderos,
"<br>Hab:", habitaciones,
"<br>Baños:", banios
))
# Mostrar el mapa con los puntos de ubicación filtrados
mapa_puntos_filtrado2
En el mapa se pueden ver los apartamentos de la zona sur cuyo precio es máximo 850 millones de pesos, estratos 5 o 6, con mínimo 3 parqueaderos, área construida de mímino 250 metros cuadrados (con 300 metros cuadrados sólo hay 2 opciones), 3 a 6 habitaciones(no hay de 5 habitaciones) y 3 o más baños. Cada una tiene su ID para que el asesor de la inmobiliaria pueda acceder a ella en la base de datos con facilidad. No se cumple con la solicitud del cliente en los mínimospor no haber disponibilidad en algunas condiciones y se tienen en cuenta apartamentos con algunas mejores condiciones a las solciitadas para su consideración, ejemplo:
D: 5574 Precio: 850 Área: 352 Estrato: 6 Parq: 4 Hab: 3 Baños: 3
Excede en parqueaderos a lo solicitado por el cliente, en el precio, baños y estrato cumple a cabalidad, el área es mayor a lo solicitado, pero en la cantidad de habitaciones no cumple la condición.
ID: 6205 Precio: 350 Área: 260 Estrato: 5 Parq: 3 Hab: 3 Baños: 3
Este inmueble es una buena opción si el cliente busca economía, el precio es menor al pre-aprobado con el que cuenta, tiene un área grande respecto a lo que solicita, lo que se puede ver reflejado en mayor comodidad y espacios, cumple las condiciones de estrato, baños y parqueaderos. No cuenta con la cantidad de habitaciones solicitadas.
ID: 7680 Precio: 450 Área: 267 Estrato: 5 Parq: 3 Hab: 3 Baños: 3
Este inmueble es 33 metros cuadrados menor al tamaño solicitado en área, cumple con el valor, estrato, parqueaderos y baños solicitados. El precio es casi la mitad del pre-aprobado, y la cantidad de habitaciones es inferior a lo solicitado.
Precio: 670 Área: 300 Estrato: 5 Parq: 3 Hab: 6 Baños: 5
Cumple con los requisitos para área, parqueaderos y estrato, excede en habitaciones y baños, pero el precio es más económico que el pronosticado. Su tendencia es a ubicarse más al centro de la ciudad.
Estas cuatro propuestas pueden ser de interés para el cliente según sus condicones y muestran relación directa con los datos recolectados y el modelo establecido.