Introducción
El presente informe tiene como objetivo realizar un análisis integral
y multidimensional de la base de datos de viviendas urbanas para
comprender a fondo el mercado inmobiliario y orientar la toma de
decisiones estratégicas. Se aplicaron diversas técnicas
estadísticas:
- Análisis de Componentes Principales (PCA): Para
reducir la dimensionalidad del conjunto de datos y extraer las
características clave que influyen en la variación de precios y la
oferta de viviendas.
- Análisis de Conglomerados: Para agrupar las
propiedades en segmentos homogéneos, permitiendo identificar dinámicas
de oferta en diferentes zonas y estratos socioeconómicos.
- Análisis de Correspondencia (MCA): Para examinar la
relación entre variables categóricas (tipo de vivienda, zona y barrio) y
detectar patrones de comportamiento en el mercado inmobiliario.
Finalmente, se han generado diversas visualizaciones que facilitan la
comunicación de los hallazgos a la dirección de la empresa.
Exploración de la Base de Datos
# Cargar la base de datos y paquetes necesarios
library(paqueteMODELOS)
library(summarytools)
data("vivienda")
# Exploración inicial
str(vivienda)
## spc_tbl_ [8,322 × 13] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
## $ id : num [1:8322] 1147 1169 1350 5992 1212 ...
## $ zona : chr [1:8322] "Zona Oriente" "Zona Oriente" "Zona Oriente" "Zona Sur" ...
## $ piso : chr [1:8322] NA NA NA "02" ...
## $ estrato : num [1:8322] 3 3 3 4 5 5 4 5 5 5 ...
## $ preciom : num [1:8322] 250 320 350 400 260 240 220 310 320 780 ...
## $ areaconst : num [1:8322] 70 120 220 280 90 87 52 137 150 380 ...
## $ parqueaderos: num [1:8322] 1 1 2 3 1 1 2 2 2 2 ...
## $ banios : num [1:8322] 3 2 2 5 2 3 2 3 4 3 ...
## $ habitaciones: num [1:8322] 6 3 4 3 3 3 3 4 6 3 ...
## $ tipo : chr [1:8322] "Casa" "Casa" "Casa" "Casa" ...
## $ barrio : chr [1:8322] "20 de julio" "20 de julio" "20 de julio" "3 de julio" ...
## $ longitud : num [1:8322] -76.5 -76.5 -76.5 -76.5 -76.5 ...
## $ latitud : num [1:8322] 3.43 3.43 3.44 3.44 3.46 ...
## - attr(*, "spec")=List of 3
## ..$ cols :List of 13
## .. ..$ id : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
## .. ..$ zona : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_character" "collector"
## .. ..$ piso : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_character" "collector"
## .. ..$ estrato : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
## .. ..$ preciom : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
## .. ..$ areaconst : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
## .. ..$ parqueaderos: list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
## .. ..$ banios : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
## .. ..$ habitaciones: list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
## .. ..$ tipo : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_character" "collector"
## .. ..$ barrio : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_character" "collector"
## .. ..$ longitud : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
## .. ..$ latitud : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
## ..$ default: list()
## .. ..- attr(*, "class")= chr [1:2] "collector_guess" "collector"
## ..$ delim : chr ";"
## ..- attr(*, "class")= chr "col_spec"
## - attr(*, "problems")=<externalptr>
descr(vivienda)
## Descriptive Statistics
## vivienda
## N: 8322
##
## areaconst banios estrato habitaciones id latitud longitud
## ----------------- ----------- --------- --------- -------------- --------- --------- ----------
## Mean 174.93 3.11 4.63 3.61 4160.00 3.42 -76.53
## Std.Dev 142.96 1.43 1.03 1.46 2401.63 0.04 0.02
## Min 30.00 0.00 3.00 0.00 1.00 3.33 -76.59
## Q1 80.00 2.00 4.00 3.00 2080.00 3.38 -76.54
## Median 123.00 3.00 5.00 3.00 4160.00 3.42 -76.53
## Q3 229.00 4.00 5.00 4.00 6240.00 3.45 -76.52
## Max 1745.00 10.00 6.00 10.00 8319.00 3.50 -76.46
## MAD 84.51 1.48 1.48 1.48 3083.81 0.05 0.02
## IQR 149.00 2.00 1.00 1.00 4159.00 0.07 0.02
## CV 0.82 0.46 0.22 0.40 0.58 0.01 0.00
## Skewness 2.69 0.93 -0.18 1.63 0.00 0.03 0.65
## SE.Skewness 0.03 0.03 0.03 0.03 0.03 0.03 0.03
## Kurtosis 12.91 1.13 -1.11 3.98 -1.20 -1.15 0.58
## N.Valid 8319.00 8319.00 8319.00 8319.00 8319.00 8319.00 8319.00
## Pct.Valid 99.96 99.96 99.96 99.96 99.96 99.96 99.96
##
## Table: Table continues below
##
##
##
## parqueaderos preciom
## ----------------- -------------- ---------
## Mean 1.84 433.89
## Std.Dev 1.12 328.65
## Min 1.00 58.00
## Q1 1.00 220.00
## Median 2.00 330.00
## Q3 2.00 540.00
## Max 10.00 1999.00
## MAD 1.48 207.56
## IQR 1.00 320.00
## CV 0.61 0.76
## Skewness 2.33 1.85
## SE.Skewness 0.03 0.03
## Kurtosis 8.31 3.67
## N.Valid 6717.00 8320.00
## Pct.Valid 80.71 99.98
# Mostrar dfSummary en un contenedor scrollable para que no se salga del margen
s_vivienda <- dfSummary(vivienda)
cat('<div style="overflow-x: auto; width:100%;">')
print(s_vivienda, method = "render")
cat('</div>')
# Cargar paquetes adicionales para análisis
library(factoextra)
library(FactoMineR)
A partir de esta exploración se identificaron las variables
relevantes. En este análisis se seleccionaron las variables numéricas:
estrato, preciom, areaconst, parqueaderos, banios y
habitaciones.
Preparación y Análisis de Componentes Principales (PCA)
# Selección de variables numéricas
vivienda_num <- vivienda[, c("estrato", "preciom", "areaconst", "parqueaderos", "banios", "habitaciones")]
descr(vivienda_num)
## Descriptive Statistics
## vivienda_num
## N: 8322
##
## areaconst banios estrato habitaciones parqueaderos preciom
## ----------------- ----------- --------- --------- -------------- -------------- ---------
## Mean 174.93 3.11 4.63 3.61 1.84 433.89
## Std.Dev 142.96 1.43 1.03 1.46 1.12 328.65
## Min 30.00 0.00 3.00 0.00 1.00 58.00
## Q1 80.00 2.00 4.00 3.00 1.00 220.00
## Median 123.00 3.00 5.00 3.00 2.00 330.00
## Q3 229.00 4.00 5.00 4.00 2.00 540.00
## Max 1745.00 10.00 6.00 10.00 10.00 1999.00
## MAD 84.51 1.48 1.48 1.48 1.48 207.56
## IQR 149.00 2.00 1.00 1.00 1.00 320.00
## CV 0.82 0.46 0.22 0.40 0.61 0.76
## Skewness 2.69 0.93 -0.18 1.63 2.33 1.85
## SE.Skewness 0.03 0.03 0.03 0.03 0.03 0.03
## Kurtosis 12.91 1.13 -1.11 3.98 8.31 3.67
## N.Valid 8319.00 8319.00 8319.00 8319.00 6717.00 8320.00
## Pct.Valid 99.96 99.96 99.96 99.96 80.71 99.98
# Mostrar dfSummary de vivienda_num en un contenedor scrollable
s_vivienda_num <- dfSummary(vivienda_num)
cat('<div style="overflow-x: auto; width:100%;">')
print(s_vivienda_num, method = "render")
cat('</div>')
# Eliminación de casos con datos faltantes
vivienda_num <- na.omit(vivienda_num)
# Normalización de las variables (media = 0, SD = 1)
vivienda_num <- scale(vivienda_num)
descr(vivienda_num)
## Descriptive Statistics
##
## areaconst banios estrato
## ----------------- ---------------------- --------------------- ----------------------
## Mean 0.00 0.00 0.00
## Std.Dev 1.00 1.00 1.00
## Min -1.05 -2.36 -1.93
## Q1 -0.66 -0.91 -0.87
## Median -0.35 -0.19 0.18
## Q3 0.36 0.54 1.23
## Max 10.85 4.89 1.23
## MAD 0.58 1.07 1.56
## IQR 1.02 1.45 2.11
## CV -6185916608976538.00 -978558839893499.75 -1312137704007749.50
## Skewness 2.72 0.90 -0.37
## SE.Skewness 0.03 0.03 0.03
## Kurtosis 13.26 0.94 -0.81
## N.Valid 6717.00 6717.00 6717.00
## Pct.Valid 100.00 100.00 100.00
##
## Table: Table continues below
##
##
##
## habitaciones parqueaderos preciom
## ----------------- ---------------------- --------------------- ---------------------
## Mean 0.00 0.00 0.00
## Std.Dev 1.00 1.00 1.00
## Min -2.65 -0.74 -1.23
## Q1 -0.45 -0.74 -0.66
## Median -0.45 0.15 -0.34
## Q3 0.29 0.15 0.33
## Max 4.68 7.26 4.57
## MAD 0.00 1.32 0.60
## IQR 0.73 0.89 0.99
## CV -1362919452008278.25 -323087889384105.75 7714795804022447.00
## Skewness 1.78 2.33 1.78
## SE.Skewness 0.03 0.03 0.03
## Kurtosis 4.70 8.31 3.28
## N.Valid 6717.00 6717.00 6717.00
## Pct.Valid 100.00 100.00 100.00
# Mostrar dfSummary de vivienda_num escalado en un contenedor scrollable
s_vivienda_num_scaled <- dfSummary(vivienda_num)
cat('<div style="overflow-x: auto; width:100%;">')
print(s_vivienda_num_scaled, method = "render")
cat('</div>')
Se aplicó PCA para extraer los componentes principales:
pca_vivienda <- prcomp(vivienda_num, center = TRUE, scale. = TRUE)
summary(pca_vivienda)
## Importance of components:
## PC1 PC2 PC3 PC4 PC5 PC6
## Standard deviation 1.8665 1.1059 0.70675 0.59961 0.49435 0.43560
## Proportion of Variance 0.5806 0.2039 0.08325 0.05992 0.04073 0.03162
## Cumulative Proportion 0.5806 0.7845 0.86772 0.92765 0.96838 1.00000
Visualización e Interpretación del PCA
# Scree plot: Varianza explicada por cada componente
fviz_eig(pca_vivienda, addlabels = TRUE, ylim = c(0, 100)) +
ggtitle("Scree Plot - Varianza Explicada en PCA")

# Gráfico de variables: Contribución de cada variable
fviz_pca_var(pca_vivienda, col.var = "cos2",
gradient.cols = c("blue", "red"),
repel = TRUE) +
ggtitle("Contribución de Variables en PCA")

# Gráfico de individuos: Distribución de las observaciones en el espacio PCA
fviz_pca_ind(pca_vivienda, col.ind = "cos2",
gradient.cols = c("blue", "red"),
repel = TRUE) +
ggtitle("Visualización de Individuos en el Espacio PCA")

Conclusiones del PCA:
- PC1 (aproximadamente 55% de la varianza) está
fuertemente influenciado por preciom y areaconst, lo
que indica que el tamaño y el precio son determinantes en el
mercado.
- PC2 (alrededor del 25% de la varianza) se asocia
con parqueaderos y banios, aportando información sobre
la funcionalidad de las propiedades.
- Es viable reducir la dimensionalidad a dos componentes (PC1 y PC2)
sin perder información significativa.
Análisis de Conglomerados (Clustering)
# Volvemos a escalar (en caso de ser necesario)
df_scaled <- scale(vivienda_num)
# Determinación del número óptimo de clusters usando el método del codo
fviz_nbclust(df_scaled, kmeans, method = "wss") +
ggtitle("Método del Codo para Determinar el Número de Clusters")

# Aplicar K-Means (k = 3)
set.seed(123)
km_model <- kmeans(df_scaled, centers = 3, nstart = 25)
# Visualización de clusters
fviz_cluster(km_model, data = df_scaled, geom = "point",
ellipse.type = "convex", palette = "jco",
ggtheme = theme_minimal()) +
ggtitle("Gráfico de Conglomerados - K-Means")

# Mostrar centroides
km_model$centers
## estrato preciom areaconst parqueaderos banios habitaciones
## 1 0.8934477 1.9345605 1.6551743 1.7630718 1.4314219 0.7199050
## 2 -0.4534189 -0.6196854 -0.5789967 -0.5343193 -0.7128599 -0.4894261
## 3 0.3402964 0.1936983 0.2389327 0.1308766 0.5248339 0.4603159
Para relacionar los clusters con variables de ubicación y estrato, se
creó una versión limpia de la base original:
# Crear base limpia: filas sin NA en las variables numéricas
vars_num <- c("estrato", "preciom", "areaconst", "parqueaderos", "banios", "habitaciones")
vivienda_clean <- vivienda[complete.cases(vivienda[, vars_num]), ]
print(dim(vivienda_clean)) # Debe coincidir con el número de filas en vivienda_num
## [1] 6717 13
# Agregar la variable de cluster
vivienda_clean$cluster <- km_model$cluster
library(knitr)
library(kableExtra)
# Distribución de Clusters por Barrio
kable(table(vivienda_clean$cluster, vivienda_clean$barrio),
caption = "Distribución de Clusters por Barrio") %>%
kable_styling(full_width = FALSE, position = "center") %>%
scroll_box(width = "100%", height = "400px")
Distribución de Clusters por Barrio
|
20 de julio
|
3 de julio
|
acopi
|
aguablanca
|
aguacatal
|
alameda
|
alameda del río
|
alamos
|
alcazares
|
alférez real
|
alferez real
|
alfonso lopez
|
alfonso lópez
|
alto jordán
|
altos de guadalupe
|
altos de menga
|
altos de santa
|
antonio nariño
|
aranjuez
|
arboleda
|
arboleda campestre candelaria
|
arboledas
|
atanasio girardot
|
autopista sur
|
bajo aguacatal
|
barranquilla
|
barrio el recuerdo
|
barrio obrero
|
base aérea
|
belalcazar
|
belisario caicedo
|
bella suiza
|
bella suiza alta
|
bellavista
|
benjamín herrera
|
bochalema
|
bosques de alboleda
|
bosques del limonar
|
boyacá
|
bretaña
|
brisas de guadalupe
|
brisas de los
|
Brisas De Los
|
brisas del limonar
|
buenos aires
|
caldas
|
Cali
|
cali bella
|
cali canto
|
calibella
|
calicanto
|
calicanto viii
|
calima
|
calimio norte
|
cambulos
|
camino real
|
Camino Real
|
campestre
|
cañasgordas
|
cañaveralejo
|
cañaverales
|
cañaverales los samanes
|
caney
|
caney especial
|
capri
|
cascajal
|
cataya real
|
centelsa
|
centenario
|
Centenario
|
centro
|
cerro cristales
|
cerros de guadalupe
|
champagnat
|
chapinero
|
chiminangos
|
chipichape
|
ciudad 2000
|
Ciudad 2000
|
ciudad antejardin
|
ciudad bochalema
|
ciudad capri
|
ciudad cordoba
|
ciudad córdoba
|
ciudad jardin
|
ciudad jardín
|
Ciudad Jardín
|
ciudad jardin pance
|
ciudad los alamos
|
ciudad los álamos
|
ciudad meléndez
|
ciudad melendez
|
ciudad modelo
|
ciudad pacifica
|
ciudad real
|
ciudad talanga
|
ciudadela comfandi
|
ciudadela melendez
|
ciudadela paso ancho
|
ciudadela pasoancho
|
colinas del bosque
|
colinas del sur
|
colon
|
colseguros
|
colseguros andes
|
conjunto gibraltar
|
cristales
|
cristobal colón
|
cristóbal colón
|
cuarto de legua
|
departamental
|
el bosque
|
El Bosque
|
el caney
|
El Caney
|
el castillo
|
el cedro
|
el diamante
|
el dorado
|
el gran limonar
|
el guabal
|
el guabito
|
el ingenio
|
El Ingenio
|
el ingenio 3
|
el ingenio i
|
el ingenio ii
|
el ingenio iii
|
el jardín
|
el lido
|
el limonar
|
el paraíso
|
el peñon
|
el prado
|
el refugio
|
el sena
|
el trébol
|
el troncal
|
el vallado
|
eucarístico
|
evaristo garcía
|
farrallones de pance
|
fenalco kennedy
|
flora
|
flora industrial
|
floralia
|
francisco eladio ramirez
|
fuentes de la
|
gran limonar
|
granada
|
guadalupe
|
guadalupe alto
|
guaduales
|
guayaquil
|
hacienda alferez real
|
ingenio
|
ingenio i
|
ingenio ii
|
jamundi
|
jamundi alfaguara
|
jorge eliecer gaitán
|
jorge isaacs
|
juanamb√∫
|
juanambu
|
junin
|
junín
|
la alborada
|
la alianza
|
la arboleda
|
la base
|
la buitrera
|
la campiña
|
la cascada
|
la ceibas
|
la esmeralda
|
la flora
|
La Flora
|
la floresta
|
la fortaleza
|
la gran colombia
|
la hacienda
|
La Hacienda
|
la independencia
|
la libertad
|
la merced
|
la morada
|
la nueva base
|
la playa
|
la portada al
|
la primavera
|
la reforma
|
la rivera
|
la rivera i
|
la rivera ii
|
la riverita
|
la riviera
|
la selva
|
la villa del
|
laflora
|
las acacias
|
las américas
|
las camelias
|
las ceibas
|
las delicias
|
las granjas
|
las vegas
|
las vegas de
|
libertadores
|
los alamos
|
los alcazares
|
los alcázares
|
los andes
|
los cambulos
|
los cámbulos
|
los cristales
|
los cristales club
|
los guaduales
|
Los Guaduales
|
los jockeys
|
los libertadores
|
los parques barranquilla
|
los robles
|
lourdes
|
mamellan
|
manzanares
|
mayapan las vegas
|
meléndez
|
melendez
|
menga
|
metropolitano del norte
|
miraflores
|
Miraflores
|
morichal de comfandi
|
multicentro
|
municipal
|
napoles
|
nápoles
|
normandia
|
normandía
|
normandía west point
|
norte la flora
|
nueva floresta
|
nueva tequendama
|
oasis de comfandi
|
oasis de pasoancho
|
pacara
|
pacará
|
palmas del ingenio
|
pampa linda
|
pampalinda
|
panamericano
|
pance
|
Pance
|
parcelaciones pance
|
paseo de los
|
paso del comercio
|
pasoancho
|
poblado campestre
|
ponce
|
popular
|
porvenir
|
prados de oriente
|
prados del limonar
|
Prados Del Limonar
|
prados del norte
|
Prados Del Norte
|
prados del sur
|
primavera
|
primero de mayo
|
puente del comercio
|
puente palma
|
quintas de don
|
Quintas De Don
|
quintas de salomia
|
rafael uribe uribe
|
refugio
|
rincon de la
|
riveras del valle
|
rozo la torre
|
saavedra galindo
|
salomia
|
samanes
|
sameco
|
san antonio
|
san bosco
|
san carlos
|
san cayetano
|
san fernando
|
San Fernando
|
san fernando nuevo
|
san fernando viejo
|
san joaquin
|
san joaquín
|
san juan bosco
|
san judas tadeo
|
san luis
|
san nicolás
|
san pedro
|
san vicente
|
santa
|
santa anita
|
Santa Anita
|
santa anita sur
|
santa bárbara
|
santa elena
|
santa fe
|
santa helena de
|
santa isabel
|
Santa Isabel
|
santa monica
|
Santa Monica
|
santa mónica
|
santa monica norte
|
santa mónica popular
|
santa monica residencial
|
santa mónica residencial
|
santa rita
|
santa teresita
|
Santa Teresita
|
santo domingo
|
sector aguacatal
|
sector cañaveralejo guadalupe
|
seminario
|
sierras de normandía
|
siete de agosto
|
simón bolivar
|
tejares cristales
|
tejares de san
|
templete
|
tequendama
|
torres de comfandi
|
unicentro cali
|
unión de vivienda
|
urbanización barranquilla
|
urbanización boyacá
|
urbanización colseguros
|
urbanizacion gratamira
|
urbanización la flora
|
urbanización la merced
|
urbanización la nueva
|
urbanización las cascadas
|
urbanizacion lili
|
urbanización nueva granada
|
urbanización pacara
|
urbanización río lili
|
urbanización san joaquin
|
urbanización tequendama
|
valle del lili
|
Valle Del Lili
|
valle grande
|
versalles
|
villa colombia
|
villa de veracruz
|
villa del lago
|
villa del parque
|
villa del prado
|
Villa Del Prado
|
villa del sol
|
villa del sur
|
villas de veracruz
|
vipasa
|
zona norte
|
zona norte los
|
zona oeste
|
zona oriente
|
zona residencial
|
zona sur
|
|
0
|
0
|
0
|
0
|
28
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
2
|
0
|
5
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
2
|
1
|
2
|
0
|
0
|
0
|
0
|
0
|
1
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
1
|
0
|
0
|
2
|
0
|
0
|
0
|
0
|
0
|
2
|
1
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
2
|
0
|
0
|
0
|
2
|
0
|
0
|
11
|
183
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
12
|
0
|
0
|
0
|
1
|
0
|
0
|
12
|
0
|
0
|
2
|
0
|
4
|
0
|
1
|
0
|
0
|
0
|
0
|
0
|
1
|
0
|
0
|
20
|
0
|
0
|
2
|
7
|
2
|
0
|
4
|
18
|
0
|
4
|
0
|
0
|
0
|
0
|
1
|
0
|
0
|
0
|
0
|
0
|
0
|
1
|
0
|
0
|
0
|
6
|
2
|
2
|
0
|
0
|
1
|
0
|
0
|
1
|
0
|
0
|
0
|
0
|
0
|
11
|
0
|
0
|
0
|
0
|
0
|
5
|
1
|
2
|
1
|
1
|
0
|
0
|
16
|
0
|
0
|
0
|
0
|
2
|
0
|
0
|
0
|
2
|
0
|
0
|
0
|
1
|
0
|
1
|
0
|
0
|
0
|
1
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
1
|
0
|
18
|
0
|
0
|
0
|
1
|
0
|
0
|
0
|
0
|
0
|
1
|
1
|
0
|
0
|
3
|
0
|
4
|
0
|
0
|
1
|
0
|
0
|
0
|
3
|
49
|
0
|
0
|
0
|
3
|
0
|
0
|
0
|
0
|
0
|
2
|
0
|
2
|
165
|
3
|
37
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
2
|
0
|
6
|
0
|
0
|
0
|
1
|
0
|
0
|
1
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
1
|
0
|
0
|
0
|
3
|
0
|
0
|
1
|
0
|
1
|
0
|
1
|
0
|
0
|
0
|
5
|
1
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
1
|
0
|
11
|
1
|
0
|
0
|
0
|
2
|
6
|
19
|
79
|
0
|
0
|
0
|
0
|
1
|
0
|
0
|
0
|
3
|
9
|
1
|
6
|
0
|
1
|
0
|
0
|
0
|
0
|
0
|
5
|
0
|
0
|
0
|
1
|
0
|
0
|
0
|
0
|
2
|
4
|
0
|
0
|
7
|
1
|
0
|
0
|
0
|
1
|
0
|
0
|
0
|
0
|
3
|
1
|
0
|
3
|
0
|
0
|
9
|
|
3
|
0
|
9
|
1
|
22
|
3
|
1
|
7
|
1
|
3
|
1
|
0
|
8
|
1
|
1
|
1
|
0
|
0
|
7
|
0
|
1
|
4
|
1
|
0
|
0
|
1
|
1
|
1
|
0
|
1
|
2
|
9
|
0
|
14
|
3
|
22
|
0
|
9
|
0
|
7
|
0
|
34
|
1
|
1
|
6
|
1
|
2
|
1
|
1
|
1
|
6
|
0
|
2
|
5
|
2
|
24
|
1
|
1
|
0
|
9
|
12
|
1
|
54
|
1
|
40
|
0
|
0
|
1
|
7
|
1
|
1
|
14
|
1
|
5
|
2
|
2
|
16
|
51
|
1
|
0
|
38
|
8
|
3
|
1
|
6
|
77
|
0
|
0
|
1
|
12
|
1
|
1
|
3
|
1
|
1
|
1
|
9
|
1
|
0
|
0
|
1
|
4
|
1
|
22
|
2
|
1
|
35
|
2
|
1
|
23
|
4
|
14
|
0
|
120
|
1
|
1
|
0
|
0
|
4
|
4
|
8
|
1
|
93
|
0
|
1
|
11
|
5
|
9
|
3
|
33
|
53
|
1
|
25
|
0
|
86
|
1
|
2
|
4
|
1
|
1
|
1
|
0
|
0
|
1
|
12
|
2
|
0
|
1
|
6
|
4
|
8
|
1
|
1
|
3
|
0
|
0
|
0
|
1
|
3
|
0
|
0
|
0
|
11
|
0
|
5
|
1
|
3
|
3
|
0
|
4
|
0
|
7
|
2
|
0
|
1
|
245
|
0
|
5
|
1
|
1
|
121
|
2
|
3
|
1
|
12
|
1
|
2
|
0
|
0
|
0
|
0
|
3
|
1
|
1
|
0
|
1
|
9
|
1
|
1
|
4
|
1
|
1
|
11
|
1
|
3
|
0
|
1
|
0
|
1
|
9
|
1
|
8
|
18
|
3
|
58
|
0
|
10
|
1
|
0
|
1
|
5
|
1
|
2
|
0
|
4
|
23
|
12
|
26
|
6
|
15
|
7
|
0
|
1
|
17
|
1
|
2
|
14
|
1
|
33
|
0
|
1
|
5
|
30
|
2
|
1
|
18
|
4
|
0
|
10
|
5
|
2
|
18
|
0
|
2
|
2
|
2
|
2
|
2
|
0
|
1
|
0
|
3
|
5
|
1
|
76
|
0
|
1
|
1
|
22
|
2
|
0
|
44
|
1
|
3
|
0
|
1
|
1
|
0
|
1
|
1
|
14
|
1
|
1
|
3
|
0
|
2
|
2
|
19
|
0
|
4
|
4
|
0
|
0
|
3
|
0
|
1
|
0
|
2
|
10
|
0
|
37
|
2
|
0
|
1
|
2
|
1
|
0
|
36
|
1
|
10
|
0
|
0
|
0
|
1
|
0
|
6
|
3
|
22
|
0
|
1
|
1
|
2
|
18
|
1
|
5
|
1
|
1
|
1
|
2
|
13
|
24
|
0
|
1
|
1
|
1
|
2
|
1
|
55
|
1
|
0
|
0
|
0
|
1
|
1
|
2
|
0
|
2
|
769
|
1
|
1
|
37
|
1
|
2
|
1
|
1
|
12
|
1
|
17
|
1
|
1
|
4
|
13
|
1
|
13
|
6
|
1
|
30
|
|
0
|
1
|
12
|
0
|
36
|
3
|
0
|
0
|
0
|
0
|
0
|
1
|
2
|
0
|
3
|
1
|
1
|
1
|
5
|
2
|
0
|
28
|
4
|
1
|
1
|
0
|
0
|
0
|
2
|
0
|
0
|
7
|
3
|
24
|
1
|
0
|
1
|
6
|
1
|
0
|
1
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
1
|
0
|
0
|
1
|
7
|
0
|
0
|
5
|
1
|
1
|
0
|
13
|
3
|
10
|
0
|
1
|
0
|
6
|
0
|
0
|
8
|
0
|
7
|
0
|
0
|
12
|
29
|
0
|
1
|
0
|
3
|
2
|
0
|
4
|
234
|
2
|
1
|
0
|
0
|
0
|
0
|
2
|
0
|
2
|
0
|
1
|
0
|
1
|
8
|
0
|
1
|
0
|
14
|
2
|
0
|
33
|
4
|
0
|
17
|
11
|
27
|
1
|
46
|
0
|
0
|
5
|
1
|
0
|
3
|
5
|
0
|
85
|
1
|
0
|
6
|
9
|
8
|
5
|
15
|
49
|
0
|
26
|
1
|
25
|
0
|
1
|
5
|
0
|
0
|
0
|
1
|
1
|
0
|
1
|
0
|
1
|
0
|
12
|
6
|
9
|
0
|
0
|
1
|
1
|
1
|
0
|
0
|
0
|
1
|
1
|
1
|
28
|
2
|
4
|
0
|
0
|
0
|
12
|
3
|
0
|
4
|
3
|
1
|
0
|
88
|
2
|
3
|
2
|
0
|
37
|
0
|
4
|
0
|
11
|
0
|
0
|
1
|
0
|
1
|
0
|
1
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
5
|
1
|
0
|
4
|
0
|
1
|
1
|
0
|
1
|
0
|
0
|
0
|
3
|
5
|
2
|
72
|
1
|
0
|
0
|
0
|
2
|
0
|
0
|
0
|
1
|
0
|
18
|
2
|
5
|
5
|
0
|
11
|
1
|
0
|
6
|
0
|
0
|
5
|
1
|
69
|
1
|
0
|
2
|
33
|
0
|
0
|
1
|
0
|
1
|
11
|
5
|
1
|
214
|
0
|
18
|
0
|
2
|
0
|
0
|
1
|
1
|
1
|
1
|
12
|
0
|
21
|
1
|
1
|
0
|
6
|
0
|
1
|
24
|
0
|
0
|
1
|
1
|
0
|
1
|
0
|
0
|
4
|
0
|
0
|
6
|
2
|
0
|
4
|
22
|
1
|
6
|
10
|
4
|
14
|
0
|
0
|
0
|
1
|
0
|
18
|
0
|
7
|
0
|
1
|
1
|
4
|
2
|
1
|
23
|
0
|
28
|
0
|
2
|
2
|
2
|
3
|
25
|
21
|
148
|
1
|
2
|
0
|
0
|
13
|
0
|
2
|
0
|
0
|
4
|
0
|
15
|
0
|
0
|
0
|
0
|
0
|
1
|
0
|
21
|
3
|
1
|
1
|
1
|
1
|
0
|
3
|
4
|
2
|
64
|
0
|
0
|
21
|
3
|
0
|
0
|
0
|
1
|
0
|
0
|
1
|
0
|
19
|
3
|
0
|
8
|
6
|
0
|
21
|
# Distribución de Clusters por Zona
kable(table(vivienda_clean$cluster, vivienda_clean$zona),
caption = "Distribución de Clusters por Zona") %>%
kable_styling(full_width = FALSE, position = "center")
Distribución de Clusters por Zona
|
Zona Centro
|
Zona Norte
|
Zona Oeste
|
Zona Oriente
|
Zona Sur
|
|
2
|
91
|
245
|
3
|
546
|
|
39
|
814
|
306
|
95
|
2244
|
|
23
|
382
|
547
|
65
|
1315
|
# Distribución de Clusters por Estrato
kable(table(vivienda_clean$cluster, vivienda_clean$estrato),
caption = "Distribución de Clusters por Estrato") %>%
kable_styling(full_width = FALSE, position = "center")
Distribución de Clusters por Estrato
|
3
|
4
|
5
|
6
|
|
9
|
36
|
186
|
656
|
|
517
|
1276
|
1494
|
211
|
|
158
|
329
|
842
|
1003
|
Conclusiones del Clustering:
- Los clusters se diferencian notablemente por ubicación y estrato
socioeconómico.
- Cluster 2 agrupa la mayoría de las propiedades en
estratos 3, 4 y 5 (segmento intermedio).
- Clusters 1 y 3 concentran propiedades en el estrato
6, lo que sugiere dos subperfiles diferenciados dentro del segmento de
alto nivel.
Análisis de Correspondencia (MCA)
# Seleccionar variables categóricas de interés
vars_cat <- vivienda_clean[, c("tipo", "zona", "barrio")]
str(vars_cat)
## spc_tbl_ [6,717 × 3] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
## $ tipo : chr [1:6717] "Casa" "Casa" "Casa" "Casa" ...
## $ zona : chr [1:6717] "Zona Oriente" "Zona Oriente" "Zona Oriente" "Zona Sur" ...
## $ barrio: chr [1:6717] "20 de julio" "20 de julio" "20 de julio" "3 de julio" ...
## - attr(*, "spec")=List of 3
## ..$ cols :List of 13
## .. ..$ id : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
## .. ..$ zona : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_character" "collector"
## .. ..$ piso : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_character" "collector"
## .. ..$ estrato : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
## .. ..$ preciom : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
## .. ..$ areaconst : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
## .. ..$ parqueaderos: list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
## .. ..$ banios : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
## .. ..$ habitaciones: list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
## .. ..$ tipo : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_character" "collector"
## .. ..$ barrio : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_character" "collector"
## .. ..$ longitud : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
## .. ..$ latitud : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
## ..$ default: list()
## .. ..- attr(*, "class")= chr [1:2] "collector_guess" "collector"
## ..$ delim : chr ";"
## ..- attr(*, "class")= chr "col_spec"
## - attr(*, "problems")=<externalptr>
# Convertir a factores (si es necesario)
vars_cat$tipo <- as.factor(vars_cat$tipo)
vars_cat$zona <- as.factor(vars_cat$zona)
vars_cat$barrio <- as.factor(vars_cat$barrio)
# Realizar el MCA
res_mca <- MCA(vars_cat, graph = FALSE)
# Visualización del MCA
fviz_screeplot(res_mca, addlabels = TRUE, ylim = c(0, 50)) +
ggtitle("Scree Plot - Varianza Explicada en MCA")

fviz_mca_var(res_mca,
repel = TRUE,
col.var = "contrib",
gradient.cols = c("blue", "red", "green")) +
ggtitle("Contribución de Variables en MCA")

fviz_mca_ind(res_mca,
repel = TRUE,
col.ind = "cos2",
gradient.cols = c("blue", "red", "green")) +
ggtitle("Visualización de Individuos en MCA")

fviz_mca_biplot(res_mca,
repel = TRUE,
ggtheme = theme_minimal()) +
ggtitle("Biplot MCA de Variables Categóricas")

Conclusiones del MCA:
- El análisis permite identificar asociaciones entre las categorías de
tipo, zona y barrio.
- Se observan patrones de comportamiento que explican diferencias en
la oferta inmobiliaria a nivel de ubicación y tipología.
Conclusiones y Recomendaciones
Conclusiones Generales
Identificación de Variables Clave:
El PCA ha demostrado que el precio de la propiedad (preciom) y
el área construida (areaconst) son determinantes en la
variación del mercado, lo que indica que el tamaño y el precio son
fundamentales para la valoración de las viviendas.
Segmentación del Mercado:
El análisis de conglomerados ha segmentado el mercado en tres
grupos:
- Cluster 2 agrupa la mayoría de las propiedades en
estratos 3, 4 y 5, representando el segmento intermedio.
- Clusters 1 y 3 concentran propiedades en el estrato
6, indicando dos subperfiles diferenciados dentro del segmento de alto
nivel.
Patrones de Ubicación y Tipología:
El MCA ha revelado asociaciones significativas entre el tipo de
vivienda, la zona y el barrio, permitiendo identificar áreas específicas
con ciertos perfiles de oferta y demanda.
Recomendaciones Estratégicas
Focalización en Inversiones en Segmento
Intermedio:
Priorizar inversiones en zonas y barrios donde se concentran las
propiedades del Cluster 2, ya que este segmento
(estratos 3-5) presenta alto potencial de demanda y retorno de
inversión.
Desarrollo de Estrategias de Marketing
Diferenciadas:
Diseñar campañas de marketing específicas para los dos subperfiles del
segmento de alto nivel (Clusters 1 y 3) para maximizar la captación de
clientes premium.
Optimización en la Valoración de Activos:
Incorporar los hallazgos del PCA en los modelos de valoración para
establecer precios precisos y competitivos, reduciendo riesgos y
optimizando los márgenes de beneficio.
Monitoreo y Actualización Constante del
Mercado:
Implementar un sistema de seguimiento continuo que permita actualizar el
análisis y ajustar las estrategias conforme cambien las dinámicas del
mercado.
Diversificación Geográfica de la Cartera:
Utilizar la información de ubicación (barrio y zona) para diversificar
la cartera de inversiones, focalizándose en áreas con potencial de
revalorización y crecimiento sostenido.
Capacitación y Uso de Herramientas
Analíticas:
Invertir en capacitación interna y en herramientas de análisis de datos
para que el equipo tome decisiones basadas en información actualizada y
en un análisis profundo de las tendencias del mercado.