1 Contexto

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:

Table 1.1: Comparación de viviendas
Características Vivienda.1 Vivienda.2
Tipo Casa Apartamento
Área construida 200 300
Parqueaderos 1 3
Baños 2 3
Habitaciones 4 5
Estrato 4 o 5 5 o 6
Zona Norte Sur
Crédito preaprobado 350 millones 850 millones

2 Metodología

Table 2.1: Metodología de análisis para la selección de viviendas
Paso Descripción.de.la.Tarea Metodología.para.Obtener.los.Datos
1 Filtro de la base de datos para incluir solo casas de la zona norte Seleccionar registros donde el tipo de vivienda sea ‘Casa’ y la zona sea ‘Norte’.
2 Análisis exploratorio de datos enfocado en la correlación Utilizar el paquete plotly en R para crear gráficos interactivos.
3 Estimación de un modelo de regresión lineal múltiple Utilizar el paquete stats en R para ajustar un modelo de regresión lineal.
4 Validación de supuestos del modelo Aplicar diagnósticos como gráficos de residuos y pruebas de normalidad.
5 Predicción del precio de la vivienda Utilizar el modelo estimado para predecir el precio de la vivienda.
6 Selección de ofertas potenciales Identificar viviendas que se ajusten al presupuesto.
7 Repetir pasos del 1 al 6 para la segunda solicitud Repetir el proceso para la segunda solicitud: Apartamentos en zona sur.

3 Anexos

3.1 Datos

La base de datos contiene en total 8.322 registros de viviendas, y reúne 13 características de estas, donde se identifican datos geográficos (zona, longitud, latitud, barrio), cantidad de baños, parqueaderos y habitaciones, e información como el piso, estrato, precio y área construida.

En la tabla 3.1 se describen y clasifican las variables, de acuerdo a su naturaleza.

Table 3.1: Descripción y clasificación de las variables.
NombreVariable Descripcion TipoVariable Escala
id Identificador númerico de la vivienda Cualitativa Nominal
zona Punto cardinal donde se ubica la vivienda Cualitativa Nominal
piso Piso donde se ubica la vivienda Cuantitativa Discreta
estrato Estrato de la vivienda Cualitativa Ordinal
preciom Precio de la vivienda Cuantitativa Continuo
areaconst Área construida de la vivienda Cuantitativa Continuo
parqueaderos Número de parqueaderos en la vivienda Cuantitativa Discreta
banios Número de baños e la vivienda Cuantitativa Discreta
habitaciones Número de habitaciones en la vivienda Cuantitativa Discreta
tipo Tipo de vivienda Cualitativa Nominal
barrio Barrio donde se ubica la vivienda Cualitativa Nominal
longitud Logitud (coordenada) Cuantitativa Continuo
latitud Latitud (coordenada) Cuantitativa Continuo

Dado que el id es unicamente una variable de identificación se ajusta su tipo de datos a “carácter”, el estrato corresponde a una variable ordinal, por tanto se ajusta a “carácter”, mientras que que piso al ser una variable númerica se cambia a tipo “númerico”.

data("vivienda")
vivienda <- vivienda %>% as.data.frame()

vivienda$id <- as.character(vivienda$id)
vivienda$estrato <- as.character(vivienda$estrato)
vivienda$piso <- as.numeric(vivienda$piso)

3.2 Caso 1: Casas en el norte

3.2.1 Preparación datos

Se revisó la consistencia de la información del conjunto de datos en relación con las variables tipo de vivienda y zona, con el objetivo de realizar posteriormente el filtrado de la base de datos, a partir de esta revisión, se identificó que los registros relevantes corresponden a viviendas clasificadas como “Casa” ubicadas en la Zona Norte, una vez aplicado el filtro, se obtuvo un total de 722 casas de las 8.322 observaciones originales, lo que representa aproximadamente el 8,67 % del total de la base de datos bajo esta condición.

unique(vivienda$tipo) # revisión escritura tipo vivienda
unique(vivienda$zona) # revisión escritura zona

vivienda1 <- vivienda %>% 
  filter(tipo == "Casa" & zona == "Zona Norte") %>% 
  distinct() %>%  #eliminamos registros duplicados
  select(-c(piso, barrio)) # excluimos variables que no se utilizaran en el análisis

nrow(vivienda1)
nrow(vivienda1)/nrow(vivienda)

3.2.2 Analisis Exploratiorio

3.2.2.1 Limpieza

Considerando que el contexto del análisis de viviendas es dificil pensar que se venda alguna sin baños ni habitaciones, por ello aquellos registros con valor 0 fueron remplazados como null para darles un tratamiento adecuado.

Table 3.2: Variables con datos faltantes
Variable Registros CantidadNA PorcentajeNA
parqueaderos 722 287 39.75%
habitaciones 722 20 2.77%
banios 722 10 1.39%
id 722 0 0%
zona 722 0 0%
estrato 722 0 0%
preciom 722 0 0%
areaconst 722 0 0%
tipo 722 0 0%
longitud 722 0 0%
latitud 722 0 0%

Para los datos de baños y habitaciones se decidió imputar por la mediana dado que esta distribución es asimetrica.

vivienda1 <- vivienda1 %>%
  mutate(
    banios = ifelse(is.na(banios), median(banios, na.rm = TRUE), banios),
    habitaciones = ifelse(is.na(habitaciones), median(habitaciones, na.rm = TRUE), habitaciones)
  )

No obstante, por la falta de información y contexto no se tratará la variable piso, ni será considerada en el análisis posterior, además dada la necesidad de contar con un conjunto de datos completos y de calidad, se decide hacer omisión de aquellos registros con datos faltantes, resultando así un total de 435 viviendas de 722 filtradas inicialmente.

vivienda1 <- na.omit(vivienda1)

3.2.2.2 Mapa

3.2.2.2.1 Primeras viviendas

Inicialmente se presentan los tres primeros registros del conjunto de datos filtrado, con el fin de verificar la correcta estructura de la información y confirmar que las variables se encuentran correctamente registradas.

Adicionalmente, se construyó un mapa geográfico con los puntos correspondientes a las coordenadas (latitud y longitud) de las viviendas seleccionadas, con el objetivo de visualizar su distribución espacial dentro de la ciudad de Cali, allí se observa que no todos los puntos se ubican estrictamente dentro de la zona norte, ya que algunos registros aparecen en otras áreas de la ciudad. Esto puede deberse a varias razones, entre ellas:

  • Imprecisiones en la clasificación de la variable “zona” dentro de la base de datos.
  • Posibles errores de georreferenciación o captura de datos en el proceso de webscrapping.
  • El anunciante de la vivienda la referenció equivocamente.
# Mostramos los 3 primeros registros
head(vivienda1,3) %>%
  kbl(
    format = "html",
    caption = "Primeras tres casas de la zona norte"
  ) %>%
  kable_classic(
    full_width = FALSE,
    html_font = "Cambria")
Table 3.3: Primeras tres casas de la zona norte
id zona estrato preciom areaconst parqueaderos banios habitaciones tipo longitud latitud
1 1209 Zona Norte 5 320 150 2 4 6 Casa -76.51341 3.47968
2 1592 Zona Norte 5 780 380 2 3 3 Casa -76.51674 3.48721
4 4460 Zona Norte 4 625 355 3 5 5 Casa -76.53179 3.40590
map1 <- leaflet(data = vivienda1[1:3, c("id","latitud","longitud")]) %>%
  addTiles() %>%
  addMarkers(
    lng = ~longitud,
    lat = ~latitud,
    popup = ~paste("ID:", id, "<br>Latitud:", latitud, "<br>Longitud:", longitud)
  )%>%
  addControl(
    "<h4>Ubicación de las primeras viviendas</h4>",
    position = "topright"
  ); map1
3.2.2.2.2 Todas las viviendas

Adicional se se construyó un mapa geográfico con todos los puntos correspondientes a las coordenadas (latitud y longitud) de las viviendas seleccionadas, con el objetivo de visualizar su distribución espacial dentro de la ciudad de Cali, donde se evidencia la persistencia de errores indicados anteriormente.

map2 <- leaflet(data = vivienda1[, c("id","latitud","longitud")]) %>%
  addTiles() %>%
  addMarkers(
    lng = ~longitud,
    lat = ~latitud,
    popup = ~paste("ID:", id, "<br>Latitud:", latitud, "<br>Longitud:", longitud)
  )%>%
  addControl(
    "<h4>Ubicación de todas las viviendas</h4>",
    position = "topright"
  );map2

3.2.2.3 Correlación

Con el fin de analizar la relación entre las variables relevantes del mercado inmobiliario, se calculó una matriz de correlación de Pearson utilizando las variables número de parqueaderos, número de baños, número de habitaciones, área construida y precio de la vivienda (en millones).

Los resultados muestran una correlación positiva entre todas las variables analizadas, destacándose especialmente la relación entre el precio de la vivienda y el área construida (0,69), lo que sugiere que viviendas con mayor área tienden a presentar precios más elevados, asimismo, se observa una relación moderada entre el precio y el número de baños (0,53) y entre el precio y el número de parqueaderos (0,41). Estas relaciones indican que las características físicas de la vivienda influyen de manera importante en la determinación del precio dentro del mercado de casas ubicadas en la zona norte.

Cabe resaltar que la correlación entre habitaciones y precio es positiva pero moderada (0,25), esto indica que, en general, las viviendas con mayor número de habitaciones tienden a tener precios más altos; sin embargo, el número de habitaciones no es el factor más determinante del precio.

matrix_cor <- cor(vivienda1[, c("parqueaderos","banios","habitaciones","areaconst","preciom")]
                  , use = "complete.obs", method = "pearson")

plot_ly(z = matrix_cor, x = colnames(matrix_cor), y = colnames(matrix_cor), type = "heatmap")
corrplot(matrix_cor, insig = "p-value", sig.level = 0.05,
         method = "shade", shade.col = NA,
         tl.col = "black",
         addCoef.col = "black", tl.srt = 45,
         order = "AOE", type = "lower", diag = FALSE, addshade = "all")   

3.2.2.4 Precio vs

3.2.2.4.1 Área

El patrón observado en el gráfico de dispersión es consistente con los resultados obtenidos en la matriz de correlación, donde se identificó una correlación positiva relativamente alta (0.69) entre el área construida y el precio de la vivienda, esto confirma que el tamaño de la propiedad es uno de los factores que más influye en la determinación del precio dentro del conjunto de casas ubicadas en la zona norte, en consecuencia, viviendas con mayor área construida tienden a presentar precios más elevados, lo cual es coherente con la lógica del mercado inmobiliario, donde el espacio disponible representa una característica altamente valorada por los compradores.

#Dispersión precio y area construida
plot_ly(
  data = vivienda1,
  x = ~areaconst,
  y = ~preciom,
  type = "scatter",
  mode = "markers"
) %>%
  layout(
    title = "Dispersión entre área construida y precio",
    xaxis = list(title = "Área construida"),
    yaxis = list(title = "Precio (millones)")
  )
3.2.2.4.2 Estrato

El diagrama de cajas muestra la distribución del precio de las viviendas según el estrato socioeconómico para las casas ubicadas en la zona norte de la ciudad, en general, se observa una tendencia creciente en los precios a medida que aumenta el estrato, lo cual es consistente con la estructura socioeconómica del mercado inmobiliario:

  • Las viviendas ubicadas en estrato 3 presentan los precios más bajos dentro del conjunto analizado, con una mediana cercana a los 250 millones
  • En el estrato 4, se observa un aumento en el nivel de precios y una mayor dispersión de los valores, con precios que pueden superar los 700 millones.
  • Para el estrato 5, la distribución muestra una variabilidad aún mayor, con una mediana alrededor de 450–500 millones y algunos valores atípicos que superan los 1500 millones, lo que podría corresponder a propiedades de alto valor o características especiales.
  • Las viviendas del estrato 6 presentan los precios más elevados en promedio, con medianas cercanas a los 700 millones y valores máximos que superan los 1300 millones, reflejando que este estrato concentra las propiedades de mayor valor dentro del conjunto analizado.
# precio según estrato
plot_ly(
  data = vivienda1,
  x = ~estrato,
  y = ~preciom,
  type = "box"
)%>%
  layout(
    title = "Distribución del precio de la vivienda según estrato",
    xaxis = list(title = "Estrato"),
    yaxis = list(title = "Precio (millones)")
  )
3.2.2.4.3 Habitaciones

En términos generales, se observa una tendencia creciente en el precio a medida que aumenta el número de habitaciones, lo cual es consistente con la idea de que viviendas con mayor capacidad habitacional suelen corresponder a propiedades más amplias o con mejores características.

Las viviendas con pocas habitaciones (entre una y tres) presentan precios más bajos y menor dispersión, a partir de cuatro habitaciones, se observa un aumento gradual en el precio promedio y en la variabilidad de los valores, lo que indica que este tipo de viviendas puede presentar una mayor heterogeneidad en términos de tamaño, ubicación o características adicionales,asimismo, se identifican algunos valores atípicos, especialmente en viviendas con un mayor número de habitaciones, cuyos precios alcanzan niveles considerablemente más altos. Estos casos pueden corresponder a propiedades de gran tamaño o viviendas de alto valor dentro del mercado inmobiliario de la zona norte.

# precio según número de habitaciones
plot_ly(
  vivienda1,
  x = ~habitaciones,
  y = ~preciom,
  type = "box"
)%>%
  layout(
    title = "Distribución del precio de la vivienda según número de habitaciones",
    xaxis = list(title = "Número habitaciones"),
    yaxis = list(title = "Precio (millones)")
  )
3.2.2.4.4 Baños

En términos generales, se observa una tendencia creciente en el precio a medida que aumenta el número de baños, lo cual es coherente con el hecho de que viviendas con mayores comodidades tienden a tener un mayor valor en el mercado inmobiliario.

Las viviendas con uno o dos baños presentan precios relativamente más bajos y una menor variabilidad. A medida que aumenta el número de baños, el precio promedio y la dispersión de los valores también tienden a incrementarse, lo que sugiere que estas viviendas suelen estar asociadas a propiedades de mayor tamaño o con mejores características, asimismo, se observan algunos valores atípicos con precios considerablemente altos en viviendas con varios baños, lo cual podría corresponder a propiedades de mayor valor o características especiales dentro del mercado inmobiliario de la zona norte.

# precio según número de baños
plot_ly(
  vivienda1,
  x = ~banios,
  y = ~preciom,
  type = "box"
)%>%
  layout(
    title = "Distribución del precio de la vivienda según número de baños",
    xaxis = list(title = "Número baños"),
    yaxis = list(title = "Precio (millones)")
  )
3.2.2.4.5 Parqueaderos

En términos generales, se observa una tendencia creciente en el precio a medida que aumenta el número de parqueaderos, lo cual sugiere que esta característica representa una comodidad valorada dentro del mercado inmobiliario.

Las viviendas con uno o dos parqueaderos presentan precios relativamente más bajos y una menor dispersión en comparación con aquellas que cuentan con un mayor número de espacios para estacionamiento, a partir de tres o cuatro parqueaderos, se observa un incremento en el precio promedio de las viviendas, así como una mayor variabilidad en los valores, lo que indica que estas propiedades pueden presentar características adicionales como mayor área construida o ubicaciones más exclusivas, en el caso de viviendas con seis o más parqueaderos, los precios tienden a ser considerablemente más altos, lo cual podría estar asociado a propiedades de gran tamaño o viviendas de alto valor, donde la disponibilidad de múltiples espacios de estacionamiento es más común.

# precio según número de parqueaderos
plot_ly(
  vivienda1,
  x = ~parqueaderos,
  y = ~preciom,
  type = "box"
)%>%
  layout(
    title = "Distribución del precio de la vivienda según número de parqueaderos",
    xaxis = list(title = "Número parqueaderos"),
    yaxis = list(title = "Precio (millones)")
  )

3.2.3 Estimación modelo regresión múltiple

3.2.3.1 Modelo 1

El modelo estima el precio esperado de una vivienda en función de sus características y del estrato socioeconómico, de acuerdo con los resultados el coeficiente asociado al área construida (0,68) indica que, manteniendo constantes las demás variables, un incremento de una unidad en el área construida aumenta el precio de la vivienda en aproximadamente 0,68 millones, ésta variable resulta altamente significativa, lo que sugiere que el tamaño de la vivienda es uno de los principales determinantes del precio.

En cuanto al estrato socioeconómico, los coeficientes indican que, en comparación con las viviendas de estrato 3 (categoría base) las viviendas de estrato 4 tienen un precio aproximadamente 78.75 millones mayor, las de estrato 5 presentan un precio 145.69 millones mayor,y las de estrato 6 tienen un precio 277.07 millones superior. Además. las variables parqueaderos (23,83) y baños (20,02) también presentan una relación positiva con el precio, lo que indica que viviendas con mayores comodidades tienden a tener un mayor valor en el mercado, por otro lado, el número de habitaciones no resulta estadísticamente significativo al nivel del 5%, lo que sugiere que su efecto sobre el precio es menor una vez se controlan otras características de la vivienda.

El modelo presenta un R cuadrado de 0,607, lo que indica que aproximadamente el 60.7% de la variabilidad del precio de las viviendas es explicada por las variables incluidas en el modelo, además, el estadístico F es altamente significativo (p-value < 0.001), lo que confirma que el modelo es estadísticamente significativo en conjunto.

\[ \begin{align} \widehat{Precio}_i =\;& 10.39 + 0.68\,Areaconst_i + 78.75\,Estrato4_i \\ &+ 145.69\,Estrato5_i + 277.07\,Estrato6_i \\ &+ 6.58\,Habitaciones_i + 23.83\,Parqueaderos_i + 20.02\,Baños_i \end{align} \]

vivienda1$estrato <- factor(vivienda1$estrato)

modelov1 <- lm(preciom ~ areaconst + estrato + habitaciones + parqueaderos + banios,
             data = vivienda1)

summary(modelov1)
## 
## Call:
## lm(formula = preciom ~ areaconst + estrato + habitaciones + parqueaderos + 
##     banios, data = vivienda1)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -786.25  -74.71  -15.75   45.96  988.92 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   10.39195   27.56869   0.377  0.70640    
## areaconst      0.67790    0.05313  12.759  < 2e-16 ***
## estrato4      78.75252   24.50144   3.214  0.00141 ** 
## estrato5     145.69064   22.75085   6.404 4.00e-10 ***
## estrato6     277.07250   37.64073   7.361 9.46e-13 ***
## habitaciones   6.57856    5.86013   1.123  0.26224    
## parqueaderos  23.82577    5.88274   4.050 6.08e-05 ***
## banios        20.01931    7.87005   2.544  0.01132 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 154.8 on 427 degrees of freedom
## Multiple R-squared:  0.6074, Adjusted R-squared:  0.6009 
## F-statistic: 94.36 on 7 and 427 DF,  p-value: < 2.2e-16

3.2.3.2 Modelo 2

El modelo 2 fue obtenido mediante el procedimiento forward stepwise regression, el cual selecciona las variables que mejor explican el comportamiento de la variable dependiente, en este el procedimiento eliminó la variable habitaciones porque no aportaba información estadísticamente significativa para explicar el precio de la vivienda una vez que las demás variables ya estaban en el modelo, como resultado, el modelo final incluye las variables área construida, estrato, número de parqueaderos y número de baños.

El coeficiente del área construida (0,693) indica que, manteniendo constantes las demás variables, un aumento de una unidad en el área construida incrementa el precio estimado de la vivienda en aproximadamente 0.693 millones, además, el número de parqueaderos (23.94) y baños (24.60) presenta una relación positiva y estadísticamente significativa con el precio, indicando que viviendas con más comodidades tienden a tener un mayor valor en el mercado.

El modelo presenta un R cuadrado de 0,606, lo que indica que aproximadamente el 60.6% de la variabilidad del precio de las viviendas es explicada por las variables incluidas en el modelo, y el estadístico F es altamente significativo (p-value < 0.001), lo que confirma que el modelo es estadísticamente significativo en su conjunto.

\[ \begin{align} \widehat{Precio}_i =\;& 25.60 + 0.693\,Areaconst_i + 73.30\,Estrato4_i \\ &+ 138.45\,Estrato5_i + 268.38\,Estrato6_i \\ &+ 23.94\,Parqueaderos_i + 24.60\,Baños_i \end{align} \]

# se define el modelo  nulo  y= b0
modelo_b0<- lm(preciom ~ 1, data=vivienda1)

# Se aplica el proceso forward stepwise regression
modelov2 <- step(modelo_b0, direction='forward', scope=formula(modelov1), trace=0)

# Visualización de los resultados 
summary(modelov2)
## 
## Call:
## lm(formula = preciom ~ areaconst + estrato + parqueaderos + banios, 
##     data = vivienda1)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -776.43  -76.65  -15.83   49.51  998.38 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   25.59912   24.01828   1.066  0.28711    
## areaconst      0.69339    0.05132  13.511  < 2e-16 ***
## estrato4      73.30459   24.02332   3.051  0.00242 ** 
## estrato5     138.44555   21.82288   6.344 5.70e-10 ***
## estrato6     268.37716   36.84635   7.284 1.57e-12 ***
## parqueaderos  23.94305    5.88360   4.069 5.61e-05 ***
## banios        24.59943    6.73197   3.654  0.00029 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 154.9 on 428 degrees of freedom
## Multiple R-squared:  0.6062, Adjusted R-squared:  0.6007 
## F-statistic: 109.8 on 6 and 428 DF,  p-value: < 2.2e-16

3.2.3.3 Modelo 3

En este modelo se introduce una transformación logarítmica en la variable dependiente precio (en millones), utilizando el logaritmo del precio en lugar del precio en niveles, esta transformación permite interpretar los coeficientes como cambios porcentuales en el precio de la vivienda y suele mejorar las propiedades estadísticas del modelo.

Los resultados muestran que todas las variables incluidas en el modelo son estadísticamente significativas, incluyendo el número de habitaciones, lo que sugiere que su efecto se vuelve más claro cuando el modelo se estima en términos logarítmicos, el área construida continúa siendo uno de los principales determinantes del precio, mientras que el estrato socioeconómico mantiene un impacto positivo importante sobre el valor de las viviendas, asimismo, el número de parqueaderos y baños también presenta efectos positivos sobre el precio.

En comparación con los modelos anteriores, este modelo presenta un mayor nivel de ajuste R cuadrado de 0,706, lo que indica que explica una mayor proporción de la variabilidad del precio de las viviendas, en consecuencia, el modelo logarítmico parece ofrecer una mejor especificación para analizar la relación entre las características de las viviendas y su precio.

\[ \begin{align} \widehat{\log(Precio)}_i =\;& 5.009 + 0.00114\,Areaconst_i + 0.346\,Estrato4_i \\ &+ 0.478\,Estrato5_i + 0.675\,Estrato6_i \\ &+ 0.0206\,Habitaciones_i + 0.0450\,Parqueaderos_i + 0.0398\,Baños_i \end{align} \]

modelov3 <- lm(log(preciom) ~ areaconst + estrato + habitaciones + parqueaderos + banios,
               data = vivienda1)

summary(modelov3)
## 
## Call:
## lm(formula = log(preciom) ~ areaconst + estrato + habitaciones + 
##     parqueaderos + banios, data = vivienda1)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.14998 -0.16009 -0.00931  0.14473  1.07749 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  5.009e+00  4.555e-02 109.965  < 2e-16 ***
## areaconst    1.142e-03  8.778e-05  13.007  < 2e-16 ***
## estrato4     3.459e-01  4.048e-02   8.545 2.29e-16 ***
## estrato5     4.783e-01  3.759e-02  12.725  < 2e-16 ***
## estrato6     6.753e-01  6.219e-02  10.858  < 2e-16 ***
## habitaciones 2.064e-02  9.682e-03   2.132  0.03362 *  
## parqueaderos 4.499e-02  9.720e-03   4.629 4.88e-06 ***
## banios       3.977e-02  1.300e-02   3.059  0.00236 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.2558 on 427 degrees of freedom
## Multiple R-squared:  0.7064, Adjusted R-squared:  0.7016 
## F-statistic: 146.8 on 7 and 427 DF,  p-value: < 2.2e-16

3.2.3.4 Comparación y elección

La tabla presenta una comparación de las principales métricas de ajuste para los tres modelos estimados. Los modelos 1 y 2 presentan valores de R cuadrado muy similares, cercanos a 0,61, lo que indica que ambos explican aproximadamente el 61% de la variabilidad del precio de las viviendas, esto sugiere que la eliminación de la variable habitaciones en el modelo 2, a partir del procedimiento de selección stepwise, no afecta de manera significativa la capacidad explicativa del modelo, asimismo, ambos modelos presentan valores similares en términos de error residual y criterios de información como AIC y BIC, lo que indica que su desempeño estadístico es comparable.

Por otro lado, el modelo 3, que utiliza el logaritmo del precio como variable dependiente, presenta un mayor coeficiente de determinación (0,71), lo que indica que logra explicar una mayor proporción de la variabilidad de la variable dependiente, además, el error residual es considerablemente menor, lo que sugiere un mejor ajuste del modelo a los datos, en términos generales, estos resultados indican que la transformación logarítmica del precio permite mejorar la capacidad explicativa del modelo y capturar de forma más adecuada la relación entre las características de las viviendas y su precio.

En conjunto, la comparación de métricas sugiere que el modelo logarítmico (modelo 3) presenta el mejor desempeño entre los modelos estimados, por lo que resulta una alternativa más adecuada para analizar y predecir el precio de las viviendas a partir de sus características estructurales y socioeconómicas.

g1 <- glance(modelov1)
g2 <- glance(modelov2)
g3 <- glance(modelov3)

tabla_modelos <- rbind(g1, g2, g3)
rownames(tabla_modelos) <- c("Modelo 1", "Modelo 2", "Modelo 3")

tabla_modelos %>%
  kbl(
    format = "html",
    digits = 2,
    caption = "Comparación de métricas de los modelos estimados",
    row.names = TRUE
  ) %>%
  kable_classic(
    full_width = FALSE,
    html_font = "Cambria"
  ) %>%
  kable_styling(
    bootstrap_options = c("striped","hover","condensed")
  )
Table 3.4: Comparación de métricas de los modelos estimados
r.squared adj.r.squared sigma statistic p.value df logLik AIC BIC deviance df.residual nobs
1 0.61 0.6 154.83 94.36 0 7 -2806.63 5631.25 5667.93 10236762.61 427 435
2 0.61 0.6 154.88 109.81 0 6 -2807.27 5630.53 5663.14 10266974.76 428 435
3 0.71 0.7 0.26 146.77 0 7 -20.17 58.35 95.02 27.94 427 435
stargazer(modelov1, modelov2, modelov3,
          type = "text",
          omit.stat = c("ser","f"),
          model.numbers = FALSE,
          object.names = TRUE,
          star.cutoffs = c(0.05, 0.01, 0.001))
## 
## ===============================================
##                     Dependent variable:        
##              ----------------------------------
##                     preciom        log(preciom)
##               modelov1   modelov2    modelov3  
## -----------------------------------------------
## areaconst     0.678***   0.693***    0.001***  
##               (0.053)    (0.051)     (0.0001)  
##                                                
## estrato4      78.753**   73.305**    0.346***  
##               (24.501)   (24.023)    (0.040)   
##                                                
## estrato5     145.691*** 138.446***   0.478***  
##               (22.751)   (21.823)    (0.038)   
##                                                
## estrato6     277.073*** 268.377***   0.675***  
##               (37.641)   (36.846)    (0.062)   
##                                                
## habitaciones   6.579                  0.021*   
##               (5.860)                (0.010)   
##                                                
## parqueaderos 23.826***  23.943***    0.045***  
##               (5.883)    (5.884)     (0.010)   
##                                                
## banios        20.019*   24.599***    0.040**   
##               (7.870)    (6.732)     (0.013)   
##                                                
## Constant       10.392     25.599     5.009***  
##               (27.569)   (24.018)    (0.046)   
##                                                
## -----------------------------------------------
## Observations    435        435         435     
## R2             0.607      0.606       0.706    
## Adjusted R2    0.601      0.601       0.702    
## ===============================================
## Note:             *p<0.05; **p<0.01; ***p<0.001

3.2.4 Validación supuestos

3.2.4.1 Supuestos

Para validar los supuestos del modelo de regresión 3 (el cual fue escogido como mejor para este escenario de casas en zona norte) se analizaron los gráficos de diagnóstico y diferentes pruebas estadísticas:

  • En el gráfico de residuos vs valores ajustados no se observa un patrón claramente definido, lo que sugiere que la relación entre las variables puede considerarse aproximadamente lineal, sin embargo, el gráfico Scale-Location muestra una ligera tendencia creciente en la dispersión de los residuos, lo que podría indicar la presencia de heterocedasticidad.

  • En cuanto a la normalidad de los residuos, el gráfico Q-Q muestra que los residuos siguen razonablemente la línea teórica en la parte central, aunque presentan desviaciones en los extremos, esto se confirma con la prueba Shapiro-Wilk, cuyo valor p es menor a 0.05, indicando que los residuos no siguen una distribución normal.

  • Respecto a la independencia de los errores, las pruebas Durbin-Watson y Breusch-Godfrey sugieren la posible presencia de autocorrelación en los residuos.

  • Finalmente, la prueba Breusch-Pagan indica la presencia de heterocedasticidad, ya que el valor p es menor a 0.05

Como posibles soluciones, se podría considerar el uso de errores estándar robustos, transformaciones adicionales de las variables o la inclusión de nuevas variables explicativas en el modelo.

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

shapiro.test(modelov3$residuals)
## 
##  Shapiro-Wilk normality test
## 
## data:  modelov3$residuals
## W = 0.98395, p-value = 9.635e-05
dwtest(modelov3)
## 
##  Durbin-Watson test
## 
## data:  modelov3
## DW = 1.644, p-value = 6.872e-05
## alternative hypothesis: true autocorrelation is greater than 0
bgtest(modelov3)
## 
##  Breusch-Godfrey test for serial correlation of order up to 1
## 
## data:  modelov3
## LM test = 13.77, df = 1, p-value = 0.0002066
bptest(modelov3)
## 
##  studentized Breusch-Pagan test
## 
## data:  modelov3
## BP = 54.953, df = 7, p-value = 1.524e-09

3.2.4.2 Validación cruzada

Para evaluar la capacidad predictiva del modelo, se realizó una división de la base de datos en un conjunto de entrenamiento (70%) y un conjunto de prueba (30%).

El modelo se estimó utilizando únicamente los datos de entrenamiento y posteriormente se realizaron predicciones sobre el conjunto de prueba, dado que el modelo se estimó utilizando el logaritmo del precio, las predicciones obtenidas fueron transformadas nuevamente a la escala original del precio mediante la función exponencial.

A partir de estas predicciones se calculó el Error Cuadrático Medio (RMSE), obteniendo un valor aproximado de 125.3 millones, lo que indica que, en promedio, las predicciones del modelo se desvían del valor real del precio de las viviendas en alrededor de 125 millones, este resultado sugiere que el modelo presenta una capacidad razonable de predicción, considerando la variabilidad presente en los precios de las viviendas.

# Separar datos en entrenamiento (70%) y test (30%)

set.seed(1)
train <- sample(1:nrow(vivienda1), nrow(vivienda1)*0.7)

modelo_train <- lm(
  log(preciom) ~ areaconst + estrato + habitaciones + parqueaderos + banios,
  data = vivienda1,
  subset = train
)

summary(modelo_train)
## 
## Call:
## lm(formula = log(preciom) ~ areaconst + estrato + habitaciones + 
##     parqueaderos + banios, data = vivienda1, subset = train)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.10018 -0.16895 -0.00705  0.16642  1.06593 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  4.9903495  0.0583981  85.454  < 2e-16 ***
## areaconst    0.0011384  0.0001065  10.691  < 2e-16 ***
## estrato4     0.3788897  0.0499980   7.578 4.53e-13 ***
## estrato5     0.5089876  0.0464825  10.950  < 2e-16 ***
## estrato6     0.6994153  0.0753151   9.287  < 2e-16 ***
## habitaciones 0.0137163  0.0121427   1.130 0.259562    
## parqueaderos 0.0420655  0.0119201   3.529 0.000484 ***
## banios       0.0511962  0.0164476   3.113 0.002035 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.269 on 296 degrees of freedom
## Multiple R-squared:  0.6944, Adjusted R-squared:  0.6871 
## F-statistic: 96.07 on 7 and 296 DF,  p-value: < 2.2e-16
# predicción en log
pred_log <- predict(modelo_train, newdata = vivienda1[-train, ])

# volver a escala original
pred <- exp(pred_log)

# calcular MSE
error <- mean((vivienda1$preciom[-train] - pred)^2)

RMSE <- sqrt(error)
RMSE
## [1] 125.2993

El gráfico muestra la relación entre los precios reales de las viviendas y los precios predichos por el modelo utilizando el conjunto de datos de prueba, donde la línea diagonal representa la predicción perfecta, es decir, el punto donde el valor predicho coincide exactamente con el valor real.

Se observa que la mayoría de los puntos se concentran alrededor de esta línea, lo que indica que el modelo logra capturar adecuadamente la tendencia general de los precios de las viviendas, sin embargo, también se identifican algunas observaciones más alejadas de la línea, especialmente en viviendas de mayor precio, lo que sugiere que el modelo presenta mayores errores de predicción en valores extremos.

En general, el patrón observado confirma que el modelo presenta una capacidad predictiva razonable, ya que la mayor parte de las predicciones se aproxima a los valores reales, aunque todavía existe cierta variabilidad que podría estar asociada a factores no incluidos en el modelo, como características específicas de ubicación o condiciones particulares de las viviendas.

# valores reales
real <- vivienda1$preciom[-train]

# valores predichos
pred <- exp(pred_log)

plot_ly(
  x = real,
  y = pred,
  type = "scatter",
  mode = "markers"
) %>%
layout(
  title = "Validación del modelo: Valores reales vs predichos",
  xaxis = list(title = "Precio real"),
  yaxis = list(title = "Precio predicho")
) %>%
add_trace(
  x = real,
  y = real,
  type = "scatter",
  mode = "lines",
  name = "Predicción perfecta"
)

3.2.5 Predicción de acuerdo a condiciones

Utilizando el modelo seleccionado, se realizó la predicción del precio para una vivienda con las características de la primera solicitud, correspondiente a una casa ubicada en la zona norte, con 200 m² de área construida, 4 habitaciones, 2 baños y 1 parqueadero, debido a que el estrato puede ser 4 o 5, se realizaron dos estimaciones considerando ambas posibilidades.

Los resultados indican que el precio estimado de la vivienda sería aproximadamente 327 millones si pertenece al estrato 4 y cerca de 373 millones si pertenece al estrato 5, estos valores se encuentran dentro del rango esperado para viviendas con estas características en la zona analizada. Al comparar estas estimaciones con el crédito preaprobado de 350 millones, se observa que una vivienda de estrato 4 estaría dentro del presupuesto disponible, mientras que una vivienda de estrato 5 podría superar ligeramente el monto del crédito, lo que sugiere que la empresa debería priorizar la búsqueda de viviendas de estrato 4 o negociar condiciones de financiamiento adicionales en caso de optar por estrato 5.

nueva_vivienda <- data.frame(
  areaconst = c(200,200),
  estrato = factor(c(4,5), levels = levels(vivienda1$estrato)),
  habitaciones = c(4,4),
  parqueaderos = c(1,1),
  banios = c(2,2)
)

casapred <- predict(modelov3, nueva_vivienda)

exp(casapred)
##        1        2 
## 327.0876 373.3845

3.2.6 Sugerencia potenciales ofertas

Con base en las características de la primera solicitud y el presupuesto disponible, se realizó un filtrado de la base de datos con el fin de identificar viviendas que cumplieran con los requisitos establecidos. Para ello se seleccionaron viviendas con área construida mayor o igual a 200 m², ubicadas en estrato 4, con al menos 4 habitaciones, mínimo 1 parqueadero y 2 baños, además de un precio menor o igual a 350 millones, correspondiente al crédito preaprobado.

Como resultado de este proceso se identificaron 12 viviendas que cumplen con estas condiciones, las cuales representan posibles opciones para la primera solicitud, sin embargo, se realizó un filtro geográfico adicional para las viviendas ubicadas en la zona norte, esto se implementó debido a que, durante el análisis exploratorio previo, se identificaron algunas inconsistencias entre la variable de zona reportada en la base de datos y las coordenadas geográficas de ciertas viviendas, pues en algunos casos, viviendas clasificadas como pertenecientes a la zona norte presentaban coordenadas que correspondían a otras áreas de la ciudad, dejando como resultado un total de 8 viviendas.

En la tabla se presentan las 8 ofertas disponibles, con el fin de ilustrar las alternativas que podrían ajustarse a las características y al presupuesto establecido.

Ofertas1 <- subset(vivienda1
                   , areaconst>=200 &
                     estrato==4 &
                     habitaciones>=4 &
                     parqueaderos>=1 &
                     banios>=2 &
                     preciom <= 350
                     )

cat("Número de ofertas:",nrow(Ofertas1))
## Número de ofertas: 12
norte_cali <- data.frame(
  lng = c(-76.55, -76.48, -76.48, -76.55),
  lat = c(3.45, 3.45, 3.52, 3.52)
)

Ofertas_norte <- Ofertas1 %>%
  dplyr::filter(
    latitud >= 3.45 & latitud <= 3.52 &
    longitud >= -76.55 & longitud <= -76.48
  )

cat("Número de ofertas filtradas:",nrow(Ofertas_norte))
## Número de ofertas filtradas: 8
Ofertas_norte%>%
  kbl(
    format = "html",
    caption = "Ofertas de casas de la zona norte"
  ) %>%
  kable_classic(
    full_width = FALSE,
    html_font = "Cambria")
Table 3.5: Ofertas de casas de la zona norte
id zona estrato preciom areaconst parqueaderos banios habitaciones tipo longitud latitud
4458 Zona Norte 4 315 270.0 2 4 4 Casa -76.53176 3.48780
937 Zona Norte 4 350 280.0 2 3 4 Casa -76.50603 3.46643
952 Zona Norte 4 330 275.0 2 3 5 Casa -76.50647 3.47516
1020 Zona Norte 4 230 250.0 2 3 5 Casa -76.50799 3.47424
1108 Zona Norte 4 330 260.0 1 3 4 Casa -76.51060 3.48108
1144 Zona Norte 4 320 200.0 2 4 4 Casa -76.51156 3.48029
2544 Zona Norte 4 340 264.5 2 4 4 Casa -76.52096 3.47665
1822 Zona Norte 4 340 295.0 2 2 4 Casa -76.51777 3.48060
map3 <- leaflet() %>%
  addTiles() %>%
  
  # polígono norte
  addPolygons(
    lng = norte_cali$lng,
    lat = norte_cali$lat,
    color = "blue",
    weight = 2,
    fillOpacity = 0.1,
    popup = "Zona Norte de Cali"
  ) %>%
  
  # viviendas
  addMarkers(
    data = Ofertas_norte,
    lng = ~longitud,
    lat = ~latitud,
    popup = ~paste(
      "ID:", id,
      "<br>Latitud:", latitud,
      "<br>Longitud:", longitud
    )
  ) %>%
  
  setView(lng = -76.52, lat = 3.48, zoom = 13) %>%
  
  addControl(
    "<h4>Viviendas ubicadas en el norte de Cali</h4>",
    position = "topright"
  )

map3

3.3 Caso 2: Apartamentos en el sur

3.3.1 Preparación datos

Se revisó la consistencia de la información del conjunto de datos en relación con las variables tipo de vivienda y zona, con el objetivo de realizar posteriormente el filtrado de la base de datos, a partir de esta revisión, se identificó que los registros relevantes corresponden a viviendas clasificadas como “Apartamento” ubicadas en la Zona Sur, una vez aplicado el filtro, se obtuvo un total de 2.787 casas de las 8.322 observaciones originales, lo que representa aproximadamente el 33,48 % del total de la base de datos bajo esta condición.

unique(vivienda$tipo) # revisión escritura tipo vivienda
unique(vivienda$zona) # revisión escritura zona

vivienda2 <- vivienda %>% 
  filter(tipo == "Apartamento" & zona == "Zona Sur") %>% 
  distinct() %>%  #eliminamos registros duplicados
  select(-c(piso, barrio)) # excluimos variables que no se utilizaran en el análisis

nrow(vivienda2)
nrow(vivienda2)/nrow(vivienda)

3.3.2 Analisis Exploratiorio

3.3.2.1 Limpieza

Considerando que el contexto del análisis de viviendas es dificil pensar que se venda alguna sin baños ni habitaciones, por ello aquellos registros con valor 0 fueron remplazados como null para darles un tratamiento adecuado.

Table 3.6: Variables con datos faltantes
Variable Registros CantidadNA PorcentajeNA
parqueaderos 2787 406 14.57%
habitaciones 2787 8 0.29%
banios 2787 6 0.22%
id 2787 0 0%
zona 2787 0 0%
estrato 2787 0 0%
preciom 2787 0 0%
areaconst 2787 0 0%
tipo 2787 0 0%
longitud 2787 0 0%
latitud 2787 0 0%

Para los datos de baños y habitaciones se decidió imputar por la mediana dado que esta distribución es asimetrica

vivienda2 <- vivienda2 %>%
  mutate(
    banios = ifelse(is.na(banios), median(banios, na.rm = TRUE), banios),
    habitaciones = ifelse(is.na(habitaciones), median(habitaciones, na.rm = TRUE), habitaciones)
  )

No obstante, por la falta de información y contexto no se tratará la variable piso, ni será considerada en el análisis posterior, además dada la necesidad de contar con un conjunto de datos completos y de calidad, se decide hacer omisión de aquellos registros con datos faltantes, resultando así un total de 2.381 viviendas de 2.787 filtradas inicialmente.

vivienda2 <- na.omit(vivienda2)

3.3.2.2 Mapa

3.3.2.2.1 Primeras viviendas

Inicialmente se presentan los tres primeros registros del conjunto de datos filtrado, con el fin de verificar la correcta estructura de la información y confirmar que las variables se encuentran correctamente registradas.

Adicionalmente, se construyó un mapa geográfico con los puntos correspondientes a las coordenadas (latitud y longitud) de las viviendas seleccionadas, con el objetivo de visualizar su distribución espacial dentro de la ciudad de Cali, allí se observa que no todos los puntos se ubican estrictamente dentro de la zona sur, ya que algunos registros aparecen en otras áreas de la ciudad. Esto puede deberse a varias razones, entre ellas:

  • Imprecisiones en la clasificación de la variable “zona” dentro de la base de datos.
  • Posibles errores de georreferenciación o captura de datos en el proceso de webscrapping.
  • El anunciante de la vivienda la referenció equivocamente.
# Mostramos los 3 primeros registros
head(vivienda2,3) %>%
  kbl(
    format = "html",
    caption = "Primeras tres casas de la zona norte"
  ) %>%
  kable_classic(
    full_width = FALSE,
    html_font = "Cambria")
Table 3.7: Primeras tres casas de la zona norte
id zona estrato preciom areaconst parqueaderos banios habitaciones tipo longitud latitud
5098 Zona Sur 4 290 96 1 2 3 Apartamento -76.53464 3.44987
698 Zona Sur 3 78 40 1 1 2 Apartamento -76.50100 3.40000
8199 Zona Sur 6 875 194 2 5 3 Apartamento -76.55700 3.45900
map4 <- leaflet(data = vivienda2[1:3, c("id","latitud","longitud")]) %>%
  addTiles() %>%
  addMarkers(
    lng = ~longitud,
    lat = ~latitud,
    popup = ~paste("ID:", id, "<br>Latitud:", latitud, "<br>Longitud:", longitud)
  )%>%
  addControl(
    "<h4>Ubicación de las primeras viviendas</h4>",
    position = "topright"
  ); map4
3.3.2.2.2 Todas las viviendas

Adicional se se construyó un mapa geográfico con todos los puntos correspondientes a las coordenadas (latitud y longitud) de las viviendas seleccionadas, con el objetivo de visualizar su distribución espacial dentro de la ciudad de Cali, donde se evidencia la persistencia de errores indicados anteriormente.

map5 <- leaflet(data = vivienda2[, c("id","latitud","longitud")]) %>%
  addTiles() %>%
  addMarkers(
    lng = ~longitud,
    lat = ~latitud,
    popup = ~paste("ID:", id, "<br>Latitud:", latitud, "<br>Longitud:", longitud)
  )%>%
  addControl(
    "<h4>Ubicación de todas las viviendas</h4>",
    position = "topright"
  );map5

3.3.2.3 Correlación

Con el fin de analizar la relación entre las variables relevantes del mercado inmobiliario, se calculó una matriz de correlación de Pearson utilizando las variables número de parqueaderos, número de baños, número de habitaciones, área construida y precio de la vivienda (en millones).

Los resultados muestran una correlación positiva entre todas las variables analizadas, destacándose especialmente la relación entre el precio de la vivienda y el área construida (0,74), lo que sugiere que viviendas con mayor área tienden a presentar precios más elevados, asimismo, se observa una relación moderada alta entre el precio y el número de baños (0,72) y entre el precio y el número de parqueaderos (0,69). Estas relaciones indican que las características físicas de la vivienda influyen de manera importante en la determinación del precio dentro del mercado de apartamentos ubicados en la zona sur.

Cabe resaltar que la correlación entre habitaciones y precio es positiva pero moderada (0,27), esto indica que, en general, las viviendas con mayor número de habitaciones tienden a tener precios más altos; sin embargo, el número de habitaciones no es el factor más determinante del precio.

matrix_cor2 <- cor(vivienda2[, c("parqueaderos","banios","habitaciones","areaconst","preciom")]
                  , use = "complete.obs", method = "pearson")

plot_ly(z = matrix_cor2, x = colnames(matrix_cor2), y = colnames(matrix_cor2), type = "heatmap")
corrplot(matrix_cor2, insig = "p-value", sig.level = 0.05,
         method = "shade", shade.col = NA,
         tl.col = "black",
         addCoef.col = "black", tl.srt = 45,
         order = "AOE", type = "lower", diag = FALSE, addshade = "all")   

3.3.2.4 Precio vs

3.3.2.4.1 Área

El gráfico de dispersión entre el área construida y el precio permite observar una relación positiva entre ambas variables, lo que sugiere que apartamentos con mayor área construida tienden a presentar precios más altos, además, se observa que la mayor concentración de observaciones se encuentra en apartamentos con áreas relativamente pequeñas o medianas, mientras que los apartamentos con áreas más grandes presentan una mayor dispersión en los precios, este comportamiento es consistente con el mercado inmobiliario, donde el tamaño de la propiedad suele ser uno de los principales determinantes del precio.

#Dispersión precio y area construida
plot_ly(
  data = vivienda2,
  x = ~areaconst,
  y = ~preciom,
  type = "scatter",
  mode = "markers"
) %>%
  layout(
    title = "Dispersión entre área construida y precio",
    xaxis = list(title = "Área construida"),
    yaxis = list(title = "Precio (millones)")
  )
3.3.2.4.2 Estrato

En general, se observa una tendencia creciente en los precios a medida que aumenta el estrato, lo cual es consistente con el comportamiento esperado del mercado inmobiliario.

Los apartamentos de estrato 3 presentan los precios más bajos y una menor dispersión en comparación con los demás estratos, a medida que se avanza hacia los estratos 4 y 5, se observa un aumento gradual tanto en el precio promedio como en la variabilidad de los valores, lo que sugiere una mayor heterogeneidad en las características de los apartamentos dentro de estos niveles socioeconómicos, por su parte, los apartamentos de estrato 6 presentan los precios más elevados y una mayor dispersión en comparación con los demás estratos, además, se identifican algunos valores atípicos con precios considerablemente altos, lo cual podría corresponder a apartamentos de lujo o propiedades con características particulares que incrementan su valor de mercado.

En conjunto, el gráfico evidencia que el estrato socioeconómico es un factor importante en la determinación del precio de los apartamentos, mostrando una relación positiva entre el nivel de estrato y el valor de las viviendas en la zona sur.

# precio según estrato
plot_ly(
  data = vivienda2,
  x = ~estrato,
  y = ~preciom,
  type = "box"
)%>%
  layout(
    title = "Distribución del precio de la vivienda según estrato",
    xaxis = list(title = "Estrato"),
    yaxis = list(title = "Precio (millones)")
  )
3.3.2.4.3 Habitaciones

En general, se observa una tendencia creciente en el precio a medida que aumenta el número de habitaciones, lo cual sugiere que apartamentos con mayor capacidad habitacional tienden a tener un mayor valor en el mercado.

Los apartamentos con una o dos habitaciones presentan precios relativamente más bajos y menor variabilidad, a partir de tres habitaciones, se observa un incremento tanto en el precio promedio como en la dispersión de los valores, lo que indica que los apartamentos con mayor número de habitaciones pueden presentar características adicionales como mayor área construida o mejores ubicaciones dentro de la zona sur, además, se identifican algunos valores atípicos, especialmente en apartamentos con tres o más habitaciones, cuyos precios alcanzan niveles considerablemente más altos, éstos casos podrían corresponder a apartamentos de mayor tamaño, ubicaciones privilegiadas o propiedades con características especiales dentro del mercado inmobiliario de la zona sur.

# precio según número de habitaciones
plot_ly(
  vivienda2,
  x = ~habitaciones,
  y = ~preciom,
  type = "box"
)%>%
  layout(
    title = "Distribución del precio de la vivienda según número de habitaciones",
    xaxis = list(title = "Número habitaciones"),
    yaxis = list(title = "Precio (millones)")
  )
3.3.2.4.4 Baños

En términos generales, se observa una relación positiva entre el número de baños y el precio de los apartamentos, lo que sugiere que aquellas viviendas con mayor número de baños tienden a presentar precios más altos.

Los apartamentos con uno o dos baños presentan precios relativamente más bajos y menor variabilidad en comparación con aquellos que cuentan con un mayor número de baños, a partir de tres o cuatro baños, se observa un incremento en el precio promedio y en la dispersión de los valores, lo cual puede estar asociado a apartamentos de mayor tamaño o con características adicionales. Por otra parte, se identifican algunos valores atípicos con precios considerablemente elevados, especialmente en apartamentos con mayor número de baños, lo que podría corresponder a propiedades de alto valor o apartamentos con características especiales dentro del mercado inmobiliario de la zona sur.

# precio según número de baños
plot_ly(
  vivienda2,
  x = ~banios,
  y = ~preciom,
  type = "box"
)%>%
  layout(
    title = "Distribución del precio de la vivienda según número de baños",
    xaxis = list(title = "Número baños"),
    yaxis = list(title = "Precio (millones)")
  )
3.3.2.4.5 Parqueaderos

En general, se observa una tendencia creciente en el precio a medida que aumenta el número de parqueaderos, lo que sugiere que esta característica representa una comodidad valorada dentro del mercado inmobiliario.

Los apartamentos con uno o dos parqueaderos presentan precios relativamente más bajos y una menor dispersión en comparación con aquellos que cuentan con un mayor número de espacios para estacionamiento, a partir de tres o cuatro parqueaderos, se observa un incremento tanto en el precio promedio como en la variabilidad de los valores, lo que podría estar asociado a apartamentos de mayor tamaño o ubicados en proyectos residenciales de mayor nivel, además, se identifican algunos valores atípicos con precios considerablemente elevados, lo que podría corresponder a apartamentos con características especiales o ubicados en zonas de mayor valorización dentro del sector sur de la ciudad.

# precio según número de parqueaderos
plot_ly(
  vivienda2,
  x = ~parqueaderos,
  y = ~preciom,
  type = "box"
)%>%
  layout(
    title = "Distribución del precio de la vivienda según número de parqueaderos",
    xaxis = list(title = "Número parqueaderos"),
    yaxis = list(title = "Precio (millones)")
  )

3.3.3 Estimación modelo regresión múltiple

3.3.3.1 Modelo 1

\[ \begin{align} \widehat{Precio}_i =\;& -25.29 + 1.29\,Areaconst_i + 30.42\,Estrato4_i \\ &+ 50.78\,Estrato5_i + 204.30\,Estrato6_i \\ &- 18.39\,Habitaciones_i + 61.75\,Parqueaderos_i + 42.40\,Baños_i \end{align} \]

El coeficiente asociado al área construida (1.29) indica que, manteniendo constantes las demás variables, un aumento de una unidad en el área construida incrementa el precio del apartamento en aproximadamente 1.29 millones, lo que evidencia que el tamaño del inmueble es uno de los principales determinantes de su valor.

En relación con el estrato socioeconómico, los coeficientes muestran que, en comparación con los apartamentos de estrato 3 (categoría base), los apartamentos de estrato 4 presentan un incremento aproximado de 30.42 millones en el precio, mientras que los de estrato 5 presentan un aumento de aproximadamente 50.78 millones, por su parte, los apartamentos de estrato 6 muestran un incremento considerable de aproximadamente 204.30 millones, lo que refleja la fuerte influencia del nivel socioeconómico en el valor de los inmuebles.

En cuanto a las características físicas, el número de parqueaderos (61.75) y baños (42.40) presenta un efecto positivo sobre el precio del apartamento, indicando que los inmuebles con mayor número de estas comodidades tienden a tener un mayor valor en el mercado. Por otro lado, el número de habitaciones presenta un coeficiente negativo (-18.39), lo que podría indicar que, manteniendo constante el área construida, un mayor número de habitaciones puede implicar espacios más pequeños o configuraciones internas diferentes que reducen ligeramente el precio del inmueble.

En términos de capacidad explicativa, el modelo presenta un coeficiente de determinación de 0,776, lo que indica que aproximadamente el 77.6% de la variabilidad del precio de los apartamentos en la zona sur es explicada por las variables incluidas en el modelo, lo que sugiere un buen nivel de ajuste del modelo a los datos.

vivienda2$estrato <- factor(vivienda2$estrato)

modelov4 <- lm(preciom ~ areaconst + estrato + habitaciones + parqueaderos + banios,
             data = vivienda2)

summary(modelov4)
## 
## Call:
## lm(formula = preciom ~ areaconst + estrato + habitaciones + parqueaderos + 
##     banios, data = vivienda2)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1061.56   -39.19     0.14    36.70   897.52 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -25.29343   13.09146  -1.932  0.05347 .  
## areaconst      1.28895    0.05116  25.192  < 2e-16 ***
## estrato4      30.42044    9.55508   3.184  0.00147 ** 
## estrato5      50.77828    9.61932   5.279 1.42e-07 ***
## estrato6     204.29744   11.17361  18.284  < 2e-16 ***
## habitaciones -18.39337    3.84005  -4.790 1.77e-06 ***
## parqueaderos  61.75392    3.80119  16.246  < 2e-16 ***
## banios        42.39940    3.27385  12.951  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 92.51 on 2373 degrees of freedom
## Multiple R-squared:  0.7762, Adjusted R-squared:  0.7755 
## F-statistic:  1176 on 7 and 2373 DF,  p-value: < 2.2e-16

3.3.3.2 Modelo 2

\[ \begin{align} \widehat{\log(Precio)}_i =\;& 4.486 + 0.00251\,Areaconst_i + 0.2708\,Estrato4_i \\ &+ 0.4480\,Estrato5_i + 0.7794\,Estrato6_i \\ &- 0.0106\,Habitaciones_i + 0.13397\,Parqueaderos_i + 0.11660\,Baños_i \end{align} \] En este modelo la variable dependiente es el logaritmo del precio, por lo que los coeficientes pueden interpretarse aproximadamente como cambios porcentuales en el precio del apartamento ante variaciones en las variables explicativas.

El coeficiente del área construida (0.00251) indica que, manteniendo constantes las demás variables, un incremento de una unidad en el área construida aumenta el precio del apartamento aproximadamente en 0.25%, lo que confirma que el tamaño del inmueble es un factor importante en la determinación de su valor.

En cuanto al estrato socioeconómico, los resultados muestran que, en comparación con los apartamentos de estrato 3, los apartamentos de estrato 4 presentan precios aproximadamente 27% mayores, mientras que los de estrato 5 tienen precios cerca de 44.8% superiores, y los de estrato 6 alcanzan precios aproximadamente 77.9% mayores, esto evidencia la fuerte influencia del nivel socioeconómico en el valor de los apartamentos.

Respecto a las características físicas del inmueble, el número de parqueaderos (0.1339) y baños (0.1166) presenta efectos positivos sobre el precio, indicando que un incremento en estas características aumenta el precio del apartamento aproximadamente en 13.4% y 11.7% respectivamente, por otro lado, el número de habitaciones presenta un coeficiente negativo (-0.0106) y no resulta estadísticamente significativo, lo que sugiere que su efecto sobre el precio es limitado una vez se controlan otras variables como el área construida.

En términos de capacidad explicativa, el modelo presenta un coeficiente de determinación 0,7927, lo que indica que aproximadamente el 79.3% de la variabilidad del logaritmo del precio de los apartamentos en la zona sur es explicada por las variables incluidas en el modelo, lo que sugiere un buen ajuste del modelo a los datos.

modelov5 <- lm(log(preciom) ~ areaconst + estrato + habitaciones + parqueaderos + banios,
               data = vivienda2)

summary(modelov5)
## 
## Call:
## lm(formula = log(preciom) ~ areaconst + estrato + habitaciones + 
##     parqueaderos + banios, data = vivienda2)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -2.02509 -0.14237  0.00634  0.15024  0.88869 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   4.486000   0.031475 142.524   <2e-16 ***
## areaconst     0.002510   0.000123  20.406   <2e-16 ***
## estrato4      0.270844   0.022973  11.790   <2e-16 ***
## estrato5      0.447993   0.023127  19.371   <2e-16 ***
## estrato6      0.779382   0.026864  29.012   <2e-16 ***
## habitaciones -0.010565   0.009232  -1.144    0.253    
## parqueaderos  0.133971   0.009139  14.659   <2e-16 ***
## banios        0.116601   0.007871  14.814   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.2224 on 2373 degrees of freedom
## Multiple R-squared:  0.7927, Adjusted R-squared:  0.7921 
## F-statistic:  1296 on 7 and 2373 DF,  p-value: < 2.2e-16

3.3.3.3 Modelo 3

\[ \begin{align} \widehat{\log(Precio)}_i =\;& 4.4633 + 0.2720\,Estrato4_i + 0.4494\,Estrato5_i \\ &+ 0.7839\,Estrato6_i + 0.00249\,Areaconst_i \\ &+ 0.11297\,Baños_i + 0.13425\,Parqueaderos_i \end{align} \] En este modelo la variable dependiente es el logaritmo del precio del apartamento, por lo que los coeficientes pueden interpretarse aproximadamente como variaciones porcentuales en el precio ante cambios en las variables explicativas.

El coeficiente asociado al área construida (0.00249) indica que, manteniendo constantes las demás variables, un aumento de una unidad en el área construida incrementa el precio del apartamento aproximadamente en 0.25%.

En relación con el estrato socioeconómico, los resultados muestran que, en comparación con los apartamentos de estrato 3 (categoría base), los apartamentos de estrato 4 presentan precios aproximadamente 27.2% mayores, mientras que los de estrato 5 presentan precios cerca de 44.9% superiores, y los de estrato 6 tienen precios aproximadamente 78.4% mayores, ésto evidencia la fuerte influencia del nivel socioeconómico en el valor de los apartamentos en la zona sur.

Asimismo, el número de baños (0.1129) y parqueaderos (0.1342) presenta efectos positivos sobre el precio, lo que indica que un incremento en estas características aumenta el precio del apartamento aproximadamente en 11.3% y 13.4% respectivamente.

En términos de capacidad explicativa, el modelo presenta un coeficiente de determinación 0,7926, lo que indica que aproximadamente el 79.3% de la variabilidad del logaritmo del precio de los apartamentos es explicada por las variables incluidas en el modelo, evidenciando un buen ajuste del modelo a los datos.

# se define el modelo  nulo  y= b0
modelo_b1<- lm(log(preciom) ~ 1, data=vivienda2)

# Se aplica el proceso forward stepwise regression
modelov6 <- step(modelo_b1, direction='forward', scope=formula(modelov5), trace=0)

# Visualización de los resultados 
summary(modelov6)
## 
## Call:
## lm(formula = log(preciom) ~ estrato + areaconst + banios + parqueaderos, 
##     data = vivienda2)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -2.00581 -0.14281  0.00703  0.15339  0.88872 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  4.4633377  0.0244653  182.44   <2e-16 ***
## estrato4     0.2720247  0.0229512   11.85   <2e-16 ***
## estrato5     0.4493749  0.0230973   19.46   <2e-16 ***
## estrato6     0.7838603  0.0265794   29.49   <2e-16 ***
## areaconst    0.0024897  0.0001217   20.45   <2e-16 ***
## banios       0.1129680  0.0072031   15.68   <2e-16 ***
## parqueaderos 0.1342459  0.0091365   14.69   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.2224 on 2374 degrees of freedom
## Multiple R-squared:  0.7926, Adjusted R-squared:  0.7921 
## F-statistic:  1512 on 6 and 2374 DF,  p-value: < 2.2e-16

3.3.3.4 Comparación y elección

La tabla presenta una comparación de las principales métricas de ajuste para los modelos estimados en el caso de apartamentos ubicados en la zona sur.

  • El modelo 4, estimado con el precio en niveles, presenta un coeficiente de determinación cercano a 0.78, lo que indica que aproximadamente el 78% de la variabilidad del precio de los apartamentos es explicada por las variables incluidas en el modelo.
  • Los modelos 5 y 6, que utilizan el logaritmo del precio como variable dependiente, presentan un ajuste ligeramente superior con valores de R cuadrado cercanos a 0.79, lo que sugiere que la transformación logarítmica mejora la capacidad explicativa del modelo.

Adicionalmente, al comparar los criterios de información AIC y BIC, se observa que el modelo 6 presenta los valores más bajos, lo que indica un mejor balance entre capacidad explicativa y simplicidad del modelo. Este modelo, obtenido mediante el procedimiento forward stepwise, elimina la variable habitaciones sin afectar significativamente el ajuste del modelo.

En conjunto, estos resultados sugieren que el modelo 6 representa la mejor especificación para explicar el precio de los apartamentos en la zona sur, ya que mantiene un alto poder explicativo utilizando un conjunto más parsimonioso de variables.

g4 <- glance(modelov4)
g5 <- glance(modelov5)
g6 <- glance(modelov6)

tabla_modelos <- rbind(g4, g5, g6)
rownames(tabla_modelos) <- c("Modelo 1", "Modelo 2", "Modelo 3")

tabla_modelos %>%
  kbl(
    format = "html",
    digits = 2,
    caption = "Comparación de métricas de los modelos estimados",
    row.names = TRUE
  ) %>%
  kable_classic(
    full_width = FALSE,
    html_font = "Cambria"
  ) %>%
  kable_styling(
    bootstrap_options = c("striped","hover","condensed")
  )
Table 3.8: Comparación de métricas de los modelos estimados
r.squared adj.r.squared sigma statistic p.value df logLik AIC BIC deviance df.residual nobs
1 0.78 0.78 92.51 1175.75 0 7 -14153.93 28325.85 28377.83 20306640.40 2373 2381
2 0.79 0.79 0.22 1296.36 0 7 204.73 -391.45 -339.47 117.38 2373 2381
3 0.79 0.79 0.22 1512.01 0 6 204.07 -392.14 -345.93 117.45 2374 2381
stargazer(modelov4, modelov5, modelov6,
          type = "text",
          omit.stat = c("ser","f"),
          model.numbers = FALSE,
          object.names = TRUE,
          star.cutoffs = c(0.05, 0.01, 0.001))
## 
## ============================================
##                    Dependent variable:      
##              -------------------------------
##                preciom      log(preciom)    
##               modelov4   modelov5  modelov6 
## --------------------------------------------
## areaconst     1.289***   0.003***  0.002*** 
##                (0.051)   (0.0001)  (0.0001) 
##                                             
## estrato4      30.420**   0.271***  0.272*** 
##                (9.555)    (0.023)   (0.023) 
##                                             
## estrato5      50.778***  0.448***  0.449*** 
##                (9.619)    (0.023)   (0.023) 
##                                             
## estrato6     204.297***  0.779***  0.784*** 
##               (11.174)    (0.027)   (0.027) 
##                                             
## habitaciones -18.393***   -0.011            
##                (3.840)    (0.009)           
##                                             
## parqueaderos  61.754***  0.134***  0.134*** 
##                (3.801)    (0.009)   (0.009) 
##                                             
## banios        42.399***  0.117***  0.113*** 
##                (3.274)    (0.008)   (0.007) 
##                                             
## Constant       -25.293   4.486***  4.463*** 
##               (13.091)    (0.031)   (0.024) 
##                                             
## --------------------------------------------
## Observations    2,381      2,381     2,381  
## R2              0.776      0.793     0.793  
## Adjusted R2     0.776      0.792     0.792  
## ============================================
## Note:          *p<0.05; **p<0.01; ***p<0.001

3.3.4 Validación supuestos

3.3.4.1 Supuestos

Para evaluar la validez del modelo estimado se analizaron los gráficos de diagnóstico y varias pruebas estadísticas:

  • El gráfico de residuos vs valores ajustados muestra que los residuos se distribuyen alrededor de cero sin un patrón claramente definido, lo que sugiere que la relación entre las variables puede considerarse aproximadamente lineal, sin embargo, el gráfico Scale-Location evidencia una ligera tendencia en la dispersión de los residuos, lo que podría indicar la presencia de heterocedasticidad.

  • En cuanto a la normalidad de los residuos, el gráfico Q-Q muestra desviaciones en los extremos respecto a la línea teórica, esto se confirma con la prueba Shapiro-Wilk, cuyo valor p es menor que 0.05, lo que indica que los residuos no siguen una distribución normal.

  • Respecto a la independencia de los errores, las pruebas Durbin-Watson y Breusch-Godfrey presentan valores p muy pequeños, sugiriendo la posible presencia de autocorrelación en los residuos.

  • Finalmente, la prueba Breusch-Pagan indica evidencia de heterocedasticidad, ya que el valor p es menor que 0.05. Aunque el modelo presenta un buen nivel de ajuste, estos resultados sugieren que algunos supuestos del modelo clásico no se cumplen completamente.

Como posibles mejoras, se podría considerar el uso de errores estándar robustos, transformaciones adicionales de variables o la inclusión de nuevas variables explicativas que permitan capturar mejor la variabilidad del precio de los apartamentos.

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

shapiro.test(modelov6$residuals)
## 
##  Shapiro-Wilk normality test
## 
## data:  modelov6$residuals
## W = 0.97343, p-value < 2.2e-16
dwtest(modelov6)
## 
##  Durbin-Watson test
## 
## data:  modelov6
## DW = 1.5974, p-value < 2.2e-16
## alternative hypothesis: true autocorrelation is greater than 0
bgtest(modelov6)
## 
##  Breusch-Godfrey test for serial correlation of order up to 1
## 
## data:  modelov6
## LM test = 97.181, df = 1, p-value < 2.2e-16
bptest(modelov6)
## 
##  studentized Breusch-Pagan test
## 
## data:  modelov6
## BP = 657.93, df = 6, p-value < 2.2e-16

3.3.4.2 Validación cruzada

Para evaluar la capacidad predictiva del modelo seleccionado para los apartamentos en la zona sur, se dividió la base de datos en un conjunto de entrenamiento (70%) y un conjunto de prueba (30%). El modelo fue estimado utilizando únicamente el conjunto de entrenamiento, considerando como variables explicativas el área construida, el estrato socioeconómico, el número de parqueaderos y el número de baños, mientras que la variable dependiente fue el logaritmo del precio.

Posteriormente, se realizaron predicciones sobre el conjunto de prueba, dado que el modelo fue estimado en términos logarítmicos, las predicciones se transformaron nuevamente a la escala original del precio mediante la función exponencial, a partir de estas predicciones se calculó el Error Cuadrático Medio (RMSE), obteniendo un valor aproximado de 86.55 millones, este resultado indica que, en promedio, las predicciones del modelo difieren del precio real de los apartamentos en aproximadamente 86 millones, lo que sugiere que el modelo presenta una capacidad predictiva adecuada para estimar el precio de los apartamentos en la zona sur.

# Separar datos en entrenamiento (70%) y test (30%)

set.seed(1)
train1 <- sample(1:nrow(vivienda2), nrow(vivienda2)*0.7)

modelo_train1 <- lm(
  log(preciom) ~ areaconst + estrato + parqueaderos + banios,
  data = vivienda2,
  subset = train1
)

summary(modelo_train1)
## 
## Call:
## lm(formula = log(preciom) ~ areaconst + estrato + parqueaderos + 
##     banios, data = vivienda2, subset = train1)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.89842 -0.14602  0.00376  0.15582  0.89781 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  4.4763027  0.0299597 149.411   <2e-16 ***
## areaconst    0.0023677  0.0001406  16.843   <2e-16 ***
## estrato4     0.2605855  0.0280049   9.305   <2e-16 ***
## estrato5     0.4393837  0.0281101  15.631   <2e-16 ***
## estrato6     0.7628762  0.0319117  23.906   <2e-16 ***
## parqueaderos 0.1539836  0.0113282  13.593   <2e-16 ***
## banios       0.1074847  0.0085958  12.504   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.2208 on 1659 degrees of freedom
## Multiple R-squared:  0.7974, Adjusted R-squared:  0.7967 
## F-statistic:  1088 on 6 and 1659 DF,  p-value: < 2.2e-16
# predicción en log
pred_log1 <- predict(modelo_train1, newdata = vivienda2[-train1, ])

# volver a escala original
pred1 <- exp(pred_log1)

# calcular MSE
error1 <- mean((vivienda2$preciom[-train1] - pred1)^2)

RMSE1 <- sqrt(error1)
RMSE1
## [1] 86.5521

3.3.5 Predicción de acuerdo a condiciones

Utilizando el modelo seleccionado para los apartamentos en la zona sur, se realizó la predicción del precio para una vivienda con las características de la segunda solicitud, correspondiente a un apartamento con 300 m² de área construida, 5 habitaciones, 3 baños y 3 parqueaderos, debido a que el estrato puede ser 5 o 6, se realizaron dos estimaciones considerando ambas posibilidades.

Los resultados indican que el precio estimado del apartamento sería aproximadamente 602.6 millones si pertenece al estrato 5 y cerca de 842.0 millones si pertenece al estrato 6, éstos valores se encuentran dentro del rango esperado para apartamentos con estas características en la zona sur de la ciudad.

Al comparar estas estimaciones con el crédito preaprobado de 850 millones, se observa que ambas alternativas se encuentran dentro del presupuesto disponible, aunque el apartamento de estrato 6 se aproxima más al límite del crédito, por lo tanto, el modelo sugiere que la empresa podría considerar opciones tanto en estrato 5 como en estrato 6, dependiendo de las características específicas del inmueble y las condiciones del mercado.

nueva_vivienda2 <- data.frame(
  areaconst = c(300,300),
  estrato = factor(c(5,6), levels = levels(vivienda2$estrato)),
  habitaciones = c(5,5),
  parqueaderos = c(3,3),
  banios = c(3,3)
)

casapred2 <- predict(modelov6, nueva_vivienda2)

exp(casapred2)
##        1        2 
## 602.6039 841.9709

3.3.6 Sugerencia potenciales ofertas

Con base en las características de la segunda solicitud y el presupuesto disponible, se realizó un filtrado de la base de datos para identificar apartamentos ubicados en la zona sur que cumplieran con las condiciones establecidas. Para ello se seleccionaron viviendas con área construida mayor o igual a 300 metros cuadrados, estrato 5 o 6, al menos 5 habitaciones, mínimo 3 parqueaderos y 3 baños, además de un precio menor o igual a 850 millones, correspondiente al crédito preaprobado.

Como resultado de este proceso se identificaron dos apartamentos que cumplen con estas condiciones, los cuales representan posibles opciones para la segunda solicitud, los precios de estas ofertas se encuentran dentro del rango estimado por el modelo de predicción, lo que sugiere que son alternativas consistentes con las características y el presupuesto definido para este escenario.

Estos apartamentos podrían ser considerados como ofertas potenciales para la empresa, sujeto a la evaluación de otros factores como ubicación específica, estado del inmueble y condiciones del mercado.

Ofertas2 <- subset(vivienda2,
                   areaconst >= 300 &
                    estrato %in% c(5,6) &
                   habitaciones >= 5 &
                   parqueaderos >= 3 &
                   banios >= 3 &
                   preciom <= 850
)

cat("Número de ofertas:", nrow(Ofertas2))
## Número de ofertas: 2
sur_cali <- data.frame(
  lng = c(-76.57, -76.48, -76.48, -76.57),
  lat = c(3.34, 3.34, 3.45, 3.45)
)

Ofertas_sur <- Ofertas2 %>%
  dplyr::filter(
    latitud >= 3.34 & latitud <= 3.45 &
    longitud >= -76.57 & longitud <= -76.48
  )

cat("Número de ofertas filtradas:", nrow(Ofertas_sur))
## Número de ofertas filtradas: 2
Ofertas_sur %>%
  kbl(
    format = "html",
    caption = "Ofertas de apartamentos en la zona sur"
  ) %>%
  kable_classic(
    full_width = FALSE,
    html_font = "Cambria"
  )
Table 3.9: Ofertas de apartamentos en la zona sur
id zona estrato preciom areaconst parqueaderos banios habitaciones tipo longitud latitud
7182 Zona Sur 5 730 573 3 8 5 Apartamento -76.548 3.408
7512 Zona Sur 5 670 300 3 5 6 Apartamento -76.550 3.409
map5 <- leaflet() %>%
  addTiles() %>%
  
  # polígono sur
  addPolygons(
    lng = sur_cali$lng,
    lat = sur_cali$lat,
    color = "red",
    weight = 2,
    fillOpacity = 0.1,
    popup = "Zona Sur de Cali"
  ) %>%
  
  # apartamentos
  addMarkers(
    data = Ofertas_sur,
    lng = ~longitud,
    lat = ~latitud,
    popup = ~paste(
      "ID:", id,
      "<br>Latitud:", latitud,
      "<br>Longitud:", longitud
    )
  ) %>%
  
  setView(lng = -76.52, lat = 3.40, zoom = 13) %>%
  
  addControl(
    "<h4>Apartamentos ubicados en el sur de Cali</h4>",
    position = "topright"
  )

map5

4 Informe Ejecutivo

Señores C&A

En respuesta a la solicitud recibida por parte de una compañía internacional interesada en adquirir dos viviendas para la reubicación de sus empleados en la ciudad de Cali, se realizó un análisis del mercado inmobiliario con el fin de identificar alternativas que cumplan con las condiciones establecidas por el cliente. Este estudio se desarrolló utilizando información de ofertas de vivienda disponibles en la ciudad, considerando variables relevantes como el área construida, el estrato socioeconómico, el número de habitaciones, baños y parqueaderos, así como la ubicación de los inmuebles.

El análisis se enfocó en dos segmentos específicos del mercado inmobiliario, el primero corresponde a casas ubicadas en la zona norte de la ciudad, mientras que el segundo se centra en apartamentos ubicados en la zona sur, de acuerdo con las preferencias indicadas en la solicitud, para cada uno de estos segmentos se realizó un proceso de depuración y segmentación de los datos con el objetivo de garantizar que las viviendas analizadas correspondieran efectivamente a las zonas geográficas de interés. Posteriormente, se aplicaron herramientas de análisis estadístico para estimar el comportamiento del precio de las viviendas en función de sus principales características, a partir de estos modelos fue posible generar estimaciones de precio para viviendas con las condiciones solicitadas y, con base en dichas estimaciones y el presupuesto disponible, identificar ofertas potenciales dentro del mercado actual.

Los resultados obtenidos permiten presentar a C&A un conjunto de alternativas de vivienda que cumplen con las características solicitadas por el cliente y que se ajustan a los rangos de precio estimados. Estas opciones constituyen una base de referencia para apoyar el proceso de selección final de las propiedades que podrían ser recomendadas a la compañía internacional interesada en establecer a sus empleados en la ciudad.

4.1 Zonas

La selección de viviendas se realizó considerando las características específicas de cada zona de la ciudad de Cali y las preferencias establecidas en la solicitud del cliente:

  • Para el primer caso se analizaron casas ubicadas en la zona norte, un sector reconocido por su desarrollo residencial, buena conectividad y disponibilidad de viviendas unifamiliares con mayores áreas construidas, en este segmento se priorizaron inmuebles que cumplieran con las condiciones de viviendas con al menos 200 m² de área construida, mínimo 4 habitaciones, al menos 2 baños y 1 parqueadero, ubicadas en estratos 4 o 5. Adicionalmente, se tuvo en cuenta que el presupuesto disponible para esta vivienda es de hasta 350 millones, correspondiente al crédito preaprobado indicado por el cliente.

  • Para el segundo caso se evaluaron apartamentos ubicados en la zona sur de la ciudad, un sector que presenta una mayor oferta de proyectos residenciales verticales y donde es común encontrar viviendas con características modernas y acceso a diferentes servicios urbanos, en este caso se aplicaron criterios de filtrado acordes con las condiciones solicitadas por el cliente, tales como con un área construida mínima de 300 m², al menos 5 habitaciones, mínimo 3 baños y 3 parqueaderos, ubicados en estratos 5 o 6. En este escenario, el cliente cuenta con un crédito preaprobado de hasta 850 millones, por lo que únicamente se consideraron ofertas dentro de este rango de precio.

En ambos casos se incorporó un proceso de verificación geográfica de las viviendas mediante sus coordenadas, con el fin de asegurar que las ofertas analizadas correspondieran efectivamente a las zonas definidas, este procedimiento permitió reducir posibles inconsistencias en la clasificación de las viviendas y asegurar que las recomendaciones finales se basaran únicamente en inmuebles localizados dentro de las áreas de interés establecidas por el cliente.

4.2 Evaluación precios (modelo regresión múltiple)

Con el fin de estimar el valor de las viviendas que cumplen con las características solicitadas por el cliente, se utilizaron los modelos de regresión estimados para cada uno de los segmentos analizados,estos modelos permiten predecir el precio de una vivienda a partir de variables relevantes como el área construida, el estrato socioeconómico, el número de baños y el número de parqueaderos, variables que demostraron tener una relación significativa con el comportamiento del precio en el mercado inmobiliario de la ciudad.

  • Para el primer escenario, correspondiente a una casa ubicada en la zona norte con 200 m² de área construida, 4 habitaciones, 2 baños y 1 parqueadero, se estimó el precio considerando que el inmueble puede pertenecer a estrato 4 o estrato 5, allí los resultados del modelo indican que el precio estimado se ubica aproximadamente entre 327 millones y 373 millones, dependiendo del estrato del inmueble.

  • En el segundo escenario, enfocado en un apartamento ubicado en la zona sur con 300 m² de área construida, 5 habitaciones, 3 baños y 3 parqueaderos, también se realizaron estimaciones considerando que el inmueble puede pertenecer a estrato 5 o estrato 6, en este caso, el modelo estima un precio aproximado de 603 millones para estrato 5 y 842 millones para estrato 6.

Estos resultados permiten establecer un rango esperado de precios para viviendas con las características solicitadas, lo cual facilita la identificación de ofertas dentro del mercado que se ajusten tanto a las condiciones del cliente como al presupuesto disponible en cada caso.

4.3 Mejores Ofertas

A partir de las predicciones obtenidas mediante los modelos estimados y del proceso de filtrado de la base de datos, se identificaron las viviendas que mejor se ajustan a las condiciones establecidas por el cliente en cada uno de los escenarios analizados, este proceso consideró simultáneamente las características físicas del inmueble, su ubicación geográfica y el presupuesto disponible, con el objetivo de presentar alternativas viables dentro del mercado actual.

Las tablas presentadas a continuación muestran el conjunto de viviendas que cumplen con los criterios definidos para cada escenario, incluyendo información relevante sobre su ubicación, características físicas y precio, lo cual facilita su evaluación como posibles alternativas para la selección final por parte del cliente.

Ofertas_norte%>%
  kbl(
    format = "html",
    caption = "Ofertas de casas de la zona norte"
  ) %>%
  kable_classic(
    full_width = FALSE,
    html_font = "Cambria")
Table 4.1: Ofertas de casas de la zona norte
id zona estrato preciom areaconst parqueaderos banios habitaciones tipo longitud latitud
4458 Zona Norte 4 315 270.0 2 4 4 Casa -76.53176 3.48780
937 Zona Norte 4 350 280.0 2 3 4 Casa -76.50603 3.46643
952 Zona Norte 4 330 275.0 2 3 5 Casa -76.50647 3.47516
1020 Zona Norte 4 230 250.0 2 3 5 Casa -76.50799 3.47424
1108 Zona Norte 4 330 260.0 1 3 4 Casa -76.51060 3.48108
1144 Zona Norte 4 320 200.0 2 4 4 Casa -76.51156 3.48029
2544 Zona Norte 4 340 264.5 2 4 4 Casa -76.52096 3.47665
1822 Zona Norte 4 340 295.0 2 2 4 Casa -76.51777 3.48060
Ofertas_sur %>%
  kbl(
    format = "html",
    caption = "Ofertas de apartamentos en la zona sur"
  ) %>%
  kable_classic(
    full_width = FALSE,
    html_font = "Cambria"
  )
Table 4.1: Ofertas de apartamentos en la zona sur
id zona estrato preciom areaconst parqueaderos banios habitaciones tipo longitud latitud
7182 Zona Sur 5 730 573 3 8 5 Apartamento -76.548 3.408
7512 Zona Sur 5 670 300 3 5 6 Apartamento -76.550 3.409
map_ofertas <- leaflet() %>%
  addTiles() %>%
  
  # Casas zona norte (azul)
  addCircleMarkers(
    data = Ofertas_norte,
    lng = ~longitud,
    lat = ~latitud,
    color = "blue",
    radius = 6,
    stroke = FALSE,
    fillOpacity = 0.8,
    popup = ~paste(
      "<b>Casa - Zona Norte</b>",
      "<br>ID:", id,
      "<br>Precio:", preciom,
      "<br>Área:", areaconst
    )
  ) %>%
  
  # Apartamentos zona sur (rojo)
  addCircleMarkers(
    data = Ofertas_sur,
    lng = ~longitud,
    lat = ~latitud,
    color = "red",
    radius = 6,
    stroke = FALSE,
    fillOpacity = 0.8,
    popup = ~paste(
      "<b>Apartamento - Zona Sur</b>",
      "<br>ID:", id,
      "<br>Precio:", preciom,
      "<br>Área:", areaconst
    )
  ) %>%
  
  addLegend(
    position = "bottomright",
    colors = c("blue","red"),
    labels = c("Casas Zona Norte","Apartamentos Zona Sur"),
    title = "Ofertas seleccionadas"
  ) %>%
  
  setView(lng = -76.52, lat = 3.45, zoom = 12)

map_ofertas

4.4 Conclusiones

A partir del análisis realizado sobre la base de datos de viviendas en la ciudad de Cali, fue posible identificar patrones relevantes en el comportamiento del precio de los inmuebles y su relación con variables como el área construida, el estrato socioeconómico, el número de baños y el número de parqueaderos. Los modelos de regresión estimados permitieron explicar una proporción importante de la variabilidad del precio de las viviendas y generar estimaciones consistentes con las características solicitadas por el cliente.

  • En el caso de las casas ubicadas en la zona norte, el modelo estimado permitió establecer un rango esperado de precios para viviendas con las características requeridas, como resultado este análisis identificó ocho ofertas potenciales que cumplen con las condiciones definidas y se ajustan al presupuesto máximo de 350 millones, lo cual evidencia que el mercado actual ofrece varias alternativas viables dentro de este segmento.

  • Para el caso de los apartamentos ubicados en la zona sur, el modelo permitió estimar el precio esperado de viviendas con las características solicitadas, identificando dos ofertas disponibles que cumplen con los requisitos establecidos y se encuentran dentro del presupuesto máximo de 850 millones, estas alternativas representan opciones adecuadas dentro del mercado inmobiliario para atender la segunda solicitud realizada a la empresa C&A.

En general, los resultados obtenidos permiten concluir que es posible identificar viviendas que se ajusten a las condiciones planteadas por el cliente dentro del mercado actual, no obstante, se recomienda complementar este análisis con una evaluación cualitativa de las propiedades seleccionadas, considerando factores adicionales como el estado del inmueble, el entorno urbano, la accesibilidad a servicios y las condiciones específicas de negociación, de esta manera, C&A podrá ofrecer a su cliente una recomendación integral que facilite la selección final de las viviendas más adecuadas para cada uno de los casos analizados.