ENUNCIADO

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:

Características

{=html}

Definición

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

Tabla de Variables

Tabla de Variables y Descripciones

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

Punto 1 - REQUERIMIENTO CASA

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:

  1. Se realizó mal el registro en el momento de la digitación de las cordenadas, por lo que la ubican, no donde realmente esta la propiedad.
  2. Mala medición. En el momento de tomar los datos no se hizo de la manera correcta y aunque se escribieron como decía el medidor, este podría encontrarse desafinado.

Punto 2 - REQUERIMIENTO 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 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")
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

Punto 3 - REQUERIMIENTO CASA

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

Punto 4 - REQUERIMIENTO CASA

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.

Punto 5 - REQUERIMIENTO CASA

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

Punto 6 - REQUERIMIENTO CASA

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")
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'
                   )

============================================================================

Punto 1 - REQUERIMIENTO APARTAMENTO

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.

Punto 2 - REQUERIMIENTO APARTAMENTO

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

Punto 3 - REQUERIMIENTO APARTAMENTOS

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

Punto 4 - REQUERIMIENTO APARTAMENTOS

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.

Punto 5 - REQUERIMIENTO APARTAMENTO

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

Punto 6 - REQUERIMIENTO APARTAMENTO

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