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