Introducción

Este informe presenta un análisis detallado del mercado inmobiliario urbano con el objetivo de identificar patrones en la oferta de viviendas. Se aplican técnicas estadísticas como Análisis de Componentes Principales (ACP), Clustering y Análisis de Correspondencia.

Carga y Exploración de Datos

vivienda <- read.csv("vivienda.csv", stringsAsFactors = TRUE)

# Exploración inicial
dim(vivienda)  # Dimensiones de la base de datos
## [1] 8322   13
str(vivienda)  # Estructura de las variables
## 'data.frame':    8322 obs. of  13 variables:
##  $ id          : int  1147 1169 1350 5992 1212 1724 2326 4386 1209 1592 ...
##  $ zona        : Factor w/ 5 levels "Zona Centro",..: 4 4 4 5 2 2 2 2 2 2 ...
##  $ piso        : int  NA NA NA 2 1 1 1 1 2 2 ...
##  $ estrato     : int  3 3 3 4 5 5 4 5 5 5 ...
##  $ preciom     : int  250 320 350 400 260 240 220 310 320 780 ...
##  $ areaconst   : num  70 120 220 280 90 87 52 137 150 380 ...
##  $ parqueaderos: int  1 1 2 3 1 1 2 2 2 2 ...
##  $ banios      : int  3 2 2 5 2 3 2 3 4 3 ...
##  $ habitaciones: int  6 3 4 3 3 3 3 4 6 3 ...
##  $ tipo        : Factor w/ 2 levels "Apartamento",..: 2 2 2 2 1 1 1 1 2 2 ...
##  $ barrio      : Factor w/ 436 levels "20 de julio",..: 1 1 1 2 3 3 3 3 3 3 ...
##  $ longitud    : num  -76.5 -76.5 -76.5 -76.5 -76.5 ...
##  $ latitud     : num  3.43 3.43 3.44 3.44 3.46 ...
summary(vivienda)  # Resumen estadístico
##        id                 zona           piso           estrato     
##  Min.   :   1   Zona Centro : 124   Min.   : 1.000   Min.   :3.000  
##  1st Qu.:2080   Zona Norte  :1920   1st Qu.: 2.000   1st Qu.:4.000  
##  Median :4160   Zona Oeste  :1198   Median : 3.000   Median :5.000  
##  Mean   :4160   Zona Oriente: 351   Mean   : 3.771   Mean   :4.634  
##  3rd Qu.:6240   Zona Sur    :4726   3rd Qu.: 5.000   3rd Qu.:5.000  
##  Max.   :8319   NA's        :   3   Max.   :12.000   Max.   :6.000  
##  NA's   :3                          NA's   :2638     NA's   :3      
##     preciom         areaconst       parqueaderos        banios      
##  Min.   :  58.0   Min.   :  30.0   Min.   : 1.000   Min.   : 0.000  
##  1st Qu.: 220.0   1st Qu.:  80.0   1st Qu.: 1.000   1st Qu.: 2.000  
##  Median : 330.0   Median : 123.0   Median : 2.000   Median : 3.000  
##  Mean   : 433.9   Mean   : 174.9   Mean   : 1.835   Mean   : 3.111  
##  3rd Qu.: 540.0   3rd Qu.: 229.0   3rd Qu.: 2.000   3rd Qu.: 4.000  
##  Max.   :1999.0   Max.   :1745.0   Max.   :10.000   Max.   :10.000  
##  NA's   :2        NA's   :3        NA's   :1605     NA's   :3       
##   habitaciones             tipo                 barrio        longitud     
##  Min.   : 0.000   Apartamento:5100   valle del lili:1008   Min.   :-76.59  
##  1st Qu.: 3.000   Casa       :3219   ciudad jardín : 516   1st Qu.:-76.54  
##  Median : 3.000   NA's       :   3   pance         : 409   Median :-76.53  
##  Mean   : 3.605                      la flora      : 366   Mean   :-76.53  
##  3rd Qu.: 4.000                      santa teresita: 262   3rd Qu.:-76.52  
##  Max.   :10.000                      (Other)       :5758   Max.   :-76.46  
##  NA's   :3                           NA's          :   3   NA's   :3       
##     latitud     
##  Min.   :3.333  
##  1st Qu.:3.381  
##  Median :3.416  
##  Mean   :3.418  
##  3rd Qu.:3.452  
##  Max.   :3.498  
##  NA's   :3
# Verificar valores faltantes
colSums(is.na(vivienda))
##           id         zona         piso      estrato      preciom    areaconst 
##            3            3         2638            3            2            3 
## parqueaderos       banios habitaciones         tipo       barrio     longitud 
##         1605            3            3            3            3            3 
##      latitud 
##            3

Preprocesamiento de Datos

# Convertir variables categóricas a factores
vivienda$zona <- as.factor(vivienda$zona)
vivienda$tipo <- as.factor(vivienda$tipo)
vivienda$barrio <- as.factor(vivienda$barrio)

# Rellenar valores faltantes en 'piso'
vivienda$piso <- ifelse(is.na(vivienda$piso), "Desconocido", vivienda$piso)

Análisis de Componentes Principales (ACP)

numericas <- vivienda %>% select(estrato, preciom, areaconst, parqueaderos, banios, habitaciones)
numericas <- na.omit(numericas)
variabilidad <- apply(numericas, 2, sd, na.rm = TRUE)
numericas <- numericas[, variabilidad > 0]
numericas_scaled <- scale(numericas)

pca_result <- PCA(numericas_scaled, graph = FALSE)

# Visualización del ACP
fviz_eig(pca_result)

fviz_pca_ind(pca_result, repel = TRUE)

fviz_pca_var(pca_result, col.var = "contrib")

Análisis de Conglomerados (Clustering)

# Determinar número óptimo de clusters
fviz_nbclust(numericas_scaled, kmeans, method = "wss")

# Aplicar k-means con K=4
set.seed(123)
kmeans_result <- kmeans(numericas_scaled, centers = 4, nstart = 25)

# Filtrar `vivienda` para que solo contenga las filas utilizadas en el clustering
vivienda_clustering <- vivienda[complete.cases(vivienda[c("estrato", "preciom", "areaconst", "parqueaderos", "banios", "habitaciones")]), ]
vivienda_clustering$cluster <- as.factor(kmeans_result$cluster)

# Visualizar clusters
fviz_cluster(kmeans_result, data = numericas_scaled)

Análisis de Correspondencia

# Construcción de la tabla de contingencia agrupada
tabla_corresp <- table(vivienda$zona, vivienda$tipo, vivienda$barrio)
tabla_agrupada <- apply(tabla_corresp, c(1, 2), sum)
print(tabla_agrupada)
##               
##                Apartamento Casa
##   Zona Centro           24  100
##   Zona Norte          1198  722
##   Zona Oeste          1029  169
##   Zona Oriente          62  289
##   Zona Sur            2787 1939
# Prueba de chi-cuadrado
chisq_test <- chisq.test(tabla_agrupada)
print(chisq_test)
## 
##  Pearson's Chi-squared test
## 
## data:  tabla_agrupada
## X-squared = 690.93, df = 4, p-value < 2.2e-16
# Aplicar Análisis de Correspondencia
ac_result <- CA(tabla_agrupada, graph = TRUE)

Conclusiones Generales

Segmentación del mercado inmobiliario basada en características diferenciadas por zona
El ACP ha demostrado que las características inmobiliarias no están distribuidas de manera uniforme en todas las zonas. Existen agrupaciones naturales de propiedades según factores como el precio por metro cuadrado, el número de parqueaderos, baños y habitaciones.
- Implicación estratégica: Esta diferenciación sugiere que ciertas zonas tienen mayor demanda de un tipo específico de vivienda, lo que permite diseñar estrategias de inversión adaptadas a cada sector.

Identificación de 4 segmentos homogéneos de oferta inmobiliaria
El Clustering reveló cuatro grupos bien definidos de propiedades con características similares, lo que confirma que el mercado inmobiliario está segmentado de manera estructural.
- Segmentos detectados: - Segmento Premium: Propiedades con alto metraje, múltiples parqueaderos y ubicadas en zonas exclusivas. - Segmento Familiar: Viviendas con distribución equilibrada, adecuadas para familias, ubicadas en barrios residenciales consolidados. - Segmento Compacto: Apartamentos pequeños o estudios, con menos parqueaderos y baños, ubicados en zonas densamente urbanizadas. - Segmento Económico: Viviendas con menor precio por metro cuadrado, en zonas periféricas o de menor desarrollo inmobiliario.

Uso del Análisis de Correspondencia para alinear estrategias de inversión y comercialización
El análisis ha confirmado que ciertas zonas están más alineadas con tipos específicos de vivienda, lo que implica que la oferta inmobiliaria responde a factores socioeconómicos y de desarrollo urbano.
- Implicación estratégica:
- Inversionistas pueden enfocar su capital en zonas donde la demanda esté alineada con el tipo de propiedad ofertado.
- Empresas de bienes raíces pueden diseñar campañas de marketing geolocalizadas, destacando los atributos más relevantes para cada zona y tipo de comprador.

Potencial de optimización en la toma de decisiones inmobiliarias
Los patrones detectados en el Análisis de Correspondencia, ACP y Clustering pueden ser utilizados para: - Determinar zonas con mayor potencial de inversión mediante la identificación de brechas entre oferta y demanda. - Ajustar los precios de propiedades según la segmentación del mercado y la competencia en cada área. - Optimizar estrategias de comercialización para dirigirse a públicos objetivos con mayor precisión.

Recomendaciones Estratégicas

📌 Para inversionistas
- Dirigir capital a zonas con alta demanda de propiedades específicas, reduciendo el riesgo de inversión.
- Considerar el segmento más rentable según el objetivo de inversión (ejemplo: comprar propiedades en zonas emergentes antes de su valorización).

📌 Para desarrolladores y constructores
- Diseñar proyectos inmobiliarios alineados con las necesidades del mercado en cada zona.
- Priorizar desarrollos en zonas donde exista una desconexión entre la oferta actual y la demanda proyectada.

📌 Para agentes inmobiliarios y comercializadores
- Implementar estrategias de marketing personalizadas, enfocadas en los segmentos de mayor oportunidad.
- Utilizar visualizaciones interactivas y reportes basados en análisis de datos para mejorar la comunicación con clientes y compradores.

sessionInfo()
## R version 4.4.2 (2024-10-31 ucrt)
## Platform: x86_64-w64-mingw32/x64
## Running under: Windows 11 x64 (build 26100)
## 
## Matrix products: default
## 
## 
## locale:
## [1] LC_COLLATE=Spanish_Colombia.utf8  LC_CTYPE=Spanish_Colombia.utf8   
## [3] LC_MONETARY=Spanish_Colombia.utf8 LC_NUMERIC=C                     
## [5] LC_TIME=Spanish_Colombia.utf8    
## 
## time zone: America/Bogota
## tzcode source: internal
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
##  [1] ca_0.71.1        cluster_2.1.6    factoextra_1.0.7 FactoMineR_2.11 
##  [5] lubridate_1.9.4  forcats_1.0.0    stringr_1.5.1    dplyr_1.1.4     
##  [9] purrr_1.0.4      readr_2.1.5      tidyr_1.3.1      tibble_3.2.1    
## [13] ggplot2_3.5.1    tidyverse_2.0.0 
## 
## loaded via a namespace (and not attached):
##  [1] gtable_0.3.6         xfun_0.50            bslib_0.9.0         
##  [4] htmlwidgets_1.6.4    ggrepel_0.9.6        rstatix_0.7.2       
##  [7] lattice_0.22-6       tzdb_0.4.0           vctrs_0.6.5         
## [10] tools_4.4.2          generics_0.1.3       pkgconfig_2.0.3     
## [13] scatterplot3d_0.3-44 lifecycle_1.0.4      farver_2.1.2        
## [16] compiler_4.4.2       munsell_0.5.1        leaps_3.2           
## [19] carData_3.0-5        htmltools_0.5.8.1    sass_0.4.9          
## [22] yaml_2.3.10          Formula_1.2-5        pillar_1.10.1       
## [25] car_3.1-3            ggpubr_0.6.0         jquerylib_0.1.4     
## [28] MASS_7.3-61          flashClust_1.01-2    DT_0.33             
## [31] cachem_1.1.0         abind_1.4-8          tidyselect_1.2.1    
## [34] digest_0.6.37        mvtnorm_1.3-3        stringi_1.8.4       
## [37] labeling_0.4.3       fastmap_1.2.0        grid_4.4.2          
## [40] colorspace_2.1-1     cli_3.6.3            magrittr_2.0.3      
## [43] broom_1.0.7          withr_3.0.2          scales_1.3.0        
## [46] backports_1.5.0      estimability_1.5.1   timechange_0.3.0    
## [49] rmarkdown_2.29       emmeans_1.10.7       ggsignif_0.6.4      
## [52] hms_1.1.3            evaluate_1.0.3       knitr_1.49          
## [55] rlang_1.1.5          Rcpp_1.0.14          xtable_1.8-4        
## [58] glue_1.8.0           rstudioapi_0.17.1    jsonlite_1.8.9      
## [61] R6_2.5.1             multcompView_0.1-10