Actividad 2 Caso CyA
Apartamentos en la zona sur
Analisis exploratorio Apartamentos en la zona sur
El siguiente mapa muestra una distribución de precios de apartamentos en la zona sur de Cali, con puntos de colores que varían según el precio. Al hacer clic en un marcador, aparece un pop-up con información detallada de la propiedad, incluyendo zona, tipo de propiedad, área construida, precio, estrato y barrio.
# Filtrar Apartamentos en la zona sur
aptos_sur <- vivienda1 %>%
filter(zona == "Zona Sur", tipo == "Apartamento")
# Definimos una paleta de colores personalizada
pal <- colorNumeric(
palette = brewer.pal(9, "YlOrRd"), # Usamos una paleta de colores cálidos
domain = aptos_sur$preciom # El dominio de la paleta es el precio
)
# Filtramos apartamentos con latitud inferior a 3.4000
aptos_sur_filtrados <- aptos_sur %>%
filter(latitud < 3.405,longitud > -76.545 & longitud < -76.5144)
# Creamos el mapa interactivo
m2 <- leaflet(aptos_sur_filtrados) %>%
addTiles() %>% # Añadimos un mapa base de OpenStreetMap
addCircleMarkers( # Añadimos marcadores circulares para las propiedades
lng = ~longitud,
lat = ~latitud,
radius = ~sqrt(preciom)/5, # El radio del marcador es proporcional al precio
color = ~pal(preciom), # El color del marcador depende del precio
fillOpacity = 0.7,
popup = ~paste( # Añadimos un popup con información de la propiedad
"<b>Zona:</b>", zona, "<br>",
"<b>Tipo:</b>", tipo, "<br>",
"<b>Área construida:</b>", areaconst, "m2",
"<b>Tipo:</b>", tipo, "<br>",
"<b>Precio:</b>$", preciom, " millones<br>",
"<b>Estrato:</b>", estrato, "<br>",
"<b>Barrio:</b>", longitud, ""
)
) %>%
addLegend( # Añadimos una leyenda para la escala de colores
pal = pal,
values = ~preciom,
title = "Precio",
position = "bottomright"
)
# Mostramos el mapa
m2Debido a que se tienen registros en la zona sur que se ubican en otras zonas del mapa, posiblemente por errores en las coordenadas o que algunos apartamentos están mal clasificadas en cuanto a su zona, se filtraron las propiedades por sus coordenadas (tomando como referencia latitud menor a 3.405,longitud entre -76.545 y -76.5144) para mostrar únicamente las propiedades que efectivamente corresponden a la zona sur.
Se observa un rango de precios bastante amplio, desde 85 hasta 1,750 millones de pesos.
## # A tibble: 3 × 13
## id zona piso estrato preciom areaconst parqueaderos banios habitaciones
## <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 2405 Zona S… 03 4 155 62 1 2 2
## 2 5368 Zona S… 06 4 226 64 1 2 3
## 3 2406 Zona S… 0 4 215 72 0 2 3
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
Los gráficos muestran la distribución geográfica de las casas en la Zona Sur, lo que permite identificar el rango típico de longitudes y latitudes y la presencia de valores atípicos. La longitud se concentra principalmente entre -76.54 y -76.52. Hay algunos valores atípicos en la longitud, tanto por encima como por debajo del rango típico.
La latitud se concentra principalmente entre 3.37 y 3.40. Hay varios valores atípicos en la latitud, especialmente por encima del rango típico.
# Gráfico de cajas para la longitud
plot_longitud <- plot_ly(y = aptos_sur$longitud, type = "box", name = "Longitud") %>%
layout(yaxis = list(title = "longitud"))
# Gráfico de cajas para la latitud
plot_latitud <- plot_ly(y = aptos_sur$latitud, type = "box", name = "Latitud") %>%
layout(yaxis = list(title = "latitud"))
# Unir los gráficos en un subplot
subplot(plot_longitud, plot_latitud, nrows = 1, titleX = TRUE, titleY = TRUE) %>%
layout(title = "Distribución de Longitud y Latitud en Zona Sur")Relación entre el precio y el área construida
El gráfico muestra una clara correlación positiva y aproximadamente lineal entre el área construida y el precio de los apartamentos en la Zona Sur de Cali. Sin embargo, también se observan algunos valores atípicos y cierta dispersión en los datos, lo que sugiere que otros factores pueden influir en el precio de los apartamentos.
#Crear el gráfico de dispersión con plotly
plot_ly(data = aptos_sur_filtrados, x = ~areaconst, y = ~preciom,
type = "scatter", mode = "markers",
text = ~paste("Precio:", preciom, "<br>Estrato:", estrato, "<br>Area construida:", areaconst,"<br>baños:", banios,"<br>Habitaciones:", habitaciones ),
hoverinfo = "text") %>%
layout(title = "Relación entre Área Construida y Precio",
xaxis = list(title = "Área Construida"),
yaxis = list(title = "Precio (millones)")) %>%
add_trace(x = ~areaconst, y = fitted(lm(preciom ~ areaconst, data = aptos_sur_filtrados)),
type = "scatter", mode = "lines", name = "Línea de Tendencia")Además, se observan algunos valores atípicos, especialmente un apartamento con un área construida de 605 metros cuadrados y un precio relativamente bajo, y otro apartamento con un área construida de alrededor de 932 metros cuadrados y un precio aún más bajo.
Relación entre el precio y el estrato
El gráfico muestra una clara correlación positiva entre el estrato y el precio de los apartamentos en la Zona Sur de Cali. Sin embargo, la relación es menos lineal que en el caso del área construida y hay una mayor dispersión en los datos, lo que sugiere que otros factores influyen significativamente en el precio de los apartamentos.
#Crear el gráfico de dispersión con plotly
plot_ly(data = aptos_sur_filtrados, x = ~estrato, y = ~preciom,
type = "scatter", mode = "markers",
text = ~paste("Precio:", preciom, "<br>Estrato:", estrato, "<br>Area construida:", areaconst,"<br>baños:", banios,"<br>Habitaciones:", habitaciones ),
hoverinfo = "text") %>%
layout(title = "Relación entre estrato y Precio",
xaxis = list(title = "Estrato"),
yaxis = list(title = "Precio (millones de pesos)")) %>%
add_trace(x = ~estrato, y = fitted(lm(preciom ~ estrato, data = aptos_sur_filtrados)),
type = "scatter", mode = "lines", name = "Línea de Tendencia")Se observan varios valores atípicos, especialmente apartamentos con precios muy altos en estratos 5 y 6. El estrato es una variable categórica ordinal, por lo que la relación con el precio puede no ser perfectamente lineal.
Relación entre el precio y el número de baños
El gráfico muestra una clara correlación positiva entre el número de baños y el precio de los apartamentos. Sin embargo, la relación es menos lineal y hay una mayor dispersión en los datos, lo que sugiere que otros factores influyen significativamente en el precio de los apartamentos.
#Crear el gráfico de dispersión con plotly
plot_ly(data = aptos_sur_filtrados, x = ~banios, y = ~preciom,
type = "scatter", mode = "markers",
text = ~paste("Precio:", preciom, "<br>Estrato:", estrato, "<br>Area construida:", areaconst,"<br>baños:", banios,"<br>Habitaciones:", habitaciones ),
hoverinfo = "text") %>%
layout(title = "Relación entre número de baños y Precio",
xaxis = list(title = "baños"),
yaxis = list(title = "Precio (millones de pesos)")) %>%
add_trace(x = ~banios, y = fitted(lm(preciom ~ banios, data = aptos_sur_filtrados)),
type = "scatter", mode = "lines", name = "Línea de Tendencia")La relación entre el número de baños y el precio parece ser menos lineal, especialmente en apartamentos con más de 4 baños.
Se observan varios valores atípicos, especialmente apartamentos con precios muy altos para un número determinado de baños y apartamentos con precios muy bajos para un número determinado de baños.
Relación del número de habitaciones vs el precio
Se observa una correlación positiva débil entre el número de habitaciones y el precio. A medida que aumenta el número de habitaciones, el precio de los apartamentos tiende a aumentar ligeramente.
plot_ly(data = aptos_sur_filtrados, x = ~habitaciones, y = ~preciom,
type = "scatter", mode = "markers",
text = ~paste("Precio:", preciom, "<br>Estrato:", estrato, "<br>Area construida:", areaconst,"<br>baños:", banios,"<br>Habitaciones:", habitaciones ),
hoverinfo = "text") %>%
layout(title = "Número de Habitaciones vs Precio",
xaxis = list(title = "Número de Habitaciones"),
yaxis = list(title = "Precio (millones de pesos)")) %>%
add_trace(x = ~habitaciones, y = fitted(lm(preciom ~ habitaciones, data = aptos_sur_filtrados)),
type = "scatter", mode = "lines", name = "Línea de Tendencia")La relación es no lineal y hay una gran dispersión en los datos, lo que sugiere que otros factores influyen significativamente en el precio de los apartamentos. El número de habitaciones no es un buen predictor del precio de los apartamentos.
Relación entre parqueaderos y Precio
El gráfico muestra una clara correlación positiva entre el número de parqueaderos y el precio de los apartamentos. Sin embargo, la relación es menos lineal y hay una mayor dispersión en los datos.
plot_ly(data = aptos_sur_filtrados, x = ~parqueaderos, y = ~preciom,
type = "scatter", mode = "markers",
text = ~paste("Precio:", preciom, "<br>Estrato:", estrato, "<br>Area construida:", areaconst,"<br>baños:", banios,"<br>Habitaciones:", habitaciones,"<br>Parqueaderos:", parqueaderos ),
hoverinfo = "text") %>%
layout(title = "Número de parqueaderos vs Precio",
xaxis = list(title = "Número de parqueaderos"),
yaxis = list(title = "Precio (millones de pesos)")) %>%
add_trace(x = ~parqueaderos, y = fitted(lm(preciom ~ parqueaderos, data = aptos_sur_filtrados)),
type = "scatter", mode = "lines", name = "Línea de Tendencia")Se observan varios valores atípicos, especialmente apartamentos con precios muy altos para un número determinado de parqueaderos y apartamentos con precios muy bajos para un número determinado de parqueaderos.
Precio de los apartamentos en la zona sur
El gráfico de cajas muestra que los precios de los apartamentos en la Zona Sur se concentran principalmente entre 100 y 300 millones de pesos, con algunos valores atípicos por encima de 600 millones de pesos. Los valores atípicos podrían representar viviendas de lujo o errores en los datos.
plot_ly(data = aptos_sur_filtrados, x = ~zona, y = ~preciom,
type = "box",
text = ~paste("Precio:", preciom, "<br>Estrato:", estrato, "<br>Area construida:", areaconst,"<br>baños:", banios,"<br>Habitaciones:", habitaciones,"<br>Parqueaderos:", parqueaderos ),
hoverinfo = "text") %>%
layout(title = "Zona vs Precio",
xaxis = list(title = "Zona"),
yaxis = list(title = "Precio (millones de pesos)"))Se observan varios valores atípicos por encima del bigote superior, lo que indica que hay algunas viviendas en la Zona Sur con precios significativamente más altos que la mayoría.
Matrix de Correlación de las variables
Se observa una fuerte correlación positiva entre “preciom” (precio) y “areaconst” (área construida), con un coeficiente de 0.7719813. Esto indica que las viviendas más grandes tienden a ser más caras. También se observa una fuerte correlación positiva entre “preciom” y “banios” (baños), con un coeficiente de 0.7404102.
aptos_sur_filtrados$preciom <- as.numeric(aptos_sur_filtrados$preciom)
aptos_sur_filtrados$areaconst <- as.numeric(aptos_sur_filtrados$areaconst)
aptos_sur_filtrados$estrato <- as.numeric(aptos_sur_filtrados$estrato)
aptos_sur_filtrados$banios <- as.numeric(aptos_sur_filtrados$banios)
aptos_sur_filtrados$habitaciones <- as.numeric(aptos_sur_filtrados$habitaciones)
aptos_sur_filtrados$parqueaderos <- as.numeric(aptos_sur_filtrados$parqueaderos)
correlacion <- cor(aptos_sur_filtrados[, c("preciom", "areaconst", "estrato", "banios", "habitaciones", "parqueaderos")])
plot_ly(z = correlacion, x = colnames(correlacion), y = rownames(correlacion),
type = "heatmap", colors = "RdBu") %>%
layout(title = "Matriz de Correlación",
xaxis = list(title = ""),
yaxis = list(title = ""))correlacion <- cor(aptos_sur_filtrados[, c("preciom", "areaconst", "estrato", "banios", "habitaciones", "parqueaderos")])
print(correlacion)## preciom areaconst estrato banios habitaciones parqueaderos
## preciom 1.0000000 0.7719813 0.6690300 0.7404102 0.3515051 0.7138335
## areaconst 0.7719813 1.0000000 0.5207208 0.6562537 0.3940691 0.6035272
## estrato 0.6690300 0.5207208 1.0000000 0.6029260 0.2562840 0.5693654
## banios 0.7404102 0.6562537 0.6029260 1.0000000 0.5086643 0.5788061
## habitaciones 0.3515051 0.3940691 0.2562840 0.5086643 1.0000000 0.3054463
## parqueaderos 0.7138335 0.6035272 0.5693654 0.5788061 0.3054463 1.0000000
Estimación del modelo de regresión lineal multiple
# Construir el modelo de regresión lineal múltiple
modelo <- lm(preciom ~ areaconst + estrato + habitaciones + parqueaderos + banios, data = aptos_sur_filtrados)
# Mostrar un resumen del modelo
summary(modelo)##
## Call:
## lm(formula = preciom ~ areaconst + estrato + habitaciones + parqueaderos +
## banios, data = aptos_sur_filtrados)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1193.44 -41.61 -1.41 35.70 918.36
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -221.4096 18.3361 -12.075 < 2e-16 ***
## areaconst 1.3869 0.0607 22.849 < 2e-16 ***
## estrato 47.4898 3.8351 12.383 < 2e-16 ***
## habitaciones -18.7139 4.5231 -4.137 3.67e-05 ***
## parqueaderos 61.2735 3.9340 15.575 < 2e-16 ***
## banios 59.5567 3.9373 15.126 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 97.29 on 1818 degrees of freedom
## Multiple R-squared: 0.767, Adjusted R-squared: 0.7664
## F-statistic: 1197 on 5 and 1818 DF, p-value: < 2.2e-16
Interpretación de los coeficientes:
- (Intercepto: -221.4096): Este valor representa el precio predicho de un apartamento cuando todas las demás variables independientes son cero. Es estadísticamente significativo (p < 2e-16).
- (areaconst: 1.3869):Por cada metro cuadrado adicional de área construida, el precio del apartamento aumenta en aproximadamente 1.3869 millones de pesos, manteniendo constantes las demás variables. Este resultado es lógico y estadísticamente significativo (p < 2e-16).
- (estrato: 47.4898): Por cada unidad de aumento en el estrato socioeconómico, el precio del apartamento aumenta en aproximadamente 47.4898 millones de pesos. Este resultado también es lógico y estadísticamente significativo (p < 2e-16).
- (habitaciones: -18.7139):Por cada habitación adicional, el precio del apartamento disminuye en aproximadamente 18.7139 millones de pesos. Este resultado es contrario a lo esperado y podría indicar la presencia de multicolinealidad o la necesidad de incluir otras variables en el modelo. Este resultado es estadísticamente significativo (p = 3.67e-05).
- (parqueaderos: 61.2735):Por cada parqueadero adicional, el precio del apartamento aumenta en aproximadamente 61.2735 millones de pesos. Este resultado es lógico y estadísticamente significativo (p < 2e-16).
- (banios: 59.5567): Por cada baño adicional, el precio del apartamento aumenta en aproximadamente 59.5567 millones de pesos. Este resultado es lógico y estadísticamente significativo (p < 2e-16).
Interpretación del coeficiente R cuadrado (R2):
El modelo explica el 76.7% de la variabilidad en el precio de los apartamentos. Esto indica que el modelo tiene un ajuste bastante bueno a los datos. Sin embargo, todavía hay un 23.3% de la variabilidad que no se explica por el modelo, lo que sugiere que hay otros factores que influyen en el precio de los apartamentos.
Posibles mejoras al modelo:
El modelo tiene un ajuste bastante bueno, como lo indica el R cuadrado de 0.767. Sin embargo, el resultado inesperado del coeficiente de “habitaciones” sugiere que hay margen de mejora. - Es posible que haya multicolinealidad entre las variables independientes, lo que podría estar afectando los coeficientes. - Incluir otras variables que podrían influir en el precio de los apartamentos, como la antigüedad del edificio, la vista, las amenidades, etc. Transformar variables no lineales (por ejemplo, tomar el logaritmo del área construida). Eliminar valores atípicos que puedan estar afectando el modelo. Validar el modelo: utilizando técnicas como la validación cruzada para evaluar su capacidad de generalización.
Validación de supuestos del modelo
La regresión lineal múltiple es una herramienta poderosa, pero su validez depende del cumplimiento de los supuestos de linealidad, independencia, homocedasticidad, normalidad y no multicolinealidad. La validación de estos supuestos es fundamental para asegurar que los resultados del modelo sean válidos y confiables.
1. Linealidad:
El gráfico sugiere que se cumple el supuesto de linealidad, dado que los puntos parecen estar distribuidos aleatoriamente alrededor de la línea de cero residuales.Sin embargo, hay algunos valores atípicos que podrían afectar la precisión del modelo.
plot(modelo$fitted.values, modelo$residuals, xlab = "Valores ajustados", ylab = "Residuales")
abline(h = 0, col = "red")2. Independencia de los errores:
El gráfico de residuales vs. orden de observación no muestra evidencia clara de autocorrelación. Sin embargo, la prueba de Durbin-Watson indica que hay autocorrelación positiva en los errores (p < 0.05). Esto significa que los errores no son independientes entre sí, lo cual puede afectar la validez de las inferencias del modelo.
plot(modelo$residuals, xlab = "Orden de observación", ylab = "Residuales")
abline(h = 0, col = "red")##
## Durbin-Watson test
##
## data: modelo
## DW = 1.5862, p-value < 2.2e-16
## alternative hypothesis: true autocorrelation is greater than 0
3. Homocedasticidad:
La prueba de Breusch-Pagan y el gráfico de residuales vs. valores ajustados indican que no se cumple el supuesto de homocedasticidad.Esto significa que la varianza de los errores no es constante, lo cual puede afectar la validez de las inferencias del modelo.
plot(modelo$fitted.values, modelo$residuals, xlab = "Valores ajustados", ylab = "Residuales")
abline(h = 0, col = "red")#Prueba de Breusch-Pagan: Podemos realizar la prueba de Breusch-Pagan para detectar heterocedasticidad.
library(lmtest)
bptest(modelo)##
## studentized Breusch-Pagan test
##
## data: modelo
## BP = 749.99, df = 5, p-value < 2.2e-16
4. Normalidad de los errores:
La prueba de Shapiro-Wilk y el gráfico Q-Q normal indican que se viola el supuesto de normalidad de los errores. Esto significa que los errores no se distribuyen normalmente, lo cual puede afectar la validez de las inferencias del modelo.
##
## Shapiro-Wilk normality test
##
## data: modelo$residuals
## W = 0.7496, p-value < 2.2e-16
5. No multicolinealidad:
Los valores VIF indican que hay multicolinealidad moderada en el modelo (Todos los valores VIF están entre 1 y 5), pero no es lo suficientemente alta como para causar problemas graves. Sin embargo, es importante tener en cuenta la multicolinealidad al interpretar los resultados del modelo.
## areaconst estrato habitaciones parqueaderos banios
## 2.064579 1.807302 1.373284 1.890701 2.495081
El modelo cumple con el supuesto de linealidad y no multicolinealidad, pero no cumple con los supuestos de independencia de los errores, homocedasticidad y normalidad de los errores.
6. Recomendaciones:
- Eliminar los valores atípicos que puedan estar causando las violaciones de los supuestos.
- Eliminar una o más variables independientes que estén altamente correlacionadas.
- Transformar las variables para estabilizar la varianza de los errores o acercar la distribución de los residuales a una distribución normal.
Predicción del modelo
El modelo es: preciom = -221.4096 + 1.3869 * areaconst + 47.4898 * estrato -18.7139 * habitaciones + 61.2735 * parqueaderos + 59.5567 * banios*
Características de la vivienda:
- areaconst = 300
- parqueaderos = 3
- banios = 3
- habitaciones = 5
- estrato = 5 o 6
- precio = 850 millones (valor a comparar)
# Modelo de regresión lineal múltiple
# modelo <- lm(preciom ~ areaconst + estrato + habitaciones + parqueaderos + banios, data = casas_norte_filtradas)
# Características de la vivienda
areaconst <- 300
parqueaderos <- 3
banios <- 3
habitaciones <- 5
estrato_5 <- 5
estrato_6 <- 6
# Predicción con estrato 5
preciom_predicho_estrato5 <- predict(modelo, newdata = data.frame(areaconst = areaconst, parqueaderos = parqueaderos, banios = banios, habitaciones = habitaciones, estrato = estrato_5))
# Predicción con estrato 6
preciom_predicho_estrato6 <- predict(modelo, newdata = data.frame(areaconst = areaconst, parqueaderos = parqueaderos, banios = banios, habitaciones = habitaciones, estrato = estrato_6))
# Imprimir resultados
cat("Predicción con estrato 5:", preciom_predicho_estrato5, "millones de pesos\n")## Predicción con estrato 5: 701.0337 millones de pesos
## Predicción con estrato 6: 748.5235 millones de pesos
El modelo predice un precio significativamente más alto para una vivienda en estrato 6 en comparación con una vivienda en estrato 5. La diferencia es de aproximadamente 47.49 millones de pesos, lo cual es consistente con el coeficiente estimado para la variable estrato en el modelo.
El modelo predice un precio de aproximadamente 701 millones de pesos en estrato 5. Está muy por debajo del crédito pre-aprobado de 850 millones, lo que deja un margen considerable para la negociación o la búsqueda de propiedades con características adicionales.
En estrato 6 el modelo predice un precio de aproximadamente 748 millones de pesos. Esto también está por debajo del crédito pre-aprobado, aunque el margen es menor que en el estrato 5.