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.
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
# 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)
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")
# 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)
# 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)
✅ 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.
📌 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