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.
#cargar base de datos
#devtools::install_github("dgonxalex80/paqueteMETODOS")
library(paqueteMET)
library(dplyr)
#vivienda <- read_csv("D:/1 MARIO GM/Data Science/Estadistica 2/vivienda.csv")
glimpse(vivienda)## Rows: 8,322
## Columns: 13
## $ id <dbl> 1147, 1169, 1350, 5992, 1212, 1724, 2326, 4386, 1209, 159…
## $ zona <chr> "Zona Oriente", "Zona Oriente", "Zona Oriente", "Zona Sur…
## $ piso <chr> NA, NA, NA, "02", "01", "01", "01", "01", "02", "02", "02…
## $ estrato <dbl> 3, 3, 3, 4, 5, 5, 4, 5, 5, 5, 6, 4, 5, 6, 4, 5, 5, 4, 5, …
## $ preciom <dbl> 250, 320, 350, 400, 260, 240, 220, 310, 320, 780, 750, 62…
## $ areaconst <dbl> 70, 120, 220, 280, 90, 87, 52, 137, 150, 380, 445, 355, 2…
## $ parqueaderos <dbl> 1, 1, 2, 3, 1, 1, 2, 2, 2, 2, NA, 3, 2, 2, 1, 4, 2, 2, 2,…
## $ banios <dbl> 3, 2, 2, 5, 2, 3, 2, 3, 4, 3, 7, 5, 6, 2, 4, 4, 4, 3, 2, …
## $ habitaciones <dbl> 6, 3, 4, 3, 3, 3, 3, 4, 6, 3, 6, 5, 6, 2, 5, 5, 4, 3, 3, …
## $ tipo <chr> "Casa", "Casa", "Casa", "Casa", "Apartamento", "Apartamen…
## $ barrio <chr> "20 de julio", "20 de julio", "20 de julio", "3 de julio"…
## $ longitud <dbl> -76.51168, -76.51237, -76.51537, -76.54000, -76.51350, -7…
## $ latitud <dbl> 3.43382, 3.43369, 3.43566, 3.43500, 3.45891, 3.36971, 3.4…
La base de datos se denomina vivienda, se ha decidido ordenarla en forma ascendente con referencia a la columna id
En el dataframe data01 se encuentran datos en forma de texto, que contienen mayúsculas o abreviaciones de las palabras, por tanto se decide cambiar todo a la opción minúsculas, para que los resultados no muestren distintas formas de un mismo dato, ejemplo:
Apartamento, APARTAMENTO, apto.
# Convertir todos los datos en minúsculas, para Mayúsculas usa toupper en vez de tolower
data01 <- mutate_if(data01, is.character, tolower)
data01$tipo[data01$tipo == "apto"] <- "apartamento"
unique(data01$tipo)## [1] "casa" "apartamento" NA
| Name | data01 |
| Number of rows | 8322 |
| Number of columns | 13 |
| _______________________ | |
| Column type frequency: | |
| character | 4 |
| numeric | 9 |
| ________________________ | |
| Group variables | None |
Variable type: character
| skim_variable | n_missing | complete_rate | min | max | empty | n_unique | whitespace |
|---|---|---|---|---|---|---|---|
| zona | 3 | 1.00 | 8 | 12 | 0 | 5 | 0 |
| piso | 2638 | 0.68 | 2 | 2 | 0 | 12 | 0 |
| tipo | 3 | 1.00 | 4 | 11 | 0 | 2 | 0 |
| barrio | 3 | 1.00 | 4 | 29 | 0 | 407 | 0 |
Variable type: numeric
| skim_variable | n_missing | complete_rate | mean | sd | p0 | p25 | p50 | p75 | p100 | hist |
|---|---|---|---|---|---|---|---|---|---|---|
| id | 3 | 1.00 | 4160.00 | 2401.63 | 1.00 | 2080.50 | 4160.00 | 6239.50 | 8319.00 | ▇▇▇▇▇ |
| estrato | 3 | 1.00 | 4.63 | 1.03 | 3.00 | 4.00 | 5.00 | 5.00 | 6.00 | ▅▆▁▇▆ |
| preciom | 2 | 1.00 | 433.89 | 328.65 | 58.00 | 220.00 | 330.00 | 540.00 | 1999.00 | ▇▂▁▁▁ |
| areaconst | 3 | 1.00 | 174.93 | 142.96 | 30.00 | 80.00 | 123.00 | 229.00 | 1745.00 | ▇▁▁▁▁ |
| parqueaderos | 1605 | 0.81 | 1.84 | 1.12 | 1.00 | 1.00 | 2.00 | 2.00 | 10.00 | ▇▁▁▁▁ |
| banios | 3 | 1.00 | 3.11 | 1.43 | 0.00 | 2.00 | 3.00 | 4.00 | 10.00 | ▇▇▃▁▁ |
| habitaciones | 3 | 1.00 | 3.61 | 1.46 | 0.00 | 3.00 | 3.00 | 4.00 | 10.00 | ▂▇▂▁▁ |
| longitud | 3 | 1.00 | -76.53 | 0.02 | -76.59 | -76.54 | -76.53 | -76.52 | -76.46 | ▁▅▇▂▁ |
| latitud | 3 | 1.00 | 3.42 | 0.04 | 3.33 | 3.38 | 3.42 | 3.45 | 3.50 | ▃▇▅▇▅ |
En el resumen del marco de datos, se puede observar la identificación de variables de la siguiente manera:
Existen 9 de valor numérico, las cuales son: id, estrato, preciom, areaconst, parqueaderos, banios, habitaciones, longitud, latitud
Existen 4 atributos los cuales son: zona, piso, tipo, y barrio de carácter nominal
De acuerdo al anális de correlación podemos concluir los siguiente:
El coeficiente de Pearson o grado de asociación lineal del precio con respecto a:
área construida fue de 0.7
al número de habitaciones fue de 0.3
y con respecto al número de baños fue de 0.7
De lo cual se puede estimar que a mayor área contruida, mayor número de habitaciones y mayor numero de baños por tanto mayor será su precio.
Por otro lado el coeficiente de Pearson o grado de asociación lineal del área construida con respecto a: al número de habitaciones fue de 0.5 y con respecto al número de baños fue de 0.6, lo que indica que a mayor mayor área construida mayor numero de habitaciones y baños.
Finalmente el coeficiente de Pearson o grado de asociación lineal del número de habitaciones con respecto al número de baños es de 0.6, indicando que a mayor número de habitaciones, mayor número de baños se prsentarán. _____________________________________________________________________________________________
conteo_valoreszona <- table(data01$zona )
conteo_valoreszona_df <- as.data.frame(conteo_valoreszona )
datos <- conteo_valoreszona_df$Freq
# Etiquetas para las secciones
etiquetas <- round(conteo_valoreszona_df$Freq / sum(conteo_valoreszona_df$Freq), 3)*100
# Colores para las secciones (opcional)
colores <- c("red", "blue", "green", "orange", "purple")
# Crear el diagrama de sectores con etiquetas en la mitad
pie(datos, labels = etiquetas, col = colores, clockwise = TRUE, radius = 1, init.angle = 90)
leyenda_etiquetas <- conteo_valoreszona_df$Var1
conflicts_prefer(graphics::legend)## [conflicted] Will prefer graphics::legend over any other package.
Se presenta la distribución del numero de inmuebles por zona, donde el mayor porcentaje(56.8 %) se presento en la zona zur, seguido por la zona norte (23.1 %), zona oeste (14.4%), zona oriente (4.2%) y zona centro (1,5%).
conteo_valorestipo <- table(data01$tipo )
conteo_valorestipo_df <- as.data.frame(conteo_valorestipo )
conteo_valorestipo_dfHay más apartamentos que casas
# Crear el diagrama de cajas por categorías
boxplot(data01$preciom ~ data01$tipo, data = data01, col = c("red", "blue" ), ylab = "Precio", xlab = "Tipo")Las casas presentan mayor precio que los apartamentos
conteo_valoresestrato <- table(data01$estrato )
conteo_valoresestrato_df <- as.data.frame(conteo_valoresestrato )
# Obtener los valores de la columna "Valores"
valores <- round(conteo_valoresestrato_df$Freq / sum(conteo_valoresestrato_df$Freq),2)
# Etiquetas para las barras
etiquetas <- conteo_valoresestrato_df$Var1
# Colores para las barras (opcional)
colores <- c("red", "blue", "green", "orange")
# Crear el diagrama de barras
barplot(valores, names.arg = etiquetas, col = colores)
# Agregar el valor a cada barra
text(x = 1:length(valores), y = valores, labels = valores, pos = 1, col = "black")De la gráfica anterior se puede concluir que el más alto porcentaje de inmuebles se encuentra en el estrato 5 con el 33%, seguido del estrato 4 (26%), estrato 6 (24%) y estrato 3 (17%).
Seguidamente se calcula la existencia y el total de datos faltantes en la data VIVIENDA, la cual ha sido asignada anteriormente al dataframe df1
## [1] 4275
se puede osbervar que hay un total de datos perdidos de: (4275) del porcentaje de datos perdidos que tiene cada variable en relación al total de 8330 observaciones que posee cada columna.
##
## Variables sorted by number of missings:
## Variable Count
## piso 0.3169911079
## parqueaderos 0.1928622927
## id 0.0003604903
## zona 0.0003604903
## estrato 0.0003604903
## areaconst 0.0003604903
## banios 0.0003604903
## habitaciones 0.0003604903
## tipo 0.0003604903
## barrio 0.0003604903
## longitud 0.0003604903
## latitud 0.0003604903
## preciom 0.0002403268
El diagrama ilustra cómo cerca del 50% de los datos presentan al menos una característica con valores faltantes (NA), lo que introduce una capa adicional de complejidad en la implementación de los algoritmos.
Dado este contexto, se tomará la decisión de abordar la imputación de estos valores faltantes en la variable “Piso y Parqueadero” omitiendo el uso de estas variables
El reto principal consiste 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:
Reducir la dimensionalidad del conjunto de datos y visualizar la estructura de las variables en componentes principales para identificar características clave que influyen en la variación de precios y oferta del mercado.
Respuesta:
Para identificar si es viable realizar un Análisis de Componentes Principales (PCA), primero debemos normalizar las variables y luego realizar test de barlett y kmo
## estrato preciom areaconst banios habitaciones
## [1,] 1.3275950 1.3574069 0.4341303 1.3224164 0.2703863
## [2,] -0.6156201 2.3310953 4.3721812 2.0225935 2.3258329
## [3,] 0.3559875 -0.5595420 -0.6220787 -0.7781148 -0.4147626
## [4,] 1.3275950 2.5745174 1.1965594 2.0225935 0.9555352
## [5,] 1.3275950 2.6353729 2.9732288 2.7227705 0.9555352
## [6,] 1.3275950 0.2407081 -0.1044663 0.6222393 0.2703863
## [7,] 1.3275950 1.3269792 2.2038050 2.0225935 0.9555352
## [8,] 0.3559875 -0.3769755 -0.6465604 -0.7781148 -0.4147626
## [9,] -0.6156201 -0.5899698 -0.6640473 -0.7781148 -0.4147626
## [10,] 1.3275950 0.7792795 -0.1744140 1.3224164 0.2703863
prueba estadística para homogeneidad de varianzas, y para la aplicación en un AF es decir proporciona la probabilidad estadística de que la matriz de correlación de las variables sea una matriz identidad.
## R was not square, finding R from data
## $chisq
## [1] 21905.33
##
## $p.value
## [1] 0
##
## $df
## [1] 10
Podemos identificar que Chi cuadrado de 21897 es mayor a 60 por tanto se puede hacer PCA
Este índice se extiende de 0 a 1, llegando a 1 cuando cada variable es perfectamente predicha sin error por las otras variables. Esta medida puede ser interpretada de la siguiente forma:
## Kaiser-Meyer-Olkin factor adequacy
## Call: KMO(r = data03)
## Overall MSA = 0.69
## MSA for each item =
## estrato preciom areaconst banios habitaciones
## 0.61 0.69 0.75 0.74 0.58
el resultado MSA es de 0.69 por tanto * 0.6 a 0.7 adecuado (Es viable realizar un AF)
## Standard deviations (1, .., p=5):
## [1] 1.7126702 1.0901061 0.6673491 0.4916092 0.4376110
##
## Rotation (n x k) = (5 x 5):
## PC1 PC2 PC3 PC4 PC5
## estrato -0.3300034 -0.6744210 -0.4209148 -0.4795679 -0.1705853
## preciom -0.5068979 -0.2807716 0.3015624 0.2214323 0.7240509
## areaconst -0.4940391 0.1638245 0.6525161 -0.2985094 -0.4628195
## banios -0.5189521 0.1092985 -0.3767724 0.6647387 -0.3672975
## habitaciones -0.3475145 0.6538646 -0.4051619 -0.4358863 0.3123167
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
## **Results for the Principal Component Analysis (PCA)**
## The analysis was performed on 8319 individuals, described by 5 variables
## *The results are available in the following objects:
##
## name description
## 1 "$eig" "eigenvalues"
## 2 "$var" "results for the variables"
## 3 "$var$coord" "coord. for the variables"
## 4 "$var$cor" "correlations variables - dimensions"
## 5 "$var$cos2" "cos2 for the variables"
## 6 "$var$contrib" "contributions of the variables"
## 7 "$ind" "results for the individuals"
## 8 "$ind$coord" "coord. for the individuals"
## 9 "$ind$cos2" "cos2 for the individuals"
## 10 "$ind$contrib" "contributions of the individuals"
## 11 "$call" "summary statistics"
## 12 "$call$centre" "mean of the variables"
## 13 "$call$ecart.type" "standard error of the variables"
## 14 "$call$row.w" "weights for the individuals"
## 15 "$call$col.w" "weights for the variables"
De la anterior gráfica se puede observar la relación que existe entre la variable estrato y precio, así como la relación entre el area, las habitaciones y baños.
Un método alternativo para determinar el número de componentes principales es observar un Scree Plot, que es el gráfico de valores propios ordenados de mayor a menor. El número de componentes se determina en el punto, más allá del cual los valores propios restantes son todos relativamente pequeños y de tamaño comparable
## estrato preciom areaconst banios habitaciones
## estrato 1.00000000 0.6098066 0.2743233 0.4203218 -0.07137615
## preciom 0.60980664 1.0000000 0.6873520 0.6691456 0.26409121
## areaconst 0.27432332 0.6873520 1.0000000 0.6484165 0.51691292
## banios 0.42032178 0.6691456 0.6484165 1.0000000 0.58990641
## habitaciones -0.07137615 0.2640912 0.5169129 0.5899064 1.00000000
Podemos observar una gran correlación entre el precio el estrato y el area lo cual incide en la compra de los bienes inmuebles
## [1] 0.07183907
## Standard deviations (1, .., p=5):
## [1] 1.7126702 1.0901061 0.6673491 0.4916092 0.4376110
##
## Rotation (n x k) = (5 x 5):
## PC1 PC2 PC3 PC4 PC5
## estrato -0.3300034 -0.6744210 -0.4209148 -0.4795679 -0.1705853
## preciom -0.5068979 -0.2807716 0.3015624 0.2214323 0.7240509
## areaconst -0.4940391 0.1638245 0.6525161 -0.2985094 -0.4628195
## banios -0.5189521 0.1092985 -0.3767724 0.6647387 -0.3672975
## habitaciones -0.3475145 0.6538646 -0.4051619 -0.4358863 0.3123167
## Importance of components:
## PC1 PC2 PC3 PC4 PC5
## Standard deviation 1.7127 1.0901 0.66735 0.49161 0.4376
## Proportion of Variance 0.5866 0.2377 0.08907 0.04833 0.0383
## Cumulative Proportion 0.5866 0.8243 0.91337 0.96170 1.0000
De los 5 factores se puede concluir los siguiente:
el factor 1, explica el 58.66% de la varianza. el factor 2, explica el 23.77% de la varianza. el factor 3, explica el 8.90% de la varianza. el factor 4, explica el 4.83% de la varianza. el factor 5, explica el 3.83% de la varianza.
Lo cual lo podemos observar en el gráfico de segmentación siguiente:
## [conflicted] Will prefer psych::scree over any other package.
Según el gráfico de sedimentación, lo optimo seria realizar 3 componentes, puesto que este valor se encuentra por encima de la línea aceptable de la grafica .
# Almacenamiento de los componetes princilaes seleccionados
CP1 = resultado_pca[[2]][,1]
CP2 = resultado_pca[[2]][,2]
CP3 = resultado_pca[[2]][,3]
ComponentePrincipal = cbind(CP1, CP2, CP3)
ComponentePrincipal## CP1 CP2 CP3
## estrato -0.3300034 -0.6744210 -0.4209148
## preciom -0.5068979 -0.2807716 0.3015624
## areaconst -0.4940391 0.1638245 0.6525161
## banios -0.5189521 0.1092985 -0.3767724
## habitaciones -0.3475145 0.6538646 -0.4051619
Agrupar las propiedades residenciales en segmentos homogéneos con características similares para entender las dinámicas de las ofertas específicas en diferentes partes de la ciudad y en diferentes estratos socioeconómicos.
Respuesta
El análisis de conglomerados, también conocido como clustering, es un método estadístico usado para agrupar objetos similares en función de sus características. Mediante este análisis se logra identificar grupos muy parecidos (homogéneos) de objetos o individuos. Dentro de cada grupo los objetos son más similares entre sí que con los de otros grupos. El análisis de conglomerados implica la selección de un conjunto de variables para medir las características de los objetos o individuos, y luego aplicar un algoritmo de agrupamiento para clarificarlos en conglomerados.
## Parametrizacion de liberias: cluster, factoextra,NbClust
## [1] " "
A continuación, se realiza las conversión de la variables cualitativas (tipo y zona) en numéricas, esto con el objetivo de poder utilizar un algoritmo de clustering:
data_cluster <- data04
data_cluster <- data_cluster %>% mutate(zona = replace(zona,
zona == "zona centro", 1))
data_cluster <- data_cluster %>% mutate(zona = replace(zona,
zona == "zona norte", 2))
data_cluster <- data_cluster %>% mutate(zona = replace(zona,
zona == "zona oeste", 3))
data_cluster <- data_cluster %>% mutate(zona = replace(zona,
zona == "zona oriente",4))
data_cluster <- data_cluster %>% mutate(zona = replace(zona,
zona == "zona sur", 5))
data_cluster$zona <- as.numeric(data_cluster$zona)
# Tipo
data_cluster <- data_cluster %>% mutate(tipo = replace(tipo,
tipo == "casa", 1))
data_cluster <- data_cluster %>% mutate(tipo = replace(tipo,
tipo == "apartamento", 2))
data_cluster$tipo <- as.numeric(data_cluster$tipo)data_cluster<- na.omit(data_cluster)
scv <- (nrow(data_cluster) - 1) * sum(apply(data_cluster, 2, var))
for (i in 2:15) scv[i] <- sum(kmeans(data_cluster,
centers = i)$withinss)
plot(1:15, scv,
type = "b",
xlab = "Cantidad de Clusters",
ylab="Suma de cuadrados dentro de grupos")El gráfico anterior representa la varianza dentro de los clusters. Disminuye a medida que se aumenta k. Se puede observar una deflexión en k=4, esto indica que los clusteres adicionales más alla del cuarto tiene poco valor.
Una vez se tienen los datos preparados y se ha definido el número de clusters, se procede a la aplicación del algoritmo de clustering. Para esta caso, se usará k-means, uno de los algoritmos mas comunes, que busca formar grupos basados en la similitud entre las observaciones.
En la anterior gráfica siguiendo nos define más exactamente el uso de 2 cluster pues en el de Kmeans me subrayaba 4 cluster, por eso verificando con este método se tomará solo 2 cluster para el respectivo análisis
En los resultados podemos observar que se han generado 2 clusters con los siguientes tamaños de muestra:
## [1] 3242 5077
A continuación se graficará la ubicación de cada uno de los clusters con relación a las dos dimensiones principales:
fviz_cluster(clustering_result, data = data_cluster,
palette = c("#2E9FDF", "#E7B800"),
ellipse.type = "euclid", # Concentration ellipse
star.plot = TRUE, # Add segments from centroids to items
repel = FALSE, # Avoid label overplotting (slow)
ggtheme = theme_minimal()
)
El cluster plot muestra cómo las observaciones se agrupan en clusters.
Cada color representa un cluster diferente.
Se observa una cercanía entre los clusters 1 y 2. También se ven observaciones alejadas de los clusters principales , esto puede hacer pensar que sean observaciones atípicas o anómalas y merecen un análisis adicional. No se observa demasiada superposición entre los clusters, es decir, los clusters estan claramente definidos, esto es una señal de que el número de clusters elegido es apropiado para los datos. Los porcentajes en las dos dimensiones dentro del cluster plot proporcionan información sobre la proporción de varianza que se captura en cada dimensión y cómo contribuye a la resepresentación visual de los resultados.
Examinar la relación entre las variables categóricas (tipo de vivienda, zona y barrio), para identificar patrones de comportamiento de la oferta en mercado inmobiliario.
Respuesta
data_acm <- data01 [, c(2,4,10)]
data_acm$estrato = as.factor(data_acm$estrato)
#head(data_acm,3)
str(data_acm)## tibble [8,322 × 3] (S3: tbl_df/tbl/data.frame)
## $ zona : chr [1:8322] "zona sur" "zona oeste" "zona sur" "zona sur" ...
## $ estrato: Factor w/ 4 levels "3","4","5","6": 4 2 3 4 4 4 4 3 2 4 ...
## $ tipo : chr [1:8322] "casa" "casa" "apartamento" "apartamento" ...
# Realizar la prueba de chi-cuadrado
set.seed(7) # Establecer una semilla para reproducibilidad
chi_cuadrado <- data.frame(
estrato = rep(c("3", "4", "5", "6"), times = 50),
tipo = sample(c("zona centro", "zona sur","zona norte", "zona oeste","zona oriente"), size = 100, replace = TRUE)
)
# Crear una tabla de contingencia
tabla_zona_estrato <- table(data_acm$estrato, data_acm$zona)
# Mostrar la tabla de contingencia
print(tabla_zona_estrato)##
## zona centro zona norte zona oeste zona oriente zona sur
## 3 105 572 54 340 382
## 4 14 407 84 8 1616
## 5 4 769 290 2 1685
## 6 1 172 770 1 1043
##
## Pearson's Chi-squared test
##
## data: tabla_zona_estrato
## X-squared = 3830.4, df = 12, p-value < 0.00000000000000022
A través de esta representación gráfica, emergen patrones claros y
concretos:
La visualización gráfica resultante nos brinda una perspectiva valiosa de las relaciones entre las variables estrato y zona en el mercado inmobiliario. Podemos identificar patrones significativos permitiendo una segmentación más precisa del mercado y una mejor comprensión de las preferencias de los compradores en diferentes áreas geográficas.
Este enfoque estadístico refuerza la validez de las tendencias que se han identificado visualmente y establece un fundamento sólido para guiar las decisiones estratégicas en el ámbito inmobiliario.
La reducción de dimensionalidad mediante PCA permitió identificar las variables numéricas más influyentes en la variabilidad del mercado inmobiliario. El 82.43% de la varianza total fue capturada por los primeros 2 componentes.
El análisis de correspondencia reveló relaciones significativas entre las variables categóricas y numéricas, lo que sugiere cómo factores como el tipo de propiedad y la zona se relacionan con características numéricas como el estrato.
Valoración Precisa: Utilizar las variables más influyentes identificadas por el análisis PCA para mejorar la valoración precisa de las propiedades, considerando factores clave.
Segmentación de Mercado: Utilizar los resultados del análisis de agrupamientos para desarrollar estrategias de segmentación de mercado dirigidas a diferentes tipos de propiedades y compradores.
El análisis de datos ha proporcionado una comprensión más profunda y cuantificable del mercado inmobiliario, esto puede conllevar a la optimización de la inversión y la maximización de los beneficios a través de estrategias generando una ventaja competitiva significativa en un entorno altamente competitivo y en constante cambio.