#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

María 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 trasladó 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 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 qué?).

  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, número de habitaciones y zona donde se 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(á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 y discuta el ajuste del modelo 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 en caso 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 primera solicitud.

  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.

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

En respuesta a las solicitudes de la compañía internacional, se procede a llevar a cabo el análisis de los datos conforme a las condiciones establecidas.

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

Base 1: A continuación, se presenta la base 1 filtrada por las casas ubicadas en la zona norte.

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: A continuación, se presenta la base 2 filtrada por los apartamentos ubicados en la zona sur

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 realiza la representación gráfica de las ubicaciones de las viviendas para cada conjunto de datos específico. Por motivos de rendimiento, se incluyen las imágenes correspondientes de cada uno de los mapas generados con el siguiente código:

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

# Crea un mapa
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")

A partir de los mapas presentados, se puede notar que la variable de zona está incorrectamente clasificada de acuerdo con los registros de longitud y latitud. Esto indica que hay casas ubicadas en el sur de la ciudad con la etiqueta “Zona Norte” y, de manera similar, hay apartamentos situados en el norte de la ciudad con la etiqueta “Zona Sur”.

Como resultado de lo anterior, se procede a depurar ambos conjuntos de datos en relación con la variable de zona, ya que, como se observó, las viviendas están incorrectamente referenciadas en esta variable, lo que podría afectar el análisis de regresión lineal posterior.

Para lo anterior se definieron unos límites en el mapa de la ciudad de Cali para clasificar tanto la zona Sur como la zona Norte. A continuación, se muestran cuales fueron estos límites:

(Latitud, Longitud) zona norte de Cali:

3.4590760476259175, -76.53342515659959 (límite izquierdo del mapa) 3.4590760476259175, -76.47274743134287 (límite derecho del mapa)

Las casas que se encuentre por fuera de estos límites establecidos se deben eliminar en la base1

(Latitud, Longitud) zona sur de Cali:

3.4255342782809803, -76.5532565062156 (límite izquierdo del mapa) 3.4255342782809803, -76.50140794880839 (límite derecho del mapa)

Los apartamentos que se encuentre por fuera de estos límites establecidos se deben eliminar 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
  )

Se procede a graficar nuevamente los datos filtrados. A continuación se muestra únicamente el código 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")

# Crea un mapa 
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, así como la cantidad de observaciones de cada conjunto de datos.

Caracterización 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 ...

Caracterización 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 ...

A partir del análisis exploratorio y descriptivo realizado en ambas bases de datos, se identifican los siguientes puntos:

  • Se detecta una variable que será excluida del análisis: la variable “ID”, ya que solo actúa como identificador del predio y no proporciona información relevante para el desarrollo del trabajo.

  • La variable “piso” se encuentra en formato de texto cuando debería ser numérica. Durante el proceso de limpieza de datos, es necesario identificar el registro que está causando esta conversión a texto y eliminarlo.

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

El análisis se lleva a cabo considerando únicamente las variables numéricas: precio, área, parqueaderos, baños y habitaciones, ya que son las únicas variables de este tipo en los datos.

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 resumen anterior se puede observar lo siguiente:

  • Los precios de las propiedades presentan una variabilidad significativa, con un promedio de 402.1. El rango de precios es amplio, desde 110 hasta 1650. La mediana es de 360, lo que indica que la mitad de las propiedades tienen un precio inferior a este valor y la otra mitad, superior.

  • El área construida de las propiedades también muestra gran variabilidad. La mediana es de 225 m², mientras que el promedio es de 244.4 m². Existen propiedades pequeñas de 30 m² y otras muy grandes de hasta 1440 m², con un rango que se extiende notablemente hacia tamaños más grandes.

  • La mayoría de las propiedades cuentan con entre 1 y 2 parqueaderos, con un promedio de 2. Aunque el máximo registrado es de 10 parqueaderos, este caso es excepcional.

  • El número de baños en las propiedades varía de 0 a 9. La mediana y el promedio son ambos 3, indicando que la mayoría de las propiedades tienen entre 2 y 4 baños.

  • Finalmente, la mayoría de las propiedades tienen entre 3 y 5 habitaciones, con un promedio cercano a 4. En algunos casos, el número de habitaciones puede llegar hasta 10.

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

El análisis se lleva a cabo considerando únicamente las variables numéricas: precio, área, parqueaderos, baños y habitaciones, ya que son las únicas variables de este tipo en los datos.

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  
## 

Del resumen anterior se puede observar lo siguiente:

  • Los precios de las propiedades presentan una gran variabilidad, con un promedio de 297.3. La mayoría de las propiedades tienen precios que oscilan entre 175 y 335, aunque también existen propiedades con precios muy elevados, alcanzando hasta 1750.

  • El área construida de las propiedades muestra una amplia variabilidad. La mediana es de 85 m² y el promedio es de 97.47 m², con algunas propiedades llegando hasta 932 m².

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

  • La mayoría de las propiedades cuentan con 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 varía de 0 a 6, siendo 3 el valor más frecuente.

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:

  • Las variables “piso” y “parqueaderos” son las que presentan la mayor cantidad de datos faltantes, por lo que deben recibir tratamiento, dado que representan un alto porcentaje de los datos en ambas bases de datos.

  • Se observa que la base de datos de los apartamentos en la zona sur tiene una mayor cantidad de datos faltantes en comparación con la base de datos de las casas en la zona norte. Esto puede explicarse por la diferencia en el número de registros entre 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 conjuntos de datos.

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 conjuntos de datos por las siguientes razones:

  • No contiene información 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]

A continuación, se lleva a cabo un resumen estadístico de las variables “piso” y “parqueadero” para cada conjunto de datos correspondiente, con la finalidad de comparar los cambios en la data en cuanto a dispersión y centralidad después la imputación de dichas variables mediante el método 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 gráfica se puede interpretar que:

  • Ambas categorías (B1 y B2) presentan variabilidad en todas las variables, incluyendo algunos valores atípicos.

  • Las distribuciones son en general similares entre B1 y B2, aunque se observan diferencias significativas en la dispersión y en los valores extremos, especialmente en variables como el Área y el Precio.

  • Las medias (puntos rojos) suelen estar cerca de las medianas, aunque en algunos casos las diferencias observadas sugieren cierta 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 método 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 dispersión y centralidad después 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 ver en las tablas anteriores, la mediana no se vio afectada después de la imputación. No obstante, se observa un leve aumento en los promedios de la variable “piso” y una disminución en los promedios de la variable “parqueaderos”.

Ahora se procede a realizar un análisis de correlación entre las variables de entrada y salida de cada conjunto de datos, 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 deducir lo siguiente:

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

  • Todas las correlaciones en ambas bases de datos son positivas, lo que indica una relación directamente proporcional, es decir, cuando una de las variables aumenta, las otras también tienden a aumentar.

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

  • Las correlaciones más fuertes en ambas gráficas son:

Base 1:

  • Estrato y área construida (61%)

  • Área construida y baños (59%)

  • banios y habitaciones (59%)

  • Área construida y parqueaderos (55%)

Base 2:

  • Área construida y baños (75%)

  • Área construida y parqueaderos (66%)

  • Área 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 anterior grafico 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.
  • Los valores de la correlación en ambas bases de datos son similares
  • Las variables que más aportan o explican la variabilidad son área construida y el estrato.

Nota: La variable estrato es una variable categórica ordinal, la cual debe ser trata como factor, sin embargo, la librería y el método de Spearman solo acepta que las variables sean con datos numéricos.

Por otra parte, tiene sentido la alta correlación de la variable estrato con la variable precio, por lógica se entiende que entre más alto el estrato más alto será el precio de la vivienda.

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

Para estimar los modelos de regresión lineal multivariada, se realiza una selección 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 utilizará un 70% de las bases de datos para entrenamiento 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 resultados anteriores se pueden concluir las siguientes observaciones:

  • El \(R^2\) indica que el modelo de la base 1 puede explicar el 70.12% de la variabilidad con las variables incluidas.

  • Aunque el intercepto es negativo y bastante alto, lo cual puede parecer no tener sentido cuando las demás variables son cero, puede servir como un parámetro para ajustar la predicción del precio.

  • El área construida muestra una alta significancia (p < 2e-16). Sin embargo, su coeficiente es pequeño debido al rango de valores de esta variable. Por ejemplo, una casa de 1000 m² puede aportar solo 700 puntos al precio.

  • El estrato también se considera una variable significativa en el modelo, ya que contribuye aproximadamente 61.58 puntos al precio por cada nivel de estrato. Esto implica que el precio de una vivienda con características similares puede variar significativamente solo por el cambio en el estrato.

  • El número de parqueaderos es otra variable importante en el modelo, ya que incrementa el precio en 23.66 puntos por cada parqueadero adicional.

  • Las habitaciones y los baños son las variables menos significativas en la estimación del precio, con coeficientes más bajos en comparación con las otras variables. Esto sugiere que las variaciones en estas variables tienen un impacto menor en 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.

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

4. 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 revisarán 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 errores 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 sí.

Se realiza el test de Durbin-Watson para determinar si existe correlación 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 están correlacionados. Por lo tanto, este supuesto no se cumple.

  1. Los errores siguen una distribución 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 métrica 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 VIF:

  • 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 están entre 1 y 5 lo que indica una correlación moderada, lo que anteriormente se pudo observar mediante las matrices de correlación 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 resultados anteriores se pueden extraer las siguientes conclusiones:

  • El \(R^2\) muestra que el modelo de la base 1 puede explicar el 78.21% de la variabilidad utilizando las variables establecidas.

  • Aunque el intercepto es negativo y bastante alto, y puede parecer no tener sentido cuando las demás variables son cero, puede usarse como un parámetro para ajustar la predicción del precio.

  • En la base 2, se observa que los apartamentos se valoran más a medida que aumenta el área construida, dado que el coeficiente de esta variable es casi el doble que en la base 1.

  • La variable estrato en la base 2 tiene un coeficiente de 54, comparado con 61.57 en la base 1, lo que indica que el estrato tiene menos impacto en la valorización de las viviendas en la base 2.

  • El número de parqueaderos es una variable importante para el modelo, incrementando el precio en 93.16 puntos por cada parqueadero adicional.

  • El coeficiente para habitaciones es -23.15, lo que sugiere que un mayor número de habitaciones podría reducir el precio de la vivienda. Esto podría indicar que las viviendas con menos habitaciones son más valoradas, o podría ser un reflejo de que el modelo no cumple con algunos supuestos. Esta variable muestra alta significancia (2e-16).

  • Las variables Baños y parqueaderos tienen coeficientes significativamente altos en comparación con la base de datos 1. Esto podría deberse a que, dado el valor negativo para habitaciones, el modelo ajusta estas variables para equilibrar el impacto.

  • Las cinco variables tienen alta significancia en el modelo, con p-values <= 0.05.

3.3.2. SUPUESTOS MODELO 2

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

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

2. Q-Q Plot de Residuos

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.

3. Scale-Location (Spread-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.

4. Residuals vs Leverage y Cook’s Distance

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 validación de supuestos se revisarán 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 errores 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 sí.

Se realiza el test de Durbin-Watson para determinar si existe correlación 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 están correlacionados. Por lo tanto, este supuesto no se cumple.

  1. Los errores siguen una distribución 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 métrica 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 están entre 1 y 5 lo que indica una correlación moderada, lo que anteriormente se pudo observar mediante las matrices de correlación entre variables individuales.

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

A partir de los resultados anteriores, se puede concluir que ambos modelos no son completamente lineales, dado que su coeficiente de determinación no es lo suficientemente alto para explicar la variabilidad de los datos. Además, ninguno de los supuestos de linealidad se cumple para ambos modelos.

Por otro lado, se observan algunos datos atípicos que generan ruido en el modelo y podrían sesgar los resultados. Se recomienda mejorar la calidad de los datos, ya que ambas bases presentan muchas inconsistencias en las diferentes variables.

Si la empresa considera esencial utilizar la regresión lineal múltiple, es importante ajustar ambos modelos mediante algún tipo de transformación para verificar si se cumplen los supuestos de regresión lineal múltiple. Esto permitirá determinar si el modelo puede ajustarse mejor para explicar la variabilidad de los datos y mejorar su rendimiento.

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

4.PREDICCIONES DE LOS MODELOS

Posterior a la validación de los supuestos de cada modelo se procede a realizar las predicciones correspondientes de cada oferta y la evaluación 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 características 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 características 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 métricas:

  • ECM: Error Cuadrático Medio

  • 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 términos de precisión.

  • DAM: Para esta métrica, 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 corrobora lo identificado en EMC.

  • EPAM: Para esta métrica el modelo 1 es más preciso en términos 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 términos 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 de su parte para identificar posibles viviendas en la ciudad de Cali para dos de sus empleados. La solicitud incluye los datos necesarios que describen las características de las viviendas y el presupuesto disponible para adquirir dichas propiedades.

##       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

Tras un análisis exhaustivo de los datos, se obtuvieron los siguientes resultados de acuerdo con 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:

3.2. APARTAMENTOS SUR

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

##        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

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

4.RECOMENDACIONES

4.1. RECOMENDACIONES PARA EL CLIENTE

Para mejorar la experiencia del cliente y ofrecer una variedad más amplia, se hacen las siguientes recomendaciones:

  • Se identificaron 12 propiedades que cumplen con las características especificadas para la vivienda 1, proporcionando una amplia gama de opciones para que el cliente pueda elegir según sus preferencias.

  • En la propuesta de vivienda 2, se encontraron 2 propiedades que cumplen con los requisitos mínimos establecidos por el cliente. Para explorar más opciones, se sugiere considerar la posibilidad de flexibilizar las características especificadas, estableciendo un rango para cada variable de interés, como área, baños y habitaciones.

  • Se desarrolló un modelo de predicción de precios de viviendas utilizando Regresión Lineal Multivariada, y se observó que el precio real de las propiedades está por debajo del precio pronosticado 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 más adecuado para representar los datos, debido a las siguientes razones:

  • Los resultados observados en los indicadores ECM, DAM y EPAM no cumplen con las expectativas y esto se refleja en las predicciones sesgadas de los precios para ambas propuestas que se presentarán a los clientes.

  • El modelo no satisface los supuestos de linealidad y el \(R^2\) está por debajo de lo esperado. Por lo tanto, se recomienda explorar otros modelos que puedan representar mejor los datos o que sean menos sensibles a datos atípicos.

  • Es necesario mejorar la calidad de los datos, especialmente en lo que respecta a la ubicación (coordenadas, barrio y zona), ya que se identificaron inconsistencias en la variable zona con respecto a las coordenadas de cada propiedad.

  • Se identificaron viviendas con datos que podrían ser atípicos. Estas propiedades no se imputaron ni eliminaron en el análisis debido a la falta de información suficiente para determinar si son datos erróneos o propiedades de tipo diferente. Se recomienda validar estas propiedades, verificar la veracidad de la información y, si es necesario, reclasificar el tipo de propiedad o imputar los datos correspondientes.

  • La variable “piso” carece de un contexto claro para entender mejor sus atributos, por lo que no se incluyó en el análisis.