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")
| 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 |
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")
| 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")
| 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")
| 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")
| 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")
| 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.
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")
| 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")
| 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.
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.
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.
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.")
| 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'
)
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")
| 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")
| 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")
| 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")
| 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")
| 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")
| 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.
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.