1. Introducción

La evaluación de la oferta inmobiliaria urbana se ha convertido en una prioridad estratégica para las empresas del sector, especialmente en grandes ciudades donde el dinamismo del mercado y la diversidad de opciones generan desafíos únicos. En este contexto, una empresa inmobiliaria líder busca profundizar su comprensión del mercado de viviendas urbanas para tomar decisiones informadas y estratégicas. Para ello, dispone de una base de datos exhaustiva que recoge información detallada sobre diversas propiedades residenciales disponibles en la ciudad de Cali.

El objetivo principal de este análisis es identificar patrones, relaciones y segmentaciones relevantes dentro del mercado, con el fin de optimizar la compra, venta y valoración de propiedades. A través de un análisis integral y multidimensional de los datos, se espera proporcionar una visión holística del mercado inmobiliario, facilitando así la toma de decisiones estratégicas. Este informe presentará un análisis detallado utilizando diversas técnicas de análisis de datos, como Análisis de Componentes Principales, Análisis de Conglomerados y Análisis de Correspondencia, así como visualizaciones de los resultados obtenidos.

Los hallazgos y recomendaciones que se deriven de este estudio proporcionarán a la empresa una ventaja competitiva en un entorno dinámico y en constante evolución, permitiéndole optimizar sus inversiones y maximizar los beneficios.

2. Objetivo

Realizar un análisis integral de la oferta inmobiliaria urbana para identificar patrones, relaciones y segmentaciones clave en el mercado de propiedades residenciales en la ciudad de Cali.

3. Método

Para llevar a cabo el análisis de los datos, se empleó el software estadístico R en su versión 4.3.2, siguiendo los siguientes pasos:

  • Analisis exploratorio de datos(EDA): Se realizó un análisis exploratorio exhaustivo de las variables en la base de datos. Este análisis permitió una caracterización detallada de cada variable y la identificación de problemas de calidad, como la parametrización inadecuada, valores no estandarizados, valores atípicos y valores faltantes. Se utilizaron gráficos y estadísticas descriptivas para obtener una visión preliminar y completa del conjunto de datos.

  • Preparación de los datos: Se llevó a cabo una limpieza y transformación de datos para asegurar su calidad y fiabilidad. De esta manera, se garantizó que el conjunto de datos estuviera listo para un análisis preciso.

  • Análisis integral y multidimensional: Con los datos preparados, se procedió a un análisis integral utilizando varias técnicas. Se empleó el Análisis de Componentes Principales (PCA) para reducir la dimensionalidad del conjunto de datos y visualizar las variables principales que afectan la variación de precios y la oferta del mercado. Se realizó un análisis de agrupamiento para segmentar las propiedades en grupos homogéneos, facilitando la comprensión de las dinámicas de oferta en distintas áreas y estratos socioeconómicos. Finalmente, se llevó a cabo un Análisis de Correspondencia para explorar las relaciones entre variables categóricas como tipo de vivienda, zona y estrato, identificando patrones en la oferta del mercado inmobiliario.

4. Resultados

4.1. Analisis exploratorio de datos (EDA)

La importación de los datos se obtuvo mediante el siguiente repositorio:

devtools::install_github("dgonxalex80/paqueteMODELOS", force = TRUE)
library(paqueteMODELOS)
data(vivenda)

La base de datos vivienda presenta la siguiente estructura:

st_options(
  dfSummary.custom.2 = 
    expression(
      paste(
        "Q1 - Q3 :",
        round(
          quantile(column_data, probs = .25, type = 2, 
                   names = FALSE, na.rm = TRUE), digits = 1
        ), " - ",
        round(
          quantile(column_data, probs = .75, type = 2, 
                   names = FALSE, na.rm = TRUE), digits = 1
        )
      )
    )
)
dfSummary(vivienda, 
            valid.col    = FALSE,
            style        = "grid",
            plain.ascii  = FALSE,
            headings     = FALSE,
            graph.magnif = 0.75,
            tmp.img.dir  = "/tmp"
          )
No Variable Stats / Values Freqs (% of Valid) Graph Missing
1 id
[numeric]
Mean (sd) : 4160 (2401.6)
min < med < max:
1 < 4160 < 8319
IQR (CV) : 4159 (0.6)
Q1 - Q3 : 2080 - 6240
8319 distinct values 3
(0.0%)
2 zona
[character]
1. Zona Centro
2. Zona Norte
3. Zona Oeste
4. Zona Oriente
5. Zona Sur
124 ( 1.5%)
1920 (23.1%)
1198 (14.4%)
351 ( 4.2%)
4726 (56.8%)
3
(0.0%)
3 piso
[character]
1. 02
2. 03
3. 01
4. 04
5. 05
6. 06
7. 08
8. 07
9. 09
10. 10
[ 2 others ]
1450 (25.5%)
1097 (19.3%)
860 (15.1%)
607 (10.7%)
567 (10.0%)
245 ( 4.3%)
211 ( 3.7%)
204 ( 3.6%)
146 ( 2.6%)
130 ( 2.3%)
167 ( 2.9%)
2638
(31.7%)
4 estrato
[numeric]
Mean (sd) : 4.6 (1)
min < med < max:
3 < 5 < 6
IQR (CV) : 1 (0.2)
Q1 - Q3 : 4 - 5
3 : 1453 (17.5%)
4 : 2129 (25.6%)
5 : 2750 (33.1%)
6 : 1987 (23.9%)
3
(0.0%)
5 preciom
[numeric]
Mean (sd) : 433.9 (328.6)
min < med < max:
58 < 330 < 1999
IQR (CV) : 320 (0.8)
Q1 - Q3 : 220 - 540
539 distinct values 2
(0.0%)
6 areaconst
[numeric]
Mean (sd) : 174.9 (143)
min < med < max:
30 < 123 < 1745
IQR (CV) : 149 (0.8)
Q1 - Q3 : 80 - 229
652 distinct values 3
(0.0%)
7 parqueaderos
[numeric]
Mean (sd) : 1.8 (1.1)
min < med < max:
1 < 2 < 10
IQR (CV) : 1 (0.6)
Q1 - Q3 : 1 - 2
1 : 3155 (47.0%)
2 : 2475 (36.8%)
3 : 520 ( 7.7%)
4 : 384 ( 5.7%)
5 : 68 ( 1.0%)
6 : 68 ( 1.0%)
7 : 18 ( 0.3%)
8 : 17 ( 0.3%)
9 : 4 ( 0.1%)
10 : 8 ( 0.1%)
1605
(19.3%)
8 banios
[numeric]
Mean (sd) : 3.1 (1.4)
min < med < max:
0 < 3 < 10
IQR (CV) : 2 (0.5)
Q1 - Q3 : 2 - 4
11 distinct values 3
(0.0%)
9 habitaciones
[numeric]
Mean (sd) : 3.6 (1.5)
min < med < max:
0 < 3 < 10
IQR (CV) : 1 (0.4)
Q1 - Q3 : 3 - 4
11 distinct values 3
(0.0%)
10 tipo
[character]
1. Apartamento
2. Casa
5100 (61.3%)
3219 (38.7%)
3
(0.0%)
11 barrio
[character]
1. valle del lili
2. ciudad jardín
3. pance
4. la flora
5. santa teresita
6. el caney
7. el ingenio
8. la hacienda
9. acopi
10. los cristales
[ 426 others ]
1008 (12.1%)
516 ( 6.2%)
409 ( 4.9%)
366 ( 4.4%)
262 ( 3.1%)
208 ( 2.5%)
202 ( 2.4%)
164 ( 2.0%)
158 ( 1.9%)
154 ( 1.9%)
4872 (58.6%)
3
(0.0%)
12 longitud
[numeric]
Mean (sd) : -76.5 (0)
min < med < max:
-76.6 < -76.5 < -76.5
IQR (CV) : 0 (0)
Q1 - Q3 : -76.5 - -76.5
2928 distinct values 3
(0.0%)
13 latitud
[numeric]
Mean (sd) : 3.4 (0)
min < med < max:
3.3 < 3.4 < 3.5
IQR (CV) : 0.1 (0)
Q1 - Q3 : 3.4 - 3.5
3679 distinct values 3
(0.0%)

De acuerdo con el resumen estadístico anterior, se observa que la base de datos contiene 8,322 registros (filas) y 13 variables (columnas). La caracterización de la base de datos es la siguiente:

a. Id: Variable de identificación.

b. Zona: Variable cualitativa nominal.

  • Distribución: Más de la mitad de las viviendas están ubicadas en la zona sur de la ciudad, representando el 56.8%. Le sigue la zona norte con el 23.1% y la zona oeste con el 14.4%. Las zonas oriente y centro tienen una oferta significativamente menor, con solo el 5.7%.
  • Valores faltantes: Solo hay 3 registros en los que no se reporta la zona del inmueble.

c. Piso: Variable cuantitativa discreta; sin embargo, en el conjunto de datos está representada como una variable categórica.

  • Distribución: Aproximadamente el 60% de las viviendas se encuentran entre el piso 1 y el piso 3, siendo el primer piso el más frecuente con un 25.5%. A medida que se asciende en los pisos, la cantidad de viviendas disminuye.
  • Valores faltantes: Esta variable presenta el mayor número de valores faltantes, con 2630 registros sin valores, lo que equivale al 32% del total.

d. Estrato: Variable cualitativa ordinal; sin embargo, en el conjunto de datos está representada como una variable numérica.

  • Distribución: El 58.7% de las viviendas pertenecen a los estratos 4 y 5, siendo el estrato 5 el más recurrente con un 33.1%. En contraste, el estrato 3, que es el menos ofertado, representa solo el 17.5% de las viviendas. La distribución presenta una leve asimetría a la izquierda, lo que indica que hay una mayor concentración en los estratos superiores. Esta asimetría sugiere una oferta predominante en estratos más altos, con menos representación en los estratos inferiores.
  • Valores faltantes: Solo hay 3 registros en los que no se reporta el estrato del inmueble.

e. Precio (millones): Variable cuantitativa continua.

  • Centralidad: El precio promedio de las viviendas es de 434 MM. El rango de precios varía desde un mínimo de 58 MM hasta un máximo de 1999 MM, resultando en un rango medio de 1029 MM.
  • Dispersión: Los precios tienen un rango de 1941 MM y un IQR de 320 MM, con una desviación estándar de 329 MM. El coeficiente de variación es del 80%, indicando una alta variabilidad.
  • Posición: El 25% inferior de los precios oscila entre 58 MM y 220 MM, mientras que el 75% de los precios llega hasta los 540 MM. La mediana se encuentra en 330 MM, y el último 25% de los precios varía entre 540 MM y 1999 MM.
  • Forma: La distribución de precios exhibe una asimetría hacia la derecha, lo que indica que el promedio es mayor que la mediana.
  • Valores faltantes: Solo hay 2 registros en los que no se reporta el precio del inmueble.

f. Área construida: Variable cuantitativa continua.

  • Centralidad: El área promedio de las viviendas es de 175 \(m^{2}\). El rango del área varía desde un mínimo de 30 \(m^{2}\) hasta un máximo de 1745 \(m^{2}\), resultando en un rango medio de 888 \(m^{2}\).
  • Dispersión: El área tienen un rango de 1715 \(m^{2}\) y un IQR de 149 \(m^{2}\), con una desviación estándar de 143 \(m^{2}\). El coeficiente de variación es del 80%, indicando una alta variabilidad.
  • Posición: El 25% inferior de las áreas oscila entre 30 \(m^{2}\) y 80 \(m^{2}\), mientras que el 75% de los precios llega hasta los 229 \(m^{2}\). La mediana se encuentra en 123 \(m^{2}\), y el último 25% de los precios varía entre 229 \(m^{2}\) y 1745 \(m^{2}\).
  • Forma: La distribución del área exhibe una asimetría hacia la derecha , lo que indica que el promedio es mayor que la mediana.
  • Valores faltantes: Solo hay 3 registros en los que no se reporta el área del inmueble.

g. Parqueaderos: Variable cuantitativa discreta.

  • Centralidad: El número de parqueaderos promedio de las viviendas es de 2. El rango varía desde un mínimo de 1 hasta un máximo de 10, resultando en un rango medio de 6.
  • Dispersión: El número de parqueaderos tiene un rango de 9 y un IQR de 1, con una desviación estándar de 1. El coeficiente de variación es del 60%.
  • Posición: El 25% inferior de los valores de parqueaderos es 1, mientras que el 75% de los valores llega hasta 2. La mediana es de 2, y el 25% superior de los valores varía entre 2 y 10.
  • Forma: La distribución del número de parqueaderos muestra una leve asimetría hacia la derecha, lo que implica que la media y la mediana son muy similares.
  • Valores faltantes: Esta variable presenta el segundo mayor número de valores faltantes, con 1605 registros sin valores, lo que equivale al 19.3% del total.

h. Baños: Variable cuantitativa discreta.

  • Centralidad: El número de baños promedio de las viviendas es de 3. El rango varía desde un mínimo de 0 hasta un máximo de 10, resultando en un rango medio de 5.
  • Dispersión: El número de baños tiene un rango de 10 y un IQR de 2, con una desviación estándar de 1. El coeficiente de variación es del 50%.
  • Posición: El 25% inferior de los valores de baños es 2, mientras que el 75% de los valores llega hasta 4. La mediana es de 3, y el 25% superior de los valores varía entre 4 y 10.
  • Forma: La distribución del número de baños muestra una leve asimetría hacia la derecha, lo que implica que la media y la mediana son muy similares.
  • Valores faltantes: Solo hay 3 registros en los que no se reporta número de baños del inmueble.

i. Habitaciónes: Variable cuantitativa discreta.

  • Centralidad: El número de habitaciónes promedio de las viviendas es de 4. El rango varía desde un mínimo de 0 hasta un máximo de 10, resultando en un rango medio de 5.
  • Dispersión: El número de habitaciónes tiene un rango de 10 y un IQR de 1, con una desviación estándar de 2. El coeficiente de variación es del 40%.
  • Posición: El 25% inferior de los valores de habitaciónes es 3, mientras que el 75% de los valores llega hasta 4. La mediana es de 3, y el 25% superior de los valores varía entre 4 y 10.
  • Forma: La distribución del número de habitaciónes muestra una asimetría hacia la derecha, lo que indica que el promedio es mayor que la mediana.
  • Valores faltantes: Solo hay 3 registros en los que no se reporta número de habitaciones del inmueble.

j. Tipo: Variable cualitativa nominal.

  • Distribución: Más de la mitad de las viviendas son de tipo apartamento, representando el 61.3%, mientras que el 38.7% son de tipo casa.
  • Valores faltantes: Solo hay 3 registros en los que no se reporta el tipo del inmueble.

k. Barrio: Variable cualitativa nominal.

  • Distribución: Hay 436 tipos de barrios asociados a las viviendas. El barrio Valle de Lili tiene la mayor cantidad de inmuebles ofertados, con un 12.1%, seguido de Ciudad Jardín con un 6.2% y Pance con un 4.9%. A primera vista, no se observa un patrón claro en la distribución de los inmuebles por barrios. Además, se evidencia una falta de estandarización en los nombres de los barrios, donde muchos comparten una misma distinción pero varían por el uso de mayúsculas, minúsculas y caracteres especiales.
  • Valores faltantes: Solo hay 3 registros en los que no se reporta el barrio del inmueble.

l. Longitud y Latitud: Variables cuantitativas continuas.

  • Distribución: Ambas variables están concentradas en -76.5º de longitud y 3.4º de latitud, ya que la mayoría de las viviendas se encuentran en la zona urbana de la ciudad de Cali. Esto indica que no hay diferencias significativas en las coordenadas.
  • Valores faltantes: Solo hay 3 registros en los que no se reporta ni la longitud ni la latitud del inmueble.

Por otro lado, se verificó gráficamente la presencia de valores atípicos en las variables numericas. Esta evaluación visual permite identificar observaciones que se desvían significativamente del patrón general de los datos, lo que puede afectar la calidad del análisis general.

vivienda_num = vivienda[,c(5,6,7,8,9,12,13)]

par(mfrow = c(3, 3)) 
par(mar = c(1, 3, 2, 1))

for (i in seq_along(vivienda_num)) {
  boxplot(vivienda_num[[i]], main = colnames(vivienda_num)[i], 
          col = "lightblue", las = 2, cex.axis = 0.8)
}

Se identificó que la mayoría de las variables numéricas presentan valores atípicos, con la excepción de la variable latitud. Esto se debe a que, dado que la base de datos corresponde a viviendas en la ciudad de Cali, se espera que los registros de latitud se encuentren en un rango muy restringido. Entre las variables, precio y área construida exhiben la mayor cantidad de valores atípicos, lo que sugiere que estos datos pueden tener una amplia variabilidad. En contraste, las variables parqueaderos, baños y habitaciones presentan una menor cantidad de valores atípicos, indicando una distribución más homogénea en estas características.

Finalmente, se verificó la ausencia de redundancia en el conjunto de datos. Para ello, se construyó una matriz de correlación para las variables numéricas.

matriz_cor = cor(vivienda_num, use = "complete.obs")
corrplot(matriz_cor, method = "circle", type = "lower", title = "Matriz de correlación", diag = TRUE, number.cex = 0.6, number.digits = 2, addCoef.col = "gray4", mar = c(0,0,2,0))

Como se observa, las correlaciones mas altas estan asociadas con la varible precio, que muestra las relaciones más fuertes con área contruida, parqueaderos y baños. Sin embargo, los coeficientes de correlación no superan el 69%, lo que indica una asociación débil.

Como resultado de este análisis exploratorio, se llevaron a cabo los siguientes pasos para solucionar los problemas de calidad detectados en el conjunto de datos.

  • Modificación de tipos de variables: Se ha cambiado el tipo de la variable piso a numérico y el tipo de la variable estrato a categórico para facilitar su uso en análisis posteriores.
  • Limpieza e imputación de registros con datos faltantes: Se procedio a eliminar y imputar registros con atributos faltantes para mejorar la calidad del conjunto de datos.
  • Limpieza de Valores Atípicos: Se eliminaron los valores atípicos asociados con las variables precio y área construida. Esta decisión se basa en la alta cantidad de valores atípicos identificados en estas variables, que podrían estar afectando la calidad del análisis y la precisión de los modelos posteriores.
  • Estandarización de nombres de barrios: Se estandarizaron los nombres de los barrios para asegurar la consistencia en la base de datos.

4.2. Preparación de los datos

- Modificación de tipo de variable: Se cambió el tipo de la variable piso a numérico y se verificó su correcta actualización.

vivienda$piso = as.numeric(vivienda$piso)
vivienda$estrato = as.character(vivienda$estrato)
kable(sapply(vivienda,class))
x
id numeric
zona character
piso numeric
estrato character
preciom numeric
areaconst numeric
parqueaderos numeric
banios numeric
habitaciones numeric
tipo character
barrio character
longitud numeric
latitud numeric

- Limpieza e imputación de registros con datos faltantes: Se corroboraron los datos faltantes previamente identificados en la base de datos.

faltantes = md.pattern(vivienda, rotate.names = TRUE)

Con lo anterior, se identificaron 3 registros que no contenían ningún tipo de información. Por lo tanto, se llevó a cabo un proceso de limpieza para eliminar estas filas.

# Eliminacion de filas con Id vacio
vivienda = vivienda[!is.na(vivienda$id),]
faltantes = md.pattern(vivienda, rotate.names = TRUE)

Para los registros restantes, se realizó la imputación de los datos faltantes en las variables de parqueaderos y pisos utilizando la mediana, debido a las asimetrías observadas en estas variables. Dado que la imputación no se puede generalizar fácilmente debido a las complejas interacciones con otras variables, como zona, estrato y tipo de apartamento, se creó una tabla de agrupación para relacionar estos datos y asegurar una imputación más precisa.

#Analisis por agrupamiento
Analisis = vivienda %>%
  group_by(zona, estrato, tipo) %>%
  summarise(
    parqueaderos = round(median(parqueaderos, na.rm = TRUE), digits = 0),
    Piso = round(median(piso, na.rm = TRUE), digits = 0)
  )
datatable(Analisis, list(pageLength=10))

A partir de este análisis, se procedió a imputar los datos faltantes. Este enfoque permitió rellenar la mayoría de los valores faltantes. Sin embargo, quedaron 4 registros que no pudieron ser imputados debido a la falta de información en sus respectivas agrupaciones. Por lo tanto, estos registros fueron eliminados. La eficacia del proceso de imputación se verificó mediante la gráfica correspondiente.

# Imputación de variable parqueaderos
vivienda = vivienda %>% 
  mutate(parqueaderos = case_when(
    is.na(parqueaderos) & zona == "Zona Centro" & estrato == "3" ~ 1,
    is.na(parqueaderos) & zona == "Zona Centro" & estrato == "4" ~ 1,
    is.na(parqueaderos) & zona == "Zona Centro" & estrato == "5" & tipo == "Apartamento" ~ 1,
    
    is.na(parqueaderos) & zona == "Zona Norte" & estrato == "3" ~ 1,
    is.na(parqueaderos) & zona == "Zona Norte" & estrato == "4" & tipo == "Apartamento" ~ 1,
    is.na(parqueaderos) & zona == "Zona Norte" & estrato == "4" & tipo == "Casa" ~ 2,
    is.na(parqueaderos) & zona == "Zona Norte" & estrato == "5" & tipo == "Apartamento" ~ 1,
    is.na(parqueaderos) & zona == "Zona Norte" & estrato == "5" & tipo == "Casa" ~ 2,
    is.na(parqueaderos) & zona == "Zona Norte" & estrato == "6" ~ 2,
    
    is.na(parqueaderos) & zona == "Zona Oeste" & estrato == "3" ~ 1,
    is.na(parqueaderos) & zona == "Zona Oeste" & estrato == "4" ~ 1,
    is.na(parqueaderos) & zona == "Zona Oeste" & estrato == "5" ~ 2,
    is.na(parqueaderos) & zona == "Zona Oeste" & estrato == "6" ~ 2,
    
    is.na(parqueaderos) & zona == "Zona Oriente" & estrato == "3" ~ 1,
    is.na(parqueaderos) & zona == "Zona Oriente" & estrato == "4" ~ 1,
    is.na(parqueaderos) & zona == "Zona Oriente" & estrato == "5" & tipo == "Apartamento" ~ 1,
    is.na(parqueaderos) & zona == "Zona Oriente" & estrato == "6" & tipo == "Apartamento" ~ 3,
    
    is.na(parqueaderos) & zona == "Zona Sur" & estrato == "3" ~ 1,
    is.na(parqueaderos) & zona == "Zona Sur" & estrato == "4" ~ 1,
    is.na(parqueaderos) & zona == "Zona Sur" & estrato == "5" & tipo == "Apartamento" ~ 1,
    is.na(parqueaderos) & zona == "Zona Sur" & estrato == "5" & tipo == "Casa" ~ 2,
    is.na(parqueaderos) & zona == "Zona Sur" & estrato == "6" & tipo == "Apartamento" ~ 2,
    is.na(parqueaderos) & zona == "Zona Sur" & estrato == "6" & tipo == "Casa" ~ 3,
    TRUE ~ parqueaderos
  ))

# Imputación de variable piso
vivienda = vivienda %>% 
  mutate(piso = case_when(
    is.na(piso) & zona == "Zona Centro" & estrato == "3" & tipo == "Apartamento" ~ 4,
    is.na(piso) & zona == "Zona Centro" & estrato == "3" & tipo == "Casa" ~ 1,
    is.na(piso) & zona == "Zona Centro" & estrato == "4" & tipo == "Apartamento" ~ 8,
    is.na(piso) & zona == "Zona Centro" & estrato == "4" & tipo == "Casa" ~ 2,
    
    is.na(piso) & zona == "Zona Norte" & tipo == "Casa" ~ 2,
    is.na(piso) & zona == "Zona Norte" & estrato == "3" & tipo == "Apartamento" ~ 4,
    is.na(piso) & zona == "Zona Norte" & estrato == "4" & tipo == "Apartamento" ~ 4,
    is.na(piso) & zona == "Zona Norte" & estrato == "5" & tipo == "Apartamento" ~ 5,
    is.na(piso) & zona == "Zona Norte" & estrato == "6" & tipo == "Apartamento" ~ 4,
    
    is.na(piso) & zona == "Zona Oeste" & tipo == "Casa" ~ 2, 
    is.na(piso) & zona == "Zona Oeste" & estrato == "3" & tipo == "Apartamento" ~ 4,
    is.na(piso) & zona == "Zona Oeste" & estrato == "4" & tipo == "Apartamento" ~ 3,
    is.na(piso) & zona == "Zona Oeste" & estrato == "5" & tipo == "Apartamento" ~ 4,
    is.na(piso) & zona == "Zona Oeste" & estrato == "6" & tipo == "Apartamento" ~ 5,
    
    is.na(piso) & zona == "Zona Oriente" & estrato == "3" ~ 2,
    is.na(piso) & zona == "Zona Oriente" & estrato == "4" & tipo == "Apartamento" ~ 4,    
    is.na(piso) & zona == "Zona Oriente" & estrato == "4" & tipo == "Casa" ~ 2, 
    is.na(piso) & zona == "Zona Oriente" & estrato == "5" & tipo == "Apartamento" ~ 5,    
    is.na(piso) & zona == "Zona Oriente" & estrato == "5" & tipo == "Casa" ~ 1,
    
    is.na(piso) & zona == "Zona Sur" & tipo == "Apartamento" ~ 4,
    is.na(piso) & zona == "Zona Sur" & tipo == "Casa" ~ 2, 
    TRUE ~ piso
  ))
vivienda = na.omit(vivienda)
gg_miss_var(vivienda)

- Limpieza de Valores Atípicos: Se incorporo una nueva variable al conjunto de datos que relaciona el precio de las viviendas con su área construida, con el fin de hacer comparable los inmuebles en términos de precio por \(m^{2}\). Esta inclusión facilitó la identificación de precios atípicos en las viviendas, lo cual condujo a una depuración de la base de datos, reduciéndola a 8219 registros válidos al eliminar aquellos con precios por metro cuadrado que excedían los valores esperados según la distribución de datos.

vivienda = vivienda %>% mutate(Preciometro=round(preciom/areaconst,digits = 1))
vivienda = vivienda %>%
  group_by(zona) %>%
  filter(Preciometro >= quantile(Preciometro, 0.25) - 1.5 * IQR(Preciometro) &
           Preciometro <= quantile(Preciometro, 0.75) + 1.5 * IQR(Preciometro)) %>%
  ungroup()
vivienda$Preciometro = NULL

- Estandarización de nombres de barrios: Se realizó una investigación mediante geolocalización para garantizar una agrupación adecuada de los barrios en torno a sus localizaciones, reduciendo el numero de barrio de 430 a 304.

# Dejar todo en miniscula y sin tildes
limpiar_barrios = function(names){nombres<-tolower(
                                  trimws(iconv(names,from="UTF-8",to="ASCII//TRANSLIT")))
                                  nombres<-gsub("[_]","",nombres)
                    return(nombres)
}
vivienda$barrio<-limpiar_barrios(vivienda$barrio)
# Estandarizar nombres
vivienda = vivienda %>%
  mutate(barrio = case_when(
    barrio %in% c("aguablanca") ~ "agua blanca",
    barrio %in% c("alamos","los alamos") ~ "ciudad los alamos",
    barrio %in% c("bajo aguacatal","miradol del aguacatal","sector aguacatal") ~ "aguacatal",
    barrio %in% c("alameda") ~ "alameda del rio",
    barrio %in% c("alf?crez real") ~ "alferez real",
    barrio %in% c("alfonso lopez i") ~ "alfonso lopez",
    barrio %in% c("arboleda") ~ "arboledas",
    barrio %in% c("altos de menga","colinas de menga") ~ "menga",
    barrio %in% c("la alborada") ~ "alborada",
    barrio %in% c("barrio 7de agosto","siete de agosto") ~ "7 de agosto",
    barrio %in% c("barrio el recuerdo") ~ "recuerdo",
    barrio %in% c("barrio eucaristico") ~ "eucaristico",
    barrio %in% c("barrio obrero") ~ "obrero",
    barrio %in% c("base a?crea") ~ "base aerea",
    barrio %in% c("ed benjamin herrera") ~ "benjamin herrera",
    barrio %in% c("bella suiza alta") ~ "bella suiza",
    barrio %in% c("bloques del limonar") ~ "bosques del limonar",
    barrio %in% c("el gran limonar") ~ "gran limonar",
    barrio %in% c("brisas de los") ~ "brisas de los alamos",
    barrio %in% c("ciudad bochalema") ~ "bochalema",
    barrio %in% c("cali","cali bella") ~ "calibella",
    barrio %in% c("cali canto","calicanto viii") ~ "calicanto",
    barrio %in% c("caney especial","el caney"," el caney") ~ "caney",
    barrio %in% c("cañaverales los samanes") ~ "cañaverales",
    barrio %in% c("Chiminangosr","chiminangos 1 etapa","chiminangos 2 etapa") ~ "chiminangos",
    barrio %in% c("capri") ~ "ciudad capri",
    barrio %in% c("ciudad cordoba reservado") ~ "ciudad cordoba",
    barrio %in% c("ciudad jardin pance","ciudad antejardin") ~ "ciudad jardin",
    barrio %in% c("ciudadela paso ancho") ~ "ciudadela pasoancho",
    barrio %in% c("ciudad mel?cndez","ciudadela melendez","meléndez","melendez") ~ "ciudad melendez",
    barrio %in% c("colseguros") ~ "colseguros andes",
    barrio %in% c("colon") ~ "cristobal colon",
    barrio %in% c("cristales","los cristales","tejares cristales") ~ "los cristales tejares",
    barrio %in% c("centro") ~ "zona centro",
    barrio %in% c("el ingenio i","ingenio i") ~ "ingenio I",
    barrio %in% c("ingenio ii","el ingenio ii") ~ "ingenio II",
    barrio %in% c("el ingenio 3","el ingenio iii","ingenio iii") ~ "ingenio III",
    barrio %in% c("el tr?cbol") ~ "el trebol",
    barrio %in% c("fuentes de la") ~ "fuentes",
    barrio %in% c("brisas del guabito") ~ "el guabito",
    barrio %in% c("el ingenio","el ingenio") ~ "ingenio",
    barrio %in% c("altos de guadalupe","brisas de guadalupe","cerros de guadalupe","guadalupe alto","sector cañaveralejo guadalupe") ~ "guadalupe",
    barrio %in% c("juanamb??") ~ "juanambu",
    barrio %in% c("jamundi alfaguara") ~ "jamundi",
    barrio %in% c("la ceibas","las ceibas") ~ "ceibas",
    barrio %in% c("la primavera") ~ "primavera",
    barrio %in% c("laflora","norte la flora","flora") ~ "la flora",
    barrio %in% c("la riviera") ~ "la rivera",
    barrio %in% c("la rivera i") ~ "la rivera I",
    barrio %in% c("la rivera ii") ~ "la rivera II",
    barrio %in% c("lares de comfenalco") ~ "comfenalco",
    barrio %in% c("las am?cricas") ~ "las americas",
    barrio %in% c("las vegas de","mayapan las vegas") ~ "las vegas",
    barrio %in% c("los alcazares","los alcázares") ~ "alcazares",
    barrio %in% c("cambulos") ~ "los cambulos",
    barrio %in% c("guaduales") ~ "los guaduales",
    barrio %in% c("libertadores") ~ "los libertadores",
    barrio %in% c("marroquin iii") ~ "marroquin III",
    barrio %in% c("normandía west point") ~ "normandia",
    barrio %in% c("nueva base") ~ "la base",
    barrio %in% c("rep??blica de israel") ~ "republica de israel",
    barrio %in% c("san judas tadeo") ~ "san judas",
    barrio %in% c("santa elene","santa helena de") ~ "santa helena",
    barrio %in% c("tequendema","urbanización tequendama") ~ "tequendama",
    barrio %in% c("refugio") ~ "el refugio",
    barrio %in% c("las quintas de") ~ "quintas de salomia",
    barrio %in% c("quintas de don") ~ "quintas de don simon",
    barrio %in% c("valle de lili") ~ "valle del lili",
    barrio %in% c("san bosco") ~ "san juan bosco",
    barrio %in% c("san fernando nuevo") ~ "san fernando",
    barrio %in% c("santa anita sur") ~ "santa anita",
    barrio %in% c("santafe") ~ "santa fe",
    barrio %in% c("sierras de normandia") ~ "normandia",
    barrio %in% c("villa de veracruz") ~ "villas de veracruz",
    barrio %in% c("zona norte los","norte") ~ "zona norte",
    TRUE ~ barrio  # Mantener valores que no necesitan agrupación
  ))

4.3. Análisis integral y multidimensional

4.3.1. Análisis de Componentes Principales (PCA)

El Análisis de Componentes Principales (PCA) se aplica a las variables cuantitativas, por lo que se filtró el conjunto de datos vivienda para incluir únicamente las siguientes variables: piso (3), preciom (5), areaconst (6), parqueaderos (7), baños (8) y habitaciones (9).

vivienda_num = vivienda[,c(3,5,6,7,8,9)]
kable(head(vivienda_num))
piso preciom areaconst parqueaderos banios habitaciones
2 320 120 1 2 3
2 350 220 2 2 4
2 400 280 3 5 3
1 260 90 1 2 3
1 240 87 1 3 3
1 220 52 2 2 3

Con el fin de evitar que las variables que tiene una escala con valores más grandes afecten las estimaciones realizadas (sesgos) se realizó la estandarización de las variables antes de proceder a realizar el proceso de estimación de los componentes principales.

vivienda_numZ = scale(vivienda_num)

Se procedió a realizar el análisis de componentes principales utilizando la función prcomp, obteniendo los porcentajes de variabilidad explicada por cada componente.

res.pca = prcomp(vivienda_numZ)
fviz_eig(res.pca, addlabels = TRUE)

En este caso, el primer componente principal explica el 54.6% de la variabilidad en la base de datos, y entre los dos primeros componentes explican en conjunto el 73.3%. Esto indica que, utilizando solo estos dos componentes, los cuales se obtienen mediante combinaciones lineales de las variables, es posible capturar una gran parte de la variabilidad contenida en el conjunto de datos.

Al analizar el grado de contribución de los dos primeros componentes, se determina:

fviz_contrib(res.pca,choice = "var",axes = 1)

fviz_contrib(res.pca,choice = "var",axes = 2)

Para el Componente Principal 1 (CP1), las variables que mayormente contribuyen a la variabilidad son área construida, baños, precio y parqueaderos, sumando aproximadamente el 85% de la variabilidad del componente. En el Componente Principal 2 (CP2), las principales contribuciones provienen de piso y habitaciones, que en conjunto explican alrededor del 78% de la variabilidad del componente.

También se construyó el círculo de correlaciones, para validar los comportamientos previamente descritos:

fviz_pca_var(res.pca, axes = c(1, 2), col.var = "contrib", gradient.cols = c("#FF7F00", "#034D94"), repel = TRUE)

Al analizar las variables en el plano de los componentes principales, se puede identificar la dirección y la caracterización de los componentes, permitiendo formular las siguientes conjeturas:

  • Componente Principal 1 (CP1): Los vectores con mayor longitud en este componente corresponden a variables con alta contribución, como área construida, baños, precio y parqueaderos. Estas variables están positivamente correlacionadas entre sí, destacando especialmente la fuerte relación entre precio y parqueaderos, así como entre área construida y baños. En contraste, los vectores en color naranja, que representan variables con menor contribución en el primer componente, son piso y habitaciones, sugiriendo una correlación débil o inexistente con las variables de mayor influencia.

  • Componente Principal 2 (CP2): Los vectores con mayor longitud en este componente corresponden a variables importantes como piso y habitaciones. Estas variables presentan una correlación negativa, lo que indica que a medida que aumenta el número de pisos, el número de habitaciones tiende a disminuir. A diferencia del Componente Principal 1, las variables que eran más representativas para CP1 tienen una menor contribución en CP2.

Complementando el análisis, se realizó un gráfico biplot que combina la información de las variables y los individuos, permitiendo visualizar simultáneamente la proyección de las observaciones (individuos) y las variables en el espacio definido por los componentes principales.

En esta primera gráfica, se incluye la variable categórica tipo para entender mejor las relaciones existentes.

fviz_pca_biplot(res.pca, 
                repel = TRUE,
                habillage = vivienda$tipo,
                col.var = "#034A94", # Variables color
                col.ind = c("#DEDEDE", "#034A94"),  # Individuals color
                geom = c("point")
)

Se observa la presencia de dos conglomerados claramente marcados. La clase apartamentos está influenciada en gran medida por el piso en el que se ubican, mientras que la clase casa muestra una mayor relación con las habitaciones, área construida y baños. Otras variables como parqueaderos y precio no están claramente asociadas con una clase particular, ya que sus vectores se posicionan en el límite entre las dos clases. Esto indica que estas variables tienen una influencia más difusa y no se agrupan claramente en torno a una categoría específica.

Para la segunda gráfica, se realizó análisis teniendo en cuenta la variable categórica zona.

fviz_pca_biplot(res.pca, 
                repel = TRUE,
                habillage = vivienda$zona,
                col.var = "#034A94", # Variables color
                col.ind = c("#DEDEDE", "#034A94"),  # Individuals color
                geom = c("point")
)

El análisis revela que la zona sur tiene la mayor cantidad de viviendas ofertadas, con una distribución en forma de “U” y una alta correlación con la mayoría de las variables. La zona norte muestra una distribución similar pero con mayor dispersión y menos viviendas. La zona oeste se concentra en el cuadrante inferior izquierdo, destacándose por su relación significativa con las variables de parqueaderos y precio. En contraste, las zonas oriente y centro presentan la menor concurrencia y están fuertemente influenciadas por la variable de habitaciones.

Para la tercera gráfica, se realizó análisis teniendo en cuenta la variable categórica estrato.

fviz_pca_biplot(res.pca, 
                repel = TRUE,
                habillage = vivienda$estrato,
                col.var = "#034A94", # Variables color
                col.ind = c("#DEDEDE", "#034A94"),  # Individuals color
                geom = c("point")
)

Se observa que el agrupamiento de los individuos según el estrato es más pronunciado, con una disposición ordenada a lo largo de las dimensiones 1 y 2. Comenzando con el estrato 3 en la parte superior derecha, la distribución avanza hasta el estrato 6 en el cuadrante inferior izquierdo. Además, a medida que se desciende por los estratos, la dispersión de los individuos en sus componentes aumenta notablemente.

4.3.2. Análisis de Conglomerados

Para determinar el número óptimo de clústeres se utilizó la función fviz_nbclust con el método WSS (Within-Cluster Sum of Squares). Este método mide la suma de las distancias cuadradas entre cada punto y el centroide de su clúster, ayudando a evaluar la calidad de la partición.

La función fviz_nbclust grafica el WSS para diferentes números de clústeres, permitiendo identificar el “codo” en la gráfica. Este punto indica el número óptimo de clústeres al equilibrar la variabilidad interna y la complejidad del modelo.

El gráfico obtenido es el siguiente:

fviz_nbclust(vivienda_numZ, kmeans, method = "wss")

Como se observa, el punto de inflexión se alcanza aproximadamente con dos o cuatro agrupaciones, ya que a partir de estos números no se nota una reducción significativa en el WSS. Para validar esta elección, se utilizó el método de Silhouette, que evalúa la calidad de la partición en grupos. El coeficiente de Silhouette proporciona una medida adicional de cuán bien se ajustan los puntos a sus agrupaciones y si están claramente separados de los demás grupos. Este análisis ayuda a corroborar la selección del número óptimo de agrupaciones y a asegurar que los grupos formados sean interpretables y útiles.

fviz_nbclust(vivienda_numZ, kmeans, method = "silhouette")

A partir del gráfico, es evidente que el número óptimo de clústeres es 2, ya que para valores mayores, el coeficiente de Silhouette muestra una disminución significativa. No obstante, para realizar una comparación más exhaustiva, se llevará a cabo el análisis para 2 y 4 clústeres, que son los dos números que obtuvieron las mejores puntuaciones.

- Análisis con 2 clústeres: Se aplicó el método k-means con dos centroides, conforme a los resultados previos. Los resultados se graficaron en el espacio de componentes principales (PCA) para facilitar la visualización y la identificación de los mismos.

set.seed(2024)
kmeans_2 = kmeans(vivienda_numZ, centers = 2)
fviz_pca_biplot(res.pca, 
                 repel = TRUE,
                 habillage = as.factor(kmeans_2$cluster),
                 col.var = "#034A94",
                 geom = c("point"),
                 addEllipses = TRUE
)

En la gráfica anterior, se distinguen claramente los dos agrupamientos generados por el modelo:

  • El primer grupo, representado en color rosado, se concentra en la parte izquierda de la gráfica. Este grupo muestra una mayor dispersión de sus individuos y está influenciado principalmente por las variables de habitaciones, área construida, baños, parqueaderos y precio.
  • El segundo grupo, ubicado en la parte derecha de la gráfica, presenta una distribución más compacta y está influenciado únicamente por la variable de piso.

Se procedió a realizar un análisis descriptivo de cada grupo:

vivienda_k2 = vivienda
vivienda_k2$cluster = as.factor(kmeans_2$cluster)
Estadisticas_por_grupo = describeBy(vivienda_k2[,c(3,5,6,7,8,9)], mat =  TRUE, group = vivienda_k2$cluster, digits= 1)
kable(Estadisticas_por_grupo) %>% kable_styling(full_width = TRUE)
item group1 vars n mean sd median trimmed mad min max range skew kurtosis se
piso1 1 1 1 2380 2.8 1.9 2 2.5 0.0 1 12 11 2.3 6.2 0.0
piso2 2 2 1 5839 3.9 2.4 4 3.6 1.5 1 12 11 1.3 1.7 0.0
preciom1 3 1 2 2380 774.5 372.8 690 734.6 343.2 150 1999 1849 0.9 0.3 7.6
preciom2 4 2 2 5839 287.7 142.5 260 271.5 133.4 58 1200 1142 1.1 1.7 1.9
areaconst1 5 1 3 2380 332.6 166.9 300 309.0 118.6 50 1745 1695 2.5 10.9 3.4
areaconst2 6 2 3 5839 110.7 57.0 94 101.4 43.0 40 624 584 1.9 5.9 0.7
parqueaderos1 7 1 4 2380 2.7 1.4 2 2.5 1.5 1 10 9 1.6 3.9 0.0
parqueaderos2 8 2 4 5839 1.3 0.5 1 1.3 0.0 1 4 3 1.1 0.4 0.0
banios1 9 1 5 2380 4.7 1.2 5 4.7 1.5 0 10 10 0.7 2.1 0.0
banios2 10 2 5 5839 2.4 0.8 2 2.4 1.5 0 5 5 0.4 0.2 0.0
habitaciones1 11 1 6 2380 4.9 1.7 4 4.7 1.5 0 10 10 1.0 0.7 0.0
habitaciones2 12 2 6 5839 3.1 0.9 3 3.0 0.0 0 9 9 0.9 5.6 0.0

Desde una perspectiva general, el clúster 1 contiene 2380 individuos, mientras que el clúster 2 tiene más del doble, con 5839 individuos. Además, la distribución de todas las variables en ambos grupos muestra características similares en términos de forma, ya que ambas son leptocúrticas y presentan asimetrías a la derecha. A continuación, se presenta una comparación específica de cada variable en términos de sus características cuantitativas.

  • Piso: Ambos grupos abarcan el mismo rango de pisos. No obstante, el clúster 2 presenta viviendas ubicadas en pisos más altos, con una mediana que es el doble de la del clúster 1. Sin embargo, el clúster 2 también muestra una mayor desviación estándar en esta variable.
  • Precio: El rango de precios es significativamente mayor en el clúster 1, con una mediana que supera en más del doble a la del clúster 2. Esta diferencia se refleja también en una mayor desviación estándar en el clúster 1.
  • Área construida: En el clúster 1, el rango, la mediana y la desviación estándar del área construida son aproximadamente tres veces mayores que en el clúster 2.
  • Parqueaderos: El clúster 1 muestra un rango de parqueaderos tres veces mayor. De acuerdo con la mediana, cada vivienda en este clúster tiene en promedio dos parqueaderos, frente a uno en el clúster 2. Es más probable encontrar viviendas en el clúster 1 con un número significativamente mayor de parqueaderos.
  • Baños: El rango de número de baños en el clúster 1 es el doble que en el clúster 2. La mediana indica que, las viviendas en el clúster 1 tienen cinco baños normalmente, mientras que en el clúster 2 tienen dos.
  • Habitaciones: Ambos clústeres presentan rangos similares en cuanto al número de habitaciones. Sin embargo, la mediana muestra que el clúster 1 tiene una habitación más por vivienda en comparación con el clúster 2, lo que sugiere una mayor probabilidad de encontrar viviendas con más habitaciones en el clúster 1.

Por otro lado, se examinó la distribución de los clústeres en relación con su posición geográfica y su estrato. En cuanto a la primera, se observó lo siguiente:

par(mfrow = c(1, 2)) 

ggplot(vivienda_k2, aes(x = longitud, y = latitud, color = cluster)) +
  geom_point() +
  labs(title = "Mapa de Clusters", x = "Longitud", y = "Latitud", color = "Cluster") +
  theme_minimal()

ggplot(vivienda_k2, aes(x = zona, fill = cluster)) +
  geom_bar() +
  labs(title = "Distribución de viviendas por zona y cluster", color = "Cluster") +
  theme_minimal()

Se evidencia una mayor presencia de individuos asociados al clúster 2, con una concentración significativa en las zonas sur, norte y oeste. En contraste, el clúster 1 mantiene una distribución similar pero con un número de individuos notablemente menor, resultando en una menor concentración. La zona centro presenta la menor participación, con una proporción equitativa de individuos en todos los clústeres.

Para la distribución de los clústeres respecto al estrato se encontró lo siguiente:

ggplot(vivienda_k2, aes(x = estrato, fill = cluster)) +
  geom_bar() +
  labs(title = "Distribución de viviendas por estrato y cluster", color = "Cluster") +
  theme_minimal()

Desde el estrato 3 al 5, la proporción de los clústeres es similar, siendo predominante el clúster 2. Sin embargo, en el estrato 6, la relación se invierte, con el clúster 1 alcanzando la mayor participación.

Finalmente, se construyó una gráfica de dispersión que relaciona el precio con el área construida, utilizando diferentes colores para representar los clústeres generados. Esta visualización tiene el objetivo de complementar el análisis de estas dos variables clave en la oferta de una vivienda.

ggplot(vivienda_k2, aes(x = areaconst, y = preciom, color = cluster)) +
  geom_point(alpha = 0.5) +
  labs(title = "Distribución de Precio/m² por Cluster", x = "Area construida (m²)", y = "Precio (MM)") +
  theme_minimal()

En la gráfica se observa claramente la presencia de dos grupos diferenciados, con una ligera dispersión en el límite que los separa. Para el clúster 2, las áreas construidas se concentran en un rango de hasta 250 \(m^{2}\) , con precios que alcanzan hasta 750 MM, mostrando una alta concentración de individuos en este segmento. En contraste, el clúster 1 presenta áreas construidas principalmente entre 250 y 750 \(m^{2}\), con precios que llegan hasta 1,750 millones, lo que indica una mayor dispersión en esta categoría.

- Análisis con 4 clústeres: Se aplicó el método k-means con cuatro centroides. Los resultados se graficaron en el espacio de componentes principales (PCA) para facilitar la visualización y la identificación de los mismos.

set.seed(2026)
kmeans_4 = kmeans(vivienda_numZ, centers = 4)
fviz_pca_biplot(res.pca, 
                 repel = TRUE,
                 habillage = as.factor(kmeans_4$cluster),
                 col.var = "#034A94",
                 geom = c("point"),
                 addEllipses = TRUE 
)

En la gráfica anterior, se distinguen claramente los cuatro agrupamientos generados por el modelo.

  • El primer grupo, representado en color rosado, se concentra en el cuadrante superior derecho. Este grupo presenta una baja dispersión y no está claramente asociado con ninguna variable específica.
  • El segundo grupo, mostrado en color verde, se encuentra en la parte superior izquierda. Exhibe una dispersión media y está influenciado principalmente por la variable de habitaciones.
  • El tercer grupo, indicado en color azul, se localiza en el cuadrante izquierdo, mayoritariamente en la sección inferior. Este grupo muestra una alta dispersión y está influenciado por las variables de área construida, baños, parqueaderos y precio.
  • El cuarto grupo, representado en color violeta, se encuentra en la parte inferior derecha. Este grupo presenta una dispersión media y está fuertemente correlacionado con la variable de piso.

Se procedió a realizar un análisis descriptivo de cada grupo:

vivienda_k4 = vivienda
vivienda_k4$cluster = as.factor(kmeans_4$cluster)
Estadisticas_por_grupo <- describeBy(vivienda_k4[,c(3,5,6,7,8,9)], mat =  TRUE, group = vivienda_k4$cluster, digits = 1)
kable(Estadisticas_por_grupo) %>% kable_styling(full_width = TRUE)
item group1 vars n mean sd median trimmed mad min max range skew kurtosis se
piso1 1 1 1 4148 3.2 1.4 3 3.2 1.5 1 6 5 -0.1 -1.1 0.0
piso2 2 2 1 2272 2.5 1.1 2 2.4 0.0 1 8 7 1.1 1.0 0.0
piso3 3 3 1 879 3.0 2.1 2 2.6 0.0 1 12 11 2.0 3.9 0.1
piso4 4 4 1 920 8.4 1.8 8 8.4 1.5 5 12 7 0.3 -0.8 0.1
preciom1 5 1 2 4148 248.3 116.0 230 236.1 117.9 58 1200 1142 1.2 2.6 1.8
preciom2 6 2 2 2272 509.1 186.0 480 495.4 177.9 127 1200 1073 0.7 0.1 3.9
preciom3 7 3 2 879 1113.3 349.2 1100 1102.1 370.6 190 1999 1809 0.2 -0.5 11.8
preciom4 8 4 2 920 388.8 222.3 320 354.5 140.8 125 1500 1375 1.7 3.5 7.3
areaconst1 9 1 3 4148 96.5 45.8 86 89.1 35.6 40 624 584 2.8 14.7 0.7
areaconst2 10 2 3 2272 244.3 97.7 226 233.9 97.1 70 870 800 1.0 1.3 2.1
areaconst3 11 3 3 879 430.2 208.8 380 397.4 142.3 50 1745 1695 2.1 6.7 7.0
areaconst4 12 4 3 920 113.5 54.0 98 105.2 38.5 45 660 615 2.4 12.8 1.8
parqueaderos1 13 1 4 4148 1.2 0.4 1 1.2 0.0 1 4 3 1.6 1.7 0.0
parqueaderos2 14 2 4 2272 1.8 0.7 2 1.8 0.0 1 5 4 0.7 0.9 0.0
parqueaderos3 15 3 4 879 3.8 1.5 4 3.7 1.5 1 10 9 1.2 2.6 0.1
parqueaderos4 16 4 4 920 1.5 0.6 1 1.5 0.0 1 4 3 0.8 0.7 0.0
banios1 17 1 5 4148 2.2 0.7 2 2.2 0.0 0 4 4 0.0 0.4 0.0
banios2 18 2 5 2272 4.1 1.1 4 4.1 1.5 0 10 10 0.8 2.9 0.0
banios3 19 3 5 879 5.2 1.4 5 5.1 1.5 0 10 10 0.2 1.5 0.0
banios4 20 4 5 920 2.8 0.9 3 2.6 1.5 0 10 10 1.3 3.6 0.0
habitaciones1 21 1 6 4148 2.9 0.7 3 2.9 0.0 0 7 7 -0.6 4.0 0.0
habitaciones2 22 2 6 2272 4.8 1.6 4 4.6 1.5 0 10 10 1.1 0.8 0.0
habitaciones3 23 3 6 879 4.5 1.6 4 4.3 1.5 0 10 10 1.3 2.5 0.1
habitaciones4 24 4 6 920 2.9 0.7 3 2.9 0.0 0 6 6 -0.5 3.4 0.0

Desde una perspectiva general, el clúster 1 contiene el 50% de los inviduos con 4148, el cluster 2 el 27 % con 2272, y el cluster 3 y 4 el 23% restante con 1799 individuos en total. A continuación, se presenta una comparación específica de cada variable en términos de sus características cuantitativas.

  • Piso: El clúster 4 tiene la mediana más alta de pisos, con un valor de 8, seguido por el clúster 1 con una mediana de 3. Ambos grupos muestran una distribución leptocúrtica. Los grupos restantes tienen una mediana de 2 y presentan asimetría hacia la derecha.
  • Precio: Todos los grupos muestran distribuciones asimétricas hacia la derecha y comportamientos leptocúrticos, excepto el clúster 3, que presenta una distribución platicúrtica. El clúster 3 tiene los precios más altos de vivienda, seguido por el clúster 2 y el clúster 4, con el clúster 1 en el rango más bajo.
  • Área construida: Las distribuciones de todos los grupos son asimétricas hacia la derecha con comportamientos leptocúrticos. El orden de las viviendas en términos de área construida sigue el mismo patrón que el observado en los precios, lo que se explica por la alta correlación entre estas dos variables.
  • Parqueaderos: El clúster 3 tiene la mediana más alta de parqueaderos, con un valor de 4, seguido por el clúster 2 con 2 parqueaderos. Los grupos 1 y 4 tienen una mediana de 1 parqueadero. Todos los grupos muestran distribuciones leptocúrticas con asimetría hacia la derecha.
  • Baños: La distribución de los baños en todos los grupos es asimétrica hacia la derecha con comportamientos leptocúrticos. El clúster 3 tiene la mediana más alta de baños, con un valor de 5, seguido por los clústeres 2 y 4, mientras que el clúster 1 tiene la mediana más baja.
  • Habitaciones: Los clústeres 2 y 3 tienen la mediana más alta en el número de habitaciones, con un valor de 4, y muestran distribuciones asimétricas hacia la derecha. Los clústeres 1 y 4 presentan asimetría hacia la izquierda en sus distribuciones. Todos los grupos muestran un comportamiento leptocúrtico.

Por otro lado, se examinó la distribución de los clústeres en relación con su posición geográfica y su estrato. En cuanto a la primera, se observó lo siguiente:

par(mfrow = c(1, 2), mar = c(2, 2, 2, 1)) 

ggplot(vivienda_k4, aes(x = longitud, y = latitud, color = cluster)) +
  geom_point() +
  labs(title = "Mapa de Clusters", x = "Longitud", y = "Latitud", color = "Cluster") +
  theme_minimal()

ggplot(vivienda_k4, aes(x = zona, fill = cluster)) +
  geom_bar() +
  labs(title = "Distribución de viviendas por zona y cluster", color = "Cluster") +
  theme_minimal()

Se evidencia una mayor presencia de individuos asociados al clúster 1, con una concentración significativa en las zonas sur, norte y oeste. En segundo lugar, se posiciona el clúster 2, con una distribución similar a la del clúster 1, pero en menor proporción. Los clústeres 3 y 4 presentan cantidades similares de individuos, con el clúster 3 mostrando una proporción constante en las zonas norte, oeste y sur, mientras que el clúster 4 tiene una mayor concentración en la zona sur. Las zonas centro y oriente están representadas únicamente por los clústeres 1 y 2.

Para la distribución de los clústeres respecto al estrato se encontró lo siguiente:

ggplot(vivienda_k4, aes(x = estrato, fill = cluster)) +
  geom_bar() +
  labs(title = "Distribución de viviendas por estrato y cluster", color = "Cluster") +
  theme_minimal()

El estrato 3 está principalmente representado por los clústeres 1 y 3. En los estratos 4 y 5, se mantiene la proporción de viviendas por cada clúster, destacando los clústeres 1 y 2 con mayor presencia. En el estrato 6, aumenta notablemente la presencia del clúster 3, teniendo una proporción igual con el cluster 2.

ggplot(vivienda_k4, aes(x = areaconst, y = preciom, color = cluster)) +
  geom_point(alpha = 0.5) +
  labs(title = "Distribución de Precio/m² por Cluster", x = "Area construida (m²)", y = "Precio (MM)") +
  theme_minimal()

En la gráfica, a diferencia del análisis con K-means y 2 centroides, no se observa claramente la presencia de los cuatro grupos, ya que el clúster 4 se encuentra distribuido entre los demás, lo que dificulta su visualización. En el clúster 1 se agrupan las viviendas con las áreas más pequeñas, de hasta 200 \(m^{2}\) y precios máximos de 500 MM, con una dispersión muy baja. El clúster 2 actúa como un puente entre las agrupaciones, con áreas que oscilan entre 200 y 450 \(m^{2}\) y precios entre 200 y 850 MM, mostrando una dispersión media. Finalmente, el clúster 3 incluye las áreas y precios más altos, con áreas entre 200 y 750 \(m^{2}\) y precios entre 500 y 1750 MM, presentando una alta dispersión.

4.3.3. Análisis de Correspondencia

El Análisis de Correspondencia Múltiple (MCA) se aplica a variables cualitativas con el objetivo de identificar posibles asociaciones. Por ello, se filtró inicialmente el conjunto de datos vivienda para incluir únicamente las variables zona (2), estrato (4) y tipo (10).

vivienda_chr = vivienda[,c(2,4,10)]
kable(head(vivienda_chr))
zona estrato tipo
Zona Oriente 3 Casa
Zona Oriente 3 Casa
Zona Sur 4 Casa
Zona Norte 5 Apartamento
Zona Norte 5 Apartamento
Zona Norte 4 Apartamento

Para verificar la independencia de las tres variables analizadas, se realizó una prueba de hipótesis para cada uno de los tres tipos de relación que se pueden dar entre las variables, utilizando el estadístico de prueba Chi-cuadrado. Los resultados obtenidos son los siguientes:

tabla1 = table(vivienda_chr$zona,vivienda_chr$estrato)
tabla2 = table(vivienda_chr$zona,vivienda_chr$tipo)
tabla3 = table(vivienda_chr$estrato,vivienda_chr$tipo)
chisq.test(tabla1)
## 
##  Pearson's Chi-squared test
## 
## data:  tabla1
## X-squared = 3849.1, df = 12, p-value < 2.2e-16
chisq.test(tabla2)
## 
##  Pearson's Chi-squared test
## 
## data:  tabla2
## X-squared = 683.46, df = 4, p-value < 2.2e-16
chisq.test(tabla3)
## 
##  Pearson's Chi-squared test
## 
## data:  tabla3
## X-squared = 214.52, df = 3, p-value < 2.2e-16

Como se observa, el valor p para cada una de las pruebas realizadas es extremadamente pequeño (2.2e-16). Esto indica que hay evidencia estadísticamente significativa para rechazar la hipótesis nula en cada caso. En consecuencia, se confirma la existencia de una dependencia entre las variables analizadas, sugiriendo que las variables zona, estrato y tipo están asociadas entre sí y no son independientes. Esta dependencia sugiere que el análisis de correspondencia múltiple puede revelar patrones o estructuras relevantes en los datos, proporcionando una comprensión más profunda de las relaciones entre estas variables cualitativas.

Se realizó el Análisis de Correspondencia Múltiple utilizando la función MCA().

resultados_mca = MCA(vivienda_chr, graph = FALSE)

Para visualizar la correlación entre variables y las dimensiones principales de ACM:

fviz_mca_var(resultados_mca, choice = "mca.cor")

Esta gráfica facilita la identificación de las variables que tienen una mayor correlación con cada dimensión y revela sus interrelaciones. En particular, la variable zona muestra la mayor correlación tanto con la Dimensión 1 como con la Dimensión 2, seguida de cerca por la variable estrato. Ambas variables se encuentran cercanas entre sí en el gráfico, indicando una asociación significativa. En contraste, la variable tipo no presenta una alta correlación con las dimensiones ni con las otras variables, sugiriendo una relación más débil en el contexto del análisis.

Además, se generó un mapa de categorías que visualiza la distribución y las relaciones entre las diferentes categorías en el espacio de dimensiones. Este mapa proporciona una representación clara de cómo se agrupan y se relacionan las categorías.

fviz_mca_var(resultados_mca, repel = TRUE, col.var = "blue", shape.var = 16)

De acuerdo con el gráfico, las categorías Zona Oeste y Estrato 6 muestran un perfil similar. Por lo tanto, es probable que las viviendas en esta zona correspondan mayoritariamente al Estrato 6, y dado su proximidad con la categoría Apartamento, se espera una mayor proporción de este tipo de vivienda en la zona. Por otro lado, las Zonas Oriente y Centro presentan una fuerte afinidad con el Estrato 3 y el tipo de vivienda Casa. Finalmente, las Zonas Norte y Sur exhiben una mezcla de los Estratos 4 y 5 y tipos de viviendas Apartamento y Casa.

Para medir el grado de representatividad del análisis, se calcularon los valores de la varianza acumulada utilizando los valores propios de la matriz de discrepancias. A partir de estos cálculos, se obtuvo la gráfica que ilustra la distribución de la varianza explicada a lo largo de las dimensiones. Esta gráfica permite visualizar claramente la proporción de variabilidad que cada dimensión captura, facilitando la comprensión de cuántas dimensiones son necesarias para representar adecuadamente los datos.

fviz_screeplot(resultados_mca, addlabels = TRUE)

Los resultados muestran que la primera componente explica el 21.1% de la variabilidad total. Además, los cinco primeros componentes combinados explican el 77.0% de la variabilidad. Esto sugiere que al menos las cinco primeras dimensiones son necesarias para describir adecuadamente el conjunto de datos.

Finalmente, para entender el grado de contribución de cada categoría a las cinco primeras dimensiones, se graficaron los resultados. Esta visualización permite apreciar cómo cada categoría contribuye a las dimensiones principales del análisis.

fviz_contrib(resultados_mca,choice = "var",axes = 1:5)

Como se observa, las categorías Zona Centro y Zona Oriente presentan las mayores contribuciones en las primeras cinco dimensiones del análisis, acumulando aproximadamente el 28.5% del total. Estas categorías son, por lo tanto, las más relevantes para explicar la variabilidad en estas dimensiones. A continuación, los estratos 4 y 3 contribuyen con alrededor del 11% cada uno, y la Zona Oeste aporta un 10%. En conjunto, estas cinco categorías explican el 61.5% de la variabilidad total en el análisis de correspondencia múltiple. Esto indica que estas categorías son clave para entender la estructura subyacente en los datos analizados.

5. Discusiones

5.1. Análisis de Componentes Principales (PCA)

El Análisis de Componentes Principales (PCA) aplicado al conjunto de datos vivienda permitió una simplificación profunda y una comprensión detallada de la variabilidad en las características de las propiedades. Este método resumió efectivamente el conjunto de datos en dos componentes principales que explicaron en conjunto el 73.3% de la variabilidad total, demostrando la eficacia del PCA en la reducción dimensional y la extracción de información clave.

El primer componente principal (CP1), que explicó el 54.6% de la variabilidad, demostró ser el más significativo. La alta contribución de las variables área construida, baños, precio y parqueaderos reveló una estrecha interrelación entre estas características. Se espera que las propiedades con mayor área construida cuenten con un mayor número de baños y parqueaderos, lo que a su vez incrementa su precio de venta. En contraste, el segundo componente principal (CP2), que contribuyó con un 18.7% de la variabilidad, ofreció una perspectiva adicional al destacar la relación inversa entre el número de pisos y el número de habitaciones. En contextos urbanos, esto se explica por el hecho de que, generalmente, a medida que los inmuebles se ubicaban en pisos más altos, su tamaño tiende a disminuir, lo que lleva a una reducción en el número de habitaciones.

El análisis también mostró que la variable categórica tipo generó dos grupos distintivos: apartamentos y casas. Los apartamentos tienden a estar ubicados en pisos superiores, mientras que las casas estan asociadas con áreas construidas más grandes y, por ende, con un mayor número de habitaciones y baños. En cuanto a la variable zona, el análisis reveló una alta densidad de viviendas en la zona sur, que se correlaciona con la mayoría de las variables. Esto se explicó por una mayor concentración de desarrollos inmobiliarios en esta área, lo que refleja una oferta inmobiliaria más extensa. Además, el patrón observado en los estratos, con una distribución ordenada a lo largo de las dimensiones principales del PCA, sugiere una jerarquía en la calidad o el valor de las propiedades según el estrato. Este patrón resaltó la relevancia del análisis estratificado para entender cómo diferentes segmentos del mercado inmobiliario estan representados en el conjunto de datos.

5.2. Análisis de Conglomerados

El análisis de conglomerados, realizado con el método k-means y evaluado mediante la suma de cuadrados dentro de los clústeres (WSS), sugirió que el número óptimo de clústeres se encontraba entre dos y cuatro. La elección final de dos clústeres, confirmada por el coeficiente de Silhouette, resultó ser la más efectiva para capturar la variabilidad en los datos.

En el análisis con dos clústeres, se identificaron dos grupos diferenciados. El primer clúster, con propiedades de mayor área construida, precios elevados y un mayor número de baños, habitaciones y parqueaderos, representa el segmento de mayor valor y tamaño. En contraste, el segundo clúster agrupa propiedades en pisos superiores con menor área construida, mostrando características más compactas y menos costosas. Geográficamente, el clúster 1 se concentró en las zonas sur, norte y oeste, mientras que el clúster 2 tuvo una distribución más dispersa. En términos de estratos, el clúster 1 predominó en estratos altos, mientras que el clúster 2 se destacó en los estratos 3 a 5.

El análisis con cuatro clústeres, aunque proporcionó una mayor resolución, mostró una complejidad añadida sin una mejora significativa en la interpretación. Los cuatro grupos revelaron patrones distintos de dispersión: el primer clúster mostró baja dispersión sin asociación clara con variables específicas; el segundo clúster, con dispersión media, estuvo influenciado por el número de habitaciones; el tercer clúster, con alta dispersión, se relacionó con área construida, parqueaderos, baños y precio; y el cuarto clúster mostró dispersión media, correlacionándose principalmente con la variable de piso. Desde una perspectiva geográfica, el clúster 1 se concentró en las zonas sur, norte y oeste, el clúster 2 mostró una distribución similar pero en menor proporción, el clúster 3 mantuvo una proporción constante en zonas norte, oeste y sur, y el clúster 4 tuvo una mayor concentración en la zona sur. En términos de estratos, el clúster 1 predominó en los estratos 3 a 5, mientras que el cluster 3 en el estrato 6.

5.3. Análisis de Correspondencia

El Análisis de Correspondencia Múltiple (MCA) se aplicó para examinar las asociaciones entre las variables cualitativas zona, estrato y tipo en el conjunto de datos de viviendas. La prueba de independencia con el estadístico Chi-cuadrado reveló valores p extremadamente bajos (2.2e-16), lo que confirma la existencia de dependencias significativas entre estas variables. Esto sugiere que las variables zona, estrato y tipo están interrelacionadas y que el MCA es adecuado para identificar patrones en los datos.

En el análisis, se observó que la variable zona mostró una fuerte correlación con las primeras dimensiones del MCA, destacándose como un factor principal en la explicación de las relaciones entre las variables. La variable estrato también presentó una asociación notable, aunque menor en comparación con zona. Por su parte, la variable tipo mostró una influencia relativamente débil, indicando que su relación con las demás variables es menos significativa.

Tambien se reveló que las categorías de zona y estrato están asociadas de manera particular, lo que sugiere patrones claros en la distribución de viviendas según estas variables. Por ejemplo, ciertas zonas tienden a estar asociadas con estratos específicos, y estas asociaciones afectan el tipo de vivienda predominante en cada área.

La contribución de las categorías al análisis muestra que las variables zona y estrato son cruciales para explicar la variabilidad en los datos. En particular, las categorías de Zona Centro y Zona Oriente tienen una contribución destacada, acumulando aproximadamente el 28.5% de la variabilidad total en las primeras cinco dimensiones del análisis. Estas zonas están asociadas principalmente con el Estrato 3 y el tipo de vivienda Casa. Además, los Estratos 4 y 5 también juegan un papel significativo, con cada uno contribuyendo alrededor del 11% a la variabilidad explicada. La Zona Oeste aporta un 10% adicional. En conjunto, estas categorías explican aproximadamente el 61.5% de la variabilidad total, lo que resalta su importancia en la estructura de los datos y en la comprensión de las asociaciones entre las variables cualitativas analizadas.

6. Conclusiones

  • El PCA ha demostrado ser una herramienta eficaz para simplificar la complejidad del conjunto de datos de viviendas, resaltando las características clave que definen el mercado inmobiliario. La reducción dimensional facilitó una comprensión más clara de cómo las propiedades se agrupan en función de su área construida, precio, y otras características importantes. La identificación de patrones y relaciones entre estas variables permite una mejor interpretación de la estructura del mercado, haciendo que el análisis sea más accesible para la toma de decisiones estratégicas en el desarrollo y evaluación de propiedades.
  • La segmentación en dos clústeres resalta la diferencia fundamental en el mercado entre propiedades de alto y bajo valor. Este enfoque proporciona una visión clara de cómo las propiedades se agrupan según su tamaño, precio y características, permitiendo una identificación precisa de segmentos de mercado. Aunque la adición de más clústeres ofrece detalles adicionales, no mejora significativamente la interpretación general. Por lo tanto, para fines prácticos, la división en dos clústeres es suficiente para entender las principales agrupaciones y diferencias en el mercado.
  • El MCA ha confirmado que las variables zona y estrato son determinantes cruciales en la distribución de propiedades. Las asociaciones identificadas entre zonas específicas y estratos revelan patrones claros en el mercado inmobiliario, como la predominancia de ciertos tipos de viviendas en áreas particulares. Esta información es vital para orientar estrategias de marketing y desarrollo inmobiliario, ya que indica que el conocimiento de la ubicación y el estrato de una propiedad puede predecir con alta precisión su tipo y características predominantes.

7. Recomendaciones

  • Se recomienda que las estrategias de marketing se ajusten para dirigirse de manera más eficaz a los segmentos de propiedades que presentan estas características destacadas. En términos de desarrollo inmobiliario, sería beneficioso considerar ajustes en el diseño de las propiedades, especialmente en unidades ubicadas en pisos más altos, para satisfacer mejor las tendencias observadas en el tamaño y la distribución de las habitaciones. Además, enfocar las evaluaciones de propiedades en las variables más influyentes permitirá una valoración más precisa y alineada con las demandas del mercado.
  • Para el grupo con propiedades de mayor tamaño y precio elevado, se sugiere implementar estrategias de venta premium que resalten el valor y las características exclusivas de estas propiedades. Por otro lado, para el grupo con propiedades más compactas y accesibles, se debe enfocar en estrategias de precios competitivos y en ofertas que apunten a un segmento de mercado más amplio. Además, se recomienda ajustar las decisiones de inversión y desarrollo inmobiliario teniendo en cuenta la concentración geográfica de los clústeres para maximizar el impacto y la relevancia en las áreas más prometedoras.