1. Problema
Una empresa inmobiliaria líder en una gran ciudad está buscando comprender en profundidad el mercado de viviendas urbanas para tomar decisiones estratégicas más informadas. La empresa posee una base de datos extensa que contiene información detallada sobre diversas propiedades residenciales disponibles en el mercado. Se requiere realizar un análisis holístico de estos datos para identificar patrones, relaciones y segmentaciones relevantes que permitan mejorar la toma de decisiones en cuanto a la compra, venta y valoración de propiedades.
Descripción variables base de datos
Zona: Registra la zona donde esta ubicada el inmueble esta puede ser: Zona Centro,Zona Norte,Zona Oeste,Zona Oriente,Zona Sur
Piso: Registra el piso ene l cual se ubica la vivienda
Estrato: Variable con escala de medición ordinal,los estrato de las viviendas son 3,4,5,6
Preciom: Precio de la vivienda
areaconstu: Area Construida
parqueaderos: Numero de parqueaeros de la vivienda
banios: Número de baños de la propiedad
Habitaciones: Número de habitaciones que posee la vivienda
Tipo: Tipo de la vivienda, casa o apartamento
Número total de registros iniciales 8320
Analisis de la base
summary(base_viviendas)
## 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
Analisis de datos faltantes.
Porcentaje de datos faltantes y patrones
porce<-apply(base_viviendas, 2, function(x) c(sum(is.na(x)), sum(is.na(x))/length(x)*100))
pander(porce[-1,])
| id | zona | piso | estrato | preciom | areaconst | parqueaderos |
|---|---|---|---|---|---|---|
| 0.03605 | 0.03605 | 31.7 | 0.03605 | 0.02403 | 0.03605 | 19.29 |
| banios | habitaciones | tipo | barrio | longitud | latitud |
|---|---|---|---|---|---|
| 0.03605 | 0.03605 | 0.03605 | 0.03605 | 0.03605 | 0.03605 |
Se evidencia que hay presencia de valores faltantes en todos los atributos sin embargo este es mas notorio en la variable piso y parqueaderos. Debemos tomar una medida con estas variables, analizando podemos determinar que los valores ausentes en la variable parqueader puede ser causados a partir de que el inmueble no posee ningun parqueadero por lo que su valor seria 0, sin embargo para piso no es valor que se permita determinar con base en otro atributo, por lo que lo marcaremos como null
#Medidas de tendencia central precio
base_viviendas <- base_viviendas %>%
mutate(
parqueaderos = ifelse(is.na(parqueaderos), 0, parqueaderos),
piso = ifelse(is.na(piso), "null", piso)
)
1.Análisis de Componentes Principales: Reducir la dimensionalidad del conjunto de datos y visualizar la estructura de las variables en componentes principales para identificar características clave que influyen en la variación de precios y oferta del mercado.
Para este primer punto haremos uso de las variables cuantitativas (Estrato,Preciom,AreaConst,Parqueaderos,Banios,Habitaciones)
base_viviendas_PCA <- base_viviendas %>%
select(id,estrato, preciom, parqueaderos, banios, habitaciones, areaconst)
porce<-apply(base_viviendas_PCA, 2, function(x) c(sum(is.na(x)), sum(is.na(x))/length(x)*100))
pander(porce[-1,])
| id | estrato | preciom | parqueaderos | banios | habitaciones | areaconst |
|---|---|---|---|---|---|---|
| 0.03605 | 0.03605 | 0.02403 | 0 | 0.03605 | 0.03605 | 0.03605 |
base_viviendas_PCA <- na.omit(base_viviendas_PCA)
porce<-apply(base_viviendas_PCA, 2, function(x) c(sum(is.na(x)), sum(is.na(x))/length(x)*100))
pander(porce[-1,])
| id | estrato | preciom | parqueaderos | banios | habitaciones | areaconst |
|---|---|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Standarización de variables
base_viviendas_PCAZ <- base_viviendas_PCA
base_viviendas_PCAZ[, 2:7] <- scale(base_viviendas_PCA[, 2:7])
head(base_viviendas_PCAZ)
## # A tibble: 6 × 7
## id estrato preciom parqueaderos banios habitaciones areaconst
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1147 -1.59 -0.560 -0.388 -0.0779 1.64 -0.734
## 2 1169 -1.59 -0.347 -0.388 -0.778 -0.415 -0.384
## 3 1350 -1.59 -0.255 0.417 -0.778 0.270 0.315
## 4 5992 -0.616 -0.103 1.22 1.32 -0.415 0.735
## 5 1212 0.356 -0.529 -0.388 -0.778 -0.415 -0.594
## 6 1724 0.356 -0.590 -0.388 -0.0779 -0.415 -0.615
Calculo de los componentes principales de nuestro dataset
prcomp(base_viviendas_PCAZ[, 2:7])
## Standard deviations (1, .., p=6):
## [1] 1.8480703 1.1222455 0.6779600 0.6592367 0.4909833 0.4357909
##
## Rotation (n x k) = (6 x 6):
## PC1 PC2 PC3 PC4 PC5 PC6
## estrato 0.3306904 -0.5816950 -0.5551021 -0.07749341 0.46143880 -0.1587620
## preciom 0.4781754 -0.1883533 0.0359721 0.36062553 -0.21967777 0.7458339
## parqueaderos 0.4096354 -0.2607395 0.6565763 -0.57091588 0.04760414 -0.0700729
## banios 0.4668745 0.1921461 -0.3633148 -0.18500105 -0.67876421 -0.3437503
## habitaciones 0.2847775 0.6813261 -0.2111757 -0.34936005 0.44521273 0.2997240
## areaconst 0.4417250 0.2388377 0.2878930 0.61783592 0.27859384 -0.4534506
Elección del número de componentes principales
res.pca <- prcomp(base_viviendas_PCAZ[, 2:7])
fviz_eig(res.pca, addlabels = TRUE)
Primer Componente Principal: El primer componente explica un 56.9% de la varianza total de los datos. Este es un valor bastante alto, lo que indica que este componente captura la mayor parte de la variabilidad en los datos.
Segundo Componente Principal: El segundo componente explica un 21% de la varianza, lo que también es significativo, pero mucho menor en comparación con el primero.
Componentes Restantes: A partir del tercer componente, la varianza explicada por cada componente adicional es mucho menor (7.7%, 7.2%, 4%, 3.2%). Esto sugiere que los componentes adicionales capturan menos información relevante.
Generalmente, se recomienda retener los componentes que juntos explican una porción significativa de la varianza (por ejemplo, 70%-90%).
En este caso, los dos primeros componentes principales explican juntos un 77.9% de la varianza de los datos lo cual es un buen valor
fviz_pca_var(res.pca,
col.var = "contrib", # Color by contributions to the PC
gradient.cols = c("#FF7F00", "#034D94"),
repel = TRUE # Avoid text overlapping
)
Dim1 (56.9% de varianza explicada):
Habitaciones es la variable que más contribuye a Dim1, lo que sugiere que esta variable tiene una gran influencia en el componente principal más significativo.
Areaconst (área construida), baños, preciom (precio en millones), y parqueaderos también están altamente correlacionadas con Dim1, lo que indica que estas variables están asociadas con la variabilidad capturada por este componente.
Dim2 (21% de varianza explicada):
Estrato es la variable que parece estar más alineada con Dim2, aunque su contribución es menor en comparación con las variables en Dim1.
Las variables parqueaderos y preciom también tienen cierta contribución a Dim2, aunque mucho menor.
El análisis PCA sugiere que habitaciones, areaconst, baños, y preciom son las variables que más influyen en la variabilidad de los datos, especialmente en el primer componente principal (Dim1).
Sentido de los ejes.
ids_a_filtrar <- c(1043, 6100, 6342)
datos_filtrados <- base_viviendas_PCA[base_viviendas_PCA$id %in% ids_a_filtrar, ]
head(datos_filtrados)
## # A tibble: 3 × 7
## id estrato preciom parqueaderos banios habitaciones areaconst
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1043 5 270 0 2 3 100
## 2 6100 5 1999 5 7 5 800
## 3 6342 6 270 1 2 2 76
# Supongamos que la columna con los IDs se llama 'Id'
casos1 <- rbind(res.pca$x[98,1:2],res.pca$x[778,1:2]) # CP1
rownames(casos1) = c("98","299")
casos1 <- as.data.frame(casos1)
casos2 <- rbind(res.pca$x[6,1:2], res.pca$x[462,1:2]) # CP2
rownames(casos2) = c("6","190")
casos2 <- as.data.frame(casos2)
fviz_pca_ind(res.pca, col.ind = "#DEDEDE", gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07")) +
geom_point(data = casos1, aes(x = PC1, y = PC2), color = "red", size = 3) +
geom_point(data = casos2, aes(x = PC1, y = PC2), color = "blue", size = 3)
2. Análisis de Conglomerados: Agrupar las propiedades residenciales en segmentos homogéneos con características similares para entender las dinámicas de las ofertas específicas en diferentes partes de la ciudad y en diferentes estratos socioeconómicos
Dado que los rangos de las variables son diferente y con fin de que estas diferencias en las dimensiones de las variables no afecte los cálculos de las distancias se estandarizan las variables
base_viviendas_Z <- base_viviendas_PCA
base_viviendas_Z[, 2:7] <- scale(base_viviendas_Z[, 2:7])
head(base_viviendas_Z)
## # A tibble: 6 × 7
## id estrato preciom parqueaderos banios habitaciones areaconst
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1147 -1.59 -0.560 -0.388 -0.0779 1.64 -0.734
## 2 1169 -1.59 -0.347 -0.388 -0.778 -0.415 -0.384
## 3 1350 -1.59 -0.255 0.417 -0.778 0.270 0.315
## 4 5992 -0.616 -0.103 1.22 1.32 -0.415 0.735
## 5 1212 0.356 -0.529 -0.388 -0.778 -0.415 -0.594
## 6 1724 0.356 -0.590 -0.388 -0.0779 -0.415 -0.615
Calculamos las distancias
# distancia euclidiana
dist_emp <- dist(base_viviendas_Z[,2:7], method = 'euclidean')
# Cluster jerarquico con el método complete
hc_emp <- hclust(dist_emp, method = 'complete')
# Determinamos a dónde pertenece cada observación
cluster_assigments <- cutree(hc_emp, k = 4)
# asignamos los clusters
assigned_cluster <- base_viviendas_Z[,1:7] %>% mutate(cluster = as.factor(cluster_assigments))
plot(hc_emp, cex = 0.6, main = "Dendograma de viviendas", las=1,
ylab = "Distancia euclidiana", xlab = "Grupos")
rect.hclust(hc_emp, k = 4, border = 2:5)
# distancia euclidiana
dist_emp <- dist(base_viviendas_Z[,2:7], method = 'manhattan')
# Cluster jerarquico con el método complete
hc_emp <- hclust(dist_emp, method = 'complete')
# Determinamos a dónde pertenece cada observación
cluster_assigments <- cutree(hc_emp, k =4)
# Calcular el coeficiente de Silhouette
sil <- silhouette(cluster_assigments, dist(base_viviendas_Z[,2:7]))
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.3243482
Caracterizacion_Clusters <- base_viviendas_PCA %>%
left_join(select(assigned_cluster, id, cluster), by = "id")
# Asegúrate de cargar el paquete dplyr
library(dplyr)
# Suponiendo que tu data frame se llama df
df_summary <- Caracterizacion_Clusters %>%
group_by(cluster) %>%
summarise(count_id = n())
# Muestra el resultado
print(df_summary)
## # A tibble: 4 × 2
## cluster count_id
## <fct> <int>
## 1 1 5705
## 2 2 2351
## 3 3 245
## 4 4 18
Optamos por utilizar 4 clusters, ya que dos de ellos nos proporcionaban información valiosa. A partir de estos clusters, realizamos una caracterización y observamos la siguiente distribución: el cluster 1 es el más grande, con 5705 propiedades, seguido del cluster 2 con 2351 propiedades. Los clusters 3 y 4 son más pequeños, con 245 y 18 propiedades respectivamente.
# Asegúrate de cargar el paquete dplyr
# Suponiendo que tu data frame se llama Caracterizacion_Clusters
df_summary <- Caracterizacion_Clusters %>%
group_by(cluster) %>%
summarise(
count_id = n(),
avg_preciom = mean(preciom, na.rm = TRUE), # Calcula el promedio de la columna preciom
sd_preciom = sd(preciom, na.rm = TRUE) # Calcula la desviación estándar de la columna preciom
)
# Muestra el resultado
print(df_summary)
## # A tibble: 4 × 4
## cluster count_id avg_preciom sd_preciom
## <fct> <int> <dbl> <dbl>
## 1 1 5705 449. 321.
## 2 2 2351 301. 117.
## 3 3 245 1306. 367.
## 4 4 18 1189. 501.
Podemos observar que los clusters 3 y 4 presentan los precios promedio más altos, con amplias desviaciones estándar, lo que indica una gran variabilidad en los precios, que oscilan entre 800 y 1600, ubicándose en un rango elevado. En contraste, el cluster 2 agrupa las viviendas con los precios más bajos, con un rango de 200 a 400. Por último, el cluster 1 concentra viviendas con precios promedio, con un valor máximo de hasta 700. Esta distribución sugiere que los clusters 3 y 4 corresponden a propiedades de mayor valor, mientras que los clusters 1 y 2 representan opciones más accesibles.
df_summary <- Caracterizacion_Clusters %>%
group_by(cluster) %>%
summarise(
count_id = n(),
avg_parque = mean(parqueaderos, na.rm = TRUE), # Calcula el promedio de la columna preciom
sd_parque = sd(parqueaderos, na.rm = TRUE) # Calcula la desviación estándar de la columna preciom
)
print(df_summary)
## # A tibble: 4 × 4
## cluster count_id avg_parque sd_parque
## <fct> <int> <dbl> <dbl>
## 1 1 5705 1.48 1.14
## 2 2 2351 1.10 0.749
## 3 3 245 5.00 1.55
## 4 4 18 2.94 2.36
En cuanto a los parqueaderos, el Cluster 1 tiene un promedio de 1 a 2 parqueaderos por vivienda. En el Cluster 2, algunas viviendas pueden no disponer de parqueadero, aunque lo ideal es que tengan al menos 1. Por otro lado, el Cluster 3 destaca con un promedio de 5 parqueaderos, aunque presenta una desviación de 3, lo que indica variabilidad en la cantidad de espacios. El Cluster 4 tiene un promedio de 3 parqueaderos, con una desviación más amplia. Esto sugiere que los Clusters 3 y 4 son más adecuados para familias numerosas o aquellas con varios vehículos.
df_summary <- Caracterizacion_Clusters %>%
group_by(cluster) %>%
summarise(
count_id = n(),
avg_ban = mean(banios, na.rm = TRUE), # Calcula el promedio de la columna preciom
sd_ban = sd(banios, na.rm = TRUE) # Calcula la desviación estándar de la columna preciom
)
print(df_summary)
## # A tibble: 4 × 4
## cluster count_id avg_ban sd_ban
## <fct> <int> <dbl> <dbl>
## 1 1 5705 3.30 1.44
## 2 2 2351 2.35 0.726
## 3 3 245 5.87 1.21
## 4 4 18 5.22 1.52
En cuanto a los baños, los clusters 3 y 4 destacan por tener el mayor número promedio de baños, con el Cluster 3 liderando con un promedio de 5.87 baños. Ambos clusters presentan una mayor variabilidad en la cantidad de baños, lo que se refleja en sus desviaciones estándar más altas. Por otro lado, los clusters 1 y 2 tienen menos baños en promedio, con el Cluster 2 registrando el promedio más bajo de 2.35 baños. Esto sugiere que los clusters 3 y 4 están asociados a propiedades más grandes o de mayor lujo, mientras que los clusters 1 y 2 agrupan viviendas con una menor cantidad de baños.
df_summary <- Caracterizacion_Clusters %>%
group_by(cluster) %>%
summarise(
count_id = n(),
avg_habitaciones = mean(habitaciones, na.rm = TRUE), # Calcula el promedio de la columna preciom
sd_habitaciones = sd(habitaciones, na.rm = TRUE) # Calcula la desviación estándar
)
print(df_summary)
## # A tibble: 4 × 4
## cluster count_id avg_habitaciones sd_habitaciones
## <fct> <int> <dbl> <dbl>
## 1 1 5705 3.90 1.49
## 2 2 2351 2.71 0.772
## 3 3 245 5.12 1.50
## 4 4 18 5.33 2.45
En cuanto a las habitaciones, los clusters 3 y 4 se destacan por tener el mayor número promedio de habitaciones, con el Cluster 4 liderando con 5.33 habitaciones. Estos clusters también muestran una mayor variabilidad en el número de habitaciones, lo que se refleja en sus altas desviaciones estándar. Por otro lado, los clusters 1 y 2 tienen un promedio menor de habitaciones, siendo el Cluster 2 el que presenta el promedio más bajo con 2.71 habitaciones. Esto sugiere que los clusters 3 y 4 corresponden a viviendas más grandes o de mayor lujo, mientras que los clusters 1 y 2 agrupan propiedades con un menor número de habitaciones.
df_summary <- Caracterizacion_Clusters %>%
group_by(cluster) %>%
summarise(
count_id = n(),
avg_areaconst = mean(areaconst, na.rm = TRUE), # Calcula el promedio de la columna preciom
sd_areaconst = sd(areaconst, na.rm = TRUE) # Calcula la desviación estándar de la columna preciom
)
print(df_summary)
## # A tibble: 4 × 4
## cluster count_id avg_areaconst sd_areaconst
## <fct> <int> <dbl> <dbl>
## 1 1 5705 185. 123.
## 2 2 2351 103. 53.2
## 3 3 245 556. 172.
## 4 4 18 1258 252.
Los clusters 3 y 4 tienen el mayor promedio de área construida, con el Cluster 4 destacándose con un promedio de 1258 m². Estos clusters también muestran una alta variabilidad en el área construida, reflejada en sus mayores desviaciones estándar. Por otro lado, los clusters 1 y 2 tienen áreas construidas menores en promedio, siendo el Cluster 2 el que presenta el promedio más bajo con 103 m². Esto sugiere que los clusters 3 y 4 corresponden a propiedades de mayor tamaño y posiblemente más exclusivas, mientras que los clusters 1 y 2 agrupan viviendas con áreas más reducidas.
Conclusiones Analisis Conglomerados
El Cluster 4 se caracteriza por agrupar inmuebles de gran tamaño en términos de área construida y un valor promedio alto, aunque no el más alto. Esta información sugiere que todos los inmuebles en este grupo son casas.
Por otro lado, el Cluster 3 incluye inmuebles con excelentes prestaciones, que se distinguen del Cluster 1 y 2 por sus valores, áreas construidas, número de habitaciones, baños y parqueaderos sin embargo poseen un precio mucho mas elevado que los cluster 2 y 1.
El Cluster 2, a su vez, se diferencia del Cluster 1 por tener un precio promedio más bajo, así como un menor número promedio de habitaciones, baños y parqueaderos.
3. Análisis de Correspondencia : Examinar la relación entre las variables categóricas (tipo de vivienda, zona y barrio), para identificar patrones de comportamiento de la oferta en mercado inmobiliario.
Base_ACM <- base_viviendas %>%
select(tipo, zona,estrato)
tabla_cruzada <- table(Base_ACM$estrato, Base_ACM$zona)
print(tabla_cruzada)
##
## Zona Centro Zona Norte Zona Oeste Zona Oriente Zona Sur
## 3 105 572 54 340 382
## 4 14 407 84 8 1616
## 5 4 769 290 2 1685
## 6 1 172 770 1 1043
chisq.test(tabla_cruzada)
##
## Pearson's Chi-squared test
##
## data: tabla_cruzada
## X-squared = 3830.4, df = 12, p-value < 2.2e-16
library(FactoMineR)
library(factoextra)
library(gridExtra)
resultados_ac <- CA(tabla_cruzada)
resultados_ac
## **Results of the Correspondence Analysis (CA)**
## The row variable has 4 categories; the column variable has 5 categories
## The chi square of independence between the two variables is equal to 3830.435 (p-value = 0 ).
## *The results are available in the following objects:
##
## name description
## 1 "$eig" "eigenvalues"
## 2 "$col" "results for the columns"
## 3 "$col$coord" "coord. for the columns"
## 4 "$col$cos2" "cos2 for the columns"
## 5 "$col$contrib" "contributions of the columns"
## 6 "$row" "results for the rows"
## 7 "$row$coord" "coord. for the rows"
## 8 "$row$cos2" "cos2 for the rows"
## 9 "$row$contrib" "contributions of the rows"
## 10 "$call" "summary called parameters"
## 11 "$call$marge.col" "weights of the columns"
## 12 "$call$marge.row" "weights of the rows"
valores_prop <-resultados_ac$eig ; valores_prop
## eigenvalue percentage of variance cumulative percentage of variance
## dim 1 0.32215213 69.965515 69.96551
## dim 2 0.12745096 27.680002 97.64552
## dim 3 0.01084108 2.354483 100.00000
fviz_screeplot(resultados_ac, addlabels = TRUE, ylim = c(0, 80))+ggtitle("")+
ylab("Porcentaje de varianza explicado") + xlab("Ejes")
Dim 1 (69.97%): Representa la mayor parte de la variabilidad en los datos, lo que sugiere que esta dimensión es la más importante para diferenciar las categorías.
Dim 2 (27.68%): Aporta una cantidad significativa de información adicional.
Distribución de Zonas:
Zona Oriente y Zona Centro están alineadas principalmente con la Dim 1, lo que sugiere que estas zonas tienen características que las diferencian claramente en esta dimensión.
Zona Oeste está más asociada a la Dim 2, lo que indica que esta dimensión es más relevante para diferenciarla de las otras zonas.
Zona Norte y Zona Sur se encuentran cerca del origen de los ejes, lo que podría indicar que no tienen una fuerte asociación con ninguna de las dos dimensiones principales.
Relación entre categorías (números):
Los puntos azules representan categorías numéricas que también se asocian con ciertas zonas. El estrato 6 está más cercano a Zona Oeste. El estrato 4 y 5 están cerca de las Zona Sur y Zona Norte. y el estrato 3 está próximo a Zona Centro.
CONCLUSIONES Y PLAN DE ACCIÓN
En el análisis de componentes principales (ACP), se logró reducir la dimensionalidad de manera efectiva, identificando características clave que influyen en la variación de precios y la oferta del mercado inmobiliario.
Entre las principales características se destaca el número de habitaciones en un inmueble, lo que sugiere que, a mayor cantidad de habitaciones, el inmueble presentará una mayor variabilidad en otros atributos. Esto se debe a la fuerte correlación con otras variables que influyen en la primera dimensión del ACP, como el área construida y la cantidad de baños. Es lógico suponer que, a más habitaciones, el inmueble contará con más baños y mayor área construida, lo cual, a su vez, impacta en un precio más elevado de la vivienda.
En cuanto a la segmentación, se identificaron cuatro grupos principales de viviendas. Los grupos 3 y 4 se destacan como viviendas de tipo premium, caracterizadas por un alto número de habitaciones y parqueaderos, así como por su amplitud y costo superior al promedio. Por otro lado, los grupos 1 y 2 representan viviendas más estándar, con ligeras diferencias entre ellas, posiblemente orientadas a segmentos específicos de compradores o clientes.
Adicionalmente, se pudo mapear la distribución de los inmuebles según los estratos socioeconómicos de las diferentes zonas de la ciudad. Esto permite orientar a los clientes de acuerdo con sus preferencias en términos de ubicación y estrato.