title: “Actividad 2” author: “Ivan Valderrama C” date: “01/09/2025” output: html_document —

# Instalar y cargar el paquete devtools
devtools::install_github("centromagis/paqueteMODELOS", force =TRUE)
## WARNING: Rtools is required to build R packages, but is not currently installed.
## 
## Please download and install Rtools 4.4 from https://cran.r-project.org/bin/windows/Rtools/.
## Downloading GitHub repo centromagis/paqueteMODELOS@HEAD
## rlang    (1.1.5  -> 1.1.6) [CRAN]
## purrr    (1.0.4  -> 1.1.0) [CRAN]
## magrittr (2.0.3  -> 2.0.4) [CRAN]
## cli      (3.6.4  -> 3.6.5) [CRAN]
## Rcpp     (1.0.14 -> 1.1.0) [CRAN]
## curl     (6.4.0  -> 7.0.0) [CRAN]
## xfun     (0.52   -> 0.53 ) [CRAN]
## Installing 7 packages: rlang, purrr, magrittr, cli, Rcpp, curl, xfun
## Installing packages into 'C:/Users/Ivan VC/AppData/Local/R/win-library/4.4'
## (as 'lib' is unspecified)
## package 'rlang' successfully unpacked and MD5 sums checked
## Warning: cannot remove prior installation of package 'rlang'
## Warning in file.copy(savedcopy, lib, recursive = TRUE): problema al copiar
## C:\Users\Ivan
## VC\AppData\Local\R\win-library\4.4\00LOCK\rlang\libs\x64\rlang.dll a
## C:\Users\Ivan VC\AppData\Local\R\win-library\4.4\rlang\libs\x64\rlang.dll:
## Permission denied
## Warning: restored 'rlang'
## package 'purrr' successfully unpacked and MD5 sums checked
## Warning: cannot remove prior installation of package 'purrr'
## Warning in file.copy(savedcopy, lib, recursive = TRUE): problema al copiar
## C:\Users\Ivan
## VC\AppData\Local\R\win-library\4.4\00LOCK\purrr\libs\x64\purrr.dll a
## C:\Users\Ivan VC\AppData\Local\R\win-library\4.4\purrr\libs\x64\purrr.dll:
## Permission denied
## Warning: restored 'purrr'
## package 'magrittr' successfully unpacked and MD5 sums checked
## Warning: cannot remove prior installation of package 'magrittr'
## Warning in file.copy(savedcopy, lib, recursive = TRUE): problema al copiar
## C:\Users\Ivan
## VC\AppData\Local\R\win-library\4.4\00LOCK\magrittr\libs\x64\magrittr.dll a
## C:\Users\Ivan
## VC\AppData\Local\R\win-library\4.4\magrittr\libs\x64\magrittr.dll: Permission
## denied
## Warning: restored 'magrittr'
## package 'cli' successfully unpacked and MD5 sums checked
## Warning: cannot remove prior installation of package 'cli'
## Warning in file.copy(savedcopy, lib, recursive = TRUE): problema al copiar
## C:\Users\Ivan VC\AppData\Local\R\win-library\4.4\00LOCK\cli\libs\x64\cli.dll a
## C:\Users\Ivan VC\AppData\Local\R\win-library\4.4\cli\libs\x64\cli.dll:
## Permission denied
## Warning: restored 'cli'
## package 'Rcpp' successfully unpacked and MD5 sums checked
## Warning: cannot remove prior installation of package 'Rcpp'
## Warning in file.copy(savedcopy, lib, recursive = TRUE): problema al copiar
## C:\Users\Ivan VC\AppData\Local\R\win-library\4.4\00LOCK\Rcpp\libs\x64\Rcpp.dll
## a C:\Users\Ivan VC\AppData\Local\R\win-library\4.4\Rcpp\libs\x64\Rcpp.dll:
## Permission denied
## Warning: restored 'Rcpp'
## package 'curl' successfully unpacked and MD5 sums checked
## Warning: cannot remove prior installation of package 'curl'
## Warning in file.copy(savedcopy, lib, recursive = TRUE): problema al copiar
## C:\Users\Ivan VC\AppData\Local\R\win-library\4.4\00LOCK\curl\libs\x64\curl.dll
## a C:\Users\Ivan VC\AppData\Local\R\win-library\4.4\curl\libs\x64\curl.dll:
## Permission denied
## Warning: restored 'curl'
## package 'xfun' successfully unpacked and MD5 sums checked
## Warning: cannot remove prior installation of package 'xfun'
## Warning in file.copy(savedcopy, lib, recursive = TRUE): problema al copiar
## C:\Users\Ivan VC\AppData\Local\R\win-library\4.4\00LOCK\xfun\libs\x64\xfun.dll
## a C:\Users\Ivan VC\AppData\Local\R\win-library\4.4\xfun\libs\x64\xfun.dll:
## Permission denied
## Warning: restored 'xfun'
## 
## The downloaded binary packages are in
##  C:\Users\Ivan VC\AppData\Local\Temp\RtmpQ9JOxq\downloaded_packages
## ── R CMD build ─────────────────────────────────────────────────────────────────
## WARNING: Rtools is required to build R packages, but is not currently installed.
## 
## Please download and install Rtools 4.4 from https://cran.r-project.org/bin/windows/Rtools/.
##          checking for file 'C:\Users\Ivan VC\AppData\Local\Temp\RtmpQ9JOxq\remotes402c28a154c7\Centromagis-paqueteMODELOS-3b06257/DESCRIPTION' ...     checking for file 'C:\Users\Ivan VC\AppData\Local\Temp\RtmpQ9JOxq\remotes402c28a154c7\Centromagis-paqueteMODELOS-3b06257/DESCRIPTION' ...   ✔  checking for file 'C:\Users\Ivan VC\AppData\Local\Temp\RtmpQ9JOxq\remotes402c28a154c7\Centromagis-paqueteMODELOS-3b06257/DESCRIPTION' (981ms)
##       ─  preparing 'paqueteMODELOS': (7.3s)
##    checking DESCRIPTION meta-information ...  ✔  checking DESCRIPTION meta-information
##       ─  checking for LF line-endings in source and make files and shell scripts (675ms)
##               checking for empty or unneeded directories  ─  checking for empty or unneeded directories
##       ─  building 'paqueteMODELOS_0.1.0.tar.gz'
##      
## 
## Installing package into 'C:/Users/Ivan VC/AppData/Local/R/win-library/4.4'
## (as 'lib' is unspecified)
library(paqueteMODELOS)
## Cargando paquete requerido: boot
## Cargando paquete requerido: broom
## Warning: package 'broom' was built under R version 4.4.3
## Cargando paquete requerido: GGally
## Warning: package 'GGally' was built under R version 4.4.3
## Cargando paquete requerido: ggplot2
## Warning: package 'ggplot2' was built under R version 4.4.3
## Cargando paquete requerido: gridExtra
## Cargando paquete requerido: knitr
## Warning: package 'knitr' was built under R version 4.4.3
## Cargando paquete requerido: summarytools
## Warning: package 'summarytools' was built under R version 4.4.3
data("vivienda")
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.4.3
## 
## Adjuntando el paquete: '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
# Filtrar la base de datos vivienda
vivienda_1 <- filter(vivienda, zona == "Zona Norte" & tipo == "Casa")

# Mostrar los primeros 3 registros en formato de tabla con kable
knitr::kable(head(vivienda_1, 3), caption = "Casas en la Zona Norte")
Casas en la Zona Norte
id zona piso estrato preciom areaconst parqueaderos banios habitaciones tipo barrio longitud latitud
1209 Zona Norte 02 5 320 150 2 4 6 Casa acopi -76.51341 3.47968
1592 Zona Norte 02 5 780 380 2 3 3 Casa acopi -76.51674 3.48721
4057 Zona Norte 02 6 750 445 NA 7 6 Casa acopi -76.52950 3.38527

Base1:

Casas, de la zona norte de la ciudad. Presente los primeros 3 registros de las bases y algunas tablas que comprueben la consulta. (Adicional un mapa con los puntos de las bases. Discutir si todos los puntos se ubican en la zona correspondiente o se presentan valores en otras zonas, por que?).

Casas en la Zona Norte

library(dplyr)

base1 <- filter(vivienda, zona == "Zona Norte" & tipo == "Casa")

head(base1, 3)
## # 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           NA      7            6
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>

Posterior a ello, ubicamos en un mapa a las viviendas que se ubican en el sector norte de Cali y cumplan con los criterios requeridos por la empresa.

library(leaflet)
## Warning: package 'leaflet' was built under R version 4.4.3
# Filtrar la base de datos vivienda para las casas en la Zona Norte
vivienda_norte <- filter(vivienda, tipo == "Casa" & zona == "Zona Norte")

# Crear el mapa con leaflet
mapaNorte <- leaflet(vivienda_norte) %>%
  addTiles() %>%
  addCircleMarkers(lng = ~longitud, lat = ~latitud, color = "#7b9400", radius = 2)

# Mostrar el mapa
mapaNorte

Como se aprecia en el mapa anterior, algunos puntos se encuentran ubicados fuera de los límites de la zona norte de la ciudad de Cali. Esta discrepancia podría deberse a la incorporación de registros erróneos durante la construcción de la base de datos, lo que genera dificultades en la visualización actual.

Para determinar si este problema también se presenta en otras áreas, resulta necesario analizar las zonas central y sur. Esta verificación permitirá comprender con mayor precisión el comportamiento de los datos y establecer si la presencia de puntos fuera de las áreas designadas corresponde a un patrón generalizado o a una situación particular de la zona norte.

Zona Centro

vivienda_2 <- filter(vivienda, zona == "Zona Centro" & tipo == "Casa")
knitr::kable(head(vivienda_2, 3), caption = "Casas Centro")
Casas Centro
id zona piso estrato preciom areaconst parqueaderos banios habitaciones tipo barrio longitud latitud
5298 Zona Centro 01 3 650 240 2 4 4 Casa alameda -76.53564 3.43521
5107 Zona Centro 02 4 400 460 NA 5 7 Casa alameda -76.53471 3.43627
5117 Zona Centro 02 3 380 290 NA 4 8 Casa alameda -76.53481 3.43712
vivienda_centro <- subset(vivienda, tipo=="Casa" & zona == "Zona Centro")

mapacentro <- leaflet(vivienda_centro) %>%
  addTiles()  %>%
  addCircleMarkers(lng = ~longitud, lat = ~latitud, color = "#228CF5", radius = 2)

mapacentro

Zona Sur

vivienda_3 <- filter(vivienda, zona == "Zona Sur" & tipo == "Casa")
knitr::kable(head(vivienda_3, 3), caption = "Casas Sur")
Casas Sur
id zona piso estrato preciom areaconst parqueaderos banios habitaciones tipo barrio longitud latitud
5992 Zona Sur 02 4 400 280 3 5 3 Casa 3 de julio -76.540 3.435
5157 Zona Sur 02 3 500 354 1 2 4 Casa alameda -76.535 3.437
5501 Zona Sur 02 3 175 102 NA 2 4 Casa alameda -76.537 3.435
vivienda_sur <- subset(vivienda, tipo=="Casa" & zona == "Zona Sur")

mapasur<- leaflet(vivienda_sur) %>%
  addTiles()  %>%
  addCircleMarkers(lng = ~longitud, lat = ~latitud, color = "#F5E322", radius = 2)

mapasur

Zona Oeste

# Filtrar la base de datos vivienda para las casas en la Zona Oeste
vivienda_3 <- filter(vivienda, zona == "Zona Oeste" & tipo == "Casa")

# Presentar los primeros 3 registros en formato de tabla con kable
knitr::kable(head(vivienda_3, 3), caption = "Casas en la Zona Oeste")
Casas en la Zona Oeste
id zona piso estrato preciom areaconst parqueaderos banios habitaciones tipo barrio longitud latitud
6928 Zona Oeste 03 6 1850 302 4 4 3 Casa aguacatal -76.54600 3.44400
7510 Zona Oeste 03 6 1950 400 4 5 3 Casa aguacatal -76.55000 3.45600
7586 Zona Oeste 03 6 870 275 3 5 4 Casa aguacatal -76.55074 3.45649
# Filtrar la base de datos vivienda para las casas en la Zona Oeste
vivienda_oeste <- subset(vivienda, tipo == "Casa" & zona == "Zona Oeste")

# Crear el mapa con leaflet para la Zona Oeste
mapaOeste <- leaflet(vivienda_oeste) %>%
  addTiles() %>%
  addCircleMarkers(lng = ~longitud, lat = ~latitud, color = "#62162f", radius = 2)

mapaOeste

Zona Oriente

# Filtrar la base de datos vivienda para las casas en la Zona Oriente
vivienda_oriente <- filter(vivienda, zona == "Zona Oriente" & tipo == "Casa")

# Presentar los primeros 3 registros en formato de tabla con kable
knitr::kable(head(vivienda_oriente, 3), caption = "Casas en la Zona Oriente")
Casas en la Zona Oriente
id zona piso estrato preciom areaconst parqueaderos banios habitaciones tipo barrio longitud latitud
1147 Zona Oriente NA 3 250 70 1 3 6 Casa 20 de julio -76.51168 3.43382
1169 Zona Oriente NA 3 320 120 1 2 3 Casa 20 de julio -76.51237 3.43369
1350 Zona Oriente NA 3 350 220 2 2 4 Casa 20 de julio -76.51537 3.43566
# Crear el mapa con leaflet para la Zona Oriente
mapa_oriente <- leaflet(vivienda_oriente) %>%
  addTiles() %>%
  addCircleMarkers(lng = ~longitud, lat = ~latitud, color = "#008000", radius = 2)

mapa_oriente

Al analizar los diferentes mapas se evidencia la presencia de puntos ubicados fuera de los parámetros establecidos en todas las zonas. Esto refleja inconsistencias en la identificación de las coordenadas de latitud y longitud de los datos, lo que provoca la ubicación errónea de ciertos elementos fuera de las áreas definidas. Dichos resultados resaltan la necesidad de depurar la base de datos y corregir los registros, ya que es posible que, durante su construcción, algunos propietarios hayan reportado incorrectamente su localización. Este problema repercute en la representación gráfica de los puntos en la ciudad de Cali, generando que algunos se sobrepongan o se mezclen entre diferentes zonas.

vivienda_casas <- filter(vivienda, tipo == "Casa")
knitr::kable(head(vivienda_casas, 5), caption = "Casas")
Casas
id zona piso estrato preciom areaconst parqueaderos banios habitaciones tipo barrio longitud latitud
1147 Zona Oriente NA 3 250 70 1 3 6 Casa 20 de julio -76.51168 3.43382
1169 Zona Oriente NA 3 320 120 1 2 3 Casa 20 de julio -76.51237 3.43369
1350 Zona Oriente NA 3 350 220 2 2 4 Casa 20 de julio -76.51537 3.43566
5992 Zona Sur 02 4 400 280 3 5 3 Casa 3 de julio -76.54000 3.43500
1209 Zona Norte 02 5 320 150 2 4 6 Casa acopi -76.51341 3.47968
colores <- colorFactor(palette = c("#7b9400","#228CF5", "#F5E322", "#62162f", "#008000"), domain = vivienda_casas$zona)

mapa<- leaflet(vivienda_casas) %>%
  addTiles()  %>%
  addCircleMarkers(lng = ~longitud, lat = ~latitud, color = ~colores(zona), radius = 3)

mapa

La gráfica anterior confirma la hipótesis de que existen puntos localizados fuera de las zonas correspondientes. Este análisis ofrece una visión global de la distribución de las viviendas de tipo casa en la ciudad de Cali, lo que permite identificar patrones de ubicación y detectar posibles anomalías en la base de datos, como la presencia de viviendas fuera de las áreas designadas. Estos hallazgos ponen de manifiesto la necesidad de una correcta identificación de las coordenadas de latitud y longitud, con el fin de lograr una clasificación más precisa y confiable de los datos.

Base2.

Realice un análisis exploratorio de datos enfocado en la correlación entre la variable respuesta (precio de la casa) en función del área construida, estrato, numero de baños, numero de habitaciones y zona donde se ubica la vivienda. Use gráficos interactivos con el paquete plotly e interprete los resultados.

Tras concluir la evaluación de las residencias localizadas en el área norte de Cali, el siguiente paso será analizar la relación entre la variable de interés y el tamaño de la construcción. En una primera etapa, se procederá a calcular y examinar los estadísticos descriptivos más relevantes del conjunto de datos recopilado.

pos <- which(vivienda$tipo=="Casa")
vivienda_casas <- vivienda[pos,]
glimpse(vivienda_casas)
## Rows: 3,219
## Columns: 13
## $ id           <dbl> 1147, 1169, 1350, 5992, 1209, 1592, 4057, 4460, 6081, 782…
## $ zona         <chr> "Zona Oriente", "Zona Oriente", "Zona Oriente", "Zona Sur…
## $ piso         <chr> NA, NA, NA, "02", "02", "02", "02", "02", "02", "02", "02…
## $ estrato      <dbl> 3, 3, 3, 4, 5, 5, 6, 4, 5, 4, 5, 5, 3, 3, 3, 3, 5, 3, 4, …
## $ preciom      <dbl> 250, 320, 350, 400, 320, 780, 750, 625, 750, 600, 420, 49…
## $ areaconst    <dbl> 70, 120, 220, 280, 150, 380, 445, 355, 237, 160, 200, 118…
## $ parqueaderos <dbl> 1, 1, 2, 3, 2, 2, NA, 3, 2, 1, 4, 2, NA, NA, NA, NA, NA, …
## $ banios       <dbl> 3, 2, 2, 5, 4, 3, 7, 5, 6, 4, 4, 4, 2, 0, 3, 6, 5, 5, 3, …
## $ habitaciones <dbl> 6, 3, 4, 3, 6, 3, 6, 5, 6, 5, 5, 4, 3, 0, 3, 6, 4, 8, 4, …
## $ tipo         <chr> "Casa", "Casa", "Casa", "Casa", "Casa", "Casa", "Casa", "…
## $ barrio       <chr> "20 de julio", "20 de julio", "20 de julio", "3 de julio"…
## $ longitud     <dbl> -76.51168, -76.51237, -76.51537, -76.54000, -76.51341, -7…
## $ latitud      <dbl> 3.43382, 3.43369, 3.43566, 3.43500, 3.47968, 3.48721, 3.3…
result <- summary(vivienda_casas[,3:9])
knitr::kable(result, caption = "Análisis generar las variable BASE1")
Análisis generar las variable BASE1
piso estrato preciom areaconst parqueaderos banios habitaciones
Length:3219 Min. :3.000 Min. : 77 Min. : 30.0 Min. : 1.00 Min. : 0.000 Min. : 0.00
Class :character 1st Qu.:3.000 1st Qu.: 300 1st Qu.: 154.0 1st Qu.: 1.00 1st Qu.: 3.000 1st Qu.: 3.00
Mode :character Median :5.000 Median : 430 Median : 240.0 Median : 2.00 Median : 4.000 Median : 4.00
NA Mean :4.485 Mean : 540 Mean : 273.4 Mean : 2.29 Mean : 3.894 Mean : 4.61
NA 3rd Qu.:5.000 3rd Qu.: 670 3rd Qu.: 350.0 3rd Qu.: 3.00 3rd Qu.: 5.000 3rd Qu.: 5.00
NA Max. :6.000 Max. :1999 Max. :1745.0 Max. :10.00 Max. :10.000 Max. :10.00
NA NA NA NA NA’s :733 NA NA

-Histograma de la variable Piso.

library(plotly)
## Warning: package 'plotly' was built under R version 4.4.3
## 
## Adjuntando el paquete: 'plotly'
## The following object is masked from 'package:ggplot2':
## 
##     last_plot
## The following object is masked from 'package:stats':
## 
##     filter
## The following object is masked from 'package:graphics':
## 
##     layout
plot <- plot_ly(vivienda_casas, type = "histogram")
plot <- plot %>% add_trace(x = ~piso, name = "Piso")
plot
## Warning: Ignoring 1254 observations
## Warning: Can't display both discrete & non-discrete data on same axis

A partir de esta información, podemos concluir que la mayoría de las casas tienen entre 1 y 3 pisos, ya que estos son los valores más comunes (la mediana y los cuartiles). Sin embargo, hay una un datos de una casa con una gran cantidad de pisos, puesto ya que el valor máximo es 10 pisos.

vivienda_casas_limpia <- vivienda_casas %>%
  filter(habitaciones != 0 & banios != 0)

knitr::kable(head(vivienda_casas_limpia), caption = "Base de datos limpia")
Base de datos limpia
id zona piso estrato preciom areaconst parqueaderos banios habitaciones tipo barrio longitud latitud
1147 Zona Oriente NA 3 250 70 1 3 6 Casa 20 de julio -76.51168 3.43382
1169 Zona Oriente NA 3 320 120 1 2 3 Casa 20 de julio -76.51237 3.43369
1350 Zona Oriente NA 3 350 220 2 2 4 Casa 20 de julio -76.51537 3.43566
5992 Zona Sur 02 4 400 280 3 5 3 Casa 3 de julio -76.54000 3.43500
1209 Zona Norte 02 5 320 150 2 4 6 Casa acopi -76.51341 3.47968
1592 Zona Norte 02 5 780 380 2 3 3 Casa acopi -76.51674 3.48721
plot_ly(vivienda_casas_limpia, x = ~preciom, type = "histogram")%>%
  layout(title = "Histograma de precios")

Lo anterior permite comprender la distribución de los precios de las viviendas en el conjunto de datos, identificando si esta es simétrica o presenta sesgo hacia alguno de los lados, además de reconocer posibles valores atípicos o concentraciones en determinados rangos de precios.

El histograma evidencia la distribución de los precios de las viviendas en la ciudad de Cali, los cuales se encuentran en un rango que va desde los 77 millones hasta los 550 millones. Como resultado, se observa que la distribución no es normal, sino asimétrica hacia la izquierda.

plot_ly(vivienda_casas_limpia, x = ~estrato,y=~estrato, type = "bar")%>%
  layout(title = "Histograma del estrato")

En el histograma del estrato, se observa que la mayoría de las viviendas en la ciudad de Cali están ubicadas en los estratos 5 y 6, pero también hay una cantidad significativa de viviendas en los estratos 3 y 4. Esto sugiere que la distribución de las viviendas tiende a estar sesgada hacia los estratos más altos, pero aún existe una presencia notable en los estratos intermedios.

plot_ly(vivienda_casas_limpia, x = ~habitaciones, type = "histogram")%>%
  layout(title = "Histograma del número de habitaciones")

En el histograma del número de habitaciones, se observa una distribución que se asemeja a una distribución normal, con la mayoría de los datos concentrados alrededor de la media, que es de 4 habitaciones. Sin embargo, también se nota la presencia de varios datos por encima de 4 habitaciones, lo que sugiere un sesgo hacia la derecha en la distribución. Esto indica que aunque la mayoría de las viviendas tienen alrededor de 4 habitaciones, hay algunas propiedades con un número considerablemente mayor de habitaciones.

library(GGally)

cor_1 <-vivienda_casas_limpia[,c("preciom","areaconst","banios","habitaciones")]
ggpairs(cor_1, title="GGally ") 

Los resultados revelan que las variables más fuertemente correlacionadas con el precio son el área construida y el número de baños. Específicamente, la correlación entre el precio y el área construida es de 0.654, mientras que la correlación entre el precio y el número de baños es de 0.583. Estas correlaciones son consideradas medianamente altas, lo que sugiere una relación significativa entre estas variables y el precio de las viviendas.

3. Regresión lineal

Estime un modelo de regresión lineal múltiple con las variables del punto anterior (precio = f(área construida, estrato, número de cuartos, número de parqueaderos, número de baños ) ) e interprete los coeficientes si son estadísticamente significativos. Las interpretaciones deber están contextualizadas y discutir si los resultados son lógicos. Adicionalmente interprete el coeficiente R2 y discuta el ajuste del modelo e implicaciones (que podrían hacer para mejorarlo).

modelo_multi_vivi = lm(preciom ~ areaconst + estrato + parqueaderos + banios, data = vivienda_casas )
summary(modelo_multi_vivi)
## 
## Call:
## lm(formula = preciom ~ areaconst + estrato + parqueaderos + banios, 
##     data = vivienda_casas)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1108.22  -115.81   -21.89    75.94   994.43 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -486.50564   20.31625 -23.947   <2e-16 ***
## areaconst       0.71729    0.02904  24.704   <2e-16 ***
## estrato       126.41582    4.78981  26.393   <2e-16 ***
## parqueaderos   65.00246    3.48820  18.635   <2e-16 ***
## banios         29.60128    3.51717   8.416   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 206.1 on 2481 degrees of freedom
##   (733 observations deleted due to missingness)
## Multiple R-squared:  0.6807, Adjusted R-squared:  0.6801 
## F-statistic:  1322 on 4 and 2481 DF,  p-value: < 2.2e-16

El modelo obtenido mediante el proceso de regresión stepwise hacia adelante confirma los hallazgos previos y ofrece una versión más refinada del modelo de regresión lineal múltiple, manteniendo un adecuado nivel de ajuste y capacidad predictiva. Como siguiente paso, se procede a realizar una última modelación utilizando un enfoque logarítmico, con el fin de evaluar si este permite mejorar la representación y explicación de la relación entre las variables.

4. Realice la validación de supuestos del modelo e interprete los resultados (no es necesario corregir en caso de presentar problemas, solo realizar sugerencias de que se podría hacer).

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

errores es cero E[u]=0

summary(modelo_multi_vivi$residuals)
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
## -1108.22  -115.81   -21.89     0.00    75.94   994.43
t.test(modelo_multi_vivi$residuals, mu=0)
## 
##  One Sample t-test
## 
## data:  modelo_multi_vivi$residuals
## t = 1.6433e-15, df = 2485, p-value = 1
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
##  -8.098673  8.098673
## sample estimates:
##    mean of x 
## 6.786922e-15

P valor=1>α=0.05, se tiene evidencia suficiente para no rechazar que Ho:ßo=0, por tanto el supuesto se cumple.

Supuesto 2 : Los errores tienen varianza constante. V[ui]=σ2

lmtest::gqtest(modelo_multi_vivi)
## 
##  Goldfeld-Quandt test
## 
## data:  modelo_multi_vivi
## GQ = 1.2743, df1 = 1238, df2 = 1238, p-value = 1.029e-05
## alternative hypothesis: variance increases from segment 1 to 2
shapiro.test(modelo_multi_vivi$residuals)
## 
##  Shapiro-Wilk normality test
## 
## data:  modelo_multi_vivi$residuals
## W = 0.8966, p-value < 2.2e-16

Como P valor=3.509e−08<α=0.05, se rechaza la hipótesis nula, quiere decir que, los errores no se distibuyen de forma normal, el supuesto no se cumple.

Supuesto 4 : Los errores son independientes unos de otros E[ui,uj]

lmtest::dwtest(modelo_multi_vivi)
## 
##  Durbin-Watson test
## 
## data:  modelo_multi_vivi
## DW = 1.5644, p-value < 2.2e-16
## alternative hypothesis: true autocorrelation is greater than 0

Como Pvalor=2.2e-16<α=0.05, se rechaza la hipótesis nula, quiere decir que, los errores no son indepentientes, el supuesto no se cumple

##5. Con el modelo identificado debe predecir el precio de la vivienda con las características de la primera solicitud.

6.Con las predicciones del modelo sugiera potenciales ofertas que responda a la solicitud de la vivienda 1. Tenga encuentra que la empresa tiene crédito preaprobado de máximo 350 millones de pesos. Realice un análisis y presente en un mapa al menos 5 ofertas potenciales que debe discutir.

pos <- which(vivienda_casas$estrato>=4 & vivienda_casas$areaconst>= 200 & vivienda_casas$parqueaderos>=1 & vivienda_casas$banios>=2 & vivienda_casas$habitaciones>=4 & vivienda_casas$estrato>=4 & vivienda_casas$estrato<=5 & vivienda_casas$preciom<=350 )
Ofertas_casas <- vivienda_casas[pos,]
Ofertas_casas_5 = Ofertas_casas[order(Ofertas_casas$areaconst, decreasing = TRUE), ]
ofertac5 <- head(Ofertas_casas_5, 5)
knitr::kable(head(Ofertas_casas_5, 5), caption = "5 Ofertas que cumple las caracterisiticas, discriminada por area construida en m2.")
5 Ofertas que cumple las caracterisiticas, discriminada por area construida en m2.
id zona piso estrato preciom areaconst parqueaderos banios habitaciones tipo barrio longitud latitud
7436 Zona Sur 01 4 330 400 2 4 4 Casa el lido -76.54973 3.42484
7499 Zona Oeste 03 4 320 380 2 4 4 Casa santa rita -76.55000 3.45400
6922 Zona Sur NA 4 345 360 3 3 5 Casa nueva tequendama -76.54600 3.41100
3101 Zona Norte 02 5 340 355 2 5 8 Casa san vicente -76.52377 3.46384
7903 Zona Oeste 02 4 325 355 2 3 4 Casa santa rita -76.55300 3.45300
require(leaflet)

leaflet() %>% addTiles() %>% 
  setView(lng =  -76.51595234451665, lat = 3.436834062816008, zoom = 12)  %>%
  addCircleMarkers(lng = ofertac5$longitud,
                   lat = ofertac5$latitud,
                   label = as.character(paste0(ofertac5$tipo, " est:", ofertac5$estrato, " Precio:",ofertac5$preciom, "'000.000", " Pisos:", ofertac5$piso, " Parqueaderos: ", ofertac5$parqueaderos)), 
                   stroke = FALSE, 
                   fillOpacity = 0.5,
                   radius = 8,
                   color = 'blue'
                   )

BASE 2: Análisis de vivienda tipo “APARTAMENTO”.

Primeros tres apartamentos en la Zona Norte de Cali

# Filtrar los apartamentos en la Zona Norte de Cali
viviendaAPA <- filter(vivienda, zona == "Zona Norte" & tipo == "Apartamento")

# Mostrar los primeros tres apartamentos en una tabla
knitr::kable(head(viviendaAPA, 3), caption = "Primeros tres apartamentos en la Zona Norte de Cali")
Primeros tres apartamentos en la Zona Norte de Cali
id zona piso estrato preciom areaconst parqueaderos banios habitaciones tipo barrio longitud latitud
1212 Zona Norte 01 5 260 90 1 2 3 Apartamento acopi -76.51350 3.45891
1724 Zona Norte 01 5 240 87 1 3 3 Apartamento acopi -76.51700 3.36971
2326 Zona Norte 01 4 220 52 2 2 3 Apartamento acopi -76.51974 3.42627

Posteriormente, visualizamos en un mapa las ubicaciones de estos apartamentos que cumplen con los criterios establecidos por la empresa

# Filtrar los apartamentos en la Zona Norte de Cali
vivienda_norte_apa <- filter(vivienda, tipo == "Apartamento" & zona == "Zona Norte")

# Crear el mapa de los apartamentos en la Zona Norte de Cali
mapaNorteA1 <- leaflet(vivienda_norte_apa) %>%
  addTiles() %>%
  addCircleMarkers(lng = ~longitud, lat = ~latitud, color = "#228CF5", radius = 2)



# Mostrar el mapa
mapaNorteA1

De manera similar a lo observado en el subconjunto de casas, al analizar los apartamentos se identifica la presencia de registros ubicados fuera de la Zona Norte establecida. Esta situación sugiere posibles errores en la asignación de las coordenadas de latitud y longitud dentro del conjunto de datos, lo que ocasiona la representación de puntos fuera del área correspondiente en el mapa.

Con el fin de validar esta hipótesis, se procederá a examinar las zonas centro y sur. Esta verificación adicional permitirá comprender con mayor detalle el comportamiento de los datos y establecer si los errores de ubicación corresponden a un patrón sistemático o si se limitan únicamente a una región específica de la ciudad.

# Filtrar los apartamentos en la Zona Centro de Cali
viviendaAPA2 <- filter(vivienda, zona == "Zona Centro" & tipo == "Apartamento")

# Mostrar los primeros tres apartamentos en la Zona Centro en una tabla
knitr::kable(head(viviendaAPA2, 3), caption = "Primeros tres apartamentos en la Zona Centro de Cali")
Primeros tres apartamentos en la Zona Centro de Cali
id zona piso estrato preciom areaconst parqueaderos banios habitaciones tipo barrio longitud latitud
4654 Zona Centro 03 3 100 70.00 NA 2 3 Apartamento alameda -76.53200 3.45200
4408 Zona Centro 05 3 120 84.00 1 2 3 Apartamento alameda -76.53123 3.44011
4395 Zona Centro 04 3 125 66.76 NA 2 3 Apartamento bretaña -76.53111 3.44034
# Filtrar los datos de apartamentos en la Zona Centro de Cali
vivienda_centro_apa <- filter(vivienda, tipo == "Apartamento" & zona == "Zona Centro")

# Crear el mapa de los apartamentos en la Zona Centro de Cali
mapa_centro_apa <- leaflet(vivienda_centro_apa) %>%
  addTiles() %>%
  addCircleMarkers(lng = ~longitud, lat = ~latitud, color = "#F5E322", radius = 2)




# Mostrar el mapa
mapa_centro_apa
# Filtrar los apartamentos en la Zona Sur de Cali
viviendaAPA3 <- filter(vivienda, zona == "Zona Sur" & tipo == "Apartamento")

# Mostrar los primeros tres apartamentos en la Zona Sur en una tabla
knitr::kable(head(viviendaAPA3, 3), caption = "Primeros tres apartamentos en la Zona Sur de Cali")
Primeros tres apartamentos en la Zona Sur de Cali
id zona piso estrato preciom areaconst parqueaderos banios habitaciones tipo barrio longitud latitud
5098 Zona Sur 05 4 290 96 1 2 3 Apartamento acopi -76.53464 3.44987
698 Zona Sur 02 3 78 40 1 1 2 Apartamento aguablanca -76.50100 3.40000
8199 Zona Sur NA 6 875 194 2 5 3 Apartamento aguacatal -76.55700 3.45900
# Filtrar los datos de apartamentos en la Zona Sur de Cali
vivienda_sur_apa <- filter(vivienda, tipo == "Apartamento" & zona == "Zona Sur")

# Crear el mapa de los apartamentos en la Zona Sur de Cali
mapa_sur_apa <- leaflet(vivienda_sur_apa) %>%
  addTiles() %>%
  addCircleMarkers(lng = ~longitud, lat = ~latitud, color = "#62162f", radius = 2)


# Mostrar el mapa
mapa_sur_apa

Al igual que en el caso de las casas, el análisis de los apartamentos revela la presencia de puntos localizados fuera de las zonas específicas de la ciudad. Esto sugiere posibles errores en la georreferenciación de los datos, lo que ocasiona la representación de registros por fuera de las áreas establecidas. En consecuencia, al graficar los puntos en los distintos sectores de Cali, es probable identificar ubicaciones que no corresponden a las zonas definidas.

vivienda_apartamentos <- filter(vivienda, tipo == "Apartamento")
knitr::kable(head(vivienda_casas, 5), caption = "Apartamentos")
Apartamentos
id zona piso estrato preciom areaconst parqueaderos banios habitaciones tipo barrio longitud latitud
1147 Zona Oriente NA 3 250 70 1 3 6 Casa 20 de julio -76.51168 3.43382
1169 Zona Oriente NA 3 320 120 1 2 3 Casa 20 de julio -76.51237 3.43369
1350 Zona Oriente NA 3 350 220 2 2 4 Casa 20 de julio -76.51537 3.43566
5992 Zona Sur 02 4 400 280 3 5 3 Casa 3 de julio -76.54000 3.43500
1209 Zona Norte 02 5 320 150 2 4 6 Casa acopi -76.51341 3.47968
colores <- colorFactor(palette = c("#7b9400","#228CF5", "#F5E322", "#62162f", "#008000"), domain = vivienda_apartamentos$zona)



mapaAPA<- leaflet(vivienda_apartamentos) %>%
  addTiles()  %>%
  addCircleMarkers(lng = ~longitud, lat = ~latitud, color = ~colores(zona), radius = 3)

mapaAPA

El gráfico anterior muestra la distribución de todos los apartamentos registrados en la base de datos, donde cada punto está diferenciado por colores según su ubicación en las distintas zonas de la ciudad. Al analizar esta representación, se evidencian inconsistencias en los datos que podrían atribuirse a dos factores principales: errores humanos en el proceso de construcción de la base de datos o la ausencia de actualizaciones en la información. Estas discrepancias generan valores imprecisos de latitud y longitud, lo que repercute directamente en la correcta localización de los apartamentos dentro del mapa.

summary(vivienda_apartamentos)
##        id           zona               piso              estrato     
##  Min.   :   3   Length:5100        Length:5100        Min.   :3.000  
##  1st Qu.:2180   Class :character   Class :character   1st Qu.:4.000  
##  Median :4158   Mode  :character   Mode  :character   Median :5.000  
##  Mean   :4284                                         Mean   :4.727  
##  3rd Qu.:6556                                         3rd Qu.:6.000  
##  Max.   :8317                                         Max.   :6.000  
##                                                                      
##     preciom         areaconst      parqueaderos        banios     
##  Min.   :  58.0   Min.   : 35.0   Min.   : 1.000   Min.   :0.000  
##  1st Qu.: 175.0   1st Qu.: 68.0   1st Qu.: 1.000   1st Qu.:2.000  
##  Median : 279.0   Median : 90.0   Median : 1.000   Median :2.000  
##  Mean   : 366.9   Mean   :112.8   Mean   : 1.568   Mean   :2.617  
##  3rd Qu.: 430.0   3rd Qu.:130.0   3rd Qu.: 2.000   3rd Qu.:3.000  
##  Max.   :1950.0   Max.   :932.0   Max.   :10.000   Max.   :8.000  
##                                   NA's   :869                     
##   habitaciones       tipo              barrio             longitud     
##  Min.   :0.000   Length:5100        Length:5100        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   :2.971                                         Mean   :-76.53  
##  3rd Qu.:3.000                                         3rd Qu.:-76.52  
##  Max.   :9.000                                         Max.   :-76.46  
##                                                                        
##     latitud     
##  Min.   :3.334  
##  1st Qu.:3.380  
##  Median :3.419  
##  Mean   :3.419  
##  3rd Qu.:3.453  
##  Max.   :3.498  
## 

Es importante resaltar que, al igual que en el subconjunto de casas, las variables baños y habitaciones presentan una particularidad: su valor mínimo registrado es cero. Este resultado resulta atípico, dado que se espera que todo apartamento cuente, como mínimo, con una habitación y un baño. Por ello, resulta fundamental analizar si dichos valores corresponden a registros erróneos o si, en realidad, representan datos faltantes que no fueron correctamente reportados en la base de datos.

missing_values_apa <-sapply(vivienda_apartamentos, function(x) sum(is.na(x))) 
knitr::kable(missing_values_apa, caption = "Datos ausentes")
Datos ausentes
x
id 0
zona 0
piso 1381
estrato 0
preciom 0
areaconst 0
parqueaderos 869
banios 0
habitaciones 0
tipo 0
barrio 0
longitud 0
latitud 0
datos_cero_habitaciones_apa <- vivienda_apartamentos %>%
  filter(habitaciones == 0)

print(datos_cero_habitaciones_apa)
## # A tibble: 21 × 13
##       id zona   piso  estrato preciom areaconst parqueaderos banios habitaciones
##    <dbl> <chr>  <chr>   <dbl>   <dbl>     <dbl>        <dbl>  <dbl>        <dbl>
##  1  6839 Zona … <NA>        6     900       250            2      0            0
##  2  1523 Zona … 02          5     195        35           NA      1            0
##  3  3062 Zona … 06          4     285        90           NA      4            0
##  4  1524 Zona … 10          5     330        91           NA      3            0
##  5  5392 Zona … 12          4     650       270           NA      4            0
##  6  3458 Zona … 07          5     415       118            2      5            0
##  7  6173 Zona … 09          5     380       120            2      0            0
##  8  2532 Zona … 01          4     275        96            2      2            0
##  9  3997 Zona … 12          4     240        73            1      2            0
## 10  1594 Zona … 03          4     152        60            1      2            0
## # ℹ 11 more rows
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
datos_cero_banios_apa <- vivienda_apartamentos %>%
  filter(banios == 0)

print(datos_cero_banios_apa)
## # A tibble: 14 × 13
##       id zona   piso  estrato preciom areaconst parqueaderos banios habitaciones
##    <dbl> <chr>  <chr>   <dbl>   <dbl>     <dbl>        <dbl>  <dbl>        <dbl>
##  1  6839 Zona … <NA>        6     900       250            2      0            0
##  2  1898 Zona … <NA>        4     220        68           NA      0            3
##  3  6173 Zona … 09          5     380       120            2      0            0
##  4  3553 Zona … 05          5     320        92           NA      0            3
##  5  5908 Zona … <NA>        5     950       280           10      0            0
##  6  7011 Zona … <NA>        4     160        76           NA      0            0
##  7  7132 Zona … 02          5     310        80            1      0            1
##  8  7884 Zona … 03          5     380       108           NA      0            0
##  9  7522 Zona … <NA>        3     148        87           NA      0            0
## 10  6513 Zona … 07          5     640       167            2      0            3
## 11  4526 Zona … 02          6    1000       520           NA      0            5
## 12  4915 Zona … <NA>        4     160        84            1      0            0
## 13  1356 Zona … 02          3     320       310           NA      0            0
## 14  8007 Zona … <NA>        6     410       129           NA      0            0
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>

Tras la revisión de los datos, se identificó la presencia de valores iguales a cero en las variables habitaciones y baños del conjunto de apartamentos. Estos registros resultan inconsistentes, ya que es razonable asumir que cualquier apartamento debe contar, como mínimo, con una habitación y un baño.

En consecuencia, se optó por eliminar dichos valores, dado que su inclusión podría distorsionar los análisis y conducir a resultados poco confiables. Al garantizar la limpieza y coherencia de la base de datos, se fortalece la precisión del análisis y se incrementa la validez de las conclusiones sobre las características y el valor de los apartamentos registrados.

vivienda_apartamentos_limpia <- vivienda_apartamentos %>%
  filter(habitaciones != 0 & banios != 0)

knitr::kable(head(vivienda_apartamentos_limpia), caption = "Base de datos de Apartamentos limpia")
Base de datos de Apartamentos limpia
id zona piso estrato preciom areaconst parqueaderos banios habitaciones tipo barrio longitud latitud
1212 Zona Norte 01 5 260 90 1 2 3 Apartamento acopi -76.51350 3.45891
1724 Zona Norte 01 5 240 87 1 3 3 Apartamento acopi -76.51700 3.36971
2326 Zona Norte 01 4 220 52 2 2 3 Apartamento acopi -76.51974 3.42627
4386 Zona Norte 01 5 310 137 2 3 4 Apartamento acopi -76.53105 3.38296
7497 Zona Norte 02 6 520 98 2 2 2 Apartamento acopi -76.54999 3.43505
5424 Zona Norte 03 4 320 108 2 3 3 Apartamento acopi -76.53638 3.40770

Una vez completada la limpieza de la base de datos de apartamentos, mediante la eliminación de los registros con valores cero en las variables habitaciones y baños, se procede a una exploración inicial de los datos. En esta fase, el análisis se centrará en evaluar la normalidad de las variables y en examinar las correlaciones entre ellas, con el fin de obtener una comprensión preliminar de su comportamiento y posibles relaciones.

options(repos = c(CRAN = "https://cran.rstudio.com"))
plot_ly(vivienda_apartamentos_limpia, x = ~preciom, type = "histogram")%>%
  layout(title = "Histograma de precios - apartamentos")

Al analizar el histograma de los precios de los apartamentos, se observa una concentración de datos hacia la izquierda, particularmente en el rango comprendido entre 60 y 420 millones de pesos. Cabe destacar que la mayoría de los valores se agrupan en torno a la media, que se sitúa en 279 millones de pesos, lo que refleja una tendencia central claramente definida en la distribución de los precios.

plot_ly(vivienda_apartamentos_limpia, x = ~areaconst, type = "histogram")%>%
  layout(title = "Histograma de área construida - apartamentos")

Al analizar el histograma del área construida de los apartamentos, se observa una distribución sesgada hacia la izquierda, lo que indica que la mayoría de los registros corresponden a apartamentos con áreas construidas reducidas.

Asimismo, la mayor parte de los valores se sitúa por debajo de la media, estimada en 90 metros cuadrados, lo que refuerza la conclusión de que, en general, los apartamentos de la base de datos presentan dimensiones relativamente modestas en comparación con el promedio.

plot_ly(vivienda_apartamentos_limpia, x = ~banios, type = "histogram")%>%
  layout(title = "Histograma del número de baños - apartamentos")

El histograma del número de baños en los apartamentos muestra una distribución que se aproxima a la normalidad, con una clara concentración de datos en torno al valor medio, que corresponde a 2 baños.

Esta distribución centrada alrededor de la media indica que la mayoría de los apartamentos en la base de datos cuentan con un número de baños relativamente estándar, lo cual refleja tanto las características predominantes de la oferta habitacional como las expectativas y necesidades más comunes de los compradores o arrendatarios en el área de estudio.

plot_ly(vivienda_apartamentos_limpia, x = ~habitaciones, type = "histogram")%>%
  layout(title = "Histograma del número de habitaciones - apartamentos")

El histograma del número de habitaciones en los apartamentos presenta una distribución que se aproxima a la normalidad, con una concentración predominante de valores alrededor de la media, que corresponde a 3 habitaciones.

Este patrón indica que la mayoría de los apartamentos en la base de datos cuentan con un número de habitaciones relativamente estándar, lo cual refleja tanto las características más frecuentes de la oferta inmobiliaria como las preferencias y necesidades habituales de los compradores o arrendatarios en el área de estudio.

plot_ly(vivienda_apartamentos_limpia, x = ~zona, type = "histogram")%>%
  layout(title = "Histograma de la zona - apartamentos")

El histograma de las zonas de los apartamentos evidencia que la mayor concentración se encuentra en la zona sur, seguida por la zona norte.

Este patrón de distribución geográfica ofrece una perspectiva relevante sobre la localización de las viviendas en el área de estudio. La predominancia de apartamentos en la zona sur podría estar asociada con factores como la disponibilidad de suelo urbano, la densidad poblacional o las preferencias habitacionales de los residentes.

Concluido el análisis de la normalidad de los datos, el siguiente paso será identificar las correlaciones entre las variables del conjunto de apartamentos, con el fin de comprender con mayor profundidad sus relaciones y su impacto en el comportamiento del mercado inmobiliario.

cor_1_apa <-vivienda_apartamentos_limpia[,c("preciom","areaconst","banios","habitaciones")]
ggpairs(cor_1_apa, title="Correlación apartamentos") 

El análisis de la matriz de correlación del conjunto de datos de apartamentos revela que las variables área construida y baños presentan una fuerte asociación con el precio de los inmuebles, con coeficientes de 0.83 y 0.75, respectivamente. En contraste, la variable habitaciones muestra una correlación considerablemente menor con el precio.

Es relevante señalar que la alta correlación entre el precio y las variables área construida y baños podría dar lugar a problemas de multicolinealidad en la estimación del Modelo de Regresión Lineal Múltiple (MRLM). No obstante, esta situación solo podrá ser confirmada a través de la verificación y validación de los supuestos del modelo.

Regresión lineal

datos_imputados_apa <- vivienda_apartamentos_limpia %>%
  mutate(parqueaderos = ifelse(is.na(parqueaderos), mean(parqueaderos, na.rm = TRUE), parqueaderos))

# Antes de realizar el modelo de RLM, se debe convertir la variable estrato.
datos_imputados_apa$estrato <- factor(datos_imputados_apa$estrato, levels = c("3", "4", "5", "6"))

# Convertir el factor a valores numéricos
datos_imputados_apa$estrato_numerico <- as.numeric(datos_imputados_apa$estrato)

modelo_apartamentos = lm(preciom ~ areaconst + estrato_numerico + parqueaderos + habitaciones + banios, data = datos_imputados_apa)
summary(modelo_apartamentos)
## 
## Call:
## lm(formula = preciom ~ areaconst + estrato_numerico + parqueaderos + 
##     habitaciones + banios, data = datos_imputados_apa)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1760.48   -54.19    -1.83    47.54  1003.83 
## 
## Coefficients:
##                    Estimate Std. Error t value Pr(>|t|)    
## (Intercept)      -176.66157   10.27856  -17.19   <2e-16 ***
## areaconst           2.08407    0.04396   47.41   <2e-16 ***
## estrato_numerico   58.87480    2.49077   23.64   <2e-16 ***
## parqueaderos       88.02545    3.66490   24.02   <2e-16 ***
## habitaciones      -41.69516    3.38391  -12.32   <2e-16 ***
## banios             51.40802    3.02931   16.97   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 129.8 on 5068 degrees of freedom
## Multiple R-squared:  0.799,  Adjusted R-squared:  0.7988 
## F-statistic:  4028 on 5 and 5068 DF,  p-value: < 2.2e-16

Tras la estimación del modelo de Regresión Lineal Múltiple (RLM) con las variables seleccionadas, se observó que todas resultan estadísticamente significativas, dado que el valor de probabilidad asociado a cada coeficiente es inferior a 0.05. Esta conclusión también se respalda mediante la regla práctica del estadístico t, que considera significativos aquellos valores iguales o superiores a 2.

Al examinar el efecto de cada variable sobre el precio de los apartamentos, se encontró que los signos de los coeficientes son, en su mayoría, coherentes con lo esperado. Por ejemplo, el coeficiente positivo del área construida y del estrato resulta lógico, ya que se anticipa que un mayor metraje y un estrato socioeconómico más alto se asocien con precios más elevados. No obstante, el coeficiente negativo de la variable habitaciones requiere una interpretación más detallada, pues podría reflejar que un número excesivo de habitaciones no necesariamente incrementa el valor del inmueble e, incluso, podría estar asociado a una disminución del precio.

En relación con la bondad de ajuste, el coeficiente de determinación (R²) alcanzó un valor de 79.9%, lo que indica que el modelo explica aproximadamente el 79.9% de la variabilidad en el precio de los apartamentos. Aunque este valor es elevado, el coeficiente de determinación ajustado mostró un valor ligeramente inferior, lo que sugiere que la inclusión de variables adicionales no aportaría mejoras sustanciales al modelo.

modelo_b0_apa<- lm(preciom ~ 1, data=datos_imputados_apa)

modelo_all_apa <- lm(preciom ~ areaconst + estrato_numerico + parqueaderos + habitaciones + banios, data = datos_imputados_apa)

forward_apa <- step(modelo_b0_apa, direction='forward', scope=formula(modelo_all_apa), trace=0)

knitr::kable(forward_apa$anova)
Step Df Deviance Resid. Df Resid. Dev AIC
NA NA 5073 424980908 57519.19
+ areaconst -1 295692993 5072 129287916 51483.12
+ estrato_numerico -1 25695926 5071 103591989 50360.81
+ parqueaderos -1 12588773 5070 91003216 49705.40
+ banios -1 3001296 5069 88001920 49537.24
+ habitaciones -1 2559588 5068 85442332 49389.47
summary(forward_apa)
## 
## Call:
## lm(formula = preciom ~ areaconst + estrato_numerico + parqueaderos + 
##     banios + habitaciones, data = datos_imputados_apa)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1760.48   -54.19    -1.83    47.54  1003.83 
## 
## Coefficients:
##                    Estimate Std. Error t value Pr(>|t|)    
## (Intercept)      -176.66157   10.27856  -17.19   <2e-16 ***
## areaconst           2.08407    0.04396   47.41   <2e-16 ***
## estrato_numerico   58.87480    2.49077   23.64   <2e-16 ***
## parqueaderos       88.02545    3.66490   24.02   <2e-16 ***
## banios             51.40802    3.02931   16.97   <2e-16 ***
## habitaciones      -41.69516    3.38391  -12.32   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 129.8 on 5068 degrees of freedom
## Multiple R-squared:  0.799,  Adjusted R-squared:  0.7988 
## F-statistic:  4028 on 5 and 5068 DF,  p-value: < 2.2e-16

La aplicación del procedimiento de selección de variables stepwise arrojó resultados consistentes con el modelo de regresión lineal múltiple previamente estimado. Esto indica que las variables seleccionadas mantienen un efecto significativo en la predicción del precio de los apartamentos.

El análisis mediante stepwise permitió identificar las mismas variables significativas que en el modelo inicial, lo que refuerza la robustez de las relaciones detectadas entre las variables predictoras y la variable de respuesta, y brinda mayor confianza en la validez del modelo propuesto.

install.packages("stargazer")
## Installing package into 'C:/Users/Ivan VC/AppData/Local/R/win-library/4.4'
## (as 'lib' is unspecified)
## package 'stargazer' successfully unpacked and MD5 sums checked
## 
## The downloaded binary packages are in
##  C:\Users\Ivan VC\AppData\Local\Temp\RtmpQ9JOxq\downloaded_packages
library(stargazer)
## 
## Please cite as:
##  Hlavac, Marek (2022). stargazer: Well-Formatted Regression and Summary Statistics Tables.
##  R package version 5.2.3. https://CRAN.R-project.org/package=stargazer
modelo_apartamentos_log = lm(log(preciom) ~ log(areaconst) + estrato_numerico + log(parqueaderos) + log(habitaciones) + log(banios), data = datos_imputados_apa)

modelo_apartamentos_log_2 = lm(log(preciom) ~ log(areaconst) + estrato_numerico + parqueaderos + log(habitaciones) + banios, data = datos_imputados_apa)

stargazer(modelo_apartamentos, modelo_apartamentos_log, modelo_apartamentos_log_2, type = "text")
## 
## ======================================================================
##                                          Dependent variable:          
##                                 --------------------------------------
##                                   preciom          log(preciom)       
##                                     (1)          (2)          (3)     
## ----------------------------------------------------------------------
## areaconst                         2.084***                            
##                                   (0.044)                             
##                                                                       
## log(areaconst)                                 0.695***     0.670***  
##                                                (0.013)      (0.013)   
##                                                                       
## estrato_numerico                 58.875***     0.236***     0.245***  
##                                   (2.491)      (0.005)      (0.005)   
##                                                                       
## parqueaderos                     88.025***                  0.078***  
##                                   (3.665)                   (0.006)   
##                                                                       
## habitaciones                     -41.695***                           
##                                   (3.384)                             
##                                                                       
## banios                           51.408***                  0.093***  
##                                   (3.029)                   (0.005)   
##                                                                       
## log(parqueaderos)                              0.129***               
##                                                (0.011)                
##                                                                       
## log(habitaciones)                             -0.187***    -0.181***  
##                                                (0.016)      (0.016)   
##                                                                       
## log(banios)                                    0.248***               
##                                                (0.013)                
##                                                                       
## Constant                        -176.662***    1.769***     1.755***  
##                                   (10.279)     (0.045)      (0.044)   
##                                                                       
## ----------------------------------------------------------------------
## Observations                       5,074        5,074        5,074    
## R2                                 0.799        0.880        0.881    
## Adjusted R2                        0.799        0.880        0.881    
## Residual Std. Error (df = 5068)   129.843       0.226        0.226    
## F Statistic (df = 5; 5068)      4,027.937*** 7,462.292*** 7,515.777***
## ======================================================================
## Note:                                      *p<0.1; **p<0.05; ***p<0.01

El análisis comparativo de los tres modelos de regresión evidencia que tanto el Modelo 2 como el Modelo 3 presentan un desempeño superior en relación con el Modelo 1.

En el caso del Modelo 2, el coeficiente de determinación (R²) alcanzó un valor del 88%, lo que implica que las variables explicativas incluidas permiten explicar el 88% de la variabilidad del precio de los apartamentos. Asimismo, todas las variables resultaron estadísticamente significativas al 99%. Por su parte, el Modelo 3 mostró una ligera mejora en el coeficiente de determinación ajustado, con un valor de 88.1%, manteniendo también un nivel de significancia del 99% en todas las variables.

En cuanto a la interpretación de los coeficientes, los signos obtenidos fueron consistentes con los modelos previos. No obstante, al aplicar la transformación logarítmica en el Modelo 3, se observó una mayor estabilidad en los coeficientes, particularmente en variables como parqueaderos y la constante. Este comportamiento sugiere que el modelo con transformación logarítmica presenta una mayor robustez y consistencia en la estimación de los parámetros, consolidándose como la alternativa más adecuada entre los tres evaluados.