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.
Realizar un análisis integral y multidimensional de la base de datos para obtener una comprensión del mercado inmobiliario urbano
Aplicar el Análisis de Componentes Principales (PCA) para reducir la dimensionalidad del conjunto de datos, identificando las características clave que influyen en la variación de precios y en la oferta del mercado.
Implementar un Análisis de Conglomerados para agrupar las propiedades residenciales en segmentos homogéneos, permitiendo entender las dinámicas de oferta específicas en diferentes zonas de la ciudad y en diversos estratos socioeconómicos.
Realizar un Análisis de Correspondencia para examinar la relación entre las variables categóricas, como el tipo de vivienda, zona y barrio, identificando patrones de comportamiento en la oferta del mercado inmobiliario.
Desarrollar visualizaciones de los resultados mediante gráficos, mapas y otros recursos visuales que permitan comunicar los hallazgos de manera clara y efectiva a la dirección de la empresa.
Elaborar un informe final que incluya análisis detallados de los resultados obtenidos, conclusiones clave y recomendaciones específicas para guiar las decisiones estratégicas de la empresa inmobiliaria.
Se trabaja con una base de datos compuesta por 8322 registros y 13 variables, no obstante se eliminí el id dado que no aportaba información sobre el comportamiento de las observaciones. Sin contar las coordenadas se detecto la existencia de 5 variables númericas y 5 variables categoricas.
#Se elimina la variable id porque no aporta información relevante
vivienda = subset(vivienda, select = -id)
kable(head(vivienda))| zona | piso | estrato | preciom | areaconst | parqueaderos | banios | habitaciones | tipo | barrio | longitud | latitud |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Zona Oriente | NA | 3 | 250 | 70 | 1 | 3 | 6 | Casa | 20 de julio | -76.51168 | 3.43382 |
| Zona Oriente | NA | 3 | 320 | 120 | 1 | 2 | 3 | Casa | 20 de julio | -76.51237 | 3.43369 |
| Zona Oriente | NA | 3 | 350 | 220 | 2 | 2 | 4 | Casa | 20 de julio | -76.51537 | 3.43566 |
| Zona Sur | 02 | 4 | 400 | 280 | 3 | 5 | 3 | Casa | 3 de julio | -76.54000 | 3.43500 |
| Zona Norte | 01 | 5 | 260 | 90 | 1 | 2 | 3 | Apartamento | acopi | -76.51350 | 3.45891 |
| Zona Norte | 01 | 5 | 240 | 87 | 1 | 3 | 3 | Apartamento | acopi | -76.51700 | 3.36971 |
| x |
|---|
| 8322 |
| 12 |
| x | |
|---|---|
| zona | character |
| piso | character |
| estrato | numeric |
| preciom | numeric |
| areaconst | numeric |
| parqueaderos | numeric |
| banios | numeric |
| habitaciones | numeric |
| tipo | character |
| barrio | character |
| longitud | numeric |
| latitud | numeric |
El análisis de las principales medidas de los datos numéricos refleja que, a pesar de que la mediana de las viviendas presenta un valor de 330, la media es de 433. Esto sugiere la influencia de algunas propiedades de valores muy altos en comparación con el grueso de los datos. Las áreas construidas y el número de habitaciones indican que la mayoría de las viviendas son de tamaño promedio, lo que es consistente con un mercado dirigido a estratos medios-altos.
| estrato | preciom | areaconst | parqueaderos | banios | habitaciones | longitud | latitud | |
|---|---|---|---|---|---|---|---|---|
| Min. :3.000 | Min. : 58.0 | Min. : 30.0 | Min. : 1.000 | Min. : 0.000 | Min. : 0.000 | Min. :-76.59 | Min. :3.333 | |
| 1st Qu.:4.000 | 1st Qu.: 220.0 | 1st Qu.: 80.0 | 1st Qu.: 1.000 | 1st Qu.: 2.000 | 1st Qu.: 3.000 | 1st Qu.:-76.54 | 1st Qu.:3.381 | |
| Median :5.000 | Median : 330.0 | Median : 123.0 | Median : 2.000 | Median : 3.000 | Median : 3.000 | Median :-76.53 | Median :3.416 | |
| Mean :4.634 | Mean : 433.9 | Mean : 174.9 | Mean : 1.835 | Mean : 3.111 | Mean : 3.605 | Mean :-76.53 | Mean :3.418 | |
| 3rd Qu.:5.000 | 3rd Qu.: 540.0 | 3rd Qu.: 229.0 | 3rd Qu.: 2.000 | 3rd Qu.: 4.000 | 3rd Qu.: 4.000 | 3rd Qu.:-76.52 | 3rd Qu.:3.452 | |
| Max. :6.000 | Max. :1999.0 | Max. :1745.0 | Max. :10.000 | Max. :10.000 | Max. :10.000 | Max. :-76.46 | Max. :3.498 | |
| NA’s :3 | NA’s :2 | NA’s :3 | NA’s :1605 | NA’s :3 | NA’s :3 | NA’s :3 | NA’s :3 |
Se detectaron 3 registros que presentaban valores nulos en más de 4 variables, y otros 2,638 para la variable piso y 1,605 para la variable parqueaderos.
| x |
|---|
| 12 |
| x | |
|---|---|
| zona | 3 |
| piso | 2638 |
| estrato | 3 |
| preciom | 2 |
| areaconst | 3 |
| parqueaderos | 1605 |
| banios | 3 |
| habitaciones | 3 |
| tipo | 3 |
| barrio | 3 |
| longitud | 3 |
| latitud | 3 |
| x | |
|---|---|
| zona | 0.0360490 |
| piso | 31.6991108 |
| estrato | 0.0360490 |
| preciom | 0.0240327 |
| areaconst | 0.0360490 |
| parqueaderos | 19.2862293 |
| banios | 0.0360490 |
| habitaciones | 0.0360490 |
| tipo | 0.0360490 |
| barrio | 0.0360490 |
| longitud | 0.0360490 |
| latitud | 0.0360490 |
## preciom zona estrato areaconst banios habitaciones tipo barrio longitud
## 4808 1 1 1 1 1 1 1 1 1
## 1909 1 1 1 1 1 1 1 1 1
## 876 1 1 1 1 1 1 1 1 1
## 726 1 1 1 1 1 1 1 1 1
## 1 1 0 0 0 0 0 0 0 0
## 2 0 0 0 0 0 0 0 0 0
## 2 3 3 3 3 3 3 3 3
## latitud parqueaderos piso
## 4808 1 1 1 0
## 1909 1 1 0 1
## 876 1 0 1 1
## 726 1 0 0 2
## 1 0 0 0 11
## 2 0 0 0 12
## 3 1605 2638 4272
Los gráficos de boxplot confirman la información inicial, mostrando que existen viviendas con una cantidad considerable de datos atípicos en las variables de precio y área de construcción, mientras que las variables de parqueaderos, baños y habitaciones presentan un bajo número de atípicos.
boxplot(vivienda[, c("parqueaderos", "banios", "habitaciones")], main = "Boxplot de Variables Numéricas")Respecto a las medidas de centralidad de las variables categóricas, se tiene que la Zona Sur es la que presenta un mayor número de viviendas, la mayoría son apartamentos y el barrio con más viviendas es el Valle del Lili.
get_mode = function(v) {
v = v[!is.na(v)] # Elimina NA
uniqv = unique(v)
uniqv[which.max(tabulate(match(v, uniqv)))]
}
kable(sapply(vivienda[, c("zona", "piso", "tipo", "barrio","estrato")], get_mode))| x | |
|---|---|
| zona | Zona Sur |
| piso | 02 |
| tipo | Apartamento |
| barrio | valle del lili |
| estrato | 5 |
Se decidió eliminar 3 registros que contenían valores nulos en más de 4 variables. Además, se optó por eliminar los registros con valores nulos en las variables de piso y parqueaderos, ya que estos representaban el 31% y 19% de los datos, respectivamente, lo cual es un porcentaje demasiado alto para justificar la imputación de valores. Finalmente, la base de datos quedó con 4,808 registros de los 8,322 registros iniciales.
vivienda = vivienda[rowSums(is.na(vivienda)) < 4, ]
vivienda = vivienda[!is.na(vivienda$piso) & !is.na(vivienda$parqueaderos), ]
kable(colSums(is.na(vivienda)))| x | |
|---|---|
| zona | 0 |
| piso | 0 |
| estrato | 0 |
| preciom | 0 |
| areaconst | 0 |
| parqueaderos | 0 |
| banios | 0 |
| habitaciones | 0 |
| tipo | 0 |
| barrio | 0 |
| longitud | 0 |
| latitud | 0 |
## [1] 4808
Con la base de datos sin valores nulos, se procede a normalizar las variables numéricas, esto para poder implementar el análisis de componentes principales.
viviendaZ = scale(vivienda[, c("preciom", "areaconst","parqueaderos", "banios", "habitaciones")])
kable(head(viviendaZ))| preciom | areaconst | parqueaderos | banios | habitaciones |
|---|---|---|---|---|
| -0.1756310 | 0.7609789 | 1.0779092 | 1.3178809 | -0.4241459 |
| -0.6055839 | -0.6129041 | -0.7415001 | -0.9022913 | -0.4241459 |
| -0.6670057 | -0.6345970 | -0.7415001 | -0.1622339 | -0.4241459 |
| -0.7284276 | -0.8876807 | 0.1682046 | -0.9022913 | -0.4241459 |
| -0.4520293 | -0.2730489 | 0.1682046 | -0.1622339 | 0.3272519 |
| -0.4213184 | -0.1790463 | 0.1682046 | 0.5778235 | 1.8300475 |
Para iniciar realizamos el analis de componentes principales y determinamos cuanto de la varianza es explicado porcada componente Se tiene que el primer componente explica el 66,4% de la variabilidad de la base de datos, el segundo el 16,5% el tercero el 6,9% el cuarto un 6,3% y el quinto el 3,8% de la variabilidad
La imagen muestra un biplot de un Análisis de Componentes Principales donde las variables parqueaderos, precio en millones, area de construcción y baños están fuertemente alineadas con el primer componente principal (Dim1), indicando que están altamente correlacionadas y son las principales responsables de la variabilidad en los datos. Por otro lado, la variable habitaciones se alinea principalmente con el segundo componente (Dim2), sugiriendo que captura un aspecto diferente de la variabilidad de los datos.
fviz_pca_var(res.pca,
col.var = "contrib", # Color by contributions to the PC
gradient.cols = c("#FF7F00", "#034D94"),
repel = TRUE # Avoid text overlapping
)La imagen presenta una nube de individuos obtenida mediante un Análisis de Componentes Principales . La mayoría de los puntos están concentrados hacia el centro, lo que indica que muchos individuos tienen características similares en relación con los dos primeros componentes principales (Dim1 y Dim2). Sin embargo, la dispersión a lo largo de Dim1 sugiere variabilidad significativa en esa dirección, con algunos individuos más alejados que podrían representar outliers o grupos con características distintas. Esta disposición sugiere que Dim1 es el principal factor diferenciador entre los individuos del conjunto de datos.
La representación gráfica de los dos primeros componentes principales permite observar la relación existente entre las variables parqueaderos, precio en millones, area de contrucción y baños, las cuales forman un grupo que presenta un mayor efecto sobre el primer componente. Por otro lado, la variable habitaciones presenta un mayor efecto sobre el segundo componente.
Ahora se elaborará un analisis de conglomerados para identificar si existe algun patron en las variables númericas que permita realizar la segmentación de datos. Los gráficos de los conglomerados generados muestran una diferenciación entre dos clusters de viviendas. El Cluster 1 abarca un rango más amplio de precios y características, como área construida, número de baños y habitaciones, sugiriendo que incluye viviendas grandes y costosas como otras más variadas. El Cluster 2 presenta una concentración en viviendas con áreas menores, menos baños, y menos habitaciones, generalmente con precios más bajos. Aunque el número de parqueaderos no parece influir significativamente en la diferenciación entre clusters, el área construida y el número de habitaciones y baños muestran una correlación más fuerte con el precio en el Cluster 1. Esto indica que las viviendas en el Cluster 2 podrían ser más económicas y de menor tamaño, mientras que el Cluster 1 refleja una mayor diversidad en tamaño y precio.
# Método de la Silueta para determinar el número óptimo de clusters
silhouette_result = fviz_nbclust(viviendaZ, kmeans, method = "silhouette") +
ggtitle("Método de la Silueta para Determinar el Número de Clusters")
# Mostrar el gráfico de la silueta
print(silhouette_result)# Extraer el número óptimo de clusters desde el resultado de la silueta
# El número óptimo será el que maximiza el coeficiente de silueta
optimal_clusters = which.max(silhouette_result$data$y)
cat("Número óptimo de clusters según el método de la silueta:", optimal_clusters, "\n")## Número óptimo de clusters según el método de la silueta: 2
# Realizar K-means clustering con el número óptimo de clusters
set.seed(123) # Para reproducibilidad
kmeans_result = kmeans(viviendaZ, centers = optimal_clusters, nstart = 25)
viviendaZ = as.data.frame(viviendaZ)
viviendaZ_cluster = viviendaZ %>%
mutate(cluster = as.factor(kmeans_result$cluster))
# Visualizar los conglomerados en un gráfico de dispersión para diferentes pares de variables
variables = c("areaconst", "parqueaderos", "banios", "habitaciones") # Lista de las otras variables
for (var in variables) {
p = ggplot(viviendaZ_cluster, aes_string(x = var, y = "preciom", color = "cluster")) +
geom_point(size = 4) +
ggtitle(paste("Visualización de Conglomerados: Preciom vs", var)) +
theme_classic()
print(p)
}Ahora se realizará un analisis de correspondencia para visualizar y analizar relaciones entre variables categóricas y así tratar de identificar la existencia de patrones de asociación en tablas de contingencia, ofreciendo una representación visual clara de cómo se relacionan las categorías de las variables en estudio. Es ampliamente utilizado en diversas disciplinas, desde la investigación de mercado hasta las ciencias sociales y biológicas.
Se creará una variable categórica llamada precio, dividiendo la variable preciom en cuatro categorías: “Bajo”, “Medio-Bajo”, “Medio-Alto” y “Alto”. Esto permitirá analizar cómo se asocian las categorías de otras variables, como zona, piso, tipo y estrato, con diferentes niveles de precio, facilitando la identificación de patrones y relaciones en los datos.
Para el análisis de Zona y Piso, se observa que zonas como Centro y Oriente están más asociadas con los pisos bajos, mientras que Oeste y Norte muestran una mayor asociación con los pisos más altos. Las relaciones entre Zona y Piso se explican principalmente por los dos primeros ejes, que juntos explican el 84.6% de la varianza total.
vivienda$tipo = as.factor(vivienda$tipo)
vivienda$zona = as.factor(vivienda$zona)
vivienda$piso = as.factor(vivienda$piso)
vivienda$estrato = as.factor(vivienda$estrato)
vivienda$precio = cut(vivienda$preciom,
breaks = 4, # Número de categorías
labels = c("Bajo", "Medio-Bajo", "Medio-Alto", "Alto"),
include.lowest = TRUE)
kable(tabla_contingencia <- table(vivienda[, c("zona", "piso")]), caption = "Tabla de Contingencia: zona vs piso")| 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Zona Centro | 21 | 7 | 3 | 2 | 2 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
| Zona Norte | 133 | 225 | 137 | 105 | 74 | 30 | 29 | 34 | 31 | 24 | 30 | 34 |
| Zona Oeste | 72 | 110 | 123 | 95 | 81 | 75 | 56 | 41 | 40 | 28 | 20 | 12 |
| Zona Oriente | 36 | 24 | 23 | 7 | 7 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| Zona Sur | 400 | 853 | 640 | 323 | 287 | 128 | 98 | 113 | 70 | 62 | 28 | 34 |
##
## Pearson's Chi-squared test
##
## data: tabla_contingencia
## X-squared = 370.03, df = 44, p-value < 2.2e-16
## Valores Propios para Zona y Piso:
## 0.046155 0.01891935 0.01153932 0.0003476054 59.97172 24.58294 14.99368 0.4516628 59.97172 84.55466 99.54834 100
# Gráfico del porcentaje de varianza explicado
fviz_screeplot(res.ca, addlabels = TRUE, ylim = c(0, 90)) +
ggtitle("Porcentaje de Varianza Explicado (Zona vs Piso)") +
ylab("Porcentaje de varianza explicado (%)") +
xlab("Ejes")Para el analisis de zona y estrato se tiene que zonas como Oriente y Centro están más asociadas al Estrato 3, mientras que Oeste está más asociada al Estrato 6. Las relaciones entre Zona y Estrato, se explican por los dos primeros ejes llegando explicar un 96,1%.
# Análisis para zona y estrato
kable(tabla_contingencia <- table(vivienda[, c("zona", "estrato")]), caption = "Tabla de Contingencia: zona vs estrato")| 3 | 4 | 5 | 6 | |
|---|---|---|---|---|
| Zona Centro | 33 | 3 | 0 | 0 |
| Zona Norte | 141 | 184 | 482 | 79 |
| Zona Oeste | 19 | 51 | 181 | 502 |
| Zona Oriente | 94 | 2 | 1 | 0 |
| Zona Sur | 147 | 973 | 1195 | 721 |
##
## Pearson's Chi-squared test
##
## data: tabla_contingencia
## X-squared = 2172.8, df = 12, p-value < 2.2e-16
## Valores Propios para Zona y Estrato:
## 0.2952688 0.1391909 0.01744831 65.33825 30.80072 3.861032 65.33825 96.13897 100
fviz_screeplot(res.ca, addlabels = TRUE, ylim = c(0, 90)) +
ggtitle("Porcentaje de Varianza Explicado (Zona vs Estrato)") +
ylab("Porcentaje de varianza explicado (%)") +
xlab("Ejes")Para el análisis de Piso y Estrato, se observa que los pisos más bajos, como el 01, están más asociados al Estrato 3, mientras que los pisos intermedios como 04 y 05 están más relacionados con el Estrato 4. Los pisos más altos, como 11 y 12, se asocian más con estratos más elevados. Las relaciones entre Piso y Estrato se explican principalmente por los dos primeros ejes, que juntos explican el 95.1% de la varianza total.
# Análisis para piso y estrato
kable(tabla_contingencia <- table(vivienda[, c("piso", "estrato")]), caption = "Tabla de Contingencia: piso vs estrato")| 3 | 4 | 5 | 6 | |
|---|---|---|---|---|
| 01 | 107 | 158 | 239 | 158 |
| 02 | 101 | 280 | 477 | 361 |
| 03 | 100 | 261 | 336 | 229 |
| 04 | 56 | 147 | 206 | 123 |
| 05 | 62 | 130 | 146 | 113 |
| 06 | 0 | 48 | 103 | 82 |
| 07 | 0 | 49 | 83 | 51 |
| 08 | 5 | 55 | 77 | 51 |
| 09 | 0 | 41 | 52 | 48 |
| 10 | 2 | 24 | 57 | 31 |
| 11 | 1 | 10 | 39 | 29 |
| 12 | 0 | 10 | 44 | 26 |
##
## Pearson's Chi-squared test
##
## data: tabla_contingencia
## X-squared = 202.45, df = 33, p-value < 2.2e-16
## Valores Propios para Piso y Estrato:
## 0.03449456 0.005573401 0.002038608 81.92204 13.23642 4.841543 81.92204 95.15846 100
# Gráfico del porcentaje de varianza explicado
fviz_screeplot(res.ca, addlabels = TRUE, ylim = c(0, 90)) +
ggtitle("Porcentaje de Varianza Explicado (Piso vs Estrato)") +
ylab("Porcentaje de varianza explicado (%)") +
xlab("Ejes")Para el análisis de Zona y Piso, se observa que la Zona Centro está más asociada a los pisos bajos, mientras que la Zona Oeste se asocia más con los pisos superiores, como 11 y 12. Las zonas Sur y Oriente también muestran ciertas asociaciones, aunque menos significativas, con pisos intermedios y bajos. Las relaciones entre Zona y Piso se explican principalmente por los dos primeros ejes, que juntos explican el 84.6% de la varianza total.
# Análisis para Zona y Piso
kable(tabla_contingencia <- table(vivienda[, c("zona", "piso")]), caption = "Tabla de Contingencia: zona vs piso")| 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Zona Centro | 21 | 7 | 3 | 2 | 2 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
| Zona Norte | 133 | 225 | 137 | 105 | 74 | 30 | 29 | 34 | 31 | 24 | 30 | 34 |
| Zona Oeste | 72 | 110 | 123 | 95 | 81 | 75 | 56 | 41 | 40 | 28 | 20 | 12 |
| Zona Oriente | 36 | 24 | 23 | 7 | 7 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| Zona Sur | 400 | 853 | 640 | 323 | 287 | 128 | 98 | 113 | 70 | 62 | 28 | 34 |
##
## Pearson's Chi-squared test
##
## data: tabla_contingencia
## X-squared = 370.03, df = 44, p-value < 2.2e-16
## Valores Propios para Zona y Piso:
## 0.046155 0.01891935 0.01153932 0.0003476054 59.97172 24.58294 14.99368 0.4516628 59.97172 84.55466 99.54834 100
fviz_screeplot(res.ca, addlabels = TRUE, ylim = c(0, 90)) +
ggtitle("Porcentaje de Varianza Explicado (Zona vs Piso)") +
ylab("Porcentaje de varianza explicado (%)") +
xlab("Ejes")Para el análisis de Precio y Zona, se observa que las zonas Oriente y Centro están más asociadas a precios bajos, mientras que la Zona Oeste se asocia más con precios Medio-Alto y Alto. La Zona Sur se muestra más relacionada con precios Medio-Bajo. Las relaciones entre Precio y Zona se explican casi en su totalidad por el primer eje, que explica el 98.76% de la varianza total.
# Análisis para Precio y Zona
kable(tabla_contingencia <- table(vivienda[, c("precio", "zona")]), caption = "Tabla de Contingencia: precio vs zona")| Zona Centro | Zona Norte | Zona Oeste | Zona Oriente | Zona Sur | |
|---|---|---|---|---|---|
| Bajo | 34 | 743 | 342 | 95 | 2306 |
| Medio-Bajo | 2 | 125 | 265 | 2 | 547 |
| Medio-Alto | 0 | 15 | 118 | 0 | 131 |
| Alto | 0 | 3 | 28 | 0 | 52 |
##
## Pearson's Chi-squared test
##
## data: tabla_contingencia
## X-squared = 446.39, df = 12, p-value < 2.2e-16
## Valores Propios para Precio y Zona:
## 0.09169612 0.0006046423 0.0005431117 98.76378 0.6512464 0.5849731 98.76378 99.41503 100
fviz_screeplot(res.ca, addlabels = TRUE, ylim = c(0, 90)) +
ggtitle("Porcentaje de Varianza Explicado (Precio vs Zona)") +
ylab("Porcentaje de varianza explicado (%)") +
xlab("Ejes")En el análisis de Precio y Piso, se observa que los precios Altos y Medio-Altos están asociados con los pisos más altos, como los pisos 09 a 11, mientras que los precios Bajos se asocian principalmente con los pisos 03 a 05. Las relaciones entre Precio y Piso se explican principalmente por los dos primeros ejes, que juntos explican el 92.3% de la varianza total.
# Análisis para Precio y Piso
kable(tabla_contingencia <- table(vivienda[, c("precio", "piso")]), caption = "Tabla de Contingencia: precio vs piso")| 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Bajo | 495 | 754 | 706 | 445 | 387 | 162 | 133 | 141 | 99 | 85 | 55 | 58 |
| Medio-Bajo | 106 | 356 | 168 | 70 | 55 | 58 | 36 | 24 | 22 | 15 | 15 | 16 |
| Medio-Alto | 40 | 81 | 39 | 12 | 8 | 13 | 10 | 18 | 17 | 11 | 9 | 6 |
| Alto | 21 | 28 | 13 | 5 | 1 | 0 | 4 | 5 | 3 | 3 | 0 | 0 |
##
## Pearson's Chi-squared test
##
## data: tabla_contingencia
## X-squared = 220.41, df = 33, p-value < 2.2e-16
## Valores Propios para Precio y Piso:
## 0.03217843 0.01013346 0.003529506 70.19514 22.10548 7.699387 70.19514 92.30061 100
fviz_screeplot(res.ca, addlabels = TRUE, ylim = c(0, 90)) +
ggtitle("Porcentaje de Varianza Explicado (Precio vs Piso)") +
ylab("Porcentaje de varianza explicado (%)") +
xlab("Ejes")Para el análisis de Precio y Estrato, se observa que los estratos más altos, como el 06, están más asociados con precios Medio-Alto y Altos, mientras que los estratos bajos, como el 03, están más relacionados con precios Bajos. Las relaciones entre Precio y Estrato se explican principalmente por el primer eje, que explica el 99.36% de la varianza total.
# Análisis para Precio y Estrato
kable(tabla_contingencia <- table(vivienda[, c("precio", "estrato")]), caption = "Tabla de Contingencia: precio vs estrato")| 3 | 4 | 5 | 6 | |
|---|---|---|---|---|
| Bajo | 424 | 1151 | 1550 | 395 |
| Medio-Bajo | 9 | 59 | 269 | 604 |
| Medio-Alto | 1 | 3 | 30 | 230 |
| Alto | 0 | 0 | 10 | 73 |
##
## Pearson's Chi-squared test
##
## data: tabla_contingencia
## X-squared = 1813.8, df = 9, p-value < 2.2e-16
## Valores Propios para Precio y Estrato:
## 0.3748288 0.002427146 5.418373e-07 99.35649 0.6433675 0.0001436257 99.35649 99.99986 100
fviz_screeplot(res.ca, addlabels = TRUE, ylim = c(0, 90)) +
ggtitle("Porcentaje de Varianza Explicado (Precio vs Estrato)") +
ylab("Porcentaje de varianza explicado (%)") +
xlab("Ejes")Pese a que la variable tipo al tener unicamente 2 categorias no permite un analisis adecuado mediante los graficos planteados se realiza un analisis basado en las tablas de contingencia generadas.
La tabla de contingencia entre tipo de vivienda y zona muestra que los apartamentos son más comunes en las zonas Norte, Oeste, y Sur, con una presencia particularmente alta en la Zona Sur. Las casas están más concentradas en la Zona Sur, con menor presencia en las zonas Norte y Oeste.
La tabla de contingencia entre tipo de vivienda y piso muestra que los apartamentos están distribuidos a lo largo de todos los pisos, con una mayor presencia en los pisos superiores (09 a 12). Las casas, en cambio, se concentran principalmente en los pisos más bajos, con muy poca o nula presencia a partir del piso 06.
La tabla de contingencia entre tipo de vivienda y estrato muestra que los apartamentos son más frecuentes en los estratos más altos (5 y 6), mientras que las casas tienen una distribución más uniforme entre los diferentes estratos, aunque los apartamentos predominan en todos los estratos.
La tabla de contingencia entre tipo de vivienda y precio muestra que los apartamentos son más comunes en los rangos de precios Bajo y Medio-Bajo, mientras que las casas tienen una mayor proporción en los rangos de precios Medio-Alto y Alto.
# Análisis para Tipo y Zona
kable(tabla_contingencia <- table(vivienda[, c("tipo", "zona")]), caption = "Tabla de Contingencia: tipo vs zona")| Zona Centro | Zona Norte | Zona Oeste | Zona Oriente | Zona Sur | |
|---|---|---|---|---|---|
| Apartamento | 4 | 632 | 669 | 17 | 1860 |
| Casa | 32 | 254 | 84 | 80 | 1176 |
##
## Pearson's Chi-squared test
##
## data: tabla_contingencia
## X-squared = 367.47, df = 4, p-value < 2.2e-16
# Análisis para Tipo y Piso
kable(tabla_contingencia <- table(vivienda[, c("tipo", "piso")]), caption = "Tabla de Contingencia: tipo vs piso")| 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Apartamento | 349 | 416 | 481 | 476 | 448 | 231 | 179 | 188 | 141 | 114 | 79 | 80 |
| Casa | 313 | 803 | 445 | 56 | 3 | 2 | 4 | 0 | 0 | 0 | 0 | 0 |
##
## Pearson's Chi-squared test
##
## data: tabla_contingencia
## X-squared = 1550.1, df = 11, p-value < 2.2e-16
# Análisis para Tipo y Estrato
kable(tabla_contingencia <- table(vivienda[, c("tipo", "estrato")]), caption = "Tabla de Contingencia: tipo vs estrato")| 3 | 4 | 5 | 6 | |
|---|---|---|---|---|
| Apartamento | 213 | 808 | 1286 | 875 |
| Casa | 221 | 405 | 573 | 427 |
##
## Pearson's Chi-squared test
##
## data: tabla_contingencia
## X-squared = 64.884, df = 3, p-value = 5.312e-14
# Análisis para Tipo y Precio
kable(tabla_contingencia <- table(vivienda[, c("tipo", "precio")]), caption = "Tabla de Contingencia: tipo vs precio")| Bajo | Medio-Bajo | Medio-Alto | Alto | |
|---|---|---|---|---|
| Apartamento | 2565 | 460 | 128 | 29 |
| Casa | 955 | 481 | 136 | 54 |
##
## Pearson's Chi-squared test
##
## data: tabla_contingencia
## X-squared = 269.27, df = 3, p-value < 2.2e-16
No se realiza el analisis entre tipo y las otras variables categoricas debido a que al solo haber apartamento y casa unicamente genera una .
Dentro de los resultados más destacables, se encuentra que, de acuerdo al análisis de componentes principales, las variables de área de construcción, parqueaderos, precio en millones y baños son las que explican en mayor medida la variabilidad de los datos. Esto permite inferir que estas son las variables numéricas sobre las que se debe prestar mayor atención al momento de analizar el mercado inmobiliario.
Asimismo, el análisis de conglomerados identificó la existencia de dos clusters principales. Uno de estos clusters presenta valores más altos en las variables mencionadas a medida que aumenta el área construida, mientras que el otro cluster agrupa viviendas con menores áreas construidas y precios más bajos. Aunque este resultado es intuitivo, un hallazgo importante es que existe un límite a partir del cual las casas más grandes presentan un incremento en el precio por metro cuadrado, lo que sugiere que, en términos de valor, es más beneficioso vender casas más grandes en Cali.
Además, se determinó que el número de parqueaderos no influye significativamente en el precio de las viviendas. En general, las viviendas con menos baños tienden a tener precios menores. En resumen, el área construida, el número de baños y habitaciones tienen un impacto significativo en la determinación del precio de las viviendas.
Respecto a la inmobiliaria se tiene que del analisis de conglomerados se encontró la existencia de 2 cluster los cuales se diferencia porque uno presenta valores mas altos respecto a medida que aumenta el area construida y disminuye con una menor area construida. Pese a que este resultado es intuitiv, lo que resulta interesante es que existe un limite en el cual las casas mas grandes presentan un incremento en su precio que refleja un aumento en el precio por metro cuadrado de las viviendas. Esto implica que en terminos del valor del metro cuadrado en Cali resulta mas beneficioso vender casas mas grandes.
Se determinó que el número de parqueaderon no infulye significativamente sobre el precio de las viviendas, en general las viviendas con menos baños presentan precios menores. En resumen, el área construida, el número de baños y habitaciones tienen un impacto significativo en la determinación del precio de las viviendas.
Adicionalmente se recomienda enfocar los esfuerzo de la inmobiliaria en las zonas de Oeste y norte en menor medida que presentan un mayor número de edificios con un elevado número de pisos, lo cual se refuerza con el hecho de que la zona norte esta relacionada con los estratos 4 y 5 mientras que la zona oeste se relaciona con el estrato 6. Se observa que la relación mas alta entre precio y zona se da entre la zona oriente y los precios altos medio altos.
Los pisos mas altos estan relacionados con precios mas altos mientras que los precios mas bajos estan asociados con pisos entre 3 y 5. Se detecta una gran brecha en la cual las viviendas de estrato 6 se encuentran altamente relacionadas a las categorias de precios medios y altos mientras que los estratos 3, 4 y 5 se encuentran estrechamente relacionados a precios bajos.
En el caso de que para futuros ejercicios se plantee realizar labores de pronostico de datos mediante instrumentos como modelos de aprendizaje automatico se recomienda prestar mayor atención a las variables de area de construcción, parqueaderos, precio en millones y baños son las que explican en mayor medida la variabilidad de los datos. Esto permitirá un analisis mas eficiente de la información.