Análisis de los datos

## 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")=
##   .. cols(
##   ..   id = col_double(),
##   ..   zona = col_character(),
##   ..   piso = col_character(),
##   ..   estrato = col_double(),
##   ..   preciom = col_double(),
##   ..   areaconst = col_double(),
##   ..   parqueaderos = col_double(),
##   ..   banios = col_double(),
##   ..   habitaciones = col_double(),
##   ..   tipo = col_character(),
##   ..   barrio = col_character(),
##   ..   longitud = col_double(),
##   ..   latitud = col_double()
##   .. )
##  - attr(*, "problems")=<externalptr>
Variable Descripcion
zona ubicación de la vivienda: Zona Centro, Zona Norte,…
piso piso que ocupa la vivienda: primer piso, segundo piso…
estrato estrato socio-económico: 3, 4, 5, 6
preciom precio de la vivienda en millones de pesos
areaconst área construida
parqueaderos número de parqueaderos
banios número de baños
habitaciones número de habitaciones
tipo tipo de vivienda: Casa, Apartamento
barrio barrio de ubicación de la vivienda: 20 de Julio, Álamos,…
longitud coordenada geográfica
latitud coordenada geográfica

##      preciom id zona estrato areaconst banios habitaciones tipo barrio longitud
## 4808       1  1    1       1         1      1            1    1      1        1
## 1909       1  1    1       1         1      1            1    1      1        1
## 876        1  1    1       1         1      1            1    1      1        1
## 726        1  1    1       1         1      1            1    1      1        1
## 1          1  0    0       0         0      0            0    0      0        0
## 2          0  0    0       0         0      0            0    0      0        0
##            2  3    3       3         3      3            3    3      3        3
##      latitud parqueaderos piso     
## 4808       1            1    1    0
## 1909       1            1    0    1
## 876        1            0    1    1
## 726        1            0    0    2
## 1          0            0    0   12
## 2          0            0    0   13
##            3         1605 2638 4275

La data tiene datos faltantes, los cuales en su mayoría petenecen a las variables de parqueadero con 1605 y piso con 2638.

A continuación se imputan los valores de las variables parqueaderos y piso por el valor de 0 en los registros que no tengan datos, para tenr mayor cantidad de datos de análisis.

Imputación de valores

Para obtener la mayor cantidad de datos se imputan por 0 las variables: parqueaderos y piso.

suppressMessages({
# Imputar valores faltantes con 0
vivienda2$parqueaderos[is.na(vivienda2$parqueaderos)] <- 0

# Imputar valores faltantes con 0
vivienda2$piso[is.na(vivienda2$piso)] <- 0

# Eliminar datos faltantes
vivienda2 <- na.omit(vivienda2)

# Visualizar data
md.pattern(vivienda2, rotate.names = TRUE)
})
##  /\     /\
## {  `---'  }
## {  O   O  }
## ==>  V <==  No need for mice. This data set is completely observed.
##  \  \|/  /
##   `-----'

##      id zona piso estrato preciom areaconst parqueaderos banios habitaciones
## 8319  1    1    1       1       1         1            1      1            1
##       0    0    0       0       0         0            0      0            0
##      tipo barrio longitud latitud  
## 8319    1      1        1       1 0
##         0      0        0       0 0

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 <- vivienda2 %>% 
  filter(tipo == "Casa" & zona == "Zona Norte")
head(base1,3)
##     id       zona piso estrato preciom areaconst parqueaderos banios
## 1 1209 Zona Norte   02       5     320       150            2      4
## 2 1592 Zona Norte   02       5     780       380            2      3
## 3 4057 Zona Norte   02       6     750       445            0      7
##   habitaciones tipo barrio  longitud latitud
## 1            6 Casa  acopi -76.51341 3.47968
## 2            3 Casa  acopi -76.51674 3.48721
## 3            6 Casa  acopi -76.52950 3.38527
library("leaflet")
## Warning: package 'leaflet' was built under R version 4.3.3
# Crea un mapa
mapa_b1 <- leaflet(base1) %>%
  addTiles() %>%
  addCircleMarkers(lng=~longitud, lat = ~latitud,radius = 3)
  
mapa_b1

Según la descripción de la “Zona Norte” de la página de la alcaldía de Cali: Para su definición, se tuvieron en cuenta aspectos como los sectores de las calles y carreras norte establecidos en la guía para la nomenclatura urbana de Santiago de Cali, pero también aquellos barrios y sectores que la comunidad reconoce como norte de la ciudad. Esta zona comprende el territorio que va desde la KR 1 entre la CL 1 OESTE hasta el separador vial ubicado entre las CL 25 y CL 26, vía por la cual se continúa hasta la KR 7, y desde este punto, siguiendo el trazado del corredor férreo hasta llegar a la CL 88, a partir de la cual, se continua hacia el norte por el límite del suelo urbano hasta finalizar en el punto de inicio en la KR 1.

Si observamos los puntos azules del presente mapa podemos evidenciar que en su mayoría se encuentran en las calles y carreras descritas anteriormente. Los puntos que están fuera de la Zona Norte y que según la data corresponden a dicha zona, puede deberse a que al ingresar las longitudes y latitudes se presentaron errores de digitación y como es una data extraída por medio del web scraping de la página de OLX, es posible que se puedan presentar errores en el momento que las personas registraron las propiedades, ya que, se podría presentar desconocimiento de las latitudes y longitudes y ubicación de sus propiedades.

También se puede explicar este caso de puntos dispersos, es que si bien hay un norte global donde se agrupan la mayoría de las casas, hay que decir que, cada barrio o zona, tienen su propia Zona Norte.

table(base1$zona)
## 
## Zona Norte 
##        722

Validamos que solo hay una zona

table(base1$estrato)
## 
##   3   4   5   6 
## 235 161 271  55
table(base1$tipo)
## 
## Casa 
##  722

solo hay un tipo y es Casa.

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, número de baños, número de habitaciones y zona donde se ubica la vivienda. Use gráficos interactivos con el paquete plotly e interprete los resultados.

vivienda_filtro <- vivienda2 %>%
  select('areaconst', 'estrato', 'banios', 'habitaciones','zona', 'preciom')
vivienda_filtro$zona <- ifelse(vivienda_filtro$zona == "Zona Centro", 1,
                               ifelse(vivienda_filtro$zona == "Zona Norte", 2,
                                      ifelse(vivienda_filtro$zona == "Zona Oeste", 3,
                                             ifelse(vivienda_filtro$zona == "Zona Oriente", 4,
                                                    ifelse(vivienda_filtro$zona == "Zona Sur", 5,"")))))
vivienda_filtro$zona <- as.numeric(vivienda_filtro$zona)
summary(vivienda_filtro)
##    areaconst         estrato          banios        habitaciones   
##  Min.   :  30.0   Min.   :3.000   Min.   : 0.000   Min.   : 0.000  
##  1st Qu.:  80.0   1st Qu.:4.000   1st Qu.: 2.000   1st Qu.: 3.000  
##  Median : 123.0   Median :5.000   Median : 3.000   Median : 3.000  
##  Mean   : 174.9   Mean   :4.634   Mean   : 3.111   Mean   : 3.605  
##  3rd Qu.: 229.0   3rd Qu.:5.000   3rd Qu.: 4.000   3rd Qu.: 4.000  
##  Max.   :1745.0   Max.   :6.000   Max.   :10.000   Max.   :10.000  
##       zona          preciom      
##  Min.   :1.000   Min.   :  58.0  
##  1st Qu.:3.000   1st Qu.: 220.0  
##  Median :5.000   Median : 330.0  
##  Mean   :3.918   Mean   : 433.9  
##  3rd Qu.:5.000   3rd Qu.: 540.0  
##  Max.   :5.000   Max.   :1999.0
str(vivienda_filtro)
## 'data.frame':    8319 obs. of  6 variables:
##  $ areaconst   : num  70 120 220 280 90 87 52 137 150 380 ...
##  $ estrato     : num  3 3 3 4 5 5 4 5 5 5 ...
##  $ banios      : num  3 2 2 5 2 3 2 3 4 3 ...
##  $ habitaciones: num  6 3 4 3 3 3 3 4 6 3 ...
##  $ zona        : num  4 4 4 5 2 2 2 2 2 2 ...
##  $ preciom     : num  250 320 350 400 260 240 220 310 320 780 ...
##  - attr(*, "na.action")= 'omit' Named int [1:3] 8320 8321 8322
##   ..- attr(*, "names")= chr [1:3] "8320" "8321" "8322"
M = cor(vivienda_filtro)
corrplot(M,method = 'number')

print(M)
##                areaconst     estrato     banios habitaciones        zona
## areaconst    1.000000000  0.27432332 0.64841648   0.51691292 0.007948296
## estrato      0.274323323  1.00000000 0.42032178  -0.07137615 0.110970570
## banios       0.648416477  0.42032178 1.00000000   0.58990641 0.077544475
## habitaciones 0.516912916 -0.07137615 0.58990641   1.00000000 0.021593137
## zona         0.007948296  0.11097057 0.07754447   0.02159314 1.000000000
## preciom      0.687351963  0.60980664 0.66914558   0.26409121 0.016098198
##                preciom
## areaconst    0.6873520
## estrato      0.6098066
## banios       0.6691456
## habitaciones 0.2640912
## zona         0.0160982
## preciom      1.0000000
library(GGally)
ggpairs(vivienda_filtro[,1:6], title=" ") 

Notamos que las variables que están más correlacionadas con el preciom, son” area de construccion banios y estrato, siendo las menos correlacionadas las cantidades de habiatacion aunque se sigue presentando una correlación positiva peor debil, y el valor de zona es tan cencano a cero que decimos que no hay correlacion.

plot <- plot_ly( data = base1, x = ~areaconst, y = ~preciom,
                 marker = list(size = 10, opacity = 0.8)) %>% add_markers()
plot

En la anterior gráfica podemos observar que en la Zona Norte, el precio sube a medida que el área construida es más grande.

3

Estime un modelo de regresión lineal múltiple con las variables del punto anterior (precio = f(área construida, estrato, número de cuartos, número de parqueaderos, número de baños ) ) e interprete los coeficientes si son estadísticamente significativos. Las interpretaciones deber están contextualizadas y discutir si los resultados son lógicos. Adicionalmente interprete el coeficiente R2 y discuta el ajuste del modelo e implicaciones (que podrían hacer para mejorarlo).

modelo_lineal <- lm(data = vivienda2, preciom ~ areaconst + estrato + habitaciones + parqueaderos + banios)
summary(modelo_lineal)
## 
## Call:
## lm(formula = preciom ~ areaconst + estrato + habitaciones + parqueaderos + 
##     banios, data = vivienda2)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1596.26   -89.52   -18.63    54.31  1192.21 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -318.31275   11.68459  -27.24   <2e-16 ***
## areaconst       0.96050    0.01875   51.23   <2e-16 ***
## estrato        92.22507    2.43661   37.85   <2e-16 ***
## habitaciones  -25.72893    1.86899  -13.77   <2e-16 ***
## parqueaderos   48.32521    2.01829   23.94   <2e-16 ***
## banios         57.21454    2.23875   25.56   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 175.1 on 8313 degrees of freedom
## Multiple R-squared:  0.7164, Adjusted R-squared:  0.7163 
## F-statistic:  4200 on 5 and 8313 DF,  p-value: < 2.2e-16

Tenemos que el \(R^2\) es relativamente alto indicando un buen modelo, es decir, podríamos hacer una buena predicción en función de las variables indicadas

Lo primero que notamos es que todos los pvalores son menores a 0.05, lo cual indica que todos los estimadores son estadísticamente significativos, sin embargo, debemos hacer algunas aclaraciones:

Para habitaciones: notamos que el coeficiente es negativo, para no ser muy lógica esta afirmación debido a que, es más lógico pensar que entre más habitaciones, la casa seria más grande, es decir, una casa con 10 habitaciones debería ser bastante grande, por lo tanto, subir el precio, pero al aparecer entre más habitaciones, más barata la vivienda

Para areaconst: notamos que el valor es muy cercano a cero, lo que nos dice que el área de construcción tiene que aumentar mucho para tener un impacto en el precio, es un poco extraño que aunque haya más correlación en el área de construcción, hay un menor valor en ese coeficiente, esto tal vez, se pueda explicar debido al orden de los datos, las áreas de construcción entran en el orden numérico de cientos (100, 200, 300, etc), pero los demás valores están en un orden numérico bajo.

para las demás variables no notamos nada extraño, todo parece estar bien y todo crece con una buena tendencia dado los estimados.

Podríamos establecer nuevas variables, o eliminar algunas variables poco correlacionadas, aunque a simple vista parece ser un muy buen modelo, debido a los p valores y el \(R^2\)

4

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

plot(modelo_lineal)

Analizando la gráfica de los residuales versus lo valores ajustados, vemos que parece no tener una tendencia clara, es decir, la línea recta presentada no sube, ni baja, eso implica que parece haber homocedasticidad

Análisis del QQ, notamos que la línea recta se ajusta medianamente bien a los datos, sin embargo, hay una dispersión inicial y final, que puede deberse a los valores atípicos muy bajo y muy altos.

Para la gráfica de residuales vs Leverage tenemos una clara tendencia hacia abajo, lo que indica que los errores en la aproximación suelen ser menores, o con tendencia a cero, indicando una aproximación regular.Igualmente los puntos que se encuentran debajo de la palanca, son menos propensos a ser atípicos o tener un impacto desproporcionado en los resultados del modelo.

Vemos la normalidad de los valores

shapiro.test(base1$areaconst)
## 
##  Shapiro-Wilk normality test
## 
## data:  base1$areaconst
## W = 0.86559, p-value < 2.2e-16
shapiro.test(base1$preciom)
## 
##  Shapiro-Wilk normality test
## 
## data:  base1$preciom
## W = 0.86297, p-value < 2.2e-16
shapiro.test(base1$banios)
## 
##  Shapiro-Wilk normality test
## 
## data:  base1$banios
## W = 0.93292, p-value < 2.2e-16
shapiro.test(base1$habitaciones)
## 
##  Shapiro-Wilk normality test
## 
## data:  base1$habitaciones
## W = 0.90995, p-value < 2.2e-16
shapiro.test(base1$parqueaderos)
## 
##  Shapiro-Wilk normality test
## 
## data:  base1$parqueaderos
## W = 0.80149, p-value < 2.2e-16
shapiro.test(base1$estrato)
## 
##  Shapiro-Wilk normality test
## 
## data:  base1$estrato
## W = 0.83838, p-value < 2.2e-16

Notamos que los p valores son prácticamente cero, por lo tanto no se rechaza la hipótesis de normalidad, entonces, concluimos que las variables tienen un comportamiento relativamente normal(distribución)

5

Con el modelo identificado debe predecir el precio de la vivienda con las características de la primera solicitud.

vivienda1 <- data.frame(
  areaconst = c(200,300),
  estrato = c(4, 6),
  habitaciones = c(4,5),
  parqueaderos = c(1,3),
  banios = c(2,3)
)
precio <- predict (modelo_lineal, newdata = vivienda1)
precio
##        1        2 
## 302.5253 711.1610

El resultado es para la solicitud 1 precio de $302.5253 y para la 2 un precio de $711.1610

6

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.

precio1 <- predict (modelo_lineal, newdata = vivienda1[1,])
precio1
##        1 
## 302.5253
ofertas <- base1 %>% 
  filter(preciom <= 350)%>%
  mutate (precio_modelo = predict(modelo_lineal, newdata = .)) %>%
  arrange(abs(precio_modelo - precio1)) %>%
  head(5)
  
ofertas
##     id       zona piso estrato preciom areaconst parqueaderos banios
## 1 1107 Zona Norte    0       4     330       140            1      3
## 2  393 Zona Norte    0       4     250       115            1      3
## 3 4545 Zona Norte    0       3     310       300            0      5
## 4 1753 Zona Norte    0       4     350       264            0      0
## 5 1055 Zona Norte    0       4     280       147            1      3
##   habitaciones tipo                    barrio  longitud latitud precio_modelo
## 1            4 Casa                 la merced -76.51057 3.48113      302.1101
## 2            3 Casa             villa del sol -76.49500 3.48300      303.8266
## 3            9 Casa urbanización barranquilla -76.53200 3.45200      301.0235
## 4            0 Casa                    vipasa -76.51722 3.47472      304.1584
## 5            4 Casa                 la merced -76.50880 3.48699      308.8335
library("leaflet")

# Crea un mapa
mapa_of1 <- leaflet(ofertas) %>%
  addTiles() %>%
  addCircleMarkers(lng=~longitud, lat = ~latitud,radius = 3)
  
mapa_of1

En el mapa se pueden observar cinco posibles casas que se ajustan a los requerimientos solicitados por la cliente.

7

Realice los pasos del 1 al 6. Para la segunda solicitud que tiene un crédito pre-aprobado por valor de $850 millones.

base2 <- vivienda2 %>% 
  filter(tipo == "Apartamento" & zona == "Zona Sur")
head(base2,3)
##     id     zona piso estrato preciom areaconst parqueaderos banios habitaciones
## 1 5098 Zona Sur   05       4     290        96            1      2            3
## 2  698 Zona Sur   02       3      78        40            1      1            2
## 3 8199 Zona Sur    0       6     875       194            2      5            3
##          tipo     barrio  longitud latitud
## 1 Apartamento      acopi -76.53464 3.44987
## 2 Apartamento aguablanca -76.50100 3.40000
## 3 Apartamento  aguacatal -76.55700 3.45900
# Crea un mapa
mapa_b2 <- leaflet(base2) %>%
  addTiles() %>%
  addCircleMarkers(lng=~longitud, lat = ~latitud,radius = 3)
  
mapa_b2

Según la descripción de la “Zona Sur” de la página de la alcaldía de Cali: Esta zona comprende el territorio que va desde la KR 50 con la CL 57 hasta la CL 5, vía por la cual se continúa hacia el sur de la ciudad hasta el Río Meléndez, siguiendo su cauce aguas arriba hasta el cruce con el límite del suelo urbano, por el que se continua hacia el sur de la ciudad hasta la KR 127 y por esta vía hasta la CL 18, punto en el cual se sigue el trazado (hacia el sur) del límite del suelo de expansión urbano hasta llegar al punto de inicio en la KR 50.

Si observamos los puntos azules del presente mapa podemos evidenciar que en su mayoría se encuentran en las calles y carreras descritas anteriormente. Los puntos que están fuera de la Zona Sur y que según la data corresponden a dicha zona, puede deberse a que al ingresar las longitudes y latitudes se presentaron errores de digitación y como es una data extraída por medio del web scraping de la página de OLX, es posible que se puedan presentar errores en el momento que las personas registraron las propiedades, ya que, se podría presentar desconocimiento de las latitudes y longitudes y ubicación de sus propiedades.

También se puede explicar este caso de puntos dispersos, es que, si bien hay un norte global donde se agrupan la mayoría de los apartamentos, hay que decir que, cada barrio o zona, tienen su propia Zona Sur.

table(base2$zona)
## 
## Zona Sur 
##     2787

Nos damos cuenta que efectivamente solo hay una zona

table(base2$estrato)
## 
##    3    4    5    6 
##  201 1091 1033  462
table(base2$tipo)
## 
## Apartamento 
##        2787
vivienda_filtro <- base2 %>%
  select('areaconst', 'estrato', 'banios', 'habitaciones','zona', 'preciom')
vivienda_filtro$zona <- ifelse(vivienda_filtro$zona == "Zona Centro", 1,
                               ifelse(vivienda_filtro$zona == "Zona Norte", 2,
                                      ifelse(vivienda_filtro$zona == "Zona Oeste", 3,
                                             ifelse(vivienda_filtro$zona == "Zona Oriente", 4,
                                                    ifelse(vivienda_filtro$zona == "Zona Sur", 5,"")))))
vivienda_filtro$zona <- as.numeric(vivienda_filtro$zona)
summary(vivienda_filtro)
##    areaconst         estrato         banios       habitaciones        zona  
##  Min.   : 40.00   Min.   :3.00   Min.   :0.000   Min.   :0.000   Min.   :5  
##  1st Qu.: 65.00   1st Qu.:4.00   1st Qu.:2.000   1st Qu.:3.000   1st Qu.:5  
##  Median : 85.00   Median :5.00   Median :2.000   Median :3.000   Median :5  
##  Mean   : 97.47   Mean   :4.63   Mean   :2.488   Mean   :2.966   Mean   :5  
##  3rd Qu.:110.00   3rd Qu.:5.00   3rd Qu.:3.000   3rd Qu.:3.000   3rd Qu.:5  
##  Max.   :932.00   Max.   :6.00   Max.   :8.000   Max.   :6.000   Max.   :5  
##     preciom      
##  Min.   :  75.0  
##  1st Qu.: 175.0  
##  Median : 245.0  
##  Mean   : 297.3  
##  3rd Qu.: 335.0  
##  Max.   :1750.0
str(vivienda_filtro)
## 'data.frame':    2787 obs. of  6 variables:
##  $ areaconst   : num  96 40 194 117 78 75 72 68 58 84 ...
##  $ estrato     : num  4 3 6 3 3 4 3 3 3 4 ...
##  $ banios      : num  2 1 5 2 1 2 2 2 2 2 ...
##  $ habitaciones: num  3 2 3 3 3 3 3 3 2 3 ...
##  $ zona        : num  5 5 5 5 5 5 5 5 5 5 ...
##  $ preciom     : num  290 78 875 135 135 220 210 105 115 220 ...
##  - attr(*, "na.action")= 'omit' Named int [1:3] 8320 8321 8322
##   ..- attr(*, "names")= chr [1:3] "8320" "8321" "8322"
M = cor(vivienda_filtro)
## Warning in cor(vivienda_filtro): the standard deviation is zero
corrplot(M,method = 'number')

print(M)
##              areaconst   estrato    banios habitaciones zona   preciom
## areaconst    1.0000000 0.4815593 0.6618179    0.4339608   NA 0.7579955
## estrato      0.4815593 1.0000000 0.5686171    0.2125953   NA 0.6727067
## banios       0.6618179 0.5686171 1.0000000    0.5149227   NA 0.7196705
## habitaciones 0.4339608 0.2125953 0.5149227    1.0000000   NA 0.3317538
## zona                NA        NA        NA           NA    1        NA
## preciom      0.7579955 0.6727067 0.7196705    0.3317538   NA 1.0000000
plot <- plot_ly( data = base2, x = ~areaconst, y = ~preciom,
                 marker = list(size = 10, opacity = 0.8)) %>% add_markers()
plot

Observandol la gráfica se puede inferir que en la Zona sur, entre más alto el precio de la propiedad mayor es su área construida.

modelo_lineal2 <- lm(data = base2, preciom ~ areaconst + estrato + habitaciones + parqueaderos + banios)
summary(modelo_lineal)
## 
## Call:
## lm(formula = preciom ~ areaconst + estrato + habitaciones + parqueaderos + 
##     banios, data = vivienda2)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1596.26   -89.52   -18.63    54.31  1192.21 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -318.31275   11.68459  -27.24   <2e-16 ***
## areaconst       0.96050    0.01875   51.23   <2e-16 ***
## estrato        92.22507    2.43661   37.85   <2e-16 ***
## habitaciones  -25.72893    1.86899  -13.77   <2e-16 ***
## parqueaderos   48.32521    2.01829   23.94   <2e-16 ***
## banios         57.21454    2.23875   25.56   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 175.1 on 8313 degrees of freedom
## Multiple R-squared:  0.7164, Adjusted R-squared:  0.7163 
## F-statistic:  4200 on 5 and 8313 DF,  p-value: < 2.2e-16

En este caso tenemos también que el \(R^2\) es relativamente alto indicando un buen modelo, es decir, podríamos hacer una buena predicción en función de las variables indicadas

Igualmente que en el pirmer modelo todos los pvalores son menores a 0.05, lo cual indica que todos los estimadores son estadísticamente significativos, sin embargo, debemos hacer algunas aclaraciones:

Para habitaciones: notamos que el coeficiente es negativo, para no ser muy lógica esta afirmación debido a que, es más lógico pensar que entre más habitaciones, la casa sería más grande, es decir, una casa con 6 habitaciones debería ser bastante grande, por lo tanto, subir el precio, pero al aparecer entre más habitaciones, más barata la vivienda, acá puede presentarse el caso de que algunos apartamentos están muy bien distribuidos y optimizaron muy bien el espacio. Lo mismo que puede ocurrir con las casas.

Para areaconst: notamos que el valor es muy cercano a cero, lo que nos dice que el área de construcción tiene que aumentar mucho para tener un impacto en el precio, es un poco extraño que aunque haya más correlación en el área de construcción, hay un menor valor en ese coeficiente, esto tal vez, se pueda explicar debido al orden de los datos, las áreas de construcción entran en el orden numérico de cientos (100, 200, 300, etc), pero los demás valores están en un orden numérico bajo.

Este parece ser un muy buen modelo, debido a los p valores y el \(R^2\)

plot(modelo_lineal2)

Analizando la gráfica de los residuales versus lo valores ajustados, vemos que parece no tener una tendencia clara, es decir, la línea recta presentada no sube, ni baja, eso implica que parece haber homocedasticidad

Acá, también notamos que en el snálisis del QQ, la línea recta se ajusta medianamente bien a los datos, sin embargo, hay una dispersión inicial y final, que puede deberse a los valores atípicos muy bajo y muy altos.

Para la gráfica de residuales vs Leverage tenemos una clara tendencia hacia abajo, lo que indica que los errores en la aproximación suelen ser menores, o con tendencia a cero, indicando una aproximación regular.Además, hay observaciones debajo de la palanca algo altas, estas observaciones contribuyen menos al ajuste del modelo en comparación con otras con palancas más altas. El modelo no depende fuertemente de estas observaciones para su ajuste.

Vemos la normalidad de los valores

lmtest::bptest(modelo_lineal2)
## 
##  studentized Breusch-Pagan test
## 
## data:  modelo_lineal2
## BP = 956.83, df = 5, p-value < 2.2e-16

En este caso, el valor p es extremadamente pequeño (cercano a cero), lo que indica evidencia significativa en contra de la hipótesis nula de homocedasticidad. Por lo tanto, se rechaza la hipótesis nula y se concluye que hay heterocedasticidad en el modelo.

shapiro.test(base2$areaconst)
## 
##  Shapiro-Wilk normality test
## 
## data:  base2$areaconst
## W = 0.68155, p-value < 2.2e-16
shapiro.test(base2$preciom)
## 
##  Shapiro-Wilk normality test
## 
## data:  base2$preciom
## W = 0.75683, p-value < 2.2e-16
shapiro.test(base2$banios)
## 
##  Shapiro-Wilk normality test
## 
## data:  base2$banios
## W = 0.79952, p-value < 2.2e-16
shapiro.test(base2$habitaciones)
## 
##  Shapiro-Wilk normality test
## 
## data:  base2$habitaciones
## W = 0.7592, p-value < 2.2e-16
shapiro.test(base2$parqueaderos)
## 
##  Shapiro-Wilk normality test
## 
## data:  base2$parqueaderos
## W = 0.79297, p-value < 2.2e-16
shapiro.test(base2$estrato)
## 
##  Shapiro-Wilk normality test
## 
## data:  base2$estrato
## W = 0.86625, p-value < 2.2e-16

Notamos que los p valores son prácticamente cero, por lo tanto no se rechaza la hipótesis de normalidad, entonces, concluimos que las variables tienen un comportamiento relativamente normal(distribución)

precio2 <- predict (modelo_lineal2, newdata = vivienda1[2,])
precio2
##        2 
## 736.5012
ofertas1 <- base2 %>% 
  filter(preciom <= 850)%>%
  mutate (precio_modelo = predict(modelo_lineal, newdata = .)) %>%
  arrange(abs(precio_modelo - precio2)) %>%
  head(5)
  
ofertas1
##     id     zona piso estrato preciom areaconst parqueaderos banios habitaciones
## 1 5624 Zona Sur   03       6     600       230            2      5            4
## 2 6529 Zona Sur   02       6     720       165            4      4            3
## 3 6464 Zona Sur   03       6     660       159            4      4            3
## 4 6539 Zona Sur    0       6     850       186            3      5            4
## 5 4110 Zona Sur   05       6     600       148            3      5            3
##          tipo        barrio  longitud latitud precio_modelo
## 1 Apartamento         pance -76.53779 3.34743      735.7591
## 2 Apartamento         pance -76.54304 3.35631      738.4917
## 3 Apartamento         pance -76.54292 3.34103      732.7287
## 4 Apartamento ciudad jardín -76.54309 3.35621      741.8225
## 5 Apartamento         pance -76.52986 3.34791      731.0526
library("leaflet")

# Crea un mapa
mapa_of2 <- leaflet(ofertas1) %>%
  addTiles() %>%
  addCircleMarkers(lng=~longitud, lat = ~latitud,radius = 3)
  
mapa_of2

Es posible observar en qué parte de la ciudad de Cali están ubicadas las posibles propiedades para adquirir, según el crédito de 850 millones aprobado por el banco.

En conclusón tenemos las siguientes propuestas para la cliente:

Para la solicitud de la Vivienda 1, estas son las ofertas:

print(ofertas)
##     id       zona piso estrato preciom areaconst parqueaderos banios
## 1 1107 Zona Norte    0       4     330       140            1      3
## 2  393 Zona Norte    0       4     250       115            1      3
## 3 4545 Zona Norte    0       3     310       300            0      5
## 4 1753 Zona Norte    0       4     350       264            0      0
## 5 1055 Zona Norte    0       4     280       147            1      3
##   habitaciones tipo                    barrio  longitud latitud precio_modelo
## 1            4 Casa                 la merced -76.51057 3.48113      302.1101
## 2            3 Casa             villa del sol -76.49500 3.48300      303.8266
## 3            9 Casa urbanización barranquilla -76.53200 3.45200      301.0235
## 4            0 Casa                    vipasa -76.51722 3.47472      304.1584
## 5            4 Casa                 la merced -76.50880 3.48699      308.8335

Vivienda ID 1107:

Tiene un estrato de 4, con un precio de $330. El área construida es de 140 metros cuadrados, cuenta con 1 parqueadero, 3 baños y 4 habitaciones. Se clasifica como una casa y está ubicada en el barrio La Merced. El precio estimado por el modelo es de $302.1101.

Vivienda ID 393:

Esta vivienda tiene un estrato de 4 y un precio de $250. El área construida es de 115 metros cuadrados, con 1 parqueadero, 3 baños y 3 habitaciones. Clasificada como casa, se encuentra en el barrio Villa del Sol. El precio estimado por el modelo es de $303.8266

Vivienda ID 4545:

Esta propiedad tiene un estrato de 3 y un precio de $310. Con una amplia área construida de 300 metros cuadrados, cuenta con 0 parqueaderos, 5 baños y 9 habitaciones. Es una casa ubicada en la Urbanización Barranquilla. El precio estimado por el modelo es de $301.0235.

Vivienda ID 1753:

Esta vivienda tiene un estrato de 4 y un precio de $350. El área construida es de 264 metros cuadrados. Aunque no tiene parqueaderos, baños ni habitaciones especificados, se clasifica como una casa en el barrio Vipasa. El precio estimado por el modelo es de $304.1584.

Vivienda ID 1055:

Esta vivienda tiene un estrato de 4 con un precio de $280. El área construida es de 147 metros cuadrados, con 1 parqueadero, 3 baños y 4 habitaciones, se encuentra en el barrio La Merced. El precio estimado por el modelo es de $308.8335.

Para la solicitud de la Vivienda 2, estas son las ofertas:

print(ofertas1)
##     id     zona piso estrato preciom areaconst parqueaderos banios habitaciones
## 1 5624 Zona Sur   03       6     600       230            2      5            4
## 2 6529 Zona Sur   02       6     720       165            4      4            3
## 3 6464 Zona Sur   03       6     660       159            4      4            3
## 4 6539 Zona Sur    0       6     850       186            3      5            4
## 5 4110 Zona Sur   05       6     600       148            3      5            3
##          tipo        barrio  longitud latitud precio_modelo
## 1 Apartamento         pance -76.53779 3.34743      735.7591
## 2 Apartamento         pance -76.54304 3.35631      738.4917
## 3 Apartamento         pance -76.54292 3.34103      732.7287
## 4 Apartamento ciudad jardín -76.54309 3.35621      741.8225
## 5 Apartamento         pance -76.52986 3.34791      731.0526

Vivienda ID 5624:

Ocupa el tercer piso, tiene un estrato socioeconómico de 6, un precio de vivienda de $600, un área construida de 230, cuenta con 2 parqueaderos, 4 baños, y 5 habitaciones. Se trata de un apartamento en el barrio Pance. El modelo de predicción establece un precio estimado de $735.76.

Vivienda ID 6529:

En el segundo piso, con estrato 6, un precio de $720 y un área construida de 165. Dispone de 4 parqueaderos, 4 baños y 3 habitaciones. Es un apartamento ubicado en el barrio Pance. Según el modelo, se estima un precio de $738.49.

Vivienda ID 6464:

En el tercer piso, presenta un estrato de 6, un precio de $660 y un área construida de 159. Ofrece 4 parqueaderos, 4 baños y 3 habitaciones. Se trata de un apartamento en el barrio Pance. El modelo predice un precio de $732.73.

Vivienda ID 6539:

Sin especificar el piso, con estrato 6, un precio de $850 y un área construida de 186. Cuenta con 3 parqueaderos, 5 baños y 4 habitaciones. Es un apartamento ubicado en Ciudad Jardín 1. El modelo estima un precio de $741.82.

Vivienda ID 4110:

En el quinto piso, con estrato 6, un precio de $600 y un área construida de 148. Tiene 3 parqueaderos, 5 baños y 3 habitaciones. Se trata de un apartamento en el barrio Pance. Según el modelo, se estima un precio de $731.05.