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. 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.
El reto principal consisten en realizar un análisis integral y multidimensional de la base de datos para obtener una comprensión del mercado inmobiliario urbano. Se requiere aplicar diversas técnicas de análisis de datos, incluyendo:
Iniciamos con la exploración de los datos proporcionada por la empresa inmobiliaria “vivienda” la cual se componen de 8.330 observaciones en 13 columnas, ahora daremos una breve descripción de los datos:
| Nombre columna | Descripción | Tipo de dato |
|---|---|---|
| Id | Identificador único de cada fila, no puede estar repetido. | Numérico |
| zona | Zona de que parte de la ciudad se encuentra inmueble. | Carácter |
| piso | Numero de pisos del inmueble. | Numérico |
| Estrato | Estrato social del inmueble. | Numérico |
| Areaconst | Area construida en metros cuadrados. | Numérico |
| Parqueadero | Numero de parqueaderos. | Numérico |
| banios | Número de baños del inmueble. | Numérico |
| habitaciones | Número de habitaciones. | Numérico |
| Tipo | Tipo de inmueble si es casa o apartamento. | Carácter |
| Barrio | Nombre de barrio del inmueble. | Carácter |
| longitud y latitud | Ubicación exacta de donde se encuentra el inmueble. | Numérico |
Resumen por cada variable
summary(ExpViviendaAnalisis)
## id zona piso estrato
## Min. : 1 Length:8013 Min. : 1.000 Min. :3.000
## 1st Qu.:2080 Class :character 1st Qu.: 2.000 1st Qu.:4.000
## Median :4145 Mode :character Median : 3.000 Median :5.000
## Mean :4157 Mean : 3.601 Mean :4.658
## 3rd Qu.:6250 3rd Qu.: 5.000 3rd Qu.:5.000
## Max. :8319 Max. :12.000 Max. :6.000
## preciom areaconst parqueaderos banios
## Min. : 58.0 Min. : 30.0 Min. : 1.000 Min. : 0.000
## 1st Qu.: 220.0 1st Qu.: 79.0 1st Qu.: 1.000 1st Qu.: 2.000
## Median : 330.0 Median : 120.0 Median : 1.000 Median : 3.000
## Mean : 431.5 Mean : 171.4 Mean : 1.738 Mean : 3.096
## 3rd Qu.: 535.0 3rd Qu.: 222.0 3rd Qu.: 2.000 3rd Qu.: 4.000
## Max. :1999.0 Max. :1745.0 Max. :10.000 Max. :10.000
## habitaciones tipo barrio longitud
## Min. : 0.000 Length:8013 Length:8013 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.571 Mean :-76.53
## 3rd Qu.: 4.000 3rd Qu.:-76.52
## Max. :10.000 Max. :-76.46
## latitud
## Min. :3.333
## 1st Qu.:3.380
## Median :3.414
## Mean :3.417
## 3rd Qu.:3.452
## Max. :3.498
La limpieza y descripción de los datos se encuentra publicada en el siguiente enlace https://rpubs.com/Ablancosegura/Prueba2 en el cual realizamos el analisis EDA, corregimos valores atipicos, corregimos valores duplicados, imputamos variables categoricas que significaban lo mismo, y por ultimo borramos los valores NA´S que al final fueron un 4.8% de los datos todo lo realizamos en la primera actividad del semestre anterior. (metodos y simulación estadistica)
Procederemos a codificar las variables zonas, tipo.
ExpViviendaAnalisisMetodos <- ExpViviendaAnalisis
ExpViviendaAnalisisMetodos$zona <- as.integer(as.factor(ExpViviendaAnalisisMetodos$zona))
ExpViviendaAnalisisMetodos$tipo <- as.integer(as.factor(ExpViviendaAnalisisMetodos$tipo))
El anterior codigo asigna valores unicos a cada observacion de las variables.
la varible zona queda con los siguientes valores:
- zona centro -> 1
- zona norte -> 2
- zona oeste -> 3
- zona oriente -> 4
- zona sur -> 5
la varible tipo queda con los siguientes valores:
- apartamento -> 1
- casa -> 2
Escala = ExpViviendaAnalisisMetodos[4:9] %>%
scale()
head(Escala)
## estrato preciom areaconst parqueaderos banios habitaciones
## [1,] -0.6474473 -0.3714823 -0.1882171 1.1839048 -0.80358638 0.3179617
## [2,] -0.6474473 -0.2797869 0.5250418 -0.6929632 -0.07011586 0.3179617
## [3,] 1.3191923 1.2790357 2.5578297 2.1223388 0.66335466 -0.4229011
## [4,] 0.3358725 0.3620812 0.7033565 1.1839048 0.66335466 0.3179617
## [5,] -0.6474473 -0.6771338 -0.7588242 -0.6929632 -0.80358638 -0.4229011
## [6,] 1.3191923 0.1481252 -0.1525542 0.2454708 0.66335466 -0.4229011
prcomp(Escala)
## Standard deviations (1, .., p=6):
## [1] 1.8866278 1.0915105 0.6959455 0.6009047 0.4711356 0.4264329
##
## Rotation (n x k) = (6 x 6):
## PC1 PC2 PC3 PC4 PC5 PC6
## estrato 0.3156229 -0.6215902 0.52069952 0.06055274 -0.4724887 0.1263632
## preciom 0.4697867 -0.2298660 -0.09017785 -0.27720886 0.2807009 -0.7501282
## areaconst 0.4432474 0.2201215 -0.24986628 -0.68569627 -0.2497213 0.4001312
## parqueaderos 0.4251699 -0.1315577 -0.64824428 0.58852530 -0.1524661 0.1099749
## banios 0.4667843 0.1319196 0.36390337 0.19382538 0.6674502 0.3862978
## habitaciones 0.2907876 0.6911032 0.32505461 0.25569303 -0.4084912 -0.3160926
graficoPCA <- prcomp(Escala)
fviz_eig(graficoPCA, addlabels = TRUE, main = "Grafico PCA")
El primer componente principal (PC1) explica el 59.3% de la variabilidad de los datos, lo que representa la mayor parte de la misma. Sumando el segundo componente principal (PC2) con un 19.9% y el tercer componente principal (PC3) con un 8.1%, se explica un total del 87.3% de la variabilidad de los datos. Esto sugiere que los tres primeros componentes capturan una parte significativa de la variabilidad en los datos, lo que los convierte en componentes importantes para resumir la estructura de los datos.
fviz_pca_var(graficoPCA, col.var = “contrib”, gradient.cols =
c(“#FF7F00”, “#034D94”), repel = TRUE
)
fviz_contrib(graficoPCA, choice = “var”, axes = 1, top = 10) # PC1
Segun lo observado en el grafico de planos de los valores PCAs vemos la gran contribución que tienen las variables preciom, banios, areaconst y parqueadero sobre el componente principal PC1
fviz_contrib(graficoPCA, choice = “var”, axes = 2, top = 10) # PC2
fviz_contrib(graficoPCA, choice = “var”, axes = 3, top = 10) # PC3
Para el componente PCA2 las variables con mayor constribucion son habitaciones y estrato, miesntras que para el componente PCA3 las variables con mayor contribución son parqueaderos y estrato.
DATOSPCA <- as.data.frame(graficoPCA$rotation)
colores <- c("red", "blue", "green", "orange", "purple", "yellow")
# Crear el gráfico 3D
fig <- plot_ly(DATOSPCA[1:3], x = ~PC1, y = ~PC2, z = ~PC3, type = "scatter3d", mode = "markers",
marker = list(size = 10, color = colores))
fig <- fig %>% add_trace(text = row.names(DATOSPCA[1:3]), hoverinfo = "text")
fig <- fig %>% layout(title = "Ubicación de las variables en el espacio de componentes principales",
scene = list(xaxis = list(title = "PC1"),
yaxis = list(title = "PC2"),
zaxis = list(title = "PC3")))
# Mostrar el gráfico
fig
Grafico 3D de la contribución de las variables en los tres componentes PC 1,2,3
El análisis de componentes principales (PCA) revela que los tres primeros componentes principales (PC1, PC2 y PC3) capturan una parte significativa de la variabilidad en los datos, explicando en conjunto el 87.3% de la variabilidad total. Esto sugiere que estos tres componentes son importantes para resumir la estructura de los datos.
PC1, que explica el 59.3% de la variabilidad, es el componente principal más importante y representa la mayor parte de la variabilidad en los datos. Las variables preciom, banios, areaconst y parqueadero tienen una gran contribución a PC1, lo que sugiere que estas variables son cruciales para entender la estructura subyacente de los datos.
PC2 y PC3, aunque explican una menor cantidad de variabilidad individualmente (19.9% y 8.1% respectivamente), siguen siendo importantes ya que en conjunto aportan significativamente a la explicación global de la variabilidad. Las variables habitaciones y estrato tienen una mayor contribución a PC2, mientras que parqueaderos y estrato son las variables que más contribuyen a PC3.
Para la realización del analisis de conglomerados (cluistering) tomaremos las mismas variables analizadas en PCA estrato, preciom, areaconst, parqueaderos,banios, habitaciones
head(ExpViviendaAnalisisMetodos[4:9])
## # A tibble: 6 × 6
## estrato preciom areaconst parqueaderos banios habitaciones
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 4 310 145 3 2 4
## 2 4 340 245 1 3 4
## 3 6 850 530 4 4 3
## 4 5 550 270 3 4 4
## 5 4 210 65 1 2 3
## 6 6 480 150 2 4 3
Al observar la muestra de datos anterior, notamos que las variables tienen rangos distintos, lo que sugiere la necesidad de realizar un proceso de escalamiento de las variables. Una técnica común para esto es la estandarización, que implica restar la media y dividir el resultado por la desviación estándar de cada variable. En R, podemos realizar este proceso de manera sencilla utilizando la función scale()
ExpViviendaAnalisisMetodosEscalada <- scale(ExpViviendaAnalisisMetodos[4:9])
head(ExpViviendaAnalisisMetodosEscalada)
## estrato preciom areaconst parqueaderos banios habitaciones
## [1,] -0.6474473 -0.3714823 -0.1882171 1.1839048 -0.80358638 0.3179617
## [2,] -0.6474473 -0.2797869 0.5250418 -0.6929632 -0.07011586 0.3179617
## [3,] 1.3191923 1.2790357 2.5578297 2.1223388 0.66335466 -0.4229011
## [4,] 0.3358725 0.3620812 0.7033565 1.1839048 0.66335466 0.3179617
## [5,] -0.6474473 -0.6771338 -0.7588242 -0.6929632 -0.80358638 -0.4229011
## [6,] 1.3191923 0.1481252 -0.1525542 0.2454708 0.66335466 -0.4229011
X <-ExpViviendaAnalisisMetodosEscalada
sse <- numeric(10)
for (k in 1:10) {
km <- kmeans(X, centers = k)
sse[k] <- km$tot.withinss
}
plot(1:10, sse, type = "b", pch = 19, frame = FALSE,
xlab = "Número de clusters (k)", ylab = "SSE",
main = "Método del codo")
abline(v = 4, col = "red", lty = 2)
En este caso, la técnica del codo no muestra un punto de inflexión tan evidente en la curva de la suma de cuadrados dentro del cluster (SSE). Sin embargo, se observa un ligero cambio en la tendencia de los datos a partir del cluster 4, lo que podría sugerir un posible número óptimo de clusters. Es importante tener en cuenta que la interpretación del método del codo puede ser subjetiva y dependerá del contexto específico del problema y de la interpretación del analista.
El objetivo de esta técnica es dividir un conjunto de datos en grupos o clusters, donde los puntos dentro de un mismo cluster son más similares entre sí que con los puntos de otros clusters. Esto se logra asignando cada punto a un cluster de manera que la similitud entre los puntos dentro del mismo cluster sea alta, mientras que la similitud entre puntos de diferentes clusters sea baja.
km <- kmeans(ExpViviendaAnalisisMetodosEscalada,4)
head(aggregate(ExpViviendaAnalisisMetodosEscalada, by=list(cluster= km$cluster), mean))
## cluster estrato preciom areaconst parqueaderos banios
## 1 1 -0.5729996 -0.64765148 -0.586002863 -0.57826569 -0.7374414
## 2 2 1.0523393 2.13099481 1.724151785 1.95327090 1.4904953
## 3 3 -0.7023303 0.01499266 0.875148760 -0.01423534 0.8910717
## 4 4 0.7891151 0.25961559 0.001297602 0.22323859 0.3243608
## habitaciones
## 1 -0.4922014
## 2 0.5882879
## 3 1.9771498
## 4 -0.1294505
fviz_cluster(km, data=ExpViviendaAnalisisMetodosEscalada)
Cluster 1: Este cluster se caracteriza por tener valores relativamente bajos en estrato y parqueaderos, pero altos en areaconst, banios, y habitaciones. Esto podría indicar propiedades más grandes con un número considerable de habitaciones y baños, pero ubicadas en estratos más bajos.
Cluster 2: Este cluster tiene valores intermedios en todas las variables, con un estrato y parqueaderos moderados, pero no tan altos como en el Cluster 3. Las propiedades en este cluster podrían ser de tamaño y precio promedio.
Cluster 3: Este cluster se destaca por tener valores muy altos en todas las variables. Las propiedades en este cluster parecen ser grandes, con precios y características de lujo.
Cluster 4: Este cluster tiene valores bajos en todas las variables, lo que sugiere propiedades más pequeñas y posiblemente de menor valor.
El objetivo del Análisis de Correspondencia Simple (ACS) es descubrir relaciones entre variables categóricas en un conjunto de datos. En este caso, nos enfocaremos en las variables “zona” y “estrato”.
la varible zona:
- zona centro -> 1
- zona norte -> 2
- zona oeste -> 3
- zona oriente -> 4
- zona sur -> 5
la varible tipo:
- apartamento -> 1
- casa -> 2
## zona_centro zona_norte zona_oeste zona_oriente zona_ sur
## 3 71 527 39 316 352
## 4 7 382 76 3 1596
## 5 0 757 279 1 1670
## 6 0 143 759 0 1035
options(scipen = 999)
chisq.test(tabla2)
##
## Pearson's Chi-squared test
##
## data: tabla2
## X-squared = 3852.4, df = 12, p-value < 0.00000000000000022
La prueba da como resultado que las variables zona y tipo no son
independientes al dar un valor menor que 0.05 por tanto se rechza la
hipotesis nula.
Procederemos a realizar el analsis de
correspondencia.
resultado_ac <- ca(tabla2)
#resultado_ac
plot(resultado_ac)
se observan varios grupos.
Este tipo de cercanias permite asociar las categorias.