Introduccion


Definición del problema objeto de estudio

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.

Finalidad del estudio.

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.

Variables para poder cumplir con el objetivo propuesto.

La base de datos aroja 8322 observaciones de 13 variables: Id, zona, pisos, estrato, precio, area construida,parqueaderos, baños,habitaciones, tipo de vivienda, barrio, longitud y latitud.Por decision metodologica no se tendran en cuenta en el analisis las 2 ultimas variables (longitud y latitud) por generar ruido y no contribuir a la finalidad del estudio.

Diseño del estudio

Análisis exploratorio de las variables

La informacion sera recolectada a traves de una fuente secundaria -base de datos con 8322 unidades analizadas con 13 variables, se procesara en el paquete R donde se realiza un análisis integral y multidimensional de la base de datos para obtener una comprensión del mercado inmobiliario urbano. Se aplican las siguientes técnicas de análisis de datos: -Análisis de Componentes Principales -Análisis de Conglomerados -Análisis de Correspondencia

library(paqueteMETODOS)
data("vivienda")
 summary(vivienda)
       id           zona               piso              estrato     
 Min.   :   1   Length:8322        Length:8322        Min.   :3.000  
 1st Qu.:2080   Class :character   Class :character   1st Qu.:4.000  
 Median :4160   Mode  :character   Mode  :character   Median :5.000  
 Mean   :4160                                         Mean   :4.634  
 3rd Qu.:6240                                         3rd Qu.:5.000  
 Max.   :8319                                         Max.   :6.000  
 NA's   :3                                            NA's   :3      
    preciom         areaconst       parqueaderos        banios      
 Min.   :  58.0   Min.   :  30.0   Min.   : 1.000   Min.   : 0.000  
 1st Qu.: 220.0   1st Qu.:  80.0   1st Qu.: 1.000   1st Qu.: 2.000  
 Median : 330.0   Median : 123.0   Median : 2.000   Median : 3.000  
 Mean   : 433.9   Mean   : 174.9   Mean   : 1.835   Mean   : 3.111  
 3rd Qu.: 540.0   3rd Qu.: 229.0   3rd Qu.: 2.000   3rd Qu.: 4.000  
 Max.   :1999.0   Max.   :1745.0   Max.   :10.000   Max.   :10.000  
 NA's   :2        NA's   :3        NA's   :1605     NA's   :3       
  habitaciones        tipo              barrio             longitud     
 Min.   : 0.000   Length:8322        Length:8322        Min.   :-76.59  
 1st Qu.: 3.000   Class :character   Class :character   1st Qu.:-76.54  
 Median : 3.000   Mode  :character   Mode  :character   Median :-76.53  
 Mean   : 3.605                                         Mean   :-76.53  
 3rd Qu.: 4.000                                         3rd Qu.:-76.52  
 Max.   :10.000                                         Max.   :-76.46  
 NA's   :3                                              NA's   :3       
    latitud     
 Min.   :3.333  
 1st Qu.:3.381  
 Median :3.416  
 Mean   :3.418  
 3rd Qu.:3.452  
 Max.   :3.498  
 NA's   :3      

Fuente:Elaboracion propia

Analisis de componentes principales

Se seleccionaron las variables numericas: precio, area construida, parqueaderos, baños y habitaciones. Se omitieron las varibles latitud y longitud por no poseer informacion relevante para la finalidad del estudio

Selección de variables numéricas:

# Selección de variables numéricas
vivienda_num <- vivienda[, c("preciom", "areaconst", "parqueaderos", "banios", "habitaciones")]
descr(vivienda_num)
Descriptive Statistics  
vivienda_num  
N: 8322  

                    areaconst    banios   habitaciones   parqueaderos   preciom
----------------- ----------- --------- -------------- -------------- ---------
             Mean      174.93      3.11           3.61           1.84    433.89
          Std.Dev      142.96      1.43           1.46           1.12    328.65
              Min       30.00      0.00           0.00           1.00     58.00
               Q1       80.00      2.00           3.00           1.00    220.00
           Median      123.00      3.00           3.00           2.00    330.00
               Q3      229.00      4.00           4.00           2.00    540.00
              Max     1745.00     10.00          10.00          10.00   1999.00
              MAD       84.51      1.48           1.48           1.48    207.56
              IQR      149.00      2.00           1.00           1.00    320.00
               CV        0.82      0.46           0.40           0.61      0.76
         Skewness        2.69      0.93           1.63           2.33      1.85
      SE.Skewness        0.03      0.03           0.03           0.03      0.03
         Kurtosis       12.91      1.13           3.98           8.31      3.67
          N.Valid     8319.00   8319.00        8319.00        6717.00   8320.00
        Pct.Valid       99.96     99.96          99.96          80.71     99.98

Fuente:Elaboracion propia

Grafica 1 Boxplot Variables numericas

boxplot(vivienda_num)

Fuente:Elaboracion propia

Normalizacion de variables

Al observar las graficas se encuentra que las variables precio y area construida presentan una mayor dispersion. Se requiere normalizacion de las variables

# Eliminación de NAs
vivienda_num <- na.omit(vivienda_num)

# Normalización de las variables
vivienda_num <- scale(vivienda_num)
descr(vivienda_num)
Descriptive Statistics  

                               areaconst                 banios           habitaciones
----------------- ---------------------- ---------------------- ----------------------
             Mean                   0.00                   0.00                   0.00
          Std.Dev                   1.00                   1.00                   1.00
              Min                  -1.05                  -2.36                  -2.65
               Q1                  -0.66                  -0.91                  -0.45
           Median                  -0.35                  -0.19                  -0.45
               Q3                   0.36                   0.54                   0.29
              Max                  10.85                   4.89                   4.68
              MAD                   0.58                   1.07                   0.00
              IQR                   1.02                   1.45                   0.73
               CV   23248939349689580.00   10971783864240950.00   21587562471249876.00
         Skewness                   2.72                   0.90                   1.78
      SE.Skewness                   0.03                   0.03                   0.03
         Kurtosis                  13.26                   0.94                   4.70
          N.Valid                6717.00                6717.00                6717.00
        Pct.Valid                 100.00                 100.00                 100.00

Table: Table continues below

 

                             parqueaderos                preciom
----------------- ----------------------- ----------------------
             Mean                    0.00                   0.00
          Std.Dev                    1.00                   1.00
              Min                   -0.74                  -1.23
               Q1                   -0.74                  -0.66
           Median                    0.15                  -0.34
               Q3                    0.15                   0.33
              Max                    7.26                   4.57
              MAD                    1.32                   0.60
              IQR                    0.89                   0.99
               CV   -24868070952031144.00   13453516931012132.00
         Skewness                    2.33                   1.78
      SE.Skewness                    0.03                   0.03
         Kurtosis                    8.31                   3.28
          N.Valid                 6717.00                6717.00
        Pct.Valid                  100.00                 100.00

Fuente:Elaboracion propia

Calculo PCA

Aplicamos PCA

# Aplicar PCA
pca_vivienda <- prcomp(vivienda_num, center = TRUE, scale. = TRUE)
summary(pca_vivienda)
Importance of components:
                          PC1    PC2     PC3     PC4     PC5
Standard deviation     1.8035 0.9280 0.60371 0.57319 0.43938
Proportion of Variance 0.6505 0.1722 0.07289 0.06571 0.03861
Cumulative Proportion  0.6505 0.8228 0.89568 0.96139 1.00000

Fuente:Elaboracion propia

Graficas en PCA

Se visualiza mediante el diagrama de codo el aporte de cada variable numerica

Grafica 2.Varianza explicada

library(factoextra)
Warning: package 'factoextra' was built under R version 4.4.2
Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
# Scree plot
fviz_eig(pca_vivienda, addlabels = TRUE, ylim = c(0, 100)) +
  ggtitle("Scree Plot - Varianza Explicada en PCA")

Fuente:Elaboracion propia

Se encuentra que las 2 primeras variables explican el 82.3% del fenimeno, esto lo corroboramos con la grafica de contribucion de variables en PCA

Grafica 3,Contribucion de variables

# Gráfico de variables
fviz_pca_var(pca_vivienda, col.var = "cos2", 
             gradient.cols = c("yellow", "red"), 
             repel = TRUE) +
  ggtitle("Contribución de Variables en PCA")

Fuente:Elaboracion propia

Conclusion Analisis de componentes principales

En conclusion se encuentra que al realizar el analisis de componentes principales se encuentra que las características clave que influyen en la variación de precios y oferta del mercado es explicada en su mayor parte por las variables precio y area. La dimensionalidad se puede reducir a dos componentes de acuerdo al diagrama de codo (PC1 y PC2) sin perder información significativa.

Analisis de conglomerados

Determinacion del numero de clusters y segmentacion

Se utiliza k-means para agrupar por propiedades,se utiliza el metodo del codo para calcular numero optimo de clusters

df_scaled <- scale(vivienda_num)

Grafica 4. Determinacion numero optimo de clusters

# Determinación del número óptimo de clusters
fviz_nbclust(df_scaled, kmeans, method = "wss") +
  ggtitle("Método del Codo")

Fuente:Elaboracion propia

Visualizacion de clusters y centroides

Grafica 5.Clusters

# Aplicar K-Means (k = 3)
set.seed(123)
km_model <- kmeans(df_scaled, centers = 3, nstart = 25)

# Visualización de clusters
fviz_cluster(km_model, data = df_scaled, geom = "point", 
             ellipse.type = "convex", palette = "jco", 
             ggtheme = theme_minimal()) +
  ggtitle("Gráfico de Conglomerados - K-Means")

Fuente:Elaboracion propia

# Visualización de centroides
km_model$centers
     preciom  areaconst parqueaderos     banios habitaciones
1  1.9728860  1.7057710    1.8619310  1.4475190    0.7294706
2  0.2374914  0.3523237    0.1227056  0.6285994    0.6216066
3 -0.5669014 -0.5733081   -0.4776331 -0.6729979   -0.5116167

Fuente: Elaboracion propia

Creacion data set limpio

Como el objetivo es agrupar las propiedades residenciales en segmentos homogéneos con características similares para entender las dinámicas de las ofertas específicas en diferentes zonas de la ciudad y en diferentes estratos socioeconómicos se crea una base de datos limpia en la cual debe coincidir el numero de filas de las variables numericas.No se incluyo la variable barrios por generar ruido y se considera que la variable zona es mas representativa para el analisis presente

# Creación de la base limpia
vars_num <- c("preciom", "areaconst", "parqueaderos", "banios", "habitaciones")
vivienda_clean <- vivienda[complete.cases(vivienda[, vars_num]), ]
print(dim(vivienda_clean))  
[1] 6717   13
# Agregar la variable de cluster
vivienda_clean$cluster <- km_model$cluster

table(vivienda_clean$cluster, vivienda_clean$zona)
   
    Zona Centro Zona Norte Zona Oeste Zona Oriente Zona Sur
  1           2         90        223            4      506
  2          32        358        436           86     1217
  3          30        839        439           73     2382
table(vivienda_clean$cluster, vivienda_clean$estrato)
   
       3    4    5    6
  1   10   36  180  599
  2  223  366  732  808
  3  451 1239 1610  463

Fuente: Elaboracion propia

Conclusion Analisis de conglomerados

En conclusion al agrupar las propiedades residenciales en segmentos homogéneos con características similares para entender las dinámicas de las ofertas específicas en diferentes zonas se encuentra que los 3 clusters se concentran en la zona sur, los clusters 1 y 3 concentran las zonas sur y oeste sugiriendo una tendencia diferenciadora respecto al cluster 2

Referente a los estratos estratos socioeconómicos los clusters 1 y 2 presentan una tendencia a agrupar la mayor parte de la oferta inmobiliaria en los estratos5 y 6 a diferencia del cluster 2 que agrupa mas en el estrato 4 y 5

Analisis de correspondencia

El objetivo es examinar la relación entre las variables categóricas (tipo de vivienda,zona y estrato), para identificar patrones de comportamiento de la oferta en mercado inmobiliario.Se omite la variable barrios porque sus multiples categrias generan ruido, Posterior a esto se analizan 3 relaciones entre las variables categoricas: -Relacion entre zona y estrato -Relacion entre zona y tipo de vivienda -Relacion entre tipo de vivienda y estrato

# Seleccionar variables categóricas
vars_cat <- vivienda_clean[, c("tipo", "zona", "estrato")]
str(vars_cat)
tibble [6,717 × 3] (S3: tbl_df/tbl/data.frame)
 $ tipo   : chr [1:6717] "Casa" "Casa" "Casa" "Casa" ...
 $ zona   : chr [1:6717] "Zona Oriente" "Zona Oriente" "Zona Oriente" "Zona Sur" ...
 $ estrato: num [1:6717] 3 3 3 4 5 5 4 5 5 5 ...

Fuente:Elaboracion propia

# Convertir a factores (si es necesario)
vars_cat$tipo   <- as.factor(vars_cat$tipo)
vars_cat$zona   <- as.factor(vars_cat$zona)
vars_cat$estrato <- as.factor(vars_cat$estrato)
str(vars_cat)
tibble [6,717 × 3] (S3: tbl_df/tbl/data.frame)
 $ tipo   : Factor w/ 2 levels "Apartamento",..: 2 2 2 2 1 1 1 1 2 2 ...
 $ zona   : Factor w/ 5 levels "Zona Centro",..: 4 4 4 5 2 2 2 2 2 2 ...
 $ estrato: Factor w/ 4 levels "3","4","5","6": 1 1 1 2 3 3 2 3 3 3 ...

Fuente:Elaboracion propia

res_mca <- mca(vars_cat, abbrev=TRUE)
res_mca
Call:
mca(df = vars_cat, abbrev = TRUE)

Multiple correspondence analysis of 6717 cases of 3 factors

Correlations 0.745 0.679  cumulative % explained 37.23 71.20 
library(mice)
Warning: package 'mice' was built under R version 4.4.2

Adjuntando el paquete: 'mice'
The following object is masked from 'package:stats':

    filter
The following objects are masked from 'package:base':

    cbind, rbind
md.pattern(vars_cat, rotate.names = TRUE)
 /\     /\
{  `---'  }
{  O   O  }
==>  V <==  No need for mice. This data set is completely observed.
 \  \|/  /
  `-----'

     tipo zona estrato  
6717    1    1       1 0
        0    0       0 0

Se corrobora que no hay datos faltantes en las tres variables categoricas

Relacion entre zona y estrato

library(FactoMineR)
Warning: package 'FactoMineR' was built under R version 4.4.2
tabla <- table(vars_cat$zona, vars_cat$estrato)
colnames(tabla) <- c("Estrato3", "Estrato4", "Estrato5", "Estrato6" )
tabla
              
               Estrato3 Estrato4 Estrato5 Estrato6
  Zona Centro        53        8        3        0
  Zona Norte        237      268      669      113
  Zona Oeste         24       62      265      747
  Zona Oriente      159        2        1        1
  Zona Sur          211     1301     1584     1009

Fuente:Elaboracion propia

chisq.test(tabla)

    Pearson's Chi-squared test

data:  tabla
X-squared = 3188.9, df = 12, p-value < 2.2e-16

El resultado indica que se rechaza la hipótesis de independencia de las variables (p-value: 0.0000), indicando grado tipo de relación entre las variables zona y estrato.

Grafico 6. Relacion entre zona y estrato

library(FactoMineR)
library(factoextra)
library(gridExtra)

Adjuntando el paquete: 'gridExtra'
The following object is masked from 'package:dplyr':

    combine
resultados_ac <- CA(tabla)

Fuente:Elaboracion propia

El gráfico establece las siguientes relaciones:

El estrato 6 se encuentra ubicado en la Zona Oeste Los estratos 4 y 5 están ubicados principalmente en la Zona Sur y Norte El estrato 3 está presente en las Zonas Oriente y Centro

valores_prop <-resultados_ac$eig ; valores_prop
      eigenvalue percentage of variance cumulative percentage of variance
dim 1 0.31503422              66.358860                          66.35886
dim 2 0.14320084              30.163848                          96.52271
dim 3 0.01650821               3.477292                         100.00000

Fuente:Elaboracion propia

Grafica 7.Varianza explicada

fviz_screeplot(resultados_ac, addlabels = TRUE, ylim = c(0, 80))+ggtitle("")+
ylab("Porcentaje de varianza explicado") + xlab("Ejes")

Fuente:Elaboracion propia

Los resultados indican que la primera componente resumen el 66.4% y los dos primeros componentes prepresentados en el plano factorial, mientras que los dos primeros ejes resumen un 96.6% de los datos.

Relacion entre zona y tipo de vivienda

library(FactoMineR)
tabla2 <- table(vars_cat$zona, vars_cat$tipo)
colnames(tabla2) <- c("Casa", "Apartamento" )
tabla2
              
               Casa Apartamento
  Zona Centro    10          54
  Zona Norte    852         435
  Zona Oeste    966         132
  Zona Oriente   22         141
  Zona Sur     2381        1724

Fuente:Elaboracion propia

chisq.test(tabla2)

    Pearson's Chi-squared test

data:  tabla2
X-squared = 576.44, df = 4, p-value < 2.2e-16

El resultado indica que se rechaza la hipótesis de independencia de las variables (p-value: 0.0000), indicando grado tipo de relación entre las variables zona y tipo de vivienda.Esta relacion muestra una tendencia a la oferta inmobiliria de apartamentos y viviendas en la zona sur

Relacion entre tipo de vivienda y estrato

library(FactoMineR)
tabla3 <- table(vars_cat$tipo, vars_cat$estrato)
colnames(tabla3) <- c("Estrato3", "Estrato4", "Estrato5", "Estrato6" )
tabla3
             
              Estrato3 Estrato4 Estrato5 Estrato6
  Apartamento      296     1047     1659     1229
  Casa             388      594      863      641

Fuente:Elaboracion propia

chisq.test(tabla3)

    Pearson's Chi-squared test

data:  tabla3
X-squared = 128.92, df = 3, p-value < 2.2e-16

El resultado indica que se rechaza la hipótesis de independencia de las variables (p-value: 0.0000), indicando grado tipo de relación entre las variables tipo de vivienda y estrato. La tabla 3 indica un predominio de la oferta de apartamentos en los estratos 4,5 y 6

Conclusion Analisis de correspondencia

En conclusion el analisis de correspodencia permitio identificar los siguientes patrones de comportamiento de la oferta en mercado inmobiliario: relacion entre las 3 categorias de estudio: (zona, estrato y tipo), cada estrato esta asociado a una zona de la ciudad,existe una tendencia a la oferta inmobiliria de apartamentos y viviendas en la zona sur y un predominio de la oferta de apartamentos en los estratos 4,5 y 6