Paso 1: Cargar Librerias

library(readxl)
library(dplyr)
library(ggplot2)
library(knitr)
library(tidyr)
library(kableExtra)
library(RecordLinkage)
library(leaflet)
library(htmltools)

Paso 2: Filtrar la información que se necesita

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

Paso 3: Análisis Exploratorio Inicial

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()

Información Datos

## # 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

Paso 4: Análisis Bivariado

# 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

Paso 5: Modelación Regresión Múltple

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

Paso 6: Selección de Variables

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:

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.

Paso 7: Validación Supuestos

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.

Paso 8: Transformación Datos

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.

Paso 9: Pronósticos Hipoteticos

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

Importancia

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.