Este estudio tiene como finalidad implementar diversos métodos de análisis multivariado para comprender en profundidad las dinámicas y características clave del mercado de vivienda en la ciudad de Cali. Con este propósito, se analiza un conjunto de datos que recopila información detallada sobre las propiedades residenciales de la zona y sus precios de venta.
La investigación se estructura en cuatro secciones fundamentales: inicialmente, se detalla el procedimiento de limpieza, imputación de datos ausentes y exploración estadística inicial de la base de datos. Posteriormente, se abordan los resultados del análisis de componentes principales (PCA). En tercer lugar, se expone el análisis de conglomerados para la segmentación de viviendas y, finalmente, se desarrolla el análisis de correspondencias para estudiar las asociaciones entre variables cualitativas.
Evaluar las condiciones y patrones estructurales del sector inmobiliario de Cali mediante el uso de herramientas estadísticas multivariadas, específicamente a través de técnicas de reducción de dimensionalidad (componentes principales), agrupación de datos (conglomerados) y estudios de asociación categórica (correspondencias simples y múltiples).
En este apartado se describen los procedimientos técnicos seguidos para asegurar la consistencia, calidad y confiabilidad de los datos. El proceso inicia con una fase de preprocesamiento dedicada a la identificación y tratamiento de registros vacíos. Posteriormente, se procede con la aplicación secuencial de los métodos de componentes principales, agrupamiento estadístico y correspondencias categóricas.
Como punto de partida, se realiza la importación del conjunto de datos original, el cual cuenta con un total de 8,322 observaciones distribuidas en 13 variables.
A continuación, se presentan las estadísticas descriptivas básicas para caracterizar el comportamiento inicial de las variables del estudio:
Se detecta la presencia de valores ausentes (NA) en múltiples variables dentro del conjunto de datos. En particular, las variables relativas al piso del inmueble y a la cantidad de parqueaderos exhiben la mayor proporción de datos faltantes, superando en ambos casos los 2,300 registros vacíos.
Para resolver esta limitación, el protocolo de limpieza contempla la recodificación de las variables cualitativas correspondientes al barrio y tipo de vivienda. Tras esto, se procederá con la imputación de los datos ausentes para asegurar la consistencia metodológica de los posteriores análisis multivariados (PCA, clúster y correspondencias).
Debido a que la variable id funciona como la clave
primaria para diferenciar cada propiedad, es indispensable descartar
cualquier registro que presente un valor nulo en este campo. Asimismo,
se verifica que no existan observaciones duplicadas para un mismo
identificador.
# Eliminación de los valores NA del id
vivienda <- vivienda[!is.na(vivienda$id), ]
duplicados <- duplicated(vivienda$id) # genera una vista con las columnas duplicadas
vivienda_con_duplicados <- vivienda[duplicados, ] # genera una tabla con los duplicados
head(vivienda_con_duplicados) # Revisar el subconjunto de datosDado que el valor bruto del inmueble está directamente influenciado por su tamaño, realizar comparaciones directas de precios puede inducir a sesgos. En su lugar, se opta por calcular el precio por metro cuadrado, una métrica estándar en el sector inmobiliario. Para facilitar la lectura y escala de las estimaciones en los gráficos y modelos, este valor se reescala multiplicándose por mil.
Se evalúa la magnitud de los valores vacíos en cada una de las columnas de la tabla de datos:
Dado que las variables de piso y de parqueaderos concentran la totalidad de los datos nulos, se diseñarán estrategias específicas de imputación para cada una.
Aunque existen métodos sencillos como la sustitución por la media o
la mediana, estos pueden alterar la variabilidad natural de los datos,
especialmente al tratarse de una variable discreta. Para mitigar esto,
se aplica una técnica de imputación múltiple utilizando el algoritmo PMM
(Predictive Mean Matching) mediante el paquete mice. Este
enfoque estima las observaciones faltantes relacionando la variable de
interés con otras características de la propiedad y seleccionando un
valor real de un caso similar.
A fin de optimizar el algoritmo, las variables cualitativas (zona, barrio y tipo de vivienda) se transforman a formato numérico (factores) y se ejecuta el modelo con un límite de 50 iteraciones.
vivienda$piso <- as.numeric(vivienda$piso)
ggplot(vivienda, aes(x = .data[["piso"]])) +
geom_bar() +
labs(title = "Distribución de 'piso' antes de la imputación")na_piso <- sum(is.na(vivienda$piso))
mensaje <- paste("Hay", na_piso, "valores en blanco")
print(mensaje)## [1] "Hay 2635 valores en blanco"
######3.1 convertir variables categóricas a numéricas ######
# Convertir la variable "tipo" a numérica
vivienda$tipo_num <- as.numeric(factor(vivienda$tipo))
vivienda$barrio_num <- as.numeric(factor(vivienda$barrio))
vivienda$zona_num <- as.numeric(factor(vivienda$zona))
######3.2 Imputar la variable piso con el paquete mice ######
# Crear un conjunto de datos con las variables relevantes para la imputación
data_impute <- vivienda[, c("estrato", "preciom", "areaconst", "banios", "habitaciones", "tipo_num", "barrio_num", "zona_num", "piso")]
# Realizar la imputación utilizando el método MICE (Multiple Imputation by Chained Equations)
imputed_data <- mice(data_impute, method = "pmm", m = 5, maxit = 50, printFlag = FALSE)
# Combinar los conjuntos de datos imputados en un único conjunto de datos
imputed_data_complete <- complete(imputed_data)
# Agregar la columna imputada "piso_imp" a la tabla vivienda
# vivienda$piso_imp <- imputed_data_complete$piso
vivienda$piso <- imputed_data_complete$pisoEl gráfico siguiente muestra la distribución de la variable después del proceso de imputación, donde se observa que no se generaron alteraciones o sesgos drásticos en el comportamiento de los datos originales.
ggplot(vivienda, aes_string(x = "piso")) +
geom_bar() +
labs(title = "Distribución de 'piso' después de la imputación")Al examinar la distribución de los estacionamientos en función de los estratos socioeconómicos, se nota que no hay registros iniciales con valor cero (propiedades sin parqueadero). Esto sugiere que la ausencia de datos en esta columna responde a viviendas que no disponen de este espacio. Como los valores omitidos se concentran principalmente en los estratos 3 y 4, se asume esta premisa y se reemplazan los valores nulos por cero.
ggplot(data = vivienda, aes_string(x = "parqueaderos")) +
geom_bar(stat = "count", position = "identity") +
labs(x = "Parqueaderos", y = "Frecuencia", title = "Distribución de parqueaderos") +
theme_minimal()tabla_na <- table(factor(vivienda$estrato, levels = unique(vivienda$estrato)), ifelse(is.na(vivienda$parqueaderos), "Con NA", "Sin NA")) %>% data.frame()
# Convertir la tabla a formato Markdown
tabla_markdown <- knitr::kable(tabla_na, format = "markdown")
# Mostrar la tabla en Markdown
tabla_markdown| Var1 | Var2 | Freq |
|---|---|---|
| 3 | Con NA | 769 |
| 4 | Con NA | 488 |
| 5 | Con NA | 228 |
| 6 | Con NA | 117 |
| 3 | Sin NA | 684 |
| 4 | Sin NA | 1641 |
| 5 | Sin NA | 2522 |
| 6 | Sin NA | 1870 |
na_parquea <- sum(is.na(vivienda$parqueaderos))
mensaje <- paste("Hay", na_parquea, "valores en blanco")
mensaje## [1] "Hay 1602 valores en blanco"
Se procede con la sustitución directa de los datos ausentes por el valor de cero en la variable correspondiente a parqueaderos.
######Imputar los valores NA de la variable parquea con ceros
vivienda$parqueaderos <- replace(vivienda$parqueaderos, is.na(vivienda$parqueaderos), 0)
na_parquea <- sum(is.na(vivienda$parqueaderos))
mensaje <- paste("Hay", na_parquea, "valores en blanco")
mensaje## [1] "Hay 0 valores en blanco"
rm(barrio_frec, na_values, tabla_na, vivienda_con_duplicados, data_impute, imputed_data, imputed_data_complete) # borrado de tablas que no se usanEn conclusión, en esta fase preliminar de acondicionamiento de datos se removieron los registros con identificadores vacíos y se estimaron con éxito las observaciones faltantes de las variables de parqueaderos y piso.
El análisis de correlaciones constituye un paso indispensable en la fase de exploración de datos. Permite identificar de manera visual el nivel de asociación lineal entre variables continuas y orienta la posterior selección de componentes y agrupamientos.
Con el propósito de simplificar el estudio y centrarnos en las variables estructurantes de la vivienda, se descartan variables de georreferenciación o alta dimensionalidad categórica como latitud, longitud y barrio.
# Crear la matriz de correlación
cor_matrix <- cor(vivienda_work)
# Graficar la matriz de correlación
corrplot(cor_matrix, method = "color", type = "upper",
tl.col = "black", tl.srt = 45,
title = "Matriz de Correlación de vivienda")Asociaciones lineales detectadas: - Nivel del Piso
(piso): Muestra una asociación negativa de
magnitud moderada con la zona codificada (zona_num). Esto
sugiere que la tendencia a construir edificios de mayor altura varía
geográficamente según el sector de la ciudad.
Estrato Socioeconómico (estrato):
Exhibe una correlación positiva y moderada con el tamaño de
construcción, el valor comercial y el número de parqueaderos. Esto
ratifica que los sectores de mayor nivel socioeconómico se caracterizan
por albergar viviendas de mayor metraje, precio y disponibilidad de
cocheras. La relación con el número de dormitorios es igualmente
positiva pero de menor intensidad.
Área Construida (areaconst): Posee
una marcada y positiva asociación lineal con el precio y los
estacionamientos, lo que comprueba que las viviendas de mayor tamaño
implican un mayor desembolso económico y más espacios para vehículos.
Asimismo, guarda correlación positiva con la cantidad de habitaciones y
baños.
Estacionamientos (parqueaderos):
Registra una fuerte dependencia lineal positiva con el precio de venta
del inmueble, evidenciando que las propiedades equipadas con más
espacios de parqueo tienen una valoración superior en el
mercado.
Precio Total (preciom): De manera
congruente con la lógica del mercado, está estrechamente vinculado de
forma positiva con el área de construcción, el número de parqueaderos y
el estrato socioeconómico de la vivienda, además de mostrar nexos
positivos con la cantidad de alcobas y servicios sanitarios.
Baños (banios): Tiene una relación
lineal directa y positiva con el metraje, parqueaderos, precio y
alcobas, revelando que a mayor escala física y precio del inmueble,
aumenta proporcionalmente la cantidad de servicios sanitarios.
Habitaciones (habitaciones): Se
asocia positivamente con el espacio construido, precio y baños. Destaca
un vínculo relevante con la variable numérica de tipo de vivienda
(tipo_num), lo que sugiere que ciertas tipologías (como
casas) concentran inherentemente un mayor número de
dormitorios.
Precio Unitario por Metro Cuadrado
(p_m2): Exhibe correlaciones de menor intensidad
comparado con las variables brutas de tamaño y precio total, sugiriendo
una mayor estabilidad o un comportamiento influenciado por factores no
lineales.
Tipología (tipo_num): Presenta
relaciones interesantes con las variables de habitaciones y zona
geográfica, sugiriendo diferencias estructurales de construcción según
el cuadrante urbano de Cali.
Zona (zona_num): Posee nexos
negativos con el piso de ubicación y relaciones leves con el resto de
atributos, indicando disparidades espaciales en la morfología de la
oferta de vivienda.
Conclusión de la fase exploratoria: La matriz de correlación simplifica la comprensión de la estructura de dependencia lineal del conjunto de datos. Permite identificar núcleos de fuerte asociación entre atributos socioeconómicos y de tamaño (como estrato, área de construcción y precio total), estableciendo las bases para la aplicación de técnicas multivariadas.
Este método se emplea con el fin de simplificar la dimensionalidad del espacio de variables originales, proyectando la información en un número reducido de variables ortogonales (componentes principales) que retienen la mayor proporción posible de la variabilidad del sistema.
data("vivienda_work")
viviendaZ= scale(vivienda_work[,2:5])
res.pca <- prcomp(viviendaZ)
fviz_eig(res.pca, addlabels = TRUE)El primer eje de proyección (Dim1) logra explicar por sí solo el 46.4% de la dispersión total de la información. Por su parte, el segundo eje (Dim2) retiene un 28.9% de la varianza. De forma conjunta, las dos primeras dimensiones acumulan el 75.3% de la variabilidad global, lo que garantiza una representación simplificada de alta calidad que conserva la mayor parte de la información relevante de la muestra.
fviz_pca_var(res.pca,
col.var = "contrib", # Color by contributions to the PC
gradient.cols = c("#FF7F00", "#034D94"),
repel = TRUE # Avoid text overlapping
)El círculo de correlación del PCA proyecta el comportamiento de las variables originales sobre el plano de las dos dimensiones principales, revelando su grado de asociación y aportes a cada eje:
Relaciones Entre Variables:
Piso del inmueble (piso): Muestra
una contribución dominante hacia la segunda dimensión (Dim2), como lo
ilustra su vector vertical. Su orientación casi perpendicular al eje
horizontal indica que su variabilidad es independiente del
comportamiento de las variables de dimensión y precio.
Área, Estacionamientos y Estrato (areaconst,
parqueaderos, estrato): Estos
atributos están estrechamente alineados con la primera dimensión (Dim1),
evidenciando que son los que estructuran la mayor parte del primer
factor.
Patrón de asociación: Los vectores del tamaño de la vivienda, parqueaderos y nivel socioeconómico se agrupan en una misma dirección. Esto demuestra una correlación directa y positiva: las propiedades con mayor superficie cubierta suelen ubicarse en sectores de estratos elevados y ofrecer mayor capacidad de estacionamiento. En contraste, el vector correspondiente a la altura de piso se muestra ortogonal a este grupo, corroborando la nula relación lineal entre el nivel del piso y el metraje o estrato del inmueble.
El análisis factorial sintetiza la estructura de la base de datos en
dos grandes patrones: - El factor de altura o nivel del piso de la
vivienda (piso), que actúa de forma aislada e independiente
en el segundo componente (Dim2). - El factor dimensional y
socioeconómico (conformado por areaconst,
parqueaderos y estrato), las cuales están
estrechamente asociadas entre sí y rigen el comportamiento del primer
componente (Dim1).
Esta metodología estadística tiene como finalidad clasificar los registros en grupos homogéneos (clústeres), de tal modo que las viviendas de un mismo grupo compartan atributos similares y se diferencien de las pertenecientes a otras agrupaciones. Para este estudio, se normalizan las variables cuantitativas y se ejecuta un algoritmo de particionamiento no jerárquico a fin de clasificar el mercado de Cali.
# Método del codo
fviz_nbclust(datos_escalados, kmeans, method = "wss") +
geom_vline(xintercept = 3, linetype = 2) + # Modifica el número de intersección según el gráfico generado
labs(subtitle = "Elbow method")Al evaluar el punto de inflexión en la curva de la suma de cuadrados intra-grupo (gráfico de codo), se identifica que la estructura óptima para segmentar la base de datos consta de 3 conglomerados.
# Agregar el número de cluster a los datos originales
vivienda_work$cluster <- as.factor(kmeans_result$cluster)
# Visualización de los clusters
fviz_cluster(kmeans_result, data = datos_escalados,
geom = "point", stand = FALSE,
ellipse.type = "norm", ggtheme = theme_minimal())# Graficar el dendograma
### Dendograma basado en los centroides
# Calcular las distancias entre los centroides
dist_centroids <- dist(kmeans_result$centers, method = "euclidean")
# Clustering jerárquico basado en los centroides
hclust_centroids <- hclust(dist_centroids, method = "complete")
# Graficar el dendograma
fviz_dend(hclust_centroids, rect = TRUE, show_labels = TRUE, palette = "jco")La estructura jerárquica del dendrograma de centroides indica una alta cercanía entre las agrupaciones 1 y 2, las cuales se enlazan en un nivel inferior de distancia euclidiana. En contraste, el conglomerado 3 se separa de los dos primeros a una altura significativamente mayor, marcando una discrepancia notable en sus atributos estructurales. Si se realizara una simplificación a nivel macro, los grupos 1 y 2 podrían consolidarse frente al comportamiento atípico del grupo 3.
# Resumen de características de cada cluster
vivienda_work %>%
group_by(cluster) %>%
summarise_all(mean)El resumen promedio de los conglomerados permite identificar la siguiente segmentación del mercado: - Clúster 1 (Gama Media-Alta): Se asocia predominantemente con propiedades en estrato 6, con un área promedio de 163 m², y características intermedias de baños e infraestructura. - Clúster 2 (Gama Media-Baja): Vinculado mayoritariamente a viviendas de estrato 4, con una superficie promedio menor (aprox. 93 m²) y menor cantidad de servicios. - Clúster 3 (Gama Alta / Lujo): Representa las viviendas más amplias y costosas, con un promedio de área de 329 m², asociadas al estrato 5 y caracterizadas por un mayor número de sanitarios y parqueaderos.
Esta técnica multivariada está diseñada para estudiar la existencia de asociaciones significativas entre variables cualitativas. A través de la proyección gráfica en dimensiones reducidas, es posible interpretar visualmente la cercanía y afinidad entre las distintas categorías del estudio.
Inicialmente, se presenta un análisis gráfico de distribución para explorar la composición socioeconómica según la ubicación geográfica de las viviendas:
# Crear un dataframe con el conteo por zona y estrato
conteo_zona_estrato <- vivienda %>%
group_by(zona) %>%
count(estrato)
# Crear el gráfico de barras
ggplot(conteo_zona_estrato, aes(x = fct_reorder(zona, n), y = n, fill = estrato)) +
geom_bar(stat = "identity") +
labs(title = "Distribución de viviendas por estrato",x = "Zona", y = "Unidades", fill = "Estrato") +
theme_test()tabla <- table(vivienda_cat$zona, vivienda_cat$estrato)
colnames(tabla) <- c("Estrato 3", "Estrato 4", "Estrato 5", "Estrato 6" )
tabla##
## Estrato 3 Estrato 4 Estrato 5 Estrato 6
## Centro 105 14 4 1
## Norte 572 407 769 172
## Oeste 54 84 290 770
## Oriente 340 8 2 1
## Sur 382 1616 1685 1043
##
## Pearson's Chi-squared test
##
## data: tabla
## X-squared = 3830.4, df = 12, p-value < 2.2e-16
Los resultados del contraste de hipótesis Chi-cuadrado indican una fuerte asociación entre la ubicación (zona) y el estrato socioeconómico. Dado que el p-valor resulta significativo, se rechaza la hipótesis de independencia, confirmando que la distribución de estratos está condicionada por la zona geográfica.
## 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
# graficar las unidades por estrato y tipo
ggplot(vivienda, aes(fill = tipo, y = after_stat(count), x = estrato)) +
geom_bar(position = "dodge") +
labs(title = "Distribución de Tipos de Vivienda por estrato",
x = "Estrato",
y = "Número de viviendas") +
theme_test()tabla2 <- table(vivienda_cat$tipo, vivienda_cat$estrato)
colnames(tabla2) <- c("Estrato 3", "Estrato 4", "Estrato 5", "Estrato 6" )
tabla2##
## Estrato 3 Estrato 4 Estrato 5 Estrato 6
## Apartamento 639 1404 1766 1291
## Casa 814 725 984 696
##
## Pearson's Chi-squared test
##
## data: tabla2
## X-squared = 224.33, df = 3, p-value < 2.2e-16
De manera similar a la relación anterior, el contraste Chi-cuadrado demuestra una estrecha dependencia entre el estrato y el tipo de construcción (casa o apartamento), validando estadísticamente la hipótesis de asociación.
## eigenvalue percentage of variance cumulative percentage of variance
## dim 1 0.0269661 100 100
Los autovalores revelan que una única dimensión recoge la totalidad de la varianza acumulada del análisis de asociación entre estas dos variables.
fviz_screeplot(resultados_ac, 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?
Con el fin de analizar conjuntamente las tres variables categóricas estructurantes (Zona, Tipo y Estrato), se efectúa un modelo MCA para visualizar las interrelaciones globales en un espacio bidimensional:
# Seleccionar las variables categóricas de interés
vivienda_cat <- vivienda[, c("zona", "estrato", "tipo")]
vivienda_cat$estrato <- as.factor(vivienda_cat$estrato)
# Realizar el Análisis de Correspondencias Múltiples (MCA)
mca_resultado <- MCA(vivienda_cat, graph = FALSE)
# Visualizar la varianza explicada por cada componente
fviz_screeplot(mca_resultado, addlabels = TRUE, ylim = c(0, 50)) +
ggtitle("Porcentaje de Varianza Explicada por los Componentes") +
ylab("Porcentaje de varianza explicado") +
xlab("Componentes")# Graficar el biplot de MCA
fviz_mca_biplot(mca_resultado, repel = TRUE) +
ggtitle("Biplot de MCA") +
theme_minimal()# Visualizar las contribuciones de las variables a cada dimensión
fviz_mca_var(mca_resultado, choice = "mca.cor", repel = TRUE) +
ggtitle("Contribuciones de las Variables a las Dimensiones") +
theme_minimal()
- El histograma de varianza explicada indica que aproximadamente el 80%
de la inercia total se retiene al considerar los primeros 5 factores. -
La representación del biplot MCA destaca las siguientes cercanías
categóricas: - Las categorías Centro y
Oriente se posicionan de manera contigua en la parte
derecha, sugiriendo que comparten perfiles urbanos y comerciales muy
similares. - La Zona Sur y los Estratos 4 y
5 se sitúan en cuadrantes cercanos, lo que constata la alta
incidencia de estos niveles socioeconómicos en el sur de Cali. - La
cercanía entre Estrato 3 y la Zona
Centro sugiere una presencia predominante de este estrato en
dicho sector de la ciudad. - Respecto al mapa de correlación de
variables con los factores principales, se concluye que
Zona y Estrato ejercen la mayor
influencia en la conformación de los primeros dos componentes (Dim1 y
Dim2). Por el contrario, la variable Tipo de vivienda
se sitúa próxima al origen, evidenciando un menor peso explicativo en la
variabilidad espacial global de este modelo.
A partir de la ejecución y evaluación de los modelos multivariados se derivan las siguientes conclusiones:
piso) opera de manera independiente
y segregada, marcando una dimensión de variabilidad diferenciada del
grupo de variables de tamaño y precio (areaconst,
preciom, estrato, parqueaderos),
las cuales se encuentran altamente vinculadas entre sí.Cada una de las metodologías estadísticas implementadas aporta perspectivas complementarias y no excluyentes: