Modelos Estadisticos para la Toma de Decisiones.

Librerias

library(paqueteMODELOS)
library(naniar)
library(VIM)
library(stringr)
library(FactoMineR)
library(factoextra)
library(ggplot2)
library(mice)
library(corrplot)
library(dplyr)
library(tidyverse)
library(cluster)
library(fuzzyjoin)
library(leaflet)
library(RColorBrewer)
data("vivienda")

1. Introduccion

En el competitivo mercado inmobiliario urbano, la toma de decisiones informadas es esencial para garantizar el éxito y la sostenibilidad de las empresas. Una empresa inmobiliaria líder en la ciudad busca mejorar su comprensión del mercado de viviendas mediante el análisis de su base de datos, que contiene información detallada sobre diversas propiedades residenciales. El análisis de estos datos permitirá a la empresa identificar patrones, relaciones y segmentaciones relevantes, optimizando así sus estrategias de compra, venta y valoración de propiedades.

2. Objetivos

  1. Utilizar técnicas estadísticas avanzadas para examinar la oferta de viviendas, con el fin de identificar características clave que influyen en la variación de precios y la disponibilidad de propiedades en diferentes zonas de la ciudad.
  2. Reducir la dimensionalidad del conjunto de datos para visualizar y comprender la estructura de las variables, enfocándose en aquellos factores que más impactan en el mercado inmobiliario.
  3. Agrupar las propiedades en segmentos homogéneos para entender mejor las dinámicas de oferta en diferentes partes de la ciudad y en diversos estratos socioeconómicos.
  4. Examinar la relación entre las variables categóricas, como tipo de vivienda, zona y barrio, para identificar patrones que puedan influir en la toma de decisiones estratégicas.
  5. Presentar los hallazgos mediante gráficos, mapas y otras herramientas visuales, facilitando así la comprensión y la toma de decisiones por parte de la dirección de la empresa.

3. Analisis exploratorio de datos

Para empezar con el analisis estadistico se emplearán tecnicas de revisión de los datos obtenidos por la compañia para identificar posibles patrones, desviaciones, datos faltantes y decidir cual sera la mejor opcion para generar la depuración de la información.

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

Se cambian los nombres de los encabezados de la tabla.

names(vivienda) <- c("Id","Zona","Piso","Estrato","Precio x metro cuadrado","Area construida", "Numero de parqueaderos", "Banos", "Habitaciones","Tipo","Barrio", "Longitud","Latitud")

Se identifica que la variable Piso esta siendo identificada como de tipo caracter(cualitativo) cuando realmente es cuantitativo y se procede a transformar la variable a numerica.

vivienda$Piso <- as.numeric(vivienda$Piso)

Se calcula cuantos NA tiene cada columna para definir que columnas se deben imputar o normalizar.

datosfaltantes_vivienda <- colSums(is.na(vivienda)) %>%
  as.data.frame() 
datosfaltantes_vivienda
##                            .
## Id                         3
## Zona                       3
## Piso                    2638
## Estrato                    3
## Precio x metro cuadrado    2
## Area construida            3
## Numero de parqueaderos  1605
## Banos                      3
## Habitaciones               3
## Tipo                       3
## Barrio                     3
## Longitud                   3
## Latitud                    3

Se grafica cantidad de NA por variable.

gg_miss_var(vivienda) 

VIM::aggr(vivienda, cex.axis = 0.4, cex.lab= 0.4)  #Graficar proporcion de NA por variable y combinaciones de faltantes

El analisis empieza con una revisión preliminar de las variables que componen el dataset, inicialmente se procede a cambiar los nombres de las columnas para una mayor organización y comprensión de la información, tambien se puede identificar que en las variables “Piso” y “Numero de parqueaderos” se presenta gran cantidad de datos faltantes, por lo cual se decide imputar estas dos variables, eliminarlas es una opción pero perderiamos alrededor del 30% de la información de la base de datos en cuanto a numero de registros por lo cual la imputación es la acción seleccionada.

4. Imputación

Se identifica que faltan 2.638 datos en la variable Piso. Se procede a la descripcion de la variable piso, en el cual hay 5684 registros validos de una muestra de 8322 registros, es decir un 68,3% de los datos.

## Descriptive Statistics  
## vivienda$Piso  
## N: 8322  
## 
##                        Piso
## ----------------- ---------
##              Mean      3.77
##           Std.Dev      2.61
##               Min      1.00
##                Q1      2.00
##            Median      3.00
##                Q3      5.00
##               Max     12.00
##               MAD      1.48
##               IQR      3.00
##                CV      0.69
##          Skewness      1.28
##       SE.Skewness      0.03
##          Kurtosis      1.05
##           N.Valid   5684.00
##         Pct.Valid     68.30

Despues de medir la media truncada por el 68.6% de los datos, se evidencia que para la media de piso donde estan estas propiedades es el PISO 3, que es exactamente igual a la MEDIANA.

media_truncada_piso_vivienda <- round(mean(vivienda$Piso,trim=0.317),0)
#Se procede a reemplazar los NA de la variable PISO por la media truncada para normalizar la base de datos
vivienda$Piso[is.na(vivienda$Piso)] <- media_truncada_piso_vivienda      #Arreglo de variable piso por la media truncada
VIM::aggr(vivienda, cex.axis = 0.4, cex.lab= 0.4)

Se identifica que faltan 1.605 en la variable Numero de Parqueaderos

Se procede a la descripcion de la variable Numero de parqueaderos, en el cual hay 6717 registros validos de una muestra de 8322 registros, es decir un 80,71% de los datos.

## Descriptive Statistics  
## vivienda$`Numero de parqueaderos`  
## N: 8322  
## 
##                       Numero de parqueaderos
## ----------------- --------------------------
##              Mean                       1.84
##           Std.Dev                       1.12
##               Min                       1.00
##                Q1                       1.00
##            Median                       2.00
##                Q3                       2.00
##               Max                      10.00
##               MAD                       1.48
##               IQR                       1.00
##                CV                       0.61
##          Skewness                       2.33
##       SE.Skewness                       0.03
##          Kurtosis                       8.31
##           N.Valid                    6717.00
##         Pct.Valid                      80.71

Para este caso se reemplazará por la mediana, el Q3 es exactamente 2 parqueaderos, la distribición de los datos (boxplot) representa que el 75% de las propiedades tienen 2 parqueaderos o incluso 1.

mediana_parqueadero_vivienda <- median(vivienda$`Numero de parqueaderos`)

Se procede a reemplazar los NA de la variable numero de parqueaderos por la mediana para normalizar la base de datos.

vivienda$`Numero de parqueaderos`[is.na(vivienda$`Numero de parqueaderos`)] <- mediana_parqueadero_vivienda      #Arreglo de variable parqueadero por la mediana
VIM::aggr(vivienda, cex.axis = 1, cex.lab= 1)

Teniendo imputadas las variables Piso y Numero de parqueaderos, procedemos con la imputacion de los 3 NA’s identificados inicialmente en todos los campos.

vivienda_data_final <- vivienda [complete.cases(vivienda), ]
VIM::aggr(vivienda_data_final, cex.axis = 0.4, cex.lab= 0.4)

Se visualiza que la base de datos esta completa, por lo tanto podemos proceder con los siguientes analisis.

5. Caracteristicas principales de la vivienda

summary(vivienda_data_final)
##        Id           Zona                Piso           Estrato     
##  Min.   :   1   Length:4808        Min.   : 1.000   Min.   :3.000  
##  1st Qu.:2479   Class :character   1st Qu.: 2.000   1st Qu.:4.000  
##  Median :4474   Mode  :character   Median : 3.000   Median :5.000  
##  Mean   :4427                      Mean   : 3.886   Mean   :4.838  
##  3rd Qu.:6413                      3rd Qu.: 5.000   3rd Qu.:6.000  
##  Max.   :8316                      Max.   :12.000   Max.   :6.000  
##  Precio x metro cuadrado Area construida  Numero de parqueaderos
##  Min.   :  58.0          Min.   :  40.0   Min.   : 1.000        
##  1st Qu.: 244.5          1st Qu.:  85.0   1st Qu.: 1.000        
##  Median : 350.0          Median : 123.0   Median : 2.000        
##  Mean   : 457.2          Mean   : 174.8   Mean   : 1.815        
##  3rd Qu.: 560.0          3rd Qu.: 225.0   3rd Qu.: 2.000        
##  Max.   :1999.0          Max.   :1500.0   Max.   :10.000        
##      Banos         Habitaciones        Tipo              Barrio         
##  Min.   : 0.000   Min.   : 0.000   Length:4808        Length:4808       
##  1st Qu.: 2.000   1st Qu.: 3.000   Class :character   Class :character  
##  Median : 3.000   Median : 3.000   Mode  :character   Mode  :character  
##  Mean   : 3.219   Mean   : 3.564                                        
##  3rd Qu.: 4.000   3rd Qu.: 4.000                                        
##  Max.   :10.000   Max.   :10.000                                        
##     Longitud         Latitud     
##  Min.   :-76.59   Min.   :3.333  
##  1st Qu.:-76.54   1st Qu.:3.378  
##  Median :-76.53   Median :3.408  
##  Mean   :-76.53   Mean   :3.414  
##  3rd Qu.:-76.52   3rd Qu.:3.451  
##  Max.   :-76.46   Max.   :3.498

Se calcula el precio promedio por metro cuadrado por zona.

precio_promedio_por_zona <- aggregate(`Precio x metro cuadrado` ~ Zona, data = vivienda_data_final, FUN = mean)

Se procede a graficar el precio promedio por metro cuadrado por zona en la ciudad.

Se identifica que la Zona con mayor precio por m2 es la Zona Oeste seguido de la Zona Sur, la Zona Oriente es la que presente las propiedades con menor precio por m2.

Se calcula la proporción del tipo de inmueble ofertado.

Se puede concluir que en una relacion de 6 de cada 10 propiedades son Apartamentos en el listado de propiedades.

## `geom_smooth()` using formula = 'y ~ x'

Se evidencia que existe una correlación positiva entre el area construida y el precio por m2.

6. Analisis de Componentes Principales

Se verifica que no existan datos faltantes y se escala(estandariza) las columnas seleccionadas

##  /\     /\
## {  `---'  }
## {  O   O  }
## ==>  V <==  No need for mice. This data set is completely observed.
##  \  \|/  /
##   `-----'

##      Id Zona Piso Estrato Precio x metro cuadrado Area construida
## 4808  1    1    1       1                       1               1
##       0    0    0       0                       0               0
##      Numero de parqueaderos Banos Habitaciones Tipo Barrio Longitud Latitud  
## 4808                      1     1            1    1      1        1       1 0
##                           0     0            0    0      0        0       0 0

Se procede a hacer el PCA y se genera la grafica.

## Standard deviations (1, .., p=6):
## [1] 1.8865511 1.0883593 0.6952961 0.5852809 0.4964721 0.4288636
## 
## Rotation (n x k) = (6 x 6):
##                               PC1        PC2        PC3         PC4        PC5
## Estrato                 0.2946513  0.6488133 -0.5512044  0.06330413  0.4037809
## Precio x metro cuadrado 0.4676270  0.2332802  0.1252672 -0.31468474 -0.2245253
## Area construida         0.4495212 -0.2109552  0.2495691 -0.64247711  0.2937703
## Numero de parqueaderos  0.4287458  0.1463697  0.6073869  0.62730620  0.1435930
## Banos                   0.4639679 -0.1419484 -0.3362258  0.14651179 -0.7162461
## Habitaciones            0.3055275 -0.6622281 -0.3690942  0.26307887  0.4081922
##                                PC6
## Estrato                 -0.1461135
## Precio x metro cuadrado  0.7495167
## Area construida         -0.4382534
## Numero de parqueaderos  -0.1081764
## Banos                   -0.3421438
## Habitaciones             0.3099112

Se hace el grafico de PCA.

Sentido de los ejes (Se escogen 4 casos extremos de la base de datos)

##                 Id       Zona Piso Estrato Precio x metro cuadrado
## Vivienda 275  5056 Zona Norte    2       3                      89
## Vivienda 831  5004   Zona Sur    4       6                    1600
## Vivienda 2924 3654   Zona Sur    2       6                     580
## Vivienda 2642 7221   Zona Sur    3       3                     240
##               Area construida Numero de parqueaderos Banos Habitaciones
## Vivienda 275              130                      1     1            1
## Vivienda 831              836                      8     9            5
## Vivienda 2924             138                      2     4            0
## Vivienda 2642              90                      1     3            8
##                      Tipo        Barrio  Longitud Latitud
## Vivienda 275         Casa calimio norte -76.53464 3.44987
## Vivienda 831         Casa ciudad jardín -76.53445 3.36297
## Vivienda 2924 Apartamento         pance -76.52778 3.34537
## Vivienda 2642        Casa       nápoles -76.54814 3.38677

El PC1 (Primer Componente Principal) es una combinación de todas las variables con pesos positivos, donde Precio por metro cuadrado, Área construida, Número de parqueaderos, y Baños tienen los coeficientes más altos. Esto sugiere que estas variables son las que más contribuyen a la varianza total en el dataset. El PC1 podría estar capturando una medida general de tamaño y valor de la propiedad.

El PC2 muestra una alta contribución de Estrato y Habitaciones, pero con un signo negativo en Habitaciones. Esto indica que estas variables tienen una relación inversa en este componente. El PC2 podría estar relacionado con aspectos socioeconómicos o características específicas de las viviendas.

Se genera el biplot del PCA para añadir una dimension de variable categorica al grafico en este caso Estrato.

El análisis sugiere que Estrato está fuertemente asociado con varias variables como Precio por metro cuadrado y Área construida, lo que no es sorprendente dado que los estratos socioeconómicos más altos suelen estar vinculados a propiedades más grandes y costosas.

7. Analisis de Conglomerados

Se realiza cambio de nombre para simplificar grafica.

Se calcula y grafica correlaciones para visualizar que variables influyen una sobre la otra.

##                  Estrato Precio_m2      Area Parqueaderos     Banos
## Estrato       1.00000000 0.5869856 0.2698596    0.4310598 0.4081460
## Precio_m2     0.58698562 1.0000000 0.6975519    0.7003179 0.6892846
## Area          0.26985962 0.6975519 1.0000000    0.6037061 0.6806679
## Parqueaderos  0.43105978 0.7003179 0.6037061    1.0000000 0.5975890
## Banos         0.40814595 0.6892846 0.6806679    0.5975890 1.0000000
## Habitaciones -0.05218848 0.2949258 0.5564320    0.3078349 0.5974961
##              Habitaciones
## Estrato       -0.05218848
## Precio_m2      0.29492577
## Area           0.55643197
## Parqueaderos   0.30783489
## Banos          0.59749611
## Habitaciones   1.00000000

Se procede a calcular las distancias euclidianas.

Se crea y grafica el dendograma para visualizar los posibles clusters a asignar.

Se grafica la densidad por nodo.

Se realiza el grafico del codo para definir el numero de clusters que se tendrán en cuenta.

Se define el numero de clusters y se asignan.

Se calcula el coeficiente de silhouette (se tiene en cuenta que un numero mas cercano a 1 significa mejor asignación y agrupamiento)

## Coeficiente de Silhouette promedio k=4 :  0.5236934

Se observa que el coeficiente calculado es una buena cifra y por lo tanto se deduce que esta bien realizada la tecnica de agrupamiento.

Se grafica los clusters para una mejor visualización del agrupamiento de las propiedades.

Se cuenta el numero de vivienda en cada cluster.

## 
##    1    2    3    4 
## 4747   42   18    1

El coeficiente de Silhouette promedio de 0.576 para k=3 indica una separación razonable entre los conglomerados. Este valor sugiere que los clusters formados están bien definidos, con los puntos dentro de cada conglomerado siendo más similares entre sí que a los puntos en otros conglomerados.

Cluster 1: Probablemente incluye viviendas de menor precio, menor estrato y menos características (como parqueaderos y baños).

Cluster 2: Podría representar propiedades de precio medio con características estándar, como un número moderado de parqueaderos y baños.

Cluster 3: Es posible que incluya propiedades de alto precio, mayor estrato y características superiores, como más área construida y parqueaderos.

Cluster 4: Este grupo puede representar un segmento único, tal vez propiedades de lujo o con características inusuales que las diferencian del resto del mercado.

7. Analisis de Correspondencia

Se identifica que en el atributo Barrio existen muchos barrios repetidos debido a la falta de estandarizacion (mayusculas, caracteres especiales, espacios) se decide estandarizar esta información con los comandos str_to_lower, chartr, iconv y gsub.

## [1] 240

Se calcula un analisis factorial de datos mixtos para trabajar con las variables zona, tipo y barrio como variables categorias y la variable numerica de estrato.

Se debe considerar mas de una dimension si se desea capturar una cantidad significativa de información en los datos.

“Correspondencia Zona - Estrato”

## Warning in chisq.test(tabla_contingencia_zona_estrato): Chi-squared
## approximation may be incorrect
## 
##  Pearson's Chi-squared test
## 
## data:  tabla_contingencia_zona_estrato
## X-squared = 2172.8, df = 12, p-value < 2.2e-16

Las primeras dos dimensiones explican la mayor parte de la variabilidad en la tabla de contingencia entre Zona y Estrato, sumando casi el 96.1% de la varianza. Esto indica que, para una buena comprensión de la relación entre estas variables, las dos primeras dimensiones deberían ser suficientes.

El valor de Chi-cuadrado muy alto (X-squared = 2172.8) con un p-valor extremadamente pequeño (< 2.2e-16) sugiere que hay una relación significativa entre Zona y Estrato en este conjunto de propiedades.

“Correspondencia Zona - Barrio”

## Warning in chisq.test(tabla_contingencia_zona_barrio): Chi-squared
## approximation may be incorrect
## 
##  Pearson's Chi-squared test
## 
## data:  tabla_contingencia_zona_barrio
## X-squared = 18027, df = 956, p-value < 2.2e-16

El resultado de la prueba de chi-cuadrado indica que existe una asociación significativa entre la variable Zona y la variable Barrio. Con un valor p muy bajo (< 2.2e-16), se rechaza la hipótesis nula de independencia, sugiriendo que las categorías de Zona y Barrio no están distribuidas independientemente entre sí.

8. Mapas interactivos y georeferenciación.

Se genera los 5 mapas mediante SUBSETS de la data original.

Se Muestrea para sacar un maximo de 100 puntos en el MAPA.

Se genera el mapa interactivo.

9. Conclusiones

  1. El PCA revela que el mercado inmobiliario en la ciudad está claramente segmentado por variables como el precio por metro cuadrado, el área construida y el estrato socioeconómico. Estas variables no solo influyen en la varianza del conjunto de datos, sino que también parecen estar correlacionadas entre sí de manera que reflejan diferentes nichos dentro del mercado inmobiliario. El biplot, al añadir el estrato como dimensión categórica, ayuda a visualizar cómo estas propiedades se agrupan, permitiendo identificar patrones que pueden ser útiles para decisiones estratégicas en el mercado inmobiliario.

  2. El analisis de conglomerados sugiere que el mercado inmobiliario en la ciudad está diversificado y se puede agrupar en cuatro segmentos principales. Las variables como el precio por metro cuadrado, área construida, y el número de parqueaderos y baños son las que más influyen en la formación de estos conglomerados. Este tipo de segmentación puede ser clave para desarrollar estrategias específicas de marketing y precios para cada uno de los segmentos, optimizando así la toma de decisiones estratégicas en la empresa inmobiliaria.

  3. El análisis de correspondencia permite entender la asociación entre las variables categóricas, como la zona, el estrato y el barrio.

10. Anexos

La información de este analisis se encuentra en el siguiente repositorio:

https://github.com/danielfduarteq/Maestria_Ciencia_Datos/blob/main/Entrega%201%20Informe%20Modelos%20Estadisticos.Rmd