Preparación Data


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()`).




Análisis de Compontentes Principales

El análisis de componentes principales (ACP) es una técnica estadística utilizada para reducir la dimensionalidad de un conjunto de datos, mientras se conserva la mayor cantidad posible de la variabilidad presente en los datos originales. Este método es especialmente útil cuando se trabaja con conjuntos de datos que contienen muchas variables, ya que permite simplificar el análisis y la interpretación al transformar las variables originales en un nuevo conjunto de variables no correlacionadas llamadas “componentes principales”.


Para el caso en estudio, 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.




Análisis de conglomerados

El análisis de clúster, también conocido como análisis de conglomerados o agrupamiento, es una técnica de aprendizaje no supervisado utilizada en el campo de la ciencia de datos, la estadística y la minería de datos. Su objetivo principal es organizar un conjunto de datos en grupos homogéneos, llamados clústeres, de manera que los elementos dentro de un mismo grupo sean más similares entre sí que con aquellos en otros grupos.


Para la base de datos vivienda, se pretende realizar un agrupamiento deacuerdo a las caracteristicas de los bienes que permita agruparlas y descubrir similitudes mediante la construccion de una nueva variable.


# distancia euclidiana
dist_vivienda <- dist(vivienda_n, method = 'euclidean')
#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.




Analisis de correspondencia

El análisis de correspondencia es una técnica estadística multivariada utilizada para explorar y visualizar relaciones entre categorías de variables cualitativas. Este método es especialmente útil cuando se tiene una tabla de contingencia o de frecuencias cruzadas, permitiendo identificar patrones de asociación entre las categorías de diferentes variables.


En este caso se estudiara la asociación entre la zona y el estrato, dado que se pueden tener hipotesis sobre una mayor predominancia de ciertos estratos en una zona determinada.


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



test chi cuadrado para las zonas y los estratos


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:


  • El estrato 6 se encuentra en la zona oeste

  • El estrato 4 y 5 en la zona sur

  • El estrato 3 está en la zona centro y oriente


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