Enunciado
Maria comenzó como agente de bienes raíces en Cali hace 10 años. Después de laborar dos años para una empresa nacional, se traslado a Bogotá y trabajó para otra agencia de bienes raíces. Sus amigos y familiares la convencieron de que con su experiencia y conocimientos del negocio debía abrir su propia agencia. Terminó por adquirir la licencia de intermediario y al poco tiempo fundó su propia compañía, C&A (Casas y Apartamentos) en Cali. Santiago y Lina, dos vendedores de la empresa anterior aceptaron trabajar en la nueva compaña. En la actualidad ocho agentes de bienes raíces colaboran con ella en C&A.
Actualmente las ventas de bienes raíces en Cali se han visto disminuidas de manera significativa en lo corrido del año. Durante este periodo muchas instituciones bancarias de ahorro y vivienda están prestando grandes sumas de dinero para la industria y la construcción comercial y residencial. Cuando el efecto producto de las tensiones políticas y sociales disminuya, se espera que la actividad económica de este sector se reactive.
Hace dos días, María recibió una carta solicitando asesoría para la compra de dos viviendas por parte de una compañía internacional que desea ubicar a dos de sus empleados con sus familias en la ciudad. Las solicitudes incluyen las siguientes condiciones:
{=html}
| Características | Vivienda 1 | Vivienda 2 |
|---|---|---|
| Tipo | Capa | Apartamento |
| Área construida | 200 | 300 |
| Parquaderos | 1 | 3 |
| Baños | 2 | 3 |
| Habitaciones | 4 | 5 |
| Estrato | 4 o 5 | 5 o 6 |
| Zona | Norte | Sur |
| Crédito preaprobado | 350 millones | 850 millones |
Ayude a María a responder la solicitud, mediante técnicas modelación que usted conoce. Ella requiere le envíe un informe ejecutivo donde analice los dos casos y sus recomendaciones (Informe). Como soporte del informe debe anexar las estimaciones, validaciones y comparación de modelos requeridos (Anexos) .
Datos Los datos de los tres últimos meses se adjuntan en la base que puede obtener con el siguiente código en R
| Variable | Descripción |
|---|---|
| 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, Alamos,… |
| longitud | Coordenada geográfica |
| latitud | Coordenada geográfica |
#devtools::install_github("centromagis/paqueteMODELOS", force =TRUE)1
#library(paqueteMODELOS)
#data("vivienda")
setwd("I://Mi unidad/Actividad 2")
load("vivienda.RData")
data(vivienda)
#str(vivienda)
knitr::kable(head(vivienda, 10), caption = "Base de Datos VIVIENDA")
| id | zona | piso | estrato | preciom | areaconst | parqueaderos | banios | habitaciones | tipo | barrio | longitud | latitud |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1147 | Zona Oriente | NA | 3 | 250 | 70 | 1 | 3 | 6 | Casa | 20 de julio | -76.51168 | 3.43382 |
| 1169 | Zona Oriente | NA | 3 | 320 | 120 | 1 | 2 | 3 | Casa | 20 de julio | -76.51237 | 3.43369 |
| 1350 | Zona Oriente | NA | 3 | 350 | 220 | 2 | 2 | 4 | Casa | 20 de julio | -76.51537 | 3.43566 |
| 5992 | Zona Sur | 02 | 4 | 400 | 280 | 3 | 5 | 3 | Casa | 3 de julio | -76.54000 | 3.43500 |
| 1212 | Zona Norte | 01 | 5 | 260 | 90 | 1 | 2 | 3 | Apartamento | acopi | -76.51350 | 3.45891 |
| 1724 | Zona Norte | 01 | 5 | 240 | 87 | 1 | 3 | 3 | Apartamento | acopi | -76.51700 | 3.36971 |
| 2326 | Zona Norte | 01 | 4 | 220 | 52 | 2 | 2 | 3 | Apartamento | acopi | -76.51974 | 3.42627 |
| 4386 | Zona Norte | 01 | 5 | 310 | 137 | 2 | 3 | 4 | Apartamento | acopi | -76.53105 | 3.38296 |
| 1209 | Zona Norte | 02 | 5 | 320 | 150 | 2 | 4 | 6 | Casa | acopi | -76.51341 | 3.47968 |
| 1592 | Zona Norte | 02 | 5 | 780 | 380 | 2 | 3 | 3 | Casa | acopi | -76.51674 | 3.48721 |
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 <- filter(vivienda, zona == "Zona Norte" & tipo == "Casa")
head(base1, 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>
leaflet() %>% addTiles() %>%
setView(lng = -76.532, lat = 3.451, zoom = 12) %>%
addCircleMarkers(lng = base1$longitud,
lat = base1$latitud,
label = as.character(paste0("Precio: $",base1$preciom, "-Estrato:", base1$estrato, "-Piso(s):", base1$piso, "-Hab: ",base1$habitaciones, "-Parqueaderos: ",base1$parqueaderos)),
stroke = FALSE,
fillOpacity = 0.5,
radius = 4,
color = 'blue'
)
Se puede apreciar que existe una gran dispersión de ubicaciones fuera de la zona que estamos revisando. Esto se puede presentar principalmente por:
Realice un análisis exploratorio de datos enfocado en la correlación entre la variable respuesta (precio de la casa) en función del área construida, estrato, numero de baños, numero de habitaciones y zona donde se ubica la vivienda. Use gráficos interactivos con el paquete plotly e interprete los resultados.
#Creo un dataframe para solo CASAS. Esto para que incluya todas las zonas y sea este un punto de analisis de acuerdo con el requerimiento
base_casas <- filter(vivienda, tipo == "Casa")
result <- summary(base_casas[,2:9])
knitr::kable(result, caption = "Analisis general CASAS")
| zona | piso | estrato | preciom | areaconst | parqueaderos | banios | habitaciones | |
|---|---|---|---|---|---|---|---|---|
| Length:3219 | Length:3219 | Min. :3.000 | Min. : 77 | Min. : 30.0 | Min. : 1.00 | Min. : 0.000 | Min. : 0.00 | |
| Class :character | Class :character | 1st Qu.:3.000 | 1st Qu.: 300 | 1st Qu.: 154.0 | 1st Qu.: 1.00 | 1st Qu.: 3.000 | 1st Qu.: 3.00 | |
| Mode :character | Mode :character | Median :5.000 | Median : 430 | Median : 240.0 | Median : 2.00 | Median : 4.000 | Median : 4.00 | |
| NA | NA | Mean :4.485 | Mean : 540 | Mean : 273.4 | Mean : 2.29 | Mean : 3.894 | Mean : 4.61 | |
| NA | NA | 3rd Qu.:5.000 | 3rd Qu.: 670 | 3rd Qu.: 350.0 | 3rd Qu.: 3.00 | 3rd Qu.: 5.000 | 3rd Qu.: 5.00 | |
| NA | NA | Max. :6.000 | Max. :1999 | Max. :1745.0 | Max. :10.00 | Max. :10.000 | Max. :10.00 | |
| NA | NA | NA | NA | NA | NA’s :733 | NA | NA |
# Especificar las columnas para las que deseas generar histogramas
columnas_histograma <- c("zona", "piso", "estrato", "preciom", "areaconst", "parqueaderos", "banios", "habitaciones")
# Función para crear histogramas o gráficos de barras
plot_histogram_or_bar <- function(column_name) {
if (is.numeric(base_casas[[column_name]])) {
# Generar histograma para variables numéricas
ggplot(base1, aes_string(x = column_name)) +
geom_histogram(binwidth = 1, fill = "blue", color = "black", alpha = 0.7) +
labs(title = paste("Histograma de", column_name), x = column_name, y = "Frecuencia") +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5)) # Centrar el título
} else {
# Generar gráfico de barras para variables categóricas
ggplot(base_casas, aes_string(x = column_name)) +
geom_bar(fill = "blue", color = "black", alpha = 0.7) +
labs(title = paste("Gráfico de Frecuencia de", column_name), x = column_name, y = "Frecuencia") +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5)) # Centrar el título
}
}
# Generar una lista de plots solo para las columnas especificadas
plots <- lapply(columnas_histograma, plot_histogram_or_bar) # Aplicar la función a las columnas especificadas
Warning: `aes_string()` was deprecated in ggplot2 3.0.0.
ℹ Please use tidy evaluation idioms with `aes()`.
ℹ See also `vignette("ggplot2-in-packages")` for more information.
This warning is displayed once every 8 hours.
Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
generated.
# Mostrar todos los histogramas o gráficos de barras en una sola ventana
grid.arrange(grobs = plots, ncol = 2) # Ajustar alturas
Warning: Removed 287 rows containing non-finite outside the scale range
(`stat_bin()`).
En este momeno se esta realizando el análisis para el requerimiento de la CASA. Dentro de este, se espera recomendar opciones que se encuentren ubicadas en la zona Norte, sin embargo, se puede ver que, la mayor cantidad de viviendas se encuentran en la zona Sur.
De agual manera, el estrato que se desea es 4 o 5. En este rango se cumple con la mayor parte de las viviendas que se estan exponiendo. El rango de precios esta un poco por encima del precio requerido, sin que sea una diferencia imposibilitante.
Los demas parametros que se desean formen parte de la casa estan dentro de la mayoria de inmuebles que se tienen en oferta.
cor_1 <-base_casas[,c("preciom","areaconst","estrato","banios","habitaciones")]
ggpairs(cor_1, title="GGally ")
Con el grafico de correslaciones GGally se puede apreciar que no existe una correlacion elevada entre las variables preciom, areaconst, estrato, bannios y habitaciones que pueda generar problemas en la estimación del modelo y su inferencia.
Se presenta una correlacion importante entre el preciom y las demas variables examinadas, sin que esto genere problemas con la data registrada.
Entre las demás variables independientes, su correlación es baja
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 = lm(preciom ~ areaconst + estrato + parqueaderos + banios + habitaciones, data = base_casas)
summary(modelo)
Call:
lm(formula = preciom ~ areaconst + estrato + parqueaderos + banios +
habitaciones, data = base_casas)
Residuals:
Min 1Q Median 3Q Max
-1190.80 -114.52 -25.94 74.59 986.16
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -413.87536 25.58852 -16.174 < 2e-16 ***
areaconst 0.74227 0.02941 25.235 < 2e-16 ***
estrato 116.07109 5.26618 22.041 < 2e-16 ***
parqueaderos 64.29943 3.47719 18.492 < 2e-16 ***
banios 39.03498 4.05083 9.636 < 2e-16 ***
habitaciones -14.74995 3.18137 -4.636 3.73e-06 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 205.2 on 2480 degrees of freedom
(733 observations deleted due to missingness)
Multiple R-squared: 0.6834, Adjusted R-squared: 0.6828
F-statistic: 1071 on 5 and 2480 DF, p-value: < 2.2e-16
Este es el proceso de estimación de coheficientes. De esta forma el modelo se presenta de la siguiente manera:
Precio = -413.87536 + (0.74227 * areaconst) + (116.07109 * estrato) + (64.29943 * parqueaderos) (39.03498 * banios) + (-14.74995 * habitaciones)
El R2 es de 0.6834. Esto significa que mas del 68% de los precios presentados, estan relacionados con las variables reaconst, estrato, parqueaderos, banios y habitaciones.
Ahora, se hace el proceso de verificación de multicolialidad de las variables que se estan evaluando.
knitr::kable(vif(modelo), caption = "Datos para predicción casas")
| x | |
|---|---|
| areaconst | 1.541765 |
| estrato | 1.694080 |
| parqueaderos | 1.535105 |
| banios | 2.059733 |
| habitaciones | 1.594265 |
Bajo este an{alisis, se evidencia que los valores calculados en el VIF se encuentran por debajo del limite 5, pero si muestran una multicoliniadad ya que los datos estan por encima de uno; excepto bannios que pasa apenas por encima de 2.
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)
Revisamos losn errores residuales
e = modelo$residuals
summary (e)
Min. 1st Qu. Median Mean 3rd Qu. Max.
-1190.80 -114.52 -25.94 0.00 74.59 986.16
Se puede evidenciar que, los errores se toman en cero E[u]=0
Supuesto de normalidad de los errores
H0: Registra los errores de la distribución normal.
shapiro.test(e)
Shapiro-Wilk normality test
data: e
W = 0.89699, p-value < 2.2e-16
Teniendo en cuenta que p es < que el 5%, los resuduales no cumplen con los criterios de distribucion normal. Es decir que H0 se niega.
Supuesto de independencia de errores
H0: Los errores son independientes.
dwtest(modelo)
Durbin-Watson test
data: modelo
DW = 1.5759, p-value < 2.2e-16
alternative hypothesis: true autocorrelation is greater than 0
Tomando como base el resultado logrado por Durbin-Watson el valor de p-valor es menor al 5%, por lo se evidencia que los errores son dependientes. Por esta razón se niega H0 y en teoria se tomamir la hipótesis alternativa. En este ejercicio no hay ya que no se esta manejando linea de tiempo.
Supuesto de varianza constante
H0: la varianza de los erroes es constante.
gqtest(modelo)
Goldfeld-Quandt test
data: modelo
GQ = 1.268, df1 = 1237, df2 = 1237, p-value = 1.525e-05
alternative hypothesis: variance increases from segment 1 to 2
Los errores no cumplen igualmente, con el supuesto de varianza constante. Esto se evidencia en que el p-value < 5%
SUGERENCIA Para mejorar los supuestos relacionados con los errores, se podrian aplicar transformaciones a las variables que no presentan un valor lioneal.
Con el modelo identificado debe predecir el precio de la vivienda con las características de la primera solicitud.
Vivienda_casa = data.frame( areaconst=c(200,200)
,estrato=c(4,5)
,parqueaderos=c(1,1)
,banios=c(2,2)
,habitaciones=c(4,4)
)
knitr::kable(Vivienda_casa, caption = "Vectores para la predicción de la casa del requerimiento")
| areaconst | estrato | parqueaderos | banios | habitaciones |
|---|---|---|---|---|
| 200 | 4 | 1 | 2 | 4 |
| 200 | 5 | 1 | 2 | 4 |
predicciones <- predict(modelo, newdata = Vivienda_casa)
# Mostrar las predicciones
print(predicciones)
1 2
282.2318 398.3029
Segun el modelo creado, el valor esperado para las predicciones es el siguiente:
Vivienda_casa$prediccion_precio <- predict(modelo, newdata = Vivienda_casa)
print(Vivienda_casa)
areaconst estrato parqueaderos banios habitaciones prediccion_precio
1 200 4 1 2 4 282.2318
2 200 5 1 2 4 398.3029
El valor de la prediccoón se encuentra en millones
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.
opciones <- which((base1$estrato==4 | base1$estrato==5)
& base1$areaconst>= 200
& base1$parqueaderos>=1
& base1$banios>=2
& base1$habitaciones>=4
& base1$preciom<=350 )
Ofertas_casas <- base1[opciones,]
base_casas_5 = Ofertas_casas[order(Ofertas_casas$areaconst, decreasing = TRUE), ]
ofertac5 <- head(base_casas_5, 5)
knitr::kable(head(base_casas_5, 5), caption = "Las mejores 5 ofertas ordenadas por área construida")
| id | zona | piso | estrato | preciom | areaconst | parqueaderos | banios | habitaciones | tipo | barrio | longitud | latitud |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 3101 | Zona Norte | 02 | 5 | 340 | 355 | 2 | 5 | 8 | Casa | san vicente | -76.52377 | 3.46384 |
| 5031 | Zona Norte | 03 | 4 | 350 | 350 | 1 | 4 | 5 | Casa | salomia | -76.53464 | 3.44987 |
| 1943 | Zona Norte | NA | 5 | 350 | 346 | 1 | 2 | 4 | Casa | vipasa | -76.51847 | 3.47503 |
| 4209 | Zona Norte | 02 | 5 | 350 | 300 | 3 | 5 | 6 | Casa | el bosque | -76.53010 | 3.48577 |
| 3352 | Zona Norte | NA | 4 | 335 | 300 | 3 | 4 | 4 | Casa | el bosque | -76.52600 | 3.43400 |
print(ofertac5)
# A tibble: 5 × 13
id zona piso estrato preciom areaconst parqueaderos banios habitaciones
<dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 3101 Zona N… 02 5 340 355 2 5 8
2 5031 Zona N… 03 4 350 350 1 4 5
3 1943 Zona N… <NA> 5 350 346 1 2 4
4 4209 Zona N… 02 5 350 300 3 5 6
5 3352 Zona N… <NA> 4 335 300 3 4 4
# ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
leaflet() %>% addTiles() %>%
setView(lng = -76.532, lat = 3.451, zoom = 12) %>%
addCircleMarkers(lng = ofertac5$longitud,
lat = ofertac5$latitud,
label = as.character(paste0("Precio: $",ofertac5$preciom, "-Estrato:", ofertac5$estrato, "-Piso(s):", ofertac5$piso, "-Hab: ",ofertac5$habitaciones, "-Parqueaderos: ",ofertac5$parqueaderos)),
stroke = FALSE,
fillOpacity = 0.5,
radius = 8,
color = '#069d03'
)
============================================================================
Realice un filtro a la base de datos e incluya solo las ofertas de :
base2: Apartamentos, de la zona Sur 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?).
base2 <- filter(vivienda, zona == "Zona Sur" & tipo == "Apartamento")
head(base2, 3)
# A tibble: 3 × 13
id zona piso estrato preciom areaconst parqueaderos banios habitaciones
<dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 5098 Zona S… 05 4 290 96 1 2 3
2 698 Zona S… 02 3 78 40 1 1 2
3 8199 Zona S… <NA> 6 875 194 2 5 3
# ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
leaflet() %>% addTiles() %>%
setView(lng = -76.532, lat = 3.451, zoom = 12) %>%
addCircleMarkers(lng = base2$longitud,
lat = base2$latitud,
label = as.character(paste0("Precio: $",base2$preciom, "-Estrato:", base2$estrato, "-Piso(s):", base2$piso, "-Hab: ",base2$habitaciones, "-Parqueaderos: ",base2$parqueaderos)),
stroke = FALSE,
fillOpacity = 0.5,
radius = 4,
color = 'red'
)
Esta zona Sur tiene una gran cantidad de datos de viviendas en Cali. Se presenta igualmente dispersión que puede seguramente por las misms razones de registro de la situación de la casa.
Realice un análisis exploratorio de datos enfocado en la correlación entre la variable respuesta (precio de la casa) en función del área construida, estrato, numero de baños, numero de habitaciones y zona donde se ubica la vivienda. Use gráficos interactivos con el paquete plotly e interprete los resultados.
#Creo un dataframe para solo APARTAMENTOS. Esto para que incluya todas las zonas y sea este un punto de analisis de acuerdo con el requerimiento
base_aptos <- filter(vivienda, tipo == "Apartamento")
result <- summary(base_aptos[,2:9])
knitr::kable(result, caption = "Analisis general APRTAMENTOS")
| zona | piso | estrato | preciom | areaconst | parqueaderos | banios | habitaciones | |
|---|---|---|---|---|---|---|---|---|
| Length:5100 | Length:5100 | Min. :3.000 | Min. : 58.0 | Min. : 35.0 | Min. : 1.000 | Min. :0.000 | Min. :0.000 | |
| Class :character | Class :character | 1st Qu.:4.000 | 1st Qu.: 175.0 | 1st Qu.: 68.0 | 1st Qu.: 1.000 | 1st Qu.:2.000 | 1st Qu.:3.000 | |
| Mode :character | Mode :character | Median :5.000 | Median : 279.0 | Median : 90.0 | Median : 1.000 | Median :2.000 | Median :3.000 | |
| NA | NA | Mean :4.727 | Mean : 366.9 | Mean :112.8 | Mean : 1.568 | Mean :2.617 | Mean :2.971 | |
| NA | NA | 3rd Qu.:6.000 | 3rd Qu.: 430.0 | 3rd Qu.:130.0 | 3rd Qu.: 2.000 | 3rd Qu.:3.000 | 3rd Qu.:3.000 | |
| NA | NA | Max. :6.000 | Max. :1950.0 | Max. :932.0 | Max. :10.000 | Max. :8.000 | Max. :9.000 | |
| NA | NA | NA | NA | NA | NA’s :869 | NA | NA |
# Especificar las columnas para las que deseas generar histogramas
#columnas_histograma <- c("zona", "piso", "estrato", "preciom", "areaconst", "parqueaderos", "banios", "habitaciones")
# Función para crear histogramas o gráficos de barras
plot_histogram_or_bar <- function(column_name) {
if (is.numeric(base2[[column_name]])) {
# Generar histograma para variables numéricas
ggplot(base_aptos, aes_string(x = column_name)) +
geom_histogram(binwidth = 1, fill = "orange", color = "#545454", alpha = 0.7) +
labs(title = paste("Histograma de", column_name), x = column_name, y = "Frecuencia") +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5)) # Centrar el título
} else {
# Generar gráfico de barras para variables categóricas
ggplot(base_aptos, aes_string(x = column_name)) +
geom_bar(fill = "orange", color = "#545454", alpha = 0.7) +
labs(title = paste("Gráfico de Frecuencia de", column_name), x = column_name, y = "Frecuencia") +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5)) # Centrar el título
}
}
# Generar una lista de plots solo para las columnas especificadas
plots <- lapply(columnas_histograma, plot_histogram_or_bar) # Aplicar la función a las columnas especificadas
# Mostrar todos los histogramas o gráficos de barras en una sola ventana
grid.arrange(grobs = plots, ncol = 2) # Ajustar alturas
Warning: Removed 869 rows containing non-finite outside the scale range
(`stat_bin()`).
En este momento se hace el analisis al requerimiento del APARTAMENTO. Se
puede evidenciar que la Zona donde mas se encuentran viviendas
disponibles para la venta es la ZONA SUR, que corresponde a los deselos
de los clientes. Por el valor del préstamo presupuestado no se presentan
problemas, ya que esta muy por encima de la media.
Sin embargo, en cuanto al tamaño mínimo requerido, el número de habitaciones y baños, se disminuye substancialmente la oferta.
cor_2 <-base_aptos[,c("preciom","areaconst","estrato","banios","habitaciones")]
ggpairs(cor_2, title="GGally ")
En este punto, gracias al gráfico de correlaciones de GGally, se puede
aprecioarapreciar una correlación entre el preciom y las habitaciones y
el estrato; que aunque son positivas y un poco altas, no son un punto
para preocuparse.
Sin embargo, la correlacion entre preciom y bannos, y preciom y areaconst es muy alta, especialmente en esta ultima. Ahora, mirando la correlacion de bannos y areaconst es tambien baatante alta.
En este punto, se toma la decision de eliminar del analisis la columna bannos para evitar que el modelo se sobrestime.
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).
modelo2 = lm(preciom ~ areaconst + estrato + parqueaderos + habitaciones, data = base_aptos)
summary(modelo2)
Call:
lm(formula = preciom ~ areaconst + estrato + parqueaderos + habitaciones,
data = base_aptos)
Residuals:
Min 1Q Median 3Q Max
-1933.26 -58.24 0.37 47.69 1040.88
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -334.53469 15.94159 -20.985 < 2e-16 ***
areaconst 2.31630 0.04565 50.743 < 2e-16 ***
estrato 71.79386 2.98821 24.026 < 2e-16 ***
parqueaderos 102.66183 4.19370 24.480 < 2e-16 ***
habitaciones -17.87644 3.58348 -4.989 6.33e-07 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 141.8 on 4226 degrees of freedom
(869 observations deleted due to missingness)
Multiple R-squared: 0.7714, Adjusted R-squared: 0.7712
F-statistic: 3565 on 4 and 4226 DF, p-value: < 2.2e-16
Este es el proceso de estimación de coheficientes. De esta forma el modelo se presenta de la siguiente manera:
Precio = -334.53469 + (2.31630 * areaconst) + (71.79386 * estrato) + (102.66183 * parqueaderos) + (-17.87644 * habitaciones)
El R2 es de 0.7712. Esto significa que mas del 77% de los precios presentados, estan relacionados con las variables reaconst, estrato, parqueaderos, y habitaciones.
Ahora, se hace el proceso de verificación de multicolialidad de las variables que se estan evaluando.
knitr::kable(vif(modelo2), caption = "Datos para predicción Apartamentos")
| x | |
|---|---|
| areaconst | 2.182888 |
| estrato | 1.518060 |
| parqueaderos | 2.038896 |
| habitaciones | 1.193198 |
De igual manera que en el caso anterior, todos los valores se encuentran bajo el límite de 5 que es el limite.
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(modelo2)
Revisamos losn errores residuales
e2 = modelo2$residuals
summary (e2)
Min. 1st Qu. Median Mean 3rd Qu. Max.
-1933.2585 -58.2363 0.3701 0.0000 47.6867 1040.8787
Se puede evidenciar que, los errores se toman en cero E[u]=0
Supuesto de normalidad de los errores
H0: Registra los errores de la distribución normal.
shapiro.test(e2)
Shapiro-Wilk normality test
data: e2
W = 0.82757, p-value < 2.2e-16
Teniendo en cuenta que p-value es < que el 5%, los resuduales no cumplen con los criterios de distribucion normal. Es decir que H0 se niega.
Supuesto de independencia de errores
H0: Los errores son independientes.
dwtest(modelo2)
Durbin-Watson test
data: modelo2
DW = 1.6486, p-value < 2.2e-16
alternative hypothesis: true autocorrelation is greater than 0
Tomando como base el resultado logrado por Durbin-Watson el valor de p-valor es menor al 5%, por lo se evidencia que los errores son dependientes. Por esta razón se niega H0 y en teoria se tomamir la hipótesis alternativa. En este ejercicio no hay ya que no se esta manejando linea de tiempo.
Supuesto de varianza constante
H0: la varianza de los erroes es constante.
gqtest(modelo2)
Goldfeld-Quandt test
data: modelo2
GQ = 1.58, df1 = 2111, df2 = 2110, p-value < 2.2e-16
alternative hypothesis: variance increases from segment 1 to 2
Los errores no cumplen igualmente, con el supuesto de varianza constante. Esto se evidencia en que el p-value < 5%
SUGERENCIA Para mejorar los supuestos relacionados con los errores, se podrian aplicar transformaciones a las variables que no presentan un valor lioneal.
Con el modelo identificado debe predecir el precio de la vivienda con las características de la primera solicitud.
Vivienda_apto = data.frame( areaconst=c(300,300)
,estrato=c(5,6)
,parqueaderos=c(3,3)
,habitaciones=c(5,5)
)
knitr::kable(Vivienda_casa, caption = "Vectores para la predicción del APARTAMENTO del requerimiento")
| areaconst | estrato | parqueaderos | banios | habitaciones | prediccion_precio |
|---|---|---|---|---|---|
| 200 | 4 | 1 | 2 | 4 | 282.2318 |
| 200 | 5 | 1 | 2 | 4 | 398.3029 |
predicciones2 <- predict(modelo2, newdata = Vivienda_apto)
# Mostrar las predicciones
print(predicciones2)
1 2
937.9279 1009.7217
Segun el modelo creado, el valor esperado para las predicciones es el siguiente:
Vivienda_apto$prediccion_precio <- predict(modelo2, newdata = Vivienda_apto)
print(Vivienda_apto)
areaconst estrato parqueaderos habitaciones prediccion_precio
1 300 5 3 5 937.9279
2 300 6 3 5 1009.7217
El valor de la prediccoón se encuentra en millones
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.
opciones2 <- which((base2$estrato==5 | base2$estrato==6)
& base2$areaconst>= 300
& base2$parqueaderos>=3
& base2$habitaciones>=5
& base2$preciom<=850 )
Ofertas_aptos <- base2[opciones2,]
base_aptos_5 = Ofertas_aptos[order(Ofertas_aptos$areaconst, decreasing = TRUE), ]
Ofertas_aptos <- head(base_aptos_5, 5)
knitr::kable(head(base_aptos_5, 5), caption = "Las mejores 5 ofertas ordenadas por área construida")
| id | zona | piso | estrato | preciom | areaconst | parqueaderos | banios | habitaciones | tipo | barrio | longitud | latitud |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 7182 | Zona Sur | NA | 5 | 730 | 573 | 3 | 8 | 5 | Apartamento | guadalupe | -76.548 | 3.408 |
| 7512 | Zona Sur | NA | 5 | 670 | 300 | 3 | 5 | 6 | Apartamento | seminario | -76.550 | 3.409 |
print(Ofertas_aptos)
# A tibble: 2 × 13
id zona piso estrato preciom areaconst parqueaderos banios habitaciones
<dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 7182 Zona S… <NA> 5 730 573 3 8 5
2 7512 Zona S… <NA> 5 670 300 3 5 6
# ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
leaflet() %>% addTiles() %>%
setView(lng = -76.532, lat = 3.451, zoom = 12) %>%
addCircleMarkers(lng = Ofertas_aptos$longitud,
lat = Ofertas_aptos$latitud,
label = as.character(paste0("Precio: $",Ofertas_aptos$preciom, "-Estrato:", Ofertas_aptos$estrato, "-Piso(s):", Ofertas_aptos$piso, "-Hab: ",Ofertas_aptos$habitaciones, "-Parqueaderos: ",Ofertas_aptos$parqueaderos)),
stroke = FALSE,
fillOpacity = 0.5,
radius = 8,
color = '#1529ce'
)
Para este caso, solamente hay DOS ofertas de vivienda que cumplen con los requerimiento. Se hace la presentacion de las mismas y se recomienda aumentar el presupuesto, ya que según el analisis realizado, el valor aproximado de un apartamento con estos requerimientos es superior a 937 millones