Estimados señores Inmobiliaria
Con el presente informe se realiza un análisis multidimensional de una base de datos de oferta de viviendas en la ciudad de Cali. Para realizar este análisis se hace inicialmente un análisis descriptivo de los datos y se aplican los métodos de Análisis de componentes principales (PCA), Análisis de conglomerados y Análisis de correspondencia sobre la base de datos que tiene 8322 observaciones y 13 atributos. Entre los atributos hay datos que son numêricos y categóricos es por eso que se utilizan las distintas técnicas mencionadas para poder realizar el análisis,
Con los resultados de este análisis se plantea ofrecer a la inmobiliaria una visión más clara y amplia sobre el comportamiento del mercado de inmuebles en la ciudad para que puedan identificar oportunidades de inversión, desarrollar estrategias de comercialización efectivas y ofrecer a sus clientes servicios inmobiliarios de alta calidad que se ajusten a las necesidades y expectativas del mercado.
Haciendo una revisión de los datos en la base de datos inicial se encuentran datos en NA dentro de parqueaderos y pisos y 3 registros sin ID que pueden ser errores pues coincide con la cantidad de NA en los otros atributos.
Podemos ver la siguiente información:
summary(vivienda)
## 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
vivienda_mod <- subset(vivienda, !is.na(vivienda$id))
vivienda_mod2 <- subset(vivienda_mod, !is.na(vivienda_mod$parqueaderos))
vivienda_modificada <- subset(vivienda_mod2, select = -c(piso))
vivienda_modificada$estrato <- as.factor(vivienda_modificada$estrato)
Para trabajar con la base de datos limpia, se retiran todos los registros que tienen datos en NA, además la variable piso no será tenida en cuenta pues esta variable corresponde a 2 valores y debería estar separada, un valor puede ser el piso en el que se ubica el inmueble, que aplica para los apartamentos, y otro valor es el número de pisos que tiene la vivienda, que aplica para las casas. Como es un dato ambiguo no se utilizará en este análisis.
ggplot(vivienda_modificada, aes(x = estrato)) +
geom_bar(width=0.5, colour="black", fill="skyblue") +
labs(x="Estrato",y= "Cantidad") +
ylim(c(0, 2700)) +
theme_bw(base_size = 12) +
geom_text(aes(label=after_stat(count)), stat='count',
position=position_dodge(0.9),
vjust=-0.5,
size=5.0
) +
facet_wrap(~"Viviendas por Estrato")
Se observa que la mayoría de ofertas inmobiliarias disponibles son para inmuebles de tipo apartamentos, la mayor parte de los inmuebles se encuentra en la zona sur de la ciudad y pertenecen a los estratos 4 y 5.
tabla_zona_estrato <- table(vivienda_modificada$zona, vivienda_modificada$estrato)
detail2 <- prop.table(tabla_zona_estrato,2) * 100
knitr::kable(detail2, caption = "Proporción de viviendas por zona y estrato", align = "c")
| 3 | 4 | 5 | 6 | |
|---|---|---|---|---|
| Zona Centro | 7.748538 | 0.4875076 | 0.1189532 | 0.0000000 |
| Zona Norte | 34.649123 | 16.3315052 | 26.5265662 | 6.0427807 |
| Zona Oeste | 3.508772 | 3.7781840 | 10.5075337 | 39.9465241 |
| Zona Oriente | 23.245614 | 0.1218769 | 0.0396511 | 0.0534759 |
| Zona Sur | 30.847953 | 79.2809263 | 62.8072958 | 53.9572193 |
histograma <- ggplot(vivienda_modificada, aes(x=areaconst)) +
ggtitle("Histograma de área construida en viviendas") +
theme_fivethirtyeight() +
geom_histogram(color="#28324a", fill="#C06BF7", bins=30)
histograma
En el anterior histograma, vemos que la gran mayoría de la oferta se encuentra en viviendas de menos de 250 metros cuadrados, con un segundo lugar para las areas entre 250 y 500, y ya muy pocos datos en viviendas grandes de mas de 500 metros cuadrados
histograma2 <- ggplot(vivienda_modificada, aes(x=preciom)) +
ggtitle("Histograma de precio de las viviendas") +
theme_fivethirtyeight() +
geom_histogram(color="#28324a", fill="#3c78d8", bins=30)
histograma2
El precio de las viviendas se observa que la gran mayoría se encuentra en precios de menos de 500 millones y en segundo lugar entre 500 y 1000 millones, y ya en muy pocos datos hay precios mas altos de 1000.
Para realizar este análisis se crea un nuevo dataset donde se especifican unicamente las columnas numéricas y se retiran el id, latitud y longitud que son variables que no vamos usar en nuestro análisis.
columnas_numericas <- sapply(vivienda_modificada, is.numeric)
datos_numer <- vivienda_modificada[, columnas_numericas]
datos_numericos <- subset(datos_numer, select = -c(latitud, longitud, id))
summary(datos_numericos)
## preciom areaconst parqueaderos banios
## Min. : 58.0 Min. : 30.0 Min. : 1.000 Min. : 0.000
## 1st Qu.: 248.0 1st Qu.: 86.0 1st Qu.: 1.000 1st Qu.: 2.000
## Median : 355.0 Median : 130.0 Median : 2.000 Median : 3.000
## Mean : 468.9 Mean : 181.1 Mean : 1.835 Mean : 3.255
## 3rd Qu.: 580.0 3rd Qu.: 233.0 3rd Qu.: 2.000 3rd Qu.: 4.000
## Max. :1999.0 Max. :1745.0 Max. :10.000 Max. :10.000
## habitaciones
## Min. : 0.000
## 1st Qu.: 3.000
## Median : 3.000
## Mean : 3.611
## 3rd Qu.: 4.000
## Max. :10.000
Para el analisis de componentes principales comenzamos por estandarizar las variables a la misma escala:
datos_estandarizados <- scale(datos_numericos)
datos_estandarizados <- as.data.frame(datos_estandarizados)
summary(datos_estandarizados)
## preciom areaconst parqueaderos banios
## Min. :-1.2264 Min. :-1.0488 Min. :-0.7425 Min. :-2.3587
## 1st Qu.:-0.6593 1st Qu.:-0.6602 1st Qu.:-0.7425 1st Qu.:-0.9096
## Median :-0.3399 Median :-0.3549 Median : 0.1465 Median :-0.1851
## Mean : 0.0000 Mean : 0.0000 Mean : 0.0000 Mean : 0.0000
## 3rd Qu.: 0.3317 3rd Qu.: 0.3599 3rd Qu.: 0.1465 3rd Qu.: 0.5394
## Max. : 4.5669 Max. :10.8526 Max. : 7.2582 Max. : 4.8866
## habitaciones
## Min. :-2.6466
## 1st Qu.:-0.4477
## Median :-0.4477
## Mean : 0.0000
## 3rd Qu.: 0.2852
## Max. : 4.6831
Se aplica PCA para los datos con la escala aplicada:
pca <- prcomp(datos_estandarizados, center = TRUE, scale. = TRUE)
summary(pca)
## Importance of components:
## PC1 PC2 PC3 PC4 PC5
## Standard deviation 1.8035 0.9280 0.60371 0.57319 0.43938
## Proportion of Variance 0.6505 0.1722 0.07289 0.06571 0.03861
## Cumulative Proportion 0.6505 0.8228 0.89568 0.96139 1.00000
fviz_eig(pca, addlabels=TRUE)
fviz_pca_biplot(pca, repel = TRUE, col.var = "#AA99FF")
fviz_pca_var(pca, col.var = "contrib", gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"), repel = TRUE)
Al revisar la gráfica vemos que:
Esto sugiere que:
Precio y parqueaderos están más relacionados entre sí y podrían estar asociadas a un patrón similar en los datos. Es decir, estas variables tienden a variar juntas. Por ejemplo, un aumento en el precio podría estar relacionado con un aumento en la cantidad de parqueaderos.
Baños, área construida, y habitaciones también están relacionadas entre sí, lo que indica que estos atributos suelen variar juntos. Por ejemplo, una mayor área construida podría estar asociada con un mayor número de baños y habitaciones.
En cuanto a la contribución de las variables tenemos que:
Precio y habitaciones son las variables con la contribución más alta, lo que indica que tienen una fuerte influencia en los primeros componentes principales. Esto significa que precio y habitaciones son variables clave para explicar la variabilidad en los datos de viviendas. En otras palabras, gran parte de la variación entre las viviendas en la base de datos puede estar explicada principalmente por el precio de las viviendas y el número de habitaciones.
Aunque todas las variables están en el lado derecho del biplot, su separación en la parte superior e inferior sugiere que las variables precio y parqueaderos podrían estar menos relacionadas o incluso inversamente relacionadas con baños, área construida, y habitaciones en términos de su contribución a los componentes principales.
En conclusión:
Las variables que están agrupadas (precio y parqueaderos por un lado, y baños, área construida, habitaciones por otro) indican dos grupos de características que tienden a variar juntas. Esto podría implicar diferentes tipos de viviendas o segmentos de mercado dentro de la base de datos, por ejemplo, viviendas de mayor precio tienden a tener más parqueaderos pero no necesariamente más baños o habitaciones.
Precio y habitaciones son variables dominantes en la explicación de las diferencias entre las viviendas, lo que sugiere que al modelar o predecir valores en este conjunto de datos, estas variables serían de mayor importancia.
En resumen, el gráfico sugiere una diferenciación en los atributos de las viviendas y destaca la importancia de las variables precio y habitaciones en la descripción de las características de las propiedades en la base de datos de viviendas.
Para realizar este análisis vamos a utilizar la base de datos de valores numéricos que ya tenemos del proceso anterior.
Vamos a aplicar las distancias a esta base de datos estandarizada, comenzando por la euclidiana, por facilidad de visualización solo se muestran los 40 primeros datos:
dist_euclidiana <- dist(datos_estandarizados, method = "euclidean")
dist_manhattan <- dist(datos_estandarizados, method = "manhattan")
dist_minkowski <- dist(datos_estandarizados, method = "minkowski")
head(dist_euclidiana, 40)
## [1] 2.350369 2.153334 3.524240 2.319556 2.202282 2.484765 1.785357 1.291149
## [9] 3.571538 3.310962 3.014131 3.255512 1.594854 3.040689 2.021948 2.395554
## [17] 2.522942 2.327039 3.179177 1.829761 2.325295 2.897262 2.088605 3.280583
## [25] 3.317026 3.458836 2.329904 3.031368 2.444164 3.038673 3.931805 4.094256
## [33] 2.662781 6.153859 2.991606 6.710959 3.585811 3.025759 3.034012 3.407395
Aplicamos las distancias de manhattan
head(dist_manhattan, 40)
## [1] 3.479361 4.418854 7.330934 3.092091 2.346738 4.026866 2.998943
## [8] 2.377594 6.821050 7.057017 5.713827 5.545561 3.126715 5.533939
## [15] 4.128868 3.560513 4.444353 3.216699 6.022220 3.180852 3.223269
## [22] 4.858977 3.910317 4.716888 5.102513 7.289607 3.239607 3.972579
## [29] 3.912410 4.054136 7.527013 8.486820 4.105391 11.975834 6.061178
## [36] 13.678921 7.966068 3.848414 4.002426 7.291626
Y por último aplicamos las distancias de minkowski
head(dist_minkowski, 40)
## [1] 2.350369 2.153334 3.524240 2.319556 2.202282 2.484765 1.785357 1.291149
## [9] 3.571538 3.310962 3.014131 3.255512 1.594854 3.040689 2.021948 2.395554
## [17] 2.522942 2.327039 3.179177 1.829761 2.325295 2.897262 2.088605 3.280583
## [25] 3.317026 3.458836 2.329904 3.031368 2.444164 3.038673 3.931805 4.094256
## [33] 2.662781 6.153859 2.991606 6.710959 3.585811 3.025759 3.034012 3.407395
La gráfica de puntos, trabajando con las variables de precio y área construida es:
# Cluster jerarquico con el método complete
hc_viv <- hclust(dist_euclidiana, method = 'complete')
# Determinamos a dónde pertenece cada observación
cluster_assigments <- cutree(hc_viv, k = 2)
# asignamos los clusters
assigned_cluster <- datos_estandarizados %>% mutate(cluster = as.factor(cluster_assigments))
# gráfico de puntos
ggplot(assigned_cluster, aes(x = preciom, y = areaconst, color = cluster)) +
geom_point(size = 2) +
geom_text(aes(label = cluster), vjust = -.8)
Si hacemos el dendograma vemos lo siguiente:
plot(hc_viv, cex = 0.6, main = "Dendograma de viviendas", las=1,
ylab = "Distancia euclidiana", xlab = "Grupos")
rect.hclust(hc_viv, k = 2, border = 2:5)
Debido a la cantidad de datos no es posible visualizar correctamente la cantidad de clusteres que se deben seleccionar.
Y se aplica el coeficiente de silhouette para identificar el número de clusteres que se deben crear, probando con diferentes valores encontramos que el mejor valor es 2:
# Calcular el coeficiente de Silhouette
sil <- silhouette(cluster_assigments, dist(datos_estandarizados))
sil_avg <- mean(sil[,3])
# Imprimir el coeficiente de Silhouette promedio
cat("Coeficiente de Silhouette promedio k=2 : ", sil_avg)
## Coeficiente de Silhouette promedio k=2 : 0.7440361
Vamos a realizar el clustering de 2 utilizando el algoritmo de k-means, sobre la base de datos sin estandarizar para poder ver las características aproximadas de cada cluster:
kmeans_result <- kmeans(datos_estandarizados, centers = 2)
datos_numericos$cluster <- kmeans_result$cluster
table(datos_numericos$cluster)
##
## 1 2
## 1862 4855
datos_numericos %>%
group_by(cluster) %>%
summarize(across(everything(), mean))
## # A tibble: 2 × 6
## cluster preciom areaconst parqueaderos banios habitaciones
## <int> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1 854. 344. 2.94 4.87 4.80
## 2 2 321. 119. 1.41 2.64 3.16
Al verificar la información que aparece en cada cluster vemos lo siguiente
data_cluster_1 <- datos_numericos[datos_numericos$cluster == 1, ]
data_cluster_2 <- datos_numericos[datos_numericos$cluster == 2, ]
summary(data_cluster_1)
## preciom areaconst parqueaderos banios
## Min. : 150.0 Min. : 50.0 Min. : 1.000 Min. : 0.000
## 1st Qu.: 560.0 1st Qu.: 230.0 1st Qu.: 2.000 1st Qu.: 4.000
## Median : 780.0 Median : 300.0 Median : 3.000 Median : 5.000
## Mean : 853.8 Mean : 343.6 Mean : 2.943 Mean : 4.872
## 3rd Qu.:1100.0 3rd Qu.: 400.0 3rd Qu.: 4.000 3rd Qu.: 5.000
## Max. :1999.0 Max. :1745.0 Max. :10.000 Max. :10.000
## habitaciones cluster
## Min. : 0.000 Min. :1
## 1st Qu.: 4.000 1st Qu.:1
## Median : 4.000 Median :1
## Mean : 4.799 Mean :1
## 3rd Qu.: 5.000 3rd Qu.:1
## Max. :10.000 Max. :1
summary(data_cluster_2)
## preciom areaconst parqueaderos banios
## Min. : 58.0 Min. : 30.0 Min. :1.00 Min. :0.000
## 1st Qu.: 220.0 1st Qu.: 77.0 1st Qu.:1.00 1st Qu.:2.000
## Median : 298.0 Median :101.0 Median :1.00 Median :2.000
## Mean : 321.3 Mean :118.8 Mean :1.41 Mean :2.636
## 3rd Qu.: 395.0 3rd Qu.:143.0 3rd Qu.:2.00 3rd Qu.:3.000
## Max. :1100.0 Max. :605.0 Max. :4.00 Max. :5.000
## habitaciones cluster
## Min. :0.000 Min. :2
## 1st Qu.:3.000 1st Qu.:2
## Median :3.000 Median :2
## Mean :3.155 Mean :2
## 3rd Qu.:3.000 3rd Qu.:2
## Max. :9.000 Max. :2
La base de datos tiene una estructura relativamente simple con dos grupos bien definidos. Esto sugiere que las viviendas dentro de cada cluster son bastante similares entre sí en las características analizadas.Los dos clusters representan dos categorías de viviendas que son bastante distintas en las variables consideradas. Un cluster agrupa viviendas más caras y espaciosas, mientras que el otro incluye viviendas más económicas y pequeñas.
El cluster 1 es significativamente más grande que el otro, esto puede sugerir una dominancia de viviendas mas grandes y costosas en el mercado, lo cual puede tener implicaciones en políticas de desarrollo urbano o en decisiones de inversión.
Para realizar este análisis se trabajará con las variables categóricas tipo de vivienda, estrato, zona y barrio. Se trabaja con dos variables por grafico, primero tipo y zona
tabla_contingencia_tz <- table(vivienda_modificada$tipo, vivienda_modificada$zona)
chisq.test(tabla_contingencia_tz)
##
## Pearson's Chi-squared test
##
## data: tabla_contingencia_tz
## X-squared = 576.44, df = 4, p-value < 2.2e-16
# Realizar el análisis de correspondencia con FactoMineR
resultado_ca_tz <- CA(tabla_contingencia_tz, graph=TRUE)
valores_prop_tz <-resultado_ca_tz$eig
valores_prop_tz
## eigenvalue percentage of variance cumulative percentage of variance
## dim 1 0.085818 100 100
fviz_screeplot(resultado_ca_tz, addlabels = TRUE, ylim = c(0, 80))+ggtitle("")+
ylab("Porcentaje de varianza explicado") + xlab("Ejes")
## `geom_line()`: Each group consists of only one observation.
## ℹ Do you need to adjust the group aesthetic?
Dado que el valor de p es muy pequeño, podemos decir que se rechaza la hipótesis nula lo que nos dice que si hay una relación entre las dos variables , por lo tanto podemos concluir que el tipo de vivienda está significativamente asociado con la zona, es decir, el tipo de vivienda que se construye en una zona específica no es independiente de la zona en sí.
Podemos ver además que el resultado es una dimensión 1 es la única relevante, esto podría indicar que existe una fuerte correlación entre, por ejemplo, ciertos tipos de vivienda y su ubicación en ciertas zonas o barrios. La variabilidad en el tipo de vivienda podría estar siendo explicada mayoritariamente por la ubicación geográfica.
Luego realizamos el mismo análisis para las variables de zona y barrio:
tabla_contingencia_zb <- table(vivienda_modificada$zona, vivienda_modificada$barrio)
chisq.test(tabla_contingencia_zb)
## Warning in chisq.test(tabla_contingencia_zb): Chi-squared approximation may be
## incorrect
##
## Pearson's Chi-squared test
##
## data: tabla_contingencia_zb
## X-squared = 23899, df = 1464, p-value < 2.2e-16
# Realizar el análisis de correspondencia con FactoMineR
resultado_ca_zb <- CA(tabla_contingencia_zb, graph=TRUE)
valores_prop_zb <-resultado_ca_zb$eig
valores_prop_zb
## eigenvalue percentage of variance cumulative percentage of variance
## dim 1 0.9727423 27.34006 27.34006
## dim 2 0.9415389 26.46305 53.80311
## dim 3 0.9097852 25.57057 79.37368
## dim 4 0.7338716 20.62632 100.00000
fviz_screeplot(resultado_ca_zb, addlabels = TRUE, ylim = c(0, 80))+ggtitle("")+
ylab("Porcentaje de varianza explicado") + xlab("Ejes")
En este caso el valor de p también es muy pequeño, por lo tanto aplica la misma explicación de las variables de zona y tipo.
Vemos que además se generan 4 dimensiones todas con un porcentaje muy similar, lo cual nos indica que es probable que no haya un solo patrón o relación dominante entre las zonas y los barrios. En lugar de eso, hay múltiples factores o características que están influyendo en cómo las zonas y los barrios se asocian entre sí. Las diferencias entre las zonas y los barrios no pueden ser explicadas por un solo factor dominante; en cambio, hay múltiples factores o características que son igualmente importantes.
Y por último, al realizar el análisis para las variables de zona y estrato, podemos ver lo siguiente:
tabla_contingencia_ze <- table(vivienda_modificada$zona, vivienda_modificada$estrato)
chisq.test(tabla_contingencia_ze)
##
## Pearson's Chi-squared test
##
## data: tabla_contingencia_ze
## X-squared = 3188.9, df = 12, p-value < 2.2e-16
# Realizar el análisis de correspondencia con FactoMineR
resultado_ca_ze <- CA(tabla_contingencia_ze, graph=TRUE)
valores_prop_ze <-resultado_ca_ze$eig
valores_prop_ze
## eigenvalue percentage of variance cumulative percentage of variance
## dim 1 0.31503422 66.358860 66.35886
## dim 2 0.14320084 30.163848 96.52271
## dim 3 0.01650821 3.477292 100.00000
fviz_screeplot(resultado_ca_ze, addlabels = TRUE, ylim = c(0, 80))+ggtitle("")+
ylab("Porcentaje de varianza explicado") + xlab("Ejes")
estrato = levels(vivienda_modificada$estrato)
fviz_ca_biplot(resultado_ca_ze)
Como hemos visto en los otros análisis, el valor de p también es muy pequeño lo cual nos indica que si hay una correlación muy alta entre las dos variables.
Con los dos primeros componentes se esta resumiendo el 96.6% de los datos se puede inferir que casi toda la información sobre la relación entre estrato y zona se puede entender a través de las dos primeras dimensiones, y que el análisis se puede simplificar considerablemente centrándose en estas dimensiones principales. Esto nos muestra que ciertos estratos están asociados predominantemente con ciertas zonas geográficas de la ciudad, reflejando quizás una segmentación socioeconómica. Lo cual es algo que podemos ver en la ciudad pues por ejemplo la zona oeste es donde se encuentran los estratos más altos, en el oriente y en el centro se encuentran más viviendas de estrato 3 y en el norte y sur predominan los estratos 4 y 5, esto lo podemos ver gráficamente en la gráfica anterior.
Segmentación de Mercados : Al realizar el análisis de correspondencia entre variables como estrato y zona, se observó que las dos primeras dimensiones capturan el 96% de la varianza. Esto sugiere una fuerte relación entre ciertas zonas geográficas y los estratos socioeconómicos, indicando que la distribución de las viviendas no es aleatoria sino que está segmentada. La inmobiliaria pueden aprovechar esta segmentación para orientar mejor sus estrategias de marketing y ventas, enfocándose en zonas donde hay una mayor concentración de un determinado estrato.
Caracterización de Clusters: El análisis de conglomerados reveló la existencia de dos clusters principales en los datos. Cada cluster agrupa viviendas con características similares, lo que puede ser útil para definir perfiles de clientes y ajustar la oferta de productos inmobiliarios según las preferencias y necesidades específicas de cada grupo. Por ejemplo, un cluster podría estar compuesto por viviendas de mayor estrato y tamaño, ubicadas en zonas exclusivas, mientras que el otro podría representar viviendas más modestas en zonas con menor estrato.
Identificación de Variables Clave: En el análisis de PCA, se identificó que variables como precio, habitaciones, y estrato tienen una alta contribución en las dos primeras componentes principales. Esto indica que estas variables son las más relevantes al explicar la variabilidad en los datos. Las inmobiliarias pueden enfocarse en estas variables para realizar análisis más detallados o para diseñar productos inmobiliarios que satisfagan las expectativas de los clientes.
Relación entre Variables Categóricas: El análisis de correspondencia entre variables categóricas como tipo de vivienda, zona, y barrio muestra que no existe una relación dominante entre estas variables, dado que el análisis arrojó varias dimensiones con porcentajes de varianza similares. Esto podría indicar una diversidad en los tipos de viviendas ofrecidos en diferentes zonas y barrios, lo que refleja la variedad en la oferta inmobiliaria y la diversidad en las preferencias de los clientes.