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.
#install.packages("devtools")
#install.packages("dplyr")
devtools::install_github("dgonxalex80/paqueteMODELOS", force = TRUE)
## vctrs (0.6.1 -> 0.6.5 ) [CRAN]
## stringi (1.7.12 -> 1.8.3 ) [CRAN]
## rlang (1.1.0 -> 1.1.3 ) [CRAN]
## glue (1.6.2 -> 1.7.0 ) [CRAN]
## cli (3.6.1 -> 3.6.2 ) [CRAN]
## Rcpp (1.0.10 -> 1.0.12) [CRAN]
## digest (0.6.31 -> 0.6.34) [CRAN]
## plyr (1.8.8 -> 1.8.9 ) [CRAN]
## curl (5.0.0 -> 5.2.0 ) [CRAN]
## timechange (0.2.0 -> 0.3.0 ) [CRAN]
## xfun (0.39 -> 0.42 ) [CRAN]
## tzdb (0.3.0 -> 0.4.0 ) [CRAN]
## vroom (1.6.1 -> 1.6.5 ) [CRAN]
## readr (2.1.4 -> 2.1.5 ) [CRAN]
## utf8 (1.2.3 -> 1.2.4 ) [CRAN]
## fansi (1.0.4 -> 1.0.6 ) [CRAN]
## haven (2.5.2 -> 2.5.4 ) [CRAN]
## tidyr (1.3.0 -> 1.3.1 ) [CRAN]
## scales (1.2.1 -> 1.3.0 ) [CRAN]
## purrr (1.0.1 -> 1.0.2 ) [CRAN]
## dplyr (1.1.2 -> 1.1.4 ) [CRAN]
## matrixStats (0.63.0 -> 1.2.0 ) [CRAN]
## magick (2.7.4 -> 2.8.2 ) [CRAN]
## lubridate (1.9.2 -> 1.9.3 ) [CRAN]
## htmltools (0.5.5 -> 0.5.7 ) [CRAN]
## checkmate (2.1.0 -> 2.3.1 ) [CRAN]
## yaml (2.3.7 -> 2.3.8 ) [CRAN]
##
## There are binary versions available but the source versions are later:
## binary source needs_compilation
## vctrs 0.6.1 0.6.5 TRUE
## stringi 1.7.12 1.8.3 TRUE
## rlang 1.1.0 1.1.3 TRUE
## glue 1.6.2 1.7.0 TRUE
## cli 3.6.1 3.6.2 TRUE
## Rcpp 1.0.10 1.0.12 TRUE
## digest 0.6.31 0.6.34 TRUE
## plyr 1.8.8 1.8.9 TRUE
## curl 5.0.0 5.2.0 TRUE
## timechange 0.2.0 0.3.0 TRUE
## xfun 0.39 0.42 TRUE
## tzdb 0.3.0 0.4.0 TRUE
## vroom 1.6.1 1.6.5 TRUE
## readr 2.1.4 2.1.5 TRUE
## utf8 1.2.3 1.2.4 TRUE
## fansi 1.0.4 1.0.6 TRUE
## haven 2.5.2 2.5.4 TRUE
## tidyr 1.3.0 1.3.1 TRUE
## scales 1.2.1 1.3.0 TRUE
## purrr 1.0.1 1.0.2 TRUE
## dplyr 1.1.2 1.1.4 TRUE
## matrixStats 0.63.0 1.2.0 TRUE
## magick 2.7.4 2.8.2 TRUE
## lubridate 1.9.2 1.9.3 TRUE
## htmltools 0.5.5 0.5.7 TRUE
## checkmate 2.1.0 2.3.1 TRUE
## yaml 2.3.7 2.3.8 TRUE
##
## Binaries will be installed
## package 'vctrs' successfully unpacked and MD5 sums checked
## package 'stringi' successfully unpacked and MD5 sums checked
## package 'rlang' successfully unpacked and MD5 sums checked
## package 'glue' successfully unpacked and MD5 sums checked
## package 'cli' successfully unpacked and MD5 sums checked
## package 'Rcpp' successfully unpacked and MD5 sums checked
## package 'digest' successfully unpacked and MD5 sums checked
## package 'plyr' successfully unpacked and MD5 sums checked
## package 'curl' successfully unpacked and MD5 sums checked
## package 'timechange' successfully unpacked and MD5 sums checked
## package 'xfun' successfully unpacked and MD5 sums checked
## package 'tzdb' successfully unpacked and MD5 sums checked
## package 'vroom' successfully unpacked and MD5 sums checked
## package 'readr' successfully unpacked and MD5 sums checked
## package 'utf8' successfully unpacked and MD5 sums checked
## package 'fansi' successfully unpacked and MD5 sums checked
## package 'haven' successfully unpacked and MD5 sums checked
## package 'tidyr' successfully unpacked and MD5 sums checked
## package 'scales' successfully unpacked and MD5 sums checked
## package 'purrr' successfully unpacked and MD5 sums checked
## package 'dplyr' successfully unpacked and MD5 sums checked
## package 'matrixStats' successfully unpacked and MD5 sums checked
## package 'magick' successfully unpacked and MD5 sums checked
## package 'lubridate' successfully unpacked and MD5 sums checked
## package 'htmltools' successfully unpacked and MD5 sums checked
## package 'checkmate' successfully unpacked and MD5 sums checked
## package 'yaml' successfully unpacked and MD5 sums checked
##
## The downloaded binary packages are in
## C:\Users\cristian.ruizL\AppData\Local\Temp\RtmpSYU79t\downloaded_packages
## -- R CMD build -----------------------------------------------------------------
## * checking for file 'C:\Users\cristian.ruizL\AppData\Local\Temp\RtmpSYU79t\remotes7b5860e0125a\dgonxalex80-paqueteMODELOS-796f588/DESCRIPTION' ... OK
## * preparing 'paqueteMODELOS':
## * checking DESCRIPTION meta-information ... OK
## * checking for LF line-endings in source and make files and shell scripts
## * checking for empty or unneeded directories
## * building 'paqueteMODELOS_0.1.0.tar.gz'
##
library(paqueteMODELOS)
head(vivienda,5)
| id | zona | piso | estrato | preciom | areaconst | parqueaderos | banios | habitaciones | tipo | barrio | longitud | latitud |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1147 | Zona Oriente | NA | 3 | 250 | 70 | 1 | 3 | 6 | Casa | 20 de julio | -76.51168 | 3.43382 |
| 1169 | Zona Oriente | NA | 3 | 320 | 120 | 1 | 2 | 3 | Casa | 20 de julio | -76.51237 | 3.43369 |
| 1350 | Zona Oriente | NA | 3 | 350 | 220 | 2 | 2 | 4 | Casa | 20 de julio | -76.51537 | 3.43566 |
| 5992 | Zona Sur | 02 | 4 | 400 | 280 | 3 | 5 | 3 | Casa | 3 de julio | -76.54000 | 3.43500 |
| 1212 | Zona Norte | 01 | 5 | 260 | 90 | 1 | 2 | 3 | Apartamento | acopi | -76.51350 | 3.45891 |
Ahora se describe cada una de las columnas de la tabla.
El resumen de la base de datos:
#install.packages("skimr")
skimr::skim(vivienda)
| Name | vivienda |
| Number of rows | 8322 |
| Number of columns | 13 |
| _______________________ | |
| Column type frequency: | |
| character | 4 |
| numeric | 9 |
| ________________________ | |
| Group variables | None |
Variable type: character
| skim_variable | n_missing | complete_rate | min | max | empty | n_unique | whitespace |
|---|---|---|---|---|---|---|---|
| zona | 3 | 1.00 | 8 | 12 | 0 | 5 | 0 |
| piso | 2638 | 0.68 | 2 | 2 | 0 | 12 | 0 |
| tipo | 3 | 1.00 | 4 | 11 | 0 | 2 | 0 |
| barrio | 3 | 1.00 | 4 | 29 | 0 | 436 | 0 |
Variable type: numeric
| skim_variable | n_missing | complete_rate | mean | sd | p0 | p25 | p50 | p75 | p100 | hist |
|---|---|---|---|---|---|---|---|---|---|---|
| id | 3 | 1.00 | 4160.00 | 2401.63 | 1.00 | 2080.50 | 4160.00 | 6239.50 | 8319.00 | ▇▇▇▇▇ |
| estrato | 3 | 1.00 | 4.63 | 1.03 | 3.00 | 4.00 | 5.00 | 5.00 | 6.00 | ▅▆▁▇▆ |
| preciom | 2 | 1.00 | 433.89 | 328.65 | 58.00 | 220.00 | 330.00 | 540.00 | 1999.00 | ▇▂▁▁▁ |
| areaconst | 3 | 1.00 | 174.93 | 142.96 | 30.00 | 80.00 | 123.00 | 229.00 | 1745.00 | ▇▁▁▁▁ |
| parqueaderos | 1605 | 0.81 | 1.84 | 1.12 | 1.00 | 1.00 | 2.00 | 2.00 | 10.00 | ▇▁▁▁▁ |
| banios | 3 | 1.00 | 3.11 | 1.43 | 0.00 | 2.00 | 3.00 | 4.00 | 10.00 | ▇▇▃▁▁ |
| habitaciones | 3 | 1.00 | 3.61 | 1.46 | 0.00 | 3.00 | 3.00 | 4.00 | 10.00 | ▂▇▂▁▁ |
| longitud | 3 | 1.00 | -76.53 | 0.02 | -76.59 | -76.54 | -76.53 | -76.52 | -76.46 | ▁▅▇▂▁ |
| latitud | 3 | 1.00 | 3.42 | 0.04 | 3.33 | 3.38 | 3.42 | 3.45 | 3.50 | ▃▇▅▇▅ |
Se observa que para todas las variables se encuentran datos vacíos pero para las variables piso y parquea hay una cantidad considerable de variables nulas.
#install.packages("heatmaply")
apply(X= is.na(vivienda),
MARGIN = 2,
FUN = sum)
## 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
apply(X= is.na(vivienda),
MARGIN = 2,
FUN = mean)
## id zona piso estrato preciom areaconst
## 0.0003604903 0.0003604903 0.3169911079 0.0003604903 0.0002403268 0.0003604903
## parqueaderos banios habitaciones tipo barrio longitud
## 0.1928622927 0.0003604903 0.0003604903 0.0003604903 0.0003604903 0.0003604903
## latitud
## 0.0003604903
A partir de lo anteriormente expuesto, se evidencia que un 31.69% de los datos correspondientes a la variable “piso” se encuentran en estado de falta (Null), mientras que un 19.28% de los datos asociados a la variable “parquea” presentan la misma condición de ausencia.
Se sugiere que el responsable de la recolección de datos valide y describa la naturaleza de los valores faltantes (NA), así como proponga posibles métodos de imputación.
Para este caso no se van a utilizar las siguientes variables para el estudio
#Valores unicos variables.
V_Unicos_latitud <- length(unique(vivienda$latitud))
V_Unicos_longitud <- length(unique(vivienda$longitud))
V_Unicos_barrio <- length(unique(vivienda$barrio))
#Tabla para mostrar los datos
Tabla_Valores_Unicos <- data.frame(V_Unicos_barrio,
V_Unicos_latitud,
V_Unicos_longitud)
print(Tabla_Valores_Unicos)
## V_Unicos_barrio V_Unicos_latitud V_Unicos_longitud
## 1 437 3680 2929
Nombraremos el nuevo data frame que se va a utilizar:
#Eliminando variables
vivienda_sin <- subset(vivienda,
select = -c(id,
latitud,
longitud,
barrio,
piso,
parqueaderos))
#eliminando filas que se tengan datos faltates
vivienda_OK <- na.omit(vivienda_sin)
head(vivienda_OK,5)
| zona | estrato | preciom | areaconst | banios | habitaciones | tipo |
|---|---|---|---|---|---|---|
| Zona Oriente | 3 | 250 | 70 | 3 | 6 | Casa |
| Zona Oriente | 3 | 320 | 120 | 2 | 3 | Casa |
| Zona Oriente | 3 | 350 | 220 | 2 | 4 | Casa |
| Zona Sur | 4 | 400 | 280 | 5 | 3 | Casa |
| Zona Norte | 5 | 260 | 90 | 2 | 3 | Apartamento |
#Validando nulos
library(mice)
md.pattern(vivienda_OK)
## /\ /\
## { `---' }
## { O O }
## ==> V <== No need for mice. This data set is completely observed.
## \ \|/ /
## `-----'
| zona | estrato | preciom | areaconst | banios | habitaciones | tipo | ||
|---|---|---|---|---|---|---|---|---|
| 8319 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 |
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
El reto principal consisten en realizar un análisis integral y multidimensional de la base de datos para obtener una comprensión del mercado inmobiliario urbano. Se requiere aplicar diversas técnicas de análisis de datos, incluyendo:
Reducir la dimensionalidad del conjunto de datos y visualizar la estructura de las variables en componentes principales para identificar características clave que influyen en la variación de precios y oferta del mercado.
Se eliminan las variables categóricas para realizar el análisis de componentes principales
#Eliminando variables categóricas
vivienda_Num <- subset(vivienda_OK,
select = -c(zona, tipo))
head(vivienda_Num)
| estrato | preciom | areaconst | banios | habitaciones |
|---|---|---|---|---|
| 3 | 250 | 70 | 3 | 6 |
| 3 | 320 | 120 | 2 | 3 |
| 3 | 350 | 220 | 2 | 4 |
| 4 | 400 | 280 | 5 | 3 |
| 5 | 260 | 90 | 2 | 3 |
| 5 | 240 | 87 | 3 | 3 |
#ACP
library(ade4)
ACPvivienda <- dudi.pca(vivienda_Num,
scannf=F,
nf=5)
ACPok <- inertia.dudi(ACPvivienda,
row.inertia=T,
col.inertia=T)
plot(ACPvivienda$eig,
main = "Valores Propios")
screeplot(ACPvivienda, main = "Screeplot - Eigenvalues")
Se nota que los componentes principales 1 y 2 son los que mejor explican la variabilidad de los datos.
# % Factor de varianza
print(ACPok$tot.inertia,2 ) #valores propios - porcentaje de varianza de cada factor
## inertia cum cum(%)
## Ax1 2.9331575 2.933158 58.66315
## Ax2 1.1883211 4.121479 82.42957
## Ax3 0.4453505 4.566829 91.33658
## Ax4 0.2416783 4.808507 96.17015
## Ax5 0.1914925 5.000000 100.00000
Los dos primeros componentes principales (Ax1 y Ax2) explican conjuntamente aproximadamente el 82.42% de la variabilidad en los datos.
print(ACPvivienda$c1) #vectores propios
## CS1 CS2 CS3 CS4 CS5
## estrato -0.3300032 0.6744363 -0.4208934 0.4795545 -0.1706159
## preciom -0.5068715 0.2807656 0.3015468 -0.2213868 0.7240921
## areaconst -0.4940473 -0.1638135 0.6525373 0.2984641 -0.4628138
## banios -0.5189619 -0.1092831 -0.3767649 -0.6647648 -0.3672488
## habitaciones -0.3475270 -0.6538568 -0.4051685 0.4359154 0.3122700
print(ACPvivienda$co) #coordenadas de las columnas
## Comp1 Comp2 Comp3 Comp4 Comp5
## estrato -0.5651788 0.7352040 -0.2808814 0.2357528 -0.0746613
## preciom -0.8680916 0.3060630 0.2012360 -0.1088355 0.3168617
## areaconst -0.8461283 -0.1785733 0.4354681 0.1467273 -0.2025267
## banios -0.8887982 -0.1191296 -0.2514325 -0.3268036 -0.1607076
## habitaciones -0.5951908 -0.7127702 -0.2703875 0.2142995 0.1366489
print(ACPok$col.abs/100) #contribuciones de las columnas a los ejes
## Axis1 Axis2 Axis3 Axis4 Axis5
## estrato 0.1089021 0.45486434 0.17715123 0.22997252 0.02910980
## preciom 0.2569187 0.07882934 0.09093046 0.04901212 0.52430939
## areaconst 0.2440828 0.02683486 0.42580497 0.08908083 0.21419659
## banios 0.2693215 0.01194279 0.14195179 0.44191225 0.13487170
## habitaciones 0.1207750 0.42752867 0.16416155 0.19002228 0.09751252
library(factoextra)
fviz_pca_ind(ACPvivienda, geom.ind = "point",
col.ind = "gray",
axes = c(1, 2),
pointsize = 1.5)
#gráficos acp
fviz_eig(ACPvivienda, addlabels = TRUE,
main= "Varianza Explicada por cada componente",
ylab = "Varianza Explicada",
barcolor = terrain.colors(5),
barfill = topo.colors(5))
fviz_pca_var(ACPvivienda,
col.var = "contrib",
gradient.cols = c("#FF7F00", "#034D94"),
repel = TRUE # Avoid text overlapping
)
#### Conclusiones ACP
Al realizar el Análisis de componentes principales se concluye que de las variables que se encuentran en el test los componentes 1 y 2 acumulan conjuntamente aproximadamente un 82.5% de la variabilidad de los datos, es decir, que al utilizar estos dos componentes para modelado se estaría representando la mayor parte de la información contenida en las variables originales, pero también estaríamos descartando alrededor del 17.5% de la variabilidad..
Con respecto a la gráfica de Variables PCA, se pueden extraer algunas conclusiones adicionales. Por ejemplo, se puede deducir que las variables habitaciones y estrato tienen un ángulo cercano a 90° entre sí en el plano de los componentes principales. Esto sugiere que estas dos variables no están altamente correlacionadas; es decir, cambios en una variable no están fuertemente asociados con cambios en la otra. Por otro lado, al observar las variables baños y área construida, se nota un ángulo muy pequeño entre ellas, lo que sugiere una alta correlación. Este patrón indica que a medida que el área construida aumenta, también tiende a aumentar el número de baños. Esta relación podría tener implicaciones importantes en el diseño de espacios habitacionales o en la evaluación de la demanda de ciertos tipos de viviendas.
Agrupar las propiedades residenciales en segmentos homogéneos con características similares para entender las dinámicas de las ofertas específicas en diferentes partes de la ciudad y en diferentes estratos socioeconómicos.
Para el análisis de conglomerados o clustering, se deben estandarizar los datos para que estas variables se encuentren en una escala comparable entre ellas, para este análisis se va utilizar las mismas variables que se utilizaron en el PCA
#Normalizando las variables
vivienda_CLST <- scale(vivienda_Num)
summary(vivienda_CLST)
| estrato | preciom | areaconst | banios | habitaciones | |
|---|---|---|---|---|---|
| Min. :-1.5872 | Min. :-1.1437 | Min. :-1.0138 | Min. :-2.17847 | Min. :-2.4702 | |
| 1st Qu.:-0.6156 | 1st Qu.:-0.6508 | 1st Qu.:-0.6640 | 1st Qu.:-0.77812 | 1st Qu.:-0.4148 | |
| Median : 0.3560 | Median :-0.3161 | Median :-0.3633 | Median :-0.07794 | Median :-0.4148 | |
| Mean : 0.0000 | Mean : 0.0000 | Mean : 0.0000 | Mean : 0.00000 | Mean : 0.0000 | |
| 3rd Qu.: 0.3560 | 3rd Qu.: 0.3228 | 3rd Qu.: 0.3782 | 3rd Qu.: 0.62224 | 3rd Qu.: 0.2704 | |
| Max. : 1.3276 | Max. : 4.7620 | Max. :10.9822 | Max. : 4.82330 | Max. : 4.3813 |
Como se nota en el summary, la estandarización logra llevar los datos a una media de 0 y una desviación estandar de 1
Para escoger el número óptimo de clusters, una de las metodologías es el método de codo (Elbow Method), en donde se busca el valor k que satisfaga que un incremento de k, no mejore sustancialmente la distancia media intra-cluster.
fviz_nbclust(vivienda_CLST, kmeans,method = "wss")+
labs(title = "Número Óptimo de Clusters",
subtitle = "Elbow Method",
x = "Número de Clusters",
y = "WSS")+
theme_minimal() +
theme(plot.title = element_text(size = 14, face = "bold"))
Se puede ver en la gráfica del método “Elbow” (codo) que, a partir de cuatro grupos, el valor de la suma de cuadrados dentro de los grupos (WSS) empieza a disminuir significativamente. Esto indica que agregar más grupos no mejoraría significativamente la estructura de los datos. Por lo tanto, el número de grupos ideal para la segmentación de datos de vivienda es 4.
Se realiza un gráfico de para 4 clusters.
#install.packages("fpc")
library(fpc)
#Semilla
set.seed(38)
k <- kmeansruns( vivienda_CLST, krange= 4, iter.max=100, runs=200)
fviz_cluster(k, data= vivienda_CLST,
geom = "point",
ellipse.type = "norm",
ellipse.level = 0.95,
palette = "jco",
ggtheme = theme_minimal(), # Tema de la gráfica (minimal)
main = "Gráfico de Clusters", # Título principal
xlab = "Componente Principal 1", # Etiqueta del eje X
ylab = "Componente Principal 2" # Etiqueta del eje Y
)
Codigo K-Means para los clusters
# de cluster
K_Cluster <- 4
model_kmean <- kmeans(vivienda_CLST, centers =K_Cluster , nstart = 20)
#visualización
head(model_kmean$centers)
| estrato | preciom | areaconst | banios | habitaciones |
|---|---|---|---|---|
| 0.6031181 | -0.0966625 | -0.2753263 | -0.0919867 | -0.3080176 |
| -0.9857395 | -0.7257399 | -0.5914133 | -0.7867433 | -0.4676573 |
| -0.6438532 | 0.0480854 | 0.8468814 | 0.9547884 | 1.9077411 |
| 1.1238308 | 1.9453677 | 1.4659867 | 1.3039121 | 0.3667627 |
#Agregando el cluster al DF
vivienda_OK$cluster <- as.factor(model_kmean$cluster)
head(vivienda_OK)
| zona | estrato | preciom | areaconst | banios | habitaciones | tipo | cluster |
|---|---|---|---|---|---|---|---|
| Zona Oriente | 3 | 250 | 70 | 3 | 6 | Casa | 3 |
| Zona Oriente | 3 | 320 | 120 | 2 | 3 | Casa | 2 |
| Zona Oriente | 3 | 350 | 220 | 2 | 4 | Casa | 2 |
| Zona Sur | 4 | 400 | 280 | 5 | 3 | Casa | 1 |
| Zona Norte | 5 | 260 | 90 | 2 | 3 | Apartamento | 1 |
| Zona Norte | 5 | 240 | 87 | 3 | 3 | Apartamento | 1 |
#convertir variable a #
vivienda_OK$cluster <- as.numeric(as.character(vivienda_OK$cluster))
#c("#0073C2FF", "#EFC000F", "#868686FF", "#CD534CFF")
barplot(table(vivienda_OK$cluster),
main = "# de viviendas por clusters",
xlab = "Cluster",
ylab = "Cantidad de viviendas",
col = c("#FFFFE0", "#E6E6FA", "#87CEEB","#98FB98")
)
T.Cluster<- table(vivienda_OK$cluster)
Porcentajes <- round(x=prop.table(T.Cluster)*100,digits = 2)
Tabla_Resultado <- data.frame(Valor = names(T.Cluster),
Valores = as.vector(T.Cluster),
Porcentaje = Porcentajes)
print(Tabla_Resultado)
## Valor Valores Porcentaje.Var1 Porcentaje.Freq
## 1 1 3389 1 40.74
## 2 2 2759 2 33.17
## 3 3 998 3 12.00
## 4 4 1173 4 14.10
Como se observa en la tabla previa, de un total de 8,319 viviendas en la base de datos, 3,389 (40.74%) están ubicadas en el cluster 2, mientras que 2,759 (33.17%) se encuentran en el cluster 4. El restante 26% está distribuido entre el cluster 1 y cluster 3, siendo el cluster 3 el de de menor representación con 12%.
Cluster_Zona <- table(vivienda_OK$cluster, vivienda_OK$zona)
barplot(Cluster_Zona,
main= "Cluster por Zona",
ylab = "Cantidad de viviendas",
ylim = c(0, 5000),
legend = rownames(Cluster_Zona),
args.legend = list(x= "top", horiz = TRUE),
col = c("#FFFFE0", "#E6E6FA", "#87CEEB","#98FB98")
)
# Tabla Viviendas por cluster y Zona
Num_Viv_cluster <- print(table(vivienda_OK$cluster, vivienda_OK$zona))
##
## Zona Centro Zona Norte Zona Oeste Zona Oriente Zona Sur
## 1 5 745 654 0 1985
## 2 70 803 110 200 1576
## 3 49 233 52 149 515
## 4 0 139 382 2 650
print ('Total')
## [1] "Total"
print(table(vivienda_OK$zona))
##
## Zona Centro Zona Norte Zona Oeste Zona Oriente Zona Sur
## 124 1920 1198 351 4726
#Tabla % Vivienda por cluster y Zona
Tabla_porc_vivienda_cluster <- round(x= table(vivienda_OK$cluster, vivienda_OK$zona)%>%
prop.table(.,2)*100, digits = 2)
print(Tabla_porc_vivienda_cluster)
##
## Zona Centro Zona Norte Zona Oeste Zona Oriente Zona Sur
## 1 4.03 38.80 54.59 0.00 42.00
## 2 56.45 41.82 9.18 56.98 33.35
## 3 39.52 12.14 4.34 42.45 10.90
## 4 0.00 7.24 31.89 0.57 13.75
Como se nota en la gráfica la ZOna es es la zona predominante en la presencia de viviendas para la ciudad de Cali, * ZOna Centro: De las 124 viviendas que se encuentran en esta zona el 56.45% se ecuentran clasificadas en el cluster 4, y el 39.5% en el cluster #3
ZOna Norte: En esta zona se encuentran 1920 viviendas, de las cuales se encuentran distribuidas con mayor presencia en los clusters #2 y #4, con un 38.8% y 41.8% respectivamente
Zona Oeste: En esta zona se tienen 1198 viviendas con un 54.59 de las viviendas en el cluster #2 y con un 31.89% en el cluster #1
Zona Oriente: De las 351 viviendas que se encuentran en esta zona, se tiene una distribución del 56.98% para el cluster #4 y 42.45% para el culster #3
ZOna Sur: Esta es la zona con más presencia de viviendas con un total de 4720 viviendas, de las cuales el 42% se encuentran segmentadas en el cluster #2 y el 33.35% en el cluster #4.
Cluster_Estrato <- table(vivienda_OK$cluster, vivienda_OK$estrato)
barplot(Cluster_Estrato,
main= "Cluster por Estrato",
ylab = "Cantidad de viviendas",
ylim = c(0, 3500),
legend = rownames(Cluster_Zona),
args.legend = list(x= "top", horiz = TRUE),
col = c("#FFFFE0", "#E6E6FA", "#87CEEB","#98FB98")
)
# Tabla Viviendas por cluster y Estrato
table(vivienda_OK$cluster, vivienda_OK$estrato)
| / | 3 | 4 | 5 | 6 |
|---|---|---|---|---|
| 1 | 1 | 165 | 2194 | 1029 |
| 2 | 1091 | 1628 | 40 | 0 |
| 3 | 358 | 320 | 311 | 9 |
| 4 | 3 | 16 | 205 | 949 |
#Tabla % Vivienda por cluster y Estrato
round(x= table(vivienda_OK$cluster, vivienda_OK$estrato)%>%
prop.table(.,2)*100, digits = 2)
| / | 3 | 4 | 5 | 6 |
|---|---|---|---|---|
| 1 | 0.07 | 7.75 | 79.78 | 51.79 |
| 2 | 75.09 | 76.47 | 1.45 | 0.00 |
| 3 | 24.64 | 15.03 | 11.31 | 0.45 |
| 4 | 0.21 | 0.75 | 7.45 | 47.76 |
Se puede observar las características de cada uno de los clusters predominantes.
CLuster #2: Es un cluster que tiene mayor predominancia en estratos altos de la ciudad de Cali, es decir, para los estratos 5 y 6
Cluster #4: En este cluster tiene predominancia en presencia para los estratos medios altos.
El cluster número dos parece estar relacionado con características que pertenecen a grupos socioeconómicos superiores en la ciudad de Cali. La empresa podría enfocarse en este grupo de personas para vender productos o servicios específicos que satisfagan sus necesidades y preferencias, como seguridad, comodidades de lujo y un estilo de vida sofisticado.
El cluster número tres, por otro lado, la mayoría de las propiedades del cluter #4 pertenecen a estratos medios altos. La empresa podría adaptar sus estrategias de marketing para este grupo ofreciendo opciones de vivienda que se ajusten a las necesidades de aquellos que buscan un nivel de vida cómodo y accesible, pero con ciertas comodidades y prestigio asociados con los estratos medios altos.
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.
El análisis de es una herramienta estadistica fundamental para exploarar las relaciones que existen entre variables categóricas. Este método nos permite examinar cómo las variables como la zona y el estrato se relacionan entre sí. Podemos visualizar y comprender mejor los patrones de comportamiento subyacentes en el mercado inmobiliario al crear una tabla cruzada que relaciona la zona y el estrato con estas variables. Esto nos permite tomar decisiones más informadas y estratégicas.
No se tienen en cuenta las variables categoricas como el barrio por su alto # de variables unicas y el tipo de vivienda por su poca variabilidad solo dos variables.
Lo primero que se realiza es la creación de la tabla:
#Tabla Analisis Correspondencia
Zona <- vivienda_OK$zona
Estrato <- vivienda_OK$estrato
Tabla_Zona_Estrato <- table(Zona, Estrato)
print(Tabla_Zona_Estrato)
## Estrato
## Zona 3 4 5 6
## Zona Centro 105 14 4 1
## Zona Norte 572 407 769 172
## Zona Oeste 54 84 290 770
## Zona Oriente 340 8 2 1
## Zona Sur 382 1616 1685 1043
Para evaluar la independencia de las variables se aplica el test de chi-cuadrado
chisq.test(Tabla_Zona_Estrato)
##
## Pearson's Chi-squared test
##
## data: Tabla_Zona_Estrato
## X-squared = 3830.4, df = 12, p-value < 2.2e-16
Dado el valor del test se puede concluir que existe una realación significativa entre las variables zona y el estrato, es decir que se descarta independencia.
library(FactoMineR)
CA_Grafico <- CA(Tabla_Zona_Estrato)
Este análisis revela una relación notable y una presencia predominante entre la zona Oeste y el estrato 6. Además, se observa una asociación marcada entre el estrato 5 y el estrato 4 en las zonas Sur y Norte. Aunque la relación entre la zona Oriente y Centro con el estrato 3 no es tan pronunciada como las anteriores, aún se evidencia una conexión significativa.Este patrón indica una distribución geográfica específica de los estratos socioeconómicos en la ciudad, con áreas específicas que tienden a albergar ciertos estratos con mayor frecuencia que otros.