# Instalar paquetes

knitr::opts_chunk$set(echo = TRUE)
library(paqueteMODELOS)
## Cargando paquete requerido: boot
## Cargando paquete requerido: broom
## Cargando paquete requerido: GGally
## Cargando paquete requerido: ggplot2
## Registered S3 method overwritten by 'GGally':
##   method from   
##   +.gg   ggplot2
## Cargando paquete requerido: gridExtra
## Cargando paquete requerido: knitr
## Cargando paquete requerido: summarytools
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.4.2
## 
## 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
library(ggplot2)
library(leaflet)
## Warning: package 'leaflet' was built under R version 4.4.3
library(plotly)
## 
## 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
library(car)
## Warning: package 'car' was built under R version 4.4.3
## Cargando paquete requerido: carData
## 
## Adjuntando el paquete: 'car'
## The following object is masked from 'package:dplyr':
## 
##     recode
## The following object is masked from 'package:boot':
## 
##     logit

Cargue de datos

library(paqueteMODELOS)
data("vivienda")
tail(vivienda)
## # A tibble: 6 × 13
##      id zona    piso  estrato preciom areaconst parqueaderos banios habitaciones
##   <dbl> <chr>   <chr>   <dbl>   <dbl>     <dbl>        <dbl>  <dbl>        <dbl>
## 1  6417 Zona S… <NA>        6    1800       400            3      6            5
## 2  6998 Zona S… <NA>        6    1000       189            3      5            4
## 3  8139 Zona S… <NA>        5     530       142            2      4            4
## 4    NA <NA>    <NA>       NA      NA        NA           NA     NA           NA
## 5    NA <NA>    <NA>       NA      NA        NA           NA     NA           NA
## 6    NA <NA>    <NA>       NA     330        NA           NA     NA           NA
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>

Análisis descriptivo

str(vivienda)
## spc_tbl_ [8,322 × 13] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
##  $ id          : num [1:8322] 1147 1169 1350 5992 1212 ...
##  $ zona        : chr [1:8322] "Zona Oriente" "Zona Oriente" "Zona Oriente" "Zona Sur" ...
##  $ piso        : chr [1:8322] NA NA NA "02" ...
##  $ estrato     : num [1:8322] 3 3 3 4 5 5 4 5 5 5 ...
##  $ preciom     : num [1:8322] 250 320 350 400 260 240 220 310 320 780 ...
##  $ areaconst   : num [1:8322] 70 120 220 280 90 87 52 137 150 380 ...
##  $ parqueaderos: num [1:8322] 1 1 2 3 1 1 2 2 2 2 ...
##  $ banios      : num [1:8322] 3 2 2 5 2 3 2 3 4 3 ...
##  $ habitaciones: num [1:8322] 6 3 4 3 3 3 3 4 6 3 ...
##  $ tipo        : chr [1:8322] "Casa" "Casa" "Casa" "Casa" ...
##  $ barrio      : chr [1:8322] "20 de julio" "20 de julio" "20 de julio" "3 de julio" ...
##  $ longitud    : num [1:8322] -76.5 -76.5 -76.5 -76.5 -76.5 ...
##  $ latitud     : num [1:8322] 3.43 3.43 3.44 3.44 3.46 ...
##  - attr(*, "spec")=List of 3
##   ..$ cols   :List of 13
##   .. ..$ id          : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ zona        : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_character" "collector"
##   .. ..$ piso        : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_character" "collector"
##   .. ..$ estrato     : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ preciom     : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ areaconst   : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ parqueaderos: list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ banios      : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ habitaciones: list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ tipo        : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_character" "collector"
##   .. ..$ barrio      : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_character" "collector"
##   .. ..$ longitud    : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ latitud     : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   ..$ default: list()
##   .. ..- attr(*, "class")= chr [1:2] "collector_guess" "collector"
##   ..$ delim  : chr ";"
##   ..- attr(*, "class")= chr "col_spec"
##  - attr(*, "problems")=<externalptr>
head(vivienda)
## # A tibble: 6 × 13
##      id zona    piso  estrato preciom areaconst parqueaderos banios habitaciones
##   <dbl> <chr>   <chr>   <dbl>   <dbl>     <dbl>        <dbl>  <dbl>        <dbl>
## 1  1147 Zona O… <NA>        3     250        70            1      3            6
## 2  1169 Zona O… <NA>        3     320       120            1      2            3
## 3  1350 Zona O… <NA>        3     350       220            2      2            4
## 4  5992 Zona S… 02          4     400       280            3      5            3
## 5  1212 Zona N… 01          5     260        90            1      2            3
## 6  1724 Zona N… 01          5     240        87            1      3            3
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
summary(vivienda)
##        id           zona               piso              estrato     
##  Min.   :   1   Length:8322        Length:8322        Min.   :3.000  
##  1st Qu.:2080   Class :character   Class :character   1st Qu.:4.000  
##  Median :4160   Mode  :character   Mode  :character   Median :5.000  
##  Mean   :4160                                         Mean   :4.634  
##  3rd Qu.:6240                                         3rd Qu.:5.000  
##  Max.   :8319                                         Max.   :6.000  
##  NA's   :3                                            NA's   :3      
##     preciom         areaconst       parqueaderos        banios      
##  Min.   :  58.0   Min.   :  30.0   Min.   : 1.000   Min.   : 0.000  
##  1st Qu.: 220.0   1st Qu.:  80.0   1st Qu.: 1.000   1st Qu.: 2.000  
##  Median : 330.0   Median : 123.0   Median : 2.000   Median : 3.000  
##  Mean   : 433.9   Mean   : 174.9   Mean   : 1.835   Mean   : 3.111  
##  3rd Qu.: 540.0   3rd Qu.: 229.0   3rd Qu.: 2.000   3rd Qu.: 4.000  
##  Max.   :1999.0   Max.   :1745.0   Max.   :10.000   Max.   :10.000  
##  NA's   :2        NA's   :3        NA's   :1605     NA's   :3       
##   habitaciones        tipo              barrio             longitud     
##  Min.   : 0.000   Length:8322        Length:8322        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   : 3.605                                         Mean   :-76.53  
##  3rd Qu.: 4.000                                         3rd Qu.:-76.52  
##  Max.   :10.000                                         Max.   :-76.46  
##  NA's   :3                                              NA's   :3       
##     latitud     
##  Min.   :3.333  
##  1st Qu.:3.381  
##  Median :3.416  
##  Mean   :3.418  
##  3rd Qu.:3.452  
##  Max.   :3.498  
##  NA's   :3

Para el analisis se identifican las variables, y se observa la base de datos tiene la variable piso como númerica, por lo cual, se va a realizar una modificación a númerica

Filtrar la base de datos para incluir solo las ofertas de casas en la zona norte de la ciudad

# Verificar los valores únicos en la columna 'zona'
unique_zonas <- unique(vivienda$zona)

# Imprimir los valores únicos
print("Valores únicos en 'zona':")
## [1] "Valores únicos en 'zona':"
print(unique_zonas)
## [1] "Zona Oriente" "Zona Sur"     "Zona Norte"   "Zona Oeste"   "Zona Centro" 
## [6] NA
table(vivienda$zona)
## 
##  Zona Centro   Zona Norte   Zona Oeste Zona Oriente     Zona Sur 
##          124         1920         1198          351         4726
# Verificar los valores únicos en la columna 'zona'
unique_zonas <- unique(vivienda$zona)

# Imprimir los valores únicos
print("Valores únicos en 'zona':")
## [1] "Valores únicos en 'zona':"
print(unique_zonas)
## [1] "Zona Oriente" "Zona Sur"     "Zona Norte"   "Zona Oeste"   "Zona Centro" 
## [6] NA
# Verificar los valores únicos en la columna 'zona'
unique_zonas <- unique(vivienda$zona)

# Imprimir los valores únicos
print("Valores únicos en 'zona':")
## [1] "Valores únicos en 'zona':"
print(unique_zonas)
## [1] "Zona Oriente" "Zona Sur"     "Zona Norte"   "Zona Oeste"   "Zona Centro" 
## [6] NA
# Contar la frecuencia de cada zona
frecuencia_zonas <- table(vivienda$zona)

# Imprimir la frecuencia de cada zona
print("Frecuencia de cada zona:")
## [1] "Frecuencia de cada zona:"
print(frecuencia_zonas)
## 
##  Zona Centro   Zona Norte   Zona Oeste Zona Oriente     Zona Sur 
##          124         1920         1198          351         4726
# Visualizar la distribución (gráfico de barras)
barplot(frecuencia_zonas, main = "Distribución de zonas", xlab = "Zona", ylab = "Frecuencia")

# Limpiar los datos (opcional, si encuentras errores)
# Ejemplo: Corregir errores de escritura (reemplaza "zona_erronea" y "zona_correcta")
# vivienda$zona[vivienda$zona == "zona_erronea"] <- "zona_correcta"
# Repite para otros errores...

# Volver a verificar los valores únicos y la frecuencia después de la limpieza
unique_zonas_limpio <- unique(vivienda$zona)
frecuencia_zonas_limpio <- table(vivienda$zona)

print("Valores únicos en 'zona' (después de la limpieza):")
## [1] "Valores únicos en 'zona' (después de la limpieza):"
print(unique_zonas_limpio)
## [1] "Zona Oriente" "Zona Sur"     "Zona Norte"   "Zona Oeste"   "Zona Centro" 
## [6] NA
print("Frecuencia de cada zona (después de la limpieza):")
## [1] "Frecuencia de cada zona (después de la limpieza):"
print(frecuencia_zonas_limpio)
## 
##  Zona Centro   Zona Norte   Zona Oeste Zona Oriente     Zona Sur 
##          124         1920         1198          351         4726
# Volver a graficar si se realizo alguna limpieza.
barplot(frecuencia_zonas_limpio, main = "Distribución de zonas (después de la limpieza)", xlab = "Zona", ylab = "Frecuencia")

Punto 1. Realice un filtro a la base de datos e incluya solo las ofertas de : 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?).

Base1

base1 = vivienda %>%
  filter(tipo == 'Casa' & zona == 'Zona Norte')
# Estructura base1
str(base1)
## spc_tbl_ [722 × 13] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
##  $ id          : num [1:722] 1209 1592 4057 4460 6081 ...
##  $ zona        : chr [1:722] "Zona Norte" "Zona Norte" "Zona Norte" "Zona Norte" ...
##  $ piso        : chr [1:722] "02" "02" "02" "02" ...
##  $ estrato     : num [1:722] 5 5 6 4 5 4 5 5 3 3 ...
##  $ preciom     : num [1:722] 320 780 750 625 750 600 420 490 230 190 ...
##  $ areaconst   : num [1:722] 150 380 445 355 237 160 200 118 160 435 ...
##  $ parqueaderos: num [1:722] 2 2 NA 3 2 1 4 2 NA NA ...
##  $ banios      : num [1:722] 4 3 7 5 6 4 4 4 2 0 ...
##  $ habitaciones: num [1:722] 6 3 6 5 6 5 5 4 3 0 ...
##  $ tipo        : chr [1:722] "Casa" "Casa" "Casa" "Casa" ...
##  $ barrio      : chr [1:722] "acopi" "acopi" "acopi" "acopi" ...
##  $ longitud    : num [1:722] -76.5 -76.5 -76.5 -76.5 -76.5 ...
##  $ latitud     : num [1:722] 3.48 3.49 3.39 3.41 3.37 ...
##  - attr(*, "spec")=List of 3
##   ..$ cols   :List of 13
##   .. ..$ id          : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ zona        : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_character" "collector"
##   .. ..$ piso        : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_character" "collector"
##   .. ..$ estrato     : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ preciom     : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ areaconst   : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ parqueaderos: list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ banios      : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ habitaciones: list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ tipo        : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_character" "collector"
##   .. ..$ barrio      : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_character" "collector"
##   .. ..$ longitud    : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ latitud     : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   ..$ default: list()
##   .. ..- attr(*, "class")= chr [1:2] "collector_guess" "collector"
##   ..$ delim  : chr ";"
##   ..- attr(*, "class")= chr "col_spec"
##  - attr(*, "problems")=<externalptr>
# Ver encabezado / primeras filas base1
kable(head(base1))
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
4460 Zona Norte 02 4 625 355 3 5 5 Casa acopi -76.53179 3.40590
6081 Zona Norte 02 5 750 237 2 6 6 Casa acopi -76.54044 3.36862
7824 Zona Norte 02 4 600 160 1 4 5 Casa acopi -76.55210 3.42125
# Últimas fileas base 1
kable(tail(base1))
id zona piso estrato preciom areaconst parqueaderos banios habitaciones tipo barrio longitud latitud
502 Zona Norte NA 3 190 30 1 2 3 Casa zona norte -76.49763 3.47273
747 Zona Norte NA 3 330 240 1 5 7 Casa zona norte -76.50235 3.47350
804 Zona Norte NA 4 180 120 NA 3 3 Casa zona norte -76.50323 3.49329
1113 Zona Norte NA 4 320 100 1 3 4 Casa zona norte -76.51077 3.48795
4975 Zona Norte NA 6 680 452 1 10 10 Casa zona norte -76.53406 3.45962
536 Zona Norte NA 3 120 61 NA 2 4 Casa zona oriente -76.49824 3.40468
# Mapa sin agrupar base 1
map1 = leaflet(data = base1) %>%
  addTiles() %>%
  addCircleMarkers(lng = ~longitud, lat = ~latitud, radius = 0.3)

map1
# Mapa marcadores agrupados base 1
map2 = leaflet(data = base1) %>%
  addTiles() %>%
  addMarkers(lng = ~longitud, lat = ~latitud, clusterOptions = markerClusterOptions())

map2

2.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.

# Resumen datos
summary(base1)
##        id             zona               piso              estrato     
##  Min.   :  58.0   Length:722         Length:722         Min.   :3.000  
##  1st Qu.: 766.2   Class :character   Class :character   1st Qu.:3.000  
##  Median :2257.0   Mode  :character   Mode  :character   Median :4.000  
##  Mean   :2574.6                                         Mean   :4.202  
##  3rd Qu.:4225.0                                         3rd Qu.:5.000  
##  Max.   :8319.0                                         Max.   :6.000  
##                                                                        
##     preciom         areaconst       parqueaderos        banios      
##  Min.   :  89.0   Min.   :  30.0   Min.   : 1.000   Min.   : 0.000  
##  1st Qu.: 261.2   1st Qu.: 140.0   1st Qu.: 1.000   1st Qu.: 2.000  
##  Median : 390.0   Median : 240.0   Median : 2.000   Median : 3.000  
##  Mean   : 445.9   Mean   : 264.9   Mean   : 2.182   Mean   : 3.555  
##  3rd Qu.: 550.0   3rd Qu.: 336.8   3rd Qu.: 3.000   3rd Qu.: 4.000  
##  Max.   :1940.0   Max.   :1440.0   Max.   :10.000   Max.   :10.000  
##                                    NA's   :287                      
##   habitaciones        tipo              barrio             longitud     
##  Min.   : 0.000   Length:722         Length:722         Min.   :-76.59  
##  1st Qu.: 3.000   Class :character   Class :character   1st Qu.:-76.53  
##  Median : 4.000   Mode  :character   Mode  :character   Median :-76.52  
##  Mean   : 4.507                                         Mean   :-76.52  
##  3rd Qu.: 5.000                                         3rd Qu.:-76.50  
##  Max.   :10.000                                         Max.   :-76.47  
##                                                                         
##     latitud     
##  Min.   :3.333  
##  1st Qu.:3.452  
##  Median :3.468  
##  Mean   :3.460  
##  3rd Qu.:3.482  
##  Max.   :3.496  
## 
# Calcular la matriz de correlación
cor_pre_area <- cor.test(base1$preciom, base1$areaconst)

# Mostrar la matriz de correlación
print(cor_pre_area)
## 
##  Pearson's product-moment correlation
## 
## data:  base1$preciom and base1$areaconst
## t = 28.774, df = 720, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.6954970 0.7635667
## sample estimates:
##      cor 
## 0.731348
plot_ly(data = base1, x = ~areaconst, y = ~preciom, type = "scatter", mode = "markers") %>%
  layout(title = "Correlacion entre Precio y Area Construida",
         xaxis = list(title = "Area Construida"),
         yaxis = list(title = "Precio de la Casa"))

El coeficiente 0.731348 es de relación entre las variables es moderadamente fuerte con relación positiva. En general, a medida que el área construida aumenta, el precio de la casa tambien aumenta.

# Calcular la matriz de correlación
cor_pre_estrato <- cor.test(base1$preciom, base1$estrato)

# Mostrar la matriz de correlación
print(cor_pre_estrato)
## 
##  Pearson's product-moment correlation
## 
## data:  base1$preciom and base1$estrato
## t = 20.783, df = 720, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.5646126 0.6560046
## sample estimates:
##       cor 
## 0.6123503
plot_ly(data = base1, x = ~estrato, y = ~preciom, type = "scatter", mode = "markers", color = I("green")) %>%
  layout(title = "Correlación entre Precio y Estrato",
         xaxis = list(title = "Estrato"),
         yaxis = list(title = "Precio de la Casa"))

Correlación positiva moderada entre precio y estrato

# Calcular la matriz de correlación
cor_pre_banios <- cor.test(base1$preciom, base1$banios)

# Mostrar la matriz de correlación
print(cor_pre_banios)
## 
##  Pearson's product-moment correlation
## 
## data:  base1$preciom and base1$banios
## t = 16.479, df = 720, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.4682514 0.5743680
## sample estimates:
##       cor 
## 0.5233357
plot_ly(data = base1, x = ~banios, y = ~preciom, type = "scatter", mode = "markers", color = I("green")) %>%
  layout(title = "Correlación entre Precio y Número de baños",
         xaxis = list(title = "Número de baños"),
         yaxis = list(title = "Precio de la Casa"))

Un coeficiente de correlación de 0.5233357 indica una correlación positiva moderada pero no fuerte, relación positiva entre las variables de precio y número de baños.

# Calcular la matriz de correlación
cor_pre_hab <- cor.test(base1$preciom, base1$habitaciones)

# Mostrar la matriz de correlación
print(cor_pre_hab)
## 
##  Pearson's product-moment correlation
## 
## data:  base1$preciom and base1$habitaciones
## t = 9.1487, df = 720, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.2557676 0.3865717
## sample estimates:
##       cor 
## 0.3227096
plot_ly(data = base1, x = ~habitaciones, y = ~preciom, type = "scatter", mode = "markers", color = I("green")) %>%
  layout(title = "Correlación entre Precio y Número de habitaciones",
         xaxis = list(title = "Número de habitaciones"),
         yaxis = list(title = "Precio de la Casa"))

Relación positiva debil ente el precio y el # de las habitaciones. No se puede intuir que entre mas habitaciones mayor el valor de la vivienda.

  1. 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).
modelo1=lm(preciom~ areaconst + estrato + habitaciones + parqueaderos + banios, 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
##   (287 observations deleted due to missingness)
## Multiple R-squared:  0.6041, Adjusted R-squared:  0.5995 
## F-statistic: 130.9 on 5 and 429 DF,  p-value: < 2.2e-16

Cuando las variables predictoras son cero el valor de la vivienda es de -238.17090. Sin embargo no es real porque no existe un metraje de cero.

Por cada unidad de aumento en el área construida, el precio de la vivienda aumenta en promedio en 0.67673 millones de pesos con valor significativo.

El estrato aumenta, el precio de la vivienda también en 80 millones de pesos (p-valor < 2.70e-15).

El coeficiente para el número de habitaciones no es estadísticamente significativo (p-valor = 0.177).

Por cada baño adicional, el precio de la vivienda aumenta en promedio en 18 millones de pesos (p-valor = 0.012).

El 60.41% de la variabilidad en el precio de la vivienda es explicada por las variables incluidas en el modelo.

  1. 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).
shapiro.test(resid(modelo1)) 
## 
##  Shapiro-Wilk normality test
## 
## data:  resid(modelo1)
## W = 0.85246, p-value < 2.2e-16

Los resultados de w muestra que los residuos no siguen una distribución normal perfecta.

ncvTest(modelo1)
## Non-constant Variance Score Test 
## Variance formula: ~ fitted.values 
## Chisquare = 352.7061, Df = 1, p = < 2.22e-16

La varianza de los residuos varía a lo largo del rango de valores ajustados por el modelo. El modelo tiene heterocedasticidad

  1. Con el modelo identificado debe predecir el precio de la vivienda con las características de la primera solicitud.
sol1 = data.frame(
  areaconst = 200,
  parqueaderos = 1,
  estrato = c(4,5),
  banios = 2,
  habitaciones = 4
)
sol1
##   areaconst parqueaderos estrato banios habitaciones
## 1       200            1       4      2            4
## 2       200            1       5      2            4
predict(modelo1,sol1)
##        1        2 
## 312.1010 392.7359

Los valores de las viviendas con un área construida de 200m cuadrados, 1 parqueadero, 4 habitaciones y 2 baños en estrato 4 es de 312 millones de pesos. En estrato 5 es de 392 millones de pesos.

  1. 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 pre-aprobado de máximo 350 millones de pesos. Realice un análisis y presente en un mapa al menos 5 ofertas potenciales que debe discutir.
# Filtrar base1 para seleccionar ofertas
ofertas1 <- filter(base1, areaconst >= 200, parqueaderos >= 1, banios >= 2, habitaciones >= 4, estrato == 4)


# Seleccionar las ofertas potenciales máximo de 350 millones de pesos
ofertas1 <- ofertas1[ofertas1$preciom <= 350, ]
ofertas1
## # A tibble: 12 × 13
##       id zona   piso  estrato preciom areaconst parqueaderos banios habitaciones
##    <dbl> <chr>  <chr>   <dbl>   <dbl>     <dbl>        <dbl>  <dbl>        <dbl>
##  1  4458 Zona … 02          4     315      270             2      4            4
##  2  3352 Zona … <NA>        4     335      300             3      4            4
##  3   937 Zona … 02          4     350      280             2      3            4
##  4   952 Zona … 02          4     330      275             2      3            5
##  5  1020 Zona … 02          4     230      250             2      3            5
##  6  1108 Zona … 02          4     330      260             1      3            4
##  7  1144 Zona … <NA>        4     320      200             2      4            4
##  8  7432 Zona … 01          4     260      280             2      4            6
##  9  5031 Zona … 03          4     350      350             1      4            5
## 10  2544 Zona … 01          4     340      264.            2      4            4
## 11  7470 Zona … 02          4     340      264             2      5            7
## 12  1822 Zona … <NA>        4     340      295             2      2            4
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
mapa_ofrt1 <- leaflet(ofertas1) %>%
  addTiles() %>%
  addCircleMarkers(lng = ~longitud, lat = ~latitud, color = "black", radius = 4) %>%
  addLabelOnlyMarkers(lng = ~longitud, lat = ~latitud, label = ~paste("ID:", id), labelOptions = labelOptions(noHide = TRUE))


mapa_ofrt1
  1. Realice los pasos del 1 al 6. Para la segunda solicitud que tiene un crédito pre-aprobado por valor de $850 millones.
base2 <- subset(vivienda, tipo == "Apartamento" & zona == "Zona Sur")
head(base2, 3)
## # A tibble: 3 × 13
##      id zona    piso  estrato preciom areaconst parqueaderos banios habitaciones
##   <dbl> <chr>   <chr>   <dbl>   <dbl>     <dbl>        <dbl>  <dbl>        <dbl>
## 1  5098 Zona S… 05          4     290        96            1      2            3
## 2   698 Zona S… 02          3      78        40            1      1            2
## 3  8199 Zona S… <NA>        6     875       194            2      5            3
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
mapa <- leaflet(data = base2) %>%
  addTiles() %>%
  addMarkers(lng = ~longitud, lat = ~latitud)
# Mostrar el mapa
mapa
# Calcular la matriz de correlación
cor_pre_area <- cor.test(base2$preciom, base2$areaconst)

# Mostrar la matriz de correlación
print(cor_pre_area)
## 
##  Pearson's product-moment correlation
## 
## data:  base2$preciom and base2$areaconst
## t = 61.328, df = 2785, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.7417418 0.7733594
## sample estimates:
##       cor 
## 0.7579955
plot_ly(data = base2, x = ~areaconst, y = ~preciom, type = "scatter", mode = "markers") %>%
  layout(title = "Correlación entre Precio y Área Construida",
         xaxis = list(title = "Área Construida"),
         yaxis = list(title = "Precio de la Casa"))
# Calcular la matriz de correlación
cor_pre_estrato <- cor.test(base2$preciom, base2$estrato)

# Mostrar la matriz de correlación
print(cor_pre_estrato)
## 
##  Pearson's product-moment correlation
## 
## data:  base2$preciom and base2$estrato
## t = 47.98, df = 2785, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.6518591 0.6925382
## sample estimates:
##       cor 
## 0.6727067
plot_ly(data = base2, x = ~banios, y = ~preciom, type = "scatter", mode = "markers", color = I("green")) %>%
  layout(title = "Correlación entre Precio y Número de baños",
         xaxis = list(title = "Número de baños"),
         yaxis = list(title = "Precio de la Casa"))
cor_pre_hab <- cor.test(base2$preciom, base2$habitaciones)
print(cor_pre_hab)
## 
##  Pearson's product-moment correlation
## 
## data:  base2$preciom and base2$habitaciones
## t = 18.559, df = 2785, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.2982991 0.3643944
## sample estimates:
##       cor 
## 0.3317538
plot_ly(data = base2, x = ~habitaciones, y = ~preciom, type = "scatter", mode = "markers", color = I("green")) %>%
  layout(title = "Correlación entre Precio y Número de habitaciones",
         xaxis = list(title = "Número de habitaciones"),
         yaxis = list(title = "Precio de la Casa"))
cor_pre_par <- cor.test(base2$preciom, base2$parqueaderos)
print(cor_pre_par)
## 
##  Pearson's product-moment correlation
## 
## data:  base2$preciom and base2$parqueaderos
## t = 46.942, df = 2379, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.6719868 0.7137277
## sample estimates:
##       cor 
## 0.6934386
plot_ly(data = base2, x = ~parqueaderos, y = ~preciom, type = "scatter", mode = "markers", color = I("green")) %>%
  layout(title = "Correlación entre Precio y Parqueaderos",
         xaxis = list(title = "Número de parqueaderos"),
         yaxis = list(title = "Precio de la Casa"))
## Warning: Ignoring 406 observations

#Modelo de regresión

modelo2=lm(preciom~ areaconst + estrato + habitaciones + parqueaderos + banios, 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
##   (406 observations deleted due to missingness)
## Multiple R-squared:  0.7485, Adjusted R-squared:  0.748 
## F-statistic:  1414 on 5 and 2375 DF,  p-value: < 2.2e-16

El R cuadrado indica que el 74% del modelo se explica con las variables incluidas.

shapiro.test(resid(modelo2)) 
## 
##  Shapiro-Wilk normality test
## 
## data:  resid(modelo2)
## W = 0.79118, p-value < 2.2e-16
ncvTest(modelo2)
## Non-constant Variance Score Test 
## Variance formula: ~ fitted.values 
## Chisquare = 4517.411, Df = 1, p = < 2.22e-16
sol2 = data.frame(
  areaconst = 300,
  parqueaderos = 3,
  estrato = c(5,6),
  banios = 3,
  habitaciones = 5
)
sol2
##   areaconst parqueaderos estrato banios habitaciones
## 1       300            3       5      3            5
## 2       300            3       6      3            5
predict(modelo2,sol2)
##        1        2 
## 675.0247 735.9218
# Filtrar la base2 para seleccionar ofertas potenciales
ofertas2 <- filter(base2, areaconst >= 300, parqueaderos >= 3, banios >= 3, habitaciones >= 5, estrato %in% c(5,6))


# Seleccionar las ofertas potenciales dentro del presupuesto máximo de 350 millones de pesos
ofertas2 <- ofertas2[ofertas2$preciom <= 850, ]
ofertas2
## # A tibble: 2 × 13
##      id zona    piso  estrato preciom areaconst parqueaderos banios habitaciones
##   <dbl> <chr>   <chr>   <dbl>   <dbl>     <dbl>        <dbl>  <dbl>        <dbl>
## 1  7182 Zona S… <NA>        5     730       573            3      8            5
## 2  7512 Zona S… <NA>        5     670       300            3      5            6
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
mapa_ofrt2 <- leaflet(ofertas2) %>%
  addTiles() %>%
  addCircleMarkers(lng = ~longitud, lat = ~latitud, color = "red", radius = 4) %>%
  addLabelOnlyMarkers(lng = ~longitud, lat = ~latitud, label = ~paste("ID:", id), labelOptions = labelOptions(noHide = TRUE))


mapa_ofrt2

Opciones de Compra de Vivienda 2:

Según el análisis de los datos se evidencian dos ofertas de los apartamentos que se encuentran en la zona Sur:

Apartamento 1 (ID 7512) tiene un precio de 670 millones y es estrato 5, su area construida es de 300 metros cuadrados, cuenta con un 3 parqueaderos, 5 baños, 6 habitaciones.

Apartamento 2 (ID 7182) tiene un precio de 730 millones y es estrato 5, su area construida es de 573 metros cuadrados, cuenta con un 3 parqueaderos, 8 baños, 5 habitaciones.