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.
En el mercado inmobiliario, la predicción del precio de las viviendas es un tema de gran interés para inversores, desarrolladores y compradores. En la ciudad de Cali, Colombia, la demanda de viviendas ha aumentado en los últimos años, lo que ha generado un aumento en los precios de las propiedades. Sin embargo, la falta de herramientas efectivas para predecir el precio de las viviendas hace que sea difícil para los actores del mercado tomar decisiones informadas.
En este contexto, el presente informe tiene como objetivo presentar un modelo de regresión lineal múltiple para predecir el precio de viviendas en la ciudad de Cali, Colombia, usando variables predictoras relevantes, como la superficie de la vivienda, el número de habitaciones, el número de baños, el número de parqueaderos y el estrato.
En este caso de acuerdo con la solicitud, el interés se centra en aquellas viviendas del tipo casa de la zona norte de Cali. Que cumplan con las siguientes características: tamaño 200 metros cuadrados, un parqueadero, dos baños, cuatro habitaciones, estrato 4 o 5, con precio inferior a los 300 millones de pesos.
Para responder a la solicitud del cliente se realizón un filtro en la base de datos, con el cual se evidenció que no existen viviendas con cumplan con todas las características buscadas.
## [1] id zona estrato preciom areaconst
## [6] parqueaderos banios habitaciones tipo barrio
## [11] longitud latitud
## <0 rows> (or 0-length row.names)
Por esta razón se realizó un filtro un poco más flexible que muestre ofertas de vivienda con características similares:
## id zona estrato preciom areaconst parqueaderos banios habitaciones
## 1 1270 Zona Norte 5 350 203 2 2 5
## 2 1163 Zona Norte 5 350 216 2 2 4
## 3 1822 Zona Norte 4 340 295 2 2 4
## 4 1943 Zona Norte 5 350 346 1 2 4
## tipo barrio longitud latitud
## 1 Casa el bosque -76.51448 3.48531
## 2 Casa la merced -76.51218 3.48181
## 3 Casa vipasa -76.51777 3.48060
## 4 Casa vipasa -76.51847 3.47503
Los resultados de la búsqueda realizada indican que existen múltiples opciones de vivienda que satisfacen parcialmente las necesidades expresadas por el cliente.
Casa 1270: Esta es una vivienda con un tamaño de 203 metros cuadrados, con 2 parqueaderos, 2 baños, 5 habitaciones, de estrato 5, y con un precio de 350 millones de pesos.
Casa 1163: Esta es una vivienda tiene tamaño de 216 metros cuadrados, con 2 parqueaderos, 2 baños, 4 habitaciones, de estrato 5, y con un precio de 350 millones de pesos.
Casa 1822: Esta casa tiene un tamaño de 295 metros cuadrados, con 2 parqueaderos, 2 baños, 4 habitaciones, de estrato 4, y con un precio de 340 millones de pesos.
Casa 1943: Esta epropiedad tiene un tamaño de 346 metros cuadrados, con un parqueadero, 2 baños, 4 habitaciones, de estrato 5, y con un precio de 350 millones de pesos.
En este caso de acuerdo con la solicitud, el interés se centra en aquellas viviendas del tipo apartamento de la zona sur de Cali. Que cumplan con las siguientes características: tamaño 300 metros cuadrados, tres parqueaderos, tres baños, cinco habitaciones, estrato 5 o 6, con precio inferior a los 850 millones de pesos.
Para responder a la solicitud del cliente se realizón un filtro en la base de datos, con el cual se evidenció que en el conjunto de datos no hay viviendas que cumplan con todas las características que buscaa el cliente.
## [1] id zona estrato preciom areaconst
## [6] parqueaderos banios habitaciones tipo barrio
## [11] longitud latitud
## <0 rows> (or 0-length row.names)
Por este motivo, se realizón un nuevo filtro dando flexibilidad a algunas características y garantizando que no se exceda el valor del crédito.
## id zona estrato preciom areaconst parqueaderos banios habitaciones
## 1 7182 Zona Sur 5 730 573 3 8 5
## 2 7512 Zona Sur 5 670 300 3 5 6
## tipo barrio longitud latitud
## 1 Apartamento guadalupe -76.548 3.408
## 2 Apartamento seminario -76.550 3.409
En este caso se encontraron dos viviendas que guardan características muy similares a las solicitadas, las cuales se mantienen dentro del margen del crédito.
Apartamento 7182: Esta propiedad de estrato 5 dispone de 3 parqueaderos, 8 baños, 5 habitaciones, con un tamaño de 573 metros cuadrados, y un precio de venta de 730 millones de pesos.
Apartamento 7512: Esta propiedad de estrato 5 dispone de 3 parqueaderos, 5 baños, 6 habitaciones, un tamaño de 573 metros cuadrados, y tiene un precio de venta de 670 millones de pesos.
Si bien el análisis descriptivo no arrojó propiedades que cumplieran al 100% con todos los requisitos de los clientes, se identificaron viviendas que satisfacen sus necesidades principales. Sin embargo, los resultados evidencian una brecha en la oferta inmobiliaria existente, caracterizada por una limitada variedad de opciones. Para atender de manera más efectiva la demanda del mercado, se recomienda ampliar el portafolio de propiedades, incorporando opciones que cubran un espectro más amplio de características y precios.
El mapeo de las ofertas inmobiliarias ha evidenciado un desfase entre los datos geográficos almacenados en la base y la distribución real de las propiedades, en las zonas norte y sur de la ciudad. Se sospecha que este desfase se debe a errores en la codificación geoespacial de los registros. Para subsanar esta situación, se sugiere ejecutar una depuración de la base de datos y validar la consistencia de los códigos postales y coordenadas geográficas.
La falta de variedad en las características de las viviendas limita la posibilidad de atender a un segmento más amplio del mercado. Se sugiere realizar un análisis más profundo de la demanda potencial para identificar las características más valoradas por los clientes y ajustar la oferta en consecuencia.
Antes de iniciar con el análisis multivariado, es conveniente
realizar el análisis exploratorio y la limpieza de los datos. Para
cumplir con este objetivo es conveniente realizar las siguientes
tareas:
1. Identificar el tipo de datos presentes en las variables.
2. Determinar el tamaño del dataset.
3. Determinar si hay presencia de datos faltantes.
4. Indicar el total de datos faltantes en cada variable.
Para realizar el modelado de datos, es importante conocer el tipo de datos que contiene cada una de las variables, en este caso, el conjunto de datos contiene cuatro variables del tipo categórico y nueva del tipo cuantitativo.
str(datos, vec.len=2, digits.d=2, give.attr=FALSE)
## 'data.frame': 8322 obs. of 13 variables:
## $ id : num 1147 1169 ...
## $ zona : chr "Zona Oriente" "Zona Oriente" ...
## $ piso : chr NA NA ...
## $ estrato : num 3 3 3 4 5 ...
## $ preciom : num 250 320 350 400 260 ...
## $ areaconst : num 70 120 220 280 90 ...
## $ parqueaderos: num 1 1 2 3 1 ...
## $ banios : num 3 2 2 5 2 ...
## $ habitaciones: num 6 3 4 3 3 ...
## $ tipo : chr "Casa" "Casa" ...
## $ barrio : chr "20 de julio" "20 de julio" ...
## $ longitud : num -77 -77 ...
## $ latitud : num 3.4 3.4 ...
En este caso, el dataset con el cual se trabajará cuenta con un total de 13 variables (columnas) y 8322 observaciones (filas).
dim(datos)
## [1] 8322 13
El análisis muestra que la variable “piso” es la que contiene el mayor número de registros faltantes con un total de 2638 observaciones, seguida de la variable “parqueaderos” que contiene 1605 observaciones faltantes. En cuanto a las demás variables, cada una de ella contiene 3 registros faltantes.
## .
## id 3
## zona 3
## piso 2638
## estrato 3
## preciom 2
## areaconst 3
## parqueaderos 1605
## banios 3
## habitaciones 3
## tipo 3
## barrio 3
## longitud 3
## latitud 3
La construcción de un modelo de calidad, dependerá en gran parte de la limpieza y preparación de los datos, es por eso que se realizan las siguientes etapas.
El Id y el barrio no son variables que se puedan usar como variables respuesta en la construcción del modelo por lo cual se procede a eliminarlas.
df <- subset(datos1, select = -piso)
head(df)
## zona estrato preciom areaconst parqueaderos banios habitaciones
## 1 Zona Oriente 3 250 70 1 3 6
## 2 Zona Oriente 3 320 120 1 2 3
## 3 Zona Oriente 3 350 220 2 2 4
## 4 Zona Sur 4 400 280 3 5 3
## 5 Zona Norte 5 260 90 1 2 3
## 6 Zona Norte 5 240 87 1 3 3
## tipo barrio longitud latitud
## 1 Casa 20 de julio -76.51168 3.43382
## 2 Casa 20 de julio -76.51237 3.43369
## 3 Casa 20 de julio -76.51537 3.43566
## 4 Casa 3 de julio -76.54000 3.43500
## 5 Apartamento acopi -76.51350 3.45891
## 6 Apartamento acopi -76.51700 3.36971
Como se mencionó anteriormente, el conjunto de datos contiene observaciones faltantes, por lo cual se procede a realizar imputación con la moda. Esto, debido a que estos registros no se pueden eliminar ya que se pierde información valiosa.
mode_impute <- function(x) {
ux <- unique(x[!is.na(x)])
ux[which.max(tabulate(match(x[!is.na(x)], ux)))]
}
df[is.na(df)] <- mode_impute(df)
df$preciom <- as.double(df$preciom)
df$areaconst <- as.double(df$areaconst)
df$parqueaderos <- as.double(df$parqueaderos)
df$banios <- as.double(df$banios)
df$habitaciones <- as.double(df$habitaciones)
df$estrato <- as.double(df$estrato)
df$longitud <- as.double(df$longitud)
df$latitud <- as.double(df$latitud)
De acuerdo con la solicitud del cliente, se requieren viviendas del tipo Casa ubicadas en la Zona Norte, por lo tanto realizamos el siguiente filtro a la base de datos para crear el modelo.
df1<-df %>%
filter(zona == "Zona Norte", tipo == "Casa")
head(df1)
## zona estrato preciom areaconst parqueaderos banios habitaciones tipo
## 1 Zona Norte 5 320 150 2 4 6 Casa
## 2 Zona Norte 5 780 380 2 3 3 Casa
## 3 Zona Norte 6 750 445 3 7 6 Casa
## 4 Zona Norte 4 625 355 3 5 5 Casa
## 5 Zona Norte 5 750 237 2 6 6 Casa
## 6 Zona Norte 4 600 160 1 4 5 Casa
## barrio longitud latitud
## 1 acopi -76.51341 3.47968
## 2 acopi -76.51674 3.48721
## 3 acopi -76.52950 3.38527
## 4 acopi -76.53179 3.40590
## 5 acopi -76.54044 3.36862
## 6 acopi -76.55210 3.42125
De acuerdo con la solicitud de uno de los clientes, se requieren viviendas del tipo Apartamento ubicadas en la Zona Sur. Por lo cual, para la posterior creación del modelo de regresión realizamos el siguiente filtro.
df2<-df %>%
filter(zona == "Zona Sur", tipo == "Apartamento")
head(df2)
## zona estrato preciom areaconst parqueaderos banios habitaciones
## 1 Zona Sur 4 290 96 1 2 3
## 2 Zona Sur 3 78 40 1 1 2
## 3 Zona Sur 6 875 194 2 5 3
## 4 Zona Sur 3 135 117 3 2 3
## 5 Zona Sur 3 135 78 3 1 3
## 6 Zona Sur 4 220 75 1 2 3
## tipo barrio longitud latitud
## 1 Apartamento acopi -76.53464 3.44987
## 2 Apartamento aguablanca -76.50100 3.40000
## 3 Apartamento aguacatal -76.55700 3.45900
## 4 Apartamento alameda -76.51400 3.44100
## 5 Apartamento alameda -76.53600 3.43600
## 6 Apartamento alférez real -76.54627 3.39109
Antes de iniciar con la etapa de modelado, se va a revisar la distribución de los datos y la identificación de posibles datos atíícos.
El análisis de las viviendas tipo casa en la Zona Norte revela una amplia variabilidad en cuanto a tamaño y precio. Los metros cuadrados construidos oscilan entre \(30m^2\) y \(1440m^2\), con una concentración significativa en propiedades de \(300m^2\). En cuanto al valor comercial, se observa un rango entre 289 y 1940 millones de pesos, presentando un promedio de 445 millones de pesos.
Respecto a las características internas, se identificó un máximo de 10 habitaciones, baños y parqueaderos por vivienda. Sin embargo, la presencia de propiedades con cero habitaciones o baños sugiere posibles inconsistencias en la base de datos. Los datos muestran una tendencia hacia viviendas con 4 habitaciones, 3 baños y 3 parqueaderos como configuración más común.
N: 722
| Min | Q1 | Median | Mean | Std.Dev | Q3 | Max | IQR | |
|---|---|---|---|---|---|---|---|---|
| areaconst | 30.00 | 140.00 | 240.00 | 264.85 | 167.17 | 337.00 | 1440.00 | 196.75 |
| banios | 0.00 | 2.00 | 3.00 | 3.56 | 1.52 | 4.00 | 10.00 | 2.00 |
| habitac | 0.00 | 3.00 | 4.00 | 4.51 | 1.83 | 5.00 | 10.00 | 2.00 |
| parquea | 1.00 | 2.00 | 3.00 | 2.51 | 1.16 | 3.00 | 10.00 | 1.00 |
| preciom | 89.00 | 260.00 | 390.00 | 445.91 | 268.36 | 550.00 | 1940.00 | 288.75 |
En este caso para la variable precio se observa una asimetría positiva, mostrando una posible presencia de datos atípicos. Además se observa que la distribucón es apuntada lo cual se comprueba con con el coeficiente de Kurtosis que es de 7.67.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
La distribucón del precio de las viviendas del tipo casa en la zona norte muestra asimetría positiva es decir que aquellas casas de gran tamaño pueden ser datos atípicos. Por otra parte el coeficiente de Kurtosis del 9.26 indica que los datos están apuntados.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
En las variables número de baños, número de parqueaderos y número de habitaciones se observa que las distribuciones son leptocúrticas es decir que la mayoría de los datos se concentran en torno a la media, en cuanto a la asimétria se observa que las distribuciones son asimétricas positivas a excepción de la variable número de habitaciones la cual tiene una distribución que se asemeja más a la normal.
En este caso se identifican valores extremos en la variable “precio en millones”, específicamente para viviendas con un valor superior a los 990 millones de pesos, lo que podría indicar la presencia de outliers.
Para la variable área construida se observan valores extremos que corresponden a viviendas que superan los \(640m^2\) lo cual puede sugerir posible presencia de outliers.
En este caso se observan valores extremos para aquellas viviendas que cuentan con más de 5 parqueaderos, también propiedades que disponen de más de 8 baños y 9 habitaciones, lo cual puede dar indicios de posibles datos atípicos.
## No id variables; using all as measure variables
El coeficiente de correlación de Pearson muestra los siguientes resultados:
El análisis de correlación mostró que el precio de las propiedades presenta una correlación positiva moderada con el área construida (r = 0.73) y el número de baños (r = 0.52), indicando que a mayor área, y mayor número de baños disponibles en las viviendas mayor tiende a ser el precio. Asimismo, se observaron correlaciones positivas débiles con el número de parqueaderos y habitaciones. Entre las variables predictoras, se identificaron correlaciones positivas moderadas entre el área construida y el número de baños (r = 0.46), lo cual muestra que el número de baños aumenta a medida que aumenta el tamaño de la propiedad. Tambien se encontro una relación lineal positiva moderada entre el número de baños y el número de habitaciones (r = 0.57), lo cual sugiere posibles multicolinealidades que podrían afectar el modelo de regresión.
cor(df1[,3:7])
## preciom areaconst parqueaderos banios habitaciones
## preciom 1.0000000 0.7313480 0.22012644 0.5233357 0.32270961
## areaconst 0.7313480 1.0000000 0.15699706 0.4628152 0.37533231
## parqueaderos 0.2201264 0.1569971 1.00000000 0.1980583 0.09570347
## banios 0.5233357 0.4628152 0.19805834 1.0000000 0.57553136
## habitaciones 0.3227096 0.3753323 0.09570347 0.5755314 1.00000000
ggpairs(df1[,3:7], title="")
El análisis geoespacial reveló una discrepancia significativa entre la ubicación geográfica real de un gran número de viviendas y las etiquetas de zona asignadas. Al representar las coordenadas de estas propiedades en un mapa, se observó que muchas de las viviendas etiquetadas como pertenecientes a la zona norte de la ciudad se encontraban ubicadas en zonas adyacentes o incluso en sectores completamente diferentes. A pesar de que las viviendas fueron etiquetadas como pertenecientes a la zona norte, el análisis geoespacial demostró que existe una inconsistencia considerable entre esta información y su ubicación real en el mapa. Esta inconsistencia podría deberse a errores en la geocodificación de los datos o incluso a un mal etiquetado de las propiedades.
El análisis descriptivo de los datos reveló que el precio de las propiedades presenta una amplia variabilidad, oscilando entre 75 y 1,750 millones de pesos, con un valor promedio de 297.29 millones de pesos. El área construida de las propiedades varía entre 40 y 932 metros cuadrados, con un promedio de 97 metros cuadrados. En cuanto a las características internas, se observó que el número de baños oscila entre 1 y 8, siendo 2 el valor más común. De manera similar, el número de habitaciones varía entre 1 y 6, con 3 habitaciones como el valor más frecuente. Por último, el número de parqueaderos se encuentra entre 1 y 10, siendo 1 parqueadero lo más usual.
N: 2787
| Min | Q1 | Median | Mean | Std.Dev | Q3 | Max | IQR | |
|---|---|---|---|---|---|---|---|---|
| areaconst | 40.00 | 65.00 | 85.00 | 97.47 | 52.57 | 110.00 | 932.00 | 45.00 |
| banios | 0.00 | 2.00 | 2.00 | 2.49 | 0.93 | 3.00 | 8.00 | 1.00 |
| habitac | 0.00 | 3.00 | 3.00 | 2.97 | 0.63 | 3.00 | 6.00 | 0.00 |
| parquea | 1.00 | 1.00 | 1.00 | 1.65 | 0.83 | 2.00 | 10.00 | 1.00 |
| preciom | 75.00 | 175.00 | 245.00 | 297.29 | 191.55 | 335.00 | 1750.00 | 160.00 |
En este caso la distribucón del precio de las viviendas del tipo apartamento en la zona sur de Cali muestra asimetría positiva es decir que aquellos aparatamentos con valores elevados pueden ser datos atípicos.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
En este caso la distribucón del área de las viviendas del tipo apartamento en la zona sur de Cali muestra asimetría positiva, lo cual puede indicar que aquellos aparatamentos de gran tamaño pueden ser datos atípicos.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
Las variables número de parqueaderos y número de baños muestran asimetría positiva lo cual puede ser un indicio de la presencia de datos atípicos en propiedades que disponen de un gran número de los mismos, por su parte las variable número de habitaciones sigue un comportamiento más parecido al de una distribución normal.
El boxplot muestra valores extremos para aquellas viviendas con precios de venta superiores a los 580 millones de pesos, estos valores extremos pueden indicar la presencia de datos outliers que pueden afectar la precisión del modelo.
Para la variable área construida en metros cuadrados se observan valores extremos para viviendas con un tamaño superior a los 180 metros cuadrados, estos valores pueden indicar presencia de outliers en la variable, los cuales pueden ser apartamentos de un tamaño extremadamente grande.
estadisticos <- boxplot.stats(df2$areaconst)
# Mostrar los valores atípicos
sort(estadisticos$out)
## [1] 180.00 180.00 180.00 180.00 180.00 180.00 180.00 180.00 181.00 181.00
## [11] 182.00 183.00 183.00 183.00 184.00 184.00 184.26 185.00 185.00 185.00
## [21] 185.00 185.00 185.00 185.00 185.00 185.00 185.00 185.00 185.00 186.00
## [31] 187.00 187.00 187.00 187.00 187.00 187.00 187.00 187.00 187.00 187.00
## [41] 187.00 187.00 187.00 187.00 187.24 188.00 188.00 189.00 191.00 191.00
## [51] 191.00 191.80 192.00 192.00 192.00 192.00 193.00 194.00 195.00 195.00
## [61] 197.00 197.00 197.00 198.00 198.00 198.00 198.00 198.00 200.00 200.00
## [71] 200.00 200.00 200.00 200.00 200.00 200.00 200.00 200.00 200.00 200.00
## [81] 200.00 200.00 202.00 204.00 206.00 209.00 210.00 210.00 211.00 212.00
## [91] 213.00 213.00 213.00 213.00 213.00 213.00 216.00 217.00 217.04 220.00
## [101] 220.00 220.00 220.00 221.00 222.00 222.00 222.00 223.00 224.41 226.00
## [111] 227.00 229.00 230.00 230.00 236.00 237.00 237.00 240.00 241.00 244.00
## [121] 245.00 249.00 249.00 250.00 250.00 250.00 251.00 256.00 257.00 258.00
## [131] 259.00 260.00 260.00 267.00 270.00 274.00 275.00 280.00 287.00 288.00
## [141] 290.00 290.00 290.00 295.55 296.00 300.00 300.00 300.00 300.00 306.00
## [151] 306.00 306.00 310.00 320.00 329.00 329.00 330.00 330.00 342.00 344.00
## [161] 344.00 344.00 345.00 346.00 346.00 348.00 352.00 399.00 410.00 439.00
## [171] 464.00 486.00 520.00 573.00 600.00 605.00 932.00
Para la variable parqueaderos se observan valores extremos para apartamentos que cuentan con más de 4 parqueaderos, o que tienen más de cinco baños. En el caso del número de habitaciones los valores extremos representan propiedades con menos de dos o menos habitaciones y propiedades con cuatro o más habitaciones.
## No id variables; using all as measure variables
cor(df2[,3:7])
## preciom areaconst parqueaderos banios habitaciones
## preciom 1.0000000 0.7579955 0.30687955 0.7196705 0.33175381
## areaconst 0.7579955 1.0000000 0.25834808 0.6618179 0.43396077
## parqueaderos 0.3068796 0.2583481 1.00000000 0.2107206 0.02991625
## banios 0.7196705 0.6618179 0.21072057 1.0000000 0.51492273
## habitaciones 0.3317538 0.4339608 0.02991625 0.5149227 1.00000000
El análisis de correlación reveló una relación lineal positiva moderada entre el precio de venta y tanto el área construida (r = 0.758) como el número de baños (r = 0.72). Esto indica que, en general, a mayor tamaño del apartamento y mayor cantidad de baños, mayor tiende a ser el precio. Asimismo, se observó una correlación positiva leve entre el precio y el número de parqueaderos (r = 0.307) y el número de habitaciones (r = 0.332).
ggpairs(df2[,3:7], title=" ")
El análisis geoestadístico reveló una inconsistencia entre las etiquetas de zona y la ubicación geográfica real de las propiedades. Al superponer los datos geoespaciales en un mapa, se identificó que algunas viviendas se encontraban ubicadas en zonas distintas a la ‘zona sur de Cali’ a la que habían sido asignadas, según las coordenadas proporcionadas. Esta discrepancia resalta la importancia de validar la precisión de los datos geoespaciales en los análisis inmobiliarios.
Para el modelo de viviendas de base 1, se trabajará con los datos filtrados anteriormenete.
La variable estrato cuenta con 4 categorías, por lo cual es necesaria la creación de tres variables binarias justo como se muestra acontinuación.
df1$estrato <- factor(df1$estrato)
df_dummy <- model.matrix(~ estrato - 1, data = df1)
dataset <- cbind(df1, df_dummy)
head(dataset)
## zona estrato preciom areaconst parqueaderos banios habitaciones tipo
## 1 Zona Norte 5 320 150 2 4 6 Casa
## 2 Zona Norte 5 780 380 2 3 3 Casa
## 3 Zona Norte 6 750 445 3 7 6 Casa
## 4 Zona Norte 4 625 355 3 5 5 Casa
## 5 Zona Norte 5 750 237 2 6 6 Casa
## 6 Zona Norte 4 600 160 1 4 5 Casa
## barrio longitud latitud estrato3 estrato4 estrato5 estrato6
## 1 acopi -76.51341 3.47968 0 0 1 0
## 2 acopi -76.51674 3.48721 0 0 1 0
## 3 acopi -76.52950 3.38527 0 0 0 1
## 4 acopi -76.53179 3.40590 0 1 0 0
## 5 acopi -76.54044 3.36862 0 0 1 0
## 6 acopi -76.55210 3.42125 0 1 0 0
Para este conjunto de datos se implementa un modelo de regresión lineal múltiple por mínimos cuadrados ordinaros a partir de la siguiente función.
modelo1 <- lm(preciom ~ estrato4 + estrato5+ estrato6 + areaconst + parqueaderos + banios + habitaciones, data = dataset)
summary(modelo1)
##
## Call:
## lm(formula = preciom ~ estrato4 + estrato5 + estrato6 + areaconst +
## parqueaderos + banios + habitaciones, data = dataset)
##
## Residuals:
## Min 1Q Median 3Q Max
## -921.04 -72.05 -16.54 48.65 1056.79
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -11.80842 20.38410 -0.579 0.563
## estrato4 91.17194 17.15418 5.315 0.000000143 ***
## estrato5 145.69182 16.04608 9.080 < 0.0000000000000002 ***
## estrato6 331.83418 26.19572 12.667 < 0.0000000000000002 ***
## areaconst 0.80967 0.04266 18.980 < 0.0000000000000002 ***
## parqueaderos 20.40581 5.12807 3.979 0.000076198 ***
## banios 22.42994 5.35524 4.188 0.000031607 ***
## habitaciones 2.67926 4.06510 0.659 0.510
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 155.3 on 714 degrees of freedom
## Multiple R-squared: 0.6685, Adjusted R-squared: 0.6652
## F-statistic: 205.7 on 7 and 714 DF, p-value: < 0.00000000000000022
El modelo resultante tiene la forma:
\[ \begin{aligned} Precio = &-11.80842 + 0.80967(Área)+ 20.40581(Parqueaderos)+22.42994(Baños)+2.67926(Habitaciones)\\ &+ 91.17194 (Estrato_4) + 145.69182(Estrato_5) + 331.83418 (Estrato_6)+ \varepsilon_0 \end{aligned} \]
Los resultados del modelo de regresión indican que el coeficiente asociado al número de habitaciones (p-valor = 0.510) y el intercepto (p-valor = 0.563) no son estadísticamente significativos. Esto sugiere que estas variables no aportan una contribución significativa a la explicación de la variabilidad en la variable dependiente. Esta falta de significancia podría deberse a varias razones, como la presencia de multicolinealidad con otras variables. Este resultado subraya la importancia de una cuidadosa selección de variables en la construcción de modelos de regresión, ya que la inclusión de variables no significativas puede disminuir la precisión del modelo y dificultar su interpretación.
-11.80842 + (0.80967*200)+ (20.40581*1)+(22.42994*2)+(2.67926*4)+ (91.17194*1)
## [1] 317.2803
En este caso, el modelo muestra un coeficiente de determinación \(R^2\) ajustado del 0.6652, es decir que el 66.52% de los datos de los precios de las casas de la zona norte de Cali se ajustan al modelo de regresión. De manera general, este coeficiente indica que hay una diferencia significativa entre las predicciones realizadas por el modelo de regresión y los valores reales.
De acuerdo con el cliente se requiere una vivienda del tipo casa, con un tamaño de 200 metros cuadrados, de estrato 4 0 5, con dos baños, un parqueadero y cuatro habitaciones.
pred1 <- data.frame(
areaconst = 200,
parqueaderos = 1,
banios = 2 ,
habitaciones = 4,
estrato3 = 0,
estrato4 = 1,
estrato5 = 0,
estrato6 = 0
)
pred1 <- predict(modelo1, newdata = pred1)
cat("La predicción del precio de una casa de estrato 4 es de", pred1 , "millones de pesos","\n")
## La predicción del precio de una casa de estrato 4 es de 317.2807 millones de pesos
pred4 <- data.frame(
areaconst = 200,
parqueaderos = 1,
banios = 2 ,
habitaciones = 4,
estrato3 = 0,
estrato4 = 0,
estrato5 = 1,
estrato6 = 0
)
pred4 <- predict(modelo1, newdata = pred4)
cat("La predicción del precio de una casa de estrato 5 es de", pred4 , "millones de pesos","\n")
## La predicción del precio de una casa de estrato 5 es de 371.8006 millones de pesos
Para una vivienda de estrato 4 con las características antes mencionadas, se observa que el valor comercial que predice el modelo es de 317.2801 millones y de 371.8006 millones de pesos para una de estrato 5, en el caso de la casa de estarto 4 el valor se ajusta al crédito del cliente, mientras que en el segundo caso el valor excede el crédito. Sin emnargo, cabe resaltar que estas estimaciones puden variar teniendo en cuenta la precisíon que muestra el modelo.
##
## Shapiro-Wilk normality test
##
## data: modelo1$residuals
## W = 0.83289, p-value < 0.00000000000000022
qqnorm(modelo1$residuals, main = "Grafico quantile-quantile")
# Plot the Q-Q line
qqline(modelo1$residuals, col= "red")
\[ \begin{align*} H_0 &: V[\varepsilon_i] \, = \, \sigma \\ &vs\\ H_1 &: V[\varepsilon_i] \, \neq \, \sigma \end{align*} \]
##
## studentized Breusch-Pagan test
##
## data: modelo1
## BP = 132.6, df = 7, p-value < 0.00000000000000022
\[ \begin{aligned} H_0 &: E[\varepsilon_i, \varepsilon_j] \, = \, 0 \\ &vs\\ H_1 &: E[\varepsilon_i, \varepsilon_j] \, \neq \, 0 \end{aligned} \]
lmtest::dwtest(modelo1)
##
## Durbin-Watson test
##
## data: modelo1
## DW = 1.7148, p-value = 0.00004688
## alternative hypothesis: true autocorrelation is greater than 0
set.seed(123)
index <- sample(nrow(dataset), 0.7*nrow(dataset))
train <- dataset[index, ]
test <- dataset[-index, ]
Para este modelo se usan como variables predictoras el estrato expresado de acuerdo a tres variables binarias, el área construida, el número de parqueaderos, el número de baños y el número de habitaciones. Usando como conjunto de entrenamiento una proporción del 70% de los datos.
modelo11 <- lm(preciom ~ estrato4 + estrato5+ estrato6 + areaconst + parqueaderos + banios + habitaciones, data = train)
summary(modelo11)
##
## Call:
## lm(formula = preciom ~ estrato4 + estrato5 + estrato6 + areaconst +
## parqueaderos + banios + habitaciones, data = train)
##
## Residuals:
## Min 1Q Median 3Q Max
## -661.44 -71.32 -15.11 45.30 949.26
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.90822 22.64664 0.040 0.96803
## estrato4 88.70100 18.79156 4.720 0.0000030672799155 ***
## estrato5 137.09466 17.87435 7.670 0.0000000000000914 ***
## estrato6 347.10152 28.69028 12.098 < 0.0000000000000002 ***
## areaconst 0.79644 0.04971 16.021 < 0.0000000000000002 ***
## parqueaderos 15.81239 5.69130 2.778 0.00567 **
## banios 26.32923 5.79056 4.547 0.0000068460947243 ***
## habitaciones 1.00797 4.47831 0.225 0.82201
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 144.8 on 497 degrees of freedom
## Multiple R-squared: 0.6907, Adjusted R-squared: 0.6863
## F-statistic: 158.5 on 7 and 497 DF, p-value: < 0.00000000000000022
Ahora, se realizarán algunas estimacones usando el conjunto de datos de prueba que corresponde al 30% de los datos del conjunto original.
predicciones <- predict(modelo11, newdata = test)
#install.packages("Metrics")
library(Metrics)
##
## Attaching package: 'Metrics'
## The following object is masked from 'package:rlang':
##
## ll
mse <- mse(test$preciom, predicciones)
mse
## [1] 31571.05
mae <- mae(test$preciom, predicciones)
mae
## [1] 105.9761
Al igual que en el caso anterior, la variable estrato cuenta con 4 categorías, por lo cual es necesaria la creación de tres variables binarias.
df2$estrato <- factor(df2$estrato)
df_dummy2 <- model.matrix(~ estrato - 1, data = df2)
dataset2 <- cbind(df2, df_dummy2)
head(dataset2)
## zona estrato preciom areaconst parqueaderos banios habitaciones
## 1 Zona Sur 4 290 96 1 2 3
## 2 Zona Sur 3 78 40 1 1 2
## 3 Zona Sur 6 875 194 2 5 3
## 4 Zona Sur 3 135 117 3 2 3
## 5 Zona Sur 3 135 78 3 1 3
## 6 Zona Sur 4 220 75 1 2 3
## tipo barrio longitud latitud estrato3 estrato4 estrato5
## 1 Apartamento acopi -76.53464 3.44987 0 1 0
## 2 Apartamento aguablanca -76.50100 3.40000 1 0 0
## 3 Apartamento aguacatal -76.55700 3.45900 0 0 0
## 4 Apartamento alameda -76.51400 3.44100 1 0 0
## 5 Apartamento alameda -76.53600 3.43600 1 0 0
## 6 Apartamento alférez real -76.54627 3.39109 0 1 0
## estrato6
## 1 0
## 2 0
## 3 1
## 4 0
## 5 0
## 6 0
En este caso se crea un modelo de regresión lineal múltiple por mínimos cuadrados implementando la siguiente función:
modelo2 <- lm(preciom ~ estrato4 + estrato5 + estrato6
+ areaconst + parqueaderos + banios +
habitaciones, data = dataset2)
Con lo cual se obtiene un modelo de la forma:
\[ \begin{aligned} Precio = &-33.00812 + 1.51635(Área)+ 15.72082(Parqueaderos)+46.31967(Baños)+-12.64094(Habitaciones)\\ &+ 33.80210 (Estrato_4) + 69.39249(Estrato_5) + 240.74721(Estrato_6)+ \varepsilon_0 \end{aligned} \]
Los resultados del modelo de regresión lineal múltiple indican que todas las variables independientes incluidas en el modelo son estadísticamente significativas en la explicación del precio de venta de las viviendas. Sin embargo, es llamativo observar que el coeficiente asociado al número de habitaciones presenta un signo negativo (-12.64094). Esto sugiere que, contrariamente a lo esperado, un aumento en el número de habitaciones se asocia con una disminución en el precio de venta. Esta relación inversa podría deberse a factores no considerados en el modelo. Para explorar esta relación con mayor detalle, se recomienda realizar un análisis de segmentación de los datos y evaluar si esta relación se mantiene en diferentes subgrupos de viviendas.
##
## Call:
## lm(formula = preciom ~ estrato4 + estrato5 + estrato6 + areaconst +
## parqueaderos + banios + habitaciones, data = dataset2)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1267.38 -41.53 -0.21 38.47 908.00
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -33.00812 11.24110 -2.936 0.003348 **
## estrato4 33.80210 7.25274 4.661 0.00000330153415 ***
## estrato5 69.39249 7.57670 9.159 < 0.0000000000000002 ***
## estrato6 240.74721 9.16578 26.266 < 0.0000000000000002 ***
## areaconst 1.51635 0.04635 32.718 < 0.0000000000000002 ***
## parqueaderos 15.72082 2.24959 6.988 0.00000000000347 ***
## banios 46.31967 2.93589 15.777 < 0.0000000000000002 ***
## habitaciones -12.64094 3.32117 -3.806 0.000144 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 91.53 on 2779 degrees of freedom
## Multiple R-squared: 0.7723, Adjusted R-squared: 0.7717
## F-statistic: 1346 on 7 and 2779 DF, p-value: < 0.00000000000000022
En este caso, el modelo muestra un coeficiente de determinación \(R^2\) ajustado del 0.7717, es decir que el 77.17% de los datos de los precios de las casas de la zona norte de Cali se ajustan al modelo de regresión. De manera general, este coeficiente indica que existe una diferencia entre las predicciones realizadas por el modelo de regresión y los valores reales. Sin embargo, en términos generales el desempeño del modelo es alto considerando la calidad de los datos.
De acuerdo con el cliente se requiere una vivienda del tipo apartamento, con un tamaño de 300 metros cuadrados, de estrato 5 0 6, con tres baños, tres parqueaderos y cinco habitaciones, que esté ubicado en la zona sur de la ciudad de Cali.
## La predicción del precio de un apartamento de estrato 5 es de 614.2047 millones de pesos
## La predicción del precio de un apartamento de estrato 6 es de 785.5594 millones de pesos
Para un apartamento con las características antes mencionadas, se observa que el valor comercial que predice el modelo es de 614.2047 millones para una vivienda de estrato 5 y de 785.5594 millones de pesos para una vivienda de estrato 6, el cual es un precio que está acorde con el crédito del cliente. Sin embargo, cabe resalar que estas estimaciónes pueden variar con relación al valor real de un apartamento con dichas características.
`### 5.2.1. Normalidad
##
## Shapiro-Wilk normality test
##
## data: modelo2$residuals
## W = 0.77665, p-value < 0.00000000000000022
qqnorm(modelo2$residuals, main = "Grafico quantile-quantile")
# Plot the Q-Q line
qqline(modelo2$residuals, col= "red")
##
## studentized Breusch-Pagan test
##
## data: modelo1
## BP = 132.6, df = 7, p-value < 0.00000000000000022
Usando el test de Durbin-Watson, como el p-valor es menor que el nivel de signifificancia \(\alpha\), hay evidencia estadística para rechazar la hipótesis nula. Es decir, los errores presentan correlación.
lmtest::dwtest(modelo2)
##
## Durbin-Watson test
##
## data: modelo2
## DW = 1.7188, p-value = 0.00000000000004131
## alternative hypothesis: true autocorrelation is greater than 0
Los análisis de diagnóstico revelan que el modelo no cumple con los supuestos de normalidad de los residuos, homocedasticidad y posiblemente multicolinealidad. La no normalidad de los residuos y la heterocedasticidad pueden afectar la eficiencia de los estimadores y la validez de las pruebas de hipótesis. Por otro lado, la multicolinealidad dificulta la interpretación de los coeficientes y puede inflar los errores estándar. En consecuencia, los resultados obtenidos a partir de este modelo deben interpretarse con cautela y no pueden generalizarse a toda la población.
Para el entrenamiento y validación del modelo de regresión se realiza una partición aleatoria en el conjunto de datos del 70% y 30%.
set.seed(123)
# Crea un índice de muestreo aleatorio para la partición
index <- sample(nrow(dataset2), 0.7*nrow(dataset2))
# Crea la partición de entrenamiento (70%)
train2 <- dataset2[index, ]
# Crea la partición de prueba (30%)
test2 <- dataset2[-index, ]
En este caso se entrena un modelo de regresión que usa como variables predictoras el estrato, el área construida, el número de parqueaderos, el número de baños y el número de habitaciones.
modelo22 <- lm(preciom ~ estrato4 + estrato5+ estrato6 + areaconst + parqueaderos + banios + habitaciones, data = train2)
Con lo cual se obtiene un modelo de la siguiente forma:
\[ \begin{aligned} Precio = &31.09174 + 1.60187(Área)+ 15.79267(Parqueaderos)+43.55209(Baños)-12.69949(Habitaciones)\\ &+ 30.51103(Estrato_4) + 66.14917(Estrato_5) + 239.24523(Estrato_6)+ \varepsilon_0 \end{aligned} \]
El modelo de regresión lineal múltiple, con un nivel de significancia del 5%, indica que todas las variables incluidas son estadísticamente significativas en la explicación del precio de venta. Sin embargo, la relación negativa entre el precio y el número de habitaciones (-12.69949) requiere una interpretación más profunda. Esta relación contraria a la intuición podría estar relacionada con factores cualitativos no capturados por las variables cuantitativas del modelo, como la distribución de las habitaciones, la calidad de los acabados o la ubicación de la vivienda. Un análisis cualitativo, complementario al análisis cuantitativo, podría ayudar a comprender mejor esta relación.
summary(modelo22)
##
## Call:
## lm(formula = preciom ~ estrato4 + estrato5 + estrato6 + areaconst +
## parqueaderos + banios + habitaciones, data = train2)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1337.35 -40.54 -0.33 38.73 893.82
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -31.09174 13.41433 -2.318 0.020564 *
## estrato4 30.51103 8.66817 3.520 0.000442 ***
## estrato5 66.14917 9.07354 7.290 0.000000000000448 ***
## estrato6 239.24523 10.99287 21.764 < 0.0000000000000002 ***
## areaconst 1.60187 0.05778 27.722 < 0.0000000000000002 ***
## parqueaderos 15.79267 2.67756 5.898 0.000000004325507 ***
## banios 43.55209 3.52649 12.350 < 0.0000000000000002 ***
## habitaciones -12.69949 3.98689 -3.185 0.001469 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 92.75 on 1942 degrees of freedom
## Multiple R-squared: 0.7726, Adjusted R-squared: 0.7718
## F-statistic: 942.8 on 7 and 1942 DF, p-value: < 0.00000000000000022
A continación, se realizan algunas estimaciones a partir de los datos de prueba.
predicciones2 <- predict(modelo22, newdata = test2)
#install.packages("Metrics")
library(Metrics)
mse2 <- mse(test2$preciom, predicciones2)
mse2
## [1] 7902.642
mae2 <- mae(test2$preciom, predicciones2)
mae2
## [1] 55.69571