Informe

1. Introducción

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.

2. Objetivos

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.

3. Analisis exploratorio

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
kable(dim(vivienda))
x
8322
12
kable(sapply(vivienda, class))
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.

kable(summary(vivienda[sapply(vivienda, is.numeric)]))
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.

kable(max(rowSums(is.na(vivienda))))
x
12
kable(colSums(is.na(vivienda)))
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
kable(colSums(is.na(vivienda))*100/8322)
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
md.pattern(vivienda)

##      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("preciom", "areaconst")], main = "Boxplot de Variables Numéricas")

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

3.1 Modelación de Datos

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
nrow(vivienda)
## [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

4. Analisis de componentes principales

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

res.pca = prcomp(viviendaZ)
fviz_eig(res.pca, addlabels = TRUE)

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.

fviz_pca_ind(res.pca, col.ind = "green", label = "none") +
  ggtitle("Nube de Individuos")

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.

5. Analisis de conglomerados

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)
}

6. Analisis de correspondencia

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")
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
chisq.test(tabla_contingencia)
## 
##  Pearson's Chi-squared test
## 
## data:  tabla_contingencia
## X-squared = 370.03, df = 44, p-value < 2.2e-16
res.ca = CA(tabla_contingencia, graph = TRUE)

v_propios = res.ca$eig
cat("Valores Propios para Zona y Piso:\n", v_propios)
## 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")
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
chisq.test(tabla_contingencia)
## 
##  Pearson's Chi-squared test
## 
## data:  tabla_contingencia
## X-squared = 2172.8, df = 12, p-value < 2.2e-16
res.ca = CA(tabla_contingencia, graph = TRUE)

v_propios = res.ca$eig
cat("Valores Propios para Zona y Estrato:\n",v_propios)
## 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")
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
chisq.test(tabla_contingencia)
## 
##  Pearson's Chi-squared test
## 
## data:  tabla_contingencia
## X-squared = 202.45, df = 33, p-value < 2.2e-16
res.ca = CA(tabla_contingencia, graph = TRUE)

v_propios = res.ca$eig
cat("Valores Propios para Piso y Estrato:\n", v_propios)
## 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")
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
chisq.test(tabla_contingencia)
## 
##  Pearson's Chi-squared test
## 
## data:  tabla_contingencia
## X-squared = 370.03, df = 44, p-value < 2.2e-16
res.ca = CA(tabla_contingencia, graph = TRUE)

v_propios = res.ca$eig
cat("Valores Propios para Zona y Piso:\n",v_propios)
## 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")
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
chisq.test(tabla_contingencia)
## 
##  Pearson's Chi-squared test
## 
## data:  tabla_contingencia
## X-squared = 446.39, df = 12, p-value < 2.2e-16
res.ca = CA(tabla_contingencia, graph = TRUE)

v_propios = res.ca$eig
cat("Valores Propios para Precio y Zona:\n", v_propios)
## 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")
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
chisq.test(tabla_contingencia)
## 
##  Pearson's Chi-squared test
## 
## data:  tabla_contingencia
## X-squared = 220.41, df = 33, p-value < 2.2e-16
res.ca = CA(tabla_contingencia, graph = TRUE)

v_propios = res.ca$eig
cat("Valores Propios para Precio y Piso:\n", v_propios)
## 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")
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
chisq.test(tabla_contingencia)
## 
##  Pearson's Chi-squared test
## 
## data:  tabla_contingencia
## X-squared = 1813.8, df = 9, p-value < 2.2e-16
res.ca = CA(tabla_contingencia, graph = TRUE)

v_propios = res.ca$eig
cat("Valores Propios para Precio y Estrato:\n", v_propios)
## 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")
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
chisq.test(tabla_contingencia)
## 
##  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")
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
chisq.test(tabla_contingencia)
## 
##  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")
Tabla de Contingencia: tipo vs estrato
3 4 5 6
Apartamento 213 808 1286 875
Casa 221 405 573 427
chisq.test(tabla_contingencia)
## 
##  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")
Tabla de Contingencia: tipo vs precio
Bajo Medio-Bajo Medio-Alto Alto
Apartamento 2565 460 128 29
Casa 955 481 136 54
chisq.test(tabla_contingencia)
## 
##  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 .

7. Conclusiones

7.1 Resultados

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.

7.2 Recomendaciones

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.