Problema: Evaluación de la oferta inmobiliaria urbana

Una empresa inmobiliaria líder en una gran ciudad busca comprender de manera profunda la dinámica del mercado de viviendas urbanas con el fin de fortalecer su proceso de toma de decisiones estratégicas. Para ello, dispone de una base de datos amplia que contiene información detallada sobre propiedades residenciales, incluyendo variables estructurales (área, número de habitaciones, baños), económicas (precio), geográficas (zona, barrio) y socioeconómicas (estrato).

En este contexto, se plantea la necesidad de desarrollar un análisis estadístico integral que permita identificar patrones, relaciones significativas y segmentaciones dentro del mercado inmobiliario. El propósito es generar evidencia cuantitativa que respalde decisiones relacionadas con la compra, venta, valoración y posicionamiento estratégico de los inmuebles.

Para abordar este problema, el estudio contemplara las siguientes etapas de análisis:

  1. Análisis Bivariado

En primera instancia, se realizará un análisis bivariado con el objetivo de explorar la relación entre pares de variables relevantes del estudio. Este análisis permitirá:

  • Evaluar la asociación entre variables numéricas (por ejemplo, precio y área construida) mediante coeficientes de correlación y gráficos de dispersión.

  • Analizar diferencias en variables numéricas según categorías (por ejemplo, precio según estrato o zona) utilizando comparaciones de medias y visualizaciones como boxplots.

  • Examinar la relación entre variables categóricas (por ejemplo, tipo de vivienda y estrato) mediante tablas de contingencia y pruebas de independencia.

Esta etapa permitirá identificar relaciones preliminares que orienten los análisis multivariantes posteriores.

  1. Análisis de Componentes Principales (ACP)

Se aplicará el Análisis de Componentes Principales con el fin de reducir la dimensionalidad del conjunto de datos, sintetizando la información contenida en múltiples variables numéricas en un número reducido de componentes. Esto permitirá identificar los factores estructurales que explican la mayor variabilidad en los precios y en las características de las propiedades.

  1. Análisis de Conglomerados

A través de técnicas de agrupamiento, se segmentarán las propiedades residenciales en clústeres homogéneos según sus características físicas, económicas y geográficas. Este análisis permitirá identificar perfiles diferenciados de vivienda y comprender las dinámicas específicas de oferta en distintos segmentos del mercado.

  1. Análisis de Correspondencia

Finalmente, se realizará un análisis de correspondencia para examinar la relación entre variables categóricas como tipo de vivienda, zona y estrato. Esta técnica permitirá visualizar patrones de asociación y estructuras de dependencia dentro del mercado inmobiliario, aportando una perspectiva complementaria al análisis numérico.

Datos

Los datos son tomados de OLX mediante procedimiento webscraping y contenidos en paqueteMOD. La información corresponde a viviendas urbanas ofertadas en Colombia, específicamente en la ciudad de Cali, lo cual delimita el alcance geográfico del análisis y contextualiza los resultados dentro del mercado inmobiliario local.

El conjunto de datos está compuesto por 8.322 observaciones y 13 variables. En la Tabla I se presenta la descripción detallada de cada una de las variables incluidas en el estudio:

Tabla I. Variables y descripción de las variables
Variable Descripcion Clasificacion
Id Identificador de la vivienda Cualitativa nominal
zona Zona donde se encuentra la vivienda Cualitativa nominal (categórica)
piso Cantidad de pisos de la vivienda Cuantitativa discreta
estrato Estrato donde se encuentra ubicada la vivienda Cualitativa ordinal (categórica)
preciom Precio de la vivienda Cuantitativa continua
areaconst Área construida de la vivienda Cuantitativa continua
parqueaderos Número de parqueaderos de la vivienda Cuantitativa discreta
banios Número de baños de la vivienda Cuantitativa discreta
habitaciones Número de habitaciones de la vivienda Cuantitativa discreta
tipo Tipo de vivienda: Casa, Apto, etc. Cualitativa nominal (categórica)
barrio Barrio donde se ubica la vivienda Cualitativa nominal (categórica)
longitud Longitud de la vivienda: Este (+) / Oeste (-) Cuantitativa continua
latitud Latitud de la vivienda: Norte (+) /Sur (-) Cuantitativa continua

Exploración y procesamiento de los datos

1. Validación del formato de variables Cualitativas (String)

Encontramos que la variable zona se encuentra homologada:

## [1] "Zona Oriente" "Zona Sur"     "Zona Norte"   "Zona Oeste"   "Zona Centro" 
## [6] NA

Lo mismo ocurre con la variable tipo de vivienda:

## [1] "Casa"        "Apartamento" NA

Por el contrario, la variable barrio requirió un proceso detallado de estandarización, ya que presentaba inconsistencias en su escritura, tales como diferencias en el uso de mayúsculas, espacios adicionales, tildes y variaciones en la forma de escribir un mismo sector. Tras aplicar las etapas de limpieza (incluyendo normalización de texto, corrección de caracteres especiales y ajustes puntuales en casos irregulares) se logró reducir los niveles de esta variable de 437 valores únicos a 356, obteniendo así una categorización más homogénea y adecuada para el análisis.

Conteo antes del procesamiento

length(unique(df$barrio))
## [1] 437

Despues del procesamiento

df$barrio <- tolower(df$barrio)  #minusculas
df$barrio <- trimws(df$barrio)  #espacios vacios
df$barrio <- stri_trans_general(df$barrio, "Latin-ASCII") #acentos

df$barrio[df$barrio %in% c("agua blanca", "aguablanca")] <- "agua blanca"
df$barrio[df$barrio %in% c("alf√(C)rez real", "alferez real")] <- "alferez real"
df$barrio[df$barrio %in% c("arboleda", "arboledas")] <- "arboleda"
df$barrio[df$barrio %in% c("base a√(C)rea")] <- "basea aerea"
df$barrio[df$barrio %in% c("cali bella", "calibella")] <- "cali bella"
df$barrio[df$barrio %in% c("cali canto", "calicanto")] <- "cali canto"
df$barrio[df$barrio %in% c("ciudad mel√(C)ndez")] <- "ciudad melendez"
df$barrio[df$barrio %in% c("ciudadela paso ancho")] <- "ciudadela pasoancho"
df$barrio[df$barrio %in% c("el caney")] <- "caney"
df$barrio[df$barrio %in% c("el ingenio 3")] <- "el ingenio iii"
df$barrio[df$barrio %in% c("el tr√(C)bol")] <- "el trebol"
df$barrio[df$barrio %in% c("ingenio")] <- "el ingenio"
df$barrio[df$barrio %in% c("ingenio i")] <- "el ingenio i"
df$barrio[df$barrio %in% c("ingenio ii")] <- "el ingenio ii"
df$barrio[df$barrio %in% c("juanamb√∫")] <- "juanambu"
df$barrio[df$barrio %in% c("la alborada")] <- "alborada"
df$barrio[df$barrio %in% c("la ceibas")] <- "ceibas"
df$barrio[df$barrio %in% c("laflora","norte la flora","urbanizacion la flora")] <- "la flora"
df$barrio[df$barrio %in% c("las am√(C)ricas")] <- "las americas"
df$barrio[df$barrio %in% c("las ceibas")] <- "ceibas"
df$barrio[df$barrio %in% c("los cambulos")] <- "cambulos"
df$barrio[df$barrio %in% c("los alcazares")] <- "alcazares"
df$barrio[df$barrio %in% c("mel√(C)ndez")] <- "melendez"
df$barrio[df$barrio %in% c("pampa linda")] <- "pampalinda"
df$barrio[df$barrio %in% c("ponce")] <- "pance"
df$barrio[df$barrio %in% c("rep√∫blica de israel")] <- "republica de israel"
df$barrio[df$barrio %in% c("sector aguacatal")] <- "aguacatal"
df$barrio[df$barrio %in% c("siete de agosto")] <- "barrio 7de agosto"
df$barrio[df$barrio %in% c("tequendema","urbanizacion tequendama")] <- "tequendama"
df$barrio[df$barrio %in% c("urbanizacion barranquilla")] <- "barranquilla"
df$barrio[df$barrio %in% c("urbanizacion boyaca")] <- "boyaca"
df$barrio[df$barrio %in% c("urbanizacion la merced")] <- "la merced"
df$barrio[df$barrio %in% c("urbanizacion pacara")] <- "pacara"
df$barrio[df$barrio %in% c("urbanizacion lili","valle de lili")] <- "valle del lili"

length(unique(df$barrio))
## [1] 356

2. Validación de datos repetidos

Para garantizar la integridad del conjunto de datos, se verifica si la variable “id” presenta valores duplicados, dado que esta actúa como identificador único de cada vivienda.

# Número de duplicados por ID
duplicados_id <- df %>% 
  group_by(id) %>% 
  filter(n() > 1)

duplicados_id
## # A tibble: 3 × 13
## # Groups:   id [1]
##      id zona  piso  estrato preciom areaconst parqueaderos banios habitaciones
##   <dbl> <chr> <chr>   <dbl>   <dbl>     <dbl>        <dbl>  <dbl>        <dbl>
## 1    NA <NA>  <NA>       NA      NA        NA           NA     NA           NA
## 2    NA <NA>  <NA>       NA      NA        NA           NA     NA           NA
## 3    NA <NA>  <NA>       NA     330        NA           NA     NA           NA
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>

Con ello se identifican tres registros duplicados, los cuales corresponden a observaciones con valores NA en la totalidad de sus campos. Dado que estos registros no aportan información útil para el análisis y podrían generar sesgos o errores en etapas posteriores, se decide filtrarlos de la base de datos antes de continuar con el proceso de modelado.

df1 <- df %>% 
  filter(!is.na(id))

nrow(df1)
## [1] 8319

Con esto quedamos con 8319 registros, eliminando los 3 registros repetidos.

3. Validación de datos atípicos

df1$piso <- as.numeric(df1$piso)

# Vector con los nombres de las variables numericas
vars_numericas <- c("preciom", "areaconst", 
                   "parqueaderos", "banios", 
                   "habitaciones", "longitud", "latitud", "piso")

# Pasar a formato largo solo esas variables
vars_long <- df1 %>% 
  dplyr::select(all_of(vars_numericas)) %>% 
  pivot_longer(cols = everything(),
               names_to = "variable",
               values_to = "valor")

# Boxplots por variable
ggplot(vars_long, aes(x = variable, y = valor)) +
  geom_boxplot(alpha = 0.7, fill = "#4C9AFF", color = "black") +
  facet_wrap(~ variable, scales = "free") +
  theme_minimal(base_size = 12) +
  labs(
    title = "Distribución de variables numéricas",
    x = "Variable",
    y = "Valor"
  ) +
  theme(
    axis.text.x = element_blank(),
    axis.ticks.x = element_blank()
  )
**Figura 1.1**: Boxplot. Identificación de valores atípicos

Figura 1.1: Boxplot. Identificación de valores atípicos

La Figura 1.1 muestra la presencia de valores que visualmente parecen outliers. Sin embargo, es importante destacar que, en este contexto, estos valores no necesariamente representan datos atípicos o erróneos, sino que reflejan la gran variabilidad natural del mercado inmobiliario. Factores como ubicación (barrio, estrato, cercanía a zonas comerciales), tamaño del lote y características constructivas explican plenamente la amplitud de las distribuciones observadas. Lo relevante es que no se identifican valores imposibles, tales como áreas negativas o precios menores a cero. Sin embargo, para verificar de manera más precisa que estos valores extremos realmente pertenecen al comportamiento esperado de las variables y no representan datos atípicos problemáticos, se presenta a continuación una tabla con el resumen de medidas de tendencia central y dispersión, que permite evaluar su coherencia dentro del contexto del mercado:

# Resumen con skimr solo para esas variables
df_resumen <- skim(df1[vars_numericas])

# Filtrar solo numéricas y seleccionar columnas de interés
tabla_resumen <- df_resumen %>% 
  dplyr::filter(skim_type == "numeric") %>% 
  dplyr::select(
    skim_variable, numeric.mean, numeric.sd,
    numeric.p0, numeric.p25, numeric.p50,
    numeric.p75, numeric.p100, n_missing
  )

# Renombrar columnas para presentación
colnames(tabla_resumen) <- c(
  "Variable", "Media", "Desv.Std", "Mínimo",
  "Q1", "Mediana", "Q3", "Máximo", "NAs"
)

# Mostrar tabla bonita
tabla_resumen %>% 
  kable(format = "html", digits = 2,
        caption = "**Tabla II.Resumen estadístico de las variables numéricas**") %>% 
  kable_styling(full_width = FALSE,
                bootstrap_options = c("striped", "hover", "condensed"))
Tabla II.Resumen estadístico de las variables numéricas
Variable Media Desv.Std Mínimo Q1 Mediana Q3 Máximo NAs
preciom 433.90 328.67 58.00 220.00 330.00 540.00 1999.00 0
areaconst 174.93 142.96 30.00 80.00 123.00 229.00 1745.00 0
parqueaderos 1.84 1.12 1.00 1.00 2.00 2.00 10.00 1602
banios 3.11 1.43 0.00 2.00 3.00 4.00 10.00 0
habitaciones 3.61 1.46 0.00 3.00 3.00 4.00 10.00 0
longitud -76.53 0.02 -76.59 -76.54 -76.53 -76.52 -76.46 0
latitud 3.42 0.04 3.33 3.38 3.42 3.45 3.50 0
piso 3.77 2.61 1.00 2.00 3.00 5.00 12.00 2635

El análisis descriptivo de las variables numéricas (Tabla II) evidencia patrones coherentes con el comportamiento esperado del mercado inmobiliario de Cali–Yumbo. La variable preciom presenta una media de 433.9 millones y una amplia dispersión (Desv.Est. = 328.7), lo que refleja la heterogeneidad típica del sector, con propiedades ubicadas en zonas de diferente valorización y características constructivas diversas. Algo similar ocurre con areaconst, cuyo rango oscila entre 30 y 1.745 m², mostrando la coexistencia de viviendas de interés social, apartamentos familiares y propiedades de alta gama.

En cuanto a la distribución interna de los inmuebles, las variables baños y habitaciones presentan medianas de 3, lo cual es coherente con la oferta inmobiliaria. No obstante, se identifica la presencia de algunos registros con valores iguales a 0, lo cual no es consistente con la estructura real de una vivienda habitacional. Estos casos corresponden a errores de registro o valores faltantes mal codificados, por lo que deben considerarse como valores atípicos.

Por su parte, la variable parqueaderos presenta un alto número de valores faltantes (NAs = 1.602), lo cual es común en bases donde esta información no siempre se registra. La variable piso también muestra una distribución amplia (1 a 12), coherente con edificaciones de diferentes alturas, aunque contiene datos faltantes (NAs = 2.635), que deberán manejarse posteriormente.

Las coordenadas geográficas (latitud y longitud) se encuentran dentro del rango esperado para el Valle del Cauca (latitud ≈ 3.4 y longitud ≈ –76.5), confirmando que no existen registros fuera del área de estudio y descartando errores asociados a posiciones erróneas o inversiones de signo.

3. 1 Manejo de variables atípicas:

Dado que los registros con 0 habitaciones y 0 baños representan valores atípicos o inconsistencias en la información, se procede a evaluar cuántos casos presentan estas condiciones en cada una de las variables. Este análisis permite determinar la magnitud del problema y definir las acciones apropiadas para su tratamiento en la etapa de limpieza de datos.

cat("Cantidad de registros con 0 habitaciones: ",
    sum(df1$habitaciones == 0, na.rm = TRUE), "\n")
## Cantidad de registros con 0 habitaciones:  66
cat("Cantidad de registros con 0 baños: ",
    sum(df1$banios == 0, na.rm = TRUE), "\n")
## Cantidad de registros con 0 baños:  45

Los registros con 0 habitaciones representan el 0,7% y los de 0 baños el 0,5%, se considera que su proporción es muy baja. Por ello, se procede a imputar estos valores utilizando la mediana, calculada de manera agrupada por área construida y tipo de vivienda, bajo el supuesto de que estas variables guardan relación con el número de habitaciones y baños. La mediana se elige por ser una medida robusta frente a distribuciones sesgadas, tal como se evidencia en el boxplot (Figura 1.1).

medianas <- df1 %>%
  group_by(areaconst, tipo) %>%
  summarise(
    med_hab = median(habitaciones[habitaciones > 0], na.rm = TRUE),
    med_ban = median(banios[banios > 0], na.rm = TRUE),
    .groups = "drop"
  ) %>%
  mutate(
    # Si la mediana queda NA (grupo sin valores válidos), usar mediana global
    med_hab = if_else(
      is.na(med_hab),
      median(df1$habitaciones[df1$habitaciones > 0], na.rm = TRUE),
      med_hab
    ),
    med_ban = if_else(
      is.na(med_ban),
      median(df1$banios[df1$banios > 0], na.rm = TRUE),
      med_ban
    )
  )

df2 <- df1 %>%
  left_join(medianas, by = c("areaconst", "tipo")) %>%
  mutate(
    habitaciones = if_else(habitaciones == 0, round(med_hab), habitaciones),
    banios       = if_else(banios == 0,       round(med_ban), banios)
  ) %>%
  dplyr::select(-med_hab, -med_ban)  
# Función para calcular resumen
resumen_vars <- function(data, var){
  data %>%
    summarise(
      Media = mean({{var}}, na.rm = TRUE),
      Mediana = median({{var}}, na.rm = TRUE),
      Min = min({{var}}, na.rm = TRUE),
      Max = max({{var}}, na.rm = TRUE),
      Desv = sd({{var}}, na.rm = TRUE),
      IQR = IQR({{var}}, na.rm = TRUE)
    )
}

# Crear los resúmenes antes y después
hab_before <- resumen_vars(df1, habitaciones)
hab_after  <- resumen_vars(df2, habitaciones)

ban_before <- resumen_vars(df1, banios)
ban_after  <- resumen_vars(df2, banios)

# Combinar en una tabla
tabla_resumen <- rbind(
  cbind(Variable = "Habitaciones", Estado = "Antes", hab_before),
  cbind(Variable = "Habitaciones", Estado = "Después", hab_after),
  cbind(Variable = "Baños", Estado = "Antes", ban_before),
  cbind(Variable = "Baños", Estado = "Después", ban_after)
)

# Mostrar tabla bonita
tabla_resumen %>%
  kable(digits = 2, caption = "**Tabla III. Resumen estadístico antes y después de la imputación**") %>%
  kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover", "condensed"))
Tabla III. Resumen estadístico antes y después de la imputación
Variable Estado Media Mediana Min Max Desv IQR
Habitaciones Antes 3.61 3 0 10 1.46 1
Habitaciones Después 3.64 3 1 10 1.43 1
Baños Antes 3.11 3 0 10 1.43 2
Baños Después 3.13 3 1 10 1.42 2

La Tabla III muestra que, tras la imputación, las estadísticas de habitaciones y baños se mantienen prácticamente iguales a las originales. La media cambia solo ligeramente (habitaciones: 3.61→3.64; baños: 3.11→3.13) y la mediana permanece en 3, lo que indica que la tendencia central no fue modificada. El valor mínimo pasa de 0 a 1, corrigiendo registros inválidos sin alterar la variabilidad de las variables, ya que la desviación estándar e IQR prácticamente no cambian.

En síntesis, la imputación corrige valores imposibles sin distorsionar la distribución, preservando la coherencia y estabilidad del conjunto de datos.

4. Tratamiento de valores faltantes

Tal como se observa en la Tabla II, las variables parqueaderos y piso presentan un porcentaje considerable de valores ausentes, correspondiente al 19,6% y 31,7%, respectivamente. Esta ausencia de información no obedece necesariamente a un error del sistema, sino a un comportamiento frecuente en bases inmobiliarias, donde los vendedores omiten registrar estos campos cuando no disponen del dato o cuando consideran que no aplica para la propiedad (por ejemplo, viviendas sin parqueadero o casas que no cuentan con pisos superiores).

Debido al elevado porcentaje de valores faltantes y a la naturaleza poco confiable de la información ausente, se decide no aplicar métodos de imputación. Cualquier estrategia de reemplazo podría introducir sesgos o generar distorsiones en el análisis, dado que no existe evidencia suficiente para estimar estos valores con precisión.

En consecuencia, y con el fin de preservar la integridad del estudio, las variables parqueaderos y piso serán excluidas del análisis multivariante.

df3 <- df2 %>% 
  dplyr::select(-parqueaderos, -piso)

# Número de registros
str(df3)
## tibble [8,319 × 11] (S3: tbl_df/tbl/data.frame)
##  $ id          : num [1:8319] 1147 1169 1350 5992 1212 ...
##  $ zona        : chr [1:8319] "Zona Oriente" "Zona Oriente" "Zona Oriente" "Zona Sur" ...
##  $ estrato     : num [1:8319] 3 3 3 4 5 5 4 5 5 5 ...
##  $ preciom     : num [1:8319] 250 320 350 400 260 240 220 310 320 780 ...
##  $ areaconst   : num [1:8319] 70 120 220 280 90 87 52 137 150 380 ...
##  $ banios      : num [1:8319] 3 2 2 5 2 3 2 3 4 3 ...
##  $ habitaciones: num [1:8319] 6 3 4 3 3 3 3 4 6 3 ...
##  $ tipo        : chr [1:8319] "Casa" "Casa" "Casa" "Casa" ...
##  $ barrio      : chr [1:8319] "20 de julio" "20 de julio" "20 de julio" "3 de julio" ...
##  $ longitud    : num [1:8319] -76.5 -76.5 -76.5 -76.5 -76.5 ...
##  $ latitud     : num [1:8319] 3.43 3.43 3.44 3.44 3.46 ...

Siendo asi nos quedamos con una base de 8319 registros y 11 variables.

Análisis Bivariado

Con la base de datos ya depurada, avanzamos al análisis bivariado, cuyo objetivo es explorar y describir las relaciones entre pares de variables. A continuación, se presentan los enfoques según el tipo de relación:

1. Cualitativa- Cualitativa

Para este análisis se evalúa si existe relación entre el tipo de vivienda y dos variables categóricas del conjunto de datos: la zona y el estrato socioeconómico. Aunque la variable estrato está almacenada en formato numérico, se considera en este apartado porque su naturaleza es cualitativa ordinal; es decir, representa categorías con un orden establecido, pero sin una escala numérica continua.

- Relacion tipo de vivienda- Estrato:

# 1. Tabla de contingencia base
tabla_bruta <- table(df3$tipo, df3$estrato)

# 2. Pasar a data.frame y luego a formato ancho (sin rownames)
tabla_df <- as.data.frame(tabla_bruta) %>%
  pivot_wider(
    names_from = Var2,   # estrato
    values_from = Freq
  )

# 3. Renombrar columnas
names(tabla_df)[1] <- "Tipo de vivienda"

# 4. Imprimir tabla bonita
kable(
  tabla_df,
  caption = "Tabla IV. Contingencia entre Tipo de Vivienda y Estrato",
  align = "c"
) %>%
  kable_styling(
    full_width = FALSE,
    bootstrap_options = c("striped", "hover", "condensed")
  )
Tabla IV. Contingencia entre Tipo de Vivienda y Estrato
Tipo de vivienda 3 4 5 6
Apartamento 639 1404 1766 1291
Casa 814 725 984 696
df3 %>%
  count(tipo, estrato) %>%
  ggplot(aes(x = factor(estrato), y = n, fill = tipo)) +
  geom_col(position = "dodge") +
  labs(
    title = "Distribución del Tipo de Vivienda por Estrato",
    x = "Estrato",
    y = "Frecuencia",
    fill = "Tipo de vivienda"
  ) +
  scale_fill_manual(values = c("#4C9AFF", "#FFA657")) +
  theme_minimal(base_size = 12)
**Figura 1.2**: Distribución del Tipo de Vivienda por Estrato

Figura 1.2: Distribución del Tipo de Vivienda por Estrato

chisq.test(tabla_bruta)
## 
##  Pearson's Chi-squared test
## 
## data:  tabla_bruta
## X-squared = 224.33, df = 3, p-value < 2.2e-16

Los resultados muestran que sí existe una relación estadísticamente significativa entre el tipo de vivienda y el estrato socioeconómico (χ² = 224.33, p < 2.2e-16).

En términos descriptivos, se observa que (Tabla IV y Figura 1.2):

  • Los apartamentos se concentran principalmente en los estratos 4, 5 y 6, evidenciando una mayor presencia en niveles socioeconómicos medios y altos.
  • Las casas, aunque también están presentes en todos los estratos, muestran una mayor proporción en el estrato 3, con menor participación en estratos más altos.

En conjunto, estos resultados indican que el tipo de vivienda no se distribuye de manera uniforme entre los estratos, sino que sigue patrones asociados al nivel socioeconómico del área, confirmando la relación entre ambas variables.

- Relacion tipo de vivienda- zona:

# 1. Tabla de contingencia base
tabla_bruta1 <- table(df3$tipo, df3$zona)

# 2. Pasar a data.frame y luego a formato ancho (sin rownames)
tabla_df1 <- as.data.frame(tabla_bruta1) %>%
  pivot_wider(
    names_from = Var2,   # estrato
    values_from = Freq
  )

# 3. Renombrar columnas
names(tabla_df1)[1] <- "Tipo de vivienda"

# 4. Imprimir tabla bonita
kable(
  tabla_df1,
  caption = "Tabla V. Contingencia entre Tipo de Vivienda y zona",
  align = "c"
) %>%
  kable_styling(
    full_width = FALSE,
    bootstrap_options = c("striped", "hover", "condensed")
  )
Tabla V. Contingencia entre Tipo de Vivienda y zona
Tipo de vivienda Zona Centro Zona Norte Zona Oeste Zona Oriente Zona Sur
Apartamento 24 1198 1029 62 2787
Casa 100 722 169 289 1939
df3 %>%
  count(tipo, zona) %>%
  ggplot(aes(x = factor(zona), y = n, fill = tipo)) +
  geom_col(position = "dodge") +
  labs(
    title = "Distribución del Tipo de Vivienda por Zona",
    x = "Zona",
    y = "Frecuencia",
    fill = "Tipo de vivienda"
  ) +
  scale_fill_manual(values = c("#4C9AFF", "#FFA657")) +
  theme_minimal(base_size = 12)
**Figura 1.3**: Distribución del Tipo de Vivienda por Zona

Figura 1.3: Distribución del Tipo de Vivienda por Zona

chisq.test(tabla_bruta1)
## 
##  Pearson's Chi-squared test
## 
## data:  tabla_bruta1
## X-squared = 690.93, df = 4, p-value < 2.2e-16

El análisis muestra que la distribución del tipo de vivienda varía significativamente según la zona geográfica. Los apartamentos predominan en las zonas sur, oeste y norte (Figura 1.3), donde su frecuencia es muy superior a la de las casas (Tabla V). Por su parte, las casas registran mayor presencia relativa en Zona Centro y Zona Oriente, aunque continúan siendo menos numerosas que los apartamentos.

La prueba Chi-cuadrado confirma esta diferencia: existe una asociación estadísticamente significativa entre zona y tipo de vivienda (\(χ² = 690.93\), \(p < 0.001\)), indicando que la zona residencia influye de manera importante en el tipo de inmueble observado.

2. Cuantitativa-Cualitativa

Para este caso analizaremos la relación existente entre el precio del inmueble frente a distintas variables categóricas del conjunto de datos, tales como la zona, el estrato socioeconómico y el tipo de vivienda. Este enfoque permite comparar la distribución del precio entre diferentes grupos, identificando diferencias en niveles centrales, dispersión y presencia de valores extremos que ayudan a comprender la estructura del mercado inmobiliario.

df_box_ze <- df3 %>% 
  mutate(
    zona = as.factor(zona),
    estrato = as.factor(estrato)
  ) %>% 
  pivot_longer(
    cols = c(zona, estrato),
    names_to = "variable",
    values_to = "categoria"
  )


ggplot(df_box_ze, aes(x = categoria, y = preciom, fill = variable)) +
  geom_boxplot(alpha = 0.7) +
  facet_wrap(~ variable, scales = "free_x") +
  theme_minimal(base_size = 12) +
  scale_fill_manual(values = c(
    "zona" = "#4C9AFF",     # azul para zona
    "estrato" = "#FFA657"   # naranja para estrato
  )) +
  labs(
    title = "Distribución del Precio según Zona y Estrato",
    x = "Categoría",
    y = "Precio (millones COP)",
    fill = "Variable"
  ) +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1)
  )
**Figura 1.4**: Boxplot. Dist Precio por zona y estrato

Figura 1.4: Boxplot. Dist Precio por zona y estrato

En la Figura 1.4 se evidencia que tanto el estrato socioeconómico como la zona geográfica influyen de manera importante en el precio de los inmuebles. A medida que aumenta el estrato, los precios tienden a ser más altos y muestran mayor dispersión, especialmente en el estrato 6. De forma similar, la Zona Oeste concentra las viviendas de mayor valor, mientras que las zonas Centro, Norte, Oriente y Sur presentan precios más moderados y homogéneos. Los valores altos observados no representan datos atípicos, sino la variabilidad natural del mercado inmobiliario, donde factores como ubicación y nivel socioeconómico generan diferencias claras en los niveles de precio.

ggplot(df2, aes(x = tipo, y = preciom, fill = tipo)) +
  geom_boxplot(alpha = 0.7) +

  # --- Q1 ---
  stat_summary(
    fun = function(z) quantile(z, 0.25),
    geom = "text",
    aes(label = paste0("Q1: ", round(after_stat(y), 0))),
    vjust = -1,
    color = "black",
    size = 3
  ) +
  
  # --- q2 ---
  stat_summary(
    fun = mean,
    geom = "text",
    aes(label = paste0("Media: ", round(after_stat(y), 0))),
    vjust = -1.5,
    color = "black",
    fontface = "bold",
    size = 3
  ) +
  
  # --- Q3 ---
  stat_summary(
    fun = function(z) quantile(z, 0.75),
    geom = "text",
    aes(label = paste0("Q3: ", round(after_stat(y), 0))),
    vjust = -1,
    color = "black",
    size = 3
  ) +

  scale_fill_manual(values = c("#4C9AFF", "#FFA657")) +
  theme_minimal(base_size = 12) +
  labs(
    title = "Distribución del Precio según Tipo de Vivienda",
    x = "Tipo de vivienda",
    y = "Precio (millones COP)",
    fill = "Tipo"
  )
**Figura 1.5**: Boxplot. Precio y tipo de vivienda

Figura 1.5: Boxplot. Precio y tipo de vivienda

En la Figura 1.5 muestra que las casas presentan precios notablemente más altos que los apartamentos. La media de precio para las casas es significativamente superior (540 millones COP vs. 367 millones COP), y además presentan un rango intercuartílico mayor (Q1–Q3: 300–670 millones), lo que indica una mayor variabilidad en su valor. Los apartamentos, por su parte, se concentran en valores más bajos y con menor dispersión (Q1–Q3: 175–430 millones).

A continuación aplicaremos una prueba de T-Student que nos apoye a reforzar lo dicho anteriormente, para ello:

\[ H_0: \mu_1 = \mu_2 \\ H_1: \mu_1 \ne \mu_2 \] donde \(\mu_1\) es la media de precios de tipo de casas y \(\mu_2\) es la media de precios de apartamentos

t.test(preciom ~ tipo, data = df3)
## 
##  Welch Two Sample t-test
## 
## data:  preciom by tipo
## t = -23.071, df = 5792.2, p-value < 2.2e-16
## alternative hypothesis: true difference in means between group Apartamento and group Casa is not equal to 0
## 95 percent confidence interval:
##  -187.7543 -158.3456
## sample estimates:
## mean in group Apartamento        mean in group Casa 
##                  366.9435                  539.9935

La prueba t de Welch indica que existe una diferencia estadísticamente significativa entre el precio promedio de los apartamentos y el de las casas (\(𝑝-value<2.2×10−16\))

El estadístico \(𝑡=−23.07\) y el intervalo de confianza al 95% \([−187.75,−158.35]\) muestran que la media de precios de los apartamentos es inferior a la de las casas. Dado que el intervalo de confianza no incluye el cero y es completamente negativo, se concluye que la diferencia en las medias es real y significativa, confirmando que las casas son, en promedio, considerablemente más costosas que los apartamentos en el conjunto de datos analizado.

Siendo así, el tipo de vivienda se confirma como un factor importante en la diferenciación del precio, siendo las casas consistentemente más costosas y heterogéneas en su valoración.

3. Cuantitativa-Cuantitativa

En este apartado se busca identificar cuáles variables presentan mayor relación con el precio de una vivienda, para lo cual se utiliza la medida de correlación entre variables numéricas del conjunto de datos.

# elegir variables usando dplyr::select explícito
vars_corr <- dplyr::select(
  df3,
  preciom,
  areaconst,
  habitaciones,
  banios, 
  longitud,
  latitud
)

corr <- cor(vars_corr, method = "pearson")

ggcorrplot(
  corr,
  lab = TRUE,
  hc.order = TRUE,
  type = "lower",
  colors = c("#6D9EC1", "white", "#E46726")
)
**Figura 1.6**: Matriz de correlación

Figura 1.6: Matriz de correlación

El gráfico 1.6 muestra que las variables con mayor asociación lineal con el precio son el área construida (r = 0.69) y el número de baños (r = 0.68). En contraste, el número de habitaciones presenta una correlación más débil (r = 0.28), indicando que aporta menor información para explicar el valor del inmueble.

Asimismo, las coordenadas geográficas presentan asociaciones lineales bajas con el precio (longitud r = -0.34 y latitud r = -0.12), lo que sugiere que su contribución explicativa es limitada dentro de un enfoque estrictamente lineal. En este sentido, la dimensión espacial se encuentra mejor representada por la variable zona, que permite capturar de manera más adecuada las diferencias estructurales del mercado inmobiliario según ubicación.

En conjunto, los resultados son coherentes con la dinámica típica del mercado inmobiliario, donde las dimensiones físicas y las características funcionales del inmueble tienen un mayor peso en la determinación del precio que las coordenadas geográficas individuales. Esta evidencia estadística se refuerza visualmente en el Gráfico 1.7, el cual permite observar de manera directa la relación entre el precio y el área construida.

ggplot(df3, aes(x = preciom, y = areaconst)) +
  geom_point(alpha = 0.3, color = "#BA4C23", size = 1.2) +
  geom_smooth(method = "lm", se = FALSE, color = "black", linewidth = 1) +
  theme_minimal(base_size = 12) +
  labs(
    title = "Relación entre Precio y Área Construida",
    x = "Precio (millones COP)",
    y = "Área construida (m²)"
  )
## `geom_smooth()` using formula = 'y ~ x'
**Figura 1.7**: Relación entre Precio y area construida

Figura 1.7: Relación entre Precio y area construida

El grafico confirma visualmente la relación positiva entre el precio y el área construida. A medida que aumenta el tamaño del inmueble, se observa una tendencia creciente en el valor de venta, lo cual se alinea con la pendiente positiva de la línea de regresión ajustada. Aunque existe una amplia dispersión (especialmente en precios elevados) la estructura del gráfico sugiere que el área construida es uno de los determinantes más sólidos del precio, ya que concentra una gran densidad de puntos siguiendo un patrón ascendente. Este comportamiento es consistente con la lógica del mercado inmobiliario, donde las propiedades con mayor metraje suelen presentar precios más altos debido a su mayor utilidad, amplitud y valoración comercial.

Análisis Multivariado

Análisis de Componentes Principales

Para este analisis seleccionaramos las variables de estudio, las cuales corresponden a: precio, area construida, nro de habitaciones, nro de baños, longitud y latitud.

Dado que previamente se realizó el proceso de depuración y tratamiento de los datos, se procede a filtrar el conjunto de información con el fin de garantizar que no presentara valores faltantes ni inconsistencias que pudieran afectar la estabilidad y validez del modelo.

Antes de aplicar el ACP, se escalan todas las variables mediante estandarización. Este paso es fundamental, ya que las variables se encuentran en diferentes unidades de medida (por ejemplo, el precio en millones, el área en metros cuadrados y las coordenadas geográficas en grados decimales). La estandarización permite que cada variable contribuya de manera equitativa al análisis, evitando que aquellas con mayor magnitud o varianza dominen la construcción de los componentes principales.

Cumplidas estas premisas, se procede a aplicar el Análisis de Componentes Principales (PCA), dando por resultado:

pca_data <- dplyr::select(df3,
                          preciom, areaconst, banios,
                          habitaciones, longitud, latitud)

# Escalar (Z-score)
pca_scaled <- scale(pca_data)

#Aplicamos PCA:

pca_res <- prcomp(pca_scaled, center = TRUE, scale. = TRUE)
pca_res
## Standard deviations (1, .., p=6):
## [1] 1.6910103 1.1142694 0.8951616 0.7706904 0.5613603 0.4341481
## 
## Rotation (n x k) = (6 x 6):
##                     PC1         PC2         PC3         PC4         PC5
## preciom       0.4908186  0.12406193  0.28355152  0.49579388  0.15142019
## areaconst     0.5124206 -0.14981231  0.01424138  0.23075760 -0.71542179
## banios        0.5294599 -0.06230871 -0.06335452 -0.01872379  0.66533841
## habitaciones  0.3927119 -0.40252227 -0.36430732 -0.60218158 -0.06778343
## longitud     -0.2259674 -0.61845148 -0.47761711  0.56768798  0.12123816
## latitud      -0.1044538 -0.64325433  0.74467711 -0.12528559  0.05722855
##                      PC6
## preciom       0.62814382
## areaconst    -0.38691237
## banios       -0.51841131
## habitaciones  0.42873784
## longitud      0.03701418
## latitud      -0.04239922
fviz_eig(pca_res, addlabels = TRUE, ylim = c(0, 60))
**Figura 1.8**: Analisis de Componentes Principales

Figura 1.8: Analisis de Componentes Principales

Los tres primeros componentes explican el 81.8% de la variabilidad total. Este patrón coincide con lo esperado: el mercado se resume bien en dimensiones asociadas a tamaño–precio, y ubicación.

Interpretación de los Componentes Principales:

  1. PC1 (47.7% de la varianza): El primer componente principal está definido principalmente por las variables precio (0.49), área construida (0.51), número de baños (0.53) y número de habitaciones (0.39), todas con cargas positivas y de magnitud elevada. Esto indica que el PC1 representa una dimensión estructural–económica del inmueble, en la cual los mayores valores se asocian a viviendas de mayor tamaño, con mayor dotación interna (más baños y habitaciones) y, consecuentemente, con precios más altos. En este sentido, PC1 resume la valorización inmobiliaria asociada a las características físicas del inmueble, constituyéndose en el eje principal que diferencia viviendas pequeñas y económicas de aquellas más amplias y costosas.

  2. PC2 (20.7% de la varianza): El segundo componente está determinado principalmente por las variables latitud (–0.64) y longitud (–0.62), acompañadas en menor medida por el número de habitaciones (–0.40). Esta combinación refleja fundamentalmente una dimensión espacial, asociada a la localización geográfica del inmueble dentro de la ciudad. En conjunto, el PC2 representa un gradiente de ubicación que permite diferenciar zonas urbanas según su posición relativa en el territorio, independientemente del tamaño general del inmueble. La participación secundaria de la variable habitaciones sugiere que existen ligeras variaciones en la estructura interna de las viviendas asociadas a determinadas localizaciones. Así, este componente captura la influencia del espacio urbano como factor diferenciador del mercado inmobiliario.

  3. PC3 (13.4% de la varianza): El tercer componente está fuertemente determinado por la latitud (0.74), así como por la longitud (–0.48) y, en menor medida, por el número de habitaciones (–0.36) y el precio (0.28). Este patrón indica que el PC3 captura principalmente una variación geográfica en sentido norte–sur dentro de la ciudad, reforzando la dimensión espacial identificada en el componente anterior. En particular, la alta carga positiva de la latitud sugiere que este componente diferencia zonas ubicadas hacia el norte de aquellas situadas más al sur, mostrando que la ubicación territorial introduce matices adicionales en la estructura del mercado inmobiliario. Por lo tanto, el PC3 puede interpretarse como una dimensión espacial complementaria, que profundiza en la organización interna del territorio urbano y su relación con ciertas características estructurales de las viviendas.

A continuación, se presenta el círculo de correlaciones correspondiente a las combinaciones de las dimensiones 1 y 2, así como de las dimensiones 2 y 3, con el fin de visualizar cómo las variables originales se proyectan y se relacionan dentro de los principales planos factoriales del Análisis de Componentes Principales.

# Gráfico Dim1 vs Dim2
g1 <- fviz_pca_var(
  pca_res,
  axes = c(1, 2),
  col.var = "contrib",
  gradient.cols = c("#FF7F00", "#034D94"),
  repel = TRUE
) +
  coord_fixed(xlim = c(-1, 1), ylim = c(-1, 1)) +
  ggtitle("Dim1 vs Dim2") +
  theme(plot.title = element_text(hjust = 0.5))

# Gráfico Dim2 vs Dim3
g2 <- fviz_pca_var(
  pca_res,
  axes = c(2, 3),
  col.var = "contrib",
  gradient.cols = c("#FF7F00", "#034D94"),
  repel = TRUE
) +
  coord_fixed(xlim = c(-1, 1), ylim = c(-1, 1)) +
  ggtitle("Dim2 vs Dim3") +
  theme(plot.title = element_text(hjust = 0.5))

# Unificar en cuadrícula + título general
(g1 + g2) +
  plot_layout(guides = "collect") +  # intenta unificar la leyenda
  plot_annotation(
    title = "Círculos de correlación del PCA",
    theme = theme(plot.title = element_text(hjust = 0.5, face = "bold"))
  )
**Figura 1.9**: Círculo de correlaciones

Figura 1.9: Círculo de correlaciones

El plano conformado por la Dimensión 1 (47.7%) y la Dimensión 2 (20.7%) muestra que el mercado inmobiliario se organiza principalmente en torno a una dimensión estructural–económica y una dimensión espacial. En la Dimensión 1, las variables precio, área construida, número de baños y número de habitaciones presentan cargas positivas y elevadas, evidenciando una fuerte correlación entre ellas. Esto confirma que este eje resume el tamaño físico del inmueble y su nivel de valorización económica. Por su parte, la Dimensión 2 está dominada principalmente por las variables latitud y longitud, lo que indica que este componente capta diferencias asociadas a la localización geográfica dentro de la ciudad. La disposición angular entre las variables estructurales y las espaciales sugiere que ambas dimensiones operan de manera relativamente independiente.

Por otra parte, el plano Dim2 (20.7%) y Dim3 (13.4%) refuerza la importancia de la dimensión espacial en la estructura del mercado. En este caso, la latitud presenta una carga dominante sobre la Dimensión 3, evidenciando un gradiente territorial en sentido norte–sur. La longitud también mantiene una participación relevante, lo que indica que ambas dimensiones están asociadas a la localización geográfica de los inmuebles. A diferencia de lo observado en la Dimensión 1, las variables asociadas al tamaño y precio del inmueble presentan aquí cargas menores, lo que confirma que estas dimensiones secundarias se relacionan principalmente con la organización espacial del territorio urbano.

En conjunto, los resultados del Análisis de Componentes Principales evidencian que la estructura del mercado inmobiliario puede resumirse en dos grandes factores: una dimensión estructural–económica, que concentra casi la mitad de la variabilidad total y diferencia viviendas según tamaño y precio, y una dimensión espacial, representada por las componentes segunda y tercera, que capta la distribución geográfica de las propiedades dentro de la ciudad. Esta configuración sugiere que la oferta inmobiliaria no solo se segmenta por características físicas y nivel de valorización, sino también por patrones territoriales que influyen en la dinámica del mercado.

Análisis de Conglomerados (Clustering)

Para el análisis de conglomerados se emplearan las mismas variables utilizadas en el PCA, garantizando previamente que no tenemos valores faltantes y que las variables se encuentran escaladas. Dado que la base de datos cuenta con \(8.319\) registros, la aplicación de métodos basados en matrices de distancia (como los que utilizan distancias Euclidiana, Manhattan o Minkowski) implicaría la construcción de una matriz de aproximadamente 8319×8318 \(\approx\) 34 millones de elementos, lo cual resulta computacionalmente costoso e ineficiente para este tamaño de base.

Por esta razón, y siguiendo una estrategia más adecuada para grandes volúmenes de datos, se optó por la técnica K-means, la cual permite agrupar observaciones en función de su similitud sin necesidad de calcular explícitamente una matriz completa de distancias. Esta técnica resulta especialmente apropiada cuando las variables han sido previamente escaladas, como en este caso, y facilita la identificación de patrones estructurales en la oferta inmobiliaria urbana.

Elección de \(k\):

Como primer paso, se determina el valor óptimo de \(k\), es decir, el número de clústeres que mejor representa la estructura de agrupación presente en los datos. Para ello se emplean dos métodos complementarios que permiten evaluar la calidad de la partición: el método del codo (Elbow) y el coeficiente de Silhouette.

  • Método Silhouette:
library(cluster)
set.seed(123)

sil_vals <- numeric(10)   # vector para guardar el silhouette promedio


for (k in 2:10) {
  km_temp <- kmeans(vivienda_z, centers = k, nstart = 20)
  sil_k   <- silhouette(km_temp$cluster, dist(vivienda_z))
  sil_vals[k] <- mean(sil_k[, 3])
}

plot(2:10, sil_vals[2:10], type = "b", pch = 19,
     xlab = "Número de clústeres (k)",
     ylab = "Silhouette promedio",
     main = "Selección de k usando Silhouette")
**Figura 1.10**: Método de Selección de k usando Silhouette

Figura 1.10: Método de Selección de k usando Silhouette

  • Método del Codo:
set.seed(123)

wss_vals <- numeric(10)

for (k in 1:10) {
  km_temp <- kmeans(vivienda_z, centers = k, nstart = 20)
  wss_vals[k] <- km_temp$tot.withinss
}

plot(1:10, wss_vals, type = "b", pch = 19,
     xlab = "Número de clústeres (k)",
     ylab = "Suma de cuadrados intra-clúster (WSS)",
     main = "Método del codo (elbow)")
**Figura 1.11**: Método Codo. Selección de k

Figura 1.11: Método Codo. Selección de k

En la Figura 1.10 muestra que el valor más alto del índice corresponde a k = 2, indicando que esta partición proporciona la mejor separación entre los grupos. Para k ≥ 3 el Silhouette disminuye de forma consistente. Por otra parte, la Figura 1.11 se observa un descenso pronunciado entre k = 1 y k = 2, y un descenso todavía apreciable entre k = 2 y k = 3; sin embargo, a partir de k = 3 la curva se estabiliza. Este comportamiento sugiere que el punto de inflexión se ubica alrededor de k= 2.

Aplicamos K-means con k = 2 (de la conclusión del paso anterior)

set.seed(123)
km <- kmeans(vivienda_z, centers = 2, nstart = 25)
df3$cluster <- as.factor(km$cluster)

fviz_cluster(list(data = vivienda_z, cluster = km$cluster))
**Figura 1.12**: Clustering k=2

Figura 1.12: Clustering k=2

tabla_clusters <- aggregate(
  df3[, c("preciom","areaconst","banios","habitaciones",
        "latitud","longitud")],
  by = list(cluster = df3$cluster),
  FUN = mean
)

kable(tabla_clusters, caption = "*Tabla VI*: Promedios por clúster")
Tabla VI: Promedios por clúster
cluster preciom areaconst banios habitaciones latitud longitud
1 758.7879 317.1583 4.674427 4.819291 3.412500 -76.53547
2 277.2797 106.3697 2.389809 3.068591 3.420124 -76.52530

La coincidencia entre la separación observada en el plano principal del PCA (Dim1–Dim2) (Figura 1.9) y la partición obtenida mediante K-means (Figura 1.12) se explica por la fuerte dominancia de la Dimensión 1, la cual concentra cerca del 48% de la variabilidad total y está asociada principalmente al tamaño y valor económico del inmueble. En consecuencia, el algoritmo de agrupamiento reproduce esta misma estructura, evidenciando que el mercado inmobiliario presenta una organización claramente dominada por un eje económico–estructural.

Con base en el gráfico de conglomerados (Figura 1.12) y la Tabla VI de promedios por clúster, se identifican dos segmentos claramente diferenciados. El Clúster 1 agrupa viviendas con un precio promedio cercano a 758 millones, áreas superiores a 300 \(m^2\) y una mayor dotación interna (4 a 5 baños y habitaciones), representando un segmento de mayor tamaño y valorización. En términos espaciales, estas viviendas presentan una latitud ligeramente menor y una longitud más negativa, lo que sugiere una ubicación levemente más hacia el suroccidente de la ciudad; sin embargo, estas diferencias geográficas son moderadas.

Por su parte, el Clúster 2 concentra viviendas con precios promedio cercanos a 277 millones, áreas alrededor de 106 \(m^2\) y menor número de baños y habitaciones, configurando un segmento residencial de menor tamaño y valor. Espacialmente, presentan una latitud ligeramente mayor y una longitud menos negativa, lo que indica una ubicación levemente más hacia el nororiente del área urbana.

En conjunto, la segmentación del mercado se encuentra principalmente determinada por variables estructurales (precio, área y dotación interna) mientras que la localización geográfica actúa como un factor complementario en la diferenciación de los conglomerados.

Análisis de Correspondencia

En esta sección se analizan las relaciones entre las variables categóricas tipo de vivienda, estrato y zona, con el propósito de identificar patrones conjuntos dentro del mercado inmobiliario. Dado que el estudio involucra simultáneamente tres variables cualitativas, se emplea el Análisis de Correspondencia Múltiple (ACM), técnica adecuada para explorar la estructura de asociación entre varias variables categóricas en un mismo espacio factorial.

Previamente, se garantiza que las variables se encuentren definidas como factores y que no presenten valores faltantes, asegurando así que cada categoría sea tratada como un nivel cualitativo independiente y no como un valor numérico con posible interpretación ordinal o continua. Bajo estas condiciones, el ACM permite analizar conjuntamente las categorías de las variables sin necesidad de construir una tabla de contingencia bidimensional tradicional.

df3$zona <- as.factor(df3$zona)
df3$estrato <- as.factor(df3$estrato)
df3$tipo <- as.factor(df3$tipo)

No obstante, con el fin de verificar la existencia de asociación estadística entre las variables antes de aplicar el ACM, se procede a evaluar la independencia entre cada par de variables mediante la prueba chi-cuadrado:

chisq.test(table(df3$zona, df3$estrato))
## 
##  Pearson's Chi-squared test
## 
## data:  table(df3$zona, df3$estrato)
## X-squared = 3830.4, df = 12, p-value < 2.2e-16
chisq.test(table(df3$zona, df3$tipo))
## 
##  Pearson's Chi-squared test
## 
## data:  table(df3$zona, df3$tipo)
## X-squared = 690.93, df = 4, p-value < 2.2e-16
chisq.test(table(df3$estrato, df3$tipo))
## 
##  Pearson's Chi-squared test
## 
## data:  table(df3$estrato, df3$tipo)
## X-squared = 224.33, df = 3, p-value < 2.2e-16

En primer lugar, la prueba entre zona y estrato evidenció una asociación altamente significativa (χ² = 3830.4, gl = 12, p < 0.001), lo que permite rechazar la hipótesis nula de independencia. Este resultado indica que la distribución del estrato varía significativamente según la zona geográfica.

En segundo lugar, la prueba entre zona y tipo de vivienda también mostró resultados significativos (χ² = 690.93, gl = 4, p < 0.001), evidenciando que el tipo de vivienda no se distribuye de manera independiente respecto a la zona.

Finalmente, la prueba entre estrato y tipo de vivienda confirmó igualmente la existencia de asociación estadística (χ² = 224.33, gl = 3, p < 0.001), lo que sugiere que el tipo de vivienda está relacionado con el nivel socioeconómico representado por el estrato.

En conjunto, estos resultados confirman que las tres variables presentan dependencia estadística entre sí, justificando la aplicación del Análisis de Correspondencia Múltiple como herramienta exploratoria para analizar su estructura conjunta.

mca_model <- MCA(df3[, c("zona", "estrato", "tipo")], graph = FALSE)

A continuación, se presentan los resultados obtenidos del análisis:

df_mca <- df3

df_mca$zona    <- factor(paste0("Zona: ", df_mca$zona))
df_mca$estrato <- factor(paste0("Estrato: ", df_mca$estrato))
df_mca$tipo    <- factor(paste0("Tipo: ", df_mca$tipo))

mca_model <- MCA(df_mca[, c("zona","estrato","tipo")], graph = FALSE)

fviz_mca_var(mca_model,
             repel = TRUE,
             labelsize = 5,
             col.var = c(rep("Zona", nlevels(df_mca$zona)),
                         rep("Estrato", nlevels(df_mca$estrato)),
                         rep("Tipo vivienda", nlevels(df_mca$tipo))),
             title = "ACM: Zona, Estrato y Tipo de Vivienda")
**Figura 1.13**: ACM: Zona, estrato y tipo de vivienda

Figura 1.13: ACM: Zona, estrato y tipo de vivienda

El plano factorial (Figura 1.13) evidencia asociaciones diferenciadas entre zonas, estratos y tipos de vivienda. La Zona Oeste se encuentra asociada al Estrato 6 y muestra mayor proximidad relativa con apartamentos. De manera similar, la Zona Sur, vinculada principalmente a los Estratos 4 y 5, también se ubica en el mismo lado del plano que los apartamentos, lo que sugiere una mayor presencia relativa de este tipo de vivienda.

Por otro lado, las Zonas Centro y Oriente se aproximan al Estrato 3 y se ubican en el mismo lado del plano que las casas, indicando una mayor afinidad con este tipo de inmueble. Asimismo, la Zona Norte presenta proximidad tanto al Estrato 5 como al tipo de vivienda casa, configurando un perfil intermedio dentro de la estructura territorial.

En conjunto, el análisis revela una segmentación espacial clara del mercado inmobiliario, donde las zonas occidentales y meridionales muestran mayor afinidad con apartamentos, mientras que las zonas centrales y orientales se relacionan más con casas.

mca_model$eig
##       eigenvalue percentage of variance cumulative percentage of variance
## dim 1  0.5620882              21.078306                          21.07831
## dim 2  0.4531232              16.992119                          38.07043
## dim 3  0.3796450              14.236687                          52.30711
## dim 4  0.3334444              12.504164                          64.81128
## dim 5  0.3233137              12.124263                          76.93554
## dim 6  0.2717762              10.191608                          87.12715
## dim 7  0.2013563               7.550862                          94.67801
## dim 8  0.1419197               5.321990                         100.00000

El Análisis de Correspondencia Múltiple generó ocho dimensiones factoriales. Las dos primeras dimensiones concentran el 38.07% de la inercia total (Dim 1: 21.08%, Dim 2: 16.99%), lo cual resulta adecuado en el contexto del ACM, donde la variabilidad tiende a distribuirse entre múltiples dimensiones.

Si bien existen dimensiones adicionales con contribuciones relevantes, el plano bidimensional formado por las dos primeras dimensiones permite visualizar y describir de manera clara la estructura principal de asociación entre zona, estrato y tipo de vivienda.

- Análisis complementario

Con el propósito de profundizar el análisis territorial del mercado inmobiliario, se incorpora un análisis adicional de correspondencia simple entre estrato y barrio. Dado que la base de datos contiene un número elevado de barrios (mas de 300), lo que podría generar inestabilidad en las frecuencias y dificultar la interpretación gráfica, se seleccionaron los 20 barrios con mayor presencia en la base de datos.

Esta decisión metodológica permite concentrar el análisis en los sectores con mayor representatividad en la oferta inmobiliaria, garantizando mayor estabilidad estadística y claridad interpretativa. El objetivo de este análisis complementario es identificar patrones de asociación socioeconómica a un nivel territorial más específico, validando la existencia de segmentación espacial dentro del mercado.

A continuación, se procede a seleccionar los 20 barrios con mayor frecuencia en la base de datos y a construir la correspondiente tabla cruzada entre barrio y estrato, con el fin de analizar su estructura de asociación:

top_20 <- df3 %>%
  count(barrio, sort = TRUE) %>%
  slice(1:20) %>%
  pull(barrio)

df_top <- df3 %>% filter(barrio %in% top_20)

tabla_barrio_estrato <- table(df_top$barrio, df_top$estrato)
tabla_barrio_estrato
##                   
##                      3   4   5   6
##   acopi             21  51  59  27
##   aguacatal         20  25   4  61
##   brisas de los     80   2   0   0
##   caney             10 235  51   1
##   ciudad 2000       10  84   2   0
##   ciudad jardin      2   4  67 467
##   cristales          0   1  25  57
##   el ingenio         0   9 158  37
##   el limonar         6  36  91   2
##   el refugio         5  87  28   0
##   la flora           1  36 410   6
##   la hacienda        2  29 134   1
##   los cristales      0   3  44 107
##   melendez          63  11   1   0
##   normandia          1   0  23 135
##   pance              0   2  20 391
##   prados del norte   3  74  50   0
##   santa teresita     0   4  27 232
##   valle del lili     4 579 424   5
##   zona sur          17  20  23  14

Estos resultados muestran una marcada concentración de estratos por barrio, evidenciando una segmentación territorial clara del mercado inmobiliario. Algunos barrios se especializan en estratos altos (Pance, Ciudad Jardín), otros en estratos medios (Valle del Lili, La Flora), y otros en estratos bajos–medios (Meléndez, Brisas), lo que sugiere la existencia de una estructura socioeconómica diferenciada.

Con el fin de respaldar estadísticamente esta evidencia descriptiva, se procede a evaluar la existencia de asociación entre las variables barrio y estrato mediante la prueba chi-cuadrado de independencia.

chisq.test(tabla_barrio_estrato)
## 
##  Pearson's Chi-squared test
## 
## data:  tabla_barrio_estrato
## X-squared = 7303.9, df = 57, p-value < 2.2e-16

El resultado de la prueba chi-cuadrado permite rechazar la hipótesis nula de independencia (p-value < 0.001), lo que indica la existencia de asociación estadísticamente significativa entre los barrios seleccionados (top 20) y el estrato socioeconómico.

Avanzaremos a realizar el análisis de correspondencia y el calculo de varianza acumulada utilizando la matriz de discrepancia:

ca_barrio_estrato <- CA(tabla_barrio_estrato, graph = FALSE)

fviz_ca_biplot(ca_barrio_estrato,
               repel = TRUE,
               title = "AC Estrato vs Top 20 Barrios")
**Figura 1.14**: AC Estrato vs Top 20 Barrios

Figura 1.14: AC Estrato vs Top 20 Barrios

valores_prop <-ca_barrio_estrato$eig
valores_prop
##       eigenvalue percentage of variance cumulative percentage of variance
## dim 1  0.7381641               47.71221                          47.71221
## dim 2  0.5589606               36.12916                          83.84137
## dim 3  0.2499930               16.15863                         100.00000

El Análisis de Correspondencia entre estrato y los 20 barrios con mayor representatividad en la base de datos evidencia una estructura territorial claramente segmentada. Las dos primeras dimensiones explican el 83.8% de la inercia total, lo que permite una interpretación robusta del plano factorial.

Segun la Figura 1.14 la Dimensión 1 (47.7%) separa claramente barrios concentrados en estrato 6, ubicados en el lado izquierdo del plano (como Pance 391 casos en estrato 6, Ciudad Jardín 467, Santa Teresita 232 y Normandía 135) de barrios ubicados en el lado derecho, donde predominan estratos 3, 4 y 5. En este último grupo se destacan barrios como Valle del Lili (con alta concentración en estratos 4 y 5), Caney (principalmente estrato 4) y El Refugio (estrato 4).

Por su parte, la Dimensión 2 (36.1%) diferencia dentro del grupo derecho los barrios con mayor presencia de estrato 3, como Meléndez y Brisas, de aquellos con predominancia en estrato 4, como Valle del Lili, Caney y Ciudad 2000. Esta separación evidencia no solo una división entre estratos altos y medios, sino también una diferenciación interna dentro del segmento medio del mercado.

En conjunto, el análisis confirma una fuerte especialización socioeconómica por barrio, donde ciertos sectores presentan alta concentración en un estrato específico, reflejando una segmentación territorial consistente y estructural dentro del mercado inmobiliario.

Informe final

Hallazgos principales del análisis

  • Análisis bivariado: ¿qué variables explican mejor el precio?

Los resultados confirman que el precio está principalmente determinado por el tamaño y la dotación interna del inmueble. En la matriz de correlación, el área construida (r = 0.69) y el número de baños (r = 0.68) muestran la asociación lineal más fuerte con el precio, mientras que habitaciones aporta menos capacidad explicativa (r = 0.28).

Adicionalmente, el análisis por tipo de vivienda evidencia diferencias claras: las casas presentan medias más altas y mayor dispersión de precios que los apartamentos. Esto se respalda con la prueba t de Welch, que confirma una diferencia estadísticamente significativa entre medias: apartamentos ≈ 366.9 vs casas ≈ 540.0 millones COP (p-value < 2.2e-16).

Implicación de negocio: la valoración y estrategia comercial debe priorizar variables estructurales (metraje/baños) y diferenciar explícitamente por tipo (casa/apto), porque el mercado no se comporta de forma homogénea.

  • Análisis de Componentes Principales (PCA): estructura latente del mercado

El PCA confirma que el mercado se resume bien en pocas dimensiones: los tres primeros componentes explican 81.8% de la variabilidad total.

  • PC1 (47.7%) representa una dimensión estructural–económica dominada por precio, área construida, baños y habitaciones, diferenciando viviendas pequeñas/económicas vs grandes/costosas.

  • PC2 (20.7%) captura una dimensión espacial (latitud/longitud), es decir, gradientes de localización dentro de la ciudad.

  • PC3 (13,4%), aunque explica una proporción menor de la variabilidad total, actúa como un componente complementario del eje espacial (PC2). Este componente permite capturar variaciones secundarias del mercado que no son completamente explicadas por las dimensiones principales, refinando la interpretación territorial y estructural del conjunto de propiedades.

En conjunto, los resultados evidencian que el mercado inmobiliario urbano analizado se organiza principalmente en torno a un eje económico–estructural dominante, complementado por una dimensión territorial y una componente adicional que ajusta y detalla las variaciones espaciales secundarias.

Implicación de negocio: la empresa puede diseñar estrategias separadas para: producto/valor (tamaño y dotación), y territorio (zonas/ubicación), sin mezclar señales.

  • Análisis de conglomerados (K-means): segmentación operativa del portafolio

Los criterios de selección de k muestran que k = 2 es el valor óptimo: el método Silhouette alcanza su máximo en k=2 y el método del codo muestra un punto de inflexión alrededor de ese valor.

La segmentación resultante construye dos perfiles muy consistentes:

  • Clúster 1 (alto valor): precio promedio ≈ 758.8 millones, área ≈ 317 m², con más baños y habitaciones.

  • Clúster 2 (valor medio/bajo): precio promedio ≈ 277.3 millones, área ≈ 106 m², con menor dotación interna.

Además, el informe explica que esta partición coincide con la separación del PCA porque la Dimensión 1 domina la variabilidad (~48%) y está asociada al tamaño/valor económico; por eso K-means “hereda” esa misma estructura.

Implicación de negocio: la empresa tiene una segmentación clara y accionable (premium vs estándar) para definir pricing, inversiones, marketing y gestión de inventario.

  • Análisis de Correspondencia Múltiple (ACM): relación entre zona, estrato y tipo

El Análisis de Correspondencia Múltiple confirmó la existencia de una estructura de dependencia significativa entre zona, estrato y tipo de vivienda, previamente validada mediante pruebas chi-cuadrado (p < 0.001 en todos los casos).

El plano factorial evidencia una segmentación territorial clara:

  • Zona Oeste → Estrato 6 → mayor afinidad con apartamentos

  • Zona Sur → Estratos 4 y 5 → proximidad con apartamentos

  • Zona Centro y Oriente → Estrato 3 → mayor asociación con casas

  • Zona Norte → perfil intermedio (Estrato 5 y casas)

Esto confirma que el tipo de vivienda no se distribuye aleatoriamente en el territorio, sino que responde a patrones socioeconómicos definidos.

Adicionalmente, el análisis complementario de correspondencia simple entre estrato y barrio (top 20) permitió profundizar la segmentación a un nivel microterritorial. Este ejercicio valida que la estratificación socioeconómica no solo opera por grandes zonas urbanas, sino también a nivel de barrios específicos con alta representatividad en la oferta, evidenciando una segmentación espacial jerárquica:

  • Macrosegmentación: zona

  • Mesosegmentación: estrato

  • Microsegmentación: barrio

Implicación de negocio: el mercado inmobiliario de Cali presenta una segmentación territorial estructurada en múltiples niveles (zona, estrato y barrio), lo que implica que las decisiones de inversión, captación y fijación de precios no deben basarse únicamente en promedios generales. La empresa debe incorporar la correspondencia específica entre tipo de vivienda, nivel socioeconómico y ubicación, diseñando estrategias diferenciadas por zona y ajustadas a los barrios con mayor coherencia socioeconómica, con el fin de optimizar el posicionamiento y maximizar la rentabilidad.

Conclusiones clave

  1. El mercado inmobiliario urbano de Cali presenta una estructura multidimensional, dominada por un eje económico–estructural claramente identificado en el PCA. El metraje y la dotación interna (especialmente el número de baños) explican una proporción significativa del precio y de la separación entre inmuebles, evidenciando que el tamaño y la configuración física son los principales determinantes del valor.

  2. La localización actúa como un eje complementario pero estructural, no marginal. El PCA identifica una dimensión espacial definida, mientras que el Análisis de Correspondencia Múltiple confirma asociaciones significativas entre zona, estrato y tipo de vivienda. Esto demuestra que la organización territorial del mercado no es aleatoria, sino que responde a patrones socioeconómicos consistentes.

  3. La segmentación operativa más robusta del portafolio es k = 2, diferenciando un segmento premium (mayor tamaño, mayor precio, mayor dotación) y un segmento estándar (menor tamaño y valor). Esta partición confirma que el mercado se estructura principalmente alrededor de un eje económico dominante.

  4. El tipo de vivienda es un factor estratégico crítico: las casas presentan precios promedio significativamente más altos y mayor dispersión que los apartamentos, lo que implica dinámicas de negociación, valorización y captación diferenciadas.

  5. La segmentación territorial es jerárquica y estructural. El análisis complementario por barrio demuestra que la correspondencia entre estrato y ubicación no solo se manifiesta a nivel de grandes zonas, sino también en sectores específicos con alta concentración socioeconómica. En consecuencia, el mercado inmobiliario caleño no solo está segmentado por valor económico, sino también por configuración socioespacial en múltiples niveles (zona–estrato–barrio).

Recomendaciones estratégicas para la empresa inmobiliaria

Estrategia comercial y pricing (maximizar beneficios)

  • Reglas de valoración por drivers principales: priorizar modelos/criterios basados en área construida y baños como variables “core” del pricing, ya que son los predictores más fuertes del precio.

  • Pricing diferenciado por tipo: separar explícitamente estrategias para casas vs apartamentos, dado que sus distribuciones de precio no son equivalentes y la diferencia es significativa.

  • Ajuste territorial del pricing: incorporar no solo zona y estrato, sino también el barrio como variable de calibración fina del precio, especialmente en sectores donde el análisis complementario evidenció alta concentración socioeconómica.

  • Paquetes premium: para el segmento alto (clúster 1), enfocar propuestas de valor en atributos que justifican y mantienen el diferencial de precio (mayor metraje, dotación superior y localización estratégica), reforzando la negociación con métricas comparables del mismo clúster.

Gestión de portafolio e inversión (optimizar capital)

  • Inventario por clúster: manejar el portafolio como dos “líneas de producto”:

    1. Premium (clúster 1): menor volumen de ventas esperado, precios promedio elevados y enfoque en rentabilidad por unidad.
    2. Estándar (clúster 2): mayor volumen de operaciones, precios más accesibles y enfoque en rotación y eficiencia comercial.
  • Inversión territorial guiada por ACM: al existir patrones zona–estrato–tipo, priorizar captación/desarrollo donde la combinación sea coherente con el producto objetivo (ej., apartamentos en zonas asociadas a estratos 4–6; casas más alineadas a estrato 3 en Centro/Oriente).

  • Priorización microterritorial (barrio): el análisis complementario permite identificar barrios con alta coherencia socioeconómica. Se recomienda focalizar inversión en aquellos barrios cuya correspondencia estrato–tipo sea consistente y estable, ya que presentan menor incertidumbre en pricing y mayor previsibilidad en demanda.

Marketing y segmentación de clientes (ventaja competitiva)

  • Campañas por microsegmentos: cruzar clúster (premium/estándar) + zona + tipo + barrio para mensajes más efectivos.

    1. Premium + zonas asociadas a estratos altos: comunicación orientada a exclusividad, calidad constructiva y potencial de valorización, destacando la coherencia socioeconómica y el posicionamiento del barrio dentro del mercado.

    2. Estándar + zonas de mayor afinidad con casas/estrato 3: comunicación centrada en funcionalidad, accesibilidad y relación precio–beneficio, resaltando estabilidad del sector y adecuación del inmueble a necesidades familiares y de vivienda principal.

  • Estrategias hiperlocales: diseñar campañas diferenciadas para barrios con fuerte identidad socioeconómica, utilizando datos específicos del sector (precio típico del barrio (mediana), perfil socioeconómico predominante y tipo de vivienda dominante).

Analítica continua (sostener la decisión en el tiempo)

  • Monitoreo periódico de segmentación: recalcular PCA/K-means por periodos (trimestral/semestre) para detectar cambios en estructura de mercado, especialmente si cambian dinámicas de oferta o precios.

  • Tablero ejecutivo: construir un dashboard con KPIs por clúster/zona/tipo (precio mediano, m², absorción/rotación, inventario), de modo que la empresa ajuste inversión y captación en un mercado “altamente competitivo y cambiante”.

Cierre

En síntesis, el mercado inmobiliario analizado no responde únicamente a diferencias de precio, sino a una estructura económica y territorial claramente definida. Incorporar esta segmentación multinivel en las decisiones estratégicas permitirá a la empresa mejorar la asignación de capital, afinar su posicionamiento por segmentos y maximizar la rentabilidad en un mercado altamente competitivo.