El mercado inmobiliario en la ciudad de Cali ha experimentado fluctuaciones significativas en las ventas durante el último año, influenciadas por factores políticos, sociales y económicos. Sin embargo, se observa un aumento en la actividad crediticia por parte de instituciones financieras, lo que podría indicar un potencial de recuperación en el futuro cercano.
Ante este escenario dinámico, es crucial para la compañía inmobiliaria C&A (Casas y Apartamentos) comprender en profundidad las tendencias del mercado y adaptarse estratégicamente para satisfacer las necesidades de los clientes y aprovechar las oportunidades emergentes. En este contexto, el análisis detallado presentado en este informe proporcionará a C&A una guía sólida para tomar decisiones informadas y proactivas que impulsen el éxito y la competitividad de la empresa en el sector inmobiliario de Cali.
En respuesta a la solicitud de asesoramiento para la compra de dos viviendas por parte de una compañía internacional, se ha llevado a cabo un exhaustivo análisis del mercado inmobiliario actual en la ciudad de Cali. El objetivo de este informe es proporcionar a C&A una evaluación detallada de las opciones disponibles que se ajusten a los criterios establecidos por la compañía cliente.
El análisis se centra en dos casos específicos: la búsqueda de una casa y un apartamento, cada uno con características y requisitos distintos. Estos casos incluyen consideraciones como el tipo de propiedad, el área construida, el número de parqueaderos, baños y habitaciones, el estrato y la ubicación geográfica en la ciudad. Además, se toma en cuenta el crédito preaprobado por la compañía cliente.
Para abordar esta solicitud, se han empleado técnicas avanzadas de modelado y análisis de datos. El enfoque metodológico incluye un filtrado cuidadoso de la base de datos para seleccionar las propiedades relevantes, seguido de un análisis exploratorio de datos para identificar tendencias y patrones en el mercado inmobiliario. A continuación, se han estimado modelos de regresión para predecir el precio de las viviendas en función de sus características, proporcionando así una herramienta objetiva para evaluar su valor. Además, se ha realizado una validación de supuestos para asegurar la fiabilidad de los modelos y se han generado recomendaciones prácticas basadas en los hallazgos del análisis.
El resultado final de este proyecto es un informe completo que presenta el análisis detallado de las opciones de vivienda para la compañía internacional, así como recomendaciones sólidas y fundamentadas en datos para abordar sus necesidades específicas.
El objetivo principal de este proyecto es realizar un análisis minucioso del mercado inmobiliario en Cali para identificar las opciones de vivienda más adecuadas para dos empleados de una compañía internacional. Utilizando un modelo de regresión lineal múltiple y análisis de datos, se busca proporcionar a María y su equipo en C&A recomendaciones sólidas y fundamentadas en datos. Estas recomendaciones les permitirán tomar decisiones informadas y estratégicas para satisfacer las necesidades específicas de los clientes corporativos, asegurando así la máxima satisfacción tanto para la compañía cliente como para sus empleados.
En este proyecto se trabajará con la base de datos de los 3 últimos meses proporcionada por la compañía A&C.
Lo primero que se debe hacer para comenzar a trabajar con la base de datos es instalar las librerías que vamos a utilizar en el modelo:
Librerías
# devtools::install_github("dgonxalex80/paqueteMODELOS", force = TRUE)
# install.packages("devtools")
library(devtools)
library(paqueteMODELOS)
library(knitr)
library(rmarkdown)
library(kableExtra)
# install.packages("plotly")
library(psych)
library(dplyr)
library(ggplot2)
library(table1)
require(table1)
library(tidyverse)
library(DescTools)
library(corrplot)
## Warning: package 'corrplot' was built under R version 4.3.2
library(plotly)
## Warning: package 'plotly' was built under R version 4.3.3
library(car)
library(mice)
library(naniar)
library(DescTools)
library(VIM)
# install.packages("leaflet")
# install.packages("sf")
library(leaflet)
## Warning: package 'leaflet' was built under R version 4.3.3
library(sf)
## Warning: package 'sf' was built under R version 4.3.3
Importación de la base de datos
Ahora se procederá a importar los datos para el modelo, los cuales se encuentran en un repositorio de GitHub. Además, se presentará una descripción estructurada de la base de datos que incluye información sobre las clases de cada variable, así como las primeras observaciones de cada una. Este análisis proporcionará una visión general del conjunto de datos.
data(vivienda)
str(vivienda)
## spc_tbl_ [8,322 × 13] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
## $ id : num [1:8322] 1147 1169 1350 5992 1212 ...
## $ zona : chr [1:8322] "Zona Oriente" "Zona Oriente" "Zona Oriente" "Zona Sur" ...
## $ piso : chr [1:8322] NA NA NA "02" ...
## $ estrato : num [1:8322] 3 3 3 4 5 5 4 5 5 5 ...
## $ preciom : num [1:8322] 250 320 350 400 260 240 220 310 320 780 ...
## $ areaconst : num [1:8322] 70 120 220 280 90 87 52 137 150 380 ...
## $ parqueaderos: num [1:8322] 1 1 2 3 1 1 2 2 2 2 ...
## $ banios : num [1:8322] 3 2 2 5 2 3 2 3 4 3 ...
## $ habitaciones: num [1:8322] 6 3 4 3 3 3 3 4 6 3 ...
## $ tipo : chr [1:8322] "Casa" "Casa" "Casa" "Casa" ...
## $ barrio : chr [1:8322] "20 de julio" "20 de julio" "20 de julio" "3 de julio" ...
## $ longitud : num [1:8322] -76.5 -76.5 -76.5 -76.5 -76.5 ...
## $ latitud : num [1:8322] 3.43 3.43 3.44 3.44 3.46 ...
## - attr(*, "spec")=
## .. cols(
## .. id = col_double(),
## .. zona = col_character(),
## .. piso = col_character(),
## .. estrato = col_double(),
## .. preciom = col_double(),
## .. areaconst = col_double(),
## .. parqueaderos = col_double(),
## .. banios = col_double(),
## .. habitaciones = col_double(),
## .. tipo = col_character(),
## .. barrio = col_character(),
## .. longitud = col_double(),
## .. latitud = col_double()
## .. )
## - attr(*, "problems")=<externalptr>
Limpieza de la base de datos
La base de datos cuenta con 8,322 registros, para validar estos datos se deben seguir ciertos pasos.
1. Llevar la base de datos a un data frame, tomando como tamaño de la muestra las 8,322 observaciones, para así analizar todo el conjunto.
vivienda_df <- sample_n(vivienda, 8322)
2. Visualizar datos faltantes
datosNA <- colSums(is.na(vivienda_df))
datosNA <- t(datosNA)
kable(datosNA, format = "html", table.attr = 'class = "table table-striped table-bordered"') %>% kable_styling(bootstrap_options = c("striped", "hover", "condensed"), full_width = FALSE)
| id | zona | piso | estrato | preciom | areaconst | parqueaderos | banios | habitaciones | tipo | barrio | longitud | latitud |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 3 | 3 | 2638 | 3 | 2 | 3 | 1605 | 3 | 3 | 3 | 3 | 3 | 3 |
De este gráfico se puede concluir: 1. Las variables piso y parqueadero tienen un total de faltantes de 4,275 faltantes entre las dos. Se hará uan imputación. 2. Dos apartamentos no cuentan con ningún dato diligenciado, por lo que se procederá a eliminarlos al ser pocos registros. 3. Un apartamento solo cuenta con la variable precio diligenciada, las demás están en blanco. Este registro también se eliminará.
3. Eliminar o imputar los datos faltantes
viv_sinNA <- vivienda_df %>%
filter(!is.na(vivienda_df$id))
moda_parq <- Mode(viv_sinNA$parqueaderos, na.rm = TRUE)
viv_sinNA$parqueaderos[is.na(viv_sinNA$parqueaderos)] <- moda_parq
summary(viv_sinNA$parqueaderos)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1.000 1.000 1.000 1.674 2.000 10.000
viv_sinNA$piso <- as.numeric(viv_sinNA$piso)
mediana_piso <- median(viv_sinNA$piso, na.rm = TRUE)
viv_sinNA$piso[is.na(viv_sinNA$piso)] <- mediana_piso
str(viv_sinNA$piso)
## num [1:8319] 1 5 3 3 4 1 4 1 2 4 ...
Con la imputación de estas dos variables, el mapa de valores faltantes queda sin ningún valor, como se puede ver en la siguiente gráfica
gg_miss_var(viv_sinNA)
4. Eliminar variable ID Eliminar la variable contribuye a reducir la dimensionalidad del conjunto de datos, lo que facilita la interpretación y el análisis de los resultados.
viv_sinNA <- viv_sinNA[, !names(viv_sinNA) %in% "id"]
5. Requisitos Ahora que ya se tiene la base de datos cargada y limpia, se procederá con una serie de pasos que permitirán llegar a las conclusiones necesarias.
Se realizará un filtro a la base de datos original, esto con el fin de dar solución al caso 1 solicitado, es decir, encontrar un tipo de vivienda que sea una casa. A coninuación se muestran los requerimientos de la compañía internacional:
| Caracteristicas | Vivienda1 | Vivienda2 |
|---|---|---|
| Tipo | Casa | Apartamento |
| Area | 200 | 300 |
| Parqueaderos | 1 | 3 |
| Baños | 2 | 3 |
| Habitaciones | 4 | 5 |
| Estrato | 4 | 5 |
| Zona | Norte | Sur |
| Credito pre-aprobado | 350M | 850M |
Se realizará un filtro a la base de datos y se incluirán solo las ofertas de las casas que estén ubicadas en la zona norte, a esto se le llamará “base1”.
Construimos un data frame llamado “base1” al que le llevaremos los datos con los filtros correspondientes a vivienda tipo casa y ubicadas en la zona norte.
base1 <- viv_sinNA %>%
filter(tipo == "Casa", zona == "Zona Norte")
summary(base1)
## zona piso estrato preciom
## Length:722 Min. :1.000 Min. :3.000 Min. : 89.0
## Class :character 1st Qu.:2.000 1st Qu.:3.000 1st Qu.: 261.2
## Mode :character Median :3.000 Median :4.000 Median : 390.0
## Mean :2.512 Mean :4.202 Mean : 445.9
## 3rd Qu.:3.000 3rd Qu.:5.000 3rd Qu.: 550.0
## Max. :7.000 Max. :6.000 Max. :1940.0
## areaconst parqueaderos banios habitaciones
## Min. : 30.0 Min. : 1.000 Min. : 0.000 Min. : 0.000
## 1st Qu.: 140.0 1st Qu.: 1.000 1st Qu.: 2.000 1st Qu.: 3.000
## Median : 240.0 Median : 1.000 Median : 3.000 Median : 4.000
## Mean : 264.9 Mean : 1.712 Mean : 3.555 Mean : 4.507
## 3rd Qu.: 336.8 3rd Qu.: 2.000 3rd Qu.: 4.000 3rd Qu.: 5.000
## Max. :1440.0 Max. :10.000 Max. :10.000 Max. :10.000
## tipo barrio longitud latitud
## Length:722 Length:722 Min. :-76.59 Min. :3.333
## Class :character Class :character 1st Qu.:-76.53 1st Qu.:3.452
## Mode :character Mode :character Median :-76.52 Median :3.468
## Mean :-76.52 Mean :3.460
## 3rd Qu.:-76.50 3rd Qu.:3.482
## Max. :-76.47 Max. :3.496
La base 1 cuenta con un total de 722 viviendas tipo casa ubicadas en el norte de la ciudad de Cali.
Para comprobar que tenemos el data frame base 1 correcto vamos a hacer lo siguiente:
1. Presentar los primeros 3 registros
head(base1, 3)
## # A tibble: 3 × 12
## zona piso estrato preciom areaconst parqueaderos banios habitaciones tipo
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <chr>
## 1 Zona N… 4 6 690 225 2 5 3 Casa
## 2 Zona N… 3 5 480 353 1 5 4 Casa
## 3 Zona N… 3 5 350 190 1 3 3 Casa
## # ℹ 3 more variables: barrio <chr>, longitud <dbl>, latitud <dbl>
2. Tabla de frecuencia de la variable “Tipo”
head(base1$tipo)
## [1] "Casa" "Casa" "Casa" "Casa" "Casa" "Casa"
3. Tabla de frecuencia de la variable “Zona”
head(base1$zona)
## [1] "Zona Norte" "Zona Norte" "Zona Norte" "Zona Norte" "Zona Norte"
## [6] "Zona Norte"
4. Imprimir los valores únicos de cada variable
unique(base1$tipo)
## [1] "Casa"
unique(base1$zona)
## [1] "Zona Norte"
Ahora que hemos comprobado que nuestra base1 quedó bien creada, vamos a graficar un mapa con los puntos de la base.
mapa_b1 <- leaflet(base1) %>%
addTiles() %>%
addCircleMarkers(lng=~longitud,lat=~latitud,radius=3)
mapa_b1
Con este mapa, aunque la mayoría de los puntos se concentra en la zona norte, se evidencian puntos ubicados por fuera, ya sea en el oriente, el occidente o en el sur. Esto se puede deber a las siguientes razones:
Errores en las variables latitud o longitud. Pueden darse por una mala digitación, problemas de precisión en las coordenadas geográficas o diferencias en la interpretación de las ubicaciones.
Propiedades mal etiquetadas. Es posible que algunas propiedades se hayan etiquetado con una zona diferente a la correspondiente según su ubicación geográfica, esto podría darse por confusiones durante el ingreso de los datos o por falta de información precisa.
Variabilidad en los límites geográficos. Los límites de las zonas pueden ser ambiguos, lo que puede llevar a cierta superposición entre las zonas.
Desplazamiento de coordenadas. En algunas ocasiones, los datos geoespaciales pueden estar desplazados o malinterpretados debido a errores en la recopilación de los datos por cuestiones del dispositivo utilizado para la geolocalización.
Vamos a ver un resumen estadístico del data frame base1:
summary(base1)
## zona piso estrato preciom
## Length:722 Min. :1.000 Min. :3.000 Min. : 89.0
## Class :character 1st Qu.:2.000 1st Qu.:3.000 1st Qu.: 261.2
## Mode :character Median :3.000 Median :4.000 Median : 390.0
## Mean :2.512 Mean :4.202 Mean : 445.9
## 3rd Qu.:3.000 3rd Qu.:5.000 3rd Qu.: 550.0
## Max. :7.000 Max. :6.000 Max. :1940.0
## areaconst parqueaderos banios habitaciones
## Min. : 30.0 Min. : 1.000 Min. : 0.000 Min. : 0.000
## 1st Qu.: 140.0 1st Qu.: 1.000 1st Qu.: 2.000 1st Qu.: 3.000
## Median : 240.0 Median : 1.000 Median : 3.000 Median : 4.000
## Mean : 264.9 Mean : 1.712 Mean : 3.555 Mean : 4.507
## 3rd Qu.: 336.8 3rd Qu.: 2.000 3rd Qu.: 4.000 3rd Qu.: 5.000
## Max. :1440.0 Max. :10.000 Max. :10.000 Max. :10.000
## tipo barrio longitud latitud
## Length:722 Length:722 Min. :-76.59 Min. :3.333
## Class :character Class :character 1st Qu.:-76.53 1st Qu.:3.452
## Mode :character Mode :character Median :-76.52 Median :3.468
## Mean :-76.52 Mean :3.460
## 3rd Qu.:-76.50 3rd Qu.:3.482
## Max. :-76.47 Max. :3.496
De acuerdo con el resumen estadístico de la base1 se puede concluir lo siguiente: - El piso más bajo en el que se ubican las casas es el 1, y el más alto es el piso 7.
La mayoría de las casas están ubicadas en piso 3.
La media de los pisos es de 2.512, lo que sugiere una ligera asimetría a la izquierda de la curva, es decir, hay más casas ubicadas en pisos bajos que en pisos altos.
En el norte el estrato mínimo es el 3 y el máximo es el estrato 6, lo que sugiere qye las propiedades se encuentran en diferentes segmentos socioeconómicos.
Según los percentiles y la media la mayoría de las casas tienden a tener un estrato entre 3 y 5, estando más cercanas al estrato 5, pues el tercer cuartil es 5 y la media es de aproximadamente 4.2, adicionalmente, la media es ligeramente mayor que la mediana en un 0.2. Las casas están concentradas en mayor medida en estratos medios altos.
El rango de precios de venta es muy amplio, están entre $ 89M y $1,940M.
Aunque el rango de precios es amplio, hay una concentración en el rango intermedio, el 50 % de las casas tienen un precio inferior o igual a $ 390M que es la mediana, mientras que la media es de $ 445.9, esto sugiere una cantidad significativa de viviendas con precios moderados en el conjunto de datos.
Igual que los precios, el área construida también presenta un rango muy amplio, hay valores entre los 30 y los 1,440 metros cuadrados, lo que tiene sentido, pues se espera una correlación positiva, ya que entre más grande sea la casa más espacio habitable suelen tener y así pueden ofrecer más comodidades, lo que las hace más deseables y, por lo tanto, más costosas y más sentido tienen si las viviendas están en la misma zona de la ciudad.
El promedio de parqueaderos por propiedad es de aproximadamente 1.712, lo que sugiere que la mayoría de las propiedades en el conjunto de datos tienden a tener menos de dos parqueaderos.
Aunque el promedio sugiere que la mayoría de las propiedades tienen menos de dos parqueaderos, el rango de valores va desde 1 hasta 10 parqueaderos.
Hay un mínimo de baños igual a 0, lo que resulta preocupante, ya que no es normal que una casa no tenga baños. Es importante verificar esta información para futuros análisis.
El hecho de que el número medio de baños por propiedad sea aproximadamente 3.555 sugiere que, en promedio, las propiedades tienden a tener más de tres baños.
El rango de habitaciones va desde 0 hasta 10, lo que indica una variabilidad significativa en el tamaño de las propiedades en términos de habitaciones. Además, una casa con 0 habitaciones no tiene mucho sentido, pues esto hace más referencia a apartaestudios de un solo ambiente; sin embargo, es algo interesante e importante para futuros análisis.
La mediana y la media sugieren que la mayoría de las propiedades tienen entre 3 y 5 habitaciones.
Ahora, veremos un gráfico interactivo de dispersión que muestra la relación entre el precio de las casas y el área construida
disp_parea <- plot_ly(data = base1, x = base1$areaconst, y = base1$preciom,
color = base1$estrato,
type = "scatter", mode = "markers",
text = paste("Habitaciones: ", base1$habitaciones,
"<br>Baños: ", base1$banios),
hoverinfo = "text") %>%
layout(title = "Relación entre precio y área construida",
xaxis = list(title = "Área construida"),
yaxis = list(title = "Precio"))
disp_parea
Gráfico interactivo de correlación
cor_matb1 <- cor(base1[, c("preciom", "areaconst", "estrato", "banios", "habitaciones")])
cor_b1 <- plot_ly(z = ~cor_matb1, type = "heatmap",
colorscale = "Viridis",
colorbar = list(title = "Coeficiente de correlación"),
x = colnames(cor_matb1),
y = colnames(cor_matb1),
text = ~paste(colnames(cor_matb1), ": ", round(cor_matb1, 2)),
hoverinfo = "text") %>%
layout(title = "Matriz de Correlación (Casas en Zona Norte)",
xaxis = list(title = ""),
yaxis = list(title = ""))
cor_b1
Vamos a hacer la estimación del modelo de Regresión Lineal Múltiple
modelo_base1 <- lm(preciom ~ areaconst + areaconst + estrato + banios + habitaciones + parqueaderos, data = base1)
summary(modelo_base1)
##
## Call:
## lm(formula = preciom ~ areaconst + areaconst + estrato + banios +
## habitaciones + parqueaderos, data = base1)
##
## Residuals:
## Min 1Q Median 3Q Max
## -950.02 -78.88 -18.61 45.40 1080.18
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -232.83115 29.71292 -7.836 1.68e-14 ***
## areaconst 0.81995 0.04372 18.755 < 2e-16 ***
## estrato 84.47244 7.30150 11.569 < 2e-16 ***
## banios 26.18460 5.35894 4.886 1.27e-06 ***
## habitaciones 0.82417 4.14235 0.199 0.842
## parqueaderos 5.71822 5.25772 1.088 0.277
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 159 on 716 degrees of freedom
## Multiple R-squared: 0.6513, Adjusted R-squared: 0.6489
## F-statistic: 267.5 on 5 and 716 DF, p-value: < 2.2e-16
El intercepto (−232.83) representa el valor esperado del precio de una casa cuando todas las variables independientes son iguales a cero. En este caso, no tiene una interpretación práctica ya que no tiene sentido que todas las variables independientes sean cero en el contexto del modelo.
El coeficiente para el área construida (0.81995) es positivo y significativo (p-valor < 0.001), lo que indica que, manteniendo todas las demás variables constantes, un aumento de una unidad en el área construida se asocia con un aumento de aproximadamente 0.82 unidades en el precio de la casa.
El coeficiente 84.47 para el estrato indica que, en promedio, por cada unidad adicional en el estrato de una vivienda, el precio de la casa aumenta en 84.47 millones, manteniendo todas las demás variables constantes. Por ejemplo, si una casa tiene un estrato de 3 y otra casa similar tiene un estrato de 4, se espera que la segunda casa tenga un precio de 84.47 millones más que la primera casa.
El coeficiente para el número de baños es 26.18, coeficiente positivo y significativo, esto quiere decir que, manteniendo todas las demás variables constantes, un aumento de una unidad en el número de baños se asocia con un aumento de aproximadamente 26.18 millones en el precio de la casa.
Para el número de habitaciones, el coeficiente de 0.82 no es significativo (valor-p = 0.842), es decir, no hay suficiente evidencia para concluir que el número de habitaciones incida significativamente en el precio de la casa. Así mismo podemos concluir para el número de parqueaderos con coeficiente y valor- p de 5.72 y 0.277 respectivamente.
El coeficiente de determinación ajustado {R^2} del modelo es 0.6489, lo que significa que aproximadamente el 64.89% de la variabilidad en el precio de las casas puede ser explicada por las variables incluidas en el modelo.Esto indica que el modelo tiene un buen ajuste y que las variables explicativas seleccionadas capturan una cantidad significativa de la variabilidad en el precio de las casas en la zona norte de Cali.
El valor de la estadística F es 267.5 con un valor-p muy bajo (<2.2e−16), lo que indica que al menos una de las variables independientes tiene un efecto significativo en el precio de las casas en el modelo.
1. Linealidad
resid_base1 <- resid(modelo_base1)
valajus_base1 <- fitted(modelo_base1)
plot(valajus_base1, resid_base1, xlab = "Valores ajustados", ylab = "Residuos estandarizados", main = "Linealidad: Residuos vs. Valores ajustados")
abline(h = 0, col = "red")
2. Normalidad de los residuos
# Histograma de residuos estandarizados
hist(resid_base1, breaks = 20, main = "Normalidad de los residuos: Histograma")
# Prueba de Shapiro-Wilk
shapiro.test(resid_base1)
##
## Shapiro-Wilk normality test
##
## data: resid_base1
## W = 0.83487, p-value < 2.2e-16
3. Homeostacidad
# Gráfico de dispersión de residuos estandarizados vs. valores ajustados
plot(valajus_base1, resid_base1, xlab = "Valores ajustados", ylab = "Residuos estandarizados", main = "Homocedasticidad: Residuos vs. Valores ajustados")
abline(h = 0, col = "red")
4. Independencia de los residuos
# Gráfico de autocorrelación de los residuos
acf(resid_base1)
# Prueba de Durbin-Watson
durbinWatsonTest(modelo_base1)
## lag Autocorrelation D-W Statistic p-value
## 1 -0.002466365 2.004228 0.936
## Alternative hypothesis: rho != 0
5. Ausencia de multicolinealidad
# Cálculo de factores de inflación de la varianza (VIF)
vif(modelo_base1)
## areaconst estrato banios habitaciones parqueaderos
## 1.522848 1.468261 1.901338 1.634209 1.200333
Para predecir el precio de la vivienda utilizando el modelo de regresión lineal identificado, vamos a proporcionar los valores de las características definidas por el cliente para el caso 1.
Ya que el estrato puede ser 4 o 5, vamos a ver el resultado con ambas posibilidades
caso1_1 <- data.frame(areaconst = 200, parqueaderos = 1, banios = 2, habitaciones = 4, estrato = 4)
caso1_2 <- data.frame(areaconst = 200, parqueaderos = 1, banios = 2, habitaciones = 4, estrato = 5)
Seguimos con la predicción del precio de la vivienda
predprecio_c1_1 <- predict(modelo_base1, newdata = caso1_1)
predprecio_c1_2 <- predict(modelo_base1, newdata = caso1_2)
print(paste("El precio que se predice para el caso 1, con un estrato 4 es: ", predprecio_c1_1))
## [1] "El precio que se predice para el caso 1, con un estrato 4 es: 330.433511919082"
print(paste("El precio que se predice para el caso 1, con un estrato 5 es: ", predprecio_c1_2))
## [1] "El precio que se predice para el caso 1, con un estrato 5 es: 414.905948601875"
Se realizará un segundo filtro a la base de datos, donde se incluirán solo las ofertas de los apartamentos que estén ubicados en la zona sur, a esto se le llamará “base2”.
Construimos un data frame llamado “base2” al que le llevaremos los datos con los filtros correspondientes a vivienda tipo apartamento y ubicadas en la zona sur.
base2 <- viv_sinNA %>%
filter(tipo == "Apartamento", zona == "Zona Sur")
summary(base2)
## zona piso estrato preciom
## Length:2787 Min. : 1.000 Min. :3.00 Min. : 75.0
## Class :character 1st Qu.: 3.000 1st Qu.:4.00 1st Qu.: 175.0
## Mode :character Median : 3.000 Median :5.00 Median : 245.0
## Mean : 4.141 Mean :4.63 Mean : 297.3
## 3rd Qu.: 5.000 3rd Qu.:5.00 3rd Qu.: 335.0
## Max. :12.000 Max. :6.00 Max. :1750.0
## areaconst parqueaderos banios habitaciones
## Min. : 40.00 Min. : 1.000 Min. :0.000 Min. :0.000
## 1st Qu.: 65.00 1st Qu.: 1.000 1st Qu.:2.000 1st Qu.:3.000
## Median : 85.00 Median : 1.000 Median :2.000 Median :3.000
## Mean : 97.47 Mean : 1.354 Mean :2.488 Mean :2.966
## 3rd Qu.:110.00 3rd Qu.: 2.000 3rd Qu.:3.000 3rd Qu.:3.000
## Max. :932.00 Max. :10.000 Max. :8.000 Max. :6.000
## tipo barrio longitud latitud
## Length:2787 Length:2787 Min. :-76.57 Min. :3.334
## Class :character Class :character 1st Qu.:-76.54 1st Qu.:3.370
## Mode :character Mode :character Median :-76.53 Median :3.383
## Mean :-76.53 Mean :3.390
## 3rd Qu.:-76.52 3rd Qu.:3.406
## Max. :-76.46 Max. :3.497
Para comprobar que tenemos el data frame base 1 correcto vamos a hacer lo siguiente:
1. Presentar los primeros 3 registros
head(base2, 3)
## # A tibble: 3 × 12
## zona piso estrato preciom areaconst parqueaderos banios habitaciones tipo
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <chr>
## 1 Zona S… 3 4 155 58 1 2 2 Apar…
## 2 Zona S… 3 5 195 70 2 2 3 Apar…
## 3 Zona S… 1 4 275 96 2 2 0 Apar…
## # ℹ 3 more variables: barrio <chr>, longitud <dbl>, latitud <dbl>
2. Tabla de frecuencia de la variable “Tipo”
head(base2$tipo)
## [1] "Apartamento" "Apartamento" "Apartamento" "Apartamento" "Apartamento"
## [6] "Apartamento"
3. Tabla de frecuencia de la variable “Zona”
head(base2$zona)
## [1] "Zona Sur" "Zona Sur" "Zona Sur" "Zona Sur" "Zona Sur" "Zona Sur"
4. Imprimir los valores únicos de cada variable
unique(base2$tipo)
## [1] "Apartamento"
unique(base2$zona)
## [1] "Zona Sur"
Ahora que hemos comprobado que nuestra base1 quedó bien creada, vamos a graficar un mapa con los puntos de la base.
mapa_b2 <- leaflet(base2) %>%
addTiles() %>%
addCircleMarkers(lng=~longitud,lat=~latitud,radius=3)
mapa_b2
Vamos a ver un resumen estadístico del data frame base2:
summary(base2)
## zona piso estrato preciom
## Length:2787 Min. : 1.000 Min. :3.00 Min. : 75.0
## Class :character 1st Qu.: 3.000 1st Qu.:4.00 1st Qu.: 175.0
## Mode :character Median : 3.000 Median :5.00 Median : 245.0
## Mean : 4.141 Mean :4.63 Mean : 297.3
## 3rd Qu.: 5.000 3rd Qu.:5.00 3rd Qu.: 335.0
## Max. :12.000 Max. :6.00 Max. :1750.0
## areaconst parqueaderos banios habitaciones
## Min. : 40.00 Min. : 1.000 Min. :0.000 Min. :0.000
## 1st Qu.: 65.00 1st Qu.: 1.000 1st Qu.:2.000 1st Qu.:3.000
## Median : 85.00 Median : 1.000 Median :2.000 Median :3.000
## Mean : 97.47 Mean : 1.354 Mean :2.488 Mean :2.966
## 3rd Qu.:110.00 3rd Qu.: 2.000 3rd Qu.:3.000 3rd Qu.:3.000
## Max. :932.00 Max. :10.000 Max. :8.000 Max. :6.000
## tipo barrio longitud latitud
## Length:2787 Length:2787 Min. :-76.57 Min. :3.334
## Class :character Class :character 1st Qu.:-76.54 1st Qu.:3.370
## Mode :character Mode :character Median :-76.53 Median :3.383
## Mean :-76.53 Mean :3.390
## 3rd Qu.:-76.52 3rd Qu.:3.406
## Max. :-76.46 Max. :3.497
Ahora, veremos un gráfico interactivo de dispersión que muestra la relación entre el precio de las casas y el área construida
disp_parea <- plot_ly(data = base2, x = base2$areaconst, y = base2$preciom,
color = base2$estrato,
type = "scatter", mode = "markers",
text = paste("Habitaciones: ", base2$habitaciones,
"<br>Baños: ", base2$banios),
hoverinfo = "text") %>%
layout(title = "Relación entre precio y área construida",
xaxis = list(title = "Área construida"),
yaxis = list(title = "Precio"))
disp_parea
Gráfico interactivo de correlación
cor_matb2 <- cor(base2[, c("preciom", "areaconst", "estrato", "banios", "habitaciones")])
cor_b2 <- plot_ly(z = ~cor_matb2, type = "heatmap",
colorscale = "Viridis",
colorbar = list(title = "Coeficiente de correlación"),
x = colnames(cor_matb2),
y = colnames(cor_matb2),
text = ~paste(colnames(cor_matb2), ": ", round(cor_matb2, 2)),
hoverinfo = "text") %>%
layout(title = "Matriz de Correlación (Casas en Zona Norte)",
xaxis = list(title = ""),
yaxis = list(title = ""))
cor_b2
Vamos a hacer la estimación del modelo de Regresión Lineal Múltiple
modelo_base2 <- lm(base2$preciom ~ base2$areaconst + base2$areaconst + base2$estrato + base2$banios + base2$habitaciones + base2$parqueaderos, data = base2)
summary(modelo_base2)
##
## Call:
## lm(formula = base2$preciom ~ base2$areaconst + base2$areaconst +
## base2$estrato + base2$banios + base2$habitaciones + base2$parqueaderos,
## data = base2)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1151.66 -37.75 -2.59 38.06 922.20
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -266.91089 12.89132 -20.705 < 2e-16 ***
## base2$areaconst 1.36019 0.04843 28.084 < 2e-16 ***
## base2$estrato 59.23620 2.66624 22.217 < 2e-16 ***
## base2$banios 44.71978 2.98956 14.959 < 2e-16 ***
## base2$habitaciones -17.89121 3.32828 -5.376 8.27e-08 ***
## base2$parqueaderos 73.20959 3.65913 20.007 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 92.99 on 2781 degrees of freedom
## Multiple R-squared: 0.7648, Adjusted R-squared: 0.7643
## F-statistic: 1808 on 5 and 2781 DF, p-value: < 2.2e-16
El intercepto (−232.83) representa el valor esperado del precio de una casa cuando todas las variables independientes son iguales a cero. En este caso, no tiene una interpretación práctica ya que no tiene sentido que todas las variables independientes sean cero en el contexto del modelo.
El coeficiente para el área construida (0.81995) es positivo y significativo (p-valor < 0.001), lo que indica que, manteniendo todas las demás variables constantes, un aumento de una unidad en el área construida se asocia con un aumento de aproximadamente 0.82 unidades en el precio de la casa.
El coeficiente 84.47 para el estrato indica que, en promedio, por cada unidad adicional en el estrato de una vivienda, el precio de la casa aumenta en 84.47 millones, manteniendo todas las demás variables constantes. Por ejemplo, si una casa tiene un estrato de 3 y otra casa similar tiene un estrato de 4, se espera que la segunda casa tenga un precio de 84.47 millones más que la primera casa.
El coeficiente para el número de baños es 26.18, coeficiente positivo y significativo, esto quiere decir que, manteniendo todas las demás variables constantes, un aumento de una unidad en el número de baños se asocia con un aumento de aproximadamente 26.18 millones en el precio de la casa.
Para el número de habitaciones, el coeficiente de 0.82 no es significativo (valor-p = 0.842), es decir, no hay suficiente evidencia para concluir que el número de habitaciones incida significativamente en el precio de la casa. Así mismo podemos concluir para el número de parqueaderos con coeficiente y valor- p de 5.72 y 0.277 respectivamente.
El coeficiente de determinación ajustado {R^2} del modelo es 0.6489, lo que significa que aproximadamente el 64.89% de la variabilidad en el precio de las casas puede ser explicada por las variables incluidas en el modelo.Esto indica que el modelo tiene un buen ajuste y que las variables explicativas seleccionadas capturan una cantidad significativa de la variabilidad en el precio de las casas en la zona norte de Cali.
El valor de la estadística F es 267.5 con un valor-p muy bajo (<2.2e−16), lo que indica que al menos una de las variables independientes tiene un efecto significativo en el precio de las casas en el modelo.