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.
La tabla presenta datos recopilados de 8,322 viviendas, registrando información en 12 variables distintas, incluyendo zona, piso, estrato, precio, área de construcción, cantidad de parqueaderos, número de baños, cantidad de habitaciones, tipo de vivienda, barrio, longitud y latitud.
Se detalla el tipo de dato contenido en cada una de las variables.
## [1] "character"
## [1] "character"
## [1] "numeric"
## [1] "numeric"
## [1] "numeric"
## [1] "numeric"
## [1] "numeric"
## [1] "numeric"
## [1] "character"
## [1] "character"
## [1] "numeric"
## [1] "numeric"
En la tabla hay 4 variables tipo texto y 8 variables tipo número.
Se validan si existen datos faltantes en el dataframe
## [1] 3
## [1] 2638
## [1] 3
## [1] 2
## [1] 3
## [1] 1605
## [1] 3
## [1] 3
## [1] 3
## [1] 3
## [1] 3
## [1] 3
e identificaron valores faltantes en todas las columnas del conjunto de datos, con mayor incidencia en las columnas de “piso” y “parqueaderos”. Por lo tanto, para simplificar el análisis, se optó por descartar estas dos variables y eliminarlas del dataframe. Además, se omitirá la variable “barrio” en este análisis.
Se eliminan las filas con datos faltantes,
## [1] 0
La tabla queda con 8,319 registros medidos en 9 variables.
Se hace una recodificación de las 2 variables categóricas (zona y tipo) que quedan en la tabla,
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
# Zona
vivienda <- vivienda %>% mutate(zona = replace(zona,
zona == "Zona Centro", 1))
vivienda <- vivienda %>% mutate(zona = replace(zona,
zona == "Zona Norte", 2))
vivienda <- vivienda %>% mutate(zona = replace(zona,
zona == "Zona Oeste", 3))
vivienda <- vivienda %>% mutate(zona = replace(zona,
zona == "Zona Oriente",
4))
vivienda <- vivienda %>% mutate(zona = replace(zona,
zona == "Zona Sur", 5))
vivienda$zona <- as.numeric(vivienda$zona)
# Tipo
vivienda <- vivienda %>% mutate(tipo = replace(tipo,
tipo == "Casa", 1))
vivienda <- vivienda %>% mutate(tipo = replace(tipo,
tipo == "Apartamento", 2))
vivienda$tipo <- as.numeric(vivienda$tipo)
head(vivienda,5) # TablaDespués de aplicar la recodificación, las variables se presentan de la siguiente manera:
Zona
Zona Centro: 1 Zona Norte: 2 Zona Oeste: 3 Zona Oriente: 4 Zona Sur: 5
Tipo
Casa: 1 Apartamento: 2
correlacion <- round(cor(vivienda), 1)
# corrplot(correlacion, number.cex = 0.5, method="number")
corPlot(correlacion, number.cex = 0.5)## Warning in axis(2, at = at2, labels = lab2, las = ylas, ...): "number.cex" is
## not a graphical parameter
## Warning in axis(xaxis, at = at1, labels = FALSE, las = xlas, line = line, :
## "number.cex" is not a graphical parameter
## Warning in text.default(at1, par("usr")[3] * 3, labels = lab1, srt = xsrt, :
## "number.cex" is not a graphical parameter
## Warning in text.default(rx, ry, rv, cex = 1.5 * cex, ...): "number.cex" is not
## a graphical parameter
## Warning in axis(4, at = at2, labels = labels, las = 2, ...): "number.cex" is
## not a graphical parameter
hist(x = vivienda$zona,
main = "Histograma de Zonas",
xlab = "Zona", ylab = "Frecuencia",
col = "purple") # zonahist(x = vivienda$estrato,
main = "Histograma de Estratos",
xlab = "Estrato", ylab = "Frecuencia",
col = "red") # estratohist(x = vivienda$preciom,
main = "Histograma de Precios",
xlab = "Precio", ylab = "Frecuencia",
col = "green") # preciomhist(x = vivienda$areaconst,
main = "Histograma de Áreas",
xlab = "Área", ylab = "Frecuencia",
col = "white") # areaconsthist(x = vivienda$banios,
main = "Histograma de Número de Baños",
xlab = "Número de Baños", ylab = "Frecuencia",
col = "blue") # banioshist(x = vivienda$habitaciones,
main = "Histograma de Número de Habitaciones",
xlab = "Número de Habitaciones", ylab = "Frecuencia",
col = "pink") # habitacionesLa mayoría de los histogramas presentan una falta de simetría, ya que muestran una inclinación hacia la derecha en casi todas las variables. Esto sugiere un ajuste deficiente en la mayoría de las variables.
Se generan diagramas de caja (Box-Plot) para cada una de las variables de interés.
boxplot(x = vivienda$habitaciones,
main = "Histograma de Número de Habitaciones",
col = "pink") # habitacionesSe detectan datos atípicos en la mayoría de las variables, lo que podría explicar la asimetría observada en algunos de los histogramas generados anteriormente.
Para el Análisis de Componentes Principales (ACP), se seleccionan las siguientes variables: estrato, precio, área de construcción, número de baños y número de habitaciones.
Se procede a analizar la varianza de las variables cuantitativas.
## estrato preciom areaconst banios habitaciones
## 1.059298e+00 1.080207e+05 2.043874e+04 2.039784e+00 2.130248e+00
La varianza de los datos es casi uniforme y bastante próxima a cero en las cinco variables seleccionadas, lo que sugiere una baja dispersión en los datos.
Para realizar el Análisis de Componentes Principales (ACP), se utiliza la función prcomp(), ya que permite estandarizar las variables para que tengan una media de cero y una desviación estándar de uno.
Se realiza el gráfico de las 2 primeras componentes,
## Loading required package: ggplot2
##
## Attaching package: 'ggplot2'
## The following objects are masked from 'package:psych':
##
## %+%, alpha
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
fviz_pca_ind(pca, geom.ind = "point",
col.ind = "#FC4E07",
axes = c(1, 2),
pointsize = 1.5) # GráficoNo se evidencian conglomerados de registros con características similares
Se realiza el mismo gráfico, pero tomando como variable etiqueta la zona de las viviendas,
colores <- function(vec){
col <- rainbow(length(unique(vec)))
return(col[as.numeric(as.factor(vec))])
} # Función para el color
plot(pca$x[,1:2], col = colores(vivienda$zona),
pch = 19,
xlab = "Z1",
ylab = "Z2") # GráficoSe alcanza a visualizar que en la parte superior del gráfico se encuentran las viviendas identificadas con los colores rojo y azul, sin embargo, no hay una agrupación de datos claramente definida en el plano.
Para este caso se tiene 5 componentes principales y se observa la varianza explicada por cada una de ellas,
## [1] 58.66 23.77 8.91 4.83 3.83
Gráfico varianza explicada de cada componente,
La primera componente explica el 58.7 % de la varianza observada de los datos, esto es más de la mitad del total de la varianza observada.
Se generan dos gráficos para identificar que componentes tienen un mayor peso sobre PC1 y PC2,
## Dim.1 Dim.2
## estrato 10.89021 45.486434
## preciom 25.69187 7.882934
## areaconst 24.40828 2.683486
## banios 26.93215 1.194279
## habitaciones 12.07750 42.752867
Se puede observar que la variable número de baños es la que tiene mayor influencia en la primera componente, seguido muy de cerca por las variables precio de la vivienda y estrato. Por otro lado, para la segunda componente, las variables estrato y habitaciones son las más influyentes, respectivamente.
Se genera otro gráfico para mirar las influencia de las variables en un plano,
Se observa que las variables que están sobre el primer cuadrante corresponden a características asociadas a la infraestructura del inmueble, mientras que las variables en el cuarto cuadrante del plano, corresponden a otro tipo de características.
Se observa la varianza explicada acumulada,
## [1] 58.66 82.43 91.34 96.17 100.00
Gráfico varianza explicada acumulada,
ggplot(data = data.frame(prop_varianza_acum, pc = 1:5),
aes(x = pc, y = prop_varianza_acum, group = 1)) +
geom_point() +
geom_line() +
theme_bw() +
labs(x = "Componente principal",
y = "Prop. varianza explicada acumulada")Si se empleasen únicamente las 2 primeras componentes se conseguiría explicar el 82.43 % de la varianza observada.
Conclusiones: Análisis de Componentes Principales (ACP)
Del Análisis de Componentes Principales (ACP) se concluye lo siguiente:
Desde la visualización de los datos en 2D, no se alcanza a distinguir de forma clara, un patrón o comportamiento de las viviendas según la zona en la cual se encuentran.
La primera componente explica el 58.7 % de la varianza observada de los datos y la segunda componente el 23.8% de la varianza observada, por tanto, en conjunto ambas componentes logran explicar el 82.43% de esta varianza. Es decir, en ambas componentes contienen la mayor parte de la información contenida en las 5 variables.
En la primera componente, las variables número de baños, precio de la vivienda y área construida, son las que presentan una mayor influencia respectivamente. En la segunda componente, las variables estrato y habitaciones, son las que presentan una mayor influencia respectivamente. Según el análisis de matriz de correlaciones que se hizo inicialmente, las variables de mayor influencia de la primera componente están altamente correlacionadas entre sí, por tanto, esta componente puede pertenecer a las variables correlacionadas.
En caso de querer ejecutar un modelo de regresión simple, se pueden usar las 2 componentes obtenidas con el ACP, pero si se desea un modelo de regresión múltiple, se pueden emplear las 5 variables originales y posteriormente comparar el ajuste y predicciones de ambos modelos.
Análisis de Conglomerados (Clustering) Para el análisis de conglomerados (Clustering), se toman las siguientes variables: estrato, preciom, areacons, banios, habitaciones y zona.
Dado que los rangos de las variables son diferentes y con fin de que estas diferencias en las dimensiones de las variables no afecte los cálculos de las distancias, se estandarizan las variables (media 0 y varianza 1) antes de generar los cálculos de las distancias,
vivienda_3_est <- scale(vivienda_3)
vivienda_3_est <- as.data.frame(vivienda_3_est)
head(vivienda_3_est,5)Métodos NO Jerárquicos Se genera un gráfico para seleccionar el número de clusters adecuado para este conjunto de datos,
scv <- (nrow(vivienda_3_est) - 1) * sum(apply(vivienda_3_est, 2, var))
for (i in 2:15) scv[i] <- sum(kmeans(vivienda_3_est,
centers = i)$withinss)## Warning: did not converge in 10 iterations
plot(1:15, scv,
type = "b",
xlab = "Cantidad de Clusters",
ylab="Suma de cuadrados dentro de grupos")El codo de la distribución no es completamente evidente pero se puede asumir que se encuentra en el cluster 3.
En este caso, la técnica que se utliza para generar los clusters es K-Means (es un método de agrupamiento, que tiene como objetivo la partición de un conjunto de n observaciones en k grupos en el que cada observación pertenece al grupo cuyo valor medio es más cercano),
set.seed(0)
modelo_kmeans <- kmeans(vivienda_3_est, 3) # Ajuste
vivienda_3_est <- data.frame(vivienda_3_est,
modelo_kmeans$cluster) # Cluster
aggregate(vivienda_3,
by = list(vivienda_3_est$modelo_kmeans.cluster),
FUN = median) # Medianas Estas medidas nos dan una idea de la estructura interna que posee cada cluster:
El cluster 1 se caracteríza por tener las viviendas de menor precio, área y estrato, de hecho, la mediana del número de baños y habitaciones es congruente con estas medidas.
Por otro lado, las viviendas asociadas al cluster 2, son las de mayor precio y área, esto es congruente con la mediana correspondiente al número de baños y habitaciones en este cluster.
La característica más relevante del cluster 3, son las viviendas del estrato 6 que es el más alto. A pesar de ser inmubebles que no tienen un área muy grande, el valor comercial de estas viviendas está muy cercano a las viviendas del cluster 2.
Se observa la cantidad de registros que quedaron en cada cluster,
##
## 1 2 3
## 4493 1268 2558
El cluster 1 es el que tiene una mayor cantidad de datos.
Se realiza el gráfico de la agrupación,
fviz_cluster(list(data = vivienda_3_est[,1:6],
cluster = vivienda_3_est$modelo_kmeans.cluster),
palette = c("#2E9FDF", "#E7B800", "#FC4E07"),
ellipse.type = "convex",repel = F,
show.clust.cent = FALSE, ggtheme = theme_minimal())Este gráfico respalda los resultados obtenidos anteriormente, pues evidentemente los clusters 1 y 2 están situados en los extremos del plano, lo que indica la lejania que existe entre estos grupos por las características que poseen.
Método Jerárquico Para comparar los resultados obtenidos con K-Means se emplea un método jerárquico de agrupación.
En este caso se utilizan las distacias euclidianas y se toma como criterio para ajustar el modelo jerarquico el método Ward de varianza mínima,
set.seed(0)
dist_eu <- dist(vivienda_3_est[,1:6],method = "euclidean")
modelo_jer <- hclust(dist_eu, method = "ward.D") Para seleccionar el número adecuado de clusters se emplea el coeficiente de Silhouette,
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats 1.0.0 ✔ stringr 1.5.0
## ✔ lubridate 1.9.2 ✔ tibble 3.2.1
## ✔ purrr 1.0.2 ✔ tidyr 1.3.0
## ✔ readr 2.1.4
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ ggplot2::%+%() masks psych::%+%()
## ✖ ggplot2::alpha() masks psych::alpha()
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
# k = 2
cluster_assigments_k2 <- cutree(modelo_jer, k = 2) # Cluster
sil_1_k2 <- silhouette(cluster_assigments_k2, dist(vivienda_3_est[,1:6]))
sil_1_avg_k2 <- mean(sil_1_k2[,3])
cat("Coeficiente de Silhouette promedio k=2 : ", sil_1_avg_k2)## Coeficiente de Silhouette promedio k=2 : 0.2907282
# k = 3
cluster_assigments_k3 <- cutree(modelo_jer, k = 3) # Cluster
sil_1_k3 <- silhouette(cluster_assigments_k3, dist(vivienda_3_est[,1:6]))
sil_1_avg_k3 <- mean(sil_1_k3[,3])
cat("Coeficiente de Silhouette promedio k=3 : ", sil_1_avg_k3)## Coeficiente de Silhouette promedio k=3 : 0.2521172
# k = 4
cluster_assigments_k4 <- cutree(modelo_jer, k = 4) # Cluster
sil_1_k4 <- silhouette(cluster_assigments_k4, dist(vivienda_3_est[,1:6]))
sil_1_avg_k4 <- mean(sil_1_k4[,3])
cat("Coeficiente de Silhouette promedio k=4 : ", sil_1_avg_k4) ## Coeficiente de Silhouette promedio k=4 : 0.2772796
# k = 5
cluster_assigments_k5 <- cutree(modelo_jer, k = 5) # Cluster
sil_1_k5 <- silhouette(cluster_assigments_k5, dist(vivienda_3_est[,1:6]))
sil_1_avg_k5 <- mean(sil_1_k5[,3])
cat("Coeficiente de Silhouette promedio k=5 : ", sil_1_avg_k5)## Coeficiente de Silhouette promedio k=5 : 0.2883832
# k = 6
cluster_assigments_k6 <- cutree(modelo_jer, k = 6) # Cluster
sil_1_k6 <- silhouette(cluster_assigments_k6, dist(vivienda_3_est[,1:6]))
sil_1_avg_k6 <- mean(sil_1_k6[,3])
cat("Coeficiente de Silhouette promedio k=6 : ", sil_1_avg_k6)## Coeficiente de Silhouette promedio k=6 : 0.2191879
# k = 7
cluster_assigments_k7 <- cutree(modelo_jer, k = 7) # Cluster
sil_1_k7 <- silhouette(cluster_assigments_k7, dist(vivienda_3_est[,1:6]))
sil_1_avg_k7 <- mean(sil_1_k7[,3])
cat("Coeficiente de Silhouette promedio k=7 : ", sil_1_avg_k7)## Coeficiente de Silhouette promedio k=7 : 0.2328442
El valor indicado para k es el más cercano a 1. Estos valores que arroja el coeficiente están muy lejanos de 1, sim embargo, se toma el valor más próximo, que en este caso corresponde a k = 2.
Se crea un dendograma para visualizar las agrupaciones,
Se observa la cantidad de datos pertenecientes a cada cluster,
cluster_jer <- cutree(modelo_jer, k = 2)
vivienda_3_est <- data.frame(vivienda_3_est,cluster_jer)
table(vivienda_3_est$cluster_jer)##
## 1 2
## 2781 5538
El cluster de mayor tamaño es el número 2 y la diferencia es bastante grande.
Descripción de los clusters,
En este caso se identifican claramente 2 panoramas, por un lado, el cluster 1 contiene datos que en su mayoría pertenecen a viviendas precios, áreas y estratos altos, mientras que el cluster 2 son viviendas que en su mayoría también son estrato 5, pero que tienen áreas y precios inferiores a los inmuebles del cluster 1.
Se realiza el gráfico de dispersión,
fviz_cluster(list(data = vivienda_3_est[,1:6],
cluster = vivienda_3_est$cluster_jer),
palette = c("#2E9FDF", "#E7B800"),
ellipse.type = "convex",repel = F,
show.clust.cent = FALSE, ggtheme = theme_minimal())Se desea validar si las distancias en el dendograma reflejan las distancias originales. Para esto, se calcula la correlación entre las distancias cofenéticas y los datos de distancia originales (distancia euclideana)
## [1] 0.4827681
La asociación entre ambas variables NO es tan buena, por tanto, no hay una buena precisión del agrupamiento realizado por el método jerárquico con el método Ward.
Se emplea el método “average” en lugar de “Ward.D”, para comparar los resultados entre ambos criterios de agrupación,
Para seleccionar el número adecuado de clusters se emplea nuevamente el coeficiente de Silhouette,
# k = 2
cluster_assigments_k2_2 <- cutree(modelo_jer_2, k = 2) # Cluster
sil_2_k2 <- silhouette(cluster_assigments_k2_2,
dist(vivienda_3_est[,1:6]))
sil_2_avg_k2 <- mean(sil_2_k2[,3])
cat("Coeficiente de Silhouette promedio k=2 : ", sil_2_avg_k2)## Coeficiente de Silhouette promedio k=2 : 0.6970237
# k = 3
cluster_assigments_k3_2 <- cutree(modelo_jer_2, k = 3) # Cluster
sil_2_k3 <- silhouette(cluster_assigments_k3_2,
dist(vivienda_3_est[,1:6]))
sil_2_avg_k3 <- mean(sil_2_k3[,3])
cat("Coeficiente de Silhouette promedio k=3 : ", sil_2_avg_k3)## Coeficiente de Silhouette promedio k=3 : 0.5093748
# k = 4
cluster_assigments_k4_2 <- cutree(modelo_jer_2, k = 4) # Cluster
sil_2_k4 <- silhouette(cluster_assigments_k4_2,
dist(vivienda_3_est[,1:6]))
sil_2_avg_k4 <- mean(sil_2_k4[,3])
cat("Coeficiente de Silhouette promedio k=4 : ", sil_2_avg_k4) ## Coeficiente de Silhouette promedio k=4 : 0.5089671
# k = 5
cluster_assigments_k5_2 <- cutree(modelo_jer_2, k = 5) # Cluster
sil_2_k5 <- silhouette(cluster_assigments_k5_2,
dist(vivienda_3_est[,1:6]))
sil_2_avg_k5 <- mean(sil_2_k5[,3])
cat("Coeficiente de Silhouette promedio k=5 : ", sil_2_avg_k5)## Coeficiente de Silhouette promedio k=5 : 0.4534455
# k = 6
cluster_assigments_k6_2 <- cutree(modelo_jer_2, k = 6) # Cluster
sil_2_k6 <- silhouette(cluster_assigments_k6_2,
dist(vivienda_3_est[,1:6]))
sil_2_avg_k6 <- mean(sil_2_k6[,3])
cat("Coeficiente de Silhouette promedio k=6 : ", sil_2_avg_k6)## Coeficiente de Silhouette promedio k=6 : 0.4533141
# k = 7
cluster_assigments_k7_2 <- cutree(modelo_jer_2, k = 7) # Cluster
sil_2_k7 <- silhouette(cluster_assigments_k7_2,
dist(vivienda_3_est[,1:6]))
sil_2_avg_k7 <- mean(sil_2_k7[,3])
cat("Coeficiente de Silhouette promedio k=7 : ", sil_2_avg_k7)## Coeficiente de Silhouette promedio k=7 : 0.390529
Entre más aumenta el valor de k, más lejano está de 1, por tanto, nuevamente se toma k = 2, que con este método presenta un mejor ajuste a comparación del modelo anterior.
Se crea un dendograma para visualizar las agrupaciones,
Se observa la cantidad de datos pertenecientes a cada cluster,
cluster_jer_2 <- cutree(modelo_jer_2, k = 2)
vivienda_3_est <- data.frame(vivienda_3_est,cluster_jer_2)
table(vivienda_3_est$cluster_jer_2)##
## 1 2
## 8312 7
La diferencia en la cantidad de datos que contien cada cluster es abismal.
Descripción de cada uno de los clusters,
En este caso se mantiene el mismo panorama que en la situación anterior, sin embargo, en esta ocasión las viviendas de mayor área y precio quedaron en el cluster 2, además, estas viviendas en su mayoría son estrato 6 y la diferencia de las variables entre ambos grupos parece ser mucho mayor, por tanto, todo indica que los datos del cluster 2 corresponden a valores extremos o datos atípicos.
Se realiza el gráfico de dispersión,
fviz_cluster(list(data = vivienda_3_est[,1:6],
cluster = vivienda_3_est$cluster_jer_2),
palette = c("#2E9FDF", "#E7B800"),
ellipse.type = "convex",repel = F,
show.clust.cent = FALSE, ggtheme = theme_minimal())Por medio del gráfico se puede comprobar lo que se venía sospechando, la mayoría de los datos que pertenecen al cluster 2 corresponden a valores que están en el extremo del plano.
Se calcula la correlación entre las distancias cofenéticas y los datos de distancia originales (distancia euclideana),
dist_cf_2 <- cophenetic(modelo_jer_2) # Distancias cofenéticas
cor(dist_eu, dist_cf_2) # Correlación## [1] 0.7781417
Este indicador mejoró notablemente a comparación del modelo jerárquico anterior.
Finalmente, se hace una comparación de las 2 agrupaciones anteriores por medio de una matriz de correlación,
##
## ---------------------
## Welcome to dendextend version 1.17.1
## Type citation('dendextend') for how to cite the package.
##
## Type browseVignettes(package = 'dendextend') for the package vignette.
## The github page is: https://github.com/talgalili/dendextend/
##
## Suggestions and bug-reports can be submitted at: https://github.com/talgalili/dendextend/issues
## You may ask questions at stackoverflow, use the r and dendextend tags:
## https://stackoverflow.com/questions/tagged/dendextend
##
## To suppress this message use: suppressPackageStartupMessages(library(dendextend))
## ---------------------
##
## Attaching package: 'dendextend'
## The following object is masked from 'package:stats':
##
## cutree
dend_1 <- as.dendrogram(modelo_jer) # Dendograma Ward.D
dend_2 <- as.dendrogram(modelo_jer_2) # Dendograma Average
cor_cophenetic(dend_1, dend_2) # Matriz de correlación cofenética## [1] 0.4696979
En efecto, la correlación entre ambos dendogramas es muy baja, lo que indica que la agrupación realizada es muy diferente entre ellos.
Conclusiones: Análisis de Conglomerados (Clustering) Del Análisis de Conglomerados (Clustering) se concluye lo siguiente:
La cantidad de clusters que sugieren ambos métodos (jerárquico y no jerárquico) son diferentes entre sí, sin embargo, son grupos que no pasan un valor de k = 3. Esto podría indicar que las viviendas no poseen información suficiente para encontrar otros patrones o características que permitan generar clusters con una estructura más local y no tan general.
Con el modelo K-Means se generaron 3 grupos con características claramente definas.
Con los modelos jerárquicos se generaron 2 grupos para cada uno, las características eran similares a las generadas con el modelo K-Means, sin embargo, con el modelo jerárquico que empleo el criterio “average”, en el cluster 2 obtuvo datos con características muy atípicas.
Los gráficos sirvieron como respaldo para cada una de las evidencias que se pudieron encontrar por medio de las métricas.
No se puede afirmar que un modelo sea mejor que el otro, a pesar de que en la comparación de los modelos jerárquicos la agrupación que se realizo por medio del criterio “average” lanzó mejores resultados en las métricas que la agrupación realizada por el método “Ward”, ya que como se pudo comprobar por medio del análisis, este primer modelo tenia un desequilibrio muy grande en los clusters.
Se pueden emplear estas agrupaciones para hacer un análisis estadístico mas profundo en cada uno de los grupos, ver que otras características comparten, que patrones siguen, que diferencia a un cluster de otro similar e incluso proponer nuevas medidas y agregar nuevos datos a la tabla para generar clusters con una mejor estructura interna.
Análisis de Correspondencia Simple (ACS) Inicialmente se contruye una tabla cruzada para las variables categóricas zona y estrato,
##
## 3 4 5 6
## 1 105 14 4 1
## 2 572 407 769 172
## 3 54 84 290 770
## 4 340 8 2 1
## 5 382 1616 1685 1043
Donde las zonas son,
Zona Centro: 1 Zona Norte: 2 Zona Oeste: 3 Zona Oriente: 4 Zona Sur: 5 Se ejecuta la prueba Chi-Cuadrado para validar el supuesto de independencia entre los datos,
##
## Pearson's Chi-squared test
##
## data: tabla
## X-squared = 3830.4, df = 12, p-value < 2.2e-16
La hipótesis nula para esta prueba es la independencia de la variables categóricas. Si se establece un nivel de significancia de 0.1, 0.05 o 0.01, se rechaza en cualquier caso la hipótesis nula, por tanto, hay algún grado de relación entre ambas variables.
Ahora, se procede a realizar el análisis de correspondencia,
##
## Attaching package: 'gridExtra'
## The following object is masked from 'package:dplyr':
##
## combine
Por medio del análisis del plano se puede concluir lo siguiente:
Las viviendas que están en la zona Oeste son estrato 6. Las viviendas que están ubicadas en las zonas Norte y Sur son principalmente de estratos 4 y 5. Las viviendas que están ubicadas en las zonas Oriente y Centro son en su mayoría de estrato 3. Se realiza un gráfico para el porcentaje de varianza explicado por cada una de las componentes,
fviz_screeplot(ac, addlabels = TRUE,
ylim = c(0, 80))+ggtitle("")+
ylab("Porcentaje de varianza explicado") + xlab("Ejes")La primera componente explica el 70 % del total de la varianza y la segunda componente explica el 27.7 % del total de la varianza, por tanto, las 2 primeras componentes en conjunto explican el 97.7 % de la varianza total de los datos.
Conclusiones: Análisis de Correspondencia Simple (ACS) Del Análisis de Correspondencia Simple (ACS) se concluye lo siguiente:
Existe una relación entre las variables categorías zona y estrato.
Según el estrato en el cual desee vivir el cliente, se le pueden recomendar zonas acordes a la vivienda que busca.
Se pueden incluir otras variables categóricas para hacer inferencias sobre las viviendas de preferencia para cierto tipo de clientes.