Limpieza de datos

vivienda <- vivienda %>%
  select(preciom, areaconst, parqueaderos, banios, habitaciones, estrato,
         tipo, zona, barrio, longitud, latitud) %>%
  na.omit()

Descripción de datos

str(vivienda)
## tibble [6,717 × 11] (S3: tbl_df/tbl/data.frame)
##  $ preciom     : num [1:6717] 250 320 350 400 260 240 220 310 320 780 ...
##  $ areaconst   : num [1:6717] 70 120 220 280 90 87 52 137 150 380 ...
##  $ parqueaderos: num [1:6717] 1 1 2 3 1 1 2 2 2 2 ...
##  $ banios      : num [1:6717] 3 2 2 5 2 3 2 3 4 3 ...
##  $ habitaciones: num [1:6717] 6 3 4 3 3 3 3 4 6 3 ...
##  $ estrato     : num [1:6717] 3 3 3 4 5 5 4 5 5 5 ...
##  $ tipo        : chr [1:6717] "Casa" "Casa" "Casa" "Casa" ...
##  $ zona        : chr [1:6717] "Zona Oriente" "Zona Oriente" "Zona Oriente" "Zona Sur" ...
##  $ barrio      : chr [1:6717] "20 de julio" "20 de julio" "20 de julio" "3 de julio" ...
##  $ longitud    : num [1:6717] -76.5 -76.5 -76.5 -76.5 -76.5 ...
##  $ latitud     : num [1:6717] 3.43 3.43 3.44 3.44 3.46 ...
##  - attr(*, "na.action")= 'omit' Named int [1:1605] 11 20 28 29 30 31 32 33 34 35 ...
##   ..- attr(*, "names")= chr [1:1605] "11" "20" "28" "29" ...
summary(vivienda)
##     preciom         areaconst       parqueaderos        banios      
##  Min.   :  58.0   Min.   :  30.0   Min.   : 1.000   Min.   : 0.000  
##  1st Qu.: 248.0   1st Qu.:  86.0   1st Qu.: 1.000   1st Qu.: 2.000  
##  Median : 355.0   Median : 130.0   Median : 2.000   Median : 3.000  
##  Mean   : 468.9   Mean   : 181.1   Mean   : 1.835   Mean   : 3.255  
##  3rd Qu.: 580.0   3rd Qu.: 233.0   3rd Qu.: 2.000   3rd Qu.: 4.000  
##  Max.   :1999.0   Max.   :1745.0   Max.   :10.000   Max.   :10.000  
##   habitaciones       estrato         tipo               zona          
##  Min.   : 0.000   Min.   :3.00   Length:6717        Length:6717       
##  1st Qu.: 3.000   1st Qu.:4.00   Class :character   Class :character  
##  Median : 3.000   Median :5.00   Mode  :character   Mode  :character  
##  Mean   : 3.611   Mean   :4.83                                        
##  3rd Qu.: 4.000   3rd Qu.:6.00                                        
##  Max.   :10.000   Max.   :6.00                                        
##     barrio             longitud         latitud     
##  Length:6717        Min.   :-76.59   Min.   :3.333  
##  Class :character   1st Qu.:-76.54   1st Qu.:3.379  
##  Mode  :character   Median :-76.53   Median :3.412  
##                     Mean   :-76.53   Mean   :3.415  
##                     3rd Qu.:-76.52   3rd Qu.:3.451  
##                     Max.   :-76.46   Max.   :3.498
dim(vivienda)
## [1] 6717   11

La base de datos contiene información de viviendas disponibles en el mercado inmobiliario, incluyendo variables estructurales como área construida, número de habitaciones, baños, parqueaderos y estrato socioeconómico. Estas variables permiten analizar los factores que influyen en el precio de las viviendas.

FILTRO VIVIENDA 1

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

head(base1,3)
## # A tibble: 3 × 11
##   preciom areaconst parqueaderos banios habitaciones estrato tipo  zona   barrio
##     <dbl>     <dbl>        <dbl>  <dbl>        <dbl>   <dbl> <chr> <chr>  <chr> 
## 1     320       150            2      4            6       5 Casa  Zona … acopi 
## 2     780       380            2      3            3       5 Casa  Zona … acopi 
## 3     625       355            3      5            5       4 Casa  Zona … acopi 
## # ℹ 2 more variables: longitud <dbl>, latitud <dbl>
table(base1$tipo)
## 
## Casa 
##  435
table(base1$zona)
## 
## Zona Norte 
##        435

La base de datos contiene información de viviendas disponibles en el mercado inmobiliario, incluyendo variables estructurales como área construida, número de habitaciones, baños, parqueaderos y estrato socioeconómico. Estas variables permiten analizar los factores que influyen en el precio de las viviendas.

MAPA VIVIENDA 1

leaflet(base1) %>%

addTiles() %>%

addCircleMarkers(
  lng = ~longitud,
  lat = ~latitud,
  radius = 5,
  color = "blue",
  popup = ~paste("Precio:", preciom)
)

El mapa muestra la distribución geográfica de las viviendas ubicadas en la zona norte. La visualización permite identificar la concentración de propiedades en ciertos sectores de la ciudad.

ANÁLISIS EXPLORATORIO

ggpairs(base1[,c("preciom","areaconst","estrato","banios","habitaciones")])

El análisis exploratorio permite identificar relaciones entre el precio y variables como el área construida, estrato y número de habitaciones. Se observa que viviendas más grandes y en estratos más altos tienden a tener precios mayores.

MATRIZ DE CORRELACIÓN

cor(base1[,c("preciom","areaconst","estrato","banios","habitaciones")])
##                preciom areaconst    estrato    banios habitaciones
## preciom      1.0000000 0.6853915 0.52827831 0.5086427   0.36508586
## areaconst    0.6853915 1.0000000 0.35352525 0.4574766   0.42068968
## estrato      0.5282783 0.3535252 1.00000000 0.3512569   0.05819709
## banios       0.5086427 0.4574766 0.35125685 1.0000000   0.59038214
## habitaciones 0.3650859 0.4206897 0.05819709 0.5903821   1.00000000

La matriz de correlación permite evaluar la relación entre las variables del modelo. Se observa una relación positiva entre el precio y variables como el área construida y el estrato socioeconómico.

GRÁFICO INTERACTIVO

p <- ggplot(base1,
            aes(x=areaconst,y=preciom)) +
  geom_point() +
  geom_smooth(method="lm") +
  theme_minimal()

ggplotly(p)
## `geom_smooth()` using formula = 'y ~ x'

MODELO DE REGRESIÓN

modelo1 <- lm(preciom ~ areaconst +
                          estrato +
                          habitaciones +
                          parqueaderos +
                          banios,
              data = base1)

summary(modelo1)
## 
## Call:
## lm(formula = preciom ~ areaconst + estrato + habitaciones + parqueaderos + 
##     banios, data = base1)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -784.29  -77.56  -16.03   47.67  978.61 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -238.17090   44.40551  -5.364 1.34e-07 ***
## areaconst       0.67673    0.05281  12.814  < 2e-16 ***
## estrato        80.63495    9.82632   8.206 2.70e-15 ***
## habitaciones    7.64511    5.65873   1.351    0.177    
## parqueaderos   24.00598    5.86889   4.090 5.14e-05 ***
## banios         18.89938    7.48800   2.524    0.012 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 155.1 on 429 degrees of freedom
## Multiple R-squared:  0.6041, Adjusted R-squared:  0.5995 
## F-statistic: 130.9 on 5 and 429 DF,  p-value: < 2.2e-16

El modelo de regresión lineal múltiple estima el efecto de diferentes variables sobre el precio de la vivienda. Los resultados muestran que variables como el área construida y el estrato tienen una relación positiva con el precio.

VALIDACIÓN DE SUPUESTOS

par(mfrow=c(2,2))

plot(modelo1)

PREDICCIÓN VIVIENDA 1

Características

nueva1 <- data.frame(

areaconst = 200,
estrato = 4,
habitaciones = 4,
parqueaderos = 1,
banios = 2

)

predict(modelo1,nueva1)
##       1 
## 312.101

Los gráficos de diagnóstico permiten evaluar los supuestos del modelo de regresión. En general, los residuos no muestran patrones claros, lo que sugiere que el modelo es adecuado.

OFERTAS DENTRO DEL PRESUPUESTO

350 millones

ofertas1 <- base1 %>%
  filter(preciom <= 350)

head(ofertas1,5)
## # A tibble: 5 × 11
##   preciom areaconst parqueaderos banios habitaciones estrato tipo  zona   barrio
##     <dbl>     <dbl>        <dbl>  <dbl>        <dbl>   <dbl> <chr> <chr>  <chr> 
## 1     320       150            2      4            6       5 Casa  Zona … acopi 
## 2     280       148            2      4            4       3 Casa  Zona … alame…
## 3     275       120            1      2            4       4 Casa  Zona … alamos
## 4     220       150            1      2            4       3 Casa  Zona … alamos
## 5     250       240            1      2            4       3 Casa  Zona … barra…
## # ℹ 2 more variables: longitud <dbl>, latitud <dbl>

El modelo permite estimar el precio de una vivienda con las características especificadas. Esta predicción ayuda a evaluar si el valor estimado se encuentra dentro del presupuesto disponible.

MAPA OFERTAS

leaflet(ofertas1) %>%

addTiles() %>%

addCircleMarkers(
  lng=~longitud,
  lat=~latitud,
  color="red",
  popup=~paste("Precio:",preciom)
)

El mapa permite visualizar la ubicación geográfica de las viviendas disponibles dentro del presupuesto, facilitando la identificación de zonas con mayor oferta.

VIVIENDA 2

Apartamento – Zona Sur

base2 <- vivienda %>%
  filter(tipo == "Apartamento", zona == "Zona Sur")

head(base2,3)
## # A tibble: 3 × 11
##   preciom areaconst parqueaderos banios habitaciones estrato tipo   zona  barrio
##     <dbl>     <dbl>        <dbl>  <dbl>        <dbl>   <dbl> <chr>  <chr> <chr> 
## 1     290        96            1      2            3       4 Apart… Zona… acopi 
## 2      78        40            1      1            2       3 Apart… Zona… aguab…
## 3     875       194            2      5            3       6 Apart… Zona… aguac…
## # ℹ 2 more variables: longitud <dbl>, latitud <dbl>
table(base2$zona)
## 
## Zona Sur 
##     2381

Se realiza el mismo análisis para la segunda solicitud, considerando apartamentos en la zona sur con un presupuesto máximo de 850 millones de pesos.

ANÁLISIS EXPLORATORIO VIVIENDA 2

ggpairs(base2[,c("preciom","areaconst","estrato","banios","habitaciones")])

CORRELACIÓN VIVIENDA 2

cor(base2[,c("preciom","areaconst","estrato","banios","habitaciones")])
##                preciom areaconst   estrato    banios habitaciones
## preciom      1.0000000 0.7407150 0.6497479 0.7111289    0.2957800
## areaconst    0.7407150 1.0000000 0.4518617 0.6639216    0.4073401
## estrato      0.6497479 0.4518617 1.0000000 0.5348003    0.1768269
## banios       0.7111289 0.6639216 0.5348003 1.0000000    0.5204718
## habitaciones 0.2957800 0.4073401 0.1768269 0.5204718    1.0000000

GRÁFICO INTERACTIVO VIVIENDA 2

p2 <- ggplot(base2,
            aes(x=areaconst,y=preciom)) +
  geom_point() +
  geom_smooth(method="lm") +
  theme_minimal()

ggplotly(p2)
## `geom_smooth()` using formula = 'y ~ x'

MODELO VIVIENDA 2

modelo2 <- lm(preciom ~ areaconst +
                          estrato +
                          habitaciones +
                          parqueaderos +
                          banios,
              data = base2)

summary(modelo2)
## 
## Call:
## lm(formula = preciom ~ areaconst + estrato + habitaciones + parqueaderos + 
##     banios, data = base2)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1092.02   -42.28    -1.33    40.58   926.56 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -261.62501   15.63220 -16.736  < 2e-16 ***
## areaconst       1.28505    0.05403  23.785  < 2e-16 ***
## estrato        60.89709    3.08408  19.746  < 2e-16 ***
## habitaciones  -24.83693    3.89229  -6.381 2.11e-10 ***
## parqueaderos   72.91468    3.95797  18.422  < 2e-16 ***
## banios         50.69675    3.39637  14.927  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 98.02 on 2375 degrees of freedom
## Multiple R-squared:  0.7485, Adjusted R-squared:  0.748 
## F-statistic:  1414 on 5 and 2375 DF,  p-value: < 2.2e-16

VALIDACIÓN MODELO 2

par(mfrow=c(2,2))

plot(modelo2)

PREDICCIÓN VIVIENDA 2

predict(modelo2,nueva1)
##        1 
## 313.9336

OFERTAS VIVIENDA 2

Presupuesto 850 millones

ofertas2 <- base2 %>%
  filter(preciom <= 850)

head(ofertas2,5)
## # A tibble: 5 × 11
##   preciom areaconst parqueaderos banios habitaciones estrato tipo   zona  barrio
##     <dbl>     <dbl>        <dbl>  <dbl>        <dbl>   <dbl> <chr>  <chr> <chr> 
## 1     290        96            1      2            3       4 Apart… Zona… acopi 
## 2      78        40            1      1            2       3 Apart… Zona… aguab…
## 3     220        75            1      2            3       4 Apart… Zona… alf√©…
## 4     210        72            2      2            3       3 Apart… Zona… alf√©…
## 5     115        58            1      2            2       3 Apart… Zona… alf√©…
## # ℹ 2 more variables: longitud <dbl>, latitud <dbl>

MAPA OFERTAS VIVIENDA 2

leaflet(ofertas2) %>%

addTiles() %>%

addCircleMarkers(
  lng=~longitud,
  lat=~latitud,
  color="green",
  popup=~paste("Precio:",preciom)
)

CONCLUSIONES

El análisis realizado permitió identificar relaciones importantes entre el precio de la vivienda y variables estructurales como el área construida, el estrato socioeconómico y el número de habitaciones. Los resultados del modelo de regresión lineal múltiple muestran que estas variables influyen positivamente en el precio de las viviendas.

Las predicciones realizadas con los modelos permiten estimar el valor esperado de viviendas con características específicas. Además, se identificaron diferentes ofertas dentro de los presupuestos establecidos para cada solicitud, lo que facilita la toma de decisiones en procesos de compra e inversión inmobiliaria.

Los mapas interactivos permitieron visualizar la distribución espacial de las viviendas disponibles, ayudando a identificar zonas con mayor concentración de oportunidades dentro del mercado inmobiliario.