library(readxl)
library(dplyr)
library(ggplot2)
library(plotly)
library(knitr)
library(kableExtra)
library(RecordLinkage)
library(tidyr)
library(leaflet)
library(htmltools)
library(readxl)
datos <- read_excel("d:/Users/juans/Escritorio/fotos eco/datos.xlsx")
id=1:dim(datos)[1]
datos=data.frame(id,datos)
pos = which(jarowinkler("ciudad jardin", datos$Barrio) > 0.98)
datos_sub = datos[pos,]
head(datos_sub)
## id Zona piso Estrato precio_millon Area_contruida parqueaderos Banos
## 4 4 Zona Sur NA 6 1280 346 4 6
## 7 7 Zona Sur 2 6 870 490 3 6
## 17 17 Zona Sur NA 6 650 255 2 5
## 23 23 Zona Sur 1 6 850 300 4 6
## 24 24 Zona Sur 12 6 580 145 2 5
## 36 36 Zona Sur 3 6 595 146 2 4
## Habitaciones Tipo Barrio cordenada_longitud Cordenada_latitud
## 4 5 Apartamento ciudad jardin -76.46400 3.43300
## 7 5 Casa ciudad jardin -76.46438 3.43463
## 17 5 Casa ciudad jardin -76.46541 3.43312
## 23 4 Casa ciudad jardin -76.46691 3.42334
## 24 3 Apartamento ciudad jardin -76.46691 3.42334
## 36 4 Apartamento ciudad jardin -76.46851 3.42544
## ...13
## 4 NA
## 7 NA
## 17 NA
## 23 NA
## 24 NA
## 36 NA
library(dplyr)
names(datos_sub)
## [1] "id" "Zona" "piso"
## [4] "Estrato" "precio_millon" "Area_contruida"
## [7] "parqueaderos" "Banos" "Habitaciones"
## [10] "Tipo" "Barrio" "cordenada_longitud"
## [13] "Cordenada_latitud" "...13"
length(pos)
## [1] 540
Analisis exploratorio inicial
hist(datos_sub$precio_millon,
main = "Distribución del Precio - Ciudad Jardín",
xlab = "Precio (millones)", col = "skyblue", border = "white")
La distribución es asimétrica a la derecha, lo que indica que hay varias
viviendas con precios considerablemente más altos (hasta cerca de 2000
millones) que pueden ser considerados outliers o propiedades
premium.
boxplot(datos_sub$precio_millon,
main = "Boxplot del Precio - Ciudad Jardín",
ylab = "Precio (millones)", col = "orange", horizontal = TRUE)
Se identifican varios outliers por encima de los 1500 millones, lo que
indica la presencia de propiedades significativamente más caras que el
promedio.
boxplot(precio_millon ~ Tipo, data = datos_sub,
main = "Precio por Tipo de Vivienda - ciudad Jardín",
xlab = "Tipo", ylab = "Precio (millones)", col = "gold")
La mediana de las casas supera ampliamente la de los apartamentos, y también presentan una mayor dispersión en los precios. Además, ambos tipos de vivienda tienen valores atípicos, aunque son más frecuentes en los apartamentos.
library(ggplot2)
library(plotly)
# Crear gráfico interactivo con correlación
ggplotly(
ggplot(datos_sub, aes(x = Area_contruida, y = precio_millon)) +
geom_point(color = "purple", alpha = 0.8, size = 2) + # Puntos con color y transparencia
geom_smooth(method = "loess", color = "grey", se = TRUE) + # Línea de tendencia
labs(
title = paste("Figura 5. 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 de 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)
)
)
Esto indica que a mayor área construida, mayor tiende a ser el precio. Sin embargo, se observan algunas dispersiones para áreas grandes, lo que sugiere que no todos los inmuebles con gran área son necesariamente más caros
require(leaflet)
#мара 2
#Etiqueta enriquecida (Tabel) muestra información detallada del punto, incluyendo:
#ID del inmueble.
#precio en millones.
#Área construida.
#Barrio.
#Latitud y longitud.
#Añade un fondo de mapa base → addtiles()
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()
Análisis Bivariado
#Gráfico de dispersión entre precio viviendas y baños
##exploración bivariada
g1= ggplot(data = datos_sub,mapping = aes(x=Banos,y=precio_millon))+geom_point()+theme_bw()+geom_smooth()
ggplotly(g1)
La relación positiva entre el número de baños y el precio de la vivienda. A medida que aumenta la cantidad de baños, también lo hace el precio, aunque con una dispersión significativa especialmente en valores altos, lo que sugiere que el número de baños influye en el precio, pero no es el único determinante. Sin embargo la curva suavizada indica un crecimiento sostenido, aunque con desaceleración en los extremos superiores. lo que podría reflejar un punto de saturación donde agregar más baños no incrementa tanto el valor de la propiedad.
Modelacion Simple
Ciudad_Jardin <- subset(datos, tolower(Barrio) == "ciudad jardin")
# Estimar el modelo de regresión lineal para ciudad jardin
mod1 <- lm(precio_millon ~ Area_contruida, data = Ciudad_Jardin)
summary(mod1)
##
## Call:
## lm(formula = precio_millon ~ Area_contruida, data = Ciudad_Jardin)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1008.5 -155.7 -48.9 89.4 1047.5
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 358.14821 19.34712 18.51 <2e-16 ***
## Area_contruida 1.54502 0.06213 24.87 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 256.3 on 538 degrees of freedom
## Multiple R-squared: 0.5347, Adjusted R-squared: 0.5339
## F-statistic: 618.4 on 1 and 538 DF, p-value: < 2.2e-16
R² = 0.5347 Aproximadamente el 53.47% de la variabilidad en el precio de las viviendas se explica por el área construida. Esto indica un buen ajuste para un modelo simple, pero también sugiere que hay otras variables que podrían estar influyendo.
Error estándar residual = 256.3 En promedio, el modelo se equivoca en unos 256 millones de pesos, lo que podría considerarse moderado dependiendo del rango total de precios.
Valores residuales (mínimos y máximos) Las diferencias entre los valores reales y los predichos van desde –1008.5 hasta +1047.5 millones, lo que muestra que hay viviendas bastante atípicas o con precios extremos no explicados solo por el área construida.
mod1.2 = lm(precio_millon~Banos,data=datos_sub)
summary (mod1.2)
##
## Call:
## lm(formula = precio_millon ~ Banos, data = datos_sub)
##
## Residuals:
## Min 1Q Median 3Q Max
## -556.2 -196.2 -66.2 123.8 1138.8
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 66.160 37.899 1.746 0.0814 .
## Banos 165.014 8.594 19.201 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 289.5 on 538 degrees of freedom
## Multiple R-squared: 0.4066, Adjusted R-squared: 0.4055
## F-statistic: 368.7 on 1 and 538 DF, p-value: < 2.2e-16
Vemos que el número de baños tiene una relación positiva y significativa con el precio de la vivienda en millones, estimando un aumento promedio de $165 millones por cada baño adicional. Aunque el modelo es estadísticamente significativo (p < 0.001), solo explica aproximadamente el 0.47 de la variabilidad en los precios, lo que indica que hay otros factores importantes que también influyen en el valor de las viviendas.
par(mfrow=c(2,2))
plot(mod1)
Los gráficos de diagnóstico muestran ligera no linealidad, heterocedasticidad y algunos valores influyentes, lo que indica que el modelo lineal podría mejorarse con transformaciones o variables adicionales.
Modelación Múltiple
Ciudad_Jardin <- subset(datos, tolower(Barrio) == "ciudad jardin")
# Estimar el modelo de regresión lineal para ciudad jardin
mod2 <- lm(precio_millon ~ Area_contruida + Habitaciones + Banos + piso, data = Ciudad_Jardin)
summary(mod2)
##
## Call:
## lm(formula = precio_millon ~ Area_contruida + Habitaciones +
## Banos + piso, data = Ciudad_Jardin)
##
## Residuals:
## Min 1Q Median 3Q Max
## -763.48 -137.46 -36.73 75.09 1015.82
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 168.82701 49.83629 3.388 0.000758 ***
## Area_contruida 1.14445 0.07663 14.934 < 2e-16 ***
## Habitaciones -4.70719 14.57855 -0.323 0.746911
## Banos 81.11939 11.53322 7.034 6.32e-12 ***
## piso10 178.55855 111.92820 1.595 0.111249
## piso11 -89.01231 96.31371 -0.924 0.355812
## piso12 -1.31472 75.94359 -0.017 0.986194
## piso2 -31.37304 36.54590 -0.858 0.391033
## piso3 -61.36604 39.96767 -1.535 0.125291
## piso4 -91.56792 55.11089 -1.662 0.097207 .
## piso5 -52.74905 60.14018 -0.877 0.380833
## piso6 13.91705 73.42630 0.190 0.849745
## piso7 20.64547 102.79762 0.201 0.840905
## piso8 31.45484 68.74339 0.458 0.647452
## piso9 -118.10992 103.30755 -1.143 0.253443
## pisoNA -19.47139 35.57063 -0.547 0.584336
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 240.5 on 524 degrees of freedom
## Multiple R-squared: 0.6008, Adjusted R-squared: 0.5894
## F-statistic: 52.59 on 15 and 524 DF, p-value: < 2.2e-16
El modelo explica un 0.60 de la variabilidad del precio; el área construida y el número de baños son significativos, mientras que las demás variables, como habitaciones y piso, no lo son estadísticamente.
Selección de Variables
mod_multiple2=step(mod2)
## Start: AIC=5937.31
## precio_millon ~ Area_contruida + Habitaciones + Banos + piso
##
## Df Sum of Sq RSS AIC
## - piso 12 660207 30980778 5924.9
## - Habitaciones 1 6033 30326604 5935.4
## <none> 30320571 5937.3
## - Banos 1 2862559 33183130 5984.0
## - Area_contruida 1 12905541 43226113 6126.8
##
## Step: AIC=5924.95
## precio_millon ~ Area_contruida + Habitaciones + Banos
##
## Df Sum of Sq RSS AIC
## - Habitaciones 1 17110 30997888 5923.2
## <none> 30980778 5924.9
## - Banos 1 3160309 34141087 5975.4
## - Area_contruida 1 13743852 44724629 6121.2
##
## Step: AIC=5923.24
## precio_millon ~ Area_contruida + Banos
##
## Df Sum of Sq RSS AIC
## <none> 30997888 5923.2
## - Banos 1 4343974 35341862 5992.1
## - Area_contruida 1 14077285 45075173 6123.4
Vemos a que al eliminar “piso” y “habitaciones”, el AIC mejora, indicando que estas variables son menos relevantes. El modelo más eficiente es el que incluye solo “área construida” y “baños”, con un AIC de 5923.24, lo que sugiere que estas variables son las más influyentes para predecir el precio.
par(mfrow=c(2,2))
plot(mod_multiple2)
Interacción con variable dummy
mod_int = lm(precio_millon~Tipo:Area_contruida+Banos,data=datos_sub)
summary (mod_int)
##
## Call:
## lm(formula = precio_millon ~ Tipo:Area_contruida + Banos, data = datos_sub)
##
## Residuals:
## Min 1Q Median 3Q Max
## -791.02 -133.25 -51.52 75.24 1077.93
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 74.21115 35.31898 2.101 0.0361 *
## Banos 82.35416 9.00665 9.144 <2e-16 ***
## TipoApartamento:Area_contruida 1.66585 0.16087 10.355 <2e-16 ***
## TipoCasa:Area_contruida 1.20317 0.07435 16.182 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 237.7 on 536 degrees of freedom
## Multiple R-squared: 0.6015, Adjusted R-squared: 0.5992
## F-statistic: 269.7 on 3 and 536 DF, p-value: < 2.2e-16
El modelo de regresión muestra que tanto el número de baños como las interacciones entre el tipo de vivienda y el área construida son altamente significativos con p-valores menores a 0.001. El intercepto es significativo con un valor p de 0.0361. El valor de R-cuadrado ajustado es de 0.5992, lo que indica que el modelo explica aproximadamente el 60% de la variabilidad en el precio. El error estándar residual es de 237.7, lo que sugiere que la predicción tiene una desviación moderada respecto a los valores reales.
par(mfrow=c(2,2))
plot(mod_int)
Transformación datos Modelo Múltiple
mod_log=lm(precio_millon~log(Area_contruida)+Banos+Habitaciones,data = datos_sub)
summary (mod_log)
##
## Call:
## lm(formula = precio_millon ~ log(Area_contruida) + Banos + Habitaciones,
## data = datos_sub)
##
## Residuals:
## Min 1Q Median 3Q Max
## -688.32 -134.12 -16.63 71.97 1002.00
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -1702.12 95.76 -17.776 <2e-16 ***
## log(Area_contruida) 436.95 22.66 19.282 <2e-16 ***
## Banos 43.91 10.86 4.045 6e-05 ***
## Habitaciones -17.49 13.32 -1.313 0.19
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 222 on 536 degrees of freedom
## Multiple R-squared: 0.6524, Adjusted R-squared: 0.6504
## F-statistic: 335.3 on 3 and 536 DF, p-value: < 2.2e-16
El área construida, transformada en logaritmo, y el número de baños son muy relevantes para predecir el precio, ya que ambos tienen p-valores muy bajos. Sin embargo, el número de habitaciones no tiene un impacto significativo, ya que su p-valor es bastante alto (0.19). El modelo explica el 65% de la variabilidad del precio, lo cual es bastante bueno. El error estándar residual es 222, lo que significa que las predicciones tienen una desviación moderada de los valores reales. En resumen, el modelo es bastante robusto, y las variables más importantes son el área construida y los baños.
par(mfrow=c(2,2))
plot(mod_log)
podemos ver que hay cierta no linealidad y posible heterocedasticidad,
lo que indica que los errores no tienen varianza constante. Además,
algunos puntos influyentes podrían estar afectando el modelo. Aunque el
ajuste general es aceptable, sería recomendable considerar
transformaciones o eliminar outliers para mejorar la precisión.
Predicción.
¿Que pasa al tratar de predecir con este modelo,el precio aproximado de una vivienda con un área de 300, 4 habitacones y 5 baños?
mod_predict=predict(mod_log,list(Area_contruida=300,Habitaciones=4,Banos=5))
mod_predict
## 1
## 939.7481
El precio estimado es aproximadamente 1,939.75 millones. Aplicación del Modelo
El modelo se puede aplicarse para crear herramientas de valoración automática de propiedades, donde los usuarios ingresan datos como el área, el número de habitaciones y baños para obtener una estimación rápida del precio. También es útil para agencias inmobiliarias que deseen optimizar los precios de venta y compra. Los beneficios incluyen una mayor precisión en las valoraciones, decisiones informadas para inversores y ahorro de tiempo en el proceso de tasación. Podrías lucrar ofreciendo estos servicios a través de plataformas en línea o consultorías para agencias inmobiliarias, facilitando la compra y venta de propiedades de manera más eficiente.