1. Introducción

La empresa inmobiliaria B&C de Cali, Colombia, ha recopilado información detallada sobre el mercado inmobiliario urbano de la ciudad. Este informe busca ofrecer un análisis integral del mercado, utilizando técnicas avanzadas de análisis de datos para identificar patrones y tendencias que guíen las decisiones estratégicas de la empresa.

2. Objetivos

El objetivo principal del análisis es identificar patrones y tendencias en el mercado inmobiliario de Cali, con el fin de:

  • Definir nichos de mercado.
  • Desarrollar estrategias de marketing efectivas.
  • Establecer precios competitivos de venta.
  • Ofrecer servicios personalizados a los clientes.

3. Metodología

El análisis se llevó a cabo utilizando técnicas estadísticas avanzadas, incluyendo:

  • Análisis de Componentes Principales (ACP): Para reducir la dimensionalidad y visualizar las características clave que influyen en el mercado.
  • Análisis de Conglomerados: Para agrupar las propiedades en segmentos homogéneos.
  • Análisis de Correspondencia: Para examinar las relaciones entre las variables categóricas.
  • Visualización: Para comunicar los resultados de manera efectiva.

3.1 Preparación de Datos

En esta sección, se realizaron varias actividades para preparar y limpiar el conjunto de datos antes de su análisis estadístico. A continuación se presenta una explicación de los pasos clave:

Resumen Estadístico:

Mínimo, Máximo, Media, Mediana y Cuartiles: Se calcularon estas medidas de tendencia central y de dispersión para cada variable numérica. Estas estadísticas nos proporcionan una visión general de la distribución de los datos. Por ejemplo, la variable areaconst (área construida) tiene un valor mínimo de 30 metros cuadrados, una mediana de 123 metros cuadrados, y un valor máximo de 1745 metros cuadrados, lo que sugiere una gran variabilidad en el tamaño de las propiedades.

NA (Valores Faltantes): Se identificaron valores faltantes en varias variables, como parqueaderos, banios, habitaciones, barrio, longitud y latitud. Los valores faltantes son importantes de manejar ya que pueden afectar el análisis posterior si no se tratan adecuadamente.

Tipos de Datos:

Se verificaron los tipos de datos para cada columna, asegurándose de que las variables estén clasificadas correctamente como numeric (numéricas) o character (categóricas). Esta clasificación es crucial para aplicar correctamente las técnicas estadísticas. Distribución de las Variables:

La información sobre cuartiles y rangos nos permite entender la distribución de cada variable. Por ejemplo, la variable preciom (precio del inmueble) muestra que el 25% de las propiedades tienen un precio menor a 220 millones de pesos, mientras que el 75% tiene un precio menor a 540 millones de pesos, lo cual es útil para identificar qué tan dispersos están los precios en el mercado.

Valores Faltantes:

La presencia de valores faltantes fue abordada para asegurarse de que el análisis estadístico no se vea comprometido. Se consideró la eliminación de registros con valores faltantes o la imputación de datos según la variable afectada. Este proceso de preparación de datos es fundamental para asegurar que los datos estén en un formato adecuado para los análisis estadísticos posteriores, como el Análisis de Componentes Principales (ACP) y el Análisis de Conglomerados, lo que permitirá extraer conclusiones confiables y útiles para la toma de decisiones.

# Cargar paquetes y datos
library(paqueteMODELOS)
library(ggplot2)
library(dplyr)
library(knitr)

data("vivienda")

# Verificar la estructura y los primeros registros
head(vivienda)
# Resumen estadístico de las variables numéricas
summary(vivienda)
##        id           zona               piso              estrato     
##  Min.   :   1   Length:8322        Length:8322        Min.   :3.000  
##  1st Qu.:2080   Class :character   Class :character   1st Qu.:4.000  
##  Median :4160   Mode  :character   Mode  :character   Median :5.000  
##  Mean   :4160                                         Mean   :4.634  
##  3rd Qu.:6240                                         3rd Qu.:5.000  
##  Max.   :8319                                         Max.   :6.000  
##  NA's   :3                                            NA's   :3      
##     preciom         areaconst       parqueaderos        banios      
##  Min.   :  58.0   Min.   :  30.0   Min.   : 1.000   Min.   : 0.000  
##  1st Qu.: 220.0   1st Qu.:  80.0   1st Qu.: 1.000   1st Qu.: 2.000  
##  Median : 330.0   Median : 123.0   Median : 2.000   Median : 3.000  
##  Mean   : 433.9   Mean   : 174.9   Mean   : 1.835   Mean   : 3.111  
##  3rd Qu.: 540.0   3rd Qu.: 229.0   3rd Qu.: 2.000   3rd Qu.: 4.000  
##  Max.   :1999.0   Max.   :1745.0   Max.   :10.000   Max.   :10.000  
##  NA's   :2        NA's   :3        NA's   :1605     NA's   :3       
##   habitaciones        tipo              barrio             longitud     
##  Min.   : 0.000   Length:8322        Length:8322        Min.   :-76.59  
##  1st Qu.: 3.000   Class :character   Class :character   1st Qu.:-76.54  
##  Median : 3.000   Mode  :character   Mode  :character   Median :-76.53  
##  Mean   : 3.605                                         Mean   :-76.53  
##  3rd Qu.: 4.000                                         3rd Qu.:-76.52  
##  Max.   :10.000                                         Max.   :-76.46  
##  NA's   :3                                              NA's   :3       
##     latitud     
##  Min.   :3.333  
##  1st Qu.:3.381  
##  Median :3.416  
##  Mean   :3.418  
##  3rd Qu.:3.452  
##  Max.   :3.498  
##  NA's   :3
# Guardar datos limpios
write.csv(vivienda, "data_limpia.csv", row.names = FALSE) # ACTUALIZACIÓN

# Dimensiones y nombres de columnas
dim(vivienda)
## [1] 8322   13
names(vivienda)
##  [1] "id"           "zona"         "piso"         "estrato"      "preciom"     
##  [6] "areaconst"    "parqueaderos" "banios"       "habitaciones" "tipo"        
## [11] "barrio"       "longitud"     "latitud"
# Tipos de datos
sapply(vivienda, class)
##           id         zona         piso      estrato      preciom    areaconst 
##    "numeric"  "character"  "character"    "numeric"    "numeric"    "numeric" 
## parqueaderos       banios habitaciones         tipo       barrio     longitud 
##    "numeric"    "numeric"    "numeric"  "character"  "character"    "numeric" 
##      latitud 
##    "numeric"

3.2 Análisis de Variables Categóricas

En esta sección, se realizó un análisis detallado de las variables categóricas presentes en el conjunto de datos. Este análisis permite entender la distribución y frecuencia de diferentes categorías, lo que es esencial para identificar patrones y tendencias en el mercado inmobiliario. A continuación, se presentan las interpretaciones para cada subconjunto de datos categóricos analizados:

Frecuencia por Zona:

Distribución Geográfica: La mayoría de las propiedades se concentran en la Zona Sur con 4726 registros, lo que indica una alta actividad inmobiliaria en esa área. La Zona Norte también muestra una actividad significativa con 1920 registros. En contraste, la Zona Oriente y la Zona Centro tienen una menor representación, lo que podría indicar un menor dinamismo inmobiliario o una menor disponibilidad de propiedades en esas áreas. Frecuencia por Piso:

Distribución por Nivel del Inmueble: Los datos muestran que el Piso 02 es el más frecuente con 1450 registros, seguido del Piso 01 con 860 registros. Esta distribución sugiere que la mayoría de las propiedades en el dataset se encuentran en los primeros niveles de los edificios, lo cual es común en el mercado inmobiliario. Los pisos más altos, como el Piso 10 y superiores, tienen una menor frecuencia, indicando que son menos comunes o menos demandados. Frecuencia por Tipo:

Tipo de Propiedad: Hay una clara predominancia de Apartamentos con 5100 registros en comparación con Casas que tienen 3219 registros. Esto refleja una tendencia hacia la urbanización y el desarrollo de complejos residenciales en forma de apartamentos, posiblemente debido a la demanda de espacios más pequeños y accesibles en las zonas urbanas. Frecuencia por Barrio:

Distribución por Barrio: El análisis por barrio revela una gran diversidad en las ubicaciones, con algunos barrios como Valle del Lili y Ciudad Jardín siendo los más representados, con 1008 y 516 registros respectivamente. Esto sugiere que estas áreas son altamente populares y probablemente representan zonas de alto crecimiento o mayor demanda inmobiliaria. En contraste, muchos barrios tienen muy pocas propiedades registradas, lo que puede indicar áreas menos desarrolladas o con menor actividad inmobiliaria.

# Gráfico de barras para las variables categóricas
ggplot(data.frame(zona = names(zona_table), frecuencia = as.numeric(zona_table)), aes(x = reorder(zona, frecuencia), y = frecuencia)) +
  geom_bar(stat = "identity") +
  coord_flip() +
  labs(title = "Frecuencia por Zona", x = "Zona", y = "Frecuencia")

ggplot(data.frame(piso = names(piso_table), frecuencia = as.numeric(piso_table)), aes(x = reorder(piso, frecuencia), y = frecuencia)) +
  geom_bar(stat = "identity") +
  coord_flip() +
  labs(title = "Frecuencia por Piso", x = "Piso", y = "Frecuencia")

ggplot(data.frame(tipo = names(tipo_table), frecuencia = as.numeric(tipo_table)), aes(x = tipo, y = frecuencia)) +
  geom_bar(stat = "identity") +
  labs(title = "Frecuencia por Tipo", x = "Tipo", y = "Frecuencia")

# Mostrar solo las categorías más frecuentes en 'barrio'
top_barrio <- head(sort(barrio_table, decreasing = TRUE), 10)
ggplot(data.frame(barrio = names(top_barrio), frecuencia = as.numeric(top_barrio)), aes(x = reorder(barrio, frecuencia), y = frecuencia)) +
  geom_bar(stat = "identity") +
  coord_flip() +
  labs(title = "Frecuencia por Barrio (Top 10)", x = "Barrio", y = "Frecuencia")

3.3 Análisis de Variables Numéricas

Las gráficas de distribución muestran cómo se distribuyen las diferentes variables numéricas en el conjunto de datos de propiedades residenciales.

-Estrato: La mayoría de las propiedades se concentran en los estratos 4 y 5, lo cual es típico de zonas urbanas donde hay una mezcla de clases socioeconómicas medias y altas. Este patrón indica que la mayoría de las viviendas se encuentran en áreas con un nivel socioeconómico medio-alto.

-Precio por Metro Cuadrado (preciom): Se observa que la distribución del precio por metro cuadrado está sesgada hacia la derecha, con una concentración alta de precios en el rango bajo a medio y algunos valores extremos muy elevados. Esto sugiere que la mayoría de las propiedades son de precios accesibles, pero hay algunas propiedades de lujo que elevan el rango de precios.

-Área Construida (areaconst): La mayoría de las propiedades tienen áreas construidas relativamente pequeñas, pero la presencia de valores altos en la distribución indica que también hay algunas propiedades con áreas significativamente grandes, posiblemente debido a la inclusión de casas o edificios comerciales en el conjunto de datos.

-Parqueaderos, Baños, y Habitaciones: Estas variables también presentan distribuciones asimétricas. La mayoría de las propiedades tienen entre 1 y 2 parqueaderos, 2 a 3 baños, y 3 a 4 habitaciones, lo cual es consistente con viviendas estándar familiares. Sin embargo, los valores más altos sugieren que también hay propiedades con múltiples espacios que podrían ser comerciales o de mayor tamaño.

-Longitud y Latitud: La distribución de estas variables permite entender la localización geográfica de las propiedades en el espacio, siendo esenciales para análisis geoespaciales. Las densidades más altas se agrupan en ciertas áreas de la ciudad, lo que puede estar relacionado con zonas de alta demanda o desarrollo.

#Densidad de las Variables Numéricas El análisis de densidad permite identificar la concentración de datos en ciertos rangos y observar la forma general de la distribución:

-Estrato: La densidad muestra picos claros en los estratos 4 y 5, confirmando que la mayoría de las propiedades se encuentran en estos niveles. Los picos también indican que estos estratos son los más comunes en el área urbana analizada.

-Precio por Metro Cuadrado (preciom): La densidad de precios revela una concentración significativa en el rango bajo, con una disminución gradual en los precios más altos. Esto refuerza la idea de que las propiedades de lujo son menos comunes.

-Área Construida (areaconst): La densidad sugiere que aunque la mayoría de las propiedades son pequeñas, existe una minoría significativa con áreas construidas grandes, lo que puede influir en las decisiones de mercado, especialmente en estrategias de segmentación.

-Parqueaderos, Baños, y Habitaciones: Estas densidades muestran que la mayoría de las propiedades tienen configuraciones familiares estándar, pero también hay una diversidad en términos de espacios adicionales, que puede ser de interés para segmentos específicos del mercado.

-Longitud y Latitud: Los gráficos de densidad confirman las áreas de alta concentración geográfica, lo cual es útil para comprender patrones de urbanización y distribución de la oferta inmobiliaria.

# Cargar la librería gridExtra
library(gridExtra)

# Función para crear gráficos de histogramas y densidad
crear_graficos <- function(df, var) {
  p_histogram <- ggplot(df, aes_string(x = var)) + 
    geom_histogram(binwidth = 10, fill = "blue", color = "black", alpha = 0.7) +
    ggtitle(paste("Distribución de", var)) +
    xlab(var) +
    ylab("Frecuencia") +
    theme_minimal()
  
  p_density <- ggplot(df, aes_string(x = var)) +
    geom_density(fill = "blue", alpha = 0.7) +
    ggtitle(paste("Densidad de", var)) +
    xlab(var) +
    ylab("Densidad") +
    theme_minimal()
  
  list(histogram = p_histogram, density = p_density)
}

# Definir las variables numéricas
variables_numericas <- c("estrato", "preciom", "areaconst", "parqueaderos", "banios", "habitaciones", "longitud", "latitud")

# Crear listas para almacenar los gráficos
histogramas <- list()
densidades <- list()

# Aplicar la función a cada variable numérica
for (var in variables_numericas) {
  graficos <- crear_graficos(vivienda, var)
  histogramas[[var]] <- graficos$histogram
  densidades[[var]] <- graficos$density
}

# Mostrar todos los histogramas en una cuadrícula
grid.arrange(grobs = histogramas, ncol = 2)

# Mostrar todas las densidades en otra cuadrícula
grid.arrange(grobs = densidades, ncol = 2)

# Imprimir resumen de datos
summary(vivienda[, variables_numericas])
##     estrato         preciom         areaconst       parqueaderos   
##  Min.   :3.000   Min.   :  58.0   Min.   :  30.0   Min.   : 1.000  
##  1st Qu.:4.000   1st Qu.: 220.0   1st Qu.:  80.0   1st Qu.: 1.000  
##  Median :5.000   Median : 330.0   Median : 123.0   Median : 2.000  
##  Mean   :4.634   Mean   : 433.9   Mean   : 174.9   Mean   : 1.835  
##  3rd Qu.:5.000   3rd Qu.: 540.0   3rd Qu.: 229.0   3rd Qu.: 2.000  
##  Max.   :6.000   Max.   :1999.0   Max.   :1745.0   Max.   :10.000  
##  NA's   :3       NA's   :2        NA's   :3        NA's   :1605    
##      banios        habitaciones       longitud         latitud     
##  Min.   : 0.000   Min.   : 0.000   Min.   :-76.59   Min.   :3.333  
##  1st Qu.: 2.000   1st Qu.: 3.000   1st Qu.:-76.54   1st Qu.:3.381  
##  Median : 3.000   Median : 3.000   Median :-76.53   Median :3.416  
##  Mean   : 3.111   Mean   : 3.605   Mean   :-76.53   Mean   :3.418  
##  3rd Qu.: 4.000   3rd Qu.: 4.000   3rd Qu.:-76.52   3rd Qu.:3.452  
##  Max.   :10.000   Max.   :10.000   Max.   :-76.46   Max.   :3.498  
##  NA's   :3        NA's   :3        NA's   :3        NA's   :3

3.4 Limpieza y Normalización de Datos

3.4.1 Manejo de Valores Nulos

En esta sección, se abordó el tratamiento de los valores nulos presentes en las variables del conjunto de datos. El manejo de valores nulos es crucial para asegurar la integridad de los análisis posteriores, evitando sesgos y errores en la interpretación de resultados.

-Identificación de Valores Nulos: Inicialmente, se realizó un conteo de los valores nulos en cada una de las variables categóricas y numéricas. Esto permite identificar las variables que necesitan intervención, ya sea mediante eliminación o imputación de datos faltantes.

-Eliminación de Filas con ID Nulo: Se decidió eliminar las filas que tenían valores nulos en la columna id, ya que esta columna es clave para la identificación de registros únicos. La eliminación de estas filas asegura que cada observación en el conjunto de datos es válida y única.

-Imputación de Valores Nulos: Para las variables categóricas y numéricas con valores nulos, se aplicó una estrategia de imputación:

-Piso: Se imputaron los valores nulos de la variable piso basándose en la moda de la categoría zona, es decir, el valor más común dentro de cada zona.

-Parqueaderos: Se imputaron los valores nulos en la variable parqueaderos también utilizando la moda dentro de cada zona. Este enfoque asegura que los valores imputados sean consistentes con los patrones observados en los datos. El proceso de imputación reduce la pérdida de información que podría ocurrir si se eliminaran todas las filas con datos faltantes, preservando así la cantidad de datos disponibles para el análisis.

3.4.2 Manejo de valores nulos

# Contar valores nulos por variable
valores_nulos <- sapply(vivienda, function(x) sum(is.na(x)))

# Separar las variables categóricas y numéricas
variables_categoricas <- c("zona", "piso", "tipo", "barrio", "barrio_normalizado")
variables_numericas <- c("id", "estrato", "preciom", "areaconst", "parqueaderos", "banios", "habitaciones", "longitud", "latitud")

# Contar valores nulos en variables categóricas
nulos_categoricas <- valores_nulos[variables_categoricas]
print("Valores nulos en variables categóricas:")
## [1] "Valores nulos en variables categóricas:"
print(nulos_categoricas)
##   zona   piso   tipo barrio   <NA> 
##      3   2638      3      3     NA
# Contar valores nulos en variables numéricas
nulos_numericas <- valores_nulos[variables_numericas]
print("Valores nulos en variables numéricas:")
## [1] "Valores nulos en variables numéricas:"
print(nulos_numericas)
##           id      estrato      preciom    areaconst parqueaderos       banios 
##            3            3            2            3         1605            3 
## habitaciones     longitud      latitud 
##            3            3            3
# Eliminar las filas que tienen valores nulos en la columna 'id'
vivienda <- vivienda[!is.na(vivienda$id), ] # ACTUALIZACIÓN

# Contar valores nulos por variable después de la eliminación
valores_nulos <- sapply(vivienda, function(x) sum(is.na(x)))

# Mostrar los valores nulos por variable
print(valores_nulos)
##           id         zona         piso      estrato      preciom    areaconst 
##            0            0         2635            0            0            0 
## parqueaderos       banios habitaciones         tipo       barrio     longitud 
##         1602            0            0            0            0            0 
##      latitud 
##            0
# Imputación basada en la moda de 'piso' dentro de cada 'zona'
vivienda <- vivienda %>%
  group_by(zona) %>%
  mutate(
    piso = ifelse(is.na(piso), as.character(names(sort(table(piso), decreasing = TRUE)[1])), piso),
    parqueaderos = ifelse(is.na(parqueaderos), as.numeric(names(sort(table(parqueaderos), decreasing = TRUE)[1])), parqueaderos)
  ) %>%
  ungroup() # ACTUALIZACIÓN

# Verificar los valores nulos restantes en 'piso'
sum(is.na(vivienda$piso))
## [1] 0

3.4.3 Detección y Manejo de Outliers

En este contexto, los outliers identificados en las propiedades de Cali, Colombia, son particularmente interesantes porque reflejan el comportamiento único y diverso del mercado inmobiliario en esta ciudad.

-Visualización de Outliers: Se generaron boxplots para cada variable numérica, lo que permitió identificar visualmente los outliers. Los boxplots muestran la mediana, los cuartiles y los valores atípicos, proporcionando una imagen clara de la distribución de los datos.

Estrato, Precio, Área Construida, Parqueaderos, Baños, Habitaciones, Longitud, Latitud: Los boxplots revelaron la presencia de outliers en varias variables, algunos de los cuales son extremos. Estos outliers pueden representar propiedades que son atípicas en comparación con la mayoría, como viviendas de lujo o propiedades comerciales con características exclusivas. Decisiones sobre los Outliers: En este análisis, se decidió no eliminar ni modificar los outliers. Esta elección se basa en el reconocimiento de que en Cali, Colombia, es común encontrar viviendas con características excepcionales o atípicas. Por ejemplo, casas en barrios exclusivos o propiedades con grandes extensiones de terreno. Mantener estos outliers en el análisis permite capturar toda la variabilidad del mercado inmobiliario, proporcionando una visión más completa y precisa.

# Crear un boxplot para cada variable numérica en una disposición de gráficos
numeric_vars <- c("estrato", "preciom", "areaconst", "parqueaderos", "banios", "habitaciones", "longitud", "latitud")

# Establecer la disposición de la ventana gráfica para mostrar múltiples gráficos
par(mfrow = c(2, 4))  # 

# Generar boxplots
for (var in numeric_vars) {
  boxplot(vivienda[[var]], main = paste("Boxplot de", var), ylab = var)
}

# Restablecer la disposición de la ventana gráfica a la predeterminada
par(mfrow = c(1, 1))

4. Análisis Componentes Principales

4.1 Escalamiento de las variables numéricas

Se aplica un Análisis de Componentes Principales (ACP) a las características numéricas de las viviendas en Cali, Colombia. El objetivo fue simplificar los datos, reduciendo el número de variables mientras se retiene la mayor parte de la información.

Resultados Clave: Primer Componente Principal (PC1): Explica el 57.33% de la variabilidad total en los datos.Esto significa que más de la mitad de la información en los datos originales puede ser representada por este único componente.

Segundo Componente Principal (PC2): Añade un 20.51% adicional de la variabilidad. Combinado con PC1, los dos primeros componentes explican el 77.84% de la variabilidad total.

Simplificación: Se puede representar las características originales de las viviendas (como el precio, el tamaño, el número de baños, etc.) utilizando solo estos dos componentes, en lugar de todas las variables. Esto hace que el análisis sea más manejable y fácil de visualizar.

Visualización: Estos dos componentes permiten visualizar las relaciones entre las viviendas en un espacio reducido (2D), lo que es útil para identificar patrones y agrupaciones.

# Seleccionar las variables numéricas relevantes para el ACP, excluyendo 'longitud' y 'latitud'
variables_numericas <- c("estrato", "preciom", "areaconst", "parqueaderos", "banios", "habitaciones")

# Escalar las variables numéricas
vivienda_scaled <- scale(vivienda[, variables_numericas])
head(vivienda_scaled)  # Verificar los primeros registros
##         estrato    preciom  areaconst parqueaderos      banios habitaciones
## [1,] -1.5872276 -0.5595498 -0.7339949   -0.6468833 -0.07793773    1.6406840
## [2,] -1.5872276 -0.3465670 -0.3842568   -0.6468833 -0.77811479   -0.4147626
## [3,] -1.5872276 -0.2552886  0.3152194    0.2955724 -0.77811479    0.2703863
## [4,] -0.6156201 -0.1031580  0.7349051    1.2380282  1.32241640   -0.4147626
## [5,]  0.3559875 -0.5291236 -0.5940997   -0.6468833 -0.77811479   -0.4147626
## [6,]  0.3559875 -0.5899759 -0.6150839   -0.6468833 -0.07793773   -0.4147626
# Realizar el Análisis de Componentes Principales (ACP)
res.pca <- prcomp(vivienda_scaled, center = TRUE, scale. = TRUE)

# Resumen del ACP
summary(res.pca)
## Importance of components:
##                           PC1    PC2     PC3     PC4     PC5     PC6
## Standard deviation     1.8547 1.1092 0.71408 0.62752 0.48889 0.43253
## Proportion of Variance 0.5733 0.2051 0.08498 0.06563 0.03984 0.03118
## Cumulative Proportion  0.5733 0.7784 0.86335 0.92898 0.96882 1.00000

4.2 Interpretar los resultados

El Análisis de Componentes Principales (ACP) realizado sobre las variables seleccionadas revela que los dos primeros componentes principales, PC1 y PC2, capturan el 77.83% de la variabilidad total presente en los datos. Esto sugiere que estos dos componentes contienen la mayoría de la información necesaria para entender las relaciones entre las variables que describen las características de las viviendas en Cali. En otras palabras, aunque los datos originales incluyen varias dimensiones, el ACP nos permite reducir esta complejidad a solo dos dimensiones principales sin perder mucha información esencial. Esta reducción facilita la visualización y la interpretación de los patrones subyacentes en el mercado inmobiliario, lo que es particularmente útil para identificar tendencias y hacer predicciones basadas en un conjunto de datos más manejable y menos ruidoso.

# Desviaciones estándar de los componentes principales
res.pca$sdev
## [1] 1.8547043 1.1091831 0.7140783 0.6275200 0.4888913 0.4325284
# Valores propios (lambda)
valores_propios <- res.pca$sdev^2

# Porcentaje de variabilidad explicada por cada componente
var_explicada <- valores_propios / sum(valores_propios) * 100

# Mostrar el porcentaje de variabilidad explicada
var_explicada
## [1] 57.332137 20.504787  8.498463  6.563022  3.983578  3.118013

4.3 Gráfico de porcentaje de variabilidad explicada

El gráfico de codo (Scree plot) muestra que el primer componente principal (PC1) explica el 57.3% de la variabilidad total en los datos, lo que significa que más de la mitad de la información original se puede representar en una sola dimensión. El segundo componente principal (PC2) captura un 20.5% adicional de la variabilidad, elevando el total acumulado a un 77.8% cuando se consideran ambos componentes. Esto indica que las dos primeras dimensiones son suficientes para capturar la mayor parte de la estructura subyacente en los datos. Los componentes restantes (PC3 a PC6) explican fracciones mucho menores de la variabilidad total, con valores que oscilan entre 8.5% y 3.1%. Por lo tanto, para simplificar el análisis sin perder demasiada información, podemos enfocarnos en los dos primeros componentes.

# Instalar el paquete factoextra 
if (!require(factoextra)) {
  install.packages("factoextra")
}
library(factoextra)

# Gráfico de porcentaje de variabilidad explicada
fviz_eig(res.pca, addlabels = TRUE)

4.4 Visualización de los resultados

El gráfico de correlación de variables muestra que los componentes principales capturan patrones importantes del mercado inmobiliario en Cali. El primer componente, que explica el 57.3% de la variabilidad, está fuertemente influenciado por variables como el precio, el estrato y los parqueaderos, indicando que estas características están interrelacionadas y juegan un papel clave en la estructura del mercado. El segundo componente, que captura un 20.5% adicional de la variabilidad, está dominado por el número de habitaciones, lo que sugiere que la cantidad de espacio habitable es otra dimensión crucial para entender las diferencias entre las propiedades. Las variables como el área construida y los baños también aportan significativamente a la variabilidad explicada, reflejando cómo estos aspectos están asociados con el valor y la categoría de las viviendas. En conjunto, estos componentes ofrecen una visión clara de las principales dimensiones que explican las diferencias en las propiedades del mercado, revelando las relaciones subyacentes entre las características de las viviendas en Cali.

# Verificar la coherencia entre las filas de vivienda y res.pca
nrow_vivienda <- nrow(vivienda)
nrow_pca <- nrow(res.pca$x)

cat("Número de filas en vivienda:", nrow_vivienda, "\n")
## Número de filas en vivienda: 8319
cat("Número de filas en res.pca$x:", nrow_pca, "\n")
## Número de filas en res.pca$x: 8319
if (nrow_pca == nrow_vivienda) {
  rownames(res.pca$x) <- rownames(vivienda)
} else {
  cat("Error: el número de filas no coincide. No se puede asignar los nombres de las filas.\n")
}

# Circulo de correlación (sin 'longitud' y 'latitud')
fviz_pca_var(res.pca,
             col.var = "contrib", # Color por contribución a los componentes principales
             gradient.cols = c("#FF7F00",  "#034D94"), # Gradiente de colores
             repel = TRUE     # Evitar superposición de texto
)

El gráfico de individuos muestra la dispersión de las propiedades en función de las dos primeras dimensiones del análisis. La mayoría de las propiedades están concentradas en la parte central del gráfico, lo que indica una similitud general en las características analizadas. Sin embargo, también se observan algunas propiedades que se encuentran alejadas del centro, sugiriendo que estas poseen características distintivas o atípicas en comparación con el resto. La primera dimensión, que explica la mayor parte de la varianza, separa claramente a las propiedades con valores altos en las variables relacionadas con la estructura y precio, mientras que la segunda dimensión ofrece una separación adicional basada en el número de habitaciones y el área construida. Este patrón sugiere que, aunque la mayoría de las propiedades comparten características comunes, existen subgrupos de viviendas con particularidades significativas que las diferencian en el mercado inmobiliario de Cali.

# Nube de individuos
fviz_pca_ind(res.pca, col.ind = "blue")

En el biplot del ACP, las dos primeras dimensiones capturan una porción significativa de la variabilidad en los datos. La primera dimensión, dominada por variables como estrato y precio, separa las observaciones según niveles socioeconómicos y valores de mercado. La segunda dimensión, con un énfasis en el número de habitaciones, diferencia propiedades más grandes de aquellas más pequeñas. La dispersión de los datos muestra que, aunque muchas propiedades comparten características comunes, hay un grupo distintivo que se destaca por valores extremos en ciertas variables, sugiriendo la presencia de viviendas más exclusivas o atípicas. Esta diferenciación es clave para identificar segmentos específicos en el mercado inmobiliario de Cali

# Generar el biplot
fviz_pca_biplot(res.pca, repel = TRUE)

5. Análisis de Conglomerados

En el análisis de conglomerados jerárquicos realizado utilizando las coordenadas de los componentes principales derivados del ACP, se aplicó el método de Ward para agrupar las propiedades en función de sus características similares. Este método es eficaz para minimizar la varianza dentro de los conglomerados, lo que resulta en la formación de grupos más homogéneos.

5.1 Realización del Clustering Hierarchical

# Instalar y cargar las librerías necesarias
if (!require(FactoMineR)) {
  install.packages("FactoMineR")
}
if (!require(factoextra)) {
  install.packages("factoextra")
}
if (!require(dplyr)) {
  install.packages("dplyr")
}
if (!require(tidyr)) {
  install.packages("tidyr")
}
library(FactoMineR)
library(factoextra)
library(dplyr)
library(tidyr)

# Realizar el clustering jerárquico utilizando las coordenadas de los componentes principales
# Usamos el método de Ward para el clustering jerárquico
dist_matrix <- dist(res.pca$x)  # Calculamos la matriz de distancias
clustering <- hclust(dist_matrix, method = "ward.D2")  # Aplicamos el método de Ward

# Determinar el número óptimo de clusters y cortar el dendrograma
num_clusters <- 4  # Ajusta según sea necesario
clusters <- cutree(clustering, k = num_clusters)

# Añadir los clusters a los datos originales
vivienda$Cluster <- clusters

5.2 Visualización del Clustering

El dendrograma resultante del análisis de conglomerados jerárquicos aplicado a las viviendas en Cali muestra cómo las propiedades se agrupan en cuatro conglomerados principales, evidenciados por los cortes rojos en el gráfico. La altura en el dendrograma representa la disimilitud entre los conglomerados: cuanto mayor es la altura, más diferentes son los grupos entre sí. En la base del dendrograma, cada hoja representa una propiedad individual, y a medida que se asciende, las propiedades se agrupan en clústeres basados en sus similitudes.

Los conglomerados formados indican que existen distintas categorías de viviendas en Cali, cada una con características homogéneas dentro del grupo pero diferenciadas de las otras. Estos conglomerados podrían corresponder a diferentes segmentos del mercado inmobiliario, como viviendas económicas, propiedades de gama media, y viviendas de lujo o con características especiales.

# Visualización del dendrograma
plot(clustering, labels = FALSE, main = "Dendrograma del Clustering Jerárquico de Viviendas")
rect.hclust(clustering, k = num_clusters, border = "red")  # Añadir rectángulos para los clusters

El gráfico de clustering basado en ACP muestra la agrupación de las viviendas en cuatro conglomerados diferenciados, cada uno representado por un color y forma distintos. Las dos primeras dimensiones capturan la variabilidad más significativa de los datos y permiten visualizar cómo las propiedades se distribuyen y agrupan en el espacio multidimensional.

Observando la disposición de los conglomerados, se puede inferir que existen características comunes dentro de cada grupo que los separan de los demás. El conglomerado en rojo, que se encuentra en la parte superior del gráfico, incluye viviendas con características más extremas o atípicas en comparación con los otros grupos. Por otro lado, el conglomerado azul en la parte inferior izquierda parece estar más compacto, lo que sugiere una mayor homogeneidad en las características de las viviendas dentro de este grupo.

Los conglomerados amarillo y gris muestran cierta superposición, lo que indica que las viviendas en estos grupos comparten varias características en común, aunque se diferencian en algunas dimensiones específicas.

# Visualización de los clusters en el espacio de componentes principales
fviz_cluster(list(data = res.pca$x, cluster = clusters), 
             palette = "jco", 
             ggtheme = theme_minimal(),
             main = "Clustering de Viviendas basado en ACP",
             geom = "point", 
             show.clust.cent = FALSE)

5.3 Descripción de los Clusters

El análisis de la descripción de los clusters muestra diferencias claras entre los grupos en términos de las características promedio de las viviendas. El Cluster 1, con un estrato promedio de 4.01, tiene viviendas con un tamaño de área construida considerable (309.12 m²) y un precio promedio relativamente alto (474.29), además de contar con un promedio de 1.54 parqueaderos y 4.58 baños. Este cluster parece representar viviendas de tamaño medio a grande, con un buen número de baños, lo que sugiere que podrían estar ubicadas en zonas residenciales de clase media.

El Cluster 2 presenta un estrato promedio más bajo (3.55), con viviendas de menor tamaño (86.52 m²) y un precio promedio significativamente menor (184.83). Las viviendas en este grupo tienen menos parqueaderos (1.07) y baños (1.85). Este cluster parece agrupar viviendas más modestas, posiblemente ubicadas en áreas de menor nivel socioeconómico.

El Cluster 3, con un estrato promedio de 5.14, se asemeja al Cluster 1 en cuanto al precio promedio (411.90) y el número de parqueaderos (1.60), pero las viviendas son más pequeñas (144.31 m²). Este cluster podría representar una mezcla de viviendas de clase media-alta, con un enfoque en áreas de mayor estrato pero de menor tamaño comparado con las del Cluster 1.

Finalmente, el Cluster 4 se destaca por tener el estrato más alto (5.68) y viviendas con el precio promedio más elevado (1122.25), así como la mayor área construida (405.86 m²). Además, estas viviendas tienen el mayor promedio de parqueaderos (3.77) y baños (4.99). Este cluster claramente agrupa las viviendas más lujosas, probablemente situadas en zonas exclusivas de la ciudad, con grandes áreas construidas y múltiples comodidades.

# Resumen descriptivo por cluster
Base_Final <- cbind(vivienda[, variables_numericas], Cluster = vivienda$Cluster)

summary_by_cluster <- Base_Final %>%
  group_by(Cluster) %>%
  summarise_all(list(mean = mean, sd = sd))

summary_by_cluster

5.4 Visualización de la Distribución de Variables por Cluster

Se observa cómo las características de las viviendas se agrupan en diferentes clústeres que reflejan variaciones significativas en las propiedades físicas y económicas de las mismas.

Cluster 1 se caracteriza por viviendas con un mayor número de habitaciones, áreas construidas considerables, un precio medio-alto, y una mayor cantidad de baños y parqueaderos. Esto sugiere que este clúster agrupa viviendas que podrían estar en sectores de mayor estrato y con un valor elevado.

Cluster 2, por otro lado, agrupa viviendas con menos áreas construidas, un número reducido de habitaciones, baños y parqueaderos, y un precio significativamente más bajo. Este grupo podría corresponder a viviendas en sectores de menor estrato, posiblemente más económicos y de menor tamaño.

Cluster 3 presenta un comportamiento intermedio en cuanto a las variables de interés. Las viviendas en este clúster tienen una cantidad moderada de habitaciones, baños y parqueaderos, con un precio y área construida también moderados. Este clúster podría representar viviendas de clase media, con características balanceadas en comparación con los otros clústeres.

Cluster 4 agrupa las viviendas de mayor valor y tamaño, evidenciado por el mayor promedio en preciom, areaconst, y un mayor número de baños y parqueaderos. Este clúster está claramente definido por propiedades de lujo o en sectores de alta gama, posiblemente en zonas exclusivas de la ciudad.

# Crear gráficos de densidad para cada variable por cluster
Base_Final %>%
  pivot_longer(-Cluster, names_to = "variable", values_to = "value") %>%
  ggplot(aes(x = value, fill = as.factor(Cluster))) +
  geom_density(alpha = 0.5) +
  facet_wrap(~ variable, scales = "free") +
  labs(title = "Densidad de Variables por Cluster") +
  theme_minimal()

# Crear boxplots para las variables por cluster
Base_Final %>%
  gather(key = "variable", value = "value", -Cluster) %>%
  ggplot(aes(x = as.factor(Cluster), y = value, fill = as.factor(Cluster))) +
  geom_boxplot() +
  facet_wrap(~ variable, scales = "free") +
  labs(title = "Distribución de Variables por Cluster") +
  theme_minimal()

6. Análisis de Correspondencia

6.1 Seleccionar y preparar las variables cualitativas

El análisis de correspondencia múltiple muestra asociaciones claras entre el tipo de vivienda, la zona y el estrato socioeconómico en Cali. En el gráfico, las categorías que están más alejadas del origen indican una mayor influencia en la variabilidad de los datos. Por ejemplo, la “Zona Oriente” y “Zona Centro” están vinculadas con el estrato 3, lo que sugiere que estas áreas tienen mayor concentración de viviendas de nivel socioeconómico medio. Por otro lado, la “Zona Oeste” se asocia principalmente con el estrato 6, indicando que es una zona de viviendas de alta gama. Además, se observa una diferenciación entre apartamentos y casas, donde los apartamentos están más relacionados con zonas de estrato medio y alto, mientras que las casas presentan una mayor diversidad en cuanto al estrato socioeconómico.

# Se seleccionan las variables categóricas relevantes para el análisis
variables_cualitativas <- vivienda[, c("tipo", "zona", "estrato")]

# Convertir las variables a factores para asegurar que se manejen como categóricas
variables_cualitativas$tipo <- as.factor(variables_cualitativas$tipo)
variables_cualitativas$zona <- as.factor(variables_cualitativas$zona)
variables_cualitativas$estrato <- as.factor(variables_cualitativas$estrato)

# Realizar el Análisis de Correspondencias Múltiples (ACM)
# Se ejecuta el ACM para explorar las relaciones entre las variables categóricas seleccionadas
resultado_acm <- MCA(variables_cualitativas, graph = FALSE)

# Visualización de los resultados del ACM
# Se presenta un gráfico de las categorías que más contribuyen a la explicación de la inercia
fviz_mca_var(resultado_acm, 
             select.var = list(contrib = 15),  # Se seleccionan las 15 categorías con mayor contribución
             repel = TRUE)                      # Se ajustan las etiquetas para evitar superposiciones

## 6.2 Contribución total las variables cualitativas Al analizar las contribuciones de las variables categóricas en las primeras dos dimensiones del Análisis de Correspondencias Múltiples (MCA), se observa que ciertas zonas de la ciudad tienen un peso considerable en la explicación de la variabilidad. En la primera dimensión, la Zona Oriente y el estrato 3 destacan por su alta contribución, lo que sugiere que las propiedades en esta área y nivel socioeconómico tienen características que las diferencian claramente del resto. En la segunda dimensión, la Zona Oeste y el estrato 6 son los más influyentes, lo que indica una diferenciación marcada en las propiedades situadas en esta zona de alto estrato.

Además, la visualización de las categorías confirma que algunas zonas y estratos están estrechamente relacionados, reflejando patrones específicos en la distribución de viviendas. Las categorías como “Zona Oriente” y “estrato 3” se agrupan en posiciones extremas, mientras que “Apartamento” y “Zona Sur” se asocian a valores más centrales, sugiriendo que estas últimas tienen características más comunes entre las distintas zonas.

Finalmente, los gráficos de calidad de representación (cos2) muestran que las variables como la Zona Oeste y la Zona Oriente están bien representadas en las dos primeras dimensiones, mientras que otras como “Apartamento” y “Zona Norte” tienen una representación más moderada. Esto implica que las primeras dimensiones capturan de manera efectiva las características más relevantes de estas categorías, lo que ayuda a entender mejor la estructura subyacente en la distribución de viviendas en diferentes zonas y estratos de la ciudad.

# Adicionalmente, se muestra la contribución total de las variables a las dos primeras dimensiones
fviz_contrib(resultado_acm, choice = "var", axes = 1, top = 15)  # Contribuciones en la primera dimensión

fviz_contrib(resultado_acm, choice = "var", axes = 2, top = 15)  # Contribuciones en la segunda dimensión

# Visualización de la calidad de representación (cos2) de las categorías
fviz_mca_var(resultado_acm, 
             col.var = "cos2", 
             gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"), 
             repel = TRUE)

7. Conclusiones

El análisis de componentes principales (ACP) realizado en el conjunto de datos de viviendas en Cali ha revelado importantes aspectos sobre la estructura subyacente del mercado inmobiliario de la ciudad. La primera dimensión (Dim1) del ACP, que captura el 57.3% de la variabilidad total de los datos, está dominada por variables relacionadas con el estrato socioeconómico y el precio de las propiedades. Esto sugiere que estos factores son cruciales para diferenciar el valor de las viviendas en Cali, marcando claramente la distinción entre los diferentes segmentos del mercado. La segunda dimensión (Dim2), que explica un 20.5% adicional de la variabilidad, está más relacionada con el número de habitaciones, lo que indica que el tamaño físico de las propiedades también es un diferenciador significativo en el mercado.

Además, el ACP ha mostrado cómo las propiedades en Cali se agrupan según sus características principales, con claras concentraciones que reflejan diferentes segmentos del mercado. Este agrupamiento no solo revela la diversidad del mercado inmobiliario de la ciudad, sino que también destaca la existencia de propiedades atípicas o exclusivas, que ocupan un espacio único dentro del espectro inmobiliario.

El análisis de conglomerados ha permitido segmentar el mercado inmobiliario de Cali en cuatro clústeres bien definidos, cada uno representando un perfil distinto de propiedades y compradores. El Clúster 1 incluye viviendas de alta gama, caracterizadas por un gran número de habitaciones, baños y parqueaderos, lo que las sitúa en estratos altos y zonas exclusivas. Estas propiedades están dirigidas a compradores con un alto poder adquisitivo que buscan viviendas de lujo. En contraste, el Clúster 2 agrupa viviendas más modestas, con menos áreas construidas y un menor número de comodidades, lo que indica un enfoque en la accesibilidad económica, dirigido a un mercado de estrato bajo o medio-bajo.

El Clúster 3 representa una categoría intermedia, con propiedades que ofrecen un equilibrio entre tamaño, precio y comodidades, lo cual podría atraer a la clase media de la ciudad, un segmento considerable del mercado inmobiliario. Por último, el Clúster 4 agrupa propiedades similares en valor y tamaño a las del Clúster 1, pero con posibles diferencias en ubicación o características específicas, lo que sugiere una subsegmentación dentro del mercado de alta gama.

Finalmente, el análisis de correspondencias múltiples (ACM) ha revelado patrones de asociación claros entre las zonas de la ciudad, los tipos de vivienda y los estratos socioeconómicos. Zonas como la Oriente y la Oeste muestran características que las diferencian claramente de otras áreas, y están fuertemente asociadas con estratos más altos, como el estrato 6. Este hallazgo es crucial para entender cómo se distribuyen las viviendas de mayor valor en la ciudad y cómo estos valores se correlacionan con el tipo de construcción predominante, como casas y apartamentos.

8. Recomendaciones

-Segmentación del Mercado: Se recomienda a la empresa inmobiliaria enfocar sus estrategias de marketing y ventas en los diferentes segmentos identificados. Para los clústeres de alto estrato (Clúster 1 y 4), la empresa debe resaltar las características de lujo y exclusividad, mientras que para los clústeres de estrato bajo y medio (Clúster 2 y 3), se debe poner énfasis en la accesibilidad económica y la funcionalidad.

-Estrategias de Ubicación: Considerando la segregación espacial identificada en el ACM, la empresa debe priorizar el desarrollo y promoción de proyectos en zonas que coincidan con el perfil socioeconómico de su mercado objetivo. Zonas como la Oriente y la Oeste, que se asocian con estratos más altos, deben ser vistas como prioritarias para proyectos de alta gama.

-Optimización de Inversiones: Basado en el análisis, se sugiere optimizar la inversión enfocándose en áreas con alta concentración de viviendas de mayor valor, como las asociadas con los estratos 5 y 6. Invertir en el desarrollo de propiedades en estas zonas puede maximizar los retornos en un mercado competitivo.

-Desarrollo de Nuevos Proyectos: Se debe considerar la creación de proyectos que satisfagan las necesidades de los clústeres más equilibrados, como el Clúster 3, que representa a la clase media. Este segmento, que busca un balance entre precio y comodidades, podría beneficiarse de proyectos que ofrezcan viviendas de tamaño moderado con buenas características a precios competitivos.

Anexos

El código completo utilizado para realizar el evaluación de valuación de la oferta inmobiliaria urbana Cali - Colombia está disponible en el siguiente enlace: https://github.com/jhonrd999/datacali/blob/main/Actividad1.R