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:
|-||| | 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 |
Ayude a María a responder la solicitud, mediante técnicas modelación que usted conoce. Ella requiere le envíe un informe ejecutivo donde analice los dos casos y sus recomendaciones (Informe). Como soporte del informe debe anexar las estimaciones, validaciones y comparación de modelos requeridos (Anexos) .
| variable | descripción |
|---|---|
| zona | ubicación de la vivienda : Zona Centro, Zona Norte,… |
| piso | piso que ocupa la vivienda : primer piso, segundo piso… |
| estrato | estrato socio-económico : 3,4,5,6 |
| preciom | precio de la vivienda en millones de pesos |
| areaconst | área construida |
| parqueaderos | número de parqueaderos |
| banios | número de baños |
| habitaciones | número de habitaciones |
| tipo | tipo de vivienda : Casa, Apartamento |
| barrio | barrio de ubicación de la vivienda : 20 de Julio, alamos,.. |
| longitud | coordenada geográfica |
| latitud | coordenada geográfica |
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?).
Realice un análisis exploratorio de datos enfocado en la correlación entre la variable respuesta (precio de la casa) en función del área construida, estrato, numero de baños, numero de habitaciones y zona donde se ubica la vivienda. Use gráficos interactivos con el paquete plotly e interprete los resultados.
Estime un modelo de regresión lineal múltiple con las variables del punto anterior (precio = f(área construida, estrato, número de cuartos, número de parqueaderos, número de baños ) ) e interprete los coeficientes si son estadísticamente significativos. Las interpretaciones deber están contextualizadas y discutir si los resultados son lógicos. Adicionalmente interprete el coeficiente R2 y discuta el ajuste del modelo e implicaciones (que podrían hacer para mejorarlo).
Realice la validación de supuestos del modelo e interprete los resultados (no es necesario corregir en caso de presentar problemas, solo realizar sugerencias de que se podría hacer).
Con el modelo identificado debe predecir el precio de la vivienda con las características de la primera solicitud.
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.
Realice los pasos del 1 al 6. Para la segunda solicitud que tiene un crédito pre-aprobado por valor de $850 millones.
Primero, se procede a instalar y cargar las librerías necesarias para
el análisis. Se utilizarán devtools para instalar el
paquete de datos, dplyr para la manipulación de datos,
leaflet para la visualización geoespacial y
plotly para gráficos interactivos.
# Instalar y cargar librerías
if (!require("devtools")) install.packages("devtools")
if (!require("paqueteMODELOS")) devtools::install_github("centromagis/paqueteMODELOS", force = TRUE)
if (!require("dplyr")) install.packages("dplyr")
if (!require("leaflet")) install.packages("leaflet")
if (!require("plotly")) install.packages("plotly")
if (!require("knitr")) install.packages("knitr")
library(paqueteMODELOS)
library(dplyr)
library(leaflet)
library(plotly)
library(knitr)
A continuación, se cargan los datos y se realiza una limpieza inicial. Se renombran las variables para una mejor comprensión y se eliminan registros incompletos que son cruciales para el análisis.
# Cargar el conjunto de datos
data("vivienda")
# Renombrar variables para mayor claridad
datos_inmuebles <- vivienda %>%
rename(
Zona = zona,
Piso = piso,
Estrato = estrato,
Precio_Millones = preciom,
Area_Construida = areaconst,
Parqueaderos = parqueaderos,
Banios = banios,
Habitaciones = habitaciones,
Tipo = tipo,
Barrio = barrio,
Longitud = longitud,
Latitud = latitud
) %>%
# Eliminar filas con valores NA en Precio_Millones o Area_Construida, ya que son cruciales
filter(!is.na(Precio_Millones) & !is.na(Area_Construida))
Para la primera solicitud, se necesita analizar únicamente las
casas ubicadas en la Zona Norte de Cali. Se crea un
subconjunto de datos (casas_norte) que cumple con estas
características.
# Filtrar la base de datos para casas en la Zona Norte
casas_norte <- datos_inmuebles %>%
filter(Tipo == 'Casa', Zona == 'Zona Norte')
# Mostrar los primeros 3 registros para verificar el filtro
kable(head(casas_norte, 3), caption = "Primeros 3 registros de Casas en la Zona Norte")
| id | Zona | Piso | Estrato | Precio_Millones | Area_Construida | Parqueaderos | Banios | Habitaciones | Tipo | Barrio | Longitud | Latitud |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1209 | Zona Norte | 02 | 5 | 320 | 150 | 2 | 4 | 6 | Casa | acopi | -76.51341 | 3.47968 |
| 1592 | Zona Norte | 02 | 5 | 780 | 380 | 2 | 3 | 3 | Casa | acopi | -76.51674 | 3.48721 |
| 4057 | Zona Norte | 02 | 6 | 750 | 445 | NA | 7 | 6 | Casa | acopi | -76.52950 | 3.38527 |
Para confirmar que el filtro se aplicó correctamente, se generan
tablas de frecuencia para las variables Tipo y
Zona.
# Verificar la distribución por tipo de inmueble
cat("Porcentaje por Tipo de Inmueble:\n")
## Porcentaje por Tipo de Inmueble:
print(prop.table(table(casas_norte$Tipo)) * 100)
##
## Casa
## 100
# Verificar la distribución por zona
cat("\nPorcentaje por Zona:\n")
##
## Porcentaje por Zona:
print(prop.table(table(casas_norte$Zona)) * 100)
##
## Zona Norte
## 100
Interpretación: Las tablas de frecuencia muestran
que el 100% de los registros en el nuevo conjunto de
datos casas_norte corresponden a ‘Casa’ y ‘Zona Norte’, lo
que confirma que el filtro fue exitoso.
Se genera un mapa interactivo para visualizar la distribución geográfica de las casas en la Zona Norte. Esto permite evaluar si las coordenadas corresponden lógicamente a la zona especificada.
# Crear un mapa interactivo con Leaflet
mapa_casas_norte <- leaflet(data = casas_norte) %>%
addTiles() %>%
addMarkers(
lng = ~Longitud,
lat = ~Latitud,
clusterOptions = markerClusterOptions(), # Agrupar marcadores cercanos
popup = ~paste("<b>Precio:</b>", Precio_Millones, "M<br>",
"<b>Barrio:</b>", Barrio)
)
# Mostrar el mapa
mapa_casas_norte
Interpretación del Mapa: El mapa muestra una concentración de propiedades en una región geográfica específica. (Análisis agregado) Sin embargo, se observa una dispersión considerable, con algunos puntos que parecen estar fuera de lo que tradicionalmente se consideraría la “Zona Norte” de Cali. Esto podría deberse a errores en el registro de las coordenadas geográficas o a una definición amplia de los límites de la zona en la base de datos. Para un análisis más preciso, sería recomendable validar estas ubicaciones atípicas.
Se realiza un análisis exploratorio para entender las relaciones entre el precio de la vivienda y sus características más relevantes.
Un resumen estadístico nos da una primera visión de la distribución de las variables numéricas.
# Generar un resumen estadístico de las variables numéricas
summary(casas_norte %>% select_if(is.numeric))
## id Estrato Precio_Millones Area_Construida
## Min. : 58.0 Min. :3.000 Min. : 89.0 Min. : 30.0
## 1st Qu.: 766.2 1st Qu.:3.000 1st Qu.: 261.2 1st Qu.: 140.0
## Median :2257.0 Median :4.000 Median : 390.0 Median : 240.0
## Mean :2574.6 Mean :4.202 Mean : 445.9 Mean : 264.9
## 3rd Qu.:4225.0 3rd Qu.:5.000 3rd Qu.: 550.0 3rd Qu.: 336.8
## Max. :8319.0 Max. :6.000 Max. :1940.0 Max. :1440.0
##
## 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.53
## Median : 2.000 Median : 3.000 Median : 4.000 Median :-76.52
## Mean : 2.182 Mean : 3.555 Mean : 4.507 Mean :-76.52
## 3rd Qu.: 3.000 3rd Qu.: 4.000 3rd Qu.: 5.000 3rd Qu.:-76.50
## Max. :10.000 Max. :10.000 Max. :10.000 Max. :-76.47
## NA's :287
## Latitud
## Min. :3.333
## 1st Qu.:3.452
## Median :3.468
## Mean :3.460
## 3rd Qu.:3.482
## Max. :3.496
##
Interpretación: El resumen muestra que el precio
promedio de una casa en la Zona Norte es de 445.9
millones, con áreas construidas que varían significativamente.
Se nota también la presencia de valores faltantes (NA's) en
la variable Parqueaderos, lo cual deberá ser manejado antes
de modelar.
Utilizaremos gráficos interactivos de plotly para
explorar visualmente la relación entre el precio y otras variables
clave.
# Crear gráfico de dispersión interactivo: Precio vs. Área Construida
plot_area <- ggplot(casas_norte, aes(x = Area_Construida, y = Precio_Millones,
text = paste("Estrato:", Estrato, "<br>Barrio:", Barrio))) +
geom_point(aes(color = Estrato), alpha = 0.6) +
geom_smooth(method = "lm", se = FALSE, color = "red") +
labs(title = "Precio vs. Área Construida en la Zona Norte",
x = "Área Construida (m²)",
y = "Precio (Millones de Pesos)") +
theme_minimal()
ggplotly(plot_area, tooltip = c("y", "x", "text"))
Interpretación: Se observa una correlación positiva clara entre el área construida y el precio. A medida que aumenta el tamaño de la casa, su precio tiende a incrementarse. Las líneas de tendencia confirma esta relación lineal. Existen algunos puntos atípicos con áreas muy grandes que podrían influir en un modelo posterior.
# Crear boxplot interactivo: Precio vs. Estrato
plot_estrato <- ggplot(casas_norte, aes(x = as.factor(Estrato), y = Precio_Millones, fill = as.factor(Estrato))) +
geom_boxplot(alpha = 0.7) +
labs(title = "Distribución de Precios por Estrato",
x = "Estrato Socioeconómico",
y = "Precio (Millones de Pesos)") +
theme_minimal() +
guides(fill = "none") # Ocultar la leyenda
ggplotly(plot_estrato)
Interpretación: El gráfico de cajas muestra que el precio mediano aumenta con el estrato. Los estratos 5 y 6 presentan una mayor dispersión en los precios, indicando una mayor variabilidad en las propiedades de gama alta. El estrato 3, en cambio, tiene precios más homogéneos y bajos.
# Crear gráfico de dispersión interactivo: Precio vs. Baños
plot_banios <- ggplot(casas_norte, aes(x = Banios, y = Precio_Millones)) +
geom_jitter(aes(color = as.factor(Estrato)), width = 0.2, alpha = 0.6) + # Jitter para evitar sobreposición
labs(title = "Precio vs. Número de Baños",
x = "Cantidad de Baños",
y = "Precio (Millones de Pesos)") +
theme_minimal()
ggplotly(plot_banios)
Interpretación: Se evidencia una tendencia positiva: a mayor número de baños, el precio tiende a ser más alto. (Análisis agregado) Es interesante notar que las viviendas con más de 5 baños pertenecen casi exclusivamente a los estratos más altos (5 y 6), lo que sugiere una fuerte interacción entre estas variables.
# Crear gráfico de dispersión interactivo: Precio vs. Habitaciones
plot_habitaciones <- ggplot(casas_norte, aes(x = Habitaciones, y = Precio_Millones)) +
geom_jitter(aes(color = as.factor(Estrato)), width = 0.2, alpha = 0.6) +
labs(title = "Precio vs. Número de Habitaciones",
x = "Cantidad de Habitaciones",
y = "Precio (Millones de Pesos)") +
theme_minimal()
ggplotly(plot_habitaciones)
Interpretación: Al igual que con los baños, existe una relación positiva entre el número de habitaciones y el precio. Las casas con un mayor número de habitaciones suelen tener precios más elevados, lo cual es coherente con la lógica del mercado inmobiliario, ya que a menudo se correlaciona con un mayor tamaño general de la vivienda.
Ahora, se construirá un modelo de regresión lineal múltiple para
predecir el precio de las viviendas. La variable dependiente será
Precio_Millones, y las variables independientes serán el
área construida, estrato, número de habitaciones, baños y
parqueaderos.
El análisis exploratorio reveló valores faltantes (NA)
en la variable Parqueaderos. Para construir el modelo, se
utilizará un enfoque de caso completo, eliminando las filas que
contengan cualquier valor faltante en las variables de interés.
# Seleccionar variables para el modelo y eliminar filas con NAs
datos_modelo_casas <- casas_norte %>%
select(Precio_Millones, Area_Construida, Estrato, Habitaciones, Banios, Parqueaderos) %>%
na.omit()
# Verificar las dimensiones del nuevo dataset
cat("Número de observaciones completas para el modelo:", nrow(datos_modelo_casas))
## Número de observaciones completas para el modelo: 435
Se ajusta el modelo lineal (lm) con los datos
preparados.
# Estimar el modelo de regresión lineal múltiple
modelo_casas <- lm(Precio_Millones ~ Area_Construida + Estrato + Habitaciones + Banios + Parqueaderos,
data = datos_modelo_casas)
# Mostrar el resumen del modelo
summary(modelo_casas)
##
## Call:
## lm(formula = Precio_Millones ~ Area_Construida + Estrato + Habitaciones +
## Banios + Parqueaderos, data = datos_modelo_casas)
##
## Residuals:
## Min 1Q Median 3Q Max
## -784.29 -77.56 -16.03 47.67 978.61
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -238.17090 44.40551 -5.364 1.34e-07 ***
## Area_Construida 0.67673 0.05281 12.814 < 2e-16 ***
## Estrato 80.63495 9.82632 8.206 2.70e-15 ***
## Habitaciones 7.64511 5.65873 1.351 0.177
## Banios 18.89938 7.48800 2.524 0.012 *
## Parqueaderos 24.00598 5.86889 4.090 5.14e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 155.1 on 429 degrees of freedom
## Multiple R-squared: 0.6041, Adjusted R-squared: 0.5995
## F-statistic: 130.9 on 5 and 429 DF, p-value: < 2.2e-16
Interpretación de los Resultados del Modelo:
El resumen del modelo nos proporciona información clave sobre la relación entre las variables.
Area_Construida.Area_Construida * Estrato).Todo modelo de regresión lineal se basa en ciertos supuestos sobre los residuos (los errores de predicción). Es crucial validarlos para confiar en las conclusiones.
# Generar gráficos de diagnóstico del modelo
par(mfrow = c(2, 2))
plot(modelo_casas)
par(mfrow = c(1, 1))
Interpretación de los Gráficos de Diagnóstico:
Para confirmar la falta de normalidad, realizamos una prueba de Shapiro-Wilk.
# Realizar la prueba de normalidad de Shapiro-Wilk sobre los residuos
shapiro.test(residuals(modelo_casas))
##
## Shapiro-Wilk normality test
##
## data: residuals(modelo_casas)
## W = 0.85246, p-value < 2.2e-16
Interpretación de la Prueba de Normalidad: El p-valor es extremadamente pequeño (< 2.2e-16), lo que nos lleva a rechazar la hipótesis de normalidad. Los residuos del modelo no se distribuyen normalmente.
Sugerencias: Para corregir estos problemas, se
podría: * Transformar la variable de respuesta: Aplicar
una transformación logarítmica al precio
(log(Precio_Millones)) suele estabilizar la varianza y
normalizar los residuos. * Utilizar Regresión Robusta:
Emplear métodos menos sensibles a los valores atípicos.
Con el modelo estimado, se predice el precio para una casa con las características solicitadas por el cliente, considerando las dos opciones de estrato (4 y 5).
# Crear un dataframe con las características de la vivienda solicitada
solicitud_1 <- data.frame(
Area_Construida = 200,
Parqueaderos = 1,
Banios = 2,
Habitaciones = 4,
Estrato = c(4, 5) # Dos escenarios: estrato 4 y estrato 5
)
# Realizar la predicción
prediccion_v1 <- predict(modelo_casas, newdata = solicitud_1, interval = "confidence")
# Unir los resultados en una tabla clara
resultados_prediccion <- cbind(solicitud_1, Prediccion_M = prediccion_v1[,1])
kable(resultados_prediccion, caption = "Precios Estimados para la Vivienda Solicitada")
| Area_Construida | Parqueaderos | Banios | Habitaciones | Estrato | Prediccion_M |
|---|---|---|---|---|---|
| 200 | 1 | 2 | 4 | 4 | 312.1010 |
| 200 | 1 | 2 | 4 | 5 | 392.7359 |
Interpretación de la Predicción: El modelo predice
un precio de 312.1 millones de pesos para una casa de
estrato 4 y 392.7 millones para una de estrato 5, con
las demás características especificadas. La diferencia de ~80.6 millones
entre ambas predicciones es consistente con el coeficiente de la
variable Estrato calculado en el modelo. Dado el crédito
pre-aprobado de 350 millones, la opción de
estrato 4 es la única viable según esta estimación.
Finalmente, se filtra la base de datos para encontrar ofertas reales que se ajusten a los requisitos del cliente y a su presupuesto máximo de 350 millones de pesos.
# Filtrar ofertas que cumplan con los requisitos y el presupuesto
ofertas_potenciales_v1 <- casas_norte %>%
filter(
Precio_Millones <= 350,
Estrato %in% c(4, 5),
Area_Construida >= 200,
Habitaciones >= 4,
Banios >= 2,
Parqueaderos >= 1
) %>%
arrange(desc(Estrato), Precio_Millones) # Ordenar por estrato y luego por precio
# Mostrar las primeras 5 ofertas encontradas
kable(head(ofertas_potenciales_v1, 5), caption = "Top 5 Ofertas Potenciales para la Vivienda 1")
| id | Zona | Piso | Estrato | Precio_Millones | Area_Construida | Parqueaderos | Banios | Habitaciones | Tipo | Barrio | Longitud | Latitud |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1009 | Zona Norte | NA | 5 | 250 | 243 | 1 | 4 | 5 | Casa | el bosque | -76.50755 | 3.47838 |
| 1914 | Zona Norte | 02 | 5 | 300 | 205 | 2 | 5 | 6 | Casa | vipasa | -76.51832 | 3.48138 |
| 1343 | Zona Norte | 02 | 5 | 320 | 200 | 2 | 4 | 4 | Casa | la flora | -76.51524 | 3.48893 |
| 3053 | Zona Norte | 02 | 5 | 320 | 230 | 2 | 4 | 4 | Casa | la flora | -76.52353 | 3.48352 |
| 1151 | Zona Norte | NA | 5 | 320 | 210 | 2 | 3 | 5 | Casa | urbanización la merced | -76.51200 | 3.47600 |
Análisis y Mapa de Ofertas: Se encontraron varias propiedades que cumplen con los criterios. La tabla muestra las 5 opciones más relevantes. Para facilitar la decisión, se visualizan todas las ofertas encontradas en un mapa interactivo.
# Crear un mapa interactivo con las ofertas potenciales
mapa_ofertas_v1 <- leaflet(data = ofertas_potenciales_v1) %>%
addTiles() %>%
addMarkers(
lng = ~Longitud,
lat = ~Latitud,
popup = ~paste("<b>Precio:</b>", Precio_Millones, "M<br>",
"<b>Área:</b>", Area_Construida, "m²<br>",
"<b>Estrato:</b>", Estrato, "<br>",
"<b>Barrio:</b>", Barrio)
)
mapa_ofertas_v1
Discusión de Ofertas: El filtro ha identificado un conjunto de excelentes candidatas para el cliente. Hay opciones tanto en estrato 4 como en estrato 5 que se ajustan al presupuesto de 350 millones. (Análisis agregado) Se recomienda a María presentarle al cliente las propiedades del barrio “La Flora” y “Vipasa”, ya que ofrecen una buena combinación de características y se encuentran dentro del rango de precio, incluso siendo de estrato 5. El mapa interactivo es una herramienta ideal para que el cliente explore la ubicación exacta de cada una y evalúe su entorno.
Ahora se repite el proceso completo para la segunda solicitud: un apartamento en la Zona Sur con un presupuesto de 850 millones de pesos.
Primero, se filtra el conjunto de datos principal para aislar los apartamentos ubicados en la Zona Sur de la ciudad.
# Filtrar la base de datos para apartamentos en la Zona Sur
apartamentos_sur <- datos_inmuebles %>%
filter(Tipo == 'Apartamento', Zona == 'Zona Sur')
# Mostrar los primeros 3 registros para verificar el filtro
kable(head(apartamentos_sur, 3), caption = "Primeros 3 registros de Apartamentos en la Zona Sur")
| id | Zona | Piso | Estrato | Precio_Millones | Area_Construida | Parqueaderos | Banios | Habitaciones | Tipo | Barrio | Longitud | Latitud |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 5098 | Zona Sur | 05 | 4 | 290 | 96 | 1 | 2 | 3 | Apartamento | acopi | -76.53464 | 3.44987 |
| 698 | Zona Sur | 02 | 3 | 78 | 40 | 1 | 1 | 2 | Apartamento | aguablanca | -76.50100 | 3.40000 |
| 8199 | Zona Sur | NA | 6 | 875 | 194 | 2 | 5 | 3 | Apartamento | aguacatal | -76.55700 | 3.45900 |
Se crea un mapa para visualizar la distribución geográfica de estos apartamentos.
# Crear un mapa interactivo con Leaflet para los apartamentos del sur
mapa_apartamentos_sur <- leaflet(data = apartamentos_sur) %>%
addTiles() %>%
addMarkers(
lng = ~Longitud,
lat = ~Latitud,
clusterOptions = markerClusterOptions(),
popup = ~paste("<b>Precio:</b>", Precio_Millones, "M<br>",
"<b>Barrio:</b>", Barrio)
)
# Mostrar el mapa
mapa_apartamentos_sur
Interpretación del Mapa: Como se esperaba, los puntos se concentran en la parte sur de la ciudad. La densidad de apartamentos en esta zona es notablemente mayor que la de casas en la zona norte, lo que refleja las tendencias de desarrollo urbano de Cali.
Se realiza un análisis exploratorio para entender las características de los apartamentos en esta zona.
# Generar un resumen estadístico de las variables numéricas
summary(apartamentos_sur %>% select_if(is.numeric))
## id Estrato Precio_Millones Area_Construida
## Min. : 3 Min. :3.00 Min. : 75.0 Min. : 40.00
## 1st Qu.:2292 1st Qu.:4.00 1st Qu.: 175.0 1st Qu.: 65.00
## Median :4004 Median :5.00 Median : 245.0 Median : 85.00
## Mean :4131 Mean :4.63 Mean : 297.3 Mean : 97.47
## 3rd Qu.:5876 3rd Qu.:5.00 3rd Qu.: 335.0 3rd Qu.:110.00
## Max. :8302 Max. :6.00 Max. :1750.0 Max. :932.00
##
## Parqueaderos Banios Habitaciones Longitud
## Min. : 1.000 Min. :0.000 Min. :0.000 Min. :-76.57
## 1st Qu.: 1.000 1st Qu.:2.000 1st Qu.:3.000 1st Qu.:-76.54
## Median : 1.000 Median :2.000 Median :3.000 Median :-76.53
## Mean : 1.415 Mean :2.488 Mean :2.966 Mean :-76.53
## 3rd Qu.: 2.000 3rd Qu.:3.000 3rd Qu.:3.000 3rd Qu.:-76.52
## Max. :10.000 Max. :8.000 Max. :6.000 Max. :-76.46
## NA's :406
## Latitud
## Min. :3.334
## 1st Qu.:3.370
## Median :3.383
## Mean :3.390
## 3rd Qu.:3.406
## Max. :3.497
##
Interpretación: El precio promedio de un apartamento
en la Zona Sur es de 297.3 millones, considerablemente
menor que el de las casas en el norte. El área construida promedio
también es menor (97.5 m²). Nuevamente, se observan valores faltantes en
Parqueaderos y Piso.
# Gráfico de dispersión: Precio vs. Área Construida
plot_area_2 <- ggplot(apartamentos_sur, aes(x = Area_Construida, y = Precio_Millones)) +
geom_point(aes(color = Estrato), alpha = 0.5) +
geom_smooth(method = "lm", se = FALSE, color = "purple") +
labs(title = "Precio vs. Área Construida (Aptos Sur)", x = "Área (m²)", y = "Precio (M)") +
theme_bw()
# Boxplot: Precio vs. Estrato
plot_estrato_2 <- ggplot(apartamentos_sur, aes(x = as.factor(Estrato), y = Precio_Millones, fill = as.factor(Estrato))) +
geom_boxplot(alpha = 0.7) +
labs(title = "Precio por Estrato (Aptos Sur)", x = "Estrato", y = "Precio (M)") +
theme_bw() + guides(fill="none")
# subplot para mostrar ambos gráficos
subplot(ggplotly(plot_area_2), ggplotly(plot_estrato_2), nrows = 1, titleX = TRUE, titleY = TRUE)
Interpretación de Gráficos: * Precio vs. Área: La relación positiva es aún más fuerte y clara que en el caso de las casas. El precio de los apartamentos está fuertemente ligado a su tamaño. (Análisis agregado) Se observa la presencia de apartamentos de lujo (puntos con precios y áreas muy altas), que podrían tener una influencia significativa en el modelo. * Precio vs. Estrato: La tendencia es idéntica: a mayor estrato, mayor es el precio y la variabilidad de este. El estrato 6 muestra los precios más altos y dispersos.
Se ajusta un nuevo modelo lineal para predecir el precio de los apartamentos en la Zona Sur.
# Preparar datos (eliminando NAs) y estimar el modelo
datos_modelo_aptos <- apartamentos_sur %>%
select(Precio_Millones, Area_Construida, Estrato, Habitaciones, Banios, Parqueaderos) %>%
na.omit()
modelo_aptos <- lm(Precio_Millones ~ Area_Construida + Estrato + Habitaciones + Banios + Parqueaderos,
data = datos_modelo_aptos)
# Mostrar el resumen del modelo
summary(modelo_aptos)
##
## Call:
## lm(formula = Precio_Millones ~ Area_Construida + Estrato + Habitaciones +
## Banios + Parqueaderos, data = datos_modelo_aptos)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1092.02 -42.28 -1.33 40.58 926.56
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -261.62501 15.63220 -16.736 < 2e-16 ***
## Area_Construida 1.28505 0.05403 23.785 < 2e-16 ***
## Estrato 60.89709 3.08408 19.746 < 2e-16 ***
## Habitaciones -24.83693 3.89229 -6.381 2.11e-10 ***
## Banios 50.69675 3.39637 14.927 < 2e-16 ***
## Parqueaderos 72.91468 3.95797 18.422 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 98.02 on 2375 degrees of freedom
## Multiple R-squared: 0.7485, Adjusted R-squared: 0.748
## F-statistic: 1414 on 5 and 2375 DF, p-value: < 2.2e-16
Interpretación de los Resultados del Modelo:
Se revisan los supuestos del nuevo modelo.
# Gráficos de diagnóstico
par(mfrow = c(2, 2))
plot(modelo_aptos)
par(mfrow = c(1, 1))
# Prueba de Shapiro-Wilk
shapiro.test(residuals(modelo_aptos))
##
## Shapiro-Wilk normality test
##
## data: residuals(modelo_aptos)
## W = 0.79118, p-value < 2.2e-16
Interpretación: Al igual que en el primer modelo, los gráficos y la prueba de Shapiro-Wilk (p-valor < 2.2e-16) indican que los residuos no cumplen los supuestos de homocedasticidad y normalidad. Las mismas sugerencias de mejora (transformación de la variable respuesta) aplicarían aquí.
Se utiliza el modelo_aptos para predecir el precio del
apartamento solicitado.
# Crear dataframe con las características de la segunda solicitud
solicitud_2 <- data.frame(
Area_Construida = 300,
Parqueaderos = 3,
Banios = 3,
Habitaciones = 5,
Estrato = c(5, 6) # Escenarios para estrato 5 y 6
)
# Realizar la predicción
prediccion_v2 <- predict(modelo_aptos, newdata = solicitud_2)
# Unir resultados en una tabla
resultados_prediccion_2 <- cbind(solicitud_2, Prediccion_M = prediccion_v2)
kable(resultados_prediccion_2, caption = "Precios Estimados para el Apartamento Solicitado")
| Area_Construida | Parqueaderos | Banios | Habitaciones | Estrato | Prediccion_M |
|---|---|---|---|---|---|
| 300 | 3 | 3 | 5 | 5 | 675.0247 |
| 300 | 3 | 3 | 5 | 6 | 735.9218 |
Interpretación de la Predicción: El modelo estima un precio de 675 millones para un apartamento de estrato 5 y 735.9 millones para uno de estrato 6. Ambas predicciones están cómodamente dentro del presupuesto de 850 millones del cliente, dándole flexibilidad para elegir entre las dos opciones de estrato.
Finalmente, se buscan ofertas reales en el mercado que coincidan con los exigentes criterios del cliente.
# Filtrar ofertas que cumplan con los requisitos de la segunda solicitud
ofertas_potenciales_v2 <- apartamentos_sur %>%
filter(
Precio_Millones <= 850,
Estrato %in% c(5, 6),
Area_Construida >= 300,
Habitaciones >= 5,
Banios >= 3,
Parqueaderos >= 3
) %>%
arrange(Estrato, Precio_Millones)
# Mostrar las ofertas encontradas
kable(ofertas_potenciales_v2, caption = "Ofertas Potenciales para la Vivienda 2")
| id | Zona | Piso | Estrato | Precio_Millones | Area_Construida | Parqueaderos | Banios | Habitaciones | Tipo | Barrio | Longitud | Latitud |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 7512 | Zona Sur | NA | 5 | 670 | 300 | 3 | 5 | 6 | Apartamento | seminario | -76.550 | 3.409 |
| 7182 | Zona Sur | NA | 5 | 730 | 573 | 3 | 8 | 5 | Apartamento | guadalupe | -76.548 | 3.408 |
# Crear un mapa interactivo con las ofertas encontradas
mapa_ofertas_v2 <- leaflet(data = ofertas_potenciales_v2) %>%
addTiles() %>%
addMarkers(
lng = ~Longitud,
lat = ~Latitud,
popup = ~paste("<b>Precio:</b>", Precio_Millones, "M<br>",
"<b>Barrio:</b>", Barrio, "<br>",
"<b>Estrato:</b>", Estrato)
)
mapa_ofertas_v2
Discusión y Recomendación Final: A diferencia de la primera búsqueda, la combinación de características para el apartamento es muy específica y corresponde a un nicho de lujo. Como resultado, solo se encontraron dos propiedades que cumplen con todos los criterios. * Una en el barrio Guadalupe (estrato 5) por 730 millones. * Otra en el barrio Seminario (estrato 5) por 670 millones.
Recomendación para María: Debe informar al cliente que, aunque su presupuesto es adecuado, la oferta de inmuebles con características tan específicas (más de 300 m², 5 habitaciones, etc.) es muy limitada. Las dos opciones encontradas son excelentes puntos de partida y se alinean con las predicciones del modelo. Se sugiere presentarlas de inmediato y, si no son del agrado del cliente, considerar flexibilizar ligeramente alguno de los requisitos (por ejemplo, reducir a 4 habitaciones o un área de 280 m²) para ampliar significativamente el abanico de propiedades disponibles.