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.
A apartir de la recolección de información proporcionada por la empresa, se realizará un analisis de la base que permita corregir el ruido que esta pueda tener:
Limpeza de datos: Importación de los datos, revisión de datos faltantes, estandarización de varibles.
vivienda
# A tibble: 8,322 × 13
id zona piso estrato preciom areaconst parqueaderos banios habitaciones
<dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1147 Zona … <NA> 3 250 70 1 3 6
2 1169 Zona … <NA> 3 320 120 1 2 3
3 1350 Zona … <NA> 3 350 220 2 2 4
4 5992 Zona … 02 4 400 280 3 5 3
5 1212 Zona … 01 5 260 90 1 2 3
6 1724 Zona … 01 5 240 87 1 3 3
7 2326 Zona … 01 4 220 52 2 2 3
8 4386 Zona … 01 5 310 137 2 3 4
9 1209 Zona … 02 5 320 150 2 4 6
10 1592 Zona … 02 5 780 380 2 3 3
# ℹ 8,312 more rows
# ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
Revisión de datos faltantes.
colSums(is.na(vivienda))
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
Se elimiman las filas que no contienen información en ninguna de las variables, lo que puede generarse por errores en la digitación.
which (is.na(vivienda$id))
[1] 8320 8321 8322
vivienda <- vivienda[-c (8320, 8321, 8322), ]
Para la variable Parqueadero se trabaja bajo el supuesto que las personas que no respondieron a la pregunta de parqueaderos es porque su vivienda no cuenta con uno, sin embargo, se recomienda que para futura recoleción de información validar con el area encargada que para se especifique que en caso de no poseer parqueadero la vivienda se deba diligenciar el numero cero (0).
vivienda$parqueaderos[is.na(vivienda$parqueaderos)] <- 0
La variable piso contiene datos faltantes por lo que se imputan de la siguiente manera:
Para el tipo de vivienda Casa se imputa el valor 1
vivienda$piso[is.na(vivienda$piso) & vivienda$tipo == "Casa"] <- "01"
Para el tipo apartamento se reemplaza los NA con la moda.
df_apartamento <- vivienda[vivienda$tipo == "Apartamento", ]
df_apartamento <- na.omit(df_apartamento)
moda_apartamento <- mfv(df_apartamento$piso)
vivienda$piso[is.na(vivienda$piso) & vivienda$tipo == "Apartamento"] <- "03"
colSums(is.na(vivienda))
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
La variable piso se encuentra con Chr sin embago se trabajará como numerica asi que se realiza la transformación.
vivienda$piso <- as.numeric(as.character(vivienda$piso))
str(vivienda)
tibble [8,319 × 13] (S3: tbl_df/tbl/data.frame)
$ id : num [1:8319] 1147 1169 1350 5992 1212 ...
$ zona : chr [1:8319] "Zona Oriente" "Zona Oriente" "Zona Oriente" "Zona Sur" ...
$ piso : num [1:8319] 1 1 1 2 1 1 1 1 2 2 ...
$ estrato : num [1:8319] 3 3 3 4 5 5 4 5 5 5 ...
$ preciom : num [1:8319] 250 320 350 400 260 240 220 310 320 780 ...
$ areaconst : num [1:8319] 70 120 220 280 90 87 52 137 150 380 ...
$ parqueaderos: num [1:8319] 1 1 2 3 1 1 2 2 2 2 ...
$ banios : num [1:8319] 3 2 2 5 2 3 2 3 4 3 ...
$ habitaciones: num [1:8319] 6 3 4 3 3 3 3 4 6 3 ...
$ tipo : chr [1:8319] "Casa" "Casa" "Casa" "Casa" ...
$ barrio : chr [1:8319] "20 de julio" "20 de julio" "20 de julio" "3 de julio" ...
$ longitud : num [1:8319] -76.5 -76.5 -76.5 -76.5 -76.5 ...
$ latitud : num [1:8319] 3.43 3.43 3.44 3.44 3.46 ...
Se estandariza las variables numericas con el fin que se encuentren en la misma escala.
vivienda1= mutate_if(vivienda, is.numeric, scale)
vivienda1
# A tibble: 8,319 × 13
id[,1] zona piso[,1] estrato[,1] preciom[,1] areaconst[,1] parqueaderos[,1]
<dbl> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
1 -1.25 Zona… -0.938 -1.59 -0.560 -0.734 -0.388
2 -1.25 Zona… -0.938 -1.59 -0.347 -0.384 -0.388
3 -1.17 Zona… -0.938 -1.59 -0.255 0.315 0.417
4 0.763 Zona… -0.516 -0.616 -0.103 0.735 1.22
5 -1.23 Zona… -0.938 0.356 -0.529 -0.594 -0.388
6 -1.01 Zona… -0.938 0.356 -0.590 -0.615 -0.388
7 -0.764 Zona… -0.938 -0.616 -0.651 -0.860 0.417
8 0.0941 Zona… -0.938 0.356 -0.377 -0.265 0.417
9 -1.23 Zona… -0.516 0.356 -0.347 -0.174 0.417
10 -1.07 Zona… -0.516 0.356 1.05 1.43 0.417
# ℹ 8,309 more rows
# ℹ 6 more variables: banios <dbl[,1]>, habitaciones <dbl[,1]>, tipo <chr>,
# barrio <chr>, longitud <dbl[,1]>, latitud <dbl[,1]>
Una vez se realiza la limpieza de la base de datos se procede con el analisis solicitado.
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.
vivienda_ACP <- subset(vivienda1, select = c("piso","preciom", "areaconst","parqueaderos","banios","habitaciones"))
vivienda_ACP
# A tibble: 8,319 × 6
piso[,1] preciom[,1] areaconst[,1] parqueaderos[,1] banios[,1]
<dbl> <dbl> <dbl> <dbl> <dbl>
1 -0.938 -0.560 -0.734 -0.388 -0.0779
2 -0.938 -0.347 -0.384 -0.388 -0.778
3 -0.938 -0.255 0.315 0.417 -0.778
4 -0.516 -0.103 0.735 1.22 1.32
5 -0.938 -0.529 -0.594 -0.388 -0.778
6 -0.938 -0.590 -0.615 -0.388 -0.0779
7 -0.938 -0.651 -0.860 0.417 -0.778
8 -0.938 -0.377 -0.265 0.417 -0.0779
9 -0.516 -0.347 -0.174 0.417 0.622
10 -0.516 1.05 1.43 0.417 -0.0779
# ℹ 8,309 more rows
# ℹ 1 more variable: habitaciones <dbl[,1]>
M <- round(cor(vivienda_ACP), digits=2)
corrplot.mixed(M, main = "Matriz de Correlación")
corrplot(M, method = "color", addCoef.col = "orange")
Teniendo en cuenta que la varibles piso no presenta una correlación fuerte con las demás variables se procede a eliminarla del set de estudio.
vivienda_ACP <- subset(vivienda1, select = c("preciom", "areaconst","parqueaderos","banios","habitaciones"))
res.pca <- prcomp(vivienda_ACP)
fviz_eig(res.pca, addlabels = TRUE)
A partir del modelo construido se puede decir que el primer componente principal explica el 62.6% de la variabilidad contenida en la base de datos, segundo el 18.4% de variabilidad y el tercero el 12.4% lo que representa un poco mas de 80% de los datos.
fviz_pca_var(res.pca,
col.var = "contrib", # Color by contributions to the PC
gradient.cols = c("red", "#034D94"),
repel = TRUE # Avoid text overlapping
)
fviz_contrib(res.pca, choice = "var", axes = 1)
La dimensión numero 1 está principalmente definida por las variables Baños, area construida, y precio. La línea roja discontinua indica el valor medio de contribución.
fviz_contrib(res.pca, choice = "var", axes = 2)
La dimensión numero 2 está principalmente definida por Habitaciones y Parqueadero. La línea roja discontinua indica el valor medio de contribución.
El modelo reduce cinco variables a dos dimensiones, seleccionando aquellas que explican la mayoría de la varianza, al menos un 80%. Por lo tanto, estas dos dimensiones son altamente representativas de la estructura de los datos originales.
Además, es crucial considerar la relación entre el precio de los inmuebles, el área construida y el número de baños. Se observa que a medida que aumenta el área construida, el precio tiende a incrementarse. Del mismo modo, la cantidad de baños también ejerce una influencia significativa en el precio.
Examinar la relación entre las variables categóricas, para identificar patrones de comportamiento de la oferta en mercado inmobiliario.
Para este analisis se opto por tomar en cuenta las varibales Zona y Estrato con el fin de entender el comportamiento de las diferentes zonas de cali con respecto a la estratificación.
vivienda_AC <- subset(vivienda, select = c( "zona","estrato"))
vivienda_AC$estrato <- as.character(vivienda_AC$estrato)
vivienda_AC
# A tibble: 8,319 × 2
zona estrato
<chr> <chr>
1 Zona Oriente 3
2 Zona Oriente 3
3 Zona Oriente 3
4 Zona Sur 4
5 Zona Norte 5
6 Zona Norte 5
7 Zona Norte 4
8 Zona Norte 5
9 Zona Norte 5
10 Zona Norte 5
# ℹ 8,309 more rows
tabla <- table(vivienda_AC$zona, vivienda_AC$estrato)
colnames(tabla) <- c("Estrato3", "Estrato4", "Estrato5", "Estrato6" )
tabla %>%
kbl() %>%
kable_paper("hover",
full_width = F)
| Estrato3 | Estrato4 | Estrato5 | Estrato6 | |
|---|---|---|---|---|
| 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 |
Test= chisq.test(tabla)
Test
Pearson's Chi-squared test
data: tabla
X-squared = 3830.4, df = 12, p-value < 2.2e-16
Dado que el p-value es menor que 0.05 se rechaza la hipotesis nula lo que indicando un grado de relación entre ellas.
mca_result <- MCA(vivienda_AC, graph = FALSE)
plot(mca_result, invisible = "ind")
Se puede evidenciar que los inmuebles catalogados en estrato 6 se encuentra mayormente ubicados en la Zona Oeste, en la zona Sur se encuentran ubicados los estratos cuatro y cinco y en la zona oriente y centro se encuetras los imuebles de estrato 3.
fviz_screeplot(mca_result, addlabels = TRUE, ylim = c(0, 30))
Las dimensiones generadas en el modelo de análisis de correspondencia son más que las variables originales. Por lo tanto, si se pretende utilizar las variables en un modelo, es preferible hacerlo en su estado natural. Sin embargo, estas dimensiones nos ofrecen una visión más amplia de las variables y sus relaciones.
fviz_contrib(mca_result, choice = "var", axes = 1 )
La zona oriente y el estrato 3 son las categorias que define principalmente a esta dimensión.
fviz_contrib(mca_result, choice = "var", axes = 2 ,top = 10)
La zona oeste y el estrato 6 son las categorias que define principalmente a esta dimensión.
Basándonos en el modelo, podemos inferir que para aquellos interesados en adquirir una propiedad en la zona oeste de la ciudad, es importante tener en cuenta que la oferta predominante se concentra en el estrato 6. En cambio, para aquellos que buscan comprar al sur de la ciudad, encontrarán la mayor oferta en los estratos 4 y 5, mientras que en la zona oriente, las propiedades suelen pertenecer al estrato 3.
Recordemos que Los estratos socioeconómicos en Colombia son una clasificación utilizada para describir y diferenciar las características socioeconómicas de las diferentes áreas residenciales del país. Estos estratos se basan en criterios como el nivel de ingresos, la calidad de vida, el acceso a servicios básicos y la ubicación geográfica. Por consiguiente, la ubicación y el estrato pueden ejercer una influencia significativa en el precio de la vivienda.
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.
vivienda_clus <- subset(vivienda, select = c("piso","preciom", "areaconst","parqueaderos","banios","habitaciones"))
vi_est= mutate_if(vivienda_clus, is.numeric, scale)
vivienda_clus
# A tibble: 8,319 × 6
piso preciom areaconst parqueaderos banios habitaciones
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1 250 70 1 3 6
2 1 320 120 1 2 3
3 1 350 220 2 2 4
4 2 400 280 3 5 3
5 1 260 90 1 2 3
6 1 240 87 1 3 3
7 1 220 52 2 2 3
8 1 310 137 2 3 4
9 2 320 150 2 4 6
10 2 780 380 2 3 3
# ℹ 8,309 more rows
vi_est= mutate_if(vivienda_clus, is.numeric, scale)
vi_est
# A tibble: 8,319 × 6
piso[,1] preciom[,1] areaconst[,1] parqueaderos[,1] banios[,1]
<dbl> <dbl> <dbl> <dbl> <dbl>
1 -0.938 -0.560 -0.734 -0.388 -0.0779
2 -0.938 -0.347 -0.384 -0.388 -0.778
3 -0.938 -0.255 0.315 0.417 -0.778
4 -0.516 -0.103 0.735 1.22 1.32
5 -0.938 -0.529 -0.594 -0.388 -0.778
6 -0.938 -0.590 -0.615 -0.388 -0.0779
7 -0.938 -0.651 -0.860 0.417 -0.778
8 -0.938 -0.377 -0.265 0.417 -0.0779
9 -0.516 -0.347 -0.174 0.417 0.622
10 -0.516 1.05 1.43 0.417 -0.0779
# ℹ 8,309 more rows
# ℹ 1 more variable: habitaciones <dbl[,1]>
k_num <- numeric(10)
for (k in 1:10) {
kmeans_result <- kmeans(vi_est, centers = k, nstart = 10)
k_num [k] <- kmeans_result$tot.withinss
}
Warning: did not converge in 10 iterations
Warning: did not converge in 10 iterations
Warning: did not converge in 10 iterations
k_opt <- 5
plot(1:10, k_num, type = "b", pch = 19, frame = FALSE,
xlab = "Numero de Clusters", ylab = "Inercia",
main = "Analisis de Codo",
col = "brown" )
abline(v = k_opt, col = "blue")
k_opt <- 5
kmeans_result <- kmeans(vi_est, centers = k_opt, nstart = 5)
fviz_cluster(kmeans_result, data =vi_est)
vi_est$cluster <- as.factor (kmeans_result$cluster)
vi_est
# A tibble: 8,319 × 7
piso[,1] preciom[,1] areaconst[,1] parqueaderos[,1] banios[,1]
<dbl> <dbl> <dbl> <dbl> <dbl>
1 -0.938 -0.560 -0.734 -0.388 -0.0779
2 -0.938 -0.347 -0.384 -0.388 -0.778
3 -0.938 -0.255 0.315 0.417 -0.778
4 -0.516 -0.103 0.735 1.22 1.32
5 -0.938 -0.529 -0.594 -0.388 -0.778
6 -0.938 -0.590 -0.615 -0.388 -0.0779
7 -0.938 -0.651 -0.860 0.417 -0.778
8 -0.938 -0.377 -0.265 0.417 -0.0779
9 -0.516 -0.347 -0.174 0.417 0.622
10 -0.516 1.05 1.43 0.417 -0.0779
# ℹ 8,309 more rows
# ℹ 2 more variables: habitaciones <dbl[,1]>, cluster <fct>
boxplot(vi_est$preciom ~ vi_est$cluster,
xlab = "Cluster", ylab = "precio",
main = "Cluster para precio de vivienda",
col=c("#FFBEB2", "#FB9A85", "#B17AA0", "#7ECDBB","#C7EBB1"),
)
boxplot(vi_est$areaconst ~ vi_est$cluster,
xlab = "Cluster", ylab = "Area Construida",
main = "Cluster para precio de vivienda",
col=c("#FFBEB2", "#FB9A85", "#B17AA0", "#7ECDBB","#C7EBB1"),
)
boxplot(vi_est$banios ~ vi_est$cluster,
xlab = "Cluster", ylab = "baños",
main = "Cluster para precio de vivienda",
col=c("#FFBEB2", "#FB9A85", "#B17AA0", "#7ECDBB","#C7EBB1"),
)
Es importante examinar la demanda de la vivienda en la ciidad de cali y comprender las necesidades y preferencias de los compradores potenciales en términos de precio, ubicación y características de la propiedad, teniendo en cuenta esto en analisis de cluster segmentar estas caracteristicas para generar focos de atención y bridar al cliente la mejro expericia de acuerdo a sus necesidades.
Clúster 3 y 5 :
Estos clusters con los precios más bajos de la oferta de vivienda, así como un menor metraje, puede arrojar información valiosa sobre el mercado inmobiliario y las tendencias de compra.dado que la oferta puede estar Proporciona opciones flexibles de financiamiento, como planes de pago a plazos extendidos, tasas de interés preferenciales o programas de préstamos hipotecarios diseñados para compradores con ingresos limitados.
Clúster 4 :
Registra los valores más altos en estrato, preciom (precio), areaconst (área construida), parqueaderos, banios (baños) y habitaciones. Esto quiere decir, que las propiedades en este clúster son probablemente de lujo, ubicadas en estratos altos, con precios elevados, más espacio, y mayor número de comodidades. La estrategia puede enfocarse en el marketing de alta gama y la venta a compradores adinerados.
Clúster 1 y 2 :
Un cluster donde las características de la vivienda muestran los precios y área construida intermedio en conparacion de los clustes 3 y 5, y 4 por lo que podriamos estar hablando de un mercado intermedio en una gama media alta, que si bien el comprador potencias tiene los medios adquisitivos pueden ser personas que buscan una vivienda que ofrezca características razonables a un precio asequible, una estrategia puede ser puede ser beneficioso ser flexible en las estrategias de precios y negociación para atraer a una variedad de compradores potenciales
Para concluir la oferta de viviendas en el mercado inmobiliario en la ciudad de Cali es diversa, con propiedades que varían en precio, tamaño, ubicación y características, por lo que se debe categorizar o segmentar para entender mejor esta diversidad y asi facilitar identificación de oportunidades y desafíos en cada segmento.
La segmentación perimte enfoques de marketing y ventas personalizados para maximizar el atractivo de las propiedades dentro de ese segmento específico. Adaptar las estrategias a las características y necesidades de cada cluster aumenta las posibilidades de éxito en la comercialización de las propiedades.
El enfoque de la empresa puede dividirse en tres categorías para maximizar las ventas de inmuebles:
Golden: Esta categoría se especializa en clientes de lujo que buscan viviendas de estrato 6, principalmente ubicadas en la zona este de la ciudad. Estas propiedades destacan por su alto valor y excelentes cualidades, como amplios metros cuadrados, múltiples habitaciones y lujosos baños.
Silver: Dirigida a clientes de estratos 5 y 4, esta categoría se enfoca en viviendas de gama media alta ubicadas en las zonas sur y norte de la ciudad. Estos clientes tienen un poder adquisitivo considerable, pero buscan viviendas que ofrezcan comodidad a precios más accesibles.
Bronze: La categoría Bronze está orientada a viviendas de estrato 3 ubicadas en las zonas norte y oriente de la ciudad. Estos clientes tienen un poder adquisitivo más limitado y pueden necesitar opciones de financiamiento o promociones especiales para la adquisición de vivienda.
Al enfocarse en estas tres categorías, la empresa puede adaptar sus estrategias de marketing, ventas y servicios para satisfacer las necesidades específicas de cada segmento de clientes, maximizando así su alcance y efectividad en el mercado inmobiliario.