INFORME



Resumen Ejecutivo

En respuesta a una solicitud específica, nuestra firma inmobiliaria ha llevado a cabo un análisis detallado de dos casos particulares en el mercado de bienes raíces de Cali. El objetivo primordial consiste en proporcionar cotizaciones para viviendas que se ajusten a las necesidades y requisitos del cliente. Para ello, se han considerado ciertas características clave, incluyendo el tipo de propiedad, el área construida, el número de parqueaderos, la cantidad de baños, el estrato socioeconómico y la ubicación geográfica.

Detalles de los Casos

Caso 1: Cotización de Viviendas

  • Tipo de Propiedad: Casa
  • Área Construida: 200 metros cuadrados
  • Parqueaderos: 1
  • Habitaciones: 4
  • Baños: 2
  • Estrato Socioeconómico: 4 o 5
  • Zona: Norte de Cali
  • Crédito Preaprobado: 350 millones de pesos

Resultados del Análisis

Para el primer caso, se aplicó el Modelo de Regresión Lineal Múltiple (RLM), cuya descripción detallada se presenta en el Anexo 2. Los resultados del análisis arrojaron las siguientes cotizaciones:

  1. Casa de Estrato 4: Precio de cotización: 328.6 millones de pesos.
  2. Casa de Estrato 5: Precio de cotización: 367.8 millones de pesos.

Es importante destacar que ambas cotizaciones se encuentran por debajo del crédito preaprobado por el banco y cumplen con todas las condiciones requeridas por el cliente.

Recomendaciones y Siguientes Pasos

Dado que las cotizaciones están por debajo del monto del crédito preaprobado, se procede a la siguiente etapa del análisis, que implica la identificación de las ofertas disponibles en el mercado que se ajusten a las restricciones específicas del cliente. A continuación, se presentan las cinco opciones más atractivas, considerando las preferencias y necesidades del cliente, así como los parámetros mencionados anteriormente. Cada una de estas opciones será presentada al cliente para su revisión y consideración. Además, nuestra firma inmobiliaria estará disponible para brindar asesoramiento adicional y facilitar el proceso de adquisición de la propiedad seleccionada.

Para detalles adicionales, por favor consulte el Anexo 2 para obtener información sobre el Modelo de Regresión Lineal Múltiple utilizado en este análisis.


id zona piso estrato preciom areaconst parqueaderos banios habitaciones tipo barrio longitud latitud
4458 Zona Norte 02 4 315 270 2 4 4 Casa el bosque -76.53176 3.48780
1009 Zona Norte NA 5 250 243 1 4 5 Casa el bosque -76.50755 3.47838
1020 Zona Norte 02 4 230 250 2 3 5 Casa la merced -76.50799 3.47424
1887 Zona Norte 01 5 340 203 2 3 4 Casa vipasa -76.51803 3.48257
1914 Zona Norte 02 5 300 205 2 5 6 Casa vipasa -76.51832 3.48138

Caso 2: Cotización de Viviendas

  • Tipo de Propiedad: Apartamento
  • Área Construida: 300 metros cuadrados
  • Parqueaderos: 3
  • Baños: 3
  • Habitaciones: 5
  • Estrato Socioeconómico: 5 o 6
  • Zona: Sur de Cali
  • Crédito Preaprobado: 850 millones de pesos

Resultados del Análisis

Para el segundo caso, se aplicó el Modelo de Regresión Lineal Múltiple (RLM), cuya descripción detallada se presenta en el Anexo 2. Sin embargo, es importante señalar que los resultados del modelo sugieren un precio de cotización que podría no ser realista en el actual mercado inmobiliario. Esto se debe a la dificultad de encontrar ofertas que se ajusten a las condiciones específicas del comprador.

Los precios sugeridos por el modelo de RLM son los siguientes:

  1. Apartamento de Estrato 5: Precio sugerido: 659.5 millones de pesos.
  2. Apartamento de Estrato 6: Precio sugerido: 806.1 millones de pesos.

Dado que estos precios sugeridos pueden no reflejar adecuadamente el mercado, a continuación se presentan cinco ofertas disponibles, algunas de las cuales pueden exceder el monto del crédito preaprobado de 850 millones de pesos. La evaluación final de estas ofertas queda a consideración del cliente. Cada una de estas ofertas se presenta como una posible opción para el cliente, teniendo en cuenta sus requisitos y preferencias. Nuestra firma inmobiliaria está disponible para proporcionar asesoramiento adicional y facilitar el proceso de selección de la propiedad que mejor se adapte a las necesidades del cliente.

Para detalles adicionales, por favor consulte el Anexo 2 para obtener información sobre el Modelo de Regresión Lineal Múltiple utilizado en este análisis.


id zona piso estrato preciom areaconst parqueaderos banios habitaciones tipo barrio longitud latitud
6175 Zona Sur 05 5 350 270 3 3 4 Apartamento capri -76.54100 3.39200
5758 Zona Sur NA 6 950 329 4 5 4 Apartamento ciudad jardín -76.53800 3.36300
6275 Zona Sur NA 6 950 330 4 6 4 Apartamento ciudad jardín -76.54175 3.37103
4962 Zona Sur NA 6 980 274 3 4 4 Apartamento ciudad jardin -76.53400 3.36900
6868 Zona Sur 03 3 370 300 3 6 5 Apartamento melendez -76.54537 3.37812

ANEXO 1



Metodología de Análisis

En el proceso de cotización de viviendas para nuestros clientes, hemos seleccionado un enfoque basado en el Modelo de Regresión Lineal Múltiple (RLM) para pronosticar los precios de las propiedades. Este enfoque se ha elegido por diversas razones, que se detallan a continuación:

Ventajas del Modelo de RLM

  1. Simplicidad: El Modelo de RLM es reconocido por su simplicidad y facilidad de comprensión, lo que lo hace especialmente adecuado para análisis exploratorios y para presentar resultados de manera efectiva a stakeholders que pueden no tener un conocimiento técnico profundo. Esta simplicidad es esencial para asegurar que nuestros clientes puedan comprender fácilmente las cotizaciones propuestas.

  2. Interpretación de Coeficientes: Una característica fundamental del Modelo de RLM es la interpretación directa de sus coeficientes. Esto significa que podemos entender de manera intuitiva cómo cada variable independiente impacta en el precio de la vivienda. Esta capacidad de interpretación facilita la identificación de las características clave que influyen en el valor de una propiedad y proporciona información valiosa tanto para nuestros analistas como para nuestros clientes.

Metodología de Resolución de Casos

Para abordar de manera efectiva los casos presentados, seguimos una metodología sólida que consta de tres etapas fundamentales:

  1. Limpieza de Datos: Comenzamos con una exhaustiva limpieza de datos para garantizar la calidad y la integridad de la información utilizada en nuestro análisis. Esto implica la identificación y corrección de valores atípicos, datos faltantes y cualquier otro problema que pueda afectar la precisión de nuestras cotizaciones.

  2. Análisis Exploratorio de Variables: A continuación, llevamos a cabo un análisis exploratorio de variables para comprender mejor la distribución y la relación entre las características de las propiedades y sus precios. Este paso nos ayuda a identificar tendencias, patrones y posibles variables relevantes para el modelo de RLM.

  3. Modelado y Validación de Supuestos: Una vez completadas las etapas anteriores, procedemos al planteamiento de los modelos de RLM. Utilizamos técnicas estadísticas avanzadas para validar los supuestos del modelo, asegurando que se cumplan los requisitos necesarios para obtener estimaciones confiables.

Este enfoque metodológico integral garantiza que nuestras cotizaciones estén respaldadas por análisis sólidos y que sean precisas y confiables. Nuestra prioridad es proporcionar a nuestros clientes información precisa y útil para tomar decisiones informadas en el mercado inmobiliario.



ANEXO 2



Importación y resumen de los datos


data("vivienda")
df <- vivienda

# Reordenar df
df <- df %>% select(id, zona, tipo, barrio, piso, estrato, preciom, areaconst, parqueaderos, banios, habitaciones, longitud, latitud)

kable(head(df, n = 5))
id zona tipo barrio piso estrato preciom areaconst parqueaderos banios habitaciones longitud latitud
1147 Zona Oriente Casa 20 de julio NA 3 250 70 1 3 6 -76.51168 3.43382
1169 Zona Oriente Casa 20 de julio NA 3 320 120 1 2 3 -76.51237 3.43369
1350 Zona Oriente Casa 20 de julio NA 3 350 220 2 2 4 -76.51537 3.43566
5992 Zona Sur Casa 3 de julio 02 4 400 280 3 5 3 -76.54000 3.43500
1212 Zona Norte Apartamento acopi 01 5 260 90 1 2 3 -76.51350 3.45891
summary(df)
##        id           zona               tipo              barrio         
##  Min.   :   1   Length:8322        Length:8322        Length:8322       
##  1st Qu.:2080   Class :character   Class :character   Class :character  
##  Median :4160   Mode  :character   Mode  :character   Mode  :character  
##  Mean   :4160                                                           
##  3rd Qu.:6240                                                           
##  Max.   :8319                                                           
##  NA's   :3                                                              
##      piso              estrato         preciom         areaconst     
##  Length:8322        Min.   :3.000   Min.   :  58.0   Min.   :  30.0  
##  Class :character   1st Qu.:4.000   1st Qu.: 220.0   1st Qu.:  80.0  
##  Mode  :character   Median :5.000   Median : 330.0   Median : 123.0  
##                     Mean   :4.634   Mean   : 433.9   Mean   : 174.9  
##                     3rd Qu.:5.000   3rd Qu.: 540.0   3rd Qu.: 229.0  
##                     Max.   :6.000   Max.   :1999.0   Max.   :1745.0  
##                     NA's   :3       NA's   :2        NA's   :3       
##   parqueaderos        banios        habitaciones       longitud     
##  Min.   : 1.000   Min.   : 0.000   Min.   : 0.000   Min.   :-76.59  
##  1st Qu.: 1.000   1st Qu.: 2.000   1st Qu.: 3.000   1st Qu.:-76.54  
##  Median : 2.000   Median : 3.000   Median : 3.000   Median :-76.53  
##  Mean   : 1.835   Mean   : 3.111   Mean   : 3.605   Mean   :-76.53  
##  3rd Qu.: 2.000   3rd Qu.: 4.000   3rd Qu.: 4.000   3rd Qu.:-76.52  
##  Max.   :10.000   Max.   :10.000   Max.   :10.000   Max.   :-76.46  
##  NA's   :1605     NA's   :3        NA's   :3        NA's   :3       
##     latitud     
##  Min.   :3.333  
##  1st Qu.:3.381  
##  Median :3.416  
##  Mean   :3.418  
##  3rd Qu.:3.452  
##  Max.   :3.498  
##  NA's   :3

Verificar si existe faltante de datos


md.pattern(df)

##      preciom id zona tipo barrio estrato areaconst banios habitaciones longitud
## 4808       1  1    1    1      1       1         1      1            1        1
## 1909       1  1    1    1      1       1         1      1            1        1
## 876        1  1    1    1      1       1         1      1            1        1
## 726        1  1    1    1      1       1         1      1            1        1
## 1          1  0    0    0      0       0         0      0            0        0
## 2          0  0    0    0      0       0         0      0            0        0
##            2  3    3    3      3       3         3      3            3        3
##      latitud parqueaderos piso     
## 4808       1            1    1    0
## 1909       1            1    0    1
## 876        1            0    1    1
## 726        1            0    0    2
## 1          0            0    0   12
## 2          0            0    0   13
##            3         1605 2638 4275

Se han identificado dos registros que carecen de datos en todas sus variables, y un tercer registro que contiene información únicamente en una de sus variables. Por tanto, se ha llevado a cabo la eliminación de estos tres registros del conjunto de datos.


df <- df[!is.na(df$id), ]

Se ha considerado que aquellos registros que presentan valores faltantes (NA) en la variable ‘piso’ corresponden, por defecto, al primer piso. Del mismo modo, se ha supuesto que los registros con valores faltantes en la variable ‘parqueadero’ indican que la vivienda carece de parqueaderos.


# Llenar los registros de NA en la columna "piso" con el número 1
df$piso <- ifelse(is.na(df$piso), 1, df$piso)

# Llenar los registros de NA en la columna "parqueaderos" con el número 0
df$parqueaderos <- ifelse(is.na(df$parqueaderos), 0, df$parqueaderos)

# Declarar variables categoricas como tal
df$piso <- factor(df$piso)
df$estrato <- factor(df$estrato)

md.pattern(df)
##  /\     /\
## {  `---'  }
## {  O   O  }
## ==>  V <==  No need for mice. This data set is completely observed.
##  \  \|/  /
##   `-----'

##      id zona tipo barrio piso estrato preciom areaconst parqueaderos banios
## 8319  1    1    1      1    1       1       1         1            1      1
##       0    0    0      0    0       0       0         0            0      0
##      habitaciones longitud latitud  
## 8319            1        1       1 0
##                 0        0       0 0

CASO 1



  1. Realice un filtro a la base de datos e incluya solo las ofertas de : base1: casas, de la zona norte de la ciudad. Presente los primeros 3 registros de las bases y algunas tablas que comprueben la consulta. (Adicional un mapa con los puntos de las bases. Discutir si todos los puntos se ubican en la zona correspondiente o se presentan valores en otras zonas, ¿por que?).

Se Filtran las casas que se encuentran en la zona norte y se grafica


# Filtrar casas zona norte 
df1 <- df[df$tipo == "Casa", ]
df1 <- df1[df1$zona == "Zona Norte", ]
kable(head(df1, n = 3))
id zona tipo barrio piso estrato preciom areaconst parqueaderos banios habitaciones longitud latitud
1209 Zona Norte Casa acopi 02 5 320 150 2 4 6 -76.51341 3.47968
1592 Zona Norte Casa acopi 02 5 780 380 2 3 3 -76.51674 3.48721
4057 Zona Norte Casa acopi 02 6 750 445 0 7 6 -76.52950 3.38527
# Imprimir valores unicos de Zona
print(unique(df1$zona))
## [1] "Zona Norte"
# Creando el mapa
maps <- leaflet(df1) %>%
  addTiles() %>%
  addMarkers(lng = ~longitud, lat = ~latitud)
maps

Es evidente que la categorización geográfica de ‘Zona Norte’ no siempre refleja con precisión la ubicación real de las viviendas mencionadas, debido a errores en la clasificación geográfica. En consecuencia, se realiza un proceso de corrección para asignar de manera precisa las ubicaciones según sus coordenadas geográficas.


# Definir zona dependiendo la posicion geografica 
df$zona <- NA
df$zona <- ifelse(df$longitud < -76.537138, "Zona Oeste", df$zona)
df$zona <- ifelse(df$longitud > -76.485196, "Zona Oriente", df$zona)
df$zona <- ifelse(df$latitud > 3.460322, "Zona Norte", df$zona)
df$zona <- ifelse(df$latitud < 3.404536, "Zona Sur", df$zona)
df$zona <- ifelse(is.na(df$zona), "Zona Centro", df$zona)

# Filtrar y graficar casas de la zona norte
df1 <- df[df$tipo == "Casa", ]
df1 <- df1[df1$zona == "Zona Norte", ]
kable(head(df1, n = 3))
id zona tipo barrio piso estrato preciom areaconst parqueaderos banios habitaciones longitud latitud
1209 Zona Norte Casa acopi 02 5 320 150 2 4 6 -76.51341 3.47968
1592 Zona Norte Casa acopi 02 5 780 380 2 3 3 -76.51674 3.48721
504 Zona Norte Casa acopi 1 3 180 120 0 3 3 -76.49768 3.47060
# Imprimir valores unicos de Zona
print(unique(df1$zona))
## [1] "Zona Norte"
# Creando el mapa
maps <- leaflet(df1) %>%
  addTiles() %>%
  addMarkers(lng = ~longitud, lat = ~latitud)
maps

Gracias a la nueva clasificación geográfica, se ha logrado asignar de manera precisa la etiqueta ‘Zona Norte’ a las viviendas que realmente se encuentran en dicha área, corrigiendo así las imprecisiones previas en la categorización geográfica.

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


ggpairs(df1[,7:11], title=" ") 


Al examinar la matriz de diagrama de dispersión, es evidente que las variables predictoras exhiben una correlación baja entre sí, lo cual es un indicador favorable para el modelo de Regresión Lineal Múltiple (RLM) que se está considerando. Esta baja correlación sugiere que no existe multicolinealidad, lo que fortalece la robustez del modelo.

Por otro lado, se observa que las variables ‘precio’ y ‘área construida’ presentan una asimetría hacia la izquierda en sus distribuciones, mientras que las variables ‘parqueaderos’, ‘baños’ y ‘habitaciones’ muestran distribuciones con diferentes picos y valles, lo que indica concentraciones de datos en distintos puntos a lo largo de sus rangos.



  1. Estime un modelo de regresión lineal múltiple.

modelo <- lm(preciom ~ areaconst + estrato + habitaciones + parqueaderos + banios, data = df1)
summary(modelo)
## 
## Call:
## lm(formula = preciom ~ areaconst + estrato + habitaciones + parqueaderos + 
##     banios, data = df1)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -860.47  -57.76  -13.63   35.43  942.86 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   54.33921   18.44101   2.947 0.003350 ** 
## areaconst      0.74602    0.04583  16.277  < 2e-16 ***
## estrato4      63.82907   17.84550   3.577 0.000379 ***
## estrato5     102.93561   16.93853   6.077 2.31e-09 ***
## estrato6     356.93216   33.57898  10.630  < 2e-16 ***
## habitaciones  -0.61195    4.66376  -0.131 0.895655    
## parqueaderos  18.33363    4.44531   4.124 4.30e-05 ***
## banios        22.41181    6.23423   3.595 0.000354 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 138.5 on 543 degrees of freedom
## Multiple R-squared:  0.6956, Adjusted R-squared:  0.6916 
## F-statistic: 177.2 on 7 and 543 DF,  p-value: < 2.2e-16

Del análisis del modelo, se puede concluir que la variable ‘habitaciones’ no muestra significancia, considerando un nivel de confianza del 95% (α = 0.05). Además, es importante destacar que el modelo exhibe un coeficiente de determinación ajustado (R² ajustado) de 0.6916, lo cual es un indicador positivo. Este valor sugiere que el modelo tiene un buen rendimiento al explicar una gran parte de la variabilidad en la variable de respuesta (Y).

En relación a la variable ‘habitaciones’, se ha realizado un análisis más detallado, que incluye el cálculo de la media y la mediana. Además, se ha evaluado la normalidad de esta variable para comprender mejor su comportamiento en el contexto del modelo.


# Calcular la media
media <- mean(df1$habitaciones)

# Calcular la mediana
mediana <- median(df1$habitaciones)

# Realizar la prueba de normalidad en la columna
prueba_nor <- shapiro.test(df1$habitaciones)

# Mostrar los resultados
print(paste("Media:", media))
## [1] "Media: 4.51905626134301"
print(paste("Mediana:", mediana))
## [1] "Mediana: 4"
print(prueba_nor)
## 
##  Shapiro-Wilk normality test
## 
## data:  df1$habitaciones
## W = 0.88102, p-value < 2.2e-16

la variable ‘habitaciones’ sigue una distribución normal, con una media de 4.51 y una mediana de 4. Esto sugiere que, independientemente de la configuración específica de las casas en la zona norte, el número de habitaciones tiende a mantenerse en valores cercanos a la media. Este hallazgo contribuye a comprender por qué esta variable no muestra significancia en el modelo.

Como resultado de esta observación y debido a que la variable no es estadisticamente significativa, se ha procedido a la creación de un nuevo modelo, excluyendo la variable ‘habitaciones’.


modelo <- lm(preciom ~ areaconst + estrato + parqueaderos + banios, data = df1)
residuos <- resid(modelo)
summary(modelo)
## 
## Call:
## lm(formula = preciom ~ areaconst + estrato + parqueaderos + banios, 
##     data = df1)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -861.26  -57.48  -13.45   35.65  942.99 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   53.14172   16.00996   3.319 0.000963 ***
## areaconst      0.74443    0.04417  16.855  < 2e-16 ***
## estrato4      64.38269   17.32388   3.716 0.000223 ***
## estrato5     103.62007   16.10075   6.436 2.70e-10 ***
## estrato6     358.18405   32.16594  11.136  < 2e-16 ***
## parqueaderos  18.29520    4.43164   4.128 4.23e-05 ***
## banios        21.95978    5.19119   4.230 2.74e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 138.4 on 544 degrees of freedom
## Multiple R-squared:  0.6956, Adjusted R-squared:  0.6922 
## F-statistic: 207.1 on 6 and 544 DF,  p-value: < 2.2e-16

A continuación, se realiza un análisis de estos coeficientes:

  1. Intercept (Intercepto): El valor estimado del precio de una vivienda cuando todas las variables independientes son cero, es decir, el precio base de una vivienda.

  2. areaconst (Área Construida): Un aumento de una unidad en el área construida se asocia con un aumento de aproximadamente 0.74443 unidades en el precio de la vivienda, manteniendo todas las demás variables constantes.

  3. estrato4: Para las viviendas en el estrato 4 en comparación con el estrato de referencia, se espera un aumento de aproximadamente 64.38269 unidades en el precio de la vivienda, manteniendo todas las demás variables constantes.

  4. estrato5: Para las viviendas en el estrato 5 en comparación con el estrato de referencia, se espera un aumento de aproximadamente 103.62007 unidades en el precio de la vivienda, manteniendo todas las demás variables constantes.

  5. estrato6: Para las viviendas en el estrato 6 en comparación con el estrato de referencia, se espera un aumento de aproximadamente 358.18405 unidades en el precio de la vivienda, manteniendo todas las demás variables constantes.

  6. parqueaderos: Un aumento de una unidad en el número de parqueaderos se asocia con un aumento de aproximadamente 18.29520 unidades en el precio de la vivienda, manteniendo todas las demás variables constantes.

  7. banios (Baños): Un aumento de una unidad en el número de baños se asocia con un aumento de aproximadamente 21.95978 unidades en el precio de la vivienda, manteniendo todas las demás variables constantes.



  1. Realice la validación de supuestos del modelo e interprete los resultados


Homocedasticidad


#Homocedasticidad. Gráfico de residuos estandarizados vs. valores ajustados
plot(modelo, which = 3)


Del grafico se puede observar que la varianza de los residuos no es constante, para poder verificar esto se realiza a continuación el test de Breusch-Pagan


#Test de Breusch-Pagan para homocedasticidad
bptest(residuos ~ fitted(modelo))
## 
##  studentized Breusch-Pagan test
## 
## data:  residuos ~ fitted(modelo)
## BP = 71.252, df = 1, p-value < 2.2e-16

El resultado del Breusch-Pagan test es altamente significativo, con un valor de estadístico BP de 71.252 y un grado de libertad (df) de 1. El p-valor calculado es prácticamente nulo, lo que sugiere una fuerte evidencia en contra de la hipótesis nula de homocedasticidad en el modelo. En otras palabras, existe una clara heterocedasticidad en los datos, lo que indica que la varianza de los errores no es constante a lo largo de las observaciones.

Se viola el supuesto de varianza constante de los errores



Errores aleatorios con distribución normal


#Normalidad. Gráfico de cuantiles de los residuos vs. cuantiles teóricos normales
qqnorm(residuos)

shapiro.test(residuos)
## 
##  Shapiro-Wilk normality test
## 
## data:  residuos
## W = 0.81966, p-value < 2.2e-16

El resultado del Shapiro-Wilk normality test arroja un valor de estadístico W igual a 0.81966 y un p-valor prácticamente nulo (< 2.2e-16). Esto proporciona una fuerte evidencia en contra de la hipótesis nula de que los datos siguen una distribución normal. En otras palabras, los errores no se ajustan a una distribución normal concluión a la que podemos llegar tambien en el grafico Q-Q.

Se viola el supuesto de que los errores se distribuyen de forma normal



Los errores tienen media cero


# Prueba estadística de la media de los residuos
t_test <- t.test(residuos)
print(mean(residuos))
## [1] -6.597135e-15
print(t_test)
## 
##  One Sample t-test
## 
## data:  residuos
## t = -1.1251e-15, df = 550, p-value = 1
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
##  -11.51748  11.51748
## sample estimates:
##     mean of x 
## -6.597135e-15

los resultados de esta prueba t-test sugieren que no hay evidencia de que la media de los residuos sea significativamente diferente de cero. El p-valor alto (igual a 1) indica que no hay suficiente evidencia para rechazar la hipótesis nula de que la media de los residuos es igual a cero

No se viola este supuesto



Los errores son mutuamente independientes


# Gráfico de residuos vs. orden de observación
plot(residuos, type = "o", ylab = "Residuos", xlab = "Orden de Observación")
abline(h = 0, col = "red", lty = 2)

# Calcula el estadístico Durbin-Watson
dwtest(modelo)
## 
##  Durbin-Watson test
## 
## data:  modelo
## DW = 1.9013, p-value = 0.1086
## alternative hypothesis: true autocorrelation is greater than 0

Al examinar tanto el gráfico de los residuos como los resultados de la prueba Durbin-Watson, llegamos a la conclusión de que los errores en el modelo son mutuamente independientes. En particular, el valor del estadístico Durbin-Watson (DW) es 1.9013, lo cual está cercano a 2. Un valor de DW cercano a 2 generalmente sugiere que los residuos son independientes entre sí. Además, dado que el p-valor asociado con la prueba es mayor que 0.05, no encontramos evidencia significativa de autocorrelación en los residuos.

No se viola el supuesto de independencia de los errores en este modelo



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

sol1_1 <- data.frame(
  areaconst = 200,
  estrato = "4",
  habitaciones = 4,
  parqueaderos = 1,
  banios = 2
)
sol1_2 <- data.frame(
  areaconst = 200,
  estrato = "5",
  habitaciones = 4,
  parqueaderos = 1,
  banios = 2
)
pre_sol1_1 <- predict(modelo, newdata = sol1_1)
pre_sol1_2 <- predict(modelo, newdata = sol1_2)
cat("Cotizacion de la vivienda estrato 4:", pre_sol1_1,"\n")
## Cotizacion de la vivienda estrato 4: 328.6259
cat("Cotizacion de la vivienda estrato 5:", pre_sol1_2,"\n")
## Cotizacion de la vivienda estrato 5: 367.8633

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

Se detallan las sugerencias y sus respectivas ubicaciones para todas las ofertas potenciales que satisfacen las condiciones del comprador.


id zona tipo barrio piso estrato preciom areaconst parqueaderos banios habitaciones longitud latitud
4267 Zona Norte Casa el bosque 01 5 335 202.0 1 4 5 -76.53044 3.48399
4800 Zona Norte Casa el bosque 01 5 340 250.0 2 4 4 -76.53300 3.46500
4209 Zona Norte Casa el bosque 02 5 350 300.0 3 5 6 -76.53010 3.48577
4422 Zona Norte Casa el bosque 02 5 350 240.0 2 3 6 -76.53136 3.48635
4458 Zona Norte Casa el bosque 02 4 315 270.0 2 4 4 -76.53176 3.48780
4483 Zona Norte Casa el bosque 02 5 342 250.0 1 4 6 -76.53197 3.48752
1009 Zona Norte Casa el bosque 1 5 250 243.0 1 4 5 -76.50755 3.47838
1270 Zona Norte Casa el bosque 1 5 350 203.0 2 2 5 -76.51448 3.48531
3453 Zona Norte Casa la campiña 1 5 340 240.0 2 5 6 -76.52640 3.48211
819 Zona Norte Casa la flora 02 5 350 264.0 2 3 4 -76.50330 3.46412
3053 Zona Norte Casa la flora 02 5 320 230.0 2 4 4 -76.52353 3.48352
937 Zona Norte Casa la merced 02 4 350 280.0 2 3 4 -76.50603 3.46643
952 Zona Norte Casa la merced 02 4 330 275.0 2 3 5 -76.50647 3.47516
1020 Zona Norte Casa la merced 02 4 230 250.0 2 3 5 -76.50799 3.47424
1108 Zona Norte Casa la merced 02 4 330 260.0 1 3 4 -76.51060 3.48108
766 Zona Norte Casa la merced 1 5 321 249.0 1 5 5 -76.50291 3.46757
1163 Zona Norte Casa la merced 1 5 350 216.0 2 2 4 -76.51218 3.48181
3043 Zona Norte Casa la merced 1 5 330 275.0 2 3 5 -76.52350 3.48329
1849 Zona Norte Casa prados del norte 1 5 330 246.0 2 4 4 -76.51800 3.47000
3101 Zona Norte Casa san vicente 02 5 340 355.0 2 5 8 -76.52377 3.46384
1151 Zona Norte Casa urbanización la merced 1 5 320 210.0 2 3 5 -76.51200 3.47600
1887 Zona Norte Casa vipasa 01 5 340 203.0 2 3 4 -76.51803 3.48257
2544 Zona Norte Casa vipasa 01 4 340 264.5 2 4 4 -76.52096 3.47665
1842 Zona Norte Casa vipasa 02 5 350 240.0 2 3 4 -76.51800 3.48100
1914 Zona Norte Casa vipasa 02 5 300 205.0 2 5 6 -76.51832 3.48138
1822 Zona Norte Casa vipasa 1 4 340 295.0 2 2 4 -76.51777 3.48060
1943 Zona Norte Casa vipasa 1 5 350 346.0 1 2 4 -76.51847 3.47503

CASO 2



  1. Realice un filtro a la base de datos e incluya solo las ofertas de : base1: apartamentos, de la zona sur de la ciudad. Presente los primeros 3 registros de las bases y algunas tablas que comprueben la consulta. (Adicional un mapa con los puntos de las bases)

# Filtrar APT zona Sur 
df2 <- df[df$tipo == "Apartamento", ]
df2 <- df2[df2$zona == "Zona Sur", ]
kable(head(df2, n = 3))
id zona tipo barrio piso estrato preciom areaconst parqueaderos banios habitaciones longitud latitud
1724 Zona Sur Apartamento acopi 01 5 240 87 1 3 3 -76.51700 3.36971
4386 Zona Sur Apartamento acopi 01 5 310 137 2 3 4 -76.53105 3.38296
6857 Zona Sur Apartamento acopi 03 3 100 49 0 1 2 -76.54531 3.37775
# Imprimir valores unicos de Zona
print(unique(df2$zona))
## [1] "Zona Sur"
# Creando el mapa
maps <- leaflet(df2) %>%
  addTiles() %>%
  addMarkers(lng = ~longitud, lat = ~latitud)
maps

  1. Realice un análisis exploratorio de datos enfocado en la correlación entre la variable respuesta (precio del apartamento) en función del área construida, estrato, numero de baños, numero de habitaciones y zona donde se ubica la vivienda.

ggpairs(df2[,7:11], title=" ") 


Es evidente que existe una fuerte correlación entre el precio de las viviendas y el área construida. Sin embargo, al analizar las variables predictoras, encontramos una alta correlación únicamente entre la cantidad de baños y el área construida. Además, es interesante notar que las variables de parqueaderos, baños y habitaciones muestran patrones de concentración de datos en ciertos puntos, evidenciados por la presencia de picos y valles en sus distribuciones.



  1. Estime un modelo de regresión lineal múltiple.

modelo2 <- lm(preciom ~ areaconst + estrato + habitaciones + parqueaderos + banios, data = df2)
residuos2 <- resid(modelo2)
summary(modelo2)
## 
## Call:
## lm(formula = preciom ~ areaconst + estrato + habitaciones + parqueaderos + 
##     banios, data = df2)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1219.38   -38.00     0.26    33.06   873.18 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -18.46671   13.00872  -1.420 0.155879    
## areaconst      1.45787    0.05404  26.977  < 2e-16 ***
## estrato4      17.53434    9.38919   1.868 0.061967 .  
## estrato5      33.07259    9.68612   3.414 0.000651 ***
## estrato6     179.61965   11.82556  15.189  < 2e-16 ***
## habitaciones -17.75743    3.98827  -4.452 8.92e-06 ***
## parqueaderos  49.04515    3.41023  14.382  < 2e-16 ***
## banios        49.75506    3.61529  13.762  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 96.85 on 2156 degrees of freedom
## Multiple R-squared:  0.788,  Adjusted R-squared:  0.7873 
## F-statistic:  1145 on 7 and 2156 DF,  p-value: < 2.2e-16

Basándonos en el modelo de Regresión Lineal Múltiple (RLM), podemos concluir que ni la variable ‘estrato 4’ ni el intercepto son estadísticamente significativos. No obstante, es importante destacar que el modelo exhibe un R-cuadrado ajustado (Adjusted R-squared) de 0.7873, lo que sugiere que es capaz de explicar una alta variabilidad en los datos.

A continuación, realizamos un análisis de estos coeficientes:

  1. Intercepto: El valor del intercepto representa el precio base de una vivienda cuando todas las demás variables son nulas.

  2. areaconst (Área Construida): Cada unidad adicional en el área construida se asocia con un aumento de aproximadamente 1.45787 unidades en el precio de la vivienda, manteniendo todas las demás variables constantes.

  3. estrato4: Para las viviendas en el estrato 4 en comparación con el estrato de referencia, se espera un aumento de aproximadamente 17.53434 unidades en el precio, manteniendo todas las demás variables constantes.

  4. estrato5: Para las viviendas en el estrato 5 en comparación con el estrato de referencia, se espera un aumento de aproximadamente 33.07259 unidades en el precio, manteniendo todas las demás variables constantes.

  5. estrato6: Para las viviendas en el estrato 6 en comparación con el estrato de referencia, se espera un aumento de aproximadamente 179.61965 unidades en el precio, manteniendo todas las demás variables constantes.

  6. habitaciones: Cada unidad adicional en el número de habitaciones se asocia con una disminución de aproximadamente 17.75743 unidades en el precio de la vivienda, manteniendo todas las demás variables constantes.

  7. parqueaderos: Cada unidad adicional en el número de parqueaderos se asocia con un aumento de aproximadamente 49.04515 unidades en el precio de la vivienda, manteniendo todas las demás variables constantes.

  8. banios (Baños): Cada unidad adicional en el número de baños se asocia con un aumento de aproximadamente 49.75506 unidades en el precio de la vivienda, manteniendo todas las demás variables constantes.



  1. Realice la validación de supuestos del modelo e interprete los resultados


Homocedasticidad


#Homocedasticidad. Gráfico de residuos estandarizados vs. valores ajustados
plot(modelo2, which = 3)

#Test de Breusch-Pagan para homocedasticidad
bptest(residuos2 ~ fitted(modelo2))
## 
##  studentized Breusch-Pagan test
## 
## data:  residuos2 ~ fitted(modelo2)
## BP = 313.78, df = 1, p-value < 2.2e-16

Estadístico BP (Breusch-Pagan): El valor del estadístico BP es 313.78. Este valor representa la magnitud de la prueba y se utiliza para evaluar si hay heterocedasticidad (variabilidad no constante) en los residuos del modelo.

Valor p (p-value): El p-valor es prácticamente cero (menor que 2.2e-16). Esto indica que la probabilidad de observar un estadístico BP tan extremo bajo la hipótesis nula de homocedasticidad es extremadamente baja.

Dado que el p-valor es esencialmente cero, hay una fuerte evidencia para rechazar la hipótesis nula de homocedasticidad en el modelo. En otras palabras, los datos muestran heterocedasticidad, lo que significa que la varianza de los errores no es constante a lo largo de las observaciones.

Se viola el supuesto de homocedasticidad



Errores aleatorios con distribución normal


#Normalidad. Gráfico de cuantiles de los residuos vs. cuantiles teóricos normales
qqnorm(residuos2)

shapiro.test(residuos2)
## 
##  Shapiro-Wilk normality test
## 
## data:  residuos2
## W = 0.75599, p-value < 2.2e-16

Estadístico W: El valor del estadístico W es 0.75599. Este estadístico se utiliza para calcular la diferencia entre la distribución de los datos observados y la distribución normal esperada. En general, cuanto más cerca esté W de 1, más similar es la distribución de los datos a una distribución normal.

Valor p (p-value): El p-valor es prácticamente cero (menor que 2.2e-16). Esto indica que la probabilidad de observar un estadístico W tan bajo bajo la hipótesis nula de que los datos siguen una distribución normal es extremadamente baja.

Dado que el p-valor es esencialmente cero, hay una fuerte evidencia para rechazar la hipótesis nula de que los datos siguen una distribución normal. En otras palabras, los datos no se ajustan a una distribución normal.

Se viola el supuesto de normalidad de los errores



Los errores tienen media cero


# Prueba estadística de la media de los residuos
t_test <- t.test(residuos2)
print(mean(residuos2))
## [1] -4.198685e-15
print(t_test)
## 
##  One Sample t-test
## 
## data:  residuos2
## t = -2.02e-15, df = 2163, p-value = 1
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
##  -4.076276  4.076276
## sample estimates:
##     mean of x 
## -4.198685e-15

Los resultados de la prueba t indican que el valor es prácticamente cero, lo que sugiere que la media de los residuos se encuentra efectivamente muy próxima a cero. Además, el p-valor es igual a 1, lo que significa que no disponemos de evidencia significativa para rechazar la hipótesis nula de que la media de los residuos es igual a cero.

No se viola este supuesto



Los errores son mutuamente independientes


# Gráfico de residuos vs. orden de observación
plot(residuos2, type = "o", ylab = "Residuos", xlab = "Orden de Observación")
abline(h = 0, col = "red", lty = 2)

# Calcula el estadístico Durbin-Watson
dwtest(modelo2)
## 
##  Durbin-Watson test
## 
## data:  modelo2
## DW = 1.7031, p-value = 1.774e-12
## alternative hypothesis: true autocorrelation is greater than 0

El valor del estadístico Durbin-Watson (DW) es igual a 1.7031, lo cual, al ser menor que 2, sugiere la presencia de autocorrelación positiva en los residuos del modelo. Además, el p-valor asociado es extremadamente pequeño, con un valor de 1.774e-12. Este hallazgo proporciona una evidencia sólida en contra de la hipótesis nula que sostiene que no hay autocorrelación en los residuos. En otras palabras, estos resultados sugieren que existe una autocorrelación significativa en los residuos del modelo.

Se viola este supuesto



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

sol2_1 <- data.frame(
  areaconst = 300,
  estrato = "5",
  habitaciones = 5,
  parqueaderos = 3,
  banios = 3
)

sol2_2 <- data.frame(
  areaconst = 300,
  estrato = "6",
  habitaciones = 5,
  parqueaderos = 3,
  banios = 3
)

pre_sol2_1 <- predict(modelo2, newdata = sol2_1)
pre_sol2_2 <- predict(modelo2, newdata = sol2_2)
cat("El precio pronosticado de la vivienda estrato 5 es:", pre_sol2_1,"\n")
## El precio pronosticado de la vivienda estrato 5 es: 659.5818
cat("El precio pronosticado de la vivienda estrato 6 es:", pre_sol2_2,"\n")
## El precio pronosticado de la vivienda estrato 6 es: 806.1289

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

Se detallan las sugerencias y sus respectivas ubicaciones para todas las ofertas potenciales que satisfacen las condiciones del comprador.


# Filtrar valores del df
ofertas2 <- subset(df2, banios > 2 & parqueaderos > 2 & habitaciones > 3  & areaconst > 250 & preciom < 1200)

kable(ofertas2)
id zona tipo barrio piso estrato preciom areaconst parqueaderos banios habitaciones longitud latitud
6175 Zona Sur Apartamento capri 05 5 350 270 3 3 4 -76.54100 3.39200
5248 Zona Sur Apartamento ciudad jardín 08 6 1150 344 4 5 5 -76.53533 3.36971
6023 Zona Sur Apartamento ciudad jardín 08 6 1150 464 4 6 5 -76.54000 3.36800
5532 Zona Sur Apartamento ciudad jardín 1 6 1150 344 4 5 4 -76.53700 3.37000
5758 Zona Sur Apartamento ciudad jardín 1 6 950 329 4 5 4 -76.53800 3.36300
6275 Zona Sur Apartamento ciudad jardín 1 6 950 330 4 6 4 -76.54175 3.37103
4962 Zona Sur Apartamento ciudad jardin 1 6 980 274 3 4 4 -76.53400 3.36900
6868 Zona Sur Apartamento melendez 03 3 370 300 3 6 5 -76.54537 3.37812
#Mapa
maps <- leaflet(ofertas2) %>%
  addTiles() %>%
  addMarkers(lng = ~longitud, lat = ~latitud)
maps