#Importación de datos
##El conjunto de datos se encuentra en la libreria paqueteMOD
knitr::opts_chunk$set(echo = TRUE)
library(paqueteMODELOS)
## Loading required package: boot
## Warning: package 'boot' was built under R version 4.2.3
## Loading required package: broom
## Warning: package 'broom' was built under R version 4.2.3
## Loading required package: GGally
## Warning: package 'GGally' was built under R version 4.2.3
## Loading required package: ggplot2
## Warning: package 'ggplot2' was built under R version 4.2.3
## Registered S3 method overwritten by 'GGally':
## method from
## +.gg ggplot2
## Loading required package: gridExtra
## Loading required package: knitr
## Warning: package 'knitr' was built under R version 4.2.3
## Loading required package: summarytools
## Warning: package 'summarytools' was built under R version 4.2.3
data("vivienda")
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>
## Se cuenta con un conjunto de datos de 8,322 viviendas de la ciudad Santiago de Cali, departamento del Valle del Cauca- Colombia, con información distribuida en 12 variables que describen medidas sobre cada vivienda, a saber: zona, piso, estrato, preciom (precio de la vivienda en millones de pesos), areaconst (área construida), parqueaderos, banios (baños), habitaciones, tipo (casa o apto), barrio y las coordenadas geográficas: longitud y latitud.
#La inmobiliaria de María, denominada C&A, recibe una solicitud que con base en este conjunto de datos se plantea el reto de seleccionar objetivamente dos viviendas para una compañía Internacional para ubicar a dos empleados con sus familias en la ciudad Santiago de Cali, con criterios específicos, se propone para resolver el caso:
#1. Realizar filtrado de datos para crear una muestra con el criterio exigido por el cliente en cuanto al tipo de vivienda, Casas y determinar su ubicación en un mapa de la ciudad para facilitar la visualización de datos
#2. Realizar análisis exploratorio de datos enfocado en el criterio exigido por el cliente relacionado con el precio del bien inmueble
#3. Realizar un modelo de regresión lineal múltiple con el propósito de anticipar el valor de las casas en función de las variables independientes (área construida, estrato, número de cuartos, número de parqueaderos, número de baños)
#4. Validar supuestos del modelo para revisar que el modelo cumple con los criterios de validez y confiabilidad.
#5. Con los resultados del modelo, definir la propuesta para presentar al cliente
##Revisar si hay datos faltantes en cada variable
sum(is.na(vivienda$zona))
## [1] 3
sum(is.na(vivienda$piso))
## [1] 2638
sum(is.na(vivienda$estrato))
## [1] 3
sum(is.na(vivienda$areaconst))
## [1] 3
sum(is.na(vivienda$parqueaderos))
## [1] 1605
sum(is.na(vivienda$banios))
## [1] 3
sum(is.na(vivienda$habitaciones))
## [1] 3
sum(is.na(vivienda$tipo))
## [1] 3
sum(is.na(vivienda$barrio))
## [1] 3
sum(is.na(vivienda$longitud))
## [1] 3
sum(is.na(vivienda$latitud))
## [1] 3
##se observa que hay valores faltantes (missing values) en todas las variables, pero particularmente las variables piso y parqueaderos cuentan con una cantidad superior de valores faltantes.
datos1 <- vivienda
#1. Realizar filtrado de datos para crear una muestra con el criterio exigido por el cliente en cuanto al tipo de vivienda, Casas y determinar su ubicación en un mapa de la ciudad para facilitar la visualización de datos
#Una vez realizado la limpieza de datos, se procede al paso 1, filtrado de casas por zonas, para ello creamos una muestra denominada base1
base_1 <-subset(datos1, tipo == "Casa" & zona == "Zona Norte")
head(base_1, 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>
cat( "se tienen", nrow(base_1), "Casas en la zona Norte de Cali")
## se tienen 722 Casas en la zona Norte de Cali
base_2 <- subset(datos1, tipo == "Casa" & zona == "Zona Centro")
head(base_2, 3)
## # A tibble: 3 × 13
## id zona piso estrato preciom areaconst parqueaderos banios habitaciones
## <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 5298 Zona C… 01 3 650 240 2 4 4
## 2 5107 Zona C… 02 4 400 460 NA 5 7
## 3 5117 Zona C… 02 3 380 290 NA 4 8
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
cat( "Se tienen", nrow(base_2), "casas en la zona centro de Cali")
## Se tienen 100 casas en la zona centro de Cali
base_3 <- subset(datos1, tipo == "Casa" & zona == "Zona Oeste")
head(base_3, 3)
## # A tibble: 3 × 13
## id zona piso estrato preciom areaconst parqueaderos banios habitaciones
## <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 6928 Zona O… 03 6 1850 302 4 4 3
## 2 7510 Zona O… 03 6 1950 400 4 5 3
## 3 7586 Zona O… 03 6 870 275 3 5 4
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
cat( "Se tienen", nrow(base_3), "casas en la zona oeste de Cali")
## Se tienen 169 casas en la zona oeste de Cali
base_4 <- subset(datos1, tipo == "Casa" & zona == "Zona Oriente")
head(base_4, 3)
## # A tibble: 3 × 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 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
cat( "Se tienen", nrow(base_4), "casas en la zona oriente de Cali")
## Se tienen 289 casas en la zona oriente de Cali
base_5 <- subset(datos1, tipo == "Casa" & zona == "Zona Sur")
head(base_5, 3)
## # A tibble: 3 × 13
## id zona piso estrato preciom areaconst parqueaderos banios habitaciones
## <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 5992 Zona S… 02 4 400 280 3 5 3
## 2 5157 Zona S… 02 3 500 354 1 2 4
## 3 5501 Zona S… 02 3 175 102 NA 2 4
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
cat( "Se tienen", nrow(base_5), "casas en la zona oriente de Cali")
## Se tienen 1939 casas en la zona oriente de Cali
##Se comprueba la distribución de la variable tipo en Zona para confirmar el filtrado
Tabla_contigencia1 <- table(datos1$zona, datos1$tipo)
print(Tabla_contigencia1)
##
## Apartamento Casa
## Zona Centro 24 100
## Zona Norte 1198 722
## Zona Oeste 1029 169
## Zona Oriente 62 289
## Zona Sur 2787 1939
#Visualización
library(tidyverse)
## Warning: package 'tibble' was built under R version 4.2.3
## Warning: package 'purrr' was built under R version 4.2.3
## Warning: package 'dplyr' was built under R version 4.2.3
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.3 ✔ readr 2.1.4
## ✔ forcats 1.0.0 ✔ stringr 1.5.0
## ✔ lubridate 1.9.2 ✔ tibble 3.2.1
## ✔ purrr 1.0.2 ✔ tidyr 1.3.0
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::combine() masks gridExtra::combine()
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ✖ tibble::view() masks summarytools::view()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(Hmisc)
## Warning: package 'Hmisc' was built under R version 4.2.3
##
## Attaching package: 'Hmisc'
##
## The following objects are masked from 'package:dplyr':
##
## src, summarize
##
## The following objects are masked from 'package:summarytools':
##
## label, label<-
##
## The following objects are masked from 'package:base':
##
## format.pval, units
library(dplyr)
data1 <- filter(base_1, tipo == "Casa" & zona == "Zona Norte")
#Datos de los 10 primeros registros filtrados
data_casas_N = data1[0:10,]
head(data_casas_N)
## # A tibble: 6 × 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 4460 Zona N… 02 4 625 355 3 5 5
## 5 6081 Zona N… 02 5 750 237 2 6 6
## 6 7824 Zona N… 02 4 600 160 1 4 5
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
require(leaflet)
## Loading required package: leaflet
## Warning: package 'leaflet' was built under R version 4.2.3
leaflet() %>% addTiles() %>%
addCircles(lng = data_casas_N$longitud,
lat = data_casas_N$latitud)
data2 <- filter(base_2, tipo == "Casa" & zona == "Zona Centro")
#Datos de los 10 primeros registros filtrados
data_casas_C = data2[0:10,]
head(data_casas_C)
## # A tibble: 6 × 13
## id zona piso estrato preciom areaconst parqueaderos banios habitaciones
## <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 5298 Zona C… 01 3 650 240 2 4 4
## 2 5107 Zona C… 02 4 400 460 NA 5 7
## 3 5117 Zona C… 02 3 380 290 NA 4 8
## 4 4508 Zona C… 03 4 610 750 NA 8 10
## 5 5608 Zona C… 03 3 295 200 1 5 9
## 6 3355 Zona C… <NA> 4 1100 217 1 3 1
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
require(leaflet)
leaflet() %>% addTiles() %>%
addCircles(lng = data_casas_C$longitud,
lat = data_casas_C$latitud)
data3 <- filter(base_3, tipo == "Casa" & zona == "Zona Oeste")
#Datos de los 10 primeros registros filtrados
data_casas_O = data3[0:10,]
head(data_casas_O)
## # A tibble: 6 × 13
## id zona piso estrato preciom areaconst parqueaderos banios habitaciones
## <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 6928 Zona O… 03 6 1850 302 4 4 3
## 2 7510 Zona O… 03 6 1950 400 4 5 3
## 3 7586 Zona O… 03 6 870 275 3 5 4
## 4 8264 Zona O… 03 6 1000 250 2 5 4
## 5 7511 Zona O… 04 6 990 307 4 4 3
## 6 6927 Zona O… <NA> 6 880 282 4 5 3
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
require(leaflet)
leaflet() %>% addTiles() %>%
addCircles(lng = data_casas_O$longitud,
lat = data_casas_O$latitud)
data4 <- filter(base_4, tipo == "Casa" & zona == "Zona Oriente")
#Datos de los 10 primeros registros filtrados
data_casas_Or = data4[0:10,]
head(data_casas_Or)
## # 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 1894 Zona O… 02 3 235 250 NA 3 7
## 5 2768 Zona O… <NA> 3 260 250 NA 2 6
## 6 73 Zona O… 01 3 350 350 NA 3 5
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
require(leaflet)
leaflet() %>% addTiles() %>%
addCircles(lng = data_casas_Or$longitud,
lat = data_casas_Or$latitud)
data5 <- filter(base_5, tipo == "Casa" & zona == "Zona Sur")
#Datos de los 10 primeros registros filtrados
data_casas_S = data5[0:10,]
head(data_casas_S)
## # A tibble: 6 × 13
## id zona piso estrato preciom areaconst parqueaderos banios habitaciones
## <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 5992 Zona S… 02 4 400 280 3 5 3
## 2 5157 Zona S… 02 3 500 354 1 2 4
## 3 5501 Zona S… 02 3 175 102 NA 2 4
## 4 5156 Zona S… <NA> 3 420 369 1 5 5
## 5 3236 Zona S… <NA> 4 240 95 NA 3 3
## 6 7139 Zona S… 03 3 240 75 NA 3 5
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
require(leaflet)
leaflet() %>% addTiles() %>%
addCircles(lng = data_casas_S$longitud,
lat = data_casas_S$latitud)
##Se observa en el ejercicio de mapeo que las coordenadas del filtrado de todas las zonas se distribuyen en el territorio de Santiago de Cali sin discriminación política ni administrativa como lo sugiere el conjunto de datos, se verificó en Google Maps y se confirma que las coordendas de latitud y longitud sí se encuentran en Santiago de Cali y que fueron correctamente posicionadas.
##2. Realizar análisis exploratorio de datos enfocado en el criterio exigido por el cliente relacionado con el precio del bien inmueble
##Para este paso, se toma en referencia la base_1, que es el filtrado de las casas de la zona norte, se verifican valores faltantes de las variables de interés antes del análisis exploratorio de datos.
sum(is.na(base_1$preciom))
## [1] 0
sum(is.na(base_1$areaconst))
## [1] 0
sum(is.na(base_1$zona))
## [1] 0
sum(is.na(base_1$piso))
## [1] 372
sum(is.na(base_1$estrato))
## [1] 0
sum(is.na(base_1$parqueaderos))
## [1] 287
sum(is.na(base_1$banios))
## [1] 0
sum(is.na(base_1$habitaciones))
## [1] 0
sum(is.na(base_1$tipo))
## [1] 0
sum(is.na(base_1$barrio))
## [1] 0
sum(is.na(base_1$longitud))
## [1] 0
sum(is.na(base_1$latitud))
## [1] 0
##Solo las variables piso y parqueaderos tiene valores faltantes, se procede a eliminar de base_1 las variables piso y barrio debido a que no se van a considerar en el proceso de toma de decisión solicitado
datosN <- subset(base_1, select = -piso)
datosNorte <- subset(datosN, select = -barrio)
#Precio vs Área de Construcción
cor(datosNorte$preciom, datosNorte$areaconst)
## [1] 0.731348
library(plotly)
## Warning: package 'plotly' was built under R version 4.2.3
##
## Attaching package: 'plotly'
## The following object is masked from 'package:Hmisc':
##
## subplot
## 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
corprecio_areaconst <- plot_ly(data = datosNorte, x = ~areaconst, y = ~preciom)
corprecio_areaconst
## No trace type specified:
## Based on info supplied, a 'scatter' trace seems appropriate.
## Read more about this trace type -> https://plotly.com/r/reference/#scatter
## No scatter mode specifed:
## Setting the mode to markers
## Read more about this attribute -> https://plotly.com/r/reference/#scatter-mode
ggplot(datosNorte, aes(x=areaconst, y = preciom)) + geom_point() + geom_smooth(method = "lm")
## `geom_smooth()` using formula = 'y ~ x'

##El coeficiente es de 0.73, es decir, 73% de correlación positiva, al observar los gráficos se puede inferir que a mayor área de construcción, mayor es el precio de la vivienda.
#Precio Vs Estrato
cor(datosNorte$preciom, datosNorte$estrato)
## [1] 0.6123503
corprecio_estrato <- plot_ly(data = datosNorte, x = ~estrato, y = ~preciom)
corprecio_estrato
## No trace type specified:
## Based on info supplied, a 'scatter' trace seems appropriate.
## Read more about this trace type -> https://plotly.com/r/reference/#scatter
## No scatter mode specifed:
## Setting the mode to markers
## Read more about this attribute -> https://plotly.com/r/reference/#scatter-mode
ggplot(datosNorte, aes(x=estrato, y = preciom)) + geom_point() + geom_smooth(method = "lm")
## `geom_smooth()` using formula = 'y ~ x'

##El coeficiente es de 0.61, es decir, 61% de correlación positiva, no es una correlación fuerte pero es positiva, se puede inferir que a mayor estrato, mayor es el precio de la vivienda.
#Precio Vs No de Habitaciones
cor(datosNorte$preciom, datosNorte$habitaciones)
## [1] 0.3227096
corprecio_habitaciones <- plot_ly(data = datosNorte, x = ~habitaciones, y = ~preciom)
corprecio_habitaciones
## No trace type specified:
## Based on info supplied, a 'scatter' trace seems appropriate.
## Read more about this trace type -> https://plotly.com/r/reference/#scatter
## No scatter mode specifed:
## Setting the mode to markers
## Read more about this attribute -> https://plotly.com/r/reference/#scatter-mode
ggplot(datosNorte, aes(x=habitaciones, y = preciom)) + geom_point() + geom_smooth(method = "lm")
## `geom_smooth()` using formula = 'y ~ x'

##Se puede ver correlación positiva entre las variables 0,32 (32%) pero es muy débil. Por lo tanto su aporte al precio de las casas lo explica en un 32%.
#Precio Vs No de Baños
cor(datosNorte$preciom, datosNorte$banios)
## [1] 0.5233357
corprecio_bathroom <- plot_ly(data = datosNorte, x = ~banios, y = ~preciom)
corprecio_bathroom
## No trace type specified:
## Based on info supplied, a 'scatter' trace seems appropriate.
## Read more about this trace type -> https://plotly.com/r/reference/#scatter
## No scatter mode specifed:
## Setting the mode to markers
## Read more about this attribute -> https://plotly.com/r/reference/#scatter-mode
ggplot(datosNorte, aes(x=banios, y = preciom)) + geom_point() + geom_smooth(method = "lm")
## `geom_smooth()` using formula = 'y ~ x'

##Se puede ver correlación positiva entre las variables 0,52 (52%) pero no es tan fuerte. Por lo tanto su aporte al precio de las casas es del 52%.
##Realizar un modelo de regresión lineal múltiple con el propósito de anticipar el valor de las casas en función de las variables independientes (área construida, estrato, número de habitaciones, número de parqueaderos y número de baños)
mod1 = lm(preciom~areaconst + estrato + banios + habitaciones + parqueaderos, data = datosNorte)
summary(mod1)
##
## Call:
## lm(formula = preciom ~ areaconst + estrato + banios + habitaciones +
## parqueaderos, data = datosNorte)
##
## 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 ***
## banios 18.89938 7.48800 2.524 0.012 *
## habitaciones 7.64511 5.65873 1.351 0.177
## parqueaderos 24.00598 5.86889 4.090 5.14e-05 ***
## ---
## 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
# El objetivo del modelo es pronosticar el precio de venta (variable dependiente) de las casas a partir de las variables: área construida, estrato, baños, No de parqueaderos y No de habitaciones (variables independientes)
#La estimación fue:
# Y = b0 +b1X1 +b2X2 +b3X3 +b4X4
# Preciom = intercepto(b0) + areaconst(b1X1) + estrato(b2X2) + banios(b3X3) + habitaciones(b4X4) + parqueaderos (b5X5)
# y= -238.17090 + 0.67673 + 80.63495 + 18.89938 + 7.64511 + 24.00598
#Validación de coeficientes
#H0 = βi = 0
#H1 = βi ≠ 0
# Nivel de Alfa α = 0.05, significancia al 5%
##Significancia estadística del modelo
#El estadístico t mide el grado en el que un coeficiente es "estadísticamente significativo", es decir, cuanto mayor sea el estadístico t y menor el p-value, más significativa son las variables predictoras.
#Para este modelo, el p-value fue < 0.05 para todas las variables predictoras (área construida, estrato, baños y parqueaderos) en comparación con el valor de Alfa, este resultado nos indica que se rechaza la hipótesis nula concluyendo que las variables independientes de área construida, estrato, baños y parqueadero tienen un efecto significativo en el precio de las casas, asi:
#Interpretación Coeficientes betas
# Ärea Construida, b1=0.67673, manteniendo las demás variables constantes, en promedio, por cada aumento de metro cuadrado en el área de la Casa, el precio se incremente en 0.67673 millones de pesos.
#Estrato, b2 = 80.63495, manteniendo las demás variables constantes, en promedio, por cada aumento de estrato en una vivienda tipo Casa, el precio del bien inmueble incrementa en 80.63495 millones de pesos.
#Baños, b3 = 18.89938, manteniendo las demás variables constantes, en promedio, por cada aumento en el número de baños de una Casa, el precio del bien inmueble aumenta en 18.89938 millones de pesos.
#El coeficiente de No de Habitaciones b4 es mayor > al alfa, por lo tanto se acepta la hipotesis nula y se puede inferir que esta variable poco explica el precio de la vivienda tipo casa.
#Parqueaderos, b5 = 24.00598, manteniendo las demás variables constantes, en promedio, por cada aumento en el número de parqueaderos de una Casa, el precio del bien inmueble aumenta en 24.00598 millones de pesos.
#El R2 mide la proporción de la variación de los datos contabilizados en el modelo, su utilidad se relaciona en aspectos aclaratorios de la regresión en los que se desea evaluar lo bien que se ajusta el modelo a los datos, el resultado fue de 0.59, por lo tanto se puede inferir que el Modelo es capaz de explicar 59% de la variabilidad del precio de las Casas con respecto a los resultados de los betas.
#4. Validar supuestos del modelo para revisar que el modelo cumple con los criterios de validez y confiabilidad
#Validación del supuesto del Modelo
#Residuals
# Ho: los errores son normales
# H1: Los errores no son normales
res <- residuals(mod1)
shapiro.test(res)
##
## Shapiro-Wilk normality test
##
## data: res
## W = 0.85246, p-value < 2.2e-16
summary(res)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## -784.29 -77.56 -16.03 0.00 47.67 978.61
#Shapiro-Wilk normality test
# p-value = < 2.2e-16
#Como Pvalue es < a alpha, se rechaza Ho. Por lo tanto, los errores no se distribuyen normalmente.
library(lmtest)
## Loading required package: zoo
## Warning: package 'zoo' was built under R version 4.2.3
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
bptest(mod1)
##
## studentized Breusch-Pagan test
##
## data: mod1
## BP = 80.281, df = 5, p-value = 7.33e-16
# H0: Los errores tienen varianza constante
# H1: Los errores no tienes varianza constante
#Breusch-Pagan test
#Como Pvalue es < a alpha, se rechaza Ho. Por tanto, la varianza de los errores no es constante, no son homocedásticos.
#Durbin-Watson test
dwtest(mod1)
##
## Durbin-Watson test
##
## data: mod1
## DW = 1.7615, p-value = 0.005472
## alternative hypothesis: true autocorrelation is greater than 0
#Durbin-Watson test
#Como Pvalue es < alpha, se rechaza Ho. Por tanto, los errores no estan correlacionados y no son independientes.
plot(mod1, pch = 16)




#Interpretación
#Residuals vs Fitted
#Se puede evidenciarr que no hay aleatoriedad, es decir que la relación entre variables respuesta y explicativa no es lineal. Sobre la varianza, se puede decir que no es constante ya que presenta heterocedasticidad.
#Normal Q-Q
#El gráfico nos permite apreciar que los residuos no tienen una distribución normal, pues tal como lo demostró el Shapiro-Wilk normality test, no se tiene una distribución normal.
#Scale - Location
#Facilita la evaluación de la hocedasticidad del modelo, la uniformidad de la dispersión de los residuos en función de los valores ajustados, se observa heterocedasticidad en los residuales, el Breusch-Pagan test nos confirma que la varianza de los errores no es constante, no son homocedásticos.
#Residuals vs Leverage
#Se observa que no se tienen valores influyentes pues no hay puntos que esten por fuera de la linea distancia de Cook. Líneas arriba se aplicó el Durbin-Watson test y se determinó que los errores no estaban correlacionados.
#Conclusión
#El modelo no cuenta con una relación lineal aparente, además de que carece de mocedásticidad, su distribución no es normal y los residuos no son independientes.
#Por lo tanto se tendría que plantear otras técnicas de validación de modelos además de considerar la Regresión Logistica multinomial para incluir variables categóricas.
#5. Con el modelo identificado debe predecir el precio de la vivienda con las características de la primera solicitud
#Exigencias de la primera solicitud,
#*Tipo: Casa
#*Área construida: 200 mts
#*Parqueaderos: 1
#*Baños: 2
#*Habitaciones: 4
#*Estrato: 4 o 5
#*Zona: Norte
#*Crédito preaprobado: 350 millones
predict(mod1, list(areaconst = 200, parqueaderos = 1, banios = 2, habitaciones = 4, estrato = 4))
## 1
## 312.101
predict(mod1, list(areaconst = 200, parqueaderos = 1, banios = 2, habitaciones = 4, estrato = 5))
## 1
## 392.7359
##Se puede evidenciar que solo 1 de las viviendas cumple con el criterio exigido por el cliente, siendo la de precio aproximado de $312,101,000 y categorizada en el estrato 4. La otra vivienda tipo casa sugerida tiene un precio aproximadamente $ 392,735,900.
##La Vviienda tipo casa que mejor se ajusta a lo exigido por el cliente es la de precui $312,101,000 ubicada en el estrato 4.
#6 Visualizar propuestas potenciales
library(sf)
## Warning: package 'sf' was built under R version 4.2.3
## Linking to GEOS 3.9.3, GDAL 3.5.2, PROJ 8.2.1; sf_use_s2() is TRUE
library(tmap)
## Warning: package 'tmap' was built under R version 4.2.3
## The legacy packages maptools, rgdal, and rgeos, underpinning the sp package,
## which was just loaded, will retire in October 2023.
## Please refer to R-spatial evolution reports for details, especially
## https://r-spatial.org/r/2023/05/15/evolution4.html.
## It may be desirable to make the sf package available;
## package maintainers should consider adding sf to Suggests:.
## The sp package is now running under evolution status 2
## (status 2 uses the sf package in place of rgdal)
## Breaking News: tmap 3.x is retiring. Please test v4, e.g. with
## remotes::install_github('r-tmap/tmap')
mapa_1 <- subset(datosNorte, areaconst >= 200 & parqueaderos >= 1 & banios >= 2 & habitaciones >= 4 & preciom <= 350 & estrato >= 4)
mapa_1 <- mapa_1[order(-mapa_1$areaconst), ]
mapa_1 <- head(mapa_1, 20)
mapa_1
## # A tibble: 20 × 11
## id zona estrato preciom areaconst parqueaderos banios habitaciones tipo
## <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <chr>
## 1 3101 Zona … 5 340 355 2 5 8 Casa
## 2 5031 Zona … 4 350 350 1 4 5 Casa
## 3 1943 Zona … 5 350 346 1 2 4 Casa
## 4 4209 Zona … 5 350 300 3 5 6 Casa
## 5 3352 Zona … 4 335 300 3 4 4 Casa
## 6 1822 Zona … 4 340 295 2 2 4 Casa
## 7 937 Zona … 4 350 280 2 3 4 Casa
## 8 7432 Zona … 4 260 280 2 4 6 Casa
## 9 952 Zona … 4 330 275 2 3 5 Casa
## 10 3043 Zona … 5 330 275 2 3 5 Casa
## 11 4458 Zona … 4 315 270 2 4 4 Casa
## 12 2544 Zona … 4 340 264. 2 4 4 Casa
## 13 819 Zona … 5 350 264 2 3 4 Casa
## 14 7470 Zona … 4 340 264 2 5 7 Casa
## 15 1108 Zona … 4 330 260 1 3 4 Casa
## 16 4800 Zona … 5 340 250 2 4 4 Casa
## 17 4483 Zona … 5 342 250 1 4 6 Casa
## 18 1020 Zona … 4 230 250 2 3 5 Casa
## 19 766 Zona … 5 321 249 1 5 5 Casa
## 20 1849 Zona … 5 330 246 2 4 4 Casa
## # ℹ 2 more variables: longitud <dbl>, latitud <dbl>
leaflet() %>% addCircleMarkers(lng = mapa_1$longitud, lat = mapa_1$latitud, radius = 0.5, color = "black", label =mapa_1$id) %>%addTiles()
#Para la primera solicitud, se le presenta al cliente la ubicación de los primeros 20 viviendaS tipo Casa que cumpleN con los criterios exigidos por el cliente en el estrato 4.
mapa_2 <- subset(datosNorte, areaconst >= 200 & parqueaderos >= 1 & banios >= 2 & habitaciones >= 4 & preciom <= 350 & estrato >= 5)
mapa_2 <- mapa_2[order(-mapa_2$areaconst), ]
mapa_2 <- head(mapa_2, 20)
mapa_2
## # A tibble: 20 × 11
## id zona estrato preciom areaconst parqueaderos banios habitaciones tipo
## <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <chr>
## 1 3101 Zona … 5 340 355 2 5 8 Casa
## 2 1943 Zona … 5 350 346 1 2 4 Casa
## 3 4209 Zona … 5 350 300 3 5 6 Casa
## 4 3043 Zona … 5 330 275 2 3 5 Casa
## 5 819 Zona … 5 350 264 2 3 4 Casa
## 6 4800 Zona … 5 340 250 2 4 4 Casa
## 7 4483 Zona … 5 342 250 1 4 6 Casa
## 8 766 Zona … 5 321 249 1 5 5 Casa
## 9 1849 Zona … 5 330 246 2 4 4 Casa
## 10 1009 Zona … 5 250 243 1 4 5 Casa
## 11 4422 Zona … 5 350 240 2 3 6 Casa
## 12 3453 Zona … 5 340 240 2 5 6 Casa
## 13 1842 Zona … 5 350 240 2 3 4 Casa
## 14 3053 Zona … 5 320 230 2 4 4 Casa
## 15 1163 Zona … 5 350 216 2 2 4 Casa
## 16 1151 Zona … 5 320 210 2 3 5 Casa
## 17 1914 Zona … 5 300 205 2 5 6 Casa
## 18 1270 Zona … 5 350 203 2 2 5 Casa
## 19 1887 Zona … 5 340 203 2 3 4 Casa
## 20 4267 Zona … 5 335 202 1 4 5 Casa
## # ℹ 2 more variables: longitud <dbl>, latitud <dbl>
leaflet() %>% addCircleMarkers(lng = mapa_2$longitud, lat = mapa_2$latitud, radius = 0.5, color = "black", label =mapa_2$id) %>%addTiles()
#Para la primera solicitud, se le presenta al cliente la ubicación de los primeros 20 viviendaS tipo Casa que cumpleN con los criterios exigidos por el cliente en el estrato 5.
#Segunda Solicitud a María, tipo Apartamento, con un área construida de 300 mts, 3 parqueaderos, 3 baños, 5 habitaciones, estrato 5 ó 6, ubicada en la Zona Sur de Calí y con un presupuesto de hasta 850 millones de pesos.
library(paqueteMODELOS)
data("vivienda")
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>
#Se toma como fuente de información el mismo conjunto de datos de la primera búsqueda, 8,322 viviendas ubicadas en la Ciudad Santiago de Cali, departamento del valle del Cauca - Colombia
#Anteriormente se verificó datos faltantes y se encontrarón en las variables de piso y parqueadero, se procede al filtrado por tipo "Apartamento"
datosApto <- vivienda
#1. Filtrado de Apartamento por zonas, para conocer cuantos Apartamento hay en cada zona
#Zona Norte
base_Apto1 <- subset(datosApto, tipo == "Apartamento" & zona == "Zona Norte")
head(base_Apto1, 5)
## # A tibble: 5 × 13
## id zona piso estrato preciom areaconst parqueaderos banios habitaciones
## <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1212 Zona N… 01 5 260 90 1 2 3
## 2 1724 Zona N… 01 5 240 87 1 3 3
## 3 2326 Zona N… 01 4 220 52 2 2 3
## 4 4386 Zona N… 01 5 310 137 2 3 4
## 5 7497 Zona N… 02 6 520 98 2 2 2
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
cat("Se tienen", nrow(base_Apto1), "Apartamentos en la Zona Norte de Cali")
## Se tienen 1198 Apartamentos en la Zona Norte de Cali
#Zona Centro
base_Apto2 <- subset(datosApto, tipo == "Apartamento" & zona == "Zona Centro")
head(base_Apto2, 5)
## # A tibble: 5 × 13
## id zona piso estrato preciom areaconst parqueaderos banios habitaciones
## <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 4654 Zona C… 03 3 100 70 NA 2 3
## 2 4408 Zona C… 05 3 120 84 1 2 3
## 3 4395 Zona C… 04 3 125 66.8 NA 2 3
## 4 4305 Zona C… 05 3 120 84 1 2 3
## 5 1132 Zona C… <NA> 5 325 89 1 2 3
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
cat("Se tienen", nrow(base_Apto2), "Apartamentos en la Zona Centro de Cali")
## Se tienen 24 Apartamentos en la Zona Centro de Cali
#Zona Oeste
base_Apto3 <- subset(datosApto, tipo == "Apartamento" & zona == "Zona Oeste")
head(base_Apto3, 5)
## # A tibble: 5 × 13
## id zona piso estrato preciom areaconst parqueaderos banios habitaciones
## <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 6999 Zona O… 01 6 870 200 2 5 3
## 2 8037 Zona O… 01 4 130 50 NA 1 3
## 3 8055 Zona O… 01 4 165 61 1 2 3
## 4 8058 Zona O… 01 4 165 61 1 2 2
## 5 8079 Zona O… 01 6 410 120 2 3 3
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
cat("Se tienen", nrow(base_Apto3), "Apartamentos en la Zona Oeste de Cali")
## Se tienen 1029 Apartamentos en la Zona Oeste de Cali
#Zona Oriente
base_Apto4 <- subset(datosApto, tipo == "Apartamento" & zona == "Zona Oriente")
head(base_Apto4, 5)
## # A tibble: 5 × 13
## id zona piso estrato preciom areaconst parqueaderos banios habitaciones
## <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 82 Zona O… 01 3 115 111 1 2 4
## 2 78 Zona O… 02 3 58 50 1 1 2
## 3 999 Zona O… 02 3 135 120 NA 2 4
## 4 555 Zona O… 03 3 78 55 NA 1 3
## 5 583 Zona O… 03 3 100 65 NA 2 3
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
cat("Se tienen", nrow(base_Apto4), "Apartamentos en la Zona Oriente de Cali")
## Se tienen 62 Apartamentos en la Zona Oriente de Cali
#Zona Sur, zona de Interés en la solicitud del cliente
base_Apto5 <- subset(datosApto, tipo == "Apartamento" & zona == "Zona Sur")
head(base_Apto5, 5)
## # A tibble: 5 × 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 1241 Zona S… <NA> 3 135 117 NA 2 3
## 5 5370 Zona S… <NA> 3 135 78 NA 1 3
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
cat("Se tienen", nrow(base_Apto5), "Apartamentos en la Zona Sur de Cali")
## Se tienen 2787 Apartamentos en la Zona Sur de Cali
#Se realiza tabla de contigencia para comprobar la distribución de la variable tipo en zonas.
Tabla_contigencia2 <- table(datosApto$zona, datosApto$tipo)
print(Tabla_contigencia2)
##
## Apartamento Casa
## Zona Centro 24 100
## Zona Norte 1198 722
## Zona Oeste 1029 169
## Zona Oriente 62 289
## Zona Sur 2787 1939
#Se comprueba que el ejercicio de filtrado quedó bien y coincide con la distribución de la variable Zona en tipo, los Apartmentos en la zona sur son los de mayor cantidad, se procede a la ubicación en el mapa de Santiago de Cali para visibilizar las coordenadas al cliente
#Visualización Zona Norte
Apto1 <- filter(datosApto, tipo == "Apartamento" & zona == "Zona Norte" )
#Datos de los 10 primeros reistros filtrados
data_apto_N = Apto1[0: 10,]
head(data_apto_N)
## # A tibble: 6 × 13
## id zona piso estrato preciom areaconst parqueaderos banios habitaciones
## <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1212 Zona N… 01 5 260 90 1 2 3
## 2 1724 Zona N… 01 5 240 87 1 3 3
## 3 2326 Zona N… 01 4 220 52 2 2 3
## 4 4386 Zona N… 01 5 310 137 2 3 4
## 5 7497 Zona N… 02 6 520 98 2 2 2
## 6 5424 Zona N… 03 4 320 108 2 3 3
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
require(leaflet)
leaflet() %>% addTiles() %>%
addCircles(lng = data_apto_N$longitud,
lat = data_apto_N$latitud)
#Visualización Zona Centro
Apto2 <- filter(datosApto, tipo == "Apartamento" & zona == "Zona Centro" )
#Datos de los 10 primeros reistros filtrados
data_apto_C = Apto2[0: 10,]
head(data_apto_C)
## # A tibble: 6 × 13
## id zona piso estrato preciom areaconst parqueaderos banios habitaciones
## <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 4654 Zona C… 03 3 100 70 NA 2 3
## 2 4408 Zona C… 05 3 120 84 1 2 3
## 3 4395 Zona C… 04 3 125 66.8 NA 2 3
## 4 4305 Zona C… 05 3 120 84 1 2 3
## 5 1132 Zona C… <NA> 5 325 89 1 2 3
## 6 5177 Zona C… <NA> 3 300 130 NA 2 3
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
leaflet() %>% addTiles() %>%
addCircles(lng = data_apto_C$longitud,
lat = data_apto_C$latitud)
#Visualización Zona Oeste
Apto3 <- filter(datosApto, tipo == "Apartamento" & zona == "Zona Oeste" )
#Datos de los 10 primeros reistros filtrados
data_apto_O = Apto3[0: 10,]
head(data_apto_O)
## # A tibble: 6 × 13
## id zona piso estrato preciom areaconst parqueaderos banios habitaciones
## <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 6999 Zona O… 01 6 870 200 2 5 3
## 2 8037 Zona O… 01 4 130 50 NA 1 3
## 3 8055 Zona O… 01 4 165 61 1 2 3
## 4 8058 Zona O… 01 4 165 61 1 2 2
## 5 8079 Zona O… 01 6 410 120 2 3 3
## 6 8109 Zona O… 01 4 150 55 NA 1 2
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
leaflet() %>% addTiles() %>%
addCircles(lng = data_apto_O$longitud,
lat = data_apto_O$latitud)
#Visualización Zona Oriente
Apto4 <- filter(datosApto, tipo == "Apartamento" & zona == "Zona Oriente" )
#Datos de los 10 primeros reistros filtrados
data_apto_Or = Apto4[0: 10,]
head(data_apto_Or)
## # A tibble: 6 × 13
## id zona piso estrato preciom areaconst parqueaderos banios habitaciones
## <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 82 Zona O… 01 3 115 111 1 2 4
## 2 78 Zona O… 02 3 58 50 1 1 2
## 3 999 Zona O… 02 3 135 120 NA 2 4
## 4 555 Zona O… 03 3 78 55 NA 1 3
## 5 583 Zona O… 03 3 100 65 NA 2 3
## 6 552 Zona O… <NA> 3 85 62 NA 2 3
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
leaflet() %>% addTiles() %>%
addCircles(lng = data_apto_Or$longitud,
lat = data_apto_Or$latitud)
#Visualización Zona Sur
Apto5 <- filter(datosApto, tipo == "Apartamento" & zona == "Zona Sur" )
#Datos de los 10 primeros reistros filtrados
data_apto_S = Apto5[0: 100,]
head(data_apto_S)
## # A tibble: 6 × 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 1241 Zona S… <NA> 3 135 117 NA 2 3
## 5 5370 Zona S… <NA> 3 135 78 NA 1 3
## 6 6975 Zona S… 06 4 220 75 1 2 3
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
leaflet() %>% addTiles() %>%
addCircles(lng = data_apto_S$longitud,
lat = data_apto_S$latitud)
#Por ser la zona de interés, se ubicaron los primeros 100 registros en el Mapa
#De igual manera como en la ubicación de las Casas en Santiago de Cali, las coordenadas no son precisas en cuanto a la zona asignada, pero sí coinciden con google maps, de hecho en la zona Sur que es la de interés de la segunda solicitud, se localizaron 100 registros y estos aparecen distribuidos en todo el mapa, incluyendo zonas como la norte.
##2. Realizar análisis exploratorio de datos enfocado en el criterio exigido por el cliente relacionado con el precio del bien inmueble. Para este paso, se toma en referencia la base_Apto5, que es el filtrado de la Apartamentos en la zona sur, se verifican valores faltante de las variables de interés antes del análisis exploratorio de datos:
sum(is.na(base_Apto5$preciom))
## [1] 0
sum(is.na(base_Apto5$areaconst))
## [1] 0
sum(is.na(base_Apto5$zona))
## [1] 0
sum(is.na(base_Apto5$piso))
## [1] 622
sum(is.na(base_Apto5$estrato))
## [1] 0
sum(is.na(base_Apto5$parqueaderos))
## [1] 406
sum(is.na(base_Apto5$banios))
## [1] 0
sum(is.na(base_Apto5$habitaciones))
## [1] 0
sum(is.na(base_Apto5$tipo))
## [1] 0
sum(is.na(base_Apto5$barrio))
## [1] 0
sum(is.na(base_Apto5$longitud))
## [1] 0
sum(is.na(base_Apto5$latitud))
## [1] 0
#Se encuentran datos faltantes en piso y parqueaderos, adicionalmente se decide eliminar del conjunto de datos las variables barrio y piso ya que no se tendrán en cuenta en el análisis
datos_s <- subset(base_Apto5, select = -piso)
datos_Sur <- subset(datos_s, select = - barrio)
head(datos_Sur)
## # A tibble: 6 × 11
## id zona estrato preciom areaconst parqueaderos banios habitaciones tipo
## <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <chr>
## 1 5098 Zona S… 4 290 96 1 2 3 Apar…
## 2 698 Zona S… 3 78 40 1 1 2 Apar…
## 3 8199 Zona S… 6 875 194 2 5 3 Apar…
## 4 1241 Zona S… 3 135 117 NA 2 3 Apar…
## 5 5370 Zona S… 3 135 78 NA 1 3 Apar…
## 6 6975 Zona S… 4 220 75 1 2 3 Apar…
## # ℹ 2 more variables: longitud <dbl>, latitud <dbl>
#Correlaciones
#Precio vs Área de Construcción
cor(datos_Sur$preciom, datos_Sur$areaconst)
## [1] 0.7579955
library(plotly)
corprecio_areaconst_apto <- plot_ly(data = datos_Sur, x = ~areaconst, y = ~preciom)
corprecio_areaconst_apto
## No trace type specified:
## Based on info supplied, a 'scatter' trace seems appropriate.
## Read more about this trace type -> https://plotly.com/r/reference/#scatter
## No scatter mode specifed:
## Setting the mode to markers
## Read more about this attribute -> https://plotly.com/r/reference/#scatter-mode
ggplot(datos_Sur, aes(x=areaconst, y = preciom)) + geom_point() + geom_smooth(method = "lm")
## `geom_smooth()` using formula = 'y ~ x'

##El coeficiente es de 0.75, es decir, 75% de correlación positiva, al observar los gráficos se puede inferir que a mayor área de construcción, mayor es el precio de la vivienda
#Precio vs Estrato
cor(datos_Sur$preciom, datos_Sur$estrato)
## [1] 0.6727067
corprecio_estrato_apto <- plot_ly(data = datos_Sur, x = ~estrato, y = ~preciom)
corprecio_estrato_apto
## No trace type specified:
## Based on info supplied, a 'scatter' trace seems appropriate.
## Read more about this trace type -> https://plotly.com/r/reference/#scatter
## No scatter mode specifed:
## Setting the mode to markers
## Read more about this attribute -> https://plotly.com/r/reference/#scatter-mode
ggplot(datos_Sur, aes(x=estrato, y = preciom)) + geom_point() + geom_smooth(method = "lm")
## `geom_smooth()` using formula = 'y ~ x'

#La correlación es positiva en 67%, se puede inferir que a mayor estrato, mayor el precio del apto.
#Precio vs No de Habitaciones
cor(datos_Sur$preciom, datos_Sur$habitaciones)
## [1] 0.3317538
corprecio_hab_apto <- plot_ly(data = datos_Sur, x = ~habitaciones, y = ~preciom)
corprecio_hab_apto
## No trace type specified:
## Based on info supplied, a 'scatter' trace seems appropriate.
## Read more about this trace type -> https://plotly.com/r/reference/#scatter
## No scatter mode specifed:
## Setting the mode to markers
## Read more about this attribute -> https://plotly.com/r/reference/#scatter-mode
ggplot(datos_Sur, aes(x=habitaciones, y = preciom)) + geom_point() + geom_smooth(method = "lm")
## `geom_smooth()` using formula = 'y ~ x'

##Se puede ver correlación positiva entre las variables 0,33 (33%) pero es muy débil. Por lo tanto su aporte al precio de las casas lo explica contribuye muy poco
#Precio No de Baños
cor(datos_Sur$preciom, datos_Sur$banios)
## [1] 0.7196705
corprecio_banios_apto <- plot_ly(data = datos_Sur, x = ~banios, y = ~preciom)
corprecio_banios_apto
## No trace type specified:
## Based on info supplied, a 'scatter' trace seems appropriate.
## Read more about this trace type -> https://plotly.com/r/reference/#scatter
## No scatter mode specifed:
## Setting the mode to markers
## Read more about this attribute -> https://plotly.com/r/reference/#scatter-mode
ggplot(datos_Sur, aes(x=banios, y = preciom)) + geom_point() + geom_smooth(method = "lm")
## `geom_smooth()` using formula = 'y ~ x'

#Correlación positiva entre las dos variables en un 71%, en comparación con la primera solicitud de casas, es casi 20 puntos más fuerte la correlación entre precio y No. de baños.
#3. Realizar un modelo de regresión lineal múltiple con el propósito de anticipar el valor de lo en función de las variables independientes (área construida, estrato, número de habitaciones, número de parqueaderos y número de baño
mod2 = lm(preciom ~ areaconst + estrato + banios + habitaciones + parqueaderos, data = datos_Sur)
summary(mod2)
##
## Call:
## lm(formula = preciom ~ areaconst + estrato + banios + habitaciones +
## parqueaderos, data = datos_Sur)
##
## 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 ***
## banios 50.69675 3.39637 14.927 < 2e-16 ***
## habitaciones -24.83693 3.89229 -6.381 2.11e-10 ***
## parqueaderos 72.91468 3.95797 18.422 < 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 objetivo del modelo es pronosticar el precio de venta de los apartamentos de la zona sur (variable dependiente) de las casas a partir de las variables: área construida, estrato, baños, No de parqueaderos y No de habitaciones (variables independientes)
#La estimación fue:
# Y = b0 +b1X1 +b2X2 +b3X3 + b4X4 + b5X5
# Preciom = intercepto(b0) + areaconst(b1X1) + estrato(b2X2) + banios(b3X3) + habitaciones(b4X4) + parqueaderos (b5X5)
# y= -261.62501 + 1.28505 + 60.89709 + 50.69675 - 24.8369 + 72.91468
#Validación de coeficientes
#H0 = βi = 0
#H1 = βi ≠ 0
# Nivel de Alfa α = 0.05, significancia al 5%
##Significancia estadística del modelo
#El estadístico t mide el grado en el que un coeficiente es "estadísticamente significativo", es decir, cuanto mayor sea el estadístico t y menor el p-value, más significativa son las variables predictoras.
#Para este modelo, el p-value fue < 0.05 para todas las variables predictoras (área construida, estrato, baños y parqueaderos) en comparación con el valor de Alfa, este resultado nos indica que se rechaza la hipótesis nula concluyendo que las variables independientes de área construida, estrato, baños, no de habitaciones y parqueadero tienen un efecto significativo en el precio de las casas, asi:
#Interpretación Coeficientes betas
#Intercepto: el valor del intercepto corresponde a -261.62501, el cual se interpreta como el valor promedio de un apartamento si las demás variables fuesen constantes, lo cual no tiene mucho sentido lógico
# Ärea Construida, b1=1.28505, manteniendo las demás variables constantes, en promedio, por cada aumento de metro cuadrado en el área de los aptos, el precio se incremente en 1.28505 millones de pesos.
#Estrato, b2 = 60.89709, manteniendo las demás variables constantes, en promedio, por cada aumento de estrato en una vivienda tipo Apto, el precio del bien inmueble incrementa en 60.89709 millones de pesos.
#Baños, b3 = 50.69675, manteniendo las demás variables constantes, en promedio, por cada aumento en el número de baños de un Apto, el precio del bien inmueble aumenta en 50.69675 millones de pesos.
#No de habitaciones, b4 = - 24.8369, manteniendo las demás variables constantes, en promedio, por cada aumento en el número de habitaciones, el precio de un apto disiminuye en 24.8369 millones de pesos.
#Parqueaderos, b5 = 72.91468, manteniendo las demás variables constantes, en promedio, por cada aumento en el número de parqueaderos de un Apto, el precio del bien inmueble aumenta en 72.91468 millones de pesos.
#El R2 mide la proporción de la variación de los datos contabilizados en el modelo, su utilidad se relaciona en aspectos aclaratorios de la regresión en los que se desea evaluar lo bien que se ajusta el modelo a los datos, el resultado fue de 0.74, por lo tanto se puede inferir que el Modelo es capaz de explicar 74% de la variabilidad del precio de los apartamentos con respecto a los resultados de los betas.
#4. Validar supuestos del modelo para revisar que el modelo cumple con los criterios de validez y confiabilidad
# Ho: los errores son normales
# H1: Los errores no son normales
res2 <- residuals(mod2)
shapiro.test(res2)
##
## Shapiro-Wilk normality test
##
## data: res2
## W = 0.79118, p-value < 2.2e-16
summary(res)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## -784.29 -77.56 -16.03 0.00 47.67 978.61
# H0: Los errores tienen varianza constante
# H1: Los errores no tienen varianza constante
bptest(mod2)
##
## studentized Breusch-Pagan test
##
## data: mod2
## BP = 754.81, df = 5, p-value < 2.2e-16
#H0: los errores estan correlacionados y son independientes
#H1: los errores no estan correlacionados y no son independientes
dwtest(mod2)
##
## Durbin-Watson test
##
## data: mod2
## DW = 1.5333, p-value < 2.2e-16
## alternative hypothesis: true autocorrelation is greater than 0
plot(mod2, pch = 16)




#Interpretación
#Residuals vs Fitted
#Se puede evidenciarr que los resultados son similares al ejercicio con casas, no hay aleatoriedad, es decir que la relación entre variables respuesta y explicativa no es lineal. Sobre la varianza, se puede decir que no es constante, pues se observa heterocedasticidad.
#Normal Q-Q
#El gráfico nos permite apreciar que los residuos no tienen una distribución normal, pues tal como lo demostró el Shapiro-Wilk normality test, no se tiene una distribución normal, su forma no se ajusta al plano
#Scale - Location
#Facilita la evaluación de la hocedasticidad del modelo, la uniformidad de la dispersión de los residuos en función de los valores ajustados, se observa heterocedasticidad en los residuales, el Breusch-Pagan test nos confirma que la varianza de los errores no es constante, no son homocedásticos.
#Residuals vs Leverage
#Se observa que no se tienen valores influyentes pues no hay puntos que esten por fuera de la linea distancia de Cook. Líneas arriba se aplicó el Durbin-Watson test y se determinó que los errores no estaban correlacionados.
#Conclusión
#El modelo no cuenta con una relación lineal aparente, además de que carece de mocedásticidad, su distribución no es normal y los residuos no son independientes.
#Por lo tanto, al igual que el primer modelo con casas se tendría que plantear otras técnicas de validación de modelos además de considerar la Regresión Logistica multinomial para incluir variables categóricas.
#5. Con el modelo identificado debe predecir el precio de la vivienda con las características de la segunda solicitud
#Exigencias de la segunda solicitud,
#*Tipo: Apartamento
#*Área construida: 300 mts
#*Parqueaderos: 3
#*Baños: 3
#*Habitaciones: 5
#*Estrato: 5 ó 6
#*Zona: Sur
#*Crédito preaprobado: 850 millones
predict(mod2, list(areaconst = 300, parqueaderos = 3, banios = 3, habitaciones = 5, estrato = 5))
## 1
## 675.0247
predict(mod2, list(areaconst = 300, parqueaderos = 3, banios = 3, habitaciones = 5, estrato = 6))
## 1
## 735.9218
##Se puede evidenciar que solo 2 de las viviendas cumplen con el criterio exigido por el cliente, siendo la de precio aproximado de $672.025.700 millones de pesos y categorizada en el estrato 5. La otra vivienda tipo apartamento encontrada tiene un precio aproximadamente $ 735.921.800 milllones de pesos.
##Al cliente se le presentan las dos opciones, para facilitar su decisión se visualizan las propuestas potencias, paso 6.
#Se ubican en el mapa la propuesta para estrto 5.
mapa_3 <- subset(datos_Sur, areaconst >= 300 & parqueaderos >= 3 & banios >= 3 & habitaciones >= 5 & preciom <= 850 & estrato >= 5)
mapa_3 <- mapa_3[order(-mapa_3$areaconst), ]
mapa_3 <- head(mapa_3, 10)
mapa_3
## # A tibble: 2 × 11
## id zona estrato preciom areaconst parqueaderos banios habitaciones tipo
## <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <chr>
## 1 7182 Zona S… 5 730 573 3 8 5 Apar…
## 2 7512 Zona S… 5 670 300 3 5 6 Apar…
## # ℹ 2 more variables: longitud <dbl>, latitud <dbl>
leaflet() %>% addCircleMarkers(lng = mapa_3$longitud, lat = mapa_3$latitud, radius = 0.5, color = "black", label = mapa_3$id) %>% addTiles()
#Se logra ubicar en el Mapa 2 posibles ofertas de Apartamentos para el cliente en el estrato 5.
#Se ubican en el mapa la propuesta para estrato 6.
mapa_4 <- subset(datos_Sur, areaconst >= 300 & parqueaderos >= 1 & banios >= 3 & habitaciones >= 5 & preciom <= 1160 & estrato >= 6)
mapa_4 <- mapa_4[order(-mapa_4$areaconst), ]
mapa_4 <- head(mapa_4, 10)
mapa_4
## # A tibble: 3 × 11
## id zona estrato preciom areaconst parqueaderos banios habitaciones tipo
## <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <chr>
## 1 6023 Zona S… 6 1150 464 4 6 5 Apar…
## 2 5460 Zona S… 6 1150 346 2 6 5 Apar…
## 3 5248 Zona S… 6 1150 344 4 5 5 Apar…
## # ℹ 2 more variables: longitud <dbl>, latitud <dbl>
leaflet() %>% addCircleMarkers(lng = mapa_4$longitud, lat = mapa_4$latitud, radius = 0.5, color = "black", label = mapa_4$id) %>% addTiles()
#No se logra ubicar en el Mapa para el estrat 6 una vivienda tipo Apto, pero se amplia los criterios en cuanto al precio de la vivienda en 1.160 millones de pesos, encontrando 3 posibles ofertas para el cliente.