Problema

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 Vivienda 1 Vivienda 2
Tipo Casa Apartamento
área construida 200 300
parqueaderos 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


Analisis de datos



Obtenemos la información basica de la base de datos

str(vivienda) 
## 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")=List of 3
##   ..$ cols   :List of 13
##   .. ..$ id          : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ zona        : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_character" "collector"
##   .. ..$ piso        : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_character" "collector"
##   .. ..$ estrato     : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ preciom     : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ areaconst   : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ parqueaderos: list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ banios      : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ habitaciones: list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ tipo        : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_character" "collector"
##   .. ..$ barrio      : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_character" "collector"
##   .. ..$ longitud    : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ latitud     : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   ..$ default: list()
##   .. ..- attr(*, "class")= chr [1:2] "collector_guess" "collector"
##   ..$ delim  : chr ";"
##   ..- attr(*, "class")= chr "col_spec"
##  - attr(*, "problems")=<externalptr>


Variables

id: (Variable tipo numérica) Número de identificación único para cada vivienda.

zona: (Variable tipo categórica) Contiene información sobre la zona de ubicación de la vivienda, puede ser Zona Sur,Zona Centro, Zona Norte, Zona Occidente o Zona Oriente

piso: (Variable tipo categórica) Contiene información sobre el piso en el que se encuentra ubicada la vivienda.

estrato: (Variable tipo numérica) Indica el estrato socioeconómico al que pertenece la vivienda.

preciom: (Variable tipo numérica) Precio de la vivienda en millones de pesos.

areaconst: (Variable tipo numérica) Área construida de la vivienda.

parqueaderos: (Variable tipo numérica) Número de parqueaderos disponibles en la vivienda.

banios: (Variable tipo numérica) Número de baños en la vivienda.

habitaciones: (Variable tipo numérica) Número de habitaciones en la vivienda.

tipo: (Variable tipo numérica) El tipo de vivienda puede ser Casa o Apartamento.

barrio: (Variable tipo numérica) Barrio donde se encuentra la vivienda.

longitud: (Variable tipo numérica) Coordenada geográfica de longitud donde se ubica la vivienda.

latitud: (Variable tipo numérica) La coordenada geográfica de latitud donde se ubica la vivienda.



Realizamos una validación de los primeros cinco datos de la base


knitr::kable (head(vivienda, 5), 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



Verificamos las variables con un resumen estadistico, esto con el fin de identificar comportamientos atipicos de las variables



knitr::kable (summary(vivienda), caption = "Resumen estadístico")
Resumen estadístico
id zona piso estrato preciom areaconst parqueaderos banios habitaciones tipo barrio longitud latitud
Min. : 1 Length:8322 Length:8322 Min. :3.000 Min. : 58.0 Min. : 30.0 Min. : 1.000 Min. : 0.000 Min. : 0.000 Length:8322 Length:8322 Min. :-76.59 Min. :3.333
1st Qu.:2080 Class :character Class :character 1st Qu.:4.000 1st Qu.: 220.0 1st Qu.: 80.0 1st Qu.: 1.000 1st Qu.: 2.000 1st Qu.: 3.000 Class :character Class :character 1st Qu.:-76.54 1st Qu.:3.381
Median :4160 Mode :character Mode :character Median :5.000 Median : 330.0 Median : 123.0 Median : 2.000 Median : 3.000 Median : 3.000 Mode :character Mode :character Median :-76.53 Median :3.416
Mean :4160 NA NA Mean :4.634 Mean : 433.9 Mean : 174.9 Mean : 1.835 Mean : 3.111 Mean : 3.605 NA NA Mean :-76.53 Mean :3.418
3rd Qu.:6240 NA NA 3rd Qu.:5.000 3rd Qu.: 540.0 3rd Qu.: 229.0 3rd Qu.: 2.000 3rd Qu.: 4.000 3rd Qu.: 4.000 NA NA 3rd Qu.:-76.52 3rd Qu.:3.452
Max. :8319 NA NA Max. :6.000 Max. :1999.0 Max. :1745.0 Max. :10.000 Max. :10.000 Max. :10.000 NA NA Max. :-76.46 Max. :3.498
NA’s :3 NA NA NA’s :3 NA’s :2 NA’s :3 NA’s :1605 NA’s :3 NA’s :3 NA NA NA’s :3 NA’s :3

No se identifica nada atipico en la base de datos

Resumen de la cantidad de casas y apartamentos


Podemos validar la cantidad de casas y apartamentos que hay en cada una de las zonas de la ciudad de Cali

conteo = table(vivienda$zona, vivienda$tipo)
kable(conteo, caption = "Tabla resumen") 
Tabla resumen
Apartamento Casa
Zona Centro 24 100
Zona Norte 1198 722
Zona Oeste 1029 169
Zona Oriente 62 289
Zona Sur 2787 1939


Datos nulos

Obtenemos los datos nulos que tienen cada una de las diferentes variables

knitr::kable (vivienda %>%
  summarise_all(~sum(is.na(.))), caption = "Valores Nulos")
Valores Nulos
id zona piso estrato preciom areaconst parqueaderos banios habitaciones tipo barrio longitud latitud
3 3 2638 3 2 3 1605 3 3 3 3 3 3


Dado que la compañia solicita que las viviendas tengan un minimo de parqueaderos, baños y habitaciones por tanto podriamos eliminar los registros en donde el número de habitaciones y de parqueaderos es nulo.


Desarrollo



Analisis para la selección de Vivienda 1


Casa en el Norte de la ciudad, con 200 metros cuadrados construidos, con 1 parqueadero, 2 baños, 4 habitaciones, estrato 4 o 5, ubicada en el norte y con un credito preaprobado de 350 millones.



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



Dado nuestro problema inicial, crearemos la base de datos = base1 en donde estarán ubicadas las viviendas tipo casa que están ubicadas en el norte de la ciudad.

base1 <- filter(vivienda, zona == "Zona Norte" & tipo == "Casa")


knitr::kable (head(base1, 3), caption = "Primeros 3 registros de base1")
Primeros 3 registros de base1
id zona piso estrato preciom areaconst parqueaderos banios habitaciones tipo barrio longitud latitud
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
4057 Zona Norte 02 6 750 445 NA 7 6 Casa acopi -76.52950 3.38527


Vemos la información estadistica basica de base1


knitr::kable (summary(base1), caption = "Resumen estadistico base 1")
Resumen estadistico base 1
id zona piso estrato preciom areaconst parqueaderos banios habitaciones tipo barrio longitud latitud
Min. : 58.0 Length:722 Length:722 Min. :3.000 Min. : 89.0 Min. : 30.0 Min. : 1.000 Min. : 0.000 Min. : 0.000 Length:722 Length:722 Min. :-76.59 Min. :3.333
1st Qu.: 766.2 Class :character Class :character 1st Qu.:3.000 1st Qu.: 261.2 1st Qu.: 140.0 1st Qu.: 1.000 1st Qu.: 2.000 1st Qu.: 3.000 Class :character Class :character 1st Qu.:-76.53 1st Qu.:3.452
Median :2257.0 Mode :character Mode :character Median :4.000 Median : 390.0 Median : 240.0 Median : 2.000 Median : 3.000 Median : 4.000 Mode :character Mode :character Median :-76.52 Median :3.468
Mean :2574.6 NA NA Mean :4.202 Mean : 445.9 Mean : 264.9 Mean : 2.182 Mean : 3.555 Mean : 4.507 NA NA Mean :-76.52 Mean :3.460
3rd Qu.:4225.0 NA NA 3rd Qu.:5.000 3rd Qu.: 550.0 3rd Qu.: 336.8 3rd Qu.: 3.000 3rd Qu.: 4.000 3rd Qu.: 5.000 NA NA 3rd Qu.:-76.50 3rd Qu.:3.482
Max. :8319.0 NA NA Max. :6.000 Max. :1940.0 Max. :1440.0 Max. :10.000 Max. :10.000 Max. :10.000 NA NA Max. :-76.47 Max. :3.496
NA NA NA NA NA NA NA’s :287 NA NA NA NA NA NA


Sin novedades la base de datos base1



Creamos el mapa de la base1


mapa <- leaflet() %>%
  addTiles(urlTemplate = "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",
           attribution = '© <a href="https://openstreetmap.org/copyright">OpenStreetMap</a> contributors') %>%
  setView(lng = -76.51, lat = 3.43, zoom = 12) %>%
  addPolygons(data = datos_shapefile, 
              color = "orange", 
              fillOpacity = 0.8)  


mapa <- mapa %>%
  addCircleMarkers(data = base1,
                   lng = ~longitud,
                   lat = ~latitud,
                   label = ~paste0("ID: ", id, " Estrato: ", estrato, " Precio:", preciom, "'000.000", " Pisos:", piso),
                   stroke = FALSE,
                   fillOpacity = 0.6,
                   radius = 3,
                   color = 'green',
                   popup = ~paste0("ID: ", id, " Estrato: ", estrato, " Precio:", preciom, "'000.000", " Pisos:", piso))


mapa


Zona Norte: Según la alcaldia de Cali la 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.

Por tanto, según la descripción proporcionada por la alcaldía, así como la validación visual realizada, se ha identificado que existen varios puntos registrados como ‘Zona Norte’ que en realidad pertenecen a otras áreas de la ciudad. Estos errores posiblemente se deben a dificultades en el proceso de registro de la ubicación, ya que no se utiliza un sistema de georreferenciación automática, sino que la información se ingresa manualmente.



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



Dado que necesitamos crear un modelo para determinar la vivienda1 (Primer vivienda solicitada por la compañia intercional), procedemos a imputar los datos nulos de la variable piso con un “1”, esto dado que el cliente no tuvo en cuenta el numero de piso en su solicitud pero el aegnte inmobiliario si podría utilizar el dato del piso para mostrar algún beneficio adicional que sirva para la negociación, ademas se eliminan los valores Nulos de las otras variables, y esto se hace dado que la Compañia Internacional interesada en la compra exige ciertas condiciones.

base1$piso <- ifelse(is.na(base1$piso), 1, base1$piso)
base1_nueva <- base1[complete.cases(base1), ]
head(base1_nueva)
## # A tibble: 6 × 13
##      id zona    piso  estrato preciom areaconst parqueaderos banios habitaciones
##   <dbl> <chr>   <chr>   <dbl>   <dbl>     <dbl>        <dbl>  <dbl>        <dbl>
## 1  1209 Zona N… 02          5     320       150            2      4            6
## 2  1592 Zona N… 02          5     780       380            2      3            3
## 3  4460 Zona N… 02          4     625       355            3      5            5
## 4  6081 Zona N… 02          5     750       237            2      6            6
## 5  7824 Zona N… 02          4     600       160            1      4            5
## 6  7987 Zona N… 02          5     420       200            4      4            5
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>



Analisis exploratorio de datos

Analisis Piso

piso_data <- base1_nueva$piso


plot <- plot_ly(x = ~piso_data, type = "histogram", name = "Piso") %>%
  layout(title = "Distribución de Pisos",
         xaxis = list(title = "Número de Pisos"),
         yaxis = list(title = "Frecuencia"),
         barmode = "overlay",  
         bargap = 0.1)  #

plot


Podemosobservar que la mayor cantidad de datos fue los que imputamos como “1”, es decir los que no tenían información, en cuanto a los que si tenían información el dato predominante es casas de dos pisos.


Analisis Precio Vivienda

preciom_data <- base1_nueva$preciom

plot <- plot_ly(x = ~preciom_data, type = "histogram", name = "Preciom") %>%
  layout(title = "Distribución de Precios de Viviendas",
         xaxis = list(title = "Precio (en millones de pesos)"),
         yaxis = list(title = "Frecuencia"),
         barmode = "overlay",  
         bargap = 0.1)  
plot


La mayor cantidad de casas se ubican en el rango de precio de 350-400 millones, en total 6a registros, seeguido del rango 300-350 con 54 registros.


Analisis Estrato Vivienda

estrato_data <- base1_nueva$estrato


plot <- plot_ly(x = ~estrato_data, type = "histogram", name = "Estrato") %>%
  layout(title = "Distribución de Estratos de Viviendas",
         xaxis = list(title = "Estrato Socioeconómico"),
         yaxis = list(title = "Frecuencia"),
         barmode = "overlay", 
         bargap = 0.1)  


plot


Con 223 registros, el estrato 5 predomina en las casas ubicadas al norte de la ciudad.


Analisis Banios

banios_data <- base1_nueva$banios


plot <- plot_ly(x = ~banios_data, type = "histogram", name = "Baños") %>%
  layout(title = "Distribución de Número de Baños en Viviendas",
         xaxis = list(title = "Número de Baños"),
         yaxis = list(title = "Frecuencia"),
         barmode = "overlay",  
         bargap = 0.1)  


plot


La mayoria de casas poseen 3 baños

Analisis Habitaciones

habitaciones_data <- base1_nueva$habitaciones


plot <- plot_ly(x = ~habitaciones_data, type = "histogram", name = "Habitaciones") %>%
  layout(title = "Distribución del Número de Habitaciones en Viviendas",
         xaxis = list(title = "Número de Habitaciones"),
         yaxis = list(title = "Frecuencia"),
         barmode = "overlay",  
         bargap = 0.1)  
plot


Las casas en su mayoria poseen 4 habitaciones, en total con 4 habitaciones se tienen 142 registros, le sigue 5 habitaciones con 101 registros y 3 habitaciones con 75 registros, este sería el top 3.

Analisis Parqueadero

parqueaderos_data <- base1_nueva$parqueaderos


plot <- plot_ly(x = ~parqueaderos_data, type = "histogram", name = "Parqueaderos") %>%
  layout(title = "Distribución del Número de Parqueaderos en Viviendas",
         xaxis = list(title = "Número de Parqueaderos"),
         yaxis = list(title = "Frecuencia"),
         barmode = "overlay", 
         bargap = 0.1)  
plot


La mayoria de viviendas tiene 1 parqueadero.



Metodo visual correlación de Pearson


subset_data <- base1_nueva[, c("estrato", "preciom", "areaconst", "parqueaderos", "banios", "habitaciones")]


correlation_matrix <- cor(subset_data, use = "complete.obs", method = "pearson")


ggcorrplot(correlation_matrix,
           hc.order = TRUE,  
           type = "upper",   
           ggtheme = ggplot2::theme_minimal())  


Vemos graficamente que existe gran relación positiva entre las variables.



Matriz de Gráficos de Dispersión y Correlación
subset_data <- base1_nueva[, c("estrato", "preciom", "areaconst", "parqueaderos", "banios", "habitaciones")]


ggpairs(subset_data, title = "Gráficos de Dispersión y Correlación")



Podemos confirmar numéricamente que existe una sólida relación positiva entre las variables seleccionadas. Esto significa que cuando una variable aumenta, las demás tienden a aumentar en conjunto. Es interesante observar que la correlación más fuerte se encuentra entre ‘areaconst’ y ‘preciom’. Esto tiene sentido, ya que a medida que el tamaño de la construcción areaconst aumenta, el precio de la vivienda preciom tiende a aumentar, y viceversa. En otras palabras, cuanto más grande es la construcción, se espera que su precio sea más alto, lo que es una relación coherente y lógica en el contexto del mercado inmobiliario

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



Definimos nuestro modelo de regresión lineal múltiple
modelo_vivienda1 = lm(preciom ~ areaconst + estrato + parqueaderos + banios + habitaciones, data = base1_nueva)
summary(modelo_vivienda1)
## 
## Call:
## lm(formula = preciom ~ areaconst + estrato + parqueaderos + banios + 
##     habitaciones, data = base1_nueva)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -784.29  -77.56  -16.03   47.67  978.61 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -238.17090   44.40551  -5.364 1.34e-07 ***
## areaconst       0.67673    0.05281  12.814  < 2e-16 ***
## estrato        80.63495    9.82632   8.206 2.70e-15 ***
## parqueaderos   24.00598    5.86889   4.090 5.14e-05 ***
## banios         18.89938    7.48800   2.524    0.012 *  
## habitaciones    7.64511    5.65873   1.351    0.177    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 155.1 on 429 degrees of freedom
## Multiple R-squared:  0.6041, Adjusted R-squared:  0.5995 
## F-statistic: 130.9 on 5 and 429 DF,  p-value: < 2.2e-16


Cuando se analiza el modelo de regresión para estimar los precios de las casas, se observa que el coeficiente de determinación, R^2, es igual a 0.5995, esto significa que aproximadamente el 59.95% de las variaciones en los precios de las casas pueden explicarse utilizando las variables que hemos incluido en el modelo, el modelo puede predecir cerca del 60% de las diferencias en los precios de las viviendas.

Todas las variables del modelo son estadísticamente significativas, es decir que: el área construida, el estrato, el número de parqueaderos, el número de baños y el número de habitaciones, tienen un impacto importante y medible en el precio de las casas.
Precio = -238.17090 + 0.67673 * (área construida) + 80.63495 * (estrato) + 24.00598 * (parqueaderos) + 18.89938 * (baños) + 7.64511 * (habitaciones
La ecuación del modelo nos ayuda a comprender cómo estas variables influyen en los precios de las casas, por ejemplo, un aumento de una unidad en el estrato se relaciona con un aumento de aproximadamente 80.63 unidades en el precio de la casa, manteniendo todas las demás variables constantes.

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



Análisis de residuales vs. ajustados


plot(modelo_vivienda1, which = 1)


Dado el grafico obtenido podríamos decir que existe un patrón de heterocedasticidad dado que a medida que se avanza a lo largo de la línea los datos se vuelven mas dispersos lo que puede insidar que la varianza de los errores no es constante.

Prueba de Shapiro-Wilk para normalidad de residuos
shapiro.test(modelo_vivienda1$residuals)
## 
##  Shapiro-Wilk normality test
## 
## data:  modelo_vivienda1$residuals
## W = 0.85246, p-value < 2.2e-16

Estadístico de prueba (W): 0.85246 Valor p: < 2.2e-16 (Valor extremadamente pequeño, prácticamente cero)

El resultado del test de Shapiro-Wilk para la normalidad de los residuos del modelo “modelo_vivienda1” muestra un valor extremadamente bajo del estadístico W (0.85246) y un p-valor muy cercano a cero (p-value < 2.2e-16). Esto indica que los residuos no siguen una distribución normal, los residuos del modelo no se ajustan bien a una distribución gaussiana.

Esta falta de normalidad en los residuos podría tener implicaciones en la validez de las pruebas de hipótesis y estimaciones realizadas con el modelo.

Análisis de normalidad Q-Q de residuos


qqnorm(modelo_vivienda1$residuals)
qqline(modelo_vivienda1$residuals)


Según el grafico podemos decir que que falta normalidad dado que existe una desviación hacia arriba en los puntos.

Prueba de Breusch-Pagan para heterocedasticidad
bptest(modelo_vivienda1)
## 
##  studentized Breusch-Pagan test
## 
## data:  modelo_vivienda1
## BP = 80.281, df = 5, p-value = 7.33e-16

Estadístico de prueba BP (Breusch-Pagan): 80.281 Grados de libertad (df): 5 Valor p: 7.33e-16

El resultado del test de Breusch-Pagan (BP) indica que existe heterocedasticidad en los residuos del modelo “modelo_vivienda1”. El valor extremadamente bajo del p-valor (7.33e-16) sugiere que al menos una de las variables explicativas en el modelo contribuye significativamente a la heterocedasticidad, es decir que la varianza de los errores no es constante en todo el rango de valores de las variables predictoras, lo que significa que puede afectar la validez de las inferencias del modelo.


Análisis de escala vs. ubicación de residuos
plot(modelo_vivienda1, which = 3)


Vemos que existe un patros similar a un embudo, la dispersión de puntos cambia a lo largo del rango de valores, podriamos decir que se confirma la heterocedasticidad.

Prueba de Durbin-Watson para autocorrelación
dwtest(modelo_vivienda1)
## 
##  Durbin-Watson test
## 
## data:  modelo_vivienda1
## DW = 1.7615, p-value = 0.005472
## alternative hypothesis: true autocorrelation is greater than 0

Estadístico de prueba DW (Durbin-Watson): 1.7615 Valor p: 0.005472 (menor que 0.05)

El resultado del test de Durbin-Watson (DW) sugiere la posibilidad de autocorrelación positiva en los residuos del modelo “modelo_vivienda1”. Aunque el valor de DW no indica fuertemente la presencia de autocorrelación, el valor p (0.005472) es significativo, lo que sugiere cierta correlación entre los errores.

Prueba de multicolinealidad (Factor de Inflación de la Varianza - VIF)
vif(modelo_vivienda1)
##    areaconst      estrato parqueaderos       banios habitaciones 
##     1.460998     1.307757     1.226334     1.967421     1.721015


Los valores de VIF están cerca de 1 para todas las variables predictoras, lo que indica que no hay una alta multicolinealidad entre estas variables en el modelo, se considera que un valor de VIF por debajo de 5 significa que no existe una multicolinealidad significativa, lo que es positivo para la estimación de los coeficientes de regresión y la interpretación del modelo.



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



Creamos el data.frame con los dos vectores de las condiciones de la compañia internacional

Vivienda_1 = 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_1, caption = "Datos para predicción de modelo_vivienda1.")
Datos para predicción de modelo_vivienda1.
areaconst estrato parqueaderos banios habitaciones
200 4 1 2 4
200 5 1 2 4


Corremos el modelo con la información consignada en el data.fram anteriormente creado.

predicciones_precio <- predict(modelo_vivienda1, newdata = Vivienda_1)


Valores obtenidos al correr el modelo

predicciones_precio
##        1        2 
## 312.1010 392.7359



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.



Creamos los parametros solicitados por la compañia internacional

parametros_vivienda1 <- which(base1_nueva$estrato>=4 & base1_nueva$areaconst>= 200 & base1_nueva$parqueaderos>=1 & base1_nueva$banios>=2 & base1_nueva$habitaciones>=4 & base1_nueva$estrato>=4 & base1_nueva$estrato<=5 & base1_nueva$preciom<=350 )


Realizamos la depuración de nuestra base de datos con los parametros que necesitamos

oferta_casas <- base1_nueva[parametros_vivienda1,]


Seleccionamos nuestros 5 registros y organizamos de forma descendente por area construida

oferta_casas_cinco = oferta_casas[order(oferta_casas$areaconst, decreasing = TRUE), ]

knitr::kable(head(oferta_casas_cinco, 5), caption = "5 Ofertas que cumple las caracterisiticas, discriminada por area construida en m2.")
5 Ofertas que cumple las caracterisiticas, discriminada por area construida en m2.
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 1 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 1 4 335 300 3 4 4 Casa el bosque -76.52600 3.43400

Definimos data con las 5 casas a mapear

cinco_casas <- head(oferta_casas_cinco, 5)


Creamos el mapa

mapa_casas_5 <- leaflet() %>%
  addTiles(urlTemplate = "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",
           attribution = '© <a href="https://openstreetmap.org/copyright">OpenStreetMap</a> contributors') %>%
  setView(lng = -76.51, lat = 3.43, zoom = 12) %>%
  addPolygons(data = datos_shapefile, 
              color = "green", 
              fillOpacity = 0.3)  


mapa_casas_5 <- mapa_casas_5 %>%
  addCircleMarkers(data = cinco_casas,
                   lng = ~longitud,
                   lat = ~latitud,
                   label = ~paste0("ID: ", id, " Estrato: ", estrato, " Precio:", preciom, "'000.000", " Pisos:", piso),
                   stroke = FALSE,
                   fillOpacity = 0.6,
                   radius = 6,
                   color = 'blue',
                   popup = ~paste0("ID: ", id, " Estrato: ", estrato, " Precio:", preciom, "'000.000", " Pisos:", piso))


mapa_casas_5

De las casas seleccionadas, la 4209, 1943 y 3101 cumplen con los criterios del cliente, la 5031 y la 3352 no cumplen dado que estan ubicadas por fuera de la zona norte

Analisis para la selección de Vivienda 2


Apartamento en el Sur de la ciudad, con 300 metros cuadrados construidos, con 3 parqueaderos, 3 baños, 5 habitaciones, estrato 5 o 6 y con un credito preaprobado de 850 millones.



1. Realice un filtro a la base de datos e incluya solo las ofertas de : base2: apartamento, 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?.



Dado nuestro problema inicial, crearemos la base de datos = base2 en donde estarán ubicadas las viviendas tipo Apartamento que están ubicadas en el Sur de la ciudad.

base2 <- filter(vivienda, zona == "Zona Sur" & tipo == "Apartamento")


knitr::kable (head(base2, 3), caption = "Primeros 3 registros de base2")
Primeros 3 registros de base2
id zona piso estrato preciom areaconst parqueaderos banios habitaciones tipo barrio longitud latitud
5098 Zona Sur 05 4 290 96 1 2 3 Apartamento acopi -76.53464 3.44987
698 Zona Sur 02 3 78 40 1 1 2 Apartamento aguablanca -76.50100 3.40000
8199 Zona Sur NA 6 875 194 2 5 3 Apartamento aguacatal -76.55700 3.45900


Vemos la información estadistica basica de base2


knitr::kable (summary(base2), caption = "Resumen estadistico base 2")
Resumen estadistico base 2
id zona piso estrato preciom areaconst parqueaderos banios habitaciones tipo barrio longitud latitud
Min. : 3 Length:2787 Length:2787 Min. :3.00 Min. : 75.0 Min. : 40.00 Min. : 1.000 Min. :0.000 Min. :0.000 Length:2787 Length:2787 Min. :-76.57 Min. :3.334
1st Qu.:2292 Class :character Class :character 1st Qu.:4.00 1st Qu.: 175.0 1st Qu.: 65.00 1st Qu.: 1.000 1st Qu.:2.000 1st Qu.:3.000 Class :character Class :character 1st Qu.:-76.54 1st Qu.:3.370
Median :4004 Mode :character Mode :character Median :5.00 Median : 245.0 Median : 85.00 Median : 1.000 Median :2.000 Median :3.000 Mode :character Mode :character Median :-76.53 Median :3.383
Mean :4131 NA NA Mean :4.63 Mean : 297.3 Mean : 97.47 Mean : 1.415 Mean :2.488 Mean :2.966 NA NA Mean :-76.53 Mean :3.390
3rd Qu.:5876 NA NA 3rd Qu.:5.00 3rd Qu.: 335.0 3rd Qu.:110.00 3rd Qu.: 2.000 3rd Qu.:3.000 3rd Qu.:3.000 NA NA 3rd Qu.:-76.52 3rd Qu.:3.406
Max. :8302 NA NA Max. :6.00 Max. :1750.0 Max. :932.00 Max. :10.000 Max. :8.000 Max. :6.000 NA NA Max. :-76.46 Max. :3.497
NA NA NA NA NA NA NA’s :406 NA NA NA NA NA NA


Sin novedades la base de datos base2



Creamos el mapa de la base2


mapa <- leaflet() %>%
  addTiles(urlTemplate = "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",
           attribution = '© <a href="https://openstreetmap.org/copyright">OpenStreetMap</a> contributors') %>%
  setView(lng = -76.51, lat = 3.43, zoom = 12) %>%
  addPolygons(data = datos_shapefile, 
              color = "red", 
              fillOpacity = 0.8)  


mapa <- mapa %>%
  addCircleMarkers(data = base2,
                   lng = ~longitud,
                   lat = ~latitud,
                   label = ~paste0("ID: ", id, " Estrato: ", estrato, " Precio:", preciom, "'000.000", " Pisos:", piso),
                   stroke = FALSE,
                   fillOpacity = 0.6,
                   radius = 3,
                   color = 'green',
                   popup = ~paste0("ID: ", id, " Estrato: ", estrato, " Precio:", preciom, "'000.000", " Pisos:", piso))


mapa


Zona Sur: 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.

Por tanto, según la descripción proporcionada por la alcaldía, así como la validación visual realizada, se ha identificado que existen varios puntos registrados como ‘Zona Sur’ que en realidad pertenecen a otras áreas de la ciudad. Estos errores posiblemente se deben a dificultades en el proceso de registro de la ubicación, ya que no se utiliza un sistema de georreferenciación automática, sino que la información se ingresa manualmente.



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



Dado que necesitamos crear un modelo para determinar la vivienda2 (Segunda vivienda solicitada por la compañia intercional), procedemos a imputar los datos nulos de la variable piso con un “1”, esto dado que el cliente no tuvo en cuenta el numero de piso en su solicitud pero el agente inmobiliario si podría utilizar el dato del piso para mostrar algún beneficio adicional que sirva para la negociación, ademas se eliminan los valores Nulos de las otras variables, y esto se hace dado que la Compañia Internacional interesada en la compra exige ciertas condiciones.

base2$piso <- ifelse(is.na(base2$piso), 1, base2$piso)
base2_nueva <- base2[complete.cases(base2), ]
head(base2_nueva)
## # A tibble: 6 × 13
##      id zona    piso  estrato preciom areaconst parqueaderos banios habitaciones
##   <dbl> <chr>   <chr>   <dbl>   <dbl>     <dbl>        <dbl>  <dbl>        <dbl>
## 1  5098 Zona S… 05          4     290        96            1      2            3
## 2   698 Zona S… 02          3      78        40            1      1            2
## 3  8199 Zona S… 1           6     875       194            2      5            3
## 4  6975 Zona S… 06          4     220        75            1      2            3
## 5  5615 Zona S… 08          3     210        72            2      2            3
## 6  7396 Zona S… 1           3     115        58            1      2            2
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>



Analisis exploratorio de datos

Analisis Piso

piso_data <- base2_nueva$piso


plot <- plot_ly(x = ~piso_data, type = "histogram", name = "Piso",marker = list(color = "green")) %>%
  layout(title = "Distribución de Pisos",
         xaxis = list(title = "Número de Pisos"),
         yaxis = list(title = "Frecuencia"),
         barmode = "overlay",  
         bargap = 0.1)  #

plot


Podemosobservar que la mayor cantidad de datos fue los que imputamos como “1”, es decir los que no tenían información, en cuanto a los que si tenían información el dato predominante es apartamentos en el 4to y 5to piso con 287 registros.


Analisis Precio Vivienda

preciom_data <- base2_nueva$preciom

intervalos <- seq(0, max(preciom_data) + 100, by = 100)


plot <- plot_ly() %>%
  add_histogram(x = ~preciom_data, name = "Preciom", marker = list(color = "green"), xbins = list(start = min(intervalos), end = max(intervalos), size = 100)) %>%
  layout(title = "Distribución de Precios de Viviendas",
         xaxis = list(title = "Precio (en millones de pesos)"),
         yaxis = list(title = "Frecuencia"),
         barmode = "overlay",  
         bargap = 0.1)
 
plot


La mayor cantidad de apartamentos se ubican en el rango de precio de 200-300 millones, en total 928 registros.


Analisis Estrato Vivienda

estrato_data <- base2_nueva$estrato


plot <- plot_ly(x = ~estrato_data, type = "histogram", name = "Estrato",,marker = list(color = "green")) %>%
  layout(title = "Distribución de Estratos de Viviendas",
         xaxis = list(title = "Estrato Socioeconómico"),
         yaxis = list(title = "Frecuencia"),
         barmode = "overlay", 
         bargap = 0.1)  


plot


Con 990 registros, el estrato 5 predomina en los apartamentos ubicados al su de la ciudad.


Analisis Banios

banios_data <- base2_nueva$banios


plot <- plot_ly(x = ~banios_data, type = "histogram", name = "Baños",marker = list(color = "green")) %>%
  layout(title = "Distribución de Número de Baños en Viviendas",
         xaxis = list(title = "Número de Baños"),
         yaxis = list(title = "Frecuencia"),
         barmode = "overlay",  
         bargap = 0.1)  


plot


La mayoria de apartamentos disponen de 2 baños.

Analisis Habitaciones

habitaciones_data <- base2_nueva$habitaciones


plot <- plot_ly(x = ~habitaciones_data, type = "histogram", name = "Habitaciones",marker = list(color = "green")) %>%
  layout(title = "Distribución del Número de Habitaciones en Viviendas",
         xaxis = list(title = "Número de Habitaciones"),
         yaxis = list(title = "Frecuencia"),
         barmode = "overlay",  
         bargap = 0.1)  
plot


Los apartamentos en su mayoria poseen 3 habitaciones, en total con 3 habitaciones se tienen 142 registros.

Analisis Parqueadero

parqueaderos_data <- base2_nueva$parqueaderos


plot <- plot_ly(x = ~parqueaderos_data, type = "histogram", name = "Parqueaderos",marker = list(color = "green")) %>%
  layout(title = "Distribución del Número de Parqueaderos en Viviendas",
         xaxis = list(title = "Número de Parqueaderos"),
         yaxis = list(title = "Frecuencia"),
         barmode = "overlay", 
         bargap = 0.1)  
plot


La mayoria de apartamentos tiene 1 parqueadero.



Metodo visual correlación de Pearson


subset_data <- base2_nueva[, c("estrato", "preciom", "areaconst", "parqueaderos", "banios", "habitaciones")]


correlation_matrix <- cor(subset_data, use = "complete.obs", method = "pearson")


ggcorrplot(correlation_matrix,
           hc.order = TRUE,  
           type = "upper",   
           ggtheme = ggplot2::theme_minimal())  


Vemos graficamente que existe gran relación positiva entre las variables. siendo la relación precio - areaconst la que mas relacion visual tiene



Matriz de Gráficos de Dispersión y Correlación
subset_data <- base2_nueva[, c("estrato", "preciom", "areaconst", "parqueaderos", "banios", "habitaciones")]


ggpairs(subset_data, title = "Gráficos de Dispersión y Correlación")



Podemos confirmar numéricamente que existe una sólida relación positiva entre las variables seleccionadas. Esto significa que cuando una variable aumenta, las demás tienden a aumentar en conjunto. Es interesante observar que la correlación más fuerte se encuentra entre ‘areaconst’ y ‘preciom’. Esto tiene sentido, ya que a medida que el tamaño de la construcción areaconst aumenta, el precio de la vivienda preciom tiende a aumentar, y viceversa. En otras palabras, cuanto más grande es la construcción, se espera que su precio sea más alto, lo que es una relación coherente y lógica en el contexto del mercado inmobiliario

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



Definimos nuestro modelo de regresión lineal múltiple
modelo_vivienda2 = lm(preciom ~ areaconst + estrato + parqueaderos + banios + habitaciones, data = base2_nueva)
summary(modelo_vivienda2)
## 
## Call:
## lm(formula = preciom ~ areaconst + estrato + parqueaderos + banios + 
##     habitaciones, data = base2_nueva)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1092.02   -42.28    -1.33    40.58   926.56 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -261.62501   15.63220 -16.736  < 2e-16 ***
## areaconst       1.28505    0.05403  23.785  < 2e-16 ***
## estrato        60.89709    3.08408  19.746  < 2e-16 ***
## parqueaderos   72.91468    3.95797  18.422  < 2e-16 ***
## banios         50.69675    3.39637  14.927  < 2e-16 ***
## habitaciones  -24.83693    3.89229  -6.381 2.11e-10 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 98.02 on 2375 degrees of freedom
## Multiple R-squared:  0.7485, Adjusted R-squared:  0.748 
## F-statistic:  1414 on 5 and 2375 DF,  p-value: < 2.2e-16


Cuando se analiza el modelo de regresión para estimar los precios de las casas, se observa que el coeficiente de determinación, R^2, es igual a 0.748, esto significa que aproximadamente el 74,8% de las variaciones en los precios de las casas pueden explicarse utilizando las variables que hemos incluido en el modelo, el modelo puede predecir cerca del 75% de las diferencias en los precios de los apartamentos.

Todas las variables del modelo son estadísticamente significativas, es decir que: el área construida, el estrato, el número de parqueaderos, el número de baños y el número de habitaciones, tienen un impacto importante y medible en el precio de los apartamentos.
Precio = -262.62501 + 1,28505 * (área construida) + 60.89709 * (estrato) + 72.91468 * (parqueaderos) + 50.69675 * (baños) -24.83693 * (habitaciones
La ecuación del modelo nos ayuda a comprender cómo estas variables influyen en los precios de los apartamentos, por ejemplo, un aumento de una unidad en el estrato se relaciona con un aumento de aproximadamente 60.90 unidades en el precio de la casa, manteniendo todas las demás variables constantes.

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



Análisis de residuales vs. ajustados


plot(modelo_vivienda2, which = 1)


Dado el grafico obtenido podríamos decir que existe un patrón de heterocedasticidad dado que a medida que se avanza a lo largo de la línea los datos se vuelven mas dispersos lo que puede insidar que la varianza de los errores no es constante.

Prueba de Shapiro-Wilk para normalidad de residuos
shapiro.test(modelo_vivienda2$residuals)
## 
##  Shapiro-Wilk normality test
## 
## data:  modelo_vivienda2$residuals
## W = 0.79118, p-value < 2.2e-16

Estadístico de prueba (W): 0.79118 Valor p: < 2.2e-16

El resultado del test de Shapiro-Wilk para la normalidad de los residuos del modelo “modelo_vivienda1” muestra un valor extremadamente bajo del estadístico W (0.79118) y un p-valor muy cercano a cero (p-value < 2.2e-16). Esto indica que los residuos no siguen una distribución normal, los residuos del modelo no se ajustan bien a una distribución gaussiana.

Esta falta de normalidad en los residuos podría tener implicaciones en la validez de las pruebas de hipótesis y estimaciones realizadas con el modelo.

Análisis de normalidad Q-Q de residuos


qqnorm(modelo_vivienda2$residuals)
qqline(modelo_vivienda2$residuals)


Según el grafico podemos decir que que falta normalidad dado que existe una desviación hacia arriba en los puntos.

Prueba de Breusch-Pagan para heterocedasticidad
bptest(modelo_vivienda2)
## 
##  studentized Breusch-Pagan test
## 
## data:  modelo_vivienda2
## BP = 754.81, df = 5, p-value < 2.2e-16

Estadístico de prueba BP (Breusch-Pagan): 754.81 Grados de libertad (df): 5 Valor p: 2.2e-16

El resultado del test de Breusch-Pagan (BP) indica que existe heterocedasticidad en los residuos del modelo “modelo_vivienda2”. El valor bajo del p-valor (2.2e-16) sugiere que al menos una de las variables explicativas en el modelo contribuye significativamente a la heterocedasticidad, es decir que la varianza de los errores no es constante en todo el rango de valores de las variables predictoras, lo que significa que puede afectar la validez de las inferencias del modelo.


Análisis de escala vs. ubicación de residuos
plot(modelo_vivienda2, which = 3)


Vemos que existe un patron similar a un embudo, la dispersión de puntos cambia a lo largo del rango de valores, podriamos decir que se confirma la heterocedasticidad.

Prueba de Durbin-Watson para autocorrelación
dwtest(modelo_vivienda2)
## 
##  Durbin-Watson test
## 
## data:  modelo_vivienda2
## DW = 1.5333, p-value < 2.2e-16
## alternative hypothesis: true autocorrelation is greater than 0

Estadístico de prueba DW (Durbin-Watson): 1.5333 Valor p: 2.2e-16 (menor que 0.05)

El resultado del test de Durbin-Watson (DW) sugiere la posibilidad de autocorrelación positiva en los residuos del modelo “modelo_vivienda2”. Aunque el valor de DW no indica fuertemente la presencia de autocorrelación, el valor p (2.2e-16) es significativo, lo que sugiere cierta correlación entre los errores.

Prueba de multicolinealidad (Factor de Inflación de la Varianza - VIF)
vif(modelo_vivienda2)
##    areaconst      estrato parqueaderos       banios habitaciones 
##     2.066518     1.545162     1.737878     2.529494     1.429280


Los valores de VIF están cerca de 1 para todas las variables predictoras, lo que indica que no hay una alta multicolinealidad entre estas variables en el modelo, se considera que un valor de VIF por debajo de 5 significa que no existe una multicolinealidad significativa, lo que es positivo para la estimación de los coeficientes de regresión y la interpretación del modelo.



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



Creamos el data.frame con los dos vectores de las condiciones de la compañia internacional

Vivienda_2 = data.frame( areaconst=c(300,300),                                                   parqueaderos=c(3,3),
                         estrato=c(5,6), 
                         banios=c(3,3),
                         habitaciones=c(5,5)
)

knitr::kable(Vivienda_2, caption = "Datos para predicción de modelo_vivienda2.")
Datos para predicción de modelo_vivienda2.
areaconst parqueaderos estrato banios habitaciones
300 3 5 3 5
300 3 6 3 5


Corremos el modelo con la información consignada en el data.frame anteriormente creado.

predicciones_precio_p <- predict(modelo_vivienda2, newdata = Vivienda_2)


Valores obtenidos al correr el modelo

predicciones_precio_p
##        1        2 
## 675.0247 735.9218



6. Con las predicciones del modelo sugiera potenciales ofertas que responda a la solicitud de la vivienda 2. Tenga encuentra que la empresa tiene crédito pre-aprobado de máximo 850 millones de pesos. Realice un análisis y presente en un mapa al menos 5 ofertas potenciales que debe discutir.



Creamos los parametros solicitados por la compañia internacional

parametros_vivienda2 <- which(base2_nueva$estrato>=5 & base2_nueva$areaconst>= 300 & base2_nueva$parqueaderos>=3 & base2_nueva$banios>=3 & base2_nueva$habitaciones>=5  & base2_nueva$preciom<=850 )


Realizamos la depuración de nuestra base de datos con los parametros que necesitamos

oferta_apartamentos <- base2_nueva[parametros_vivienda2,]


Seleccionamos nuestros 5 registros y organizamos de forma descendente por area construida

oferta_apartamentos_cinco = oferta_apartamentos[order(oferta_apartamentos$areaconst, decreasing = TRUE), ]

knitr::kable(head(oferta_apartamentos_cinco, 5), caption = "5 Ofertas que cumple las caracterisiticas, discriminada por area construida en m2.")
5 Ofertas que cumple las caracterisiticas, discriminada por area construida en m2.
id zona piso estrato preciom areaconst parqueaderos banios habitaciones tipo barrio longitud latitud
7182 Zona Sur 1 5 730 573 3 8 5 Apartamento guadalupe -76.548 3.408
7512 Zona Sur 1 5 670 300 3 5 6 Apartamento seminario -76.550 3.409


Solo dos apartamentos cumplen con las condiciones solicitadas por la compañia internacional.

Creamos el mapa

mapa_apartamentos_5 <- leaflet() %>%
  addTiles(urlTemplate = "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",
           attribution = '© <a href="https://openstreetmap.org/copyright">OpenStreetMap</a> contributors') %>%
  setView(lng = -76.51, lat = 3.38, zoom = 11.8) %>%
  addPolygons(data = datos_shapefile, 
              color = "green", 
              fillOpacity = 0.3)  


mapa_apartamentos_5 <- mapa_apartamentos_5 %>%
  addCircleMarkers(data = oferta_apartamentos_cinco,
                   lng = ~longitud,
                   lat = ~latitud,
                   label = ~paste0("ID: ", id, " Estrato: ", estrato, " Precio:", preciom, "'000.000", " Pisos:", piso),
                   stroke = FALSE,
                   fillOpacity = 0.6,
                   radius = 6,
                   color = 'blue',
                   popup = ~paste0("ID: ", id, " Estrato: ", estrato, " Precio:", preciom, "'000.000", " Pisos:", piso))


mapa_apartamentos_5

De los apartamentos que cumplen con las condiciones de la compañia internacional que son: 7182 y 7512 están ubicados por fuera de la Zona Sur, aunque dada la cercania con la Zona Sur y su precio 730 y 670 millones respectivamente, la Compañia C & A podría negociar para poder concretar el negocio