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