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")
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.
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.
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.
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.
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.
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.
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í.
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.
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.
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.
El análisis de correspondencia permite entender la asociación entre las variables categóricas, como la zona, el estrato y el barrio.
La información de este analisis se encuentra en el siguiente repositorio: