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
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:
piso (2,638 NAs, ~31%) y parqueaderos (1,605
NAs, ~19%). Eliminar estos registros representaría una pérdida
inaceptable de inteligencia de mercado. Por naturaleza inmobiliaria, las
propiedades tipo “Casa” carecen de un nivel de piso en la plataforma,
por lo que se decide imputar estos valores con el número 1. Para los
parqueaderos vacíos, se imputará estadísticamente.preciom, areaconst,
banios y habitaciones presentan un margen de
error insignificante (entre 2 y 3 valores nulos). Dado que el precio y
el área son los ejes centrales de valoración, se decide eliminar estos
registros específicos, ya que una imputación forzada aportaría ruido
innecesario y su eliminación no afecta la representatividad muestral
(impacto menor al 0.05%).piso se convertirá a formato numérico puro para viabilizar
el cálculo de distancias euclidianas en los algoritmos
multivariantes.# ==========================================
# 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
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:
preciom), el área construida (areaconst), los
baños y parqueaderos. Todas apuntan hacia la derecha, indicando que este
eje mide el “tamaño” general de la propiedad. El área y los baños son
los principales impulsores del precio.piso apunta hacia el cuadrante
superior, mientras que habitaciones apunta hacia el
inferior. El modelo ha segmentado naturalmente el mercado en dos
perfiles: propiedades verticales (apartamentos en pisos
altos con tendencia a tener menos habitaciones) frente a
propiedades horizontales (casas con mayor número de
habitaciones).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.
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.