Una empresa inmobiliaria líder en una gran ciudad está buscando comprender en profundidad el mercado de viviendas urbanas para tomar decisiones estratégicas más informadas. La empresa posee una base de datos extensa que contiene información detallada sobre diversas propiedades residenciales disponibles en el mercado.
Se requiere realizar un análisis holístico de estos datos para identificar patrones, relaciones y segmentaciones relevantes que permitan mejorar la toma de decisiones en cuanto a la compra, venta y valoración de propiedades.
La base de datos aroja 8322 observaciones de 13 variables: Id, zona, pisos, estrato, precio, area construida,parqueaderos, baños,habitaciones, tipo de vivienda, barrio, longitud y latitud.Por decision metodologica no se tendran en cuenta en el analisis las 2 ultimas variables (longitud y latitud) por generar ruido y no contribuir a la finalidad del estudio.
La informacion sera recolectada a traves de una fuente secundaria -base de datos con 8322 unidades analizadas con 13 variables, se procesara en el paquete R donde se realiza un análisis integral y multidimensional de la base de datos para obtener una comprensión del mercado inmobiliario urbano. Se aplican las siguientes técnicas de análisis de datos: -Análisis de Componentes Principales -Análisis de Conglomerados -Análisis de Correspondencia
library(paqueteMETODOS)
data("vivienda")
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
Fuente:Elaboracion propia
Se seleccionaron las variables numericas: precio, area construida, parqueaderos, baños y habitaciones. Se omitieron las varibles latitud y longitud por no poseer informacion relevante para la finalidad del estudio
# Selección de variables numéricas
vivienda_num <- vivienda[, c("preciom", "areaconst", "parqueaderos", "banios", "habitaciones")]
descr(vivienda_num)
Descriptive Statistics
vivienda_num
N: 8322
areaconst banios habitaciones parqueaderos preciom
----------------- ----------- --------- -------------- -------------- ---------
Mean 174.93 3.11 3.61 1.84 433.89
Std.Dev 142.96 1.43 1.46 1.12 328.65
Min 30.00 0.00 0.00 1.00 58.00
Q1 80.00 2.00 3.00 1.00 220.00
Median 123.00 3.00 3.00 2.00 330.00
Q3 229.00 4.00 4.00 2.00 540.00
Max 1745.00 10.00 10.00 10.00 1999.00
MAD 84.51 1.48 1.48 1.48 207.56
IQR 149.00 2.00 1.00 1.00 320.00
CV 0.82 0.46 0.40 0.61 0.76
Skewness 2.69 0.93 1.63 2.33 1.85
SE.Skewness 0.03 0.03 0.03 0.03 0.03
Kurtosis 12.91 1.13 3.98 8.31 3.67
N.Valid 8319.00 8319.00 8319.00 6717.00 8320.00
Pct.Valid 99.96 99.96 99.96 80.71 99.98
Fuente:Elaboracion propia
Grafica 1 Boxplot Variables numericas
boxplot(vivienda_num)
Fuente:Elaboracion propia
Al observar las graficas se encuentra que las variables precio y area construida presentan una mayor dispersion. Se requiere normalizacion de las variables
# Eliminación de NAs
vivienda_num <- na.omit(vivienda_num)
# Normalización de las variables
vivienda_num <- scale(vivienda_num)
descr(vivienda_num)
Descriptive Statistics
areaconst banios habitaciones
----------------- ---------------------- ---------------------- ----------------------
Mean 0.00 0.00 0.00
Std.Dev 1.00 1.00 1.00
Min -1.05 -2.36 -2.65
Q1 -0.66 -0.91 -0.45
Median -0.35 -0.19 -0.45
Q3 0.36 0.54 0.29
Max 10.85 4.89 4.68
MAD 0.58 1.07 0.00
IQR 1.02 1.45 0.73
CV 23248939349689580.00 10971783864240950.00 21587562471249876.00
Skewness 2.72 0.90 1.78
SE.Skewness 0.03 0.03 0.03
Kurtosis 13.26 0.94 4.70
N.Valid 6717.00 6717.00 6717.00
Pct.Valid 100.00 100.00 100.00
Table: Table continues below
parqueaderos preciom
----------------- ----------------------- ----------------------
Mean 0.00 0.00
Std.Dev 1.00 1.00
Min -0.74 -1.23
Q1 -0.74 -0.66
Median 0.15 -0.34
Q3 0.15 0.33
Max 7.26 4.57
MAD 1.32 0.60
IQR 0.89 0.99
CV -24868070952031144.00 13453516931012132.00
Skewness 2.33 1.78
SE.Skewness 0.03 0.03
Kurtosis 8.31 3.28
N.Valid 6717.00 6717.00
Pct.Valid 100.00 100.00
Fuente:Elaboracion propia
Aplicamos PCA
# Aplicar PCA
pca_vivienda <- prcomp(vivienda_num, center = TRUE, scale. = TRUE)
summary(pca_vivienda)
Importance of components:
PC1 PC2 PC3 PC4 PC5
Standard deviation 1.8035 0.9280 0.60371 0.57319 0.43938
Proportion of Variance 0.6505 0.1722 0.07289 0.06571 0.03861
Cumulative Proportion 0.6505 0.8228 0.89568 0.96139 1.00000
Fuente:Elaboracion propia
Se visualiza mediante el diagrama de codo el aporte de cada variable numerica
Grafica 2.Varianza explicada
library(factoextra)
Warning: package 'factoextra' was built under R version 4.4.2
Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
# Scree plot
fviz_eig(pca_vivienda, addlabels = TRUE, ylim = c(0, 100)) +
ggtitle("Scree Plot - Varianza Explicada en PCA")
Fuente:Elaboracion propia
Se encuentra que las 2 primeras variables explican el 82.3% del fenimeno, esto lo corroboramos con la grafica de contribucion de variables en PCA
Grafica 3,Contribucion de variables
# Gráfico de variables
fviz_pca_var(pca_vivienda, col.var = "cos2",
gradient.cols = c("yellow", "red"),
repel = TRUE) +
ggtitle("Contribución de Variables en PCA")
Fuente:Elaboracion propia
En conclusion se encuentra que al realizar el analisis de componentes principales se encuentra que las características clave que influyen en la variación de precios y oferta del mercado es explicada en su mayor parte por las variables precio y area. La dimensionalidad se puede reducir a dos componentes de acuerdo al diagrama de codo (PC1 y PC2) sin perder información significativa.
Se utiliza k-means para agrupar por propiedades,se utiliza el metodo del codo para calcular numero optimo de clusters
df_scaled <- scale(vivienda_num)
Grafica 4. Determinacion numero optimo de clusters
# Determinación del número óptimo de clusters
fviz_nbclust(df_scaled, kmeans, method = "wss") +
ggtitle("Método del Codo")
Fuente:Elaboracion propia
Grafica 5.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")
Fuente:Elaboracion propia
# Visualización de centroides
km_model$centers
preciom areaconst parqueaderos banios habitaciones
1 1.9728860 1.7057710 1.8619310 1.4475190 0.7294706
2 0.2374914 0.3523237 0.1227056 0.6285994 0.6216066
3 -0.5669014 -0.5733081 -0.4776331 -0.6729979 -0.5116167
Fuente: Elaboracion propia
Como el objetivo es agrupar las propiedades residenciales en segmentos homogéneos con características similares para entender las dinámicas de las ofertas específicas en diferentes zonas de la ciudad y en diferentes estratos socioeconómicos se crea una base de datos limpia en la cual debe coincidir el numero de filas de las variables numericas.No se incluyo la variable barrios por generar ruido y se considera que la variable zona es mas representativa para el analisis presente
# Creación de la base limpia
vars_num <- c("preciom", "areaconst", "parqueaderos", "banios", "habitaciones")
vivienda_clean <- vivienda[complete.cases(vivienda[, vars_num]), ]
print(dim(vivienda_clean))
[1] 6717 13
# Agregar la variable de cluster
vivienda_clean$cluster <- km_model$cluster
table(vivienda_clean$cluster, vivienda_clean$zona)
Zona Centro Zona Norte Zona Oeste Zona Oriente Zona Sur
1 2 90 223 4 506
2 32 358 436 86 1217
3 30 839 439 73 2382
table(vivienda_clean$cluster, vivienda_clean$estrato)
3 4 5 6
1 10 36 180 599
2 223 366 732 808
3 451 1239 1610 463
Fuente: Elaboracion propia
En conclusion al agrupar las propiedades residenciales en segmentos homogéneos con características similares para entender las dinámicas de las ofertas específicas en diferentes zonas se encuentra que los 3 clusters se concentran en la zona sur, los clusters 1 y 3 concentran las zonas sur y oeste sugiriendo una tendencia diferenciadora respecto al cluster 2
Referente a los estratos estratos socioeconómicos los clusters 1 y 2 presentan una tendencia a agrupar la mayor parte de la oferta inmobiliaria en los estratos5 y 6 a diferencia del cluster 2 que agrupa mas en el estrato 4 y 5
El objetivo es examinar la relación entre las variables categóricas (tipo de vivienda,zona y estrato), para identificar patrones de comportamiento de la oferta en mercado inmobiliario.Se omite la variable barrios porque sus multiples categrias generan ruido, Posterior a esto se analizan 3 relaciones entre las variables categoricas: -Relacion entre zona y estrato -Relacion entre zona y tipo de vivienda -Relacion entre tipo de vivienda y estrato
# Seleccionar variables categóricas
vars_cat <- vivienda_clean[, c("tipo", "zona", "estrato")]
str(vars_cat)
tibble [6,717 × 3] (S3: 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" ...
$ estrato: num [1:6717] 3 3 3 4 5 5 4 5 5 5 ...
Fuente:Elaboracion propia
# Convertir a factores (si es necesario)
vars_cat$tipo <- as.factor(vars_cat$tipo)
vars_cat$zona <- as.factor(vars_cat$zona)
vars_cat$estrato <- as.factor(vars_cat$estrato)
str(vars_cat)
tibble [6,717 × 3] (S3: tbl_df/tbl/data.frame)
$ tipo : Factor w/ 2 levels "Apartamento",..: 2 2 2 2 1 1 1 1 2 2 ...
$ zona : Factor w/ 5 levels "Zona Centro",..: 4 4 4 5 2 2 2 2 2 2 ...
$ estrato: Factor w/ 4 levels "3","4","5","6": 1 1 1 2 3 3 2 3 3 3 ...
Fuente:Elaboracion propia
res_mca <- mca(vars_cat, abbrev=TRUE)
res_mca
Call:
mca(df = vars_cat, abbrev = TRUE)
Multiple correspondence analysis of 6717 cases of 3 factors
Correlations 0.745 0.679 cumulative % explained 37.23 71.20
library(mice)
Warning: package 'mice' was built under R version 4.4.2
Adjuntando el paquete: 'mice'
The following object is masked from 'package:stats':
filter
The following objects are masked from 'package:base':
cbind, rbind
md.pattern(vars_cat, rotate.names = TRUE)
/\ /\
{ `---' }
{ O O }
==> V <== No need for mice. This data set is completely observed.
\ \|/ /
`-----'
tipo zona estrato
6717 1 1 1 0
0 0 0 0
Se corrobora que no hay datos faltantes en las tres variables categoricas
library(FactoMineR)
Warning: package 'FactoMineR' was built under R version 4.4.2
tabla <- table(vars_cat$zona, vars_cat$estrato)
colnames(tabla) <- c("Estrato3", "Estrato4", "Estrato5", "Estrato6" )
tabla
Estrato3 Estrato4 Estrato5 Estrato6
Zona Centro 53 8 3 0
Zona Norte 237 268 669 113
Zona Oeste 24 62 265 747
Zona Oriente 159 2 1 1
Zona Sur 211 1301 1584 1009
Fuente:Elaboracion propia
chisq.test(tabla)
Pearson's Chi-squared test
data: tabla
X-squared = 3188.9, df = 12, p-value < 2.2e-16
El resultado indica que se rechaza la hipótesis de independencia de las variables (p-value: 0.0000), indicando grado tipo de relación entre las variables zona y estrato.
Grafico 6. Relacion entre zona y estrato
library(FactoMineR)
library(factoextra)
library(gridExtra)
Adjuntando el paquete: 'gridExtra'
The following object is masked from 'package:dplyr':
combine
resultados_ac <- CA(tabla)
Fuente:Elaboracion propia
El gráfico establece las siguientes relaciones:
El estrato 6 se encuentra ubicado en la Zona Oeste Los estratos 4 y 5 están ubicados principalmente en la Zona Sur y Norte El estrato 3 está presente en las Zonas Oriente y Centro
valores_prop <-resultados_ac$eig ; valores_prop
eigenvalue percentage of variance cumulative percentage of variance
dim 1 0.31503422 66.358860 66.35886
dim 2 0.14320084 30.163848 96.52271
dim 3 0.01650821 3.477292 100.00000
Fuente:Elaboracion propia
Grafica 7.Varianza explicada
fviz_screeplot(resultados_ac, addlabels = TRUE, ylim = c(0, 80))+ggtitle("")+
ylab("Porcentaje de varianza explicado") + xlab("Ejes")
Fuente:Elaboracion propia
Los resultados indican que la primera componente resumen el 66.4% y los dos primeros componentes prepresentados en el plano factorial, mientras que los dos primeros ejes resumen un 96.6% de los datos.
library(FactoMineR)
tabla2 <- table(vars_cat$zona, vars_cat$tipo)
colnames(tabla2) <- c("Casa", "Apartamento" )
tabla2
Casa Apartamento
Zona Centro 10 54
Zona Norte 852 435
Zona Oeste 966 132
Zona Oriente 22 141
Zona Sur 2381 1724
Fuente:Elaboracion propia
chisq.test(tabla2)
Pearson's Chi-squared test
data: tabla2
X-squared = 576.44, df = 4, p-value < 2.2e-16
El resultado indica que se rechaza la hipótesis de independencia de las variables (p-value: 0.0000), indicando grado tipo de relación entre las variables zona y tipo de vivienda.Esta relacion muestra una tendencia a la oferta inmobiliria de apartamentos y viviendas en la zona sur
library(FactoMineR)
tabla3 <- table(vars_cat$tipo, vars_cat$estrato)
colnames(tabla3) <- c("Estrato3", "Estrato4", "Estrato5", "Estrato6" )
tabla3
Estrato3 Estrato4 Estrato5 Estrato6
Apartamento 296 1047 1659 1229
Casa 388 594 863 641
Fuente:Elaboracion propia
chisq.test(tabla3)
Pearson's Chi-squared test
data: tabla3
X-squared = 128.92, df = 3, p-value < 2.2e-16
El resultado indica que se rechaza la hipótesis de independencia de las variables (p-value: 0.0000), indicando grado tipo de relación entre las variables tipo de vivienda y estrato. La tabla 3 indica un predominio de la oferta de apartamentos en los estratos 4,5 y 6
En conclusion el analisis de correspodencia permitio identificar los siguientes patrones de comportamiento de la oferta en mercado inmobiliario: relacion entre las 3 categorias de estudio: (zona, estrato y tipo), cada estrato esta asociado a una zona de la ciudad,existe una tendencia a la oferta inmobiliria de apartamentos y viviendas en la zona sur y un predominio de la oferta de apartamentos en los estratos 4,5 y 6