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.
El reto principal consisten en realizar un análisis integral y multidimensional de la base de datos para obtener una comprensión del mercado inmobiliario urbano. Se requiere aplicar diversas técnicas de análisis de datos, incluyendo:
Análisis de Componentes Principales: 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.
Análisis de Conglomerados: 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.
Análisis de Correspondencia : Examinar la relación entre las variables categóricas (tipo de vivienda, zona y barrio), para identificar patrones de comportamiento de la oferta en mercado inmobiliario.
Visualización de resultados: Presentar gráficos, mapas y otros recursos visuales para comunicar los hallazgos de manera clara y efectiva a la dirección de la empresa.
De acuerdo con el análisis PCA, la variable piso (entendida como el número de pisos de la vivienda) es la que más contribuye a explicar la variabilidad del componente representado (Componente 1 “Dim1”), que es el componente que a su vez concentra más de la mitad de la variabilidad de la base de datos. Entre los 3 primeros componentes principales se explica el 83% de la variabilidad de la base de datos.
El análisis de conglomerados dio como resultado que las variables que mejor explican la separación entre grupos son principalmente el precio, el número de baños y el área construida. Se identificaron de 3 clústers que concentran el 71% de la variabilidad de los datos y que se caracterizan así: (1) viviendas pequeñas y de bajo precio y en altura, (2) viviendas en niveles bajos, amplias y de precios moderados (3) viviendas de lujo, amplias en niveles bajos y con un precio y área construida elevados.
Entre estos clúster el 2 y 3 son los que más representan a la Dim1 concentra el 52,5% de la variabilidad de la base de datos.
Teniendo en cuenta los análisis resultantes de los anteriores retos, se infiere que variables como el precio, área construida y número de baños son las que más pueden segmentar el mercado de vivienda en la ciudad de Cali, así mismo se encuentra que el mercado se explica principalmente por viviendas amplias, en niveles bajos y con precios medios a altos.
Así mismo, se encontró una asociación de estratos y zonas de la ciudad, donde las viviendas de la zona oeste son las de estrato más alto, por lo cual se esperaría que estas viviendas sean las que mayor precio tengan. También es importante anotar que las viviendas de estratos más altos están concentradas en una zona específica de la ciudad, mientras que otros estratos relativamente altos (4 y 5) se encuentran dispersos en zonas opuestas de la ciudad (sur-norte).
Es relevante mencionar que dados los resultados de los análisis sería relevante enfocarse en las viviendas del clúster 2 que son aquellas de un área construida amplia pero con un precio moderado, las cuales serían apropiadas para la compra por parte de la inmobiliaria dada su relación área-precio.
A continuación se presenta a manera de anexo el detalle del procesamiento de datos y de los análisis realizados.
#cargar datos
data("vivienda")
Previo al desarrollo de los retos en esta actividad se realizó el análisis exploratorio de datos y el preprocesamiento/limpieza de la base para realizar los diferentes análisis, con los siguientes pasos:
1. Analizar el tipo de variables y dada la naturaleza de cada una realizar los respectivos ajustes
La variable piso tiene como tipo “chr” y estrato “num”. Dada la naturaleza de las variables, “piso” debería ser una variable numérica y “estrato”, pese a medirse en números es una variable categórica, por lo cual debe ser de tipo “chr”.
# 1. Analizar el tipo de variables y dada la naturaleza de cada una realizar los respectivos ajustes
#crear copia del dataframe para la limpieza
viviendas = vivienda
#cambiar tipo de dato de las variables "piso" y "estrato"
viviendas$piso = as.numeric(as.character(viviendas$piso))
viviendas$estrato = as.character(viviendas$estrato)
2. Validar categorías de variables cualitativas y estandarizar si es necesario.
Se identifica que en la variable “Barrio” es necesario unificar la escritura de diferentes barrios, así como eliminar algunos que no corresponden a barrios de la ciudad de Cali, que no existen o no se pueden identificar plenamente porque sus nombres están incompletos.
# Cambio de escritura de las variables
viviendas <- data.frame(lapply(viviendas, str_to_title))
# Ajustes en la denominación de barrios
viviendas$barrio[viviendas$barrio=="Alborada"]="La Alborada"
viviendas$barrio[viviendas$barrio=="Agua Blanca"]="Aguablanca"
viviendas$barrio[viviendas$barrio=="Sector Aguacatal"]="Aguacatal"
viviendas$barrio[viviendas$barrio=="Alameda"]="La Alameda"
viviendas$barrio[viviendas$barrio=="Alameda Del rio"] ="Alameda Del río"
viviendas$barrio[viviendas$barrio=="Alamos"] ="Los Alamos"
viviendas$barrio[viviendas$barrio=="Alf√©Rez Real" | viviendas$barrio=="Hacienda Alferez Real" | viviendas$barrio== "Alferez Real"] ="Alférez Real"
viviendas$barrio[viviendas$barrio=="Alfonso Lopez" | viviendas$barrio=="Alfonso López I"]="Alfonso López"
viviendas$barrio[viviendas$barrio=="Arboleda"] ="Arboledas"
viviendas$barrio[viviendas$barrio=="Arboleda Campestre Candelaria"] ="Arboleda Campestre"
viviendas$barrio[viviendas$barrio=="Barranquilla" | viviendas$barrio=="Urbanización Barranquilla"] ="Los Parques Barranquilla"
viviendas$barrio[viviendas$barrio=="Barrio 7de Agosto"] = "Siete De Agosto"
viviendas$barrio[viviendas$barrio=="Barrio El Recuerdo"] = "El Recuerdo"
viviendas$barrio[viviendas$barrio=="Barrio Eucarístico"] = "Eucarístico"
viviendas$barrio[viviendas$barrio=="Barrio Obrero"] = "Obrero"
viviendas$barrio[viviendas$barrio=="Base A√©Rea"] = "Base Aérea"
viviendas$barrio[viviendas$barrio=="Belalcazar"] = "Belalcázar"
viviendas$barrio[viviendas$barrio=="Bella Suiza Alta"] = "Bella Suiza"
viviendas$barrio[viviendas$barrio=="Bosques De Alboleda"] = "Bosques de Arboleda"
viviendas$barrio[viviendas$barrio=="Cañaverales"] = "Cañaverales Los Samanes"
viviendas$barrio[viviendas$barrio=="Calibella"] = "Cali Bella"
viviendas$barrio[viviendas$barrio=="Cali Canto" | viviendas$barrio=="Cali Canto viii" | viviendas$barrio=="Calicanto Viii"] = "Calicanto"
viviendas$barrio[viviendas$barrio=="Calimio Norte"] = "Calimio"
viviendas$barrio[viviendas$barrio=="Caney Especial"] = "Caney"
viviendas$barrio[viviendas$barrio=="Chiminangos 1 Etapa" | viviendas$barrio=="Chiminangos 2 Etapa"]="Chiminangos"
viviendas$barrio[viviendas$barrio=="Ciudad Antejardin" | viviendas$barrio=="Ciudad Jardin" | viviendas$barrio=="Ciudad Jardin Pance"] = "Ciudad Jardín"
viviendas$barrio[viviendas$barrio=="Ciudad Cordoba" | viviendas$barrio=="Ciudad Córdoba Reservado"]="Ciudad Córdoba"
viviendas$barrio[viviendas$barrio=="Ciudad Los Alamos"] = "Ciudad Los Álamos"
viviendas$barrio[viviendas$barrio=="Ciudad Mel√©Ndez"| viviendas$barrio=="Ciudadela Melendez" | viviendas$barrio=="Ciudad Melendez" ] = "Ciudad Meléndez"
viviendas$barrio[viviendas$barrio=="Ciudad Pacifica"] = "Ciudad Pacífica"
viviendas$barrio[viviendas$barrio=="Ciudadela Paso Ancho"] = "Ciudadela Pasoancho"
viviendas$barrio[viviendas$barrio=="Colseguros Andes" | viviendas$barrio=="Urbanización Colseguros"] = "Colseguros"
viviendas$barrio[viviendas$barrio=="Cristobal Colón"] = "Cristóbal Colón"
viviendas$barrio[viviendas$barrio=="Ed Benjamin Herrera"] = "Benjamín Herrera"
viviendas$barrio[viviendas$barrio=="El Ingenio 3" | viviendas$barrio=="El Ingenio I" | viviendas$barrio=="El Ingenio Ii" | viviendas$barrio== "El Ingenio Iii" | viviendas$barrio== "Ingenio" | viviendas$barrio== "Ingenio I" | viviendas$barrio== "Ingenio Ii" ] = "El Ingenio"
viviendas$barrio[viviendas$barrio=="El Tr√©Bol"] = "El Trébol"
viviendas$barrio[viviendas$barrio=="Flora" | viviendas$barrio=="Laflora" | viviendas$barrio=="Norte La Flora" | viviendas$barrio=="Urbanización La Flora"] = "La Flora"
viviendas$barrio[viviendas$barrio=="Guadalupe Alto"] = "Guadalupe"
viviendas$barrio[viviendas$barrio=="Juanamb√∫" | viviendas$barrio=="Juanambu"] = "Juanambú"
viviendas$barrio[viviendas$barrio=="Junin"] = "Junín"
viviendas$barrio[viviendas$barrio=="La Rivera" | viviendas$barrio=="La Rivera Ii" | viviendas$barrio=="La Riviera"] = "La Rivera I"
viviendas$barrio[viviendas$barrio=="Las Am√©Ricas"] = "Las Américas"
viviendas$barrio[viviendas$barrio=="Ceibas" | viviendas$barrio=="La Ceibas" ] = "Las Ceibas"
viviendas$barrio[viviendas$barrio=="Las Vegas De"] = "Las Vegas"
viviendas$barrio[viviendas$barrio=="Alcazares" | viviendas$barrio=="Los Alcazares"]= "Los Alcázares"
viviendas$barrio[viviendas$barrio=="Los Cámbulos"] = "Los Cambulos"
viviendas$barrio[viviendas$barrio=="Los Cristales" | viviendas$barrio=="Los Cristales Club"]= "Cristales"
viviendas$barrio[viviendas$barrio=="Guaduales"] = "Los Guaduales"
viviendas$barrio[viviendas$barrio=="Libertadores"] = "Los Libertadores"
viviendas$barrio[viviendas$barrio=="MeléNdez"] = "Melendez"
viviendas$barrio[viviendas$barrio=="Napoles"] = "Nápoles"
viviendas$barrio[viviendas$barrio=="Normandia" | viviendas$barrio=="Normandía West Point"] = "Normandía"
viviendas$barrio[viviendas$barrio=="La Nueva Base"] = "Nueva Base"
viviendas$barrio[viviendas$barrio=="Pacara" | viviendas$barrio=="Urbanización Pacara"] = "Pacará"
viviendas$barrio[viviendas$barrio=="Pampa Linda"] = "Pampalinda"
viviendas$barrio[viviendas$barrio=="Parcelaciones Pance" | viviendas$barrio=="Ponce"] = "Pance"
viviendas$barrio[viviendas$barrio=="Quintas De Don"] = "Quintas De Don Simón"
viviendas$barrio[viviendas$barrio=="Rep√∫Blica De Israel"] = "República de Israel"
viviendas$barrio[viviendas$barrio=="Quintas De Salomia" |viviendas$barrio=="Rincón De Salomia"] = "Salomia"
viviendas$barrio[viviendas$barrio=="San Fernando Nuevo" |viviendas$barrio=="San Fernando Viejo"] = "San Fernando"
viviendas$barrio[viviendas$barrio=="San Joaquin" | viviendas$barrio=="Urbanización San Joaquin"] = "San Joaquín"
viviendas$barrio[viviendas$barrio=="San Judas"] = "San Judas Tadeo"
viviendas$barrio[viviendas$barrio=="San Luís"] = "San Luis"
viviendas$barrio[viviendas$barrio=="San Nicolas"] = "San Nicolás"
viviendas$barrio[viviendas$barrio=="Santa Anita Sur"] = "Santa Anita"
viviendas$barrio[viviendas$barrio=="Santa Mónica" | viviendas$barrio=="Santa Mónica Alta" | viviendas$barrio=="Santa Mónica Residencial" | viviendas$barrio=="Santa Monica" | viviendas$barrio=="Santa Monica Norte" | viviendas$barrio=="Santa Monica Popular" | viviendas$barrio=="Santa Monica Residencial"] = "Santa Mónica Popular"
viviendas$barrio[viviendas$barrio=="Santa Helena De"] = "Santa Elena"
viviendas$barrio[viviendas$barrio=="Sector Cañaveralejo Guadalupe"] = "Cañaveralejo Guadalupe"
viviendas$barrio[viviendas$barrio=="Tejares Cristales"] = "Los Cristales Tejares"
viviendas$barrio[viviendas$barrio=="Urbanización Boyacá"] = "Boyacá"
viviendas$barrio[viviendas$barrio=="Urbanización La Merced"] = "La Merced"
viviendas$barrio[viviendas$barrio=="Urbanización Río Lili" | viviendas$barrio=="Urbanizacion Lili" | viviendas$barrio=="Valle Del Lili"] = "Valle De Lili"
viviendas$barrio[viviendas$barrio=="Villa De Veracruz"] = "Villas De Veracruz"
# eliminar los siguientes barrios porque no se puede identificar plenamente el nombre, son zonas de la ciudad o corresponden a sectores de otros municipios del valle como Jamundí y Palmira.
viviendas <- viviendas[viviendas$barrio != "Barrio Tranqilo" & viviendas$barrio != "Brisas De Los" & viviendas$barrio != "Cali" & viviendas$barrio != "Autopista Sur" & viviendas$barrio != "Centro" & viviendas$barrio != "Conjunto Gibraltar" & viviendas$barrio != "Fuentes De La" & viviendas$barrio != "Jamundi Alfaguara" & viviendas$barrio != "La Portada Al" & viviendas$barrio != "La Villa Del" & viviendas$barrio != "Las Quintas De" & viviendas$barrio != "Los Jockeys" & viviendas$barrio != "Norte" & viviendas$barrio != "Occidente" & viviendas$barrio != "Parque Residencial El" & viviendas$barrio != "Paseo De Los" & viviendas$barrio != "Rincon De La" & viviendas$barrio != "Rozo La Torre " & viviendas$barrio != "Rincon De La" & viviendas$barrio != "Samanes" & viviendas$barrio != "Samanes De Guadalupe" & viviendas$barrio != "Santa" & viviendas$barrio != "Tejares De San" & viviendas$barrio != "Urbanización La Nueva" & viviendas$barrio != "Unicentro Cali" & viviendas$barrio != "Urbanizacion El Saman" & viviendas$barrio != "Zona Centro" & viviendas$barrio != "Zona Norte" & viviendas$barrio != "Zona Norte Los" & viviendas$barrio != "Zona Oeste" & viviendas$barrio != "Zona Oriente" & viviendas$barrio != "Zona Residencial" & viviendas$barrio != "Zona Sur",]
3. Analizar los datos faltantes y duplicados y realizar la limpieza y/o imputación
Se identifican los valores nulos y se encuentra que hay 3 observaciones que tienen valores nulos en todas las variables, por lo cual se eliminan bajo el criterio de ID.
#Grafico de valores nulos
md.pattern(viviendas)
## id zona estrato preciom areaconst banios habitaciones tipo barrio longitud
## 4681 1 1 1 1 1 1 1 1 1 1
## 1855 1 1 1 1 1 1 1 1 1 1
## 809 1 1 1 1 1 1 1 1 1 1
## 643 1 1 1 1 1 1 1 1 1 1
## 3 0 0 0 0 0 0 0 0 0 0
## 3 3 3 3 3 3 3 3 3 3
## latitud parqueaderos piso
## 4681 1 1 1 0
## 1855 1 1 0 1
## 809 1 0 1 1
## 643 1 0 0 2
## 3 0 0 0 13
## 3 1455 2501 3989
# Contar los valores NA por columna
na_counts <- colSums(is.na(viviendas))
na_counts
## id zona piso estrato preciom areaconst
## 3 3 2501 3 3 3
## parqueaderos banios habitaciones tipo barrio longitud
## 1455 3 3 3 3 3
## latitud
## 3
Se decide eliminar los valores nulos de la variable ID porque no existe posibilidad de identificar o imputar este campo que corresponde a un código único para cada observación.
#Tratamiento de valores nulos en todas las variables
viviendas <- viviendas[!is.na(viviendas$id),]
Después de eliminar los registros sin ID, se validaron los duplicados y no se encontraron observaciones en la variables ID, por lo cual no se realiza ninguna eliminación adicional.
Respecto a las variables “piso” y “parqueaderos” se realiza una imputación usando el método “KNN” (K-nearest neighbors).
#Imputación datos faltantes
set.seed(123) # Fijar semilla antes del proceso aleatorio
# Se crea un sub set de datos con las variables a imputar valores nulos
par_piso <- viviendas[, c("parqueaderos", "piso")]
# Método KNN
imp_pp <- kNN(par_piso, k = 5, imp_var = FALSE)
# Unir las variables imputadas con el dataset original
vivienda_knn <- viviendas #saca una copia del dataset sin imputaciones
vivienda_knn$parqueaderos <- imp_pp$parqueaderos
vivienda_knn$piso <- imp_pp$piso
# Transformar a tipo numérico las variables
viviendas$parqueaderos <- as.numeric(viviendas$parqueaderos)
vivienda_knn$parqueaderos <- as.numeric(vivienda_knn$parqueaderos)
viviendas$piso <- as.numeric(viviendas$piso)
vivienda_knn$piso <- as.numeric(vivienda_knn$piso)
#Comparar gráficamente con boxplot los datos antes y después de la imputación para parqueaderos
par(mfrow=c(1,2))
boxplot(viviendas$parqueaderos ~ viviendas$tipo, main = "Parqueaderos: Antes de la imputación",
cex.main = 1)
boxplot(vivienda_knn$parqueaderos ~ vivienda_knn$tipo, main = "Parqueaderos: Después Imputación KNN",
cex.main = 1)
#Comparar gráficamente con boxplot los datos antes y después de la imputación para piso
par(mfrow=c(1,2))
boxplot(viviendas$piso ~ viviendas$tipo, main = "Piso: Antes de la imputación",
cex.main = 1)
boxplot(vivienda_knn$piso ~ vivienda_knn$tipo, main = "Piso: Después Imputación KNN",
cex.main = 1)
Se observa que los datos antes y después de la imputación reducen la dispersión de los datos (cajas más pequeñas), particularmente en parqueaderos-casas.
4. Analizar correlaciones y seleccionar variables para análisis PCA
#Seleccionar variables numéricas
viv_num <- vivienda_knn[,c("preciom", "piso", "areaconst", "parqueaderos",
"banios", "habitaciones")]
viv_num <- data.frame(lapply(viv_num, function(x) as.numeric(as.character(x)))) #transformar todas las variables a numéricas
corPlot(viv_num, cex = 0.6, cex.main = 1, main = "Matriz de correlación")
Por la matriz de correlaciones se puede identificar que la mayor correlación se encuentra entre el precio y el área construida, el número de parqueaderos y de baños. No obstante no es significativamente alta (>0.85) para considerar eliminar alguna de las variables, por lo cual se podrían conservar todas las variables para el análisis de PCA. Se anota que se excluyeron las variables ID, latitud y longitud, considerando que son variables que no representan una métrica relativa a las unidades de vivienda sino parámetros de identificación y de localización.
Se realiza una estandarización de las variables para evitar los sesgos por las escalas de cada variable y se inicia el proceso de PCA.
# Estandarización de las variables
vivienda_pca= scale(viv_num) #se toman únicamente las variables numéricas
head(vivienda_pca) # primeros 6 registros
## preciom piso areaconst parqueaderos banios habitaciones
## [1,] -0.5691234 -0.8356449 -0.7386110 -0.7411043 -0.08486374 1.6503699
## [2,] -0.3558099 -0.8356449 -0.3883572 -0.7411043 -0.78807079 -0.4167113
## [3,] -0.2643899 -0.4289223 0.3121503 0.2059347 -0.78807079 0.2723158
## [4,] -0.1120231 -0.4289223 0.7324549 1.1529738 1.32155035 -0.4167113
## [5,] -0.5386500 -0.8356449 -0.5985095 -0.7411043 -0.78807079 -0.4167113
## [6,] -0.5995967 -0.8356449 -0.6195247 -0.7411043 -0.08486374 -0.4167113
#apliación del PCA
set.seed(123) # Fijar semilla antes del proceso aleatorio
viv_pca <- prcomp(vivienda_pca)
viv_pca
## Standard deviations (1, .., p=6):
## [1] 1.7742994 1.0547797 0.8835641 0.6554212 0.5797233 0.4392719
##
## Rotation (n x k) = (6 x 6):
## PC1 PC2 PC3 PC4 PC5
## preciom 0.47089259 -0.26885579 0.26688591 -0.40842030 -0.16624650
## piso -0.07289713 -0.80822012 -0.56475466 -0.01559019 0.14773997
## areaconst 0.48715597 0.07391250 0.03773725 -0.35765555 0.69728811
## parqueaderos 0.40897618 -0.30842836 0.38853183 0.75787735 0.06706808
## banios 0.48875135 0.01610024 -0.23798325 -0.13375044 -0.66533999
## habitaciones 0.35984141 0.41670910 -0.63309318 0.33580509 0.13095372
## PC6
## preciom 0.66355377
## piso -0.02117233
## areaconst -0.37638239
## parqueaderos -0.08818870
## banios -0.49361969
## habitaciones 0.40761106
fviz_eig(viv_pca, addlabels = TRUE)
El gráfico indica que en la primera componente principal se explica más del 50% de la variabilidad en la base de datos, entre las 2 primeras cerca del 73% y en las 3 primeras componentes se explica el 85% de la variabilidad de la base de datos. Se observa que la primera componente principal es relevante porque es una combinación lineal de todas las variables que permite resumir más de la mitad de la variabilidad de los datos.
fviz_pca_var(viv_pca,
col.var = "contrib", # Color by contributions to the PC
gradient.cols = c("#FF7F00", "#034D94"),
repel = TRUE # Avoid text overlapping
)
A partir de este gráfico se puede observar que la variable “piso” es la que separa en su mayoría al primer componente principal dada la cercanía de su flecha con el círuclo y su color (azul) en la escala de contribución. Las variables precio, habitaciones, area construida, baños y parqueaderos, separan más a la segunda componente principal y entre ellas las variables precio, baños y área construida son las que mejor separan este segundo componente principal.
Busca 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.Se realiza este análisis con análisis de cluster con método de distancia Euclidiana.
set.seed(123) # Fijar semilla antes del proceso aleatorio
# Estandarizar dataframe
viv_cong <- vivienda_knn[,c("preciom", "piso", "areaconst", "parqueaderos",
"banios", "habitaciones")] #solo selecciona datos numéricos
viv_cong <- data.frame(lapply(viv_cong, function(x) as.numeric(as.character(x))))
viv_cong_s =scale(viv_cong)
viv_cong = as.data.frame(viv_cong_s)
head(viv_cong)
set.seed(123) # Fijar semilla antes del proceso aleatorio
# distancia euclidiana
dist_viv <- dist(viv_cong, method = 'euclidean')
# Clúster jerárquico con el método complete
hc_emp <- hclust(dist_viv, method = 'complete')
# Determinamos a dónde pertenece cada observación
cluster_assigments <- cutree(hc_emp, k = 4)
# asignamos los clusters
assigned_cluster <- viv_cong %>% mutate(cluster = as.factor(cluster_assigments))
Para establecer mejor gráficamente los resultados del clustering, se utiliza un Análisis de conglomerados jerárquico con la fución HCPC, que a partir del criterio “nb.clust=-1”, determina automáticamente los clúster con base en los codos del dendrograma.
set.seed(123) # Fijar semilla antes del proceso aleatorio
viv_cong <- PCA(viv_cong_s,graph = FALSE)
# Análisis de conglomerados jerárquicos - Visualización
Cluster.Calificaciones <- HCPC(viv_cong,nb.clust = -1)
fviz_cluster(Cluster.Calificaciones,
show.clust.cent = TRUE, #para mostrar los clúster centrales
ggtheme = theme_minimal(),
main = "")
Dado que el método usado es una combinación de PCA y agrupamiento jerárquico, el gráfico anterior (mapa de individuos) permite observar que se identificaron 3 clústers dentro de las 2 primeras componentes principales. De este gráfico se interpreta que las variables dentro del clúster 3 son las que mayor peso tienen para la primera componente principal (Dim1) por su orientación hacia la derecha del eje, mientras que el clúster 1 tiene mayor peso sobre la segunda componente principal (Dim2); por su parte el clúster 2 parece tener un peso intermedio entre las dos componentes principales. El clúster que menos se superpone sobre los demás es el 1, lo que indica que este grupo es muy diferentes de los demás, a diferencia del clúster 2 y 3 que tienden a superponerse entre sí.
#Para describir las variables que conforman cada clúster
Cluster.Calificaciones$desc.var
##
## Link between the cluster variable and the quantitative variables
## ================================================================
## Eta2 P-value
## preciom 0.67424590 0.000000e+00
## areaconst 0.56555418 0.000000e+00
## parqueaderos 0.50748662 0.000000e+00
## banios 0.59936899 0.000000e+00
## habitaciones 0.35935713 0.000000e+00
## piso 0.03324288 2.396866e-59
##
## Description of each cluster by quantitative variables
## =====================================================
## $`1`
## v.test Mean in category Overall mean sd in category Overall sd
## piso 15.07945 0.1406447 -7.719867e-17 1.1092768 0.9999374
## parqueaderos -42.29476 -0.3944796 -7.797135e-18 0.4903768 0.9999374
## habitaciones -53.45624 -0.4985817 9.214796e-17 0.4607521 0.9999374
## preciom -56.79722 -0.5297427 -1.179907e-17 0.3783568 0.9999374
## areaconst -59.04174 -0.5506771 4.627442e-17 0.3102574 0.9999374
## banios -66.60925 -0.6212587 3.238382e-17 0.4846647 0.9999374
## p.value
## piso 2.211087e-51
## parqueaderos 0.000000e+00
## habitaciones 0.000000e+00
## preciom 0.000000e+00
## areaconst 0.000000e+00
## banios 0.000000e+00
##
## $`2`
## v.test Mean in category Overall mean sd in category
## habitaciones 43.969031 0.75561988 9.214796e-17 1.1213268
## banios 40.334465 0.69315885 3.238382e-17 0.7367233
## areaconst 26.059857 0.44784579 4.627442e-17 0.6855191
## preciom 15.341322 0.26364484 -1.179907e-17 0.5989023
## parqueaderos 3.316163 0.05698917 -7.797135e-18 0.6230278
## piso -15.633265 -0.26866195 -7.719867e-17 0.6920004
## Overall sd p.value
## habitaciones 0.9999374 0.000000e+00
## banios 0.9999374 0.000000e+00
## areaconst 0.9999374 1.040249e-149
## preciom 0.9999374 4.048627e-53
## parqueaderos 0.9999374 9.126266e-04
## piso 0.9999374 4.320862e-55
##
## $`3`
## v.test Mean in category Overall mean sd in category Overall sd
## preciom 66.25947 2.0844259 -1.179907e-17 1.0943065 0.9999374
## parqueaderos 61.08311 1.9215852 -7.797135e-18 1.4466811 0.9999374
## areaconst 54.23302 1.7060913 4.627442e-17 1.4549106 0.9999374
## banios 45.34859 1.4266002 3.238382e-17 0.9456056 0.9999374
## habitaciones 19.59548 0.6164452 9.214796e-17 1.1205217 0.9999374
## p.value
## preciom 0.000000e+00
## parqueaderos 0.000000e+00
## areaconst 0.000000e+00
## banios 0.000000e+00
## habitaciones 1.689689e-85
Al analizar las características que definen cada grupo, el indicador \(Eta^2\) muestra que las variables que mejor explican la separación entre grupos son principalmente el precio, el número de baños y el área construida.
Al analizar las características de cada clúster se encuentra que:
Busca examinar la relación entre las variables categóricas (tipo de vivienda, estrato zona y barrio), para identificar patrones de comportamiento de la oferta en mercado inmobiliario.
# Crear un data frame con las variables cualitativas
viv_corr <- vivienda_knn[,c("zona", "barrio", "estrato", "tipo")]
viv_corr <- na.omit(viv_corr)
tablac <- table(viv_corr$zona, viv_corr$estrato)
res_corr <- CA(tablac)
valores_prop <-res_corr$eig
tablad <- table(viv_corr$estrato, viv_corr$tipo)
res_corr2 <- CA(tablad, graph=TRUE)
valores_prop2 <-res_corr2$eig
El anterior gráfico que asocia zonas vs estrato, permite identificar que:
fviz_screeplot(res_corr, addlabels = TRUE, ylim = c(0, 80))+ggtitle("")+
ylab("Porcentaje de varianza explicado") + xlab("Ejes")
Los resultados del gráfico anterior indican que la primera componente resumen el 68.6% y los dos primeros componentes prepresentados en el plano factorial, mientras que los dos primeros ejes resumen un 97.3% de los datos.