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