1. Auditoría y Acondicionamiento de los Datos

Para garantizar que las decisiones estratégicas de la junta directiva se basen en un modelo confiable, se realizó una auditoría inicial sobre la base de datos extraída (8,322 registros y 13 variables). Durante esta fase exploratoria, se identificaron factores técnicos que requerían intervención antes de proceder con la segmentación del mercado:

A continuación, se presenta la ejecución técnica de este diagnóstico inicial:

# Cargamos las librerías necesarias para limpieza
library(paqueteMODELOS)
## Cargando paquete requerido: boot
## Cargando paquete requerido: broom
## Warning: package 'broom' was built under R version 4.5.3
## Cargando paquete requerido: GGally
## Cargando paquete requerido: ggplot2
## Warning: package 'ggplot2' was built under R version 4.5.3
## Cargando paquete requerido: gridExtra
## Cargando paquete requerido: knitr
## Warning: package 'knitr' was built under R version 4.5.3
## Cargando paquete requerido: summarytools
## Warning: package 'summarytools' was built under R version 4.5.3
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.5.3
## 
## Adjuntando el paquete: 'dplyr'
## The following object is masked from 'package:gridExtra':
## 
##     combine
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
# Cargamos la base de datos en nuestro entorno
data("vivienda")

# Diagnóstico de Datos Faltantes (NAs)
conteo_nas <- colSums(is.na(vivienda))
print("--- CONTEO DE DATOS FALTANTES POR COLUMNA ---")
## [1] "--- CONTEO DE DATOS FALTANTES POR COLUMNA ---"
print(conteo_nas)
##           id         zona         piso      estrato      preciom    areaconst 
##            3            3         2638            3            2            3 
## parqueaderos       banios habitaciones         tipo       barrio     longitud 
##         1605            3            3            3            3            3 
##      latitud 
##            3
# Diagnóstico de los textos de la variable 'piso'
print("--- VALORES ÚNICOS EN LA COLUMNA PISO ---")
## [1] "--- VALORES ÚNICOS EN LA COLUMNA PISO ---"
table(vivienda$piso, useNA = "ifany")
## 
##   01   02   03   04   05   06   07   08   09   10   11   12 <NA> 
##  860 1450 1097  607  567  245  204  211  146  130   84   83 2638
# Resumen estadístico para detectar Valores Atípicos (Outliers)
print("--- RESUMEN ESTADÍSTICO DE VARIABLES CLAVE ---")
## [1] "--- RESUMEN ESTADÍSTICO DE VARIABLES CLAVE ---"
summary(vivienda %>% select(preciom, areaconst, parqueaderos, banios, habitaciones))
##     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   
##  Min.   : 0.000  
##  1st Qu.: 3.000  
##  Median : 3.000  
##  Mean   : 3.605  
##  3rd Qu.: 4.000  
##  Max.   :10.000  
##  NA's   :3

2. Decisiones Estratégicas de Limpieza e Imputación

A partir del diagnóstico técnico, se establecen las siguientes directrices de limpieza para garantizar la viabilidad del Análisis de Componentes Principales (PCA) y el Clustering:

# ==========================================
# LIMPIEZA Y TRANSFORMACIÓN DE DATOS
# ==========================================

# Aseguramos que la caja de herramientas correcta esté abierta
library(dplyr)

# 1. Eliminación de las filas "fantasma" (usando filter en lugar de drop_na)
vivienda_limpia <- vivienda %>% filter(!is.na(id))

# 2. Imputación de NAs en 'piso' (Casas) y 'parqueaderos'
vivienda_limpia <- vivienda_limpia %>%
  mutate(
    piso = ifelse(is.na(piso), "01", piso),
    parqueaderos = ifelse(is.na(parqueaderos), 0, parqueaderos)
  )

# 3. Eliminación de los registros marginales restantes
vivienda_limpia <- vivienda_limpia %>% 
  filter(!is.na(preciom), !is.na(areaconst), !is.na(banios), !is.na(habitaciones))

# 4. Transformación de formato: Convertir 'piso' de texto a número puro
vivienda_limpia <- vivienda_limpia %>%
  mutate(piso = as.numeric(piso))

# 5. Verificación final: Revisamos que la tabla nueva ya no tenga ningún NA
print("--- VERIFICACIÓN DE LIMPIEZA FINAL ---")
## [1] "--- VERIFICACIÓN DE LIMPIEZA FINAL ---"
colSums(is.na(vivienda_limpia))
##           id         zona         piso      estrato      preciom    areaconst 
##            0            0            0            0            0            0 
## parqueaderos       banios habitaciones         tipo       barrio     longitud 
##            0            0            0            0            0            0 
##      latitud 
##            0

3. Análisis de Componentes Principales (PCA)

Con la base de datos saneada, se procede a ejecutar un Análisis de Componentes Principales. El objetivo estratégico de esta técnica es reducir la dimensionalidad de las variables estructurales y financieras de las propiedades, identificando los factores latentes que determinan la varianza de la oferta inmobiliaria urbana.

Nota metodológica: Se aplica un escalado estándar a los datos (scale = TRUE) antes de la ejecución del modelo. Esta decisión técnica es imperativa debido a la disparidad de magnitudes; el preciom se mide en cientos (millones) mientras que variables como banios se miden en unidades simples. Sin este escalado, el modelo le daría un peso falso y desproporcionado al precio.

# ==========================================
# FASE 2: ANÁLISIS DE COMPONENTES PRINCIPALES
# ==========================================

# 1. Filtramos solo las variables cuantitativas puras para el modelo
datos_pca <- vivienda_limpia %>% 
  select(preciom, areaconst, parqueaderos, banios, habitaciones, piso)

# 2. Ejecutamos el modelo PCA (El escalado es vital como justificamos en el texto)
modelo_pca <- prcomp(datos_pca, center = TRUE, scale. = TRUE)

# 3. Resumen estadístico: Cuánta información (varianza) guarda cada componente
print("--- RESUMEN DE VARIANZA EXPLICADA ---")
## [1] "--- RESUMEN DE VARIANZA EXPLICADA ---"
summary(modelo_pca)
## Importance of components:
##                           PC1    PC2    PC3     PC4     PC5     PC6
## Standard deviation     1.7740 1.0568 0.8910 0.65563 0.56419 0.44032
## Proportion of Variance 0.5245 0.1862 0.1323 0.07164 0.05305 0.03231
## Cumulative Proportion  0.5245 0.7107 0.8430 0.91464 0.96769 1.00000
# 4. Generamos el gráfico de relaciones (Biplot)
biplot(modelo_pca, scale = 0, cex = c(0.1, 0.8), 
       col = c("gray90", "red"), 
       main = "Mapa Geométrico del Mercado Inmobiliario")

#### Interpretación del Modelo PCA

El gráfico biplot revela la estructura oculta del mercado inmobiliario urbano mediante dos dimensiones principales que explican la mayor parte de la variación de los datos:

Recomendación a la Dirección: El precio no es aleatorio. Las decisiones de inversión o avalúo de la empresa deben ponderar el “bloque de magnitud” (Área/Baños/Parqueaderos) como el factor decisivo de valor, independientemente de si la propiedad es casa o apartamento. ### 4. Segmentación del Mercado (Clustering K-Means)

Para traducir la complejidad del mercado en estrategias de negocio accionables, se aplicó un algoritmo de partición K-Means. El objetivo de este análisis de conglomerados es descubrir perfiles naturales de propiedades que permitan a la inmobiliaria focalizar sus campañas de marketing y estrategias de fijación de precios.

Se definieron estadísticamente 3 segmentos principales (K=3) procesando las variables previamente estandarizadas. Esta partición permite clasificar la oferta urbana en nichos de mercado claramente diferenciados (ej. perfil económico, perfil estándar/familiar y perfil premium).

# ==========================================
# FASE 3: ANÁLISIS DE CONGLOMERADOS
# ==========================================

# 1. Aplicamos el algoritmo K-Means para buscar 3 segmentos de mercado
set.seed(123) # Esto asegura que la máquina siempre haga los mismos grupos
modelo_kmeans <- kmeans(scale(datos_pca), centers = 3, nstart = 25)

# 2. Guardamos a qué grupo pertenece cada propiedad en nuestra tabla limpia
vivienda_limpia$Segmento <- as.factor(modelo_kmeans$cluster)

# 3. Extraemos las coordenadas del PCA anterior para el gráfico
coordenadas_pca <- as.data.frame(modelo_pca$x)

# 4. Dibujamos el mapa del mercado, pero ahora con colores por segmento!
plot(coordenadas_pca$PC1, coordenadas_pca$PC2,
     col = modelo_kmeans$cluster,    # Pinta cada segmento de un color
     pch = 16,                       # Usa puntos sólidos
     main = "Segmentación Inmobiliaria: 3 Nichos de Mercado",
     xlab = "Componente 1 (Menor valor ---> Mayor valor/Lujo)",
     ylab = "Componente 2 (Casas familiares ---> Apartamentos)")

# Agregamos una leyenda al gráfico
legend("topright", 
       legend = c("Segmento 1", "Segmento 2", "Segmento 3"), 
       fill = 1:3, 
       title = "Perfiles")

#### Interpretación de los Segmentos (Clustering)

El algoritmo K-Means ha agrupado exitosamente el mercado en tres perfiles comerciales, los cuales se evidencian claramente en el mapa:

Conclusión Estratégica: Gracias a esta segmentación multivariante, la inmobiliaria cuenta con respaldo cuantitativo para optimizar sus estrategias comerciales. Se recomienda a la gerencia estructurar tres líneas de captación y venta independientes (Premium, Estándar y Familiar), dirigiendo el presupuesto de marketing a los atributos que estadísticamente valoran los clientes de cada segmento.

5. Análisis de Correspondencia (Variables Categóricas)

Para cumplir con el análisis multidimensional de la oferta, se examinan las relaciones entre las variables categóricas cualitativas del mercado (tipo, zona y barrio) mediante un Análisis de Correspondencia, evaluando cómo se distribuyen los tipos de vivienda según la zona geográfica.

# ==========================================
# FASE 4: ANÁLISIS DE CORRESPONDENCIA
# ==========================================
tabla_contingencia <- table(vivienda_limpia$tipo, vivienda_limpia$zona)
print("--- CRUCE ENTRE TIPO DE VIVIENDA Y ZONA ---")
## [1] "--- CRUCE ENTRE TIPO DE VIVIENDA Y ZONA ---"
print(tabla_contingencia)
##              
##               Zona Centro Zona Norte Zona Oeste Zona Oriente Zona Sur
##   Apartamento          24       1198       1029           62     2787
##   Casa                100        722        169          289     1939
mosaicplot(tabla_contingencia, 
           main = "Mapa de Correspondencia: Tipo de Vivienda vs Zona",
           color = TRUE, 
           las = 1,
           xlab = "Tipo de Inmueble", 
           ylab = "Zona Geográfica")

### 6. Conclusiones y Plan de Acción Estratégico

El análisis multidimensional del mercado inmobiliario permite a la dirección de la empresa pasar de la intuición a la toma de decisiones basada en evidencia cuantitativa. A continuación se detallan los hallazgos y su respectiva contraparte estratégica:

Conclusión Ejecutiva Global: Adoptar esta segmentación basada en datos elimina el riesgo de lanzar campañas masivas ineficientes, permitiendo a la inmobiliaria maximizar el retorno de inversión (ROI) en marketing y asegurar una ventaja competitiva sostenible en el mercado.