library(readxl)
library(dplyr)
library(ggplot2)
library(knitr)
library(tidyr)
library(kableExtra)
library(RecordLinkage)
library(leaflet)
library(htmltools)
Se filtra la base de datos teniendo en cuenta el barrio El ingenio y por tipo en este caso Casas. Es decir se realizara un análisis de los datos sobre las casas en el barro el ingenio
library(readxl)
datos <- read_excel("/Users/Christian/Desktop/Universidad/Sexto Semetre/Big Data/Vivienda/Datos_Vivienda.xlsx")
library(RecordLinkage)
pos = which(jarowinkler("el ingenio",datos$Barrio)>0.98&datos$Tipo=="Casa")
datos_sub=datos[pos,]
head(datos_sub)
## # A tibble: 6 × 12
## Zona piso Estrato precio_millon Area_contruida parqueaderos Banos
## <chr> <chr> <dbl> <dbl> <dbl> <chr> <dbl>
## 1 Zona Sur 4 5 1450 1200 2 6
## 2 Zona Sur 3 6 1200 616 7 8
## 3 Zona Sur 2 5 400 170 2 3
## 4 Zona Sur 1 5 470 180 NA 4
## 5 Zona Sur 3 5 720 195 2 5
## 6 Zona Sur 1 5 470 180 NA 3
## # ℹ 5 more variables: Habitaciones <dbl>, Tipo <chr>, Barrio <chr>,
## # cordenada_longitud <dbl>, Cordenada_latitud <dbl>
## [1] "Zona" "piso" "Estrato"
## [4] "precio_millon" "Area_contruida" "parqueaderos"
## [7] "Banos" "Habitaciones" "Tipo"
## [10] "Barrio" "cordenada_longitud" "Cordenada_latitud"
Indicador de Centralidad
length(pos)
## [1] 74
Se observa que existen 74 casas en el barrio el ingenio
Ubicación Espacial
leaflet() %>% addCircleMarkers(lng = datos_sub$cordenada_longitud, lat = datos_sub$Cordenada_latitud, radius = 1, color = "purple",label = paste0( 'ID: ',datos_sub$ID,', Precio: ', datos_sub$precio_millon, ', Area: ', datos_sub$Area_contruida, ', Barrio: ', datos_sub$Barrio,', Lat: ',datos_sub$Cordenada_latitud,', Long: ',datos_sub$cordenada_longitud)) %>% addTiles()
## # A tibble: 1 × 12
## precio_millon_media precio_millon_mediana precio_millon_desviacion
## <dbl> <dbl> <dbl>
## 1 630. 585 242.
## # ℹ 9 more variables: Area_contruida_media <dbl>, Area_contruida_mediana <dbl>,
## # Area_contruida_desviacion <dbl>, Banos_media <dbl>, Banos_mediana <dbl>,
## # Banos_desviacion <dbl>, Habitaciones_media <dbl>,
## # Habitaciones_mediana <dbl>, Habitaciones_desviacion <dbl>
Precio Millon Media: 629.6622 Mediana: 585 Desviación: 241.6501
En promedio las casas en el ingenio tienen un precio de venta de 629 millones de pesos con una desviación de 241 millones de pesos
Área Construida Media: 327.1059 Mediana: 285 Desviación: 187.817
En promedio las casas en el ingenio tienen un area de 327 metros cuadrados con una desviación de 187 metros cuadrados.
Baños Media: 4.554054 Mediana:4 Desviación: 1.500154
En promedio las casas en el ingenio tienen 4.5 baños con una desviación de 1.5 baños
Habitaciones Media: 4.864865 Mediana: 5 Desviación: 1.49267
En promedio las casas en el ingenio tienen 4.8 habitaciones con una desviación de 1.4 habitaciones
library(plotly)
library(ggplot2)
ggplotly(
ggplot(datos_sub, aes(x=precio_millon)) +
geom_histogram(fill="blue", color = "black", alpha = 0.6) +
labs(title = "Figura 1. Histograma del Precio de Casas en el ingenio",
x="precio",
y="Frecuencia") +
theme_minimal()
)
La mayoria de las casas en el barrio el ingenio se venden en el rango entre 400 y 650 millones de pesos colombianos
library(plotly)
ggplotly(
ggplot(datos_sub, aes(y=precio_millon)) +
geom_boxplot(fill="lightblue", color="black", outlier.colour="red", outlier.shape=16, outlier.size=3) +
labs(title="Figura 2. Boxplot del Precio de Casas en el ingenio",
y="Precio") +
theme_minimal()
)
Interpretación Este boxplot muestra la distribución de los precios de las casas en el ingenio y permite identificar la dispersión, la mediana y posibles valores atípicos.
Mediana: 585
Q1: 450, lo que implica que el 25% de las casas tiene un precio inferior a 450 millones de pesos
¿Valores Atípicos? Existen dos valores atípicos
# Crear Gráfico con correlación
ggplotly(
ggplot(datos_sub, aes(x = Area_contruida, y = precio_millon)) +
geom_point(color = "darkblue", alpha = 0.8, size = 2) +
geom_smooth(method = "loess", color = "black", se = TRUE) +
labs(
title = paste("Figura 3. Relación entre Área Construida y Precio \nCoef. de Correlación",
round(cor(datos_sub$precio_millon, datos_sub$Area_contruida, use = "complete.obs"), 2)),
x = "Área Construida (m²)",
y = "Precio (Millones)",
caption = "Fuente: Datos Vivienda"
) +
theme_minimal() +
theme(
plot.title = element_text(size = 14, face = "bold", hjust = 0.5),
axis.title = element_text(size = 12),
axis.text = element_text(size = 10)
)
)
Interpretación
Este gráfico muestra la relación entre el precio de los apartamentos (en millones de pesos) y el área construida (en m²).
Tendencia: Se observa una relación positiva: a mayor área construida, mayor precio del apartamento
*Correlación**: A medida que el área construida aumenta, el precio también tiende a aumentar. Es una relación directamente proporcional: casas más grandes suelen costar más. La correlación está en el rango de 0.7 a 1.0, lo que indica una relación fuerte. Aunque hay variabilidad en los precios, en general, el tamaño del apartamento explica una parte importante del precio. Una correlación alta NO significa que el área cause el precio. Otros factores como ubicación, acabados, demanda y oferta también influyen en el precio.
Coeficiente : 0.81
Se buscan variables que son influyentes en el precio de las casas en el barrio el ingenio
modelo <- lm(precio_millon ~ Area_contruida + Habitaciones + Banos + Estrato + parqueaderos , data = datos_sub)
summary(modelo)
##
## Call:
## lm(formula = precio_millon ~ Area_contruida + Habitaciones +
## Banos + Estrato + parqueaderos, data = datos_sub)
##
## Residuals:
## Min 1Q Median 3Q Max
## -271.62 -72.04 0.00 48.92 397.17
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -49.4245 191.9377 -0.258 0.7977
## Area_contruida 0.8158 0.1081 7.546 2.66e-10 ***
## Habitaciones 19.9856 13.8179 1.446 0.1532
## Banos 21.2258 13.2437 1.603 0.1142
## Estrato 40.7127 36.7857 1.107 0.2727
## parqueaderos10 339.7750 153.5604 2.213 0.0307 *
## parqueaderos2 -6.1009 53.0231 -0.115 0.9088
## parqueaderos3 -26.6297 74.0904 -0.359 0.7205
## parqueaderos4 28.7795 66.9019 0.430 0.6686
## parqueaderos5 142.6821 141.1105 1.011 0.3159
## parqueaderos6 -71.9841 150.1977 -0.479 0.6335
## parqueaderos7 212.8989 147.9894 1.439 0.1554
## parqueaderosNA 14.7854 106.6999 0.139 0.8902
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 132 on 61 degrees of freedom
## Multiple R-squared: 0.7507, Adjusted R-squared: 0.7017
## F-statistic: 15.31 on 12 and 61 DF, p-value: 3.487e-14
Como se puede observar en el modelo la varible mas significativas para el precio de las casas es el área construida.
Evaluación del Modelo R² = 0.7507 Es decir, este modelo explica un 75.07% el precio de las casas en el barrio el ingenio Ademas, se observa que como el valor p es menor a 0.05 el valor es estadísticamente significativo
modelo_step = step(modelo)
## Start: AIC=734.34
## precio_millon ~ Area_contruida + Habitaciones + Banos + Estrato +
## parqueaderos
##
## Df Sum of Sq RSS AIC
## - parqueaderos 8 154747 1217281 728.40
## - Estrato 1 21336 1083870 733.81
## <none> 1062534 734.34
## - Habitaciones 1 36439 1098973 734.83
## - Banos 1 44743 1107277 735.39
## - Area_contruida 1 991814 2054348 781.12
##
## Step: AIC=728.4
## precio_millon ~ Area_contruida + Habitaciones + Banos + Estrato
##
## Df Sum of Sq RSS AIC
## - Estrato 1 4167 1221448 726.65
## <none> 1217281 728.40
## - Habitaciones 1 39925 1257206 728.78
## - Banos 1 151757 1369038 735.09
## - Area_contruida 1 1169697 2386978 776.23
##
## Step: AIC=726.65
## precio_millon ~ Area_contruida + Habitaciones + Banos
##
## Df Sum of Sq RSS AIC
## <none> 1221448 726.65
## - Habitaciones 1 38201 1259649 726.93
## - Banos 1 153350 1374798 733.40
## - Area_contruida 1 1224818 2446266 776.04
summary(modelo_step)
##
## Call:
## lm(formula = precio_millon ~ Area_contruida + Habitaciones +
## Banos, data = datos_sub)
##
## Residuals:
## Min 1Q Median 3Q Max
## -313.27 -74.88 5.98 56.05 397.98
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 103.3620 59.7685 1.729 0.08815 .
## Area_contruida 0.8370 0.0999 8.378 3.67e-12 ***
## Habitaciones 18.5112 12.5108 1.480 0.14346
## Banos 35.6736 12.0335 2.965 0.00414 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 132.1 on 70 degrees of freedom
## Multiple R-squared: 0.7135, Adjusted R-squared: 0.7012
## F-statistic: 58.1 on 3 and 70 DF, p-value: < 2.2e-16
Las variables que llevan al menor AIC serian:
Area Construida
Habitaciones
Banos
Por medio del análisis del valor AIC se elige el modelo que poseea el valor mínimo de AIC, lo cual corresponde a la combinación de las variables de Banos, Habitaciones, Área contruida
R² = 0.7135: El modelo explica aproximadamente el 71.35% de la variabilidad en el precio, utilizando estas tres variables.
modelo2 <- lm(precio_millon ~ Area_contruida + Habitaciones + Banos, data = datos_sub)
summary(modelo2)
##
## Call:
## lm(formula = precio_millon ~ Area_contruida + Habitaciones +
## Banos, data = datos_sub)
##
## Residuals:
## Min 1Q Median 3Q Max
## -313.27 -74.88 5.98 56.05 397.98
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 103.3620 59.7685 1.729 0.08815 .
## Area_contruida 0.8370 0.0999 8.378 3.67e-12 ***
## Habitaciones 18.5112 12.5108 1.480 0.14346
## Banos 35.6736 12.0335 2.965 0.00414 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 132.1 on 70 degrees of freedom
## Multiple R-squared: 0.7135, Adjusted R-squared: 0.7012
## F-statistic: 58.1 on 3 and 70 DF, p-value: < 2.2e-16
Vemos que la variable de los Baños es mucho mas importante que el numero de habitaciones.
par(mfrow=c(2,2))
plot(modelo2)
1. Residuos vs Ajustados (arriba izquierda) Existe una ligera curvatura al principio y en la mitad, pero ambas se corrigen para que linea roja se mantenga al rojo.Esta forma sugiere que podría haber alguna relación no capturada por el modelo (posible no linealidad). Además, se nota mayor dispersión de los residuos en valores ajustados altos, lo que puede indicar heterocedasticidad.
2. Q-Q Plot (arriba derecha) Hay algunas desviaciones en las colas (residuos extremos), lo que indica que los residuos no son perfectamente normales. Sin embargo, para la mayoría de los datos, la normalidad es razonable. Es decir, la mayoría de los puntos siguen de cerca la línea de referencia, lo que indica que los residuos se aproximan razonablemente a una distribución normal. No obstante, se observan algunas desviaciones en las colas, lo cual sugiere la presencia de residuos extremos
3. Scale-Location (abajo izquierda) La línea roja presenta una pendiente ascendente en los valores ajustados más altos, lo que refuerza la evidencia de heterocedasticidad observada en el primer gráfico.
4. Residuos vs Leverage (abajo derecha) NNinguna parece tener un valor de Cook’s distance superior a 1, lo que indica que no hay observaciones altamente influyentes.
Conclusión general El modelo parece razonable en general, pero podría beneficiarse de transformar el precio millones.
modelo_log_dep <- lm(log(precio_millon) ~ Area_contruida + Habitaciones + Banos, data = datos_sub)
summary(modelo_log_dep)
##
## Call:
## lm(formula = log(precio_millon) ~ Area_contruida + Habitaciones +
## Banos, data = datos_sub)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.5018 -0.1441 -0.0097 0.1420 0.4531
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 5.6132184 0.0932860 60.172 < 2e-16 ***
## Area_contruida 0.0011221 0.0001559 7.196 5.47e-10 ***
## Habitaciones 0.0355863 0.0195267 1.822 0.07266 .
## Banos 0.0501761 0.0187818 2.672 0.00938 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.2062 on 70 degrees of freedom
## Multiple R-squared: 0.6683, Adjusted R-squared: 0.6541
## F-statistic: 47.02 on 3 and 70 DF, p-value: < 2.2e-16
Podemos ver que la variable de Habitaciones no tiene mucha significancia, sin embargo si se retire el nivel de explicación del modelo se disminuye. Por lo que este seria el modelo final
par(mfrow=c(2,2))
plot(modelo_log_dep)
1. Residuos vs Ajustados (arriba izquierda) La dispersión de los residuos luce más contenida respecto al gráfico anterior, y la curva roja es casi plana, aunque con una leve ondulación. Esto indica una mejora en la linealidad y una reducción de la heterocedasticidad respecto al gráfico anterior.
2. Q-Q Plot (arriba derecha) El ajuste a la línea teórica es bastante bueno. Sólo hay leves desviaciones en las colas, particularmente en los extremos inferiores y superiores. Sin embargo, en términos generales, los residuos parecen aproximadamente normales, mejor que en el gráfico anterior.
3. Scale-Location (abajo izquierda) La línea roja es más plana y estable que en el gráfico anterior. Esto sugiere que la varianza de los errores es ahora más constante, con menor evidencia de heterocedasticidad.
4. Residuos vs Leverage (abajo derecha) Se identifican algunos puntos con leve leverage, pero ninguno supera el umbral de distancia de Cook = 1. Esto indica que no hay observaciones altamente influyentes. La nube de puntos es más compacta y concentrada que antes.
Conclusión general Este segundo modelo muestra una mejora clara respecto al primero ya que se redujo la heterocedasticidad, la linealidad se acerca más al ideal. Ademas, los residuos siguen mejor una distribución normal y no hay observaciones excesivamente influyentes.
Predecir el precio de una casa en el barrio el ingenio si esta tiene 6 baños, 5 habitaciones y el área construida promedio
y_log1 = predict(modelo_log_dep,list(Banos=6, Habitaciones=5, Area_contruida=327.1059))
exp(y_log1)
## 1
## 638.5792
El precio de una vivienda con 6 baños, 5 habitaciones, y una área construida de 327 m² serian 628.6 millones de pesos colombianos.
Formula:
\(Log(precio.millon) = 5.61 + 0.0011221 (Área . Construida) + 0.0355863 (Habitaciones) + 0.0501761 (Banos)\)
\(5.61 + 0.0011221(327.1059) + 0.0355863(5) + 0.0501761(6) = 638\)
Predecir el precio de una casa en el barrio el ingenio si esta tiene 4 baños, 4 habitaciones, y un área de 400 metros cuadrados
y_log2 = predict(modelo_log_dep,list(Banos=4, Habitaciones=4, Area_contruida=400))
exp(y_log2)
## 1
## 604.9226
El precio de una vivienda con 4 baños, 4 habitaciones, y una área construida de 400 m² seria 604.9 millones de pesos colombianos
Este modelo sirve para predecir el precio justo de una vivienda, en mi caso seria de una casa en el barrio El ingenio, esto seria basado en sus características físicas (baños, habitaciones, área construida). Haciendolo de esta manera se reduce la subjetividad al fijar precios. Tambien se usan para tomar decisiones informadas, ayuda a los vendedores a fijar precios competitivos, ayuda a los compradores para revisar si el valor de las propiedades esta sobrevalorado. Finalmente, se utilizan para calcular la demanda de cierto tipo de viviendas, se pueden usar este tipo de modelos para entender tendencias y planear desarrollos habitacionales.
Monetización
Se puede monetizar convirtiendolo en un servio de connsultoria, donde se pueden vender estudios de valoración como este a personas que quieran vender/comprar una propiedad, cobrando por cada análisis o asesoría. Además, se podria vender esta información a empresas interesadas para que mejoren sus estimaciones y servicios. También puede interesar a bancos para análisis de riesgos.