#importacion de librerias
library(devtools)
library(paqueteMODELOS)
library(ggplot2) # libreria graficas
library(naniar)
library(dplyr) #libreria manejo de datos
library(DescTools)
library(leaflet) #libreria para mapas
library(mice) #libreria para iimputcion metodo CARTS
library(tidyr)
library(plotly) #libreria para graficos Interactivos
library(pheatmap) # libreria para mapa de calor
library(car) #libreria de para multicolinealidad
library(lmtest)#libreria para test de breusch-pagan
library(grid)
library(gridExtra)

ANEXO 1. GENERALIDADES

1.1. DESCRIPCIÓN DEL TRABAJO

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:

knitr::include_graphics("CondicionesOfertas.PNG")

1.2. NECESIDADES DEL NEGOCIO

1.Realice un filtro a la base de datos e incluya solo las ofertas de: base1: casas, de la zona norte de laciudad. 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 zonacorrespondiente o se presentan valores en otras zonas, por que?).

2.Realice un análisis exploratorio de datos enfocado en la correlación entre la variable respuesta (precio dela casa) en función del área construida, estrato, numero de baños, numero de habitaciones y zona dondese ubica la vivienda. Use gráficos interactivos con el paquete plotly e interprete los resultados.

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

4.Realice la validación de supuestos del modelo e interprete los resultados (no es necesario corregir encaso de presentar problemas, solo realizar sugerencias de que se podría hacer).

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

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 unanálisis y presente en un mapa al menos 5 ofertas potenciales que debe discutir.

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

ANEXO 2. PREPARACION DE LA BASE DE DATOS

2.1. CARGA DE LA BASE DE DATOS

data("vivienda")

2.2. FILTRADO DE LA BASE DE DATOS

De acuerdo con las solicitudes de la compañia internacional se procede entonces a realizar el analisis de la data correspondiente a las condiciones establecidas.

base1 <- vivienda %>% 
  filter(
    zona == "Zona Norte" & 
    tipo == "Casa"
  )
base2<- vivienda %>% 
  filter(
    zona=="Zona Sur" &
    tipo=="Apartamento"
  )

Base 1

print(head(base1, n = 3), width = Inf) # resumen base 1 filtrada
## # A tibble: 3 × 13
##      id zona       piso  estrato preciom areaconst parqueaderos banios
##   <dbl> <chr>      <chr>   <dbl>   <dbl>     <dbl>        <dbl>  <dbl>
## 1  1209 Zona Norte 02          5     320       150            2      4
## 2  1592 Zona Norte 02          5     780       380            2      3
## 3  4057 Zona Norte 02          6     750       445           NA      7
##   habitaciones tipo  barrio longitud latitud
##          <dbl> <chr> <chr>     <dbl>   <dbl>
## 1            6 Casa  acopi     -76.5    3.48
## 2            3 Casa  acopi     -76.5    3.49
## 3            6 Casa  acopi     -76.5    3.39

Base 2

print(head(base2, n = 3), width = Inf) # resumen base 2 filtrada
## # A tibble: 3 × 13
##      id zona     piso  estrato preciom areaconst parqueaderos banios
##   <dbl> <chr>    <chr>   <dbl>   <dbl>     <dbl>        <dbl>  <dbl>
## 1  5098 Zona Sur 05          4     290        96            1      2
## 2   698 Zona Sur 02          3      78        40            1      1
## 3  8199 Zona Sur <NA>        6     875       194            2      5
##   habitaciones tipo        barrio     longitud latitud
##          <dbl> <chr>       <chr>         <dbl>   <dbl>
## 1            3 Apartamento acopi         -76.5    3.45
## 2            2 Apartamento aguablanca    -76.5    3.4 
## 3            3 Apartamento aguacatal     -76.6    3.46

Se procede a graficar las ubicaciones de las viviendas para cada data set en particular. Por temas de rendimiento se adjunta las imagenes correspondientes de cada los mapas graficados con el siguiente codigo:


# Crea un mapa
mapa1 <- leaflet(base1) %>%
  addTiles() %>%
  addMarkers(
    lng = ~longitud,
    lat = ~latitud,
    popup = ~paste(
      "<b>Zona:</b>", zona, "<br>",
      "<b>Tipo:</b>", tipo, "<br>",
      "<b>Longitud:</b>", longitud, "<br>",
      "<b>Latitud:</b>", latitud
    )
  )
mapa1   
knitr::include_graphics("MapaCasasNorte.png")

mapa2 <- leaflet(base2) %>%
  addTiles() %>%
  addMarkers(
    lng = ~longitud,
    lat = ~latitud,
    popup = ~paste(
      "<b>Zona:</b>", zona, "<br>",
      "<b>Tipo:</b>", tipo, "<br>",
      "<b>Longitud:</b>", longitud, "<br>",
      "<b>Latitud:</b>", latitud
    )
  )
mapa2 
knitr::include_graphics("MapaAptoSur.png")

De los anteriores mapas presentados, se puede observar que la variable zona está mal clasificada según los registros de longitud y latitud, esto hace referencia que existen casas ubicadas en la zona sur de la ciudad con etiqueta “zona Norte”, del mismo modo existen apartamentos ubicados en el norte de la ciudad con la etiqueta “zona Sur”.

Debido a lo anterior se procede a realizar una depuración de ambos datasets en cuanto a la zona, pues como se observo las viviendas estan mal referenciadas en la variable zona, lo que puede afectar el posterior análisis de regresión lineal.

Para lo anterior se definieron unos limites en el mapa de la ciudad de Cali para clasificar las zonas. A continuacion, se explica cuales fueron estos limites:

(Latitud,Longitud) zona norte de Cali:

3.4590760476259175, -76.53342515659959 (limite izquierdo del mapa) 3.4590760476259175, -76.47274743134287 (limite derecho del mapa)

lo que este por fuera de estos valores se debe elimnar en la base1

(Latitud,Longitud) zona sur de Cali:

3.4255342782809803, -76.5532565062156 (limite izquierdo) 3.4255342782809803, -76.50140794880839 (limite derecho)

lo que este por fuera de estos valores se debe elimnar en la base2

# Definir los límites para la zona norte de Cali
lat_norte_min <- 3.4590760476259175
long_norte_max <- -76.47274743134287
long_norte_min <- -76.53342515659959

# Definir los límites para la zona sur de Cali
lat_sur_max <- 3.4255342782809803
long_sur_max <- -76.50140794880839
long_sur_min <- -76.5532565062156

# Filtrar la base1 para la zona norte de Cali
base1 <- base1 %>%
  filter(
    latitud >= lat_norte_min &
    longitud >= long_norte_min &
    longitud <= long_norte_max
  )

# Filtrar la base2 para la zona sur de Cali
base2 <- base2 %>%
  filter(
    latitud <= lat_sur_max &
    longitud >= long_sur_min &
    longitud <= long_sur_max
  )

Ahora se grafica nuevamente la data filtrada. A continuación se muestra unicamente el codigo y la imagen resultante por temas de rendimiento.

# Crea un mapa
mapa3 <- leaflet(base1) %>%
  addTiles() %>%
  addMarkers(
    lng = ~longitud,
    lat = ~latitud,
    popup = ~paste(
      "<b>Zona:</b>", zona, "<br>",
      "<b>Tipo:</b>", tipo, "<br>",
      "<b>Longitud:</b>", longitud, "<br>",
      "<b>Latitud:</b>", latitud
    )
  )
mapa3
knitr::include_graphics("MapaCasasNorteFiltrado.png")

mapa4 <- leaflet(base2_filtrada) %>%
  addTiles() %>%
  addMarkers(
    lng = ~longitud,
    lat = ~latitud,
    popup = ~paste(
      "<b>Zona:</b>", zona, "<br>",
      "<b>Tipo:</b>", tipo, "<br>",
      "<b>Longitud:</b>", longitud, "<br>",
      "<b>Latitud:</b>", latitud
    )
  )
mapa4
knitr::include_graphics("MapaAptoSurFiltrado.png")

2.3. EXPLORACIÓN DE LOS DATOS

Se inicia con un análisis exploratorio y descriptivo de las bases de datos con la finalidad de identificar la cantidad de variables y tipo,asi como la cantidad de observaciones de cada dataset.

Caracterizacion base 1 (Casas zona norte).

# descripcion de la BD1
str(base1,give.attr = FALSE)
## spc_tbl_ [500 × 13] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
##  $ id          : num [1:500] 1209 1592 504 604 1003 ...
##  $ zona        : chr [1:500] "Zona Norte" "Zona Norte" "Zona Norte" "Zona Norte" ...
##  $ piso        : chr [1:500] "02" "02" NA NA ...
##  $ estrato     : num [1:500] 5 5 3 5 3 5 5 5 5 4 ...
##  $ preciom     : num [1:500] 320 780 180 520 380 395 460 390 780 420 ...
##  $ areaconst   : num [1:500] 150 380 120 455 300 165 319 357 380 265 ...
##  $ parqueaderos: num [1:500] 2 2 NA NA NA NA NA NA NA NA ...
##  $ banios      : num [1:500] 4 3 3 5 5 4 5 3 3 6 ...
##  $ habitaciones: num [1:500] 6 3 3 4 8 4 4 6 3 7 ...
##  $ tipo        : chr [1:500] "Casa" "Casa" "Casa" "Casa" ...
##  $ barrio      : chr [1:500] "acopi" "acopi" "acopi" "acopi" ...
##  $ longitud    : num [1:500] -76.5 -76.5 -76.5 -76.5 -76.5 ...
##  $ latitud     : num [1:500] 3.48 3.49 3.47 3.46 3.47 ...

Caracterizacion base 2 (apartamentos zona sur).

# descripcion de la BD2
str(base2,give.attr = FALSE)
## spc_tbl_ [2,367 × 13] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
##  $ id          : num [1:2367] 6975 7396 6949 7946 5534 ...
##  $ zona        : chr [1:2367] "Zona Sur" "Zona Sur" "Zona Sur" "Zona Sur" ...
##  $ piso        : chr [1:2367] "06" NA NA "10" ...
##  $ estrato     : num [1:2367] 4 3 4 3 4 4 4 4 4 4 ...
##  $ preciom     : num [1:2367] 220 115 220 230 175 155 121 165 260 226 ...
##  $ areaconst   : num [1:2367] 75 58 84 63 69 62 47 60 86 64 ...
##  $ parqueaderos: num [1:2367] 1 1 NA 1 1 1 NA NA 1 1 ...
##  $ banios      : num [1:2367] 2 2 2 2 2 2 1 2 2 2 ...
##  $ habitaciones: num [1:2367] 3 2 3 2 3 2 2 3 3 3 ...
##  $ tipo        : chr [1:2367] "Apartamento" "Apartamento" "Apartamento" "Apartamento" ...
##  $ barrio      : chr [1:2367] "alf√©rez real" "alf√©rez real" "alferez real" "alto jordán" ...
##  $ longitud    : num [1:2367] -76.5 -76.5 -76.5 -76.6 -76.5 ...
##  $ latitud     : num [1:2367] 3.39 3.39 3.39 3.37 3.42 ...

Del anterior análisis exploratorio y descriptivo (de ambas bases de datos ) se identifica lo siguiente:

-Se observa una variable que se descarta para el análisis la cual es ID, ya que solo funciona como identificador del predio y no aporta informacion relevante para el desarrollo del trabajo.

-La variable piso es de tipo texto cuando, debería ser numérica, en la limpieza de datos se debe identificar que registro está convirtiendo esta variable en tipo texto y eliminarlo.

Medidas de centralidad, posición y maximos y minimos base 1 variables numericas.

Se realiza el análisis solo teniendo en cuenta las variables precio,area,parqueaderos,banios y habitaciones ya que son las unicas variables numericas de la data.

summary(base1[,-c(1,2,3,4,10,11,12,13)]) 
##     preciom         areaconst       parqueaderos        banios     
##  Min.   : 110.0   Min.   :  30.0   Min.   : 1.000   Min.   :0.000  
##  1st Qu.: 230.0   1st Qu.: 130.0   1st Qu.: 1.000   1st Qu.:2.000  
##  Median : 360.0   Median : 225.0   Median : 2.000   Median :3.000  
##  Mean   : 402.1   Mean   : 244.4   Mean   : 2.203   Mean   :3.432  
##  3rd Qu.: 520.0   3rd Qu.: 319.2   3rd Qu.: 3.000   3rd Qu.:4.000  
##  Max.   :1650.0   Max.   :1440.0   Max.   :10.000   Max.   :9.000  
##                                    NA's   :170                     
##   habitaciones   
##  Min.   : 0.000  
##  1st Qu.: 3.000  
##  Median : 4.000  
##  Mean   : 4.524  
##  3rd Qu.: 5.000  
##  Max.   :10.000  
## 

Del anterior resumen se puede observar que:

-Los precios de las propiedades varían significativamente, con un promedio de 402.1, aunque el rango es amplio, desde 110 hasta 1650. La mediana es de 360, indicando que la mitad de las propiedades están por debajo de este valor y la otra mitad por encima.

-El área construida de las propiedades también muestra una amplia variabilidad. La mediana es de 225 m², y el promedio es de 244.4 m². Hay propiedades pequeñas (30 m²) y muy grandes (1440 m²), con un rango que se extiende significativamente hacia propiedades de gran tamaño.

-La mayoría de las propiedades tienen entre 1 y 2 parqueaderos, con un promedio de 2 parqueaderos. El máximo es de 10 parqueaderos, pero esto es una excepción.

-El número de baños en las propiedades varía desde 0 hasta 9. La mediana es de 3 baños, con un promedio de 3 baños, indicando que la mayoría de las propiedades tienen entre 2 y 4 baños.

-Por último, la mayoría de las propiedades tienen entre 3 y 5 habitaciones, con un promedio de aproximadamente 4 habitaciones. El número de habitaciones puede llegar hasta 10 en algunas propiedades.

Medidas de centralidad, posición y maximos y minimos base 2 variables numericas.

Se realiza el análisis solo teniendo en cuenta las variables precio,area,parqueaderos,banios y habitaciones ya que son las unicas variables numericas de la data.

summary(base2[,-c(1,2,3,4,10,11,12,13)]) 
##     preciom         areaconst       parqueaderos       banios     
##  Min.   :  83.0   Min.   : 40.00   Min.   : 1.00   Min.   :0.000  
##  1st Qu.: 175.0   1st Qu.: 65.00   1st Qu.: 1.00   1st Qu.:2.000  
##  Median : 245.0   Median : 85.00   Median : 1.00   Median :2.000  
##  Mean   : 298.1   Mean   : 97.25   Mean   : 1.41   Mean   :2.492  
##  3rd Qu.: 335.0   3rd Qu.:110.00   3rd Qu.: 2.00   3rd Qu.:3.000  
##  Max.   :1750.0   Max.   :932.00   Max.   :10.00   Max.   :8.000  
##                                    NA's   :331                    
##   habitaciones  
##  Min.   :0.000  
##  1st Qu.:3.000  
##  Median :3.000  
##  Mean   :2.958  
##  3rd Qu.:3.000  
##  Max.   :6.000  
## 

-Los precios de las propiedades varían considerablemente, con un promedio de 297.3. La mayoría de las propiedades tienen precios entre 175 y 335, pero también hay algunas propiedades con precios muy altos, llegando hasta 1750.

-El área construida de las propiedades también muestra una amplia variabilidad. La mediana es de 85 m² y el promedio es de 97.47 m², con algunas propiedades alcanzando hasta 932 m².

-La mayoría de las propiedades tienen entre 1 y 2 parqueaderos. El promedio es 1.415, y algunas propiedades cuentan con hasta 10 parqueaderos, aunque estos casos son excepcionales.

-La mayoría de las propiedades tienen entre 2 y 3 baños, con un promedio de 2.488. El número de baños puede llegar hasta 8 en algunas propiedades.

-La mayoría de las propiedades tienen entre 3 y 4 habitaciones, con un promedio ligeramente inferior a 3. El número de habitaciones puede variar de 0 a 6, siendo 3 el valor más común.

Posteriormente se procede a identificar si hay faltantes en la base de datos.

# Obtiene el numero de datos faltantes por campo

faltantesb1 <- colSums(is.na(base1)) %>% as.data.frame() # suma los campos faltantes por cada columna del df
faltantesb2 <- colSums(is.na(base2)) %>% as.data.frame() # suma los campos faltantes por cada columna del df

faltantes<-cbind(faltantesb1,faltantesb2)
colnames(faltantes)<- c("B1","B2")
g1 <- plot_ly(data = faltantes) %>%
  add_trace(x = ~row.names(faltantes), y = ~faltantes$B1, type = 'bar', name = 'Casas norte') %>%
  add_trace(x = ~row.names(faltantes), y = ~faltantes$B2, type = 'bar', name = 'Aptos sur')%>%
  layout(
    title = "Faltantes por atributos",  # Título del gráfico
    xaxis = list(title = "Variables"),  # Nombre del eje X
    yaxis = list(title = "Frecuencia")  # Nombre del eje Y
)
# Mostrar gráfico
g1

De los anteriores resultados se identifica lo siguiente:

-La variable piso y parqueaderos son las variables con mayor cantidad de datos faltantes, se les debe dar un tratamiento, pues representan un alto porcentaje de la data para ambas bases de datos.

-se puede observar que la base de datos correspondiente a los apartamentos de la zona sur presenta mayor cantidad de faltantes que la base de datos asociada a las casas de la zona norte, esto se puede explicar por la cantidad de registros que poseen ambas bases de datos.

2.4. LIMPIEZA DE DATOS

para iniciar la limpieza, se procede a identificar si existe un valor atípico o mal tipificado en la variable piso que convierta la variable a tipo texto en ambas bases de datos.

Variable piso Base 1.

# tabla de frecuencias variable piso
table(base1$piso)
## 
##  01  02  03  04 
##  69 156  52   4

Variable piso Base 2.

table(base2$piso)
## 
##  01  02  03  04  05  06  07  08  09  10  11  12 
## 202 268 283 281 320 115 100 105  64  58  21  29

De las anteriores tablas de frecuencia se puede observar que:

-R está reconociendo los pisos como variable texto, por lo tanto, se procede a realizar el cambio a tipo numérico.

#convertir la variable piso a numero
base1$piso<-as.numeric(base1$piso)
base2$piso<-as.numeric(base2$piso)

Posteriormente, se revisa que el cambio haya sido exitoso para ambos datasets.

Variable piso Base 1.

mode(base1$piso)
## [1] "numeric"

Variable piso Base 2.

mode(base2$piso)
## [1] "numeric"

Luego, se procede a eliminar la variable barrio de ambos datasets por las siguientes razones:

-No contiene informacion valiosa y necesaria para el análisis.

-Esta variable es de tipo string o chart, lo que dificulta su limpieza y operatividad por la cantidad de clases que tiene la variable.

# Eliminar la variable barrio
base1<-base1[,-11]
base2<-base2[,-11]

Despues, se realiza el resumen estadistico de las variables piso y parqueadero para cada dataset correspondiente, con la finalidad de comparar los cambios en la data en cuanto a dispersión y centralidad despues la imputación de dichas variables mediante el metodo CARTS (Classification and Regression Trees).

g2345 <- subplot(g2, g3, g4, g5, nrows = 2, shareX = FALSE, titleX = TRUE, shareY = FALSE, titleY = TRUE) %>%
  layout(
    title = "Comparación de Gráficas",
    margin = list(l = 60, r = 60, b = 60, t = 60)
  )

# Mostrar gráficos combinados
g2345

De la anterior grafica se puede interpretar que:

-Ambas categorías (B1 y B2) muestran variabilidad en todas las variables, con algunos valores atípicos.

-Las distribuciones en general son similares entre B1 y B2, pero con algunas diferencias notables en la dispersión y en los valores extremos, especialmente en variables como el Área y el Precio.

-Las medias (puntos rojos) generalmente están cerca de las medianas, pero en algunos casos se observan diferencias que indican asimetría.

# Calcular resúmenen antes de la imputación
summary1_base1_piso <- summary(base1$piso)
summary1_base1_parqueaderos <- summary(base1$parqueaderos)
summary1_base2_piso <- summary(base2$piso)
summary1_base2_parqueaderos <- summary(base2$parqueaderos)
# Calcular resumen despues de la imputación
summary2_base1_piso <- summary(base1$piso)
summary2_base1_parqueaderos <- summary(base1$parqueaderos)
summary2_base2_piso <- summary(base2$piso)
summary2_base2_parqueaderos <- summary(base2$parqueaderos)

Posterior a la imputación, se revisan nuevamente los faltantes, con la finalidad de verificar que la imputación por el metodo CARTS fue exitosa.

# Obtiene el numero de datos faltantes por campo
faltantesb1 <- colSums(is.na(base1)) %>% as.data.frame() # suma los campos faltantes por cada columna del df
faltantesb2 <- colSums(is.na(base2)) %>% as.data.frame() # suma los campos faltantes por cada columna del df
faltantes<-cbind(faltantesb1,faltantesb2)
colnames(faltantes)<- c("B1","B2")
faltantes
##              B1 B2
## id            0  0
## zona          0  0
## piso          0  0
## estrato       0  0
## preciom       0  0
## areaconst     0  0
## parqueaderos  0  0
## banios        0  0
## habitaciones  0  0
## tipo          0  0
## longitud      0  0
## latitud       0  0

Como se logra evidenciar ya no existen datos faltantes en ambas bases de datos, ahora se procede a analizar que tanto cambio el comportamiento de estas dos variables en cuanto a dispersion y centralidad despues de la imputación.

Datos antes de la imputación

resumen_summary1
##       Variable   Base Min Q1 Median     Mean Q3 Max
## 1         Piso Base 1   1  2      2 1.967972  2   4
## 2         Piso Base 2   1  2      4 4.483207  6  12
## 3 Parqueaderos Base 1   1  1      2 2.203030  3  10
## 4 Parqueaderos Base 2   1  1      1 1.410118  2  10

Datos despues de la imputación

resumen_summary2
##       Variable   Base Min Q1 Median     Mean Q3 Max
## 1         Piso Base 1   1  2      2 1.996000  2   4
## 2         Piso Base 2   1  3      4 4.511618  6  12
## 3 Parqueaderos Base 1   1  1      2 1.998000  2  10
## 4 Parqueaderos Base 2   1  1      1 1.363329  2  10

Como se puede observar en las anteriores tablas, la mediana no se afecto despues de la imputación. Sin embargo, se nota un leve incremento en los promedios de la variable piso y una disminucion en los promedios de la variable parqueaderos.

Ahora se procede a realizar un analisis de correlacion entre las variables de entrada y salida de cada dataset, con la finalidad de observar las relaciones entre variables de entrada y como aportan estas a la variable de salida.

#correlacion entre variables de entrada
base1T<-base1 #Back UP de Base1 para realizar el punto 6
base2T<-base2#Back UP de Base1 para realizar el punto 6
#correlacion entre variables de entrada
base1<-base1[,-c(1,2,3,10,11,12)] #eliminacion de variables de la base 1
base1$estrato<-as.numeric(base1$estrato) #Convertir la variable estrato a tipo numero
base2<-base2[,-c(1,2,3,10,11,12)] #eliminacion de variables de la base 2
base2$estrato<-as.numeric(base2$estrato) # transformar variable estrato a tipo numero.
corb1e<-cor(base1[,-2],method="spearman") #calculo de la correlacion variables de entrada elimando la variable precio

Correlación Variables de entrada base 1

# Crear el mapa de calor con pheatmap
g6<-pheatmap(corb1e, 
         main = "Correlación variables de entrada (Spearman) base 1", 
         color = colorRampPalette(c("blue", "white", "red"))(100), # Más colores para una transición suave
         fontsize = 12, # Ajustar tamaño de fuente
         display_numbers = TRUE, # Mostrar los valores de correlación
         number_color = "black", # Color de los números de correlación
         border_color = NA, # Sin borde para celdas
         cellwidth = 40, cellheight = 40, # Ajustar el tamaño de las celdas
         cluster_rows = FALSE, cluster_cols = FALSE) # Agrupar filas y columnas por similitud

corb2e<-cor(base2[,-2],method="spearman") # crear matriz de correlacion exluyendo el precio

Correlación entre variables de entrada base 2

# Crear el mapa de calor con pheatmap
g7<-pheatmap(corb2e, 
         main = "Correlación variables de entrada (Spearman) base 2", 
         color = colorRampPalette(c("blue", "white", "red"))(100), # Más colores para una transición suave
         fontsize = 12, # Ajustar tamaño de fuente
         display_numbers = TRUE, # Mostrar los valores de correlación
         number_color = "black", # Color de los números de correlación
         border_color = NA, # Sin borde para celdas
         cellwidth = 40, cellheight = 40, # Ajustar el tamaño de las celdas
         cluster_rows = FALSE, cluster_cols = FALSE) # Agrupar filas y columnas por similitud

De los mapas de correlación entre las variables de entrada se puede determinar que:

-En ninguno de los dos mapas las correlaciones entre variables superan el 85%, lo que indica que no existe una fuerte relación lineal entre cada par de variables.

-Todas las correlaciones de ambas bases de datos son positivas, lo que indica una relación directamente proporcional, es decir en la que aumenta una de las variables las otras podrian aumentar.

-En general las correlaciones de la base 2 (Apartamentos zona sur) son mayores que las correlaciones de la base 1 (Casas zona norte). Esto puede explicarse en parte por la cantidad de datos.

-Las correlaciones mas fuertes en ambas graficas son:

Base 1:

-Estrato y area consturida (61%)

-Area construida y baños (59%)

-banios y habitaciones (59%)

-Area construida y parqueaderos (55%)

Base 2:

-Area construida y baños (75%)

-Area construida y parqueaderos (66%)

-Area construida y estrato (64%)

Ahora se realiza el mismo análisis para las variables de salida de cada base de datos.

# Calcular la correlación de Spearman entre la variable de salida y las variables de entrada
corb1s <- sapply(base1, function(x) cor(base1$preciom, x, method = "spearman"))# calculo de la correlacion variables de salida
corb1s<-sort(corb1s,decreasing=TRUE) # Organizar el vector de manera descendente
corb1s<-as.matrix(corb1s) #Transformar el vector a matriz
colnames(corb1s)<-"Preciom"#Poner nombre a la columna de la matriz
# Calcular la correlación de Spearman entre la variable de salida y las variables de entrada
corb2s<- sapply(base2, function(x) cor(base2$preciom, x, method = "spearman")) # calculo de la correlacion variables de salida
corb2s<-sort(corb2s,decreasing=TRUE) #Organizar el vector de manera descendente
corb2s<-as.matrix(corb2s)# transformar el vector a matriz
colnames(corb2s)<-"Preciom" #Poner nombre a la columna de la matriz

Correlacion entre Variables de entrada y variable de salida base 1

Correlacion entre Variables de entrada y variable de salida base 1

# Unificar las gráficas g8 y g9 con un título general
g10 <- grid.arrange(
  g8$gtable, 
  g9$gtable, 
  ncol = 2, 
  top = textGrob("Correlacion entre variables de entrada y variable de salida (Spearman)", 
                 gp = gpar(fontsize = 14, fontface = "bold")) # Ajusta el texto, tamaño y estilo del título
)

Del la anterior grafica se puede interpretar que:

-El orden de las variables que más aportan a la variable de salida en ambas bases de datos se conserva, a excepción de baños y parqueaderos la cual se invierte en base 2. -Las valores de la correlacion en ambas bases de datos son similares -Las variables que más aportan o explican la variabilidad son area construida y el estrato.

Nota: La variable estrato es una variable categorica ordinal, la cual debe ser trata como factor, sin embargo, el la libreria y el metodo de spearman solo acepta que las variables sean con datos nuemericos.

Por otra parte, tiene sentido la alta correlacion de la variable estrato con la variable precio, por logica se entiende que entre mas alto el estrato más alto sera el precio de la vivienda.

ANEXO 3. ESTIMACIÓN DEL MODELO Y VALIDACIÓN DE SUPUESTOS

Para estimar los modelos de regresion lineal multivariada, se realiza una seleccion aleatoria de registros de cada base para definir los sets de entrenamientos de los modelos y se estiman cada uno de ellos.

3.1. DEFINICIÓN DEL SET DE ENTRENAMIENTO Y PRUEBA

Para efectos de la estimación de los modelos se utilizara un 70% de las base de datos para entranamiento y el 30% restante para prueba. A continuación se muestra el código utilizado.

# Define el porcentaje para el conjunto de entrenamiento
train_ratio <- 0.7 
# Calcula el número total de filas en el dataset
total_rowsb1 <- nrow(base1)

# Calcula el número de filas para el entrenamiento
train_sizeb1 <- floor(train_ratio * total_rowsb1)

# Genera una muestra aleatoria de índices para el conjunto de entrenamiento
set.seed(123)  # Establece una semilla para reproducibilidad
train_indicesb1 <- sample(1:total_rowsb1, train_sizeb1)# Ge

# Divide los datos en conjunto de entrenamiento y prueba usando los índices
train_setb1 <- base1[train_indicesb1, ]          # Conjunto de entrenamiento
test_setb1 <- base1[-train_indicesb1, ]          # Conjunto de prueba
# Calcula el número total de filas en el dataset
total_rowsb2 <- nrow(base2)

# Calcula el número de filas para el entrenamiento
train_sizeb2 <- floor(train_ratio * total_rowsb2)


set.seed(123)  # Establece una semilla para reproducibilidad
train_indicesb2 <- sample(1:total_rowsb2, train_sizeb2)# Genera una muestra aleatoria de índices para el conjunto de entrenamiento

# Divide los datos en conjunto de entrenamiento y prueba usando los índices
train_setb2 <- base2[train_indicesb2, ]          # Conjunto de entrenamiento
test_setb2 <- base2[-train_indicesb2, ]          # Conjunto de prueba

3.2. ESTIMACIÓN Y SUPUESTOS DEL MODELO 1 (CASAS ZONA NORTE)

3.2.1. MODELO 1

## 
## Call:
## lm(formula = preciom ~ areaconst + estrato + parqueaderos + banios + 
##     habitaciones, data = train_setb1)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -638.79  -55.02  -11.13   31.30  786.75 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -173.05362   35.27649  -4.906 1.44e-06 ***
## areaconst       0.79468    0.06238  12.739  < 2e-16 ***
## estrato        61.57600    9.04435   6.808 4.41e-11 ***
## parqueaderos   23.66055    5.25173   4.505 9.09e-06 ***
## banios          6.53614    6.62912   0.986   0.3248    
## habitaciones   12.66959    5.05795   2.505   0.0127 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 121.4 on 344 degrees of freedom
## Multiple R-squared:  0.7054, Adjusted R-squared:  0.7012 
## F-statistic: 164.8 on 5 and 344 DF,  p-value: < 2.2e-16

De los anteriores resultadados se puede concluir lo siguiente:

-El R^2 indica que el modelo de la base 1 puede explicar el 70,12% de la variabilidad con las variables establecidas.

-El intercepto si bien es un valor negativo y bastante alto, e incluso puede no llegar a tener sentido cuando las demas variables toman el valor de 0, se puede tomar como un parametro de ajuste de la prediccion del precio.

-El area construida tiene una alta significacia (p < 2e-16). Sin embargo, su coeficiente es pequeño debido al rango en la que se representa esta variable, por ejemplo, pueden existir casas de 1000 m2 y el aporte a la variable precio sera de 700 puntos.

-El estrato tambien es catalogada como una variable significativa dentro del modelo, pues aporta aproximadamente 61,58 puntos al precio por cada nivel de estrato. Lo que significa que una vivienda con similares caracteristicas puede variar su precio solo por el cambio de estrato.

-El numero de parqueaderos es otra variable de peso para el modelo pues aumenta el precio en 23.66 puntos por cada parqueadero adicional.

-Las habitaciones y los baños son las variables menos significativas en la estimacion del precio, sus coeficientes son bajos en comparación a las otras variables, lo que puede indicar que variaciones de estas variables no afecte en gran medida el precio de una vivienda.

3.2.2. SUPUESTOS MODELO 1

par(mfrow=c(2,2))
plot(modelo1)

1. Residuals vs Fitted

Se espera que los residuos se distribuyan aleatoriamente alrededor de la línea horizontal (en torno a cero), sin patrones claros.

En la gráfica, parece haber una ligera tendencia o patrón en los residuos, lo que podría indicar que el modelo no captura completamente la relación lineal entre las variables.

2. Q-Q Plot de Residuos

Con el Q-Q plot se observa la Normalidad de los errores La mayoría de los puntos se alinean con la línea diagonal, pero hay desviaciones en los extremos que no se ajustan. Esto podría indicar que los residuos no son completamente normales, pero no parece una desviación grave.

  1. Scale-Location (Spread-Location)

Con esta grafica se puede interpretar la homocedasticidad, Se identifica que hay una ligera tendencia ascendente, lo que sugiere que la variabilidad de los residuos aumenta con los valores ajustados y que el modelo no representa bien la variabilidad de los datos y podría beneficiarse de una transformación de variables.Esto indicaría una posible heterocedasticidad.

  1. Residuals vs Leverage y Cook’s Distance

Observación: Existen puntos como 85, 326, y 389 que tienen un leverage alto y residuos grandes. En el gráfico de Cook’s Distance, estos puntos están cerca o exceden los límites de influencia los cuales pueden ser considerados como puntos influyentes que tienen un gran efecto en el ajuste del modelo.

El modelo presenta ciertos problemas que sugieren que los residuos no cumplen completamente con las suposiciones de normalidad, homocedasticidad, y ausencia de influencia excesiva de algunos puntos. Es recomendable revisar las variables involucradas y considerar ajustes o transformaciones para mejorar el modelo.

Para complementar la validacion de supuestos del modelo 1 se revisaran los siguientes criterios:

  1. Los errores son una variable aleatoria con media 0
# Crear un histograma de los residuos del modelo
histograma <- plot_ly(
  x = ~modelo1$residuals, # Especificar los datos en el eje x
  type = "histogram" # Tipo de gráfico
) %>% 
  layout(
    title = "Histograma de Residuos del Modelo 2",
    xaxis = list(title = "Residuos"),  
    yaxis = list(title = "Frecuencia") 
  )

# Mostrar el histograma
histograma

De la anterior grafica se puede observar que los erroes presentan un sesgo hacia la izquierda lo que sugiere que los errores no tienen una media 0.

  1. Los errores son una variable aleatoria con varianza constante

Se realiza el test de Breusch-Pagann para validar si los errores tienen varianza constante.

Ho : V[εi] = σ^2

H1 : V[εi] ≠ σ^2

lmtest::bptest(modelo1) # test varianza contaste
## 
##  studentized Breusch-Pagan test
## 
## data:  modelo1
## BP = 102.33, df = 5, p-value < 2.2e-16

Los resultados indican que los errores no tienen varianza constante ya que p-valor<=0.05 por lo tanto se rechaza H0 y se concluye que este supuesto no se cumple.

  1. Los errores son independientes entre si.

Se realiza el test de Durbin-Watson para determinar si existe correlacion entre los errores.

Ho : E[εi , εj] = 0

Ho : E[εi , εj] ≠ 0

lmtest::dwtest(modelo1) #test para independencia de los errores
## 
##  Durbin-Watson test
## 
## data:  modelo1
## DW = 2.2286, p-value = 0.9846
## alternative hypothesis: true autocorrelation is greater than 0

Los resultados (p-valor >0.05) indican que los errores estan correlacionados. Por lo tanto este supuesto no se cumple.

  1. Los errores siguen una distribucion normal

se realiza las pruebas de normalidad de los errores mediante la prueba de shapiro.

H0 : ε ∼ Normal

H1 : ε no∼ Normal

shapiro.test(modelo1$residuals)# test de normalidad de los errores
## 
##  Shapiro-Wilk normality test
## 
## data:  modelo1$residuals
## W = 0.86457, p-value < 2.2e-16

Los resultados indican que los errores no se distribuyen normal ya que p-valor<=0.05, por lo tanto se rechaza H0 y se concluye que no se cumple este supuesto de normalidad.

  1. Existe una baja multicolinealidad entre las variables de entrada.

Para ello se calcula la metrica VIF sobre el modelo estimado. A continuación se presenta su resultado.

vif(modelo1)# Metrica VIF para multicolinealidad
##    areaconst      estrato parqueaderos       banios habitaciones 
##     1.903761     1.654788     1.339942     2.249220     1.820604

Interpretación del VIFe

  • VIF = 1: No hay correlación entre la variable independiente y cualquier otra variable.

  • 1 < VIF < 5: Correlación moderada, pero generalmente aceptable.

  • VIF > 5: Posible multicolinealidad.

  • VIF > 10: Alta multicolinealidad que puede ser problemático para la interpretación del modelo.

Se puede observar que todas las variables VIF estan entre 1 y 5 lo que indica una correlacion moderada, lo que anteriormente se pudo observar mediante las matrices de correlacion entre variables individuales.

3.3. ESTIMACIÓN Y SUPUESTOS DEL MODELO 2 (APARTAMENTOS ZONA SUR)

3.3.1. MODELO 2

modelo2<-lm(preciom~areaconst+estrato+banios+parqueaderos+habitaciones,data=train_setb2)#estimacion del modelo lineal multivariado
summary(modelo2) # resumen del modelo lineal multivariado
## 
## Call:
## lm(formula = preciom ~ areaconst + estrato + banios + parqueaderos + 
##     habitaciones, data = train_setb2)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1098.93   -38.28    -1.69    37.80   906.44 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -253.82463   16.80533  -15.10  < 2e-16 ***
## areaconst       1.30909    0.06164   21.24  < 2e-16 ***
## estrato        54.39408    3.52822   15.42  < 2e-16 ***
## banios         45.33758    3.95461   11.46  < 2e-16 ***
## parqueaderos   93.16859    5.28257   17.64  < 2e-16 ***
## habitaciones  -23.15696    4.29631   -5.39 8.07e-08 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 93.14 on 1650 degrees of freedom
## Multiple R-squared:  0.7828, Adjusted R-squared:  0.7821 
## F-statistic:  1189 on 5 and 1650 DF,  p-value: < 2.2e-16

De los anteriores resultadados se puede concluir lo siguiente:

-El R^2 indica que el modelo de la base 1 puede explicar el 78,21% de la variabilidad con las variables establecidas.

-El intercepto si bien es un valor negativo y bastante alto, e incluso puede no llegar a tener sentido cuando las demas variables toman el valor de 0, se puede tomar como un parametro de ajuste de la prediccion del precio.

-En base 2 se identifica que los apartamentos se valorizan más en la medida en el que aumenta el área construida. dado que el coeficiente de dicha variable es casi el doble que el de base 2.

-La variable estrato tiene un coeficiente de 54. con relación a base 1 (61,57), lo que significa que el estrato en base 2 no valoriza tanto las viviendas.

-El numero de parqueaderos es otra variable de peso para el modelo pues aumenta el precio en 93.16 puntos por cada parqueadero adicional.

-Para habitaciones se identifica un coeficiente de -23.15, el cual se puede significar que mientras más habitaciones tenga una vivienda, más disminuye su precio. Este dato puede significar que mientras menos habitaciones tenga la vivienda, más se valoriza. otra razón de este valor negativo puede deberse a que posiblemente el modelo no cumple los supuestos. Esta variable tiene una alta significancia (2e-16)

-La variable Baños y parqueaderos tiene un coeficiente significativamente alto con relación a la base de datos 1. Posiblemente se deba a que como la variable habitaciones dio negativo, estas variables el modelo las tomó como un ajuste a dicho valor negativo., con el fin de ajustar los resultados del mismo

-Las 5 variables tiene una alta significancia con el modelo, dado que el p-value <= 0.05

3.3.2. SUPUESTOS MODELO 2

par(mfrow=c(2,2))
plot(modelo2)

-Variabilidad de los errores (Residuals vs Fitted): se identifica que los residuos no siguen un patrón claro de curvatura, lo cual sugiere que la linealidad se cumple razonablemente. Sin embargo, hay una ligera dispersión, especialmente en los valores extremos de los datos.

-Normalidad de los errores (Q-Q): la mayoría de los puntos se alinean a lo largo de la línea diagonal, lo que sugiere que los residuos son aproximadamente normales. Sin embargo, hay algunas desviaciones en los extremos de la gráfica, lo cual indica que hay ligeras desviaciones de la normalidad en las colas, lo cual se conversa con lo analizado en variabilidad de los errores.

-Homocedasticidad (Scale-Location): Se identifica un aumento en la dispersión de valores de residuos estandarizados, conforme aumentan los valores ajustados, lo que confirma que existe una heterocedasticidad. Por lo tanto, este supuesto no se cumple completamente.

-Puntos influyentes (Residuals vs Leverage) muestra algunos puntos cerca de las líneas de la distancia de Cook (2026 y 757), lo que indica que hay algunas observaciones potencialmente influyentes.

Para la validacion de supuestos se revisaran los siguientes criterios:

  1. Los errores son una variable aleatoria con media 0
# Crear un histograma de los residuos del modelo
histograma <- plot_ly(
  x = ~modelo2$residuals, # Especificar los datos en el eje x
  type = "histogram" # Tipo de gráfico
) %>% 
  layout(
    title = "Histograma de Residuos del Modelo 2",
    xaxis = list(title = "Residuos"),  
    yaxis = list(title = "Frecuencia") 
  )

# Mostrar el histograma
histograma

De la anterior grafica se puede observar que los erroes presentan un sesgo hacia la izquierda lo que sugiere que los errores no tienen una media 0.

  1. Los errores son una variable aleatoria con varianza constante

Se realiza el test de Breusch-Pagann para validar si los errores tienen varianza constante.

Ho : V[εi] = σ^2

H1 : V[εi] ≠ σ^2

lmtest::bptest(modelo2) # test varianza de los errores constantes
## 
##  studentized Breusch-Pagan test
## 
## data:  modelo2
## BP = 584.11, df = 5, p-value < 2.2e-16

Los resultados indican que los errores no tienen varianza constante ya que p-valor<=0.05 por lo tanto se rechaza H0. Por lo tanto, este supuesto no se cumple.

  1. Los errores son independientes entre si.

Se realiza el test de Durbin-Watson para determinar si existe correlacion entre los errores.

Ho : E[εi , εj] = 0

Ho : E[εi , εj] ≠ 0

lmtest::dwtest(modelo2) #test para independencia de los errores
## 
##  Durbin-Watson test
## 
## data:  modelo2
## DW = 1.9953, p-value = 0.4629
## alternative hypothesis: true autocorrelation is greater than 0

Los resultados (p-valor >0.05) indican que los errores estan correlacionados. Por lo tanto este supuesto no se cumple.

  1. Los errores siguen una distribucion normal

se realiza las pruebas de normalidad de los errores

H0 : ε ∼ Normal

H1 : ε no∼ Normal

shapiro.test(modelo2$residuals)# test de normalidad de los errores
## 
##  Shapiro-Wilk normality test
## 
## data:  modelo2$residuals
## W = 0.75684, p-value < 2.2e-16

Los resultados indican que los errores no se distribuyen normal ya que p-valor<=0.05 por lo tanto se rechaza H0. Por lo tanto no se cumple este supuesto.

  1. Existe una baja multicolinealidad entre las variables de entrada.

Para ello se calcula la metrica VIF sobre el modelo estimado. A continuación se presenta su resultado.

vif(modelo2)# Metrica VIF para multicolinealidad
##    areaconst      estrato       banios parqueaderos habitaciones 
##     2.146130     1.673031     2.638929     2.085755     1.394964

Se puede observar que todas las variables VIF estan entre 1 y 5 lo que indica una correlacion moderada, lo que anteriormente se pudo observar mediante las matrices de correlacion entre variables individuales.

3.4. CONCLUSIONES GENERALES SOBRE LOS SUPUESTOS DEL MODELO Y RECOMENDACIONES PARA MEJORAR EL RENDIMIENTO DEL MODELO.

De los anteriores resultados se puede conluir que ambos modelos no son modelos totalmente lineales, esto debido a su coeficiente de determinacion que no es lo suficientemente alto para explicar la variabilidad de los modelos. Adicional, ninguno de los supuesto de linealidad se cumplen para ambos modelos.

Por otra parte, se presentan algunas observaciones con datos atipicos que generan ruido en el modelo y pueden llevar a sesgar los resultados. Se recomienda mejorar la calidad de la data, ya que la bases de datos presentarón muchas inconsistencias en cuanto las diferentes variables.

Por otro lado, si la Empresa considera indispensable que se modele por medio de Regresión Lineal Múltiple, es importante que los dos modelos se ajusten, por medio de algún tipo de transformación, para analizar si se cumplen los supuestos de regresión lineal múltiple, con el fin de identificar si el modelo se ajusta más para explicar la variabilidad de lo datos y obtener un mejor rendimiento.

Como recomendación final y considerando la mejor de todas, se sugiere tratar de predicir el precio de los inmuebles mediante otras metologías de clasificación que modelen con mayor precision y exactitud datos que tengan otro tipo de relacion no lineal o que no sea tan sensbile a datos atipicos. Algunos modelos sugeridos pueden ser Regresión Robusta, KNN, RBS SVM y Gaussian Process.

ANEXO 4.PREDICCIONES DE LOS MODELOS

Posterior a la validación de los supuestos de cada modelo se procede a realizar las predicciones correspondientesde cada oferta y la evaluacion de ambos modelos con los sets de prueba.

4.1. PREDICCIONES DE LAS OFERTAS

#dataset oferta 1
of1 <- data.frame(
  areaconst = c(200,200),
  parqueaderos = c(1,1),
  banios = c(2,2),
  habitaciones = c(4,4),
  estrato = c(4,5)
)

# se calcula las prediciones de la oferta 1
prediccionesof1<-predict(object=modelo1,newdata=of1)
#dataset oferta 2.
of2 <- data.frame(
  areaconst = c(300,300),
  parqueaderos = c(3,3),
  banios = c(3,3),
  habitaciones = c(5,5),
  estrato = c(5,6)
)

#se calcula las predicciones de la oferta 2.
prediccionesof2<-predict(object=modelo2,newdata=of2)

A continuación se muestra una tabla con cada una de las caracteristicas de la oferta, el modelo implementado y la predicción del precio arrojada por el modelo.

predicciones<- data.frame(
  Modelo=c("Modelo 1","Modelo 1","Modelo 2", "Modelo 2"),
  Oferta=c(1,2,1,2),
  Area = c(200,200,300,300),
  Parqueaderos = c(1,1,3,3),
  Banios = c(2,2,3,3),
  Habitaciones = c(4,4,5,5),
  Estrato = c(4,5,5,6),
  Precio_Modelo=c(prediccionesof1,prediccionesof2)
)
predicciones
##     Modelo Oferta Area Parqueaderos Banios Habitaciones Estrato Precio_Modelo
## 1 Modelo 1      1  200            1      2            4       4      319.5983
## 2 Modelo 1      2  200            1      2            4       5      381.1743
## 3 Modelo 2      1  300            3      3            5       5      710.6069
## 4 Modelo 2      2  300            3      3            5       6      765.0009
  • Para el modelo 1 se tiene un presupuesto de $350 millones. La vivienda con estrato 5 se sale del presupuesto, mientras que la vivienda con estrato 4 cumple dicho presupuesto.

  • Lo anterior se debe a que el modelo 1 en la variable estrato cuenta con un coeficiente de 61, por lo que existe una diferencia importante en el precio de una vivienda con las mismas caracteristicas en estrato 4 y 5.

  • Para el segundo modelo se tiene un presupuesto de $850 millones. Se identifica que ambas viviendas se encuentran dentro del presupuesto definido.

4.2. EVALUACIÓN DE LOS MODELOS

En esta etapa se prueba el modelo con el set de prueba (30%) de los datos, para la cual se empleará las siguientes metricas:

  • ECM: Error Cuadratico Metro

  • DAM: Desviación Absoluta Media

  • EPAM: Error Porcentual Absoluto Medio

prediccionesb1 <- predict(object = modelo1, newdata = test_setb1 ) # realizar las predicciones base1

#Calcular metricas de rendimiento
ECM1 <- mean((prediccionesb1-test_setb1$preciom)^2) # Error cuadratico medio
DAM1<-mean(abs(prediccionesb1-test_setb1$preciom)) # Desviacion absoluta media
EPAM1<-mean(abs((prediccionesb1-test_setb1$preciom)/(test_setb1$preciom)))*100 # Error porcentual Absoluto medio
prediccionesb2 <- predict(object = modelo2, newdata = test_setb2 ) # realizar las predicciones base 2

#Calcular  metricas de rendimiento
ECM2 <- mean((prediccionesb2-test_setb2$preciom)^2) #Error cuadratico medio
DAM2 <- mean(abs(prediccionesb2-test_setb2$preciom)) #Desviacion absoluta media
EPAM2<-mean(abs((prediccionesb2-test_setb2$preciom)/(test_setb2$preciom)))*100 # Error porcentual Absoluto medio
Metricas<-data.frame(
  Modelo= c("Base1_Test","Base2_Test"),
  ECM=c(ECM1,ECM2),
  DAM=c(DAM1,DAM2),
  EPAM=c(EPAM1,EPAM2))

Metricas
##       Modelo       ECM      DAM     EPAM
## 1 Base1_Test 25222.576 86.98822 20.23280
## 2 Base2_Test  8262.135 57.40325 21.02009
  • EMC: Se identifica que el modelo 2 tiene un ECM significativamente menor (8262) que el de la modelo 1 (25222), por lo que el modelo 2 predice mejor los valores en terminos de precisión.

  • DAM: Para esta metrica, el modelo 2 tiene un DAM menor (57) que el modelo 1 (86), por lo que se sugiere que las predicciones del modelo 2 son más cercanas a valores reales en comparación al modelo 1. Esto corrrobora lo identificado en EMC.

  • EPAM: Para esta metrica el modelo 1 es más preciso en terminos de error porcentual con relación al modelo 2. Es importante resaltar que la diferencia entre ambos EPAM no es significativamente alta.

  • Si bien el EPAM del modelo 1 es mejor que el Modelo 2, se puede concluir que el modelo 2 es más confiable en terminos de precisión absoluta

prediccionesb1 <- predict(object = modelo1, newdata = train_setb1 ) # realizar las predicciones base1

#Calcular metricas de rendimiento
ECM1P <- mean((prediccionesb1-train_setb1$preciom)^2) # Error cuadratico medio
DAM1P<-mean(abs(prediccionesb1-train_setb1$preciom)) # Desviacion absoluta media
EPAM1P<-mean(abs((prediccionesb1-train_setb1$preciom)/(train_setb1$preciom)))*100 # Error porcentual Absoluto medio
prediccionesb2 <- predict(object = modelo2, newdata = train_setb2 ) # realizar las predicciones base 2

#Calcular  metricas de rendimiento
ECM2P <- mean((prediccionesb2-train_setb2$preciom)^2) #Error cuadratico medio
DAM2P <- mean(abs(prediccionesb2-train_setb2$preciom)) #Desviacion absoluta media
EPAM2P<-mean(abs((prediccionesb2-train_setb2$preciom)/(train_setb2$preciom)))*100 # Error porcentual Absoluto medio
MetricasP <- data.frame(
  Modelo = c("Base1_Train", "Base2_Train"),
  ECMP = c(ECM1P, ECM2P),
  DAMP = c(DAM1P, DAM2P),
  EPAMP = c(EPAM1P, EPAM2P)
)

# Insertar las nuevas métricas en las filas 3 y 4 del dataframe 'Metricas'
Metricas[c(3, 4), ] <- MetricasP
Metricas[c(2, 3), ] <- Metricas[c(3, 2), ]

Metricas
##        Modelo       ECM      DAM     EPAM
## 1  Base1_Test 25222.576 86.98822 20.23280
## 2 Base1_Train 14495.576 76.95676 19.27645
## 3  Base2_Test  8262.135 57.40325 21.02009
## 4 Base2_Train  8642.867 54.97211 19.14878
  • Modelo 1: en el set de Train hay un mejor ECM con relación al set de Test. lo que sugiere que el set de Train tiene un error menor en el set de Train. Para el DAM en el set de Train es menor que en el set de Test, por lo que las predicciones son más cercanas a los valores reales. El EPAM es ligeramente mejor en el set de Train que en el set de Test.

  • Modelo 2: en el set de Test hay un mejor ECM con relación al set de Train. lo que sugiere que el set de TEST tiene un error menor en el set de Train. Para el DAM en el set de Train es menor que en el set de Test, por lo que las predicciones son más cercanas a los valores reales. El EPAM es ligeramente mejor en el set de Train que en el set de Test.

  • El Modelo 1 muestra signos de sobreajuste, con un rendimiento significativamente peor en el conjunto de Test en comparación con el conjunto de Train.

  • El modelo 2 muestra un mejor equilibrio entre Train y Test, sugiriendo una mejor generalización y un menor riesgo de sobreajuste.

4.3 VIVIENDAS QUE CUMPLEN CON LA OFERTA

CASAS NORTE

Base1Presupuesto <- subset(base1T, preciom < 350 &  preciom > 300& estrato %in% c(4, 5)& parqueaderos >=1 & banios >= 2 & habitaciones >=4 &areaconst>=200 & areaconst<=250)

Base1Presupuesto$preciomPred <- round(predict(modelo1, newdata = Base1Presupuesto),0)
Base1Presupuesto <- Base1Presupuesto[, c(
  "id", "zona", "piso", "estrato", "preciom", "preciomPred", "areaconst", "parqueaderos", "banios", "habitaciones", "tipo", "longitud", "latitud"
)]
Base1Presupuesto
##       id       zona piso estrato preciom preciomPred areaconst parqueaderos
## 61  4267 Zona Norte    1       5     335         409       202            1
## 68  4800 Zona Norte    1       5     340         458       250            2
## 78  4483 Zona Norte    2       5     342         459       250            1
## 80   852 Zona Norte    2       5     340         461       208            3
## 103 3453 Zona Norte    3       5     340         482       240            2
## 131 1343 Zona Norte    2       5     320         418       200            2
## 142 3053 Zona Norte    2       5     320         442       230            2
## 201  766 Zona Norte    2       5     321         452       249            1
## 205 1144 Zona Norte    2       4     320         356       200            2
## 275 1849 Zona Norte    2       5     330         454       246            2
## 385 1151 Zona Norte    2       5     320         432       210            2
## 461 1887 Zona Norte    1       5     340         414       203            2
##     banios habitaciones tipo  longitud latitud
## 61       4            5 Casa -76.53044 3.48399
## 68       4            4 Casa -76.53300 3.46500
## 78       4            6 Casa -76.53197 3.48752
## 80       6            4 Casa -76.50400 3.46300
## 103      5            6 Casa -76.52640 3.48211
## 131      4            4 Casa -76.51524 3.48893
## 142      4            4 Casa -76.52353 3.48352
## 201      5            5 Casa -76.50291 3.46757
## 205      4            4 Casa -76.51156 3.48029
## 275      4            4 Casa -76.51800 3.47000
## 385      3            5 Casa -76.51200 3.47600
## 461      3            4 Casa -76.51803 3.48257
# Crea un mapa
mapa1 <- leaflet(Base1Presupuesto) %>%
  addTiles() %>%
  addMarkers(
    ~longitud,  # Reemplaza con el nombre de la columna de longitud
    ~latitud,   # Reemplaza con el nombre de la columna de latitud
    popup = ~paste(
      "<b>Precio:</b>", preciom, "<br>",
      "<b>PrecioPred:</b>", preciomPred, "<br>",
      "<b>Área:</b>", areaconst, "<br>",
      "<b>Baños:</b>", banios, "<br>",
      "<b>Estrato:</b>", estrato, "<br>",
      "<b>Habitaciones:</b>", habitaciones
    )
  )  

APARTAMENTOS - SUR

Base2Presupuesto <- subset(base2T, preciom <= 850 & estrato %in% c(5,6)& parqueaderos >=3 & banios>=3 & habitaciones>=5)
Base2Presupuesto
##        id     zona piso estrato preciom areaconst parqueaderos banios
## 948  7182 Zona Sur    1       5     730       573            3      8
## 1581 7512 Zona Sur    1       5     670       300            3      5
##      habitaciones        tipo longitud latitud
## 948             5 Apartamento  -76.548   3.408
## 1581            6 Apartamento  -76.550   3.409
Base2Presupuestoa <- subset(base2T, preciom <= 850 & estrato %in% c(5,6)& parqueaderos >=3 & banios>=3 & habitaciones>=4 &areaconst >= 300)

Base2Presupuestoa$preciomPred <- round(predict(modelo2, newdata = Base2Presupuestoa),0)

Base2Presupuestoa <- Base2Presupuestoa[, c(
  "id", "zona", "piso", "estrato", "preciom", "preciomPred", "areaconst", "parqueaderos", "banios", "habitaciones", "tipo", "longitud", "latitud"
)]
Base2Presupuestoa
##        id     zona piso estrato preciom preciomPred areaconst parqueaderos
## 948  7182 Zona Sur    1       5     730        1295       573            3
## 1581 7512 Zona Sur    1       5     670         778       300            3
##      banios habitaciones        tipo longitud latitud
## 948       8            5 Apartamento  -76.548   3.408
## 1581      5            6 Apartamento  -76.550   3.409
# Crea un mapa
mapa2 <- leaflet(Base2Presupuestoa) %>%
  addTiles() %>%
  addMarkers(
    ~longitud,  # Reemplaza con el nombre de la columna de longitud
    ~latitud,   # Reemplaza con el nombre de la columna de latitud
    popup = ~paste(
      "<b>Precio:</b>", preciom, "<br>",
      "<b>PrecioPred:</b>", preciomPred, "<br>",
      "<b>Área:</b>", areaconst, "<br>",
      "<b>Baños:</b>", banios, "<br>",
      "<b>Estrato:</b>", estrato, "<br>",
      "<b>Habitaciones:</b>", habitaciones
    )
  )  

INFORME EJECUTO

1. DESCRIPCIÓN DE LA SOLICITUD

Señores Mercado Libre Colombia, con gusto hemos recibido la solicitud realizada por ustedes hacia nuestra Empresas, con el fin de identificar posibles viviendas para poder ubicar a dos de sus empleados en la ciudad de Cali. La solicitud recibida incluye los siguientes datos que describen las características de las viviendas y el presupuesto con el que cuentan para poder acceder a dicha propiedad:

##       Características    Vivienda1    Vivienda2
## 1                Tipo         Casa  Apartamento
## 2     Área construida          200          300
## 3        Parqueaderos            1            3
## 4               Baños            2            3
## 5        Habitaciones            4            5
## 6             Estrato        4 o 5        5 o 6
## 7                Zona        Norte          Sur
## 8 Crédito preaprobado 350 millones 850 millones

2. DESCRIPCIÓN DE LA OFERTA

Queremos informarle que la propuesta realizada se desarrolló tomando como punto de partida una base de datos sobre los bienes raíces que actualmente hacen parte del portafolio de bienes que tenemos a disposición para la venta, como agentes inmobiliarios. Es importante resaltar que dicha base de datos cuenta con los más altos estándares de calidad de los datos por medio de la metodología CRIPS-DM.

3 RESULTADOS OBTENIDOS

Después de un exhaustivo procedimiento de los datos se obtuvieron los siguientes resultados con base a las necesidades de ambas solicitudes:

3.1. CASAS EN ZONA NORTE

En la siguiente tabla se encuentra las viviendas que se ajustan a las necesidades de Vivienda 1.

##       id       zona piso estrato preciom preciomPred areaconst parqueaderos
## 61  4267 Zona Norte    1       5     335         409       202            1
## 68  4800 Zona Norte    1       5     340         458       250            2
## 78  4483 Zona Norte    2       5     342         459       250            1
## 80   852 Zona Norte    2       5     340         461       208            3
## 103 3453 Zona Norte    3       5     340         482       240            2
## 131 1343 Zona Norte    2       5     320         418       200            2
## 142 3053 Zona Norte    2       5     320         442       230            2
## 201  766 Zona Norte    2       5     321         452       249            1
## 205 1144 Zona Norte    2       4     320         356       200            2
## 275 1849 Zona Norte    2       5     330         454       246            2
## 385 1151 Zona Norte    2       5     320         432       210            2
## 461 1887 Zona Norte    1       5     340         414       203            2
##     banios habitaciones tipo  longitud latitud
## 61       4            5 Casa -76.53044 3.48399
## 68       4            4 Casa -76.53300 3.46500
## 78       4            6 Casa -76.53197 3.48752
## 80       6            4 Casa -76.50400 3.46300
## 103      5            6 Casa -76.52640 3.48211
## 131      4            4 Casa -76.51524 3.48893
## 142      4            4 Casa -76.52353 3.48352
## 201      5            5 Casa -76.50291 3.46757
## 205      4            4 Casa -76.51156 3.48029
## 275      4            4 Casa -76.51800 3.47000
## 385      3            5 Casa -76.51200 3.47600
## 461      3            4 Casa -76.51803 3.48257

En la siguiente gráfica podrá visibilizar la ubicación de cada una de las viviendas propuestas:

mapa1

3.2. APARTAMENTOS SUR

En la siguiente tabla se encuentra las viviendas que se ajustan a las necesidades de Vivienda 2.

Base2Presupuestoa
##        id     zona piso estrato preciom preciomPred areaconst parqueaderos
## 948  7182 Zona Sur    1       5     730        1295       573            3
## 1581 7512 Zona Sur    1       5     670         778       300            3
##      banios habitaciones        tipo longitud latitud
## 948       8            5 Apartamento  -76.548   3.408
## 1581      5            6 Apartamento  -76.550   3.409
mapa2

4.RECOMENDACIONES

4.1. RECOMENDACIONES PARA EL CLIENTE

Con el fin de mejorar la experiencia y poder ofrecer una oferta más variada se generan las siguientes recomendaciones dirigidas hacia el cliente:

  • Se identificó para vivienda1 12 propiedades que cumplen con las características manifestadas por el cliente, las cuales posibilitan una amplia gama de opciones para que el cliente se acomode según sus preferencias.

  • Para la propuesta de vivienda2 se identificaron 2 propiedades que cumplen con los mínimos especificados por el cliente. En caso de poder ver más oferta, se recomienda la posibilidad de flexibilizar las características manifestadas, especificando un rango para cada variable de interés, como área, baños y habitaciones.

  • Se construyó un modelo para la predicción de los precios de las viviendas, empleando Regresión Lineal Multivariada y se identificó que el precio real de las viviendas está por debajo del precio predicho por el Modelo, el cual se ajusta a la capacidad crediticia del Cliente.

4.2. RECOMENDACIÓN PARA LA EMPRESA

Se determinó que el Modelo de Regresión Lineal no es el óptimo para representar la data, dado que:

  • Los rendimientos observados en los indicadores: ECM, DAM y EPAM, no son los esperados o suficientemente buenos, y esto se ve representado en las predicciones sesgadas de los precios de ambas propuestas que se entregarán a los clientes.

  • El modelo no cumple con los supuestos de linealidad y R2 está por debajo de lo esperado, por lo tanto, se sugiere revisar otros tipos modelos que puedan representar mejor la data o no sea tan sensible a datos atípicos.

  • Mejorar la calidad de los datos, especialmente los que se refiere a ubicación (Coordenadas, barrio y zona), ya que se identificó que la variable zona no es confiable debido a que presenta inconsistencias con las coordenadas de cada propiedad.

  • Revisar la posibilidad de incluir otras variables en la data, la cual permita mejorar la predicción de la vivienda, como: vivienda remodelada (Binario), zonas de valorización cercana y calidad en los servicios de transporte público.

  • Se identificaron viviendas con unos datos que tienen características que posiblemente sean atípicos. Para el análisis de datos estas propiedades no se imputaron o eliminaron, dado que no contamos con información suficiente para determinar si es un dato erróneo o en realidad es otro tipo de propiedad diferente a casa y apartemente. Se sugiere validar estas propiedades, identificar la veracidad de la información y reclasificar el tipo de propiedad o imputar los datos necesarios.

  • La variable piso carece de un contexto para poder hacer una mejor comprensión de los atributos. Es por esta razón que esta variable no fue incluida dentro de análisis.