library(readxl)
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(ggplot2)
library(knitr)
library(kableExtra)
##
## Attaching package: 'kableExtra'
## The following object is masked from 'package:dplyr':
##
## group_rows
library(RecordLinkage)
## Loading required package: DBI
## Loading required package: RSQLite
## Loading required package: ff
## Loading required package: bit
##
## Attaching package: 'bit'
## The following object is masked from 'package:dplyr':
##
## symdiff
## The following object is masked from 'package:base':
##
## xor
## Attaching package ff
## - getOption("fftempdir")=="/tmp/RtmpNPG5L1/ff"
## - getOption("ffextension")=="ff"
## - getOption("ffdrop")==TRUE
## - getOption("fffinonexit")==TRUE
## - getOption("ffpagesize")==65536
## - getOption("ffcaching")=="mmnoflush" -- consider "ffeachflush" if your system stalls on large writes
## - getOption("ffbatchbytes")==16777216 -- consider a different value for tuning your system
## - getOption("ffmaxbytes")==536870912 -- consider a different value for tuning your system
##
## Attaching package: 'ff'
## The following objects are masked from 'package:utils':
##
## write.csv, write.csv2
## The following objects are masked from 'package:base':
##
## is.factor, is.ordered
## RecordLinkage library
## [c] IMBEI Mainz
##
## Attaching package: 'RecordLinkage'
## The following object is masked from 'package:bit':
##
## clone
## The following object is masked from 'package:base':
##
## isFALSE
library(leaflet)
library(htmltools)
library(readxl)
datos <- read_excel("Datos_Vivienda (2).xlsx")
head(datos)
## # A tibble: 6 × 12
## Zona piso Estrato precio_millon Area_contruida parqueaderos Banos
## <chr> <chr> <dbl> <dbl> <dbl> <chr> <dbl>
## 1 Zona Sur 2 6 880 237 2 5
## 2 Zona Oeste 2 4 1200 800 3 6
## 3 Zona Sur 3 5 250 86 NA 2
## 4 Zona Sur NA 6 1280 346 4 6
## 5 Zona Sur 2 6 1300 600 4 7
## 6 Zona Sur 3 6 513 160 2 4
## # ℹ 5 more variables: Habitaciones <dbl>, Tipo <chr>, Barrio <chr>,
## # cordenada_longitud <dbl>, Cordenada_latitud <dbl>
id = 1:dim(datos)[1]
datos= data.frame(id,datos) ## Esre código genera una nueva columna llamada id, con los numeros desde el 1 asta el numero de filas de la tabla de datos, y luego agrega un numero a cada dato.
require(RecordLinkage)
# filtro
#busca coicidencias de nombres similares : ej "villa del prado"
pos = which(jarowinkler("valle del lili", datos$Barrio)>0.98)
datos_subdatos=datos[pos,]
head(datos_subdatos)
## id Zona piso Estrato precio_millon Area_contruida parqueaderos Banos
## 8 8 Zona Sur 5 5 310 82.5 1 2
## 9 9 Zona Sur 9 4 240 80.0 1 2
## 12 12 Zona Sur NA 5 230 70.0 1 2
## 13 13 Zona Sur NA 5 160 63.0 NA 2
## 14 14 Zona Sur 6 5 200 71.0 1 2
## 15 15 Zona Sur NA 5 270 76.0 NA 2
## Habitaciones Tipo Barrio cordenada_longitud Cordenada_latitud
## 8 3 Apartamento valle del lili -76.46438 3.43463
## 9 3 Apartamento valle del lili -76.46438 3.43463
## 12 2 Apartamento valle del lili -76.46500 3.43600
## 13 2 Apartamento valle del lili -76.46500 3.43600
## 14 3 Apartamento valle del lili -76.46500 3.43600
## 15 3 Apartamento valle del lili -76.46500 3.43600
library(dplyr)
names(datos_subdatos)
## [1] "id" "Zona" "piso"
## [4] "Estrato" "precio_millon" "Area_contruida"
## [7] "parqueaderos" "Banos" "Habitaciones"
## [10] "Tipo" "Barrio" "cordenada_longitud"
## [13] "Cordenada_latitud"
length(pos)
## [1] 1008
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_subdatos$cordenada_longitud, lat = datos_subdatos$Cordenada_latitud, radius
= 1, color = "purple", label = paste0( 'ID',datos_subdatos$ID, 'Precio:', datos_subdatos$precio_millon,'Area:',
datos_subdatos$Area_contruida, 'Barrio:', datos_subdatos$Barrio,' Lat: ' ,datos_subdatos$Cordenada_latitud, 'Long:',datos_subdatos$cordenada_longitud)) %>% addTiles()
## Indicadores de centralidad y variabilidad para la variable "precio"
promedio_precio=mean (datos_subdatos$precio_millon,na.rm = TRUE)
mediana_precio=median(datos_subdatos$precio_millon,na.rm = TRUE)
minimo_precio=min(datos_subdatos$precio_millon,na.rm = TRUE)
maximo_precio= max(datos_subdatos$precio_millon,na.rm = TRUE)
desvest_precio=sd(datos_subdatos$precio_millon, na.rm = TRUE)
indic_precio=data.frame(promedio_precio,mediana_precio, minimo_precio, maximo_precio, desvest_precio)
indic_precio
## promedio_precio mediana_precio minimo_precio maximo_precio desvest_precio
## 1 243.1716 235 108 800 85.7378
library(plotly)
##
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
##
## last_plot
## The following object is masked from 'package:stats':
##
## filter
## The following object is masked from 'package:graphics':
##
## layout
g1=ggplot(data = datos_subdatos, mapping = aes(x=precio_millon))+ geom_histogram(fill="purple")+theme_bw()
ggplotly(g1)
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
#Analisis Exploratorio En el análisis exploratorio que realicé sobre los precios de vivienda en Valle del Lili, encontré que el valor promedio es de aproximadamente 243 millones de pesos, con una mediana de 235 millones, lo que indica una ligera asimetría positiva en la distribución. Esto se confirma con la gráfica de histograma, donde la mayoría de los inmuebles se concentran en rangos de precios bajos y hay unos pocos valores altos que actúan como outliers. El precio mínimo registrado es de 108 millones y el máximo llega hasta 800 millones, evidenciando una alta dispersión. Además, la desviación estándar es de 85.7 millones, lo cual refuerza la idea de una variabilidad considerable en los precios dentro del barrio. Esta información me permite entender que, aunque la mayoría de las viviendas se ubican en un rango accesible, también hay propiedades significativamente más costosas que elevan el promedio general.
library(ggplot2)
library(plotly)
# Crear gráfico interactivo con correlación
ggplotly(
ggplot(datos_subdatos, 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_subdatos$precio_millon, datos_subdatos$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)
)
)
## `geom_smooth()` using formula = 'y ~ x'
#Analisis Bivariado En el análisis bivariado entre el precio y el área construida de las viviendas en Valle del Lili, observo una relación positiva moderadamente fuerte, con un coeficiente de correlación de 0.7. Esto indica que, en general, a mayor área construida, mayor es el precio del inmueble. Sin embargo, la relación no es estrictamente lineal: la curva ajustada sugiere un crecimiento acelerado del precio hasta cierto punto (alrededor de los 400–500 m²), tras el cual la tendencia comienza a estabilizarse o incluso a disminuir levemente. Esto puede deberse a que, a partir de cierto tamaño, otras variables como ubicación exacta, tipo de inmueble o acabados adquieren mayor peso que el área misma. También se observan algunos valores atípicos que, a pesar de tener grandes áreas, no presentan precios proporcionalmente altos, lo cual podría deberse a factores como estado de conservación o menor demanda en ese segmento específico
#Modelo de Regresion Multiple
mod2 = lm(precio_millon~Area_contruida + Habitaciones + parqueaderos , data = datos_subdatos)
summary (mod2)
##
## Call:
## lm(formula = precio_millon ~ Area_contruida + Habitaciones +
## parqueaderos, data = datos_subdatos)
##
## Residuals:
## Min 1Q Median 3Q Max
## -501.07 -31.42 -0.70 27.84 329.97
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 98.66154 8.79826 11.214 <2e-16 ***
## Area_contruida 0.65933 0.03312 19.909 <2e-16 ***
## Habitaciones 28.96922 3.31547 8.738 <2e-16 ***
## parqueaderos10 -57.50504 53.13994 -1.082 0.279
## parqueaderos2 52.02641 5.10733 10.187 <2e-16 ***
## parqueaderos3 36.06594 24.63716 1.464 0.144
## parqueaderos4 73.81438 53.05825 1.391 0.164
## parqueaderosNA -41.44293 4.58368 -9.041 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 52.92 on 1000 degrees of freedom
## Multiple R-squared: 0.6216, Adjusted R-squared: 0.619
## F-statistic: 234.7 on 7 and 1000 DF, p-value: < 2.2e-16
El modelo de regresión lineal muestra que el precio de las propiedades en el Valle del Lili está influenciado principalmente por dos factores clave: el área construida y el número de habitaciones, lo que tiene sentido, ya que son características directas de la propiedad. Sin embargo, el número de parqueaderos no parece tener un impacto significativo en el precio, a excepción de algunas categorías como tener 2 parqueaderos, que sí muestra una relación positiva. Esto podría reflejar que, en el Valle del Lili, la oferta de parqueaderos no es tan determinante para el valor de las propiedades como otros factores. Además, el modelo explica el 62% de la variabilidad en el precio de las propiedades, lo que indica un buen ajuste, pero también deja espacio para otras variables no incluidas, como factores específicos de la ubicación o características adicionales del mercado local que podrían mejorar la predicción, como la cercanía a zonas comerciales o de transporte.
mod_multiple2=step(mod2)
## Start: AIC=8009.14
## precio_millon ~ Area_contruida + Habitaciones + parqueaderos
##
## Df Sum of Sq RSS AIC
## <none> 2800838 8009.1
## - Habitaciones 1 213832 3014670 8081.3
## - parqueaderos 5 606277 3407116 8196.7
## - Area_contruida 1 1110140 3910979 8343.7
Al analizar los resultados del AIC, puedo concluir que las tres variables del modelo (Area_contruida, Habitaciones y parqueaderos) son relevantes para predecir el precio de las propiedades en el Valle del Lili. Al eliminar cualquiera de ellas, el AIC aumenta, lo que indica que el modelo pierde precisión y capacidad predictiva. En particular, la eliminación de Area_contruida tiene el mayor impacto negativo, seguido por parqueaderos y Habitaciones, lo que refuerza la idea de que estas variables contribuyen significativamente al ajuste del modelo. Por lo tanto, parece que todas son necesarias para obtener una buena predicción del precio.
summary(mod2)
##
## Call:
## lm(formula = precio_millon ~ Area_contruida + Habitaciones +
## parqueaderos, data = datos_subdatos)
##
## Residuals:
## Min 1Q Median 3Q Max
## -501.07 -31.42 -0.70 27.84 329.97
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 98.66154 8.79826 11.214 <2e-16 ***
## Area_contruida 0.65933 0.03312 19.909 <2e-16 ***
## Habitaciones 28.96922 3.31547 8.738 <2e-16 ***
## parqueaderos10 -57.50504 53.13994 -1.082 0.279
## parqueaderos2 52.02641 5.10733 10.187 <2e-16 ***
## parqueaderos3 36.06594 24.63716 1.464 0.144
## parqueaderos4 73.81438 53.05825 1.391 0.164
## parqueaderosNA -41.44293 4.58368 -9.041 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 52.92 on 1000 degrees of freedom
## Multiple R-squared: 0.6216, Adjusted R-squared: 0.619
## F-statistic: 234.7 on 7 and 1000 DF, p-value: < 2.2e-16
Al analizar este modelo de regresión, puedo concluir que el área construida y el número de habitaciones son los factores más relevantes para predecir el precio de las propiedades en el Valle del Lili, ya que ambos tienen coeficientes significativos y contribuyen considerablemente al valor final. En cuanto a los parqueaderos, aunque algunas categorías como tener 2 parqueaderos tienen un impacto positivo significativo, otras, como tener 10 parqueaderos o un valor desconocido de parqueaderos, no parecen influir de manera clara en el precio. El modelo explica el 62% de la variabilidad en el precio, lo que indica que hay factores adicionales que podrían mejorar la predicción, aunque el ajuste general es razonable.
#Validacion de Supuestos
par(mfrow=c(2,2))
plot(mod2)
## Warning: not plotting observations with leverage one:
## 30, 298
En general, los residuos parecen no mostrar problemas graves. La distribución de los residuos es bastante aleatoria y cercana a una normalidad, y no hay signos claros de heterocedasticidad. Sin embargo, algunos puntos con alto leverage y ciertos residuos extremos merecen atención adicional, ya que podrían estar influyendo en el ajuste del modelo de manera significativa. Se recomienda investigar más a fondo estos puntos para verificar su validez y considerar si deberían ser eliminados o tratados de alguna manera.
mod3=lm(log(precio_millon)~log(Area_contruida)+Habitaciones+parqueaderos,data = datos_subdatos)
summary (mod3)
##
## Call:
## lm(formula = log(precio_millon) ~ log(Area_contruida) + Habitaciones +
## parqueaderos, data = datos_subdatos)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1.31685 -0.10336 0.01296 0.11093 0.64422
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 2.826544 0.077271 36.580 < 2e-16 ***
## log(Area_contruida) 0.588485 0.020857 28.216 < 2e-16 ***
## Habitaciones 0.013534 0.011701 1.157 0.248
## parqueaderos10 0.064178 0.177084 0.362 0.717
## parqueaderos2 0.096341 0.017683 5.448 6.4e-08 ***
## parqueaderos3 -0.007176 0.081873 -0.088 0.930
## parqueaderos4 0.155629 0.176315 0.883 0.378
## parqueaderosNA -0.175997 0.015519 -11.340 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.1758 on 1000 degrees of freedom
## Multiple R-squared: 0.7092, Adjusted R-squared: 0.7071
## F-statistic: 348.3 on 7 and 1000 DF, p-value: < 2.2e-16
En el Valle del Lili, al meterme a analizar los precios de las casas con esta nueva información de los parqueaderos, encontré cosas muy interesantes. Por ejemplo, noté que si una casa crece un poquito en tamaño, digamos un 1% más de área construida, su precio tiende a subir alrededor de un 0.59%. Las habitaciones, por lo que veo, siguen sin ser un factor determinante en cuánto cuesta una casa por aquí, una vez que consideramos el tamaño y dónde guardar el carro.
Pero lo que sí me llamó la atención es el tema de los parqueaderos. ¡Tener dos espacios para parquear sí que parece importante! Las casas que tienen dos lugares para el carro suelen ser casi un 9.6% más costosas que las que tienen uno o quizás ninguno especificado. Curiosamente, tener más de dos, ya sean tres o cuatro, no parece hacer una gran diferencia en el precio, al menos con los datos que tengo a la mano.
Ahora, lo que sí me dejó pensando es que cuando no sabemos cuántos parqueaderos tiene una casa, o si no tiene ninguno registrado, ¡su precio tiende a ser bastante más bajo!, casi un 17.6% menos. Esto me hace pensar que quizás las casas más económicas de nuestro barrio a veces no tienen parqueadero o esa información no está clara.
mod_fin=lm(log(precio_millon)~log(Area_contruida)+Habitaciones,data = datos_subdatos)
summary (mod_fin)
##
## Call:
## lm(formula = log(precio_millon) ~ log(Area_contruida) + Habitaciones,
## data = datos_subdatos)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1.45820 -0.13329 0.02355 0.13533 0.56467
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 2.41360 0.07240 33.337 <2e-16 ***
## log(Area_contruida) 0.67877 0.02037 33.323 <2e-16 ***
## Habitaciones 0.01346 0.01240 1.086 0.278
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.1896 on 1005 degrees of freedom
## Multiple R-squared: 0.6601, Adjusted R-squared: 0.6594
## F-statistic: 975.7 on 2 and 1005 DF, p-value: < 2.2e-16
en el Valle del Lili, al simplificar el análisis de los precios de las casas y fijarme solo en el tamaño y las habitaciones, confirmé que el tamaño sí que influye bastante: una casa 1% más grande tiende a costar alrededor de un 0.68% más. Las habitaciones, por otro lado, no parecen marcar una gran diferencia en el precio una vez que se tiene en cuenta el tamaño. Con estas dos cosas, entiendo como el 66% de por qué los precios de las casas varían por aquí. tiene sentido que el tamaño sea un factor clave en el valor de las propiedades de Valle del lili.
par(mfrow=c(2,2))
plot(mod_fin)
las Gráficas de los errores del modelo de precios de casas en el Valle del Lili, veo que, en general, los errores se distribuyen de manera más o menos aleatoria alrededor de cero, lo cual es positivo. Sin embargo, noto que la dispersión de los errores tiende a ser un poco mayor para las casas más caras, lo que sugiere que la precisión de nuestro modelo podría variar según el precio. Aunque la distribución de los errores se acerca a lo normal, hay algunas casas que no estamos prediciendo tan bien y que, además, tienen características algo inusuales. Estos casos particulares podrían estar influyendo en nuestro modelo, así que valdría la pena revisarlos para ver si podemos mejorarlo y entender aún mejor los precios de las viviendas en nuestro vecindario.
y_log=predict(mod_fin,list(Area_contruida=100, Habitaciones=4))
exp(y_log)
## 1
## 268.6153
x_log=predict(mod_fin,list(Area_contruida=100, Habitaciones=6))
exp(x_log)
## 1
## 275.946
#Conclusiones
en el Valle del Lili, y viendo estas últimas predicciones, podemos sacar algunas conclusiones generales. Primero, transformar el precio y el área construida con logaritmos nos ha permitido entender mejor cómo los cambios porcentuales en el tamaño se relacionan con los cambios porcentuales en el precio. Vimos que el tamaño es un factor consistentemente importante, aunque la influencia de otras variables como el número de habitaciones y, en algunos modelos, los baños y los parqueaderos, varía. Las gráficas de los residuos nos mostraron que, si bien nuestro modelo es razonable, hay aspectos que podríamos refinar, especialmente en relación con la varianza de los errores y algunos casos particulares que podrían estar influyendo en los resultados. Finalmente, al observar las predicciones, como la diferencia en el precio estimado para una casa de 100 metros cuadrados con 4 habitaciones (alrededor de 268.6 millones) versus una con 6 habitaciones (aproximadamente 275.9 millones), parece que, manteniendo el tamaño constante, un aumento en el número de habitaciones tiene un impacto positivo, aunque quizás no tan grande como el del área construida. En resumen, nuestro análisis nos ha dado una buena perspectiva de los factores que influyen en los precios de las viviendas en nuestro vecindario del Valle del Lili, aunque siempre hay espacio para seguir aprendiendo y mejorando nuestro entendimiento.