Problema

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.

1. Preparación de los Datos

1.1 Descripción de Variables

El Dataset Vivienda contiene:

# Número de registros
num_filas <- nrow(vivienda)
cat("Número de registros:", num_filas)
## Número de registros: 8322
# Número de columnas
num_columnas <- ncol(vivienda)
cat("Número de columnas:", num_columnas)
## Número de columnas: 13
glimpse(vivienda)
## Rows: 8,322
## Columns: 13
## $ id           <dbl> 1147, 1169, 1350, 5992, 1212, 1724, 2326, 4386, 1209, 159…
## $ zona         <chr> "Zona Oriente", "Zona Oriente", "Zona Oriente", "Zona Sur…
## $ piso         <chr> NA, NA, NA, "02", "01", "01", "01", "01", "02", "02", "02…
## $ estrato      <dbl> 3, 3, 3, 4, 5, 5, 4, 5, 5, 5, 6, 4, 5, 6, 4, 5, 5, 4, 5, …
## $ preciom      <dbl> 250, 320, 350, 400, 260, 240, 220, 310, 320, 780, 750, 62…
## $ areaconst    <dbl> 70, 120, 220, 280, 90, 87, 52, 137, 150, 380, 445, 355, 2…
## $ parqueaderos <dbl> 1, 1, 2, 3, 1, 1, 2, 2, 2, 2, NA, 3, 2, 2, 1, 4, 2, 2, 2,…
## $ banios       <dbl> 3, 2, 2, 5, 2, 3, 2, 3, 4, 3, 7, 5, 6, 2, 4, 4, 4, 3, 2, …
## $ habitaciones <dbl> 6, 3, 4, 3, 3, 3, 3, 4, 6, 3, 6, 5, 6, 2, 5, 5, 4, 3, 3, …
## $ tipo         <chr> "Casa", "Casa", "Casa", "Casa", "Apartamento", "Apartamen…
## $ barrio       <chr> "20 de julio", "20 de julio", "20 de julio", "3 de julio"…
## $ longitud     <dbl> -76.51168, -76.51237, -76.51537, -76.54000, -76.51350, -7…
## $ latitud      <dbl> 3.43382, 3.43369, 3.43566, 3.43500, 3.45891, 3.36971, 3.4…

A continuación, se describen cada una de las variables encontradas en el dataset.

# DataFrame Descripción de Variables
DescripcionVariables <- data.frame(
  Variable = c("Id", "Zona", "Piso", "Estrato", "Precio M2", "Área M2","Parqueaderos", "Baños", "Habitaciones","Tipo","Barrio","Longitud", "Latitud"),
  Tipo_Variable = c("Numérica", "Caracter", "Caracter", "Numérica", "Numérica", "Numérica","Numérica","Numérica","Numérica","Carácter","Carácter","Numérica","Numérica"),
  Descripcion = c("Identificador de registro", "Zona geográfica donde se encuentra el inmueble", "Número de pisos del predio", "Estrato socioeconómico donde está el inmueble","Precio en Millones de Pesos Colombianos", "Area del inmueble M2", "Número de Parqueaderos", "Número de Baños", "Número de Habitaciones", "Tipo de Inmueble si es Casa o Apartamento", "Barrio donde se ubica el inmueble", "Logitud geográfica de ubicación del inmueble", "Latitud geográfica del inmueble"))

knitr::kable(DescripcionVariables)
Variable Tipo_Variable Descripcion
Id Numérica Identificador de registro
Zona Caracter Zona geográfica donde se encuentra el inmueble
Piso Caracter Número de pisos del predio
Estrato Numérica Estrato socioeconómico donde está el inmueble
Precio M2 Numérica Precio en Millones de Pesos Colombianos
Área M2 Numérica Area del inmueble M2
Parqueaderos Numérica Número de Parqueaderos
Baños Numérica Número de Baños
Habitaciones Numérica Número de Habitaciones
Tipo Carácter Tipo de Inmueble si es Casa o Apartamento
Barrio Carácter Barrio donde se ubica el inmueble
Longitud Numérica Logitud geográfica de ubicación del inmueble
Latitud Numérica Latitud geográfica del inmueble

1.2 Normalización de Datos

En esta etapa se realizó un análisis general, para determinar las reglas o criterios que se tomaron para transformar los datos en un formato más estándar que permitieran tener un análisis más consistente. Las transformaciones realizadas fueron:

  • Nombres de Barrio por la mejor coincidencia función amatch de la libreria stringdist
  • Valores de logitud y latitud que no esten fuera de las reales
vivienda <- vivienda %>%
  filter(!is.na(latitud) & !is.na(longitud) &
         latitud >= -90 & latitud <= 90 &
         longitud >= -180 & longitud <= 180)

t2=table(vivienda$barrio)

# Convertir a minúscules
vivienda$barrio = str_to_lower(vivienda$barrio) #Cambio por minúsculas

# Eliminar espacios al inicio y al final
vivienda$barrio = str_trim(vivienda$barrio)

# Reemplazar múltiples espacios por un único espacio
vivienda$barrio = str_replace_all(vivienda$barrio, "\\s+", " ")

# Normalizar caracteres especiales, como convertir "á" en "a"
vivienda$barrio = stringi::stri_trans_general(vivienda$barrio, "Latin-ASCII")

# Nombres de barrios normalizados y únicos
nombres_barrios_unicos = c("20 De Julio","Acopi","Aguablanca","Aguacatal","Alameda","Alameda Del Rio","Alamos","Alborada","Alcazares","Alferez Real","Alfonso Lopez","Alto Jordán","Altos De Guadalupe","Altos De Menga","Altos De Santa","Antonio Nariño","Aranjuez","Arboleda","Arboledas","Atanasio Girardot","Autopista Sur","Bajo Aguacatal","Barranquilla","Barrio 7 De Agosto","Barrio El Recuerdo","Barrio Eucarístico","Barrio Obrero","Barrio Tranquilo Y","Belalcazar","Belisario Caicedo","Bella Suiza","Bella Suiza Alta","Bellavista","Benjamín Herrera","Berlin","Bloques Del Limonar","Bochalema","Bolivariano","Bosques De Alboleda","Bosques Del Limonar","Boyacá","Bretaña","Brisas De Guadalupe","Brisas De Los","Brisas Del Guabito","Brisas Del Limonar","Bueno Madrid","Buenos Aires","Caldas","Cali","Calibella","Calicanto","Calima","Calimio Norte","Calipso","Cambulos","Camino Real","Campestre","Caney","Cañasgordas","Cañaveralejo","Cañaverales","Capri","Cascajal","Cataya Real","Ceibas","Centelsa","Centenario","Centro","Cerro Cristales","Cerros De Guadalupe","Champagnat","Chapinero","Chiminangos","Chipichape","Ciudad 2000","Ciudad Antejardin","Ciudad Bochalema","Ciudad Capri","Ciudad Cordoba","Ciudad Country","Ciudad Del Campo","Ciudad Jardin","Ciudad Jardin Pance","Ciudad Los Alamos","Ciudad Melendez","Ciudad Modelo","Ciudad Pacifica","Ciudad Real","Ciudad Talanga","Ciudad Universitaria","Ciudadela Comfandi","Ciudadela Del Río","Ciudadela Melendez","Ciudadela Paso Ancho","Ciudadela Pasoancho","Colinas De Menga","Colinas Del Bosque","Colinas Del Sur","Colon","Colseguros","Comfenalco","Compartir","Conjunto Gibraltar","Cristales","Cristobal Colón","Cuarto De Legua","Departamental","Ed Benjamin Herrera","El Bosque","El Caney","El Castillo","El Cedro","El Diamante","El Dorado","El Gran Limonar","El Guabal","El Guabito","El Ingenio I","El Ingenio Ii","El Ingenio Iii","El Jardín","El Jordán","El Lido","El Limonar","El Nacional","El Paraíso","El Peñon","El Prado","El Refugio","El Rodeo","El Sena","El Troncal","El Vallado","Eucarístico","Evaristo García","Farrallones De Pance","Fenalco Kennedy","Fepicol","Flora","Flora Industrial","Floralia","Fonaviemcali","Francisco Eladio Ramirez","Fuentes De La","Gaitan","Gran Limonar","Granada","Guadalupe","Guadalupe Alto","Guaduales","Guayaquil","Hacienda Alferez Real","Ingenio","Ingenio I","Ingenio Ii","Jamundi","Jamundi Alfaguara","Jorge Eliecer Gaitán","Jorge Isaacs","Jose Manuel Marroquín","Juanambu","Junin","La Alborada","La Alianza","La Arboleda","La Base","La Buitrera","La Campiña","La Cascada","La Ceibas","La Esmeralda","La Flora","La Floresta","La Fortaleza","La Gran Colombia","La Hacienda","La Independencia","La Libertad","La Luisa","La Merced","La Morada","La Nueva Base","La Playa","La Portada Al","La Primavera","La Reforma","La Rivera","La Rivera I","La Rivera Ii","La Riverita","La Selva","La Villa Del","Laflora","Lares De Comfenalco","Las Acacias","Las Camelias","Las Ceibas","Las Delicias","Las Granjas","Las Quintas De","Las Vegas","Libertadores","Los Alamos","Los Alcazares","Los Andes","Los Cambulos","Los Cámbulos","Los Cristales","Los Farallones","Los Guaduales","Los Guayacanes","Los Jockeys","Los Libertadores","Los Parques Barranquilla","Los Robles","Lourdes","Mamellan","Manzanares","Mariano Ramos","Marroquín Iii","Mayapan Las Vegas","Melendez","Menga","Metropolitano Del Norte","Miradol Del Aguacatal","Miraflores","Morichal De Comfandi","Multicentro","Napoles","Normandia","Normandía","Norte","Norte La Flora","Nueva Base","Nueva Floresta","Nueva Tequendama","Oasis De Comfandi","Oasis De Pasoancho","Occidente","Pacara","Palmas Del Ingenio","Pampa Linda","Panamericano","Pance","Parque Residencial El","Paseo De Los","Paso Del Comercio","Pasoancho","Poblado Campestre","Popular","Portada De Comfandi","Portales De Comfandi","Porvenir","Prados De Oriente","Prados Del Limonar","Prados Del Norte","Prados Del Sur","Primavera","Primero De Mayo","Primitivo Crespo","Puente Del Comercio","Puente Palma","Quintas De Don","Quintas De Salomia","Rafael Uribe Uribe","Refugio","Rincon De La","Rincón De Salomia","Riveras Del Valle","Rozo La Torre","Saavedra Galindo","Salomia","Samanes","Sameco","San Antonio","San Bosco","San Carlos","San Cayetano","San Fernando","San Fernando Nuevo","San Fernando Viejo","San Joaquín","San Juan Bosco","San Judas","San Luis","San Nicolas","San Pedro","San Vicente","Santa Anita","Santa Bárbara","Santa Elena","Santa Fe","Santa Isabel","Santa Monica","Santa Mónica Alta","Santa Monica Norte","Santa Monica Popular","Santa Monica Residencial","Santa Rita","Santa Rosa","Santa Teresita","Santo Domingo","Sector Aguacatal","Sector Cañaveralejo Guadalupe","Seminario","Sierras De Normandía","Siete De Agosto","Simón Bolivar","Tejares Cristales","Tequendema","Terrón Colorado","Torres De Comfandi","Unicentro Cali","Unión De Vivienda","Urbanización Barranquilla","Urbanización Boyacá","Urbanización Colseguros","Urbanizacion El Saman","Urbanizacion Gratamira","Urbanización La Flora","Urbanización La Merced","Urbanización La Nueva","Urbanización Las Cascadas","Urbanización Nueva Granada","Urbanización Pacara","Urbanización Río Lili","Urbanización San Joaquin","Urbanización Tequendama","Valle Del Lili","Valle Grande","Versalles","Villa Colombia","Villa De Veracruz","Villa Del Lago","Villa Del Parque","Villa Del Prado","Villa Del Sol","Villa Del Sur","Villas De Veracruz","Vipasa","Zona Centro","Zona Norte","Zona Norte Los","Zona Oeste","Zona Oriente","Zona Residencial","Zona Sur")

# Amatch para encontrar la mejor coincidencia para cada barrio en tus datos
vivienda$barrio_normalizado <- nombres_barrios_unicos[stringdist::amatch(vivienda$barrio, nombres_barrios_unicos, maxDist = Inf)]

1.3 Datos Faltantes

Como primer criterio para los datos faltantes, se determina que cuando un registro tiene más del 50% de sus datos en NA, esos registros no se tentrán en cuenta. El Dataset queda con un total:

# Índice lógico para filas con más del 50% de NA en esas columnas
indice_filas_a_eliminar <- rowSums(is.na(vivienda[, 1:13])) > (13/ 2)

# Filtrar el dataframe para excluir las filas con más del 50% de NA
viviendaClean = vivienda[!indice_filas_a_eliminar, ]

# Número de registros
num_filas <- nrow(viviendaClean)
cat("Número de registros:", num_filas, "\n")
## Número de registros: 8319

Se realiza el análisis de los datos faltantes por cada una de las variables,a través del paquete VIM. Para el Caso del número pisos del inmueble, se evidencia que el 31,6% de los registro no cuentan con información y para el caso del número de parqueaderos el 19,3% de los registros no cuentan la información. Aunque el número de parqueaderos puede ser representativo para el valor del inmueble se decide eliminar la columna, junto con la de número de pisos, porque esta dos variables, en el momento de iniciar un proyecto se deberá revisar el Plan de Ordenamiento territorial de cada zona, para validar el máximo de pisos permito y el número mínimo de parqueaderos. Estas dos variables se pueden considerar como un valor agregado en el precio del inmueble.

Se realiza la eliminación a nivel columnas y no de registros porque se considera que los demás datos de los inmuebles son de gran valor en el análisis.

VIM::aggr(viviendaClean, cex.axis = 0.5, cex.lab= 0.8)  # graficos de datos faltantes

sapply(viviendaClean, function(x) sum(is.na(x)))
##                 id               zona               piso            estrato 
##                  0                  0               2635                  0 
##            preciom          areaconst       parqueaderos             banios 
##                  0                  0               1602                  0 
##       habitaciones               tipo             barrio           longitud 
##                  0                  0                  0                  0 
##            latitud barrio_normalizado 
##                  0                  0
viviendaClean <- viviendaClean[, !names(viviendaClean) %in% c("piso","parqueaderos")]

2. Análisis de Componentes Principales

2.1 Selecciono las variables numéricas

Para el PCA, solo se utilizan variables numéricas. Se excluyen las variables de tipo carácter.

numeric_vrs <- viviendaClean[, c("estrato", "preciom", "areaconst", "banios","habitaciones", "longitud", "latitud")]

2.2 Estandarización de los datos

numeric_vrs_scaled <- scale(numeric_vrs)

pca_result <- prcomp(numeric_vrs_scaled, center = TRUE, scale. = TRUE)

summary(pca_result)
## Importance of components:
##                          PC1    PC2    PC3     PC4     PC5     PC6     PC7
## Standard deviation     1.765 1.2198 0.9408 0.80909 0.65342 0.49022 0.43572
## Proportion of Variance 0.445 0.2126 0.1265 0.09352 0.06099 0.03433 0.02712
## Cumulative Proportion  0.445 0.6576 0.7840 0.87755 0.93855 0.97288 1.00000

2.3 Elección del número de componentes principales

viviendaCleanZ= scale(viviendaClean[,c("estrato", "preciom", "areaconst", "banios","habitaciones", "longitud", "latitud")])
res.pca <- prcomp(viviendaCleanZ)
fviz_eig(res.pca, addlabels = TRUE)

PC1 es el componente más importante, capturando 44.5% de la variabilidad en los datos. Esto sugiere que las características asociadas con este componente son las más influyentes en la variación general. PC2 también es relevante, explicando un 21.26% adicional de la varianza. Juntos, PC1 y PC2 capturan más del 65% de la variabilidad total, lo que es significativo.

Los primeros 4 componentes (PC1 a PC4) explican una gran parte de la varianza (87.63%), lo que indica que pueden ser suficientes para una representación significativa 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
)

Las variables habitaciones, areaconst, banios, preciom y estrato tienen vectores apuntando en direcciones similares, lo que sugiere que están correlacionadas entre sí y todas contribuyen principalmente a Dim1. Las variables longitud y latitud están agrupadas y apuntan en una dirección diferente de las otras, lo que sugiere que estas variables están relacionadas y aportan información diferente a los componentes.

2.4 Casos Extremos para explicar el sentido de los ejes

datos<- rbind(viviendaClean[8073,], # ok
viviendaClean[5484,],
viviendaClean[3282,],
viviendaClean[5217,])

# Crear tabla con kable
datos <- as.data.frame(datos)
rownames(datos) = c("Vivienda 8073", "Vivienda 5484", "Vivienda 3282", "Vivienda 5217")

# Generar la tabla con formato
kable(datos, format = "html", caption = "Datos Seleccionados de Viviendas") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
                full_width = F, position = "center")
Datos Seleccionados de Viviendas
id zona estrato preciom areaconst banios habitaciones tipo barrio longitud latitud barrio_normalizado
Vivienda 8073 534 Zona Norte 3 370 1440 4 10 Casa villa del prado -76.49815 3.46343 Villa Del Prado
Vivienda 5484 5396 Zona Sur 6 1600 1600 6 6 Casa parcelaciones pance -76.53621 3.34642 Farrallones De Pance
Vivienda 3282 69 Zona Oriente 3 165 80 0 0 Casa jose manuel marroquin -76.47766 3.42456 Jose Manuel Marroquín
Vivienda 5217 6712 Zona Sur 6 285 57 2 1 Apartamento pance -76.54402 3.34078 Pance
casos1 <- rbind(res.pca$x[8073,1:2],res.pca$x[3282,1:2]) # CP1
rownames(casos1) = c("8073","5484")
casos1 <- as.data.frame(casos1)

casos2 <- rbind(res.pca$x[5484,1:2], res.pca$x[5217,1:2]) # CP2
rownames(casos2) = c("3282","5217")
casos2 <- as.data.frame(casos2)

fviz_pca_ind(res.pca, col.ind = "#DEDEDE", gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07")) +
geom_point(data = casos1, aes(x = PC1, y = PC2), color = "red", size = 3) +
geom_point(data = casos2, aes(x = PC1, y = PC2), color = "blue", size = 3)

Vivienda 8073 y Vivienda 5484 presentan características de propiedades que son atípicas por su gran tamaño y, en el caso de la segunda, un precio muy elevado, lo que indica que son viviendas de nicho, ya sea por subvaloración o por su ubicación y nivel de lujo. Vivienda 3282 es particularmente interesante debido a la falta de baños y habitaciones, lo que indica que podría haber un error en los datos o que se trata de una estructura no habitable. Vivienda 5217 parece ser una oportunidad interesante debido a su bajo precio en una zona de alta demanda, aunque es pequeña y podría estar dirigida a un segmento específico del mercado.

2.5 Análisis de Resultados

  • La Relación precio-estrato-características: El análisis sugiere que el precio de las viviendas está fuertemente influenciado por el estrato y las características físicas como el número de habitaciones y baños, y el área construida.

  • Separación geográfica: Las variables de ubicación (latitud y longitud) están menos relacionadas con las características internas de las viviendas, lo que podría sugerir que, en este contexto, la ubicación geográfica por sí sola no explica tanto la variabilidad en el conjunto de datos como lo hacen las características físicas y el estrato socioeconómico.

  • Dimensionalidad: La mayoría de la varianza en los datos se explica a lo largo de Dim1, lo que sugiere que una gran parte de la variabilidad entre las viviendas puede ser explicada por una combinación de las variables relacionadas con el tamaño, precio y estrato.

3. Análisis de Conglomerados

3.1 Número óptimo de clusters utilizando el método del codo

# Número óptimo de clusters utilizando el método del codo
set.seed(123)
wss <- (nrow(viviendaCleanZ)-1)*sum(apply(viviendaCleanZ,2,var))
for (i in 2:15) wss[i] <- sum(kmeans(viviendaCleanZ, centers=i)$withinss)

# Graficar el codo con línea y puntos en color azul
plot(1:15, wss, type="b", col="blue", lty=1, pch=19, xlab="Número de clusters", ylab="Suma de cuadrados intra-cluster (WSS)", main="Método del Codo")

# Ajustar la línea y los puntos para que ambos sean azules y más visibles
lines(1:15, wss, col="blue", lty=1)
points(1:15, wss, col="blue", pch=19)

El análisis del método del codo sugiere que la mejor elección para el número de clusters es 2. Esto indica que al dividir los datos en 2 clusters se logra una reducción significativa en la suma de cuadrados intra-cluster, capturando la mayor parte de la variabilidad dentro de los datos. Añadir más clusters no resultaría en una mejora sustancial, lo que sugiere que los datos pueden ser agrupados eficazmente en dos clusters distintos.

3.2 Análisis de conglomerados con k-means

# Realizar el análisis de conglomerados con k-means
num_clusters <- 2
kmeans_result <- kmeans(pca_result$x[, 1:2], centers = num_clusters)

# Agregar la información de los clusters al conjunto de datos original
viviendaClean$cluster <- as.factor(kmeans_result$cluster)


sil_width <- function(k){
  km.res <- kmeans(numeric_vrs, k, nstart = 14)
  ss <- silhouette(km.res$cluster, dist(numeric_vrs))
  mean(ss[, 3])
}

k.values <- 2:10
sil_values <- sapply(k.values, sil_width)

plot(k.values, sil_values, type = "b", col = "blue",
     main = "Índice de Silueta vs Número de Clusters", # Título de la gráfica
     xlab = "Número de Clusters (K)",                # Etiqueta del eje X
     ylab = "Valor Promedio del Índice de Silueta")  # Etiqueta del eje Y

El análisis del índice de silueta sugiere que la mejor elección para el número de clusters es 2. Este valor de 𝐾maximiza el índice de silueta, lo que indica que los datos se agrupan de manera más efectiva cuando se dividen en 2 clusters. Los clusters formados son bien separados entre sí y presentan alta coherencia interna, lo que refleja una buena calidad de la segmentación.

fviz_nbclust(numeric_vrs, kmeans, method = "silhouette")

fviz_cluster(kmeans_result, data = numeric_vrs)

Cantidad de elementos de cada cluster

# Contar el número de elementos en cada clúster
table(kmeans_result$cluster)
## 
##    1    2 
## 5493 2826

3.3 Cluster Jerárquico

# Matriz de Distancias
dist_matrix <- dist(numeric_vrs, method = "euclidean")  # Puedes usar otros métodos como "manhattan"


# Realiza el clustering jerárquico
hclust_result <- hclust(dist_matrix, method = "ward.D2")  # Puedes cambiar el método (e.g., "single", "complete", "average")


# Dendrograma

plot(hclust_result, labels = FALSE, main = "Dendrograma del Clustering Jerárquico")


# Corta denograma 2 clusters
clusters <- cutree(hclust_result, k = 2)

# Denograma 2 cluster
rect.hclust(hclust_result, k = 2, border = "red")

# Agrega los clusters como una columna a tu data frame
viviendaClean$cluster <- clusters

El análisis de clustering jerárquico realizado ha permitido identificar 2 grupos distintos dentro de los datos. El dendrograma, representado con rectángulos rojos, muestra claramente dos segmentos principales en los que los datos se agrupan con alta similitud interna y separación significativa entre ellos.

# Data frame espacial 
viviendas_sf <- st_as_sf(viviendaClean, coords = c("longitud", "latitud"), crs = 4326)

# Crear el mapa con ggplot2
ggplot(data = viviendas_sf) +
  geom_sf(aes(color = factor(cluster)), size = 3) +
  labs(title = "Distribución de Clusters en el Mapa",
       color = "Cluster") +
  theme_minimal()

3.4 Análisis de Resultados

El análisis de conglomerados, realizado utilizando tanto el método del codo como el método de la silueta, ha revelado que el mercado de viviendas urbanas puede segmentarse eficazmente en dos grupos principales. Estos dos segmentos representan diferenciaciones claras dentro del mercado inmobiliario, con propiedades que comparten características similares dentro de cada grupo.

4. Análisis de Correspondencia

El análisis de correspondencia es una herramienta útil para explorar relaciones entre variables categóricas, para este caso vamos a análisis tipo de vivienda y zona.

tipo_zona <- table(viviendaClean$tipo, viviendaClean$zona)
print(tipo_zona)
##              
##               Zona Centro Zona Norte Zona Oeste Zona Oriente Zona Sur
##   Apartamento          24       1198       1029           62     2787
##   Casa                100        722        169          289     1939

El análisis revela una clara variabilidad en la distribución de tipos de propiedades entre las zonas. La Zona Norte destaca por su alta concentración de apartamentos, mientras que la Zona Sur presenta la mayor cantidad total de apartamentos, superando a las casas en esta área. En contraste, la Zona Oriente se caracteriza por tener una mayor proporción de casas en comparación con los apartamentos. La Zona Centro y la Zona Oeste muestran una distribución más equilibrada, aunque la Zona Centro tiene una ligera inclinación hacia las casas.

Para analizar a profundidad la asociación entre ambas variables, haremos una prueba Chi-cuadrado.

chisq.test(tipo_zona)
## 
##  Pearson's Chi-squared test
## 
## data:  tipo_zona
## X-squared = 690.93, df = 4, p-value < 2.2e-16

La prueba de chi-cuadrado realizada revela una asociación significativa entre el tipo de propiedad y la zona geográfica, con un valor p muy bajo. Esto indica que la distribución de apartamentos y casas varía de manera estadísticamente significativa entre las diferentes zonas.

resultados_ac <- CA(tipo_zona)

viviendaClean$zona <- as.factor(viviendaClean$zona)
viviendaClean$tipo <- as.factor(viviendaClean$tipo)
cat_cols <- viviendaClean[sapply(viviendaClean, is.factor)]

res_AC <- MCA(cat_cols, ncp = 4, graph = FALSE)

rpAC <- fviz_screeplot(res_AC, addlabels = TRUE, ylim = c(0, 40))
varAC <- fviz_mca_var(res_AC, choice = "mca.cor",repel = TRUE, ggtheme = theme_minimal())

grid.arrange(rpAC, varAC, nrow = 1, ncol = 2)

#### 4.1 Análisis de Resultados

La gráfica nos ayuda a entender las relaciones y patrones entre las variables tipo de vienda y zona. No indica que cada dimensión sea una zona específica, sino que muestra cómo las zonas y tipos de vivienda se distribuyen en el espacio de las dimensiones derivadas del análisis. Con sólo dos dimensiones ya acumula el 45.8 % de la varianza.

Recomendaciones

Conclusiones