viviendaEste informe realiza un análisis exploratorio y multivariado de la base vivienda (paquete paqueteMODELOS) con el fin de extraer conocimiento útil para la toma de decisiones en una compañía inmobiliaria. Se abordan: * limpieza y guardado de datasets intermedios, * análisis descriptivo y detección de outliers, * Análisis de Componentes Principales (ACP) y su interpretación, * análisis de correspondencias entre variables categóricas, * clustering basado en ACP (HCPC) para segmentación, * clustering con variables mixtas usando distancia de Gower + PAM, * conclusiones y recomendaciones.
## Rows: 8,322
## Columns: 13
## $ id <dbl> 1147, 1169, 1350, 5992, 1212, 1724, 2326, 4386, 1209, 159…
## $ zona <chr> "Zona Oriente", "Zona Oriente", "Zona Oriente", "Zona Sur…
## $ piso <chr> NA, NA, NA, "02", "01", "01", "01", "01", "02", "02", "02…
## $ estrato <dbl> 3, 3, 3, 4, 5, 5, 4, 5, 5, 5, 6, 4, 5, 6, 4, 5, 5, 4, 5, …
## $ preciom <dbl> 250, 320, 350, 400, 260, 240, 220, 310, 320, 780, 750, 62…
## $ areaconst <dbl> 70, 120, 220, 280, 90, 87, 52, 137, 150, 380, 445, 355, 2…
## $ parqueaderos <dbl> 1, 1, 2, 3, 1, 1, 2, 2, 2, 2, NA, 3, 2, 2, 1, 4, 2, 2, 2,…
## $ banios <dbl> 3, 2, 2, 5, 2, 3, 2, 3, 4, 3, 7, 5, 6, 2, 4, 4, 4, 3, 2, …
## $ habitaciones <dbl> 6, 3, 4, 3, 3, 3, 3, 4, 6, 3, 6, 5, 6, 2, 5, 5, 4, 3, 3, …
## $ tipo <chr> "Casa", "Casa", "Casa", "Casa", "Apartamento", "Apartamen…
## $ barrio <chr> "20 de julio", "20 de julio", "20 de julio", "3 de julio"…
## $ longitud <dbl> -76.51168, -76.51237, -76.51537, -76.54000, -76.51350, -7…
## $ latitud <dbl> 3.43382, 3.43369, 3.43566, 3.43500, 3.45891, 3.36971, 3.4…
## # A tibble: 6 × 13
## id zona piso estrato preciom areaconst parqueaderos banios habitaciones
## <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1147 Zona O… <NA> 3 250 70 1 3 6
## 2 1169 Zona O… <NA> 3 320 120 1 2 3
## 3 1350 Zona O… <NA> 3 350 220 2 2 4
## 4 5992 Zona S… 02 4 400 280 3 5 3
## 5 1212 Zona N… 01 5 260 90 1 2 3
## 6 1724 Zona N… 01 5 240 87 1 3 3
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
## id zona piso estrato
## Min. : 1 Length:8322 Length:8322 Min. :3.000
## 1st Qu.:2080 Class :character Class :character 1st Qu.:4.000
## Median :4160 Mode :character Mode :character Median :5.000
## Mean :4160 Mean :4.634
## 3rd Qu.:6240 3rd Qu.:5.000
## Max. :8319 Max. :6.000
## NA's :3 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 Length:8322 Length:8322 Min. :-76.59
## 1st Qu.: 3.000 Class :character Class :character 1st Qu.:-76.54
## Median : 3.000 Mode :character Mode :character Median :-76.53
## Mean : 3.605 Mean :-76.53
## 3rd Qu.: 4.000 3rd Qu.:-76.52
## Max. :10.000 Max. :-76.46
## 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
La base contiene variables geográficas (longitud, latitud), características físicas (areaconst, habitaciones, banios, parqueaderos), socioeconómicas (estrato), precio (preciom) y categóricas como zona, tipo, barrio. Es la información que se espera analizar sobre la oferta inmobiliaria.
El Objetivo en este paso es dejar un dataset “limpio” (sin id ni piso), un dataset numérico listo para métodos multivariados y su versión estandarizada.
## 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
## Dimensión vivienda_limpia: 8322 11
## Dimensión vivienda_num (sin NAs): 6717 6
El preciom suele presentar una asimetría positiva mostrando que las
propiedades de lujo inflan la distribución. Mientras que por zonas y
estrato aparecen diferencias claras en medianas y rango de precio; las
zonas con mayor presencia de estrato alto muestran medianas y colas
superiores.
## # A tibble: 10 × 6
## estrato preciom areaconst parqueaderos banios habitaciones
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 5 1999 800 5 7 5
## 2 6 1950 400 4 5 3
## 3 6 1950 450 4 5 4
## 4 6 1950 400 4 5 3
## 5 5 1940 734 3 8 10
## 6 6 1900 320 6 5 8
## 7 6 1900 450 6 4 4
## 8 6 1900 335 4 5 4
## 9 6 1900 850 8 7 6
## 10 6 1900 450 8 6 4
Tome una decisión práctica y fue la de no eliminar outliers de forma
automática ya que son parte del mercado. Para análisis sensibles a
outliers considere transformaciones o análisis por estratos.
Para este paso use FactoMineR::PCA sobre las variables numéricas estandarizadas. Esto nos permite aplicar luego el clustering sobre componentes.
## eigenvalue percentage of variance cumulative percentage of variance
## comp 1 3.484 58.063 58.063
## comp 2 1.223 20.385 78.447
## comp 3 0.499 8.325 86.772
## comp 4 0.360 5.992 92.765
## comp 5 0.244 4.073 96.838
## comp 6 0.190 3.162 100.000
Lo que logro interpretar es que el primer componente (PC1) concentra, típicamente, la escala de la vivienda: areaconst, habitaciones, y banios y se correlaciona con preciom. Es decir, tamaño ↔︎ precio.
El segundo componente (PC2) puede contrastar variables de calidad/servicios o proporciones como parqueaderos frente a antigüedad si se incluyera. Esto te ayuda a visualizar perfiles: propiedades grandes y caras vs. pequeñas y económicas.
## Dim.1 Dim.2 Dim.3 Dim.4 Dim.5
## 1 -1.1050383 2.4803563 0.1929622 0.54905092 -0.13269162
## 2 -1.8442734 0.9172671 -0.9160133 -0.43845450 -0.50736645
## 3 -0.8904313 1.3925402 -1.4107237 -0.17014423 0.09103464
## 4 0.8512322 0.4938433 -0.9501729 0.24595720 -1.03772710
## 5 -1.3999688 -0.4259253 0.3015225 -0.10046398 0.39329418
## 6 -1.1003121 -0.3000252 0.5811531 0.03258118 -0.08862621
Aplique HCPC (FactoMineR) sobre el resultado de PCA para obtener
clusters interpretables.
##
## Link between the cluster variable and the quantitative variables
## ================================================================
## Eta2 P-value
## estrato 0.5115513 0
## preciom 0.7088112 0
## areaconst 0.5796944 0
## parqueaderos 0.5840964 0
## banios 0.5968006 0
## habitaciones 0.5470108 0
##
## Description of each cluster by quantitative variables
## =====================================================
## $`1`
## v.test Mean in category Overall mean sd in category Overall sd
## habitaciones -37.39526 2.938025 3.610838 0.6547489 1.3642062
## estrato -43.74113 4.282763 4.830430 0.7338314 0.9493547
## areaconst -45.10955 95.413289 181.136408 44.9919667 144.0891185
## parqueaderos -45.22423 1.164300 1.835194 0.3884100 1.1248251
## preciom -50.47409 245.865074 468.880601 84.1922536 335.0181418
## banios -56.29631 2.230794 3.255471 0.6171589 1.3800948
## p.value
## habitaciones 4.666398e-306
## estrato 0.000000e+00
## areaconst 0.000000e+00
## parqueaderos 0.000000e+00
## preciom 0.000000e+00
## banios 0.000000e+00
##
## $`2`
## v.test Mean in category Overall mean sd in category Overall sd
## estrato 42.077915 5.566683 4.830430 0.5205347 0.9493547
## banios 13.176047 3.590620 3.255471 0.8522908 1.3800948
## preciom 12.042189 543.236932 468.880601 198.1223143 335.0181418
## parqueaderos 9.764005 2.037616 1.835194 0.5468315 1.1248251
## areaconst -3.555174 171.695012 181.136408 68.3998397 144.0891185
## habitaciones -9.294717 3.377137 3.610838 0.7061908 1.3642062
## p.value
## estrato 0.000000e+00
## banios 1.205430e-39
## preciom 2.132208e-33
## parqueaderos 1.606820e-22
## areaconst 3.777294e-04
## habitaciones 1.475982e-20
##
## $`3`
## v.test Mean in category Overall mean sd in category Overall sd
## habitaciones 53.97947 6.119110 3.610838 1.5927523 1.3642062
## banios 25.61148 4.459424 3.255471 1.2962603 1.3800948
## areaconst 23.70205 297.464071 181.136408 116.3119806 144.0891185
## estrato -22.07833 4.116492 4.830430 0.8207328 0.9493547
## p.value
## habitaciones 0.000000e+00
## banios 1.136501e-144
## areaconst 3.434430e-124
## estrato 5.106609e-108
##
## $`4`
## v.test Mean in category Overall mean sd in category Overall sd
## preciom 61.12031 1144.574257 468.880601 350.4752529 335.0181418
## parqueaderos 55.95538 3.912129 1.835194 1.5199829 1.1248251
## areaconst 51.02315 423.738416 181.136408 200.3409117 144.0891185
## banios 42.62754 5.196782 3.255471 1.2225762 1.3800948
## estrato 29.03747 5.740099 4.830430 0.5211146 0.9493547
## habitaciones 17.77226 4.410891 3.610838 1.3047818 1.3642062
## p.value
## preciom 0.000000e+00
## parqueaderos 0.000000e+00
## areaconst 0.000000e+00
## banios 0.000000e+00
## estrato 2.215129e-185
## habitaciones 1.159203e-70
En este caso los clusters suelen mostrar: (1) propiedades grandes y caras (alto PC1), (2) unidades medianas en estrato medio, (3) pequeñas y económicas, etc.
Antes de ejecutar AC se verificó automáticamente qué pares de variables categóricas ofrecen al menos 2 dimensiones.
## zona tipo barrio
## 5 2 436
## var1 var2 K
## 1 zona barrio 4
## Ejecutando AC con: zona vs barrio
##
## Call:
## CA(X = tabla_ac, graph = FALSE)
##
## The chi square of independence between the two variables is equal to 29343.43 (p-value = 0 ).
##
## Eigenvalues
## Dim.1 Dim.2 Dim.3 Dim.4
## Variance 0.962 0.930 0.895 0.740
## % of var. 27.272 26.361 25.379 20.988
## Cumulative % of var. 27.272 53.633 79.012 100.000
##
## Rows
## Iner*1000 Dim.1 ctr cos2 Dim.2 ctr cos2
## Zona Centro | 730.143 | 0.173 0.046 0.001 | -0.045 0.003 0.000
## Zona Norte | 729.767 | 1.553 57.872 0.763 | 0.587 8.549 0.109
## Zona Oeste | 795.563 | 0.373 2.085 0.025 | -2.304 82.242 0.961
## Zona Oriente | 859.691 | 0.827 2.999 0.034 | 1.019 4.711 0.051
## Zona Sur | 412.114 | -0.792 36.998 0.864 | 0.271 4.494 0.101
## Dim.3 ctr cos2
## Zona Centro | 0.542 0.489 0.006 |
## Zona Norte | -0.630 10.234 0.126 |
## Zona Oeste | 0.235 0.890 0.010 |
## Zona Oriente | 4.301 87.190 0.908 |
## Zona Sur | -0.137 1.197 0.026 |
##
## Columns (the 10 first)
## Iner*1000 Dim.1 ctr cos2 Dim.2 ctr cos2
## 20 de julio | 8.186 | 0.843 0.027 0.031 | 1.057 0.043 0.049 |
## 3 de julio | 0.091 | -0.807 0.008 0.857 | 0.281 0.001 0.104 |
## acopi | 62.262 | 1.568 4.857 0.750 | 0.607 0.751 0.112 |
## agua blanca | 2.729 | 0.843 0.009 0.031 | 1.057 0.014 0.049 |
## aguablanca | 1.290 | 0.018 0.000 0.000 | 0.669 0.012 0.083 |
## aguacatal | 76.223 | 0.370 0.186 0.023 | -2.365 7.883 0.962 |
## alameda | 59.395 | -0.131 0.003 0.001 | 0.056 0.001 0.000 |
## alameda del rio | 0.401 | 1.583 0.031 0.752 | 0.609 0.005 0.111 |
## alameda del río | 0.801 | 1.583 0.063 0.752 | 0.609 0.010 0.111 |
## alamos | 5.609 | 1.583 0.439 0.752 | 0.609 0.067 0.111 |
## Dim.3 ctr cos2
## 20 de julio 4.546 0.832 0.910 |
## 3 de julio -0.145 0.000 0.028 |
## acopi -0.663 0.932 0.134 |
## agua blanca 4.546 0.277 0.910 |
## aguablanca 2.200 0.130 0.902 |
## aguacatal 0.245 0.088 0.010 |
## alameda 0.348 0.026 0.004 |
## alameda del rio -0.666 0.006 0.133 |
## alameda del río -0.666 0.012 0.133 |
## alamos -0.666 0.083 0.133 |
El CA muestra qué categorías de var1 se asocian con qué categorías de
var2.Lo que revela que ciertos tipos de vivienda se concentran en
ciertas zonas o que determinados barrios están más asociados a estratos
concretos.
Aquí hacemos una segmentación que tenga en cuenta variables cuantitativas (tamaño, precio…) y cualitativas (zona, tipo). Usamos la distancia de Gower (daisy) y PAM (k-medoids), más robusto ante outliers y variables mixtas.
## k óptimo (silhouette): 5
## # A tibble: 5 × 17
## Cluster_mixto estrato_mean estrato_sd preciom_mean preciom_sd areaconst_mean
## <int> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1 3.99 0.963 423. 230. 270.
## 2 2 4.94 0.904 629. 381. 288.
## 3 3 4.49 0.903 303. 186. 102.
## 4 4 4.73 0.807 314. 192. 102.
## 5 5 5.67 0.607 711. 384. 189.
## # ℹ 11 more variables: areaconst_sd <dbl>, parqueaderos_mean <dbl>,
## # parqueaderos_sd <dbl>, banios_mean <dbl>, banios_sd <dbl>,
## # habitaciones_mean <dbl>, habitaciones_sd <dbl>, longitud_mean <dbl>,
## # longitud_sd <dbl>, latitud_mean <dbl>, latitud_sd <dbl>
PAM+Gower permite agrupar teniendo en cuenta zona y tipo simultáneamente con preciom, areaconst etc.
La variabilidad del precio está altamente asociada a areaconst, habitaciones y banios. Es decir, la parte “física” de la vivienda explica gran parte de la diferencia en precios (confirmado por ACP).
Las zonas y estratos muestran patrones claros: algunas zonas concentran estratos altos con precios más elevados; otras zonas concentran oferta económica. El AC confirma asociaciones relevantes entre categorías.
Los clusters (tanto HCPC sobre ACP como PAM sobre Gower) generan segmentos prácticos: premium, medios, económicos y segmentos intermedios. Las variables con mayor discriminación aparecen en res.HCPC$desc.var.
No eliminamos outliers automáticamente porque representan propiedades premium reales; sin embargo, para modelos predictivos se recomienda transformar (log(preciom)) o modelar por estrato/zona.
## [1] "vivienda_clusters_mixtos.csv" "vivienda_clusters_pca.csv"
## [3] "vivienda_escalado.csv" "vivienda_limpia.csv"
## [5] "vivienda_numerico.csv" "vivienda_scores_pca.csv"