library(readxl)
library(dplyr)
library(ggplot2)
library(plotly)
library(knitr)
library(tidyr)
library(RecordLinkage)
library(leaflet)
library(htmltools)
library(readxl)
Datos_Vivienda <- read_excel("C:/Users/Juan Manuel Pareja/Downloads/Datos_Vivienda.xlsx")
View(Datos_Vivienda)
#Estimamos modelo de regresión simple
mod1=lm(precio_millon~Area_contruida, data=Datos_Vivienda)
summary (mod1)
##
## Call:
## lm(formula = precio_millon ~ Area_contruida, data = Datos_Vivienda)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2659.88 -120.78 -47.55 67.27 1330.10
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 157.47636 4.13640 38.07 <2e-16 ***
## Area_contruida 1.58018 0.01831 86.30 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 238.7 on 8317 degrees of freedom
## Multiple R-squared: 0.4725, Adjusted R-squared: 0.4724
## F-statistic: 7448 on 1 and 8317 DF, p-value: < 2.2e-16
id = 1:dim(Datos_Vivienda)[1]
datos= data.frame(id,Datos_Vivienda) ## Este código genera una nueva columna llamada id, con los numeros desde el 1 hasta 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("la flora", datos$Barrio)>0.98)
datos_subdatos=Datos_Vivienda[pos,]
head(datos_subdatos)
## # A tibble: 6 × 12
## Zona piso Estrato precio_millon Area_contruida parqueaderos Banos
## <chr> <chr> <dbl> <dbl> <dbl> <chr> <dbl>
## 1 Zona Norte NA 5 340 106 2 2
## 2 Zona Norte 4 5 320 85 1 2
## 3 Zona Norte 1 5 320 87 2 2
## 4 Zona Norte 11 5 350 104 2 3
## 5 Zona Norte 9 5 285 84 1 2
## 6 Zona Norte 7 5 300 88 1 3
## # ℹ 5 more variables: Habitaciones <dbl>, Tipo <chr>, Barrio <chr>,
## # cordenada_longitud <dbl>, Cordenada_latitud <dbl>
library(dplyr)
names(datos_subdatos)
## [1] "Zona" "piso" "Estrato"
## [4] "precio_millon" "Area_contruida" "parqueaderos"
## [7] "Banos" "Habitaciones" "Tipo"
## [10] "Barrio" "cordenada_longitud" "Cordenada_latitud"
##indicadores de centralidad
## Se calcula el promedio del precio, el area construida, las habitaciones,
## registros totales para el bariro villa del prado
length(pos)
## [1] 366
contamos con 306 apartamentos en la flora
##analisis exploratorio
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 = "red", 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()
mapea muestra el numero de apartamentos que se encuentran en la flora
##PROMEDIO DE PRECIOS DE LOS APARTAMENTOS EN LA FLORA**
## 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 377.0792 350 150 1400 134.1776
Se puede observar que en promedio los apartamentos cuestan 377 millones de cop, con una desviscion de 134,17 millones, el apto mas economico esta en 150 millones y la de mayor precio rondando los 1400 millones
library(plotly)
g1=ggplot(data = datos_subdatos, mapping = aes(x=precio_millon))+ geom_histogram(fill="yellow")+theme_bw()
ggplotly(g1)
La gráfica muestra que la mayoría de los apartamentos tienen precios entre 200 y 500 millones de pesos, concentrándose especialmente alrededor de los 300 millones. La distribución está sesgada hacia la derecha, con pocos apartamentos en rangos de precios muy altos (superiores a 800 millones), lo que indica que el mercado se concentra en viviendas de rango medio, mientras que el segmento de lujo es reducido y menos frecuente.
##ANALISIS BIVARIADO
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 = "yellow", 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)
)
)
La gráfica muestra una relación positiva entre el área construida y el precio de los apartamentos, con un coeficiente de correlación de 0.77, lo que indica una fuerte asociación. A mayor área, el precio tiende a aumentar, aunque no de forma completamente lineal, especialmente en áreas grandes donde el incremento en el precio se acelera. Esto sugiere que el tamaño del inmueble es un factor clave en la valorización del precio en el mercado.
Modelo de regresion multiple Se busca definir qué factores influyen con mayor impacto en el precio de los partamentos en la flora
mod2 = lm(precio_millon~Area_contruida + Habitaciones + Banos , data = datos_subdatos)
summary (mod2)
##
## Call:
## lm(formula = precio_millon ~ Area_contruida + Habitaciones +
## Banos, data = datos_subdatos)
##
## Residuals:
## Min 1Q Median 3Q Max
## -257.24 -51.60 -5.51 52.06 492.03
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 210.69192 15.30931 13.762 < 2e-16 ***
## Area_contruida 0.78720 0.04871 16.160 < 2e-16 ***
## Habitaciones -23.94417 5.66386 -4.228 3.00e-05 ***
## Banos 43.60860 5.88041 7.416 8.65e-13 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 80.34 on 362 degrees of freedom
## Multiple R-squared: 0.6444, Adjusted R-squared: 0.6415
## F-statistic: 218.7 on 3 and 362 DF, p-value: < 2.2e-16
Evaluacion modelo R² = 0.644 modelo explica aproximadamente el 64% la variabilidad en el precio, lo cual es aceptable. p-value < 2.2e-16: El modelo es estadísticamente significativo
##Selccion de variables
mod_multiple2=step(mod2)
## Start: AIC=3214.73
## precio_millon ~ Area_contruida + Habitaciones + Banos
##
## Df Sum of Sq RSS AIC
## <none> 2336530 3214.7
## - Habitaciones 1 115355 2451886 3230.4
## - Banos 1 354970 2691500 3264.5
## - Area_contruida 1 1685649 4022180 3411.5
summary(mod2)
##
## Call:
## lm(formula = precio_millon ~ Area_contruida + Habitaciones +
## Banos, data = datos_subdatos)
##
## Residuals:
## Min 1Q Median 3Q Max
## -257.24 -51.60 -5.51 52.06 492.03
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 210.69192 15.30931 13.762 < 2e-16 ***
## Area_contruida 0.78720 0.04871 16.160 < 2e-16 ***
## Habitaciones -23.94417 5.66386 -4.228 3.00e-05 ***
## Banos 43.60860 5.88041 7.416 8.65e-13 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 80.34 on 362 degrees of freedom
## Multiple R-squared: 0.6444, Adjusted R-squared: 0.6415
## F-statistic: 218.7 on 3 and 362 DF, p-value: < 2.2e-16
##validacion supuestos
par(mfrow=c(2,2))
plot(mod2)
En el gráfico de residuos vs valores ajustados se nota una ligera
curvatura en la tendencia, lo que sugiere que la relación entre las
variables no es completamente lineal. Además, la dispersión de los
puntos crece con los valores ajustados, lo que indica posible
heterocedasticidad. En el gráfico Q-Q, aunque muchos puntos siguen la
línea teórica, se observan desviaciones en los extremos, lo que señala
que los residuos no son perfectamente normales. La gráfica
Scale-Location refuerza la presencia de heterocedasticidad, ya que
muestra un aumento en la variabilidad de los residuos. Finalmente, en el
gráfico de residuos vs leverage, aparecen algunos puntos con alta
influencia, como los casos 8319 y 3193, que podrían estar afectando de
manera significativa los resultados del modelo.
##Transformacion del modelo
mod3=lm(log(precio_millon)~log(Area_contruida)+Habitaciones+Banos,data = datos_subdatos)
summary (mod3)
##
## Call:
## lm(formula = log(precio_millon) ~ log(Area_contruida) + Habitaciones +
## Banos, data = datos_subdatos)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.62674 -0.12192 0.00565 0.14630 0.66515
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 3.92072 0.09971 39.322 < 2e-16 ***
## log(Area_contruida) 0.38815 0.02646 14.672 < 2e-16 ***
## Habitaciones -0.06331 0.01374 -4.607 5.68e-06 ***
## Banos 0.10034 0.01458 6.883 2.59e-11 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.1937 on 362 degrees of freedom
## Multiple R-squared: 0.6227, Adjusted R-squared: 0.6196
## F-statistic: 199.1 on 3 and 362 DF, p-value: < 2.2e-16
##Transformacion de modelo
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
## -0.6663 -0.1310 -0.0022 0.1609 0.6389
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 3.74306 0.10228 36.60 <2e-16 ***
## log(Area_contruida) 0.45805 0.02594 17.66 <2e-16 ***
## Habitaciones -0.02710 0.01348 -2.01 0.0452 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.2057 on 363 degrees of freedom
## Multiple R-squared: 0.5733, Adjusted R-squared: 0.5709
## F-statistic: 243.9 on 2 and 363 DF, p-value: < 2.2e-16
par(mfrow=c(2,2))
plot(mod_fin)
El cportamiento de los residuos ha mejorado respecto al anterior. En la
gráfica de residuos vs valores ajustados, los puntos se distribuyen de
manera más simétrica alrededor de cero, sin patrones claros, lo que
sugiere que el supuesto de linealidad es más adecuado. El gráfico Q-Q
muestra que los residuos siguen bastante bien la línea de referencia,
aunque hay ligeras desviaciones en las colas, lo cual no es preocupante.
En la gráfica Scale-Location, la dispersión de los residuos es más
constante, lo que indica menor heterocedasticidad. Por último, aunque en
el gráfico de residuos vs leverage aparecen algunos puntos con cierta
influencia (como el 2295), no parecen representar una amenaza
significativa para el ajuste del modelo.
conclusiones -el modelo queda mejor ajustado evidenciando una mejora en la linealidad, normalidad y varianza constante
##Ponostico hipotetico ¿Que pasa al predecir con este modelo transformado, por ejemplo cual seria el precio de una vivienda con 70m2 de area construida y 2 hbitaciones?
y_log=predict(mod_fin,list(Area_contruida=70, Habitaciones=2))
exp(y_log)
## 1
## 280.0233
El precio de una vivienda que tenga 70 m2 de área construida y 2 habitacioneses aproximadamente de 280 millones
Log (precio_millon) = 3.74 +0.54Area_contruida + 0.03Habitaciones Log (precio_millon) = 3.74 +0.45(70) + 0.03(3)Log (precio_millon) = 280.023
x_log=predict(mod_fin,list(Area_contruida=70, Habitaciones=3))
exp(x_log)
## 1
## 272.5362
para que sirve este pronostico?? este pronostico nos sirve para darnos cuenta de que forma sale mas rentable y se puede vender a mayor valor en el barrio la flora la venta de apartamentos dependiendo de el numero de habitaciones que tiene