El primer paso para desarrollar este análisis, se llevó a cabo con la carga de las librerías necesarias para realizar este informe.
Posteriormente, se cargaron los datos proporcionados por la inmobiliaria; los cuales constan de zona, cantidad de pisos, estrato y otras características de los inmuebles.
# Mostrar las primeras filas de los datos
head(vivienda)
# A tibble: 6 × 13
id zona piso estrato preciom areaconst parqueaderos banios habitaciones
<dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1147 Zona O… <NA> 3 250 70 1 3 6
2 1169 Zona O… <NA> 3 320 120 1 2 3
3 1350 Zona O… <NA> 3 350 220 2 2 4
4 5992 Zona S… 02 4 400 280 3 5 3
5 1212 Zona N… 01 5 260 90 1 2 3
6 1724 Zona N… 01 5 240 87 1 3 3
# ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>
En la siguiente tabla se muestra de manera resumida, datos que servirán para que la inmobiliaria se haga una idea más concreta de algunas características primordiales de sus inmuebles como, por ejemplo:
Se conoció que el promedio donde sus inmuebles predominan esta entre los estratos 4 y 5. El mayor precio en el que ofrecen sus inmuebles es 1.999 millones de pesos, mientras que el de menor precio es de 58 millones de pesos.
summary(vivienda[,2:13])
zona piso estrato preciom
Length:8322 Length:8322 Min. :3.000 Min. : 58.0
Class :character Class :character 1st Qu.:4.000 1st Qu.: 220.0
Mode :character Mode :character Median :5.000 Median : 330.0
Mean :4.634 Mean : 433.9
3rd Qu.:5.000 3rd Qu.: 540.0
Max. :6.000 Max. :1999.0
NA's :3 NA's :2
areaconst parqueaderos banios habitaciones
Min. : 30.0 Min. : 1.000 Min. : 0.000 Min. : 0.000
1st Qu.: 80.0 1st Qu.: 1.000 1st Qu.: 2.000 1st Qu.: 3.000
Median : 123.0 Median : 2.000 Median : 3.000 Median : 3.000
Mean : 174.9 Mean : 1.835 Mean : 3.111 Mean : 3.605
3rd Qu.: 229.0 3rd Qu.: 2.000 3rd Qu.: 4.000 3rd Qu.: 4.000
Max. :1745.0 Max. :10.000 Max. :10.000 Max. :10.000
NA's :3 NA's :1605 NA's :3 NA's :3
tipo barrio longitud latitud
Length:8322 Length:8322 Min. :-76.59 Min. :3.333
Class :character Class :character 1st Qu.:-76.54 1st Qu.:3.381
Mode :character Mode :character Median :-76.53 Median :3.416
Mean :-76.53 Mean :3.418
3rd Qu.:-76.52 3rd Qu.:3.452
Max. :-76.46 Max. :3.498
NA's :3 NA's :3
En el siguiente diagrama de cajas, se muestra un comparativo entre el precio y el tipo de vivienda. Mostrando así, que el valor promedio en el que se ofertan las casas en la ciudad de Cali se encuentran por debajo de los 500 millones de pesos; mientras que en el caso de los apartamentos la mayoría se ubican por debajo de los 250 millones de pesos.
boxplot(vivienda$preciom ~ vivienda$tipo,
main = "Comparativo Precio vs Tipo de vivienda",
ylab = "Precio de la vivienda",
xlab = "Tipo de vivienda",
col = rainbow(6, alpha=0.2),
border = rainbow(6, v=0.6)
)
En el siguiente grafico de dispersión se relacionan el precio de la vivienda y el área construida, concluyendo que ambas características están directamente relacionadas, pues entre mayor sea el área de la vivienda así mismo lo será el precio.
preciom <- vivienda$preciom
areaconst <- vivienda$areaconst
ggplot(vivienda, aes(x = preciom, y = areaconst)) +
geom_point(color = "orange") +
labs(x = "Precio de la vivienda", y = "Area construida de la vivienda") +
theme_minimal()
Warning: Removed 3 rows containing missing values or values outside the scale range
(`geom_point()`).
En este momento del análisis, se revisaron los datos suministrados para confirmar la posibilidad de que existan datos faltantes. Con la siguiente tabla, se pudo comprobar que la base de datos esta con datos faltantes.
vivienda_n = vivienda[,c(4:10)]
md.pattern(vivienda, rotate.names = TRUE)
preciom id zona estrato areaconst banios habitaciones tipo barrio longitud
4808 1 1 1 1 1 1 1 1 1 1
1909 1 1 1 1 1 1 1 1 1 1
876 1 1 1 1 1 1 1 1 1 1
726 1 1 1 1 1 1 1 1 1 1
1 1 0 0 0 0 0 0 0 0 0
2 0 0 0 0 0 0 0 0 0 0
2 3 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 12
2 0 0 0 13
3 1605 2638 4275
Según lo anterior, se procedió a eliminar los datos faltantes para poder realizar el PCA y que así se pudieran obtener resultados más precisos.
# Elimina las filas con datos faltantes
vivienda_n <- na.omit(vivienda_n)
Aquí se recolectaron los resultados de la limpieza de datos anteriormente realizada, se confirmó que los datos faltantes hayan quedado eliminados arrojando un total de 6.717 registros totales, los que antes de hacer la limpieza estaban en 8.322.
md.pattern(vivienda_n, rotate.names = TRUE)
/\ /\
{ `---' }
{ O O }
==> V <== No need for mice. This data set is completely observed.
\ \|/ /
`-----'
estrato preciom areaconst parqueaderos banios habitaciones tipo
6717 1 1 1 1 1 1 1 0
0 0 0 0 0 0 0 0
luego se realizó la estandarización de los datos para poder realizar el cálculo del PCA
viviendae <- vivienda_n %>%
dplyr::select_if(is.numeric) %>%
scale()
head(viviendae)
estrato preciom areaconst parqueaderos banios habitaciones
[1,] -1.9279348 -0.6532909 -0.7712458 -0.7424551 -0.1850976 1.7511897
[2,] -1.9279348 -0.4443626 -0.4242642 -0.7424551 -0.9096316 -0.4477275
[3,] -1.9279348 -0.3548218 0.2696991 0.1465058 -0.9096316 0.2852449
[4,] -0.8746661 -0.2055873 0.6860770 1.0354668 1.2639704 -0.4477275
[5,] 0.1786025 -0.6234440 -0.6324532 -0.7424551 -0.9096316 -0.4477275
[6,] 0.1786025 -0.6831378 -0.6532721 -0.7424551 -0.1850976 -0.4477275
Por consiguiente, se calculó el PCA
res.pca <- prcomp(viviendae)
fviz_eig(res.pca, addlabels = TRUE)
En el grafico anterior, el primer componente principal explica el 58.1% de la variabilidad presente en la base de datos, y los dos primeros componentes juntos explican el 78.5%. Esto sugiere que gran parte de la variabilidad de la base de datos puede ser resumida utilizando solo una variable (CP1), la cual se obtiene a partir de una combinación lineal de las variables originales.
fviz_pca_var(res.pca,
col.var = "contrib", # Color by contributions to the PC
gradient.cols = c("#FF7F00", "#034D94"),
repel = TRUE # Avoid text overlapping
)
Al observar las variables en el plano de los componentes principales, se
puede reconocer la orientación y la naturaleza de cada uno de ellos. En
este caso, el primer componente principal está vinculado principalmente
a la variable precio, mientras que el segundo componente se asocia en
mayor medida con la variable número de habitaciones.
fviz_pca_biplot(res.pca,
repel = TRUE,
habillage = vivienda_n$estrato,
col.var = "#034A94", # Variables color
col.ind = c("#DEDEDE", "#034A94") # Individuals color
)
El gráfico anterior revela un hallazgo notable: las viviendas de estrato
3 y 4, aunque no pertenecen a los estratos más altos, muestran precios
elevados y una infraestructura significativa en términos de áreas,
habitaciones y baños. Esto indica que el estrato no es el único factor
que influye en el precio y la infraestructura de una vivienda.
# distancia euclidiana
dist_vivienda <- dist(vivienda_n, method = 'euclidean')
Warning in dist(vivienda_n, method = "euclidean"): NAs introducidos por
coerción
#hc_vivienda <- hclust(dist_vivienda, method = 'complete')
# Determinamos a dónde pertenece cada observación
#cluster_assigments <- cutree(dist_vivienda, k = 4)
# asignamos los clusters
#assigned_cluster <- assigned_cluster %>%
# mutate(cluster = as.factor(cluster_assigments))
#table(assigned_cluster$tipo,assigned_cluster$cluster)
#colnames(assigned_cluster)
Se asignaron los grupos en la variable cluster
# Luego, crear el gráfico
#ggplot(assigned_cluster, aes(x = preciom, y = areaconst, color = cluster)) +
# geom_point(size = 4) +
# geom_text(aes(label = cluster), vjust = -.8) + # Agregar etiquetas del clúster
#theme_classic()
Se pueden identificar los precios 1
conforma la mayoría de la vivienda en data, seguido de los precios 2 que
conforman otra parte de las viviendas. el tercer lugar lo ocuparía las
viviendas con el precio 3, que aunque son menor en cantidad tienen mayor
área y su precio es más alto.
#n=150
#muestra=sample(1:6717,n,replace = FALSE)
#hc_vivienda2=assigned_cluster[muestra,]
#plot(hc_vivienda, cex = 0.6, main = "Dendograma de Empresas", las=1,
# ylab = "Distancia euclidiana", xlab = "Grupos")
#rect.hclust(hc_vivienda, k = 2, border = 2:5)
#########
# Paso 1: Crear un conjunto de datos de ejemplo
#set.seed(123)
#df <- data.frame(x = rnorm(100), y = rnorm(100))
# Paso 2: Realizar el análisis de clúster con el conjunto completo
#distancia_completa <- dist(vivienda_n) # Calcula la distancia euclidiana
#clustering_completo <- hclust(distancia_completa) # Realiza el análisis de clúster
# Paso 3: Seleccionar una muestra del conjunto de datos
#tamaño_muestra <- n
#muestra_indices <- sample(nrow(vivienda_n), tamaño_muestra)
#df_muestra <- df[muestra_indices, ]
# Paso 4: Realizar el análisis de clúster en la muestra
#distancia_muestra <- dist(df_muestra)
#clustering_muestra <- hclust(distancia_muestra)
# Paso 5: Visualizar ambos dendrogramas para comparación
#par(mfrow = c(1, 1)) # Configura la visualización en dos paneles
# Dendrograma del conjunto completo
#plot(clustering_completo, main = "Dendrograma - Conjunto Completo")
# Dendrograma de la muestra
#plot(clustering_muestra, main = "Dendrograma - Muestra")
#abline(h=2.2,col="red")
con el clúster se puede organizar los
datos homogéneos llamados clústeres y con esto los elementos dentro de
un mismo grupo sean más similares entre sí que con otros de otros
grupos.
dfviviendacategoria <- vivienda %>% dplyr::select(zona, estrato, tipo)
zonaestrato <- table(dfviviendacategoria$zona, dfviviendacategoria$estrato)
zonaestrato
3 4 5 6
Zona Centro 105 14 4 1
Zona Norte 572 407 769 172
Zona Oeste 54 84 290 770
Zona Oriente 340 8 2 1
Zona Sur 382 1616 1685 1043
chisq.test(zonaestrato)
Pearson's Chi-squared test
data: zonaestrato
X-squared = 3830.4, df = 12, p-value < 2.2e-16
El resultado indica que se rechaza la hipótesis de independencia de las variables Zona~estrato (p-value: 0.00000000000000022).
grafica
resultados_ac <- CA(zonaestrato)
En el grafico anterior se relaciona el estrato y la zona donde está
ubicado el inmueble. Los resultados obtenidos fueron los siguientes:
se mide la varianza acumulada
valores_prop <-resultados_ac$eig
valores_prop
eigenvalue percentage of variance cumulative percentage of variance
dim 1 0.32215213 69.965515 69.96551
dim 2 0.12745096 27.680002 97.64552
dim 3 0.01084108 2.354483 100.00000
fviz_screeplot(resultados_ac, addlabels = TRUE, ylim = c(0, 80))+ggtitle("")+
ylab("Porcentaje de varianza explicado") + xlab("Ejes")
Los resultados indican que la primera componente resume el 70% y los dos primeros componentes representados en el plano factorial, mientras que los dos primeros ejes resumen un 97.7% de los datos.
Finalmente, de los resultados obtenidos, se concluye y aconseja a la inmobiliaria lo siguiente:
-En el PCA se descubrió una fuerte relación entre área de vivienda y la ubicación, pues estas dos influyen en el precio final de la vivienda ofertada. -En el análisis de conglomerados se encontraron diferentes segmentos de mercados, por lo que se les recomienda a el área de marketing hacer una estrategia para cada mercado