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.
Instalación e importación de librerias Cargue de la data planteada para el ejercicio
A continuacion se presentan las principales caracteristicas encontradas en la data registrada
Por tipo
conteo_viviendas <- table(vivienda$tipo)
df_conteo <- data.frame(tipo = names(conteo_viviendas), conteo = as.numeric(conteo_viviendas))
# Calcular los porcentajes
df_conteo$porcentaje <- df_conteo$conteo / sum(df_conteo$conteo) * 100
# Crear el gráfico de pastel con etiquetas de porcentaje
ggplot(df_conteo, aes(x = "", y = conteo, fill = tipo)) +
geom_bar(stat = "identity", width = 1) +
geom_text(aes(label = paste0(round(porcentaje), "%")),
position = position_stack(vjust = 0.5)) + # Colocar porcentajes en el medio de cada segmento
coord_polar("y", start = 0) + # Convertir a gráfico de pastel
labs(title = "Distribucion por tipo de vivienda") + # Título del gráfico
scale_fill_manual(values = c("blue", "grey")) + # Personalizar los colores de las secciones
theme_minimal() + # Aplicar un tema minimalista
theme(axis.text.x = element_blank()) # Quitar etiquetas del eje X
Por Zona
conteo_viviendas <- table(vivienda$zona)
df_conteo <- data.frame(tipo = names(conteo_viviendas), conteo = as.numeric(conteo_viviendas))
# Calcular los porcentajes
df_conteo$porcentaje <- df_conteo$conteo / sum(df_conteo$conteo) * 100
# Crear el gráfico de pastel con etiquetas de porcentaje
ggplot(df_conteo, aes(x = "", y = conteo, fill = tipo)) +
geom_bar(stat = "identity", width = 1) +
geom_text(aes(label = paste0(round(porcentaje), "%")), position = position_stack(vjust = 0.5)) +
coord_polar("y", start = 0) +
labs(title = "Distribución por zona donde se encuentra la vivienda") +
scale_fill_manual(values = c("blue", "grey", "#ffd733", "#ff8a33", "#4db822")) +
theme_minimal()
Por Piso
conteo_viviendas <- table(vivienda$piso)
df_conteo <- data.frame(tipo = names(conteo_viviendas), conteo = as.numeric(conteo_viviendas))
# Calcular los porcentajes
df_conteo$porcentaje <- df_conteo$conteo / sum(df_conteo$conteo) * 100
# Crear el gráfico de pastel con etiquetas de porcentaje
ggplot(df_conteo, aes(x = "", y = conteo, fill = tipo)) +
geom_bar(stat = "identity", width = 1) +
geom_text(aes(label = paste0(round(porcentaje), "%")), position = position_stack(vjust = 0.5)) +
coord_polar("y", start = 0) +
labs(title = "Distribución por numero de pisos") +
theme_minimal()
Por Estrato
conteo_viviendas <- table(vivienda$estrato)
df_conteo <- data.frame(tipo = names(conteo_viviendas), conteo = as.numeric(conteo_viviendas))
# Calcular los porcentajes
df_conteo$porcentaje <- df_conteo$conteo / sum(df_conteo$conteo) * 100
# Crear el gráfico de pastel con etiquetas de porcentaje
ggplot(df_conteo, aes(x = "", y = conteo, fill = tipo)) +
geom_bar(stat = "identity", width = 1) +
geom_text(aes(label = paste0(round(porcentaje), "%")), position = position_stack(vjust = 0.5)) +
coord_polar("y", start = 0) +
labs(title = "Distribución por estrato de la vivienda") +
scale_fill_manual(values = c("blue", "grey", "#ffd733", "#ff8a33", "#4db822", "#c41e73")) +
theme_minimal()
Por Parqueadero
conteo_viviendas <- table(vivienda$parqueaderos)
df_conteo <- data.frame(tipo = names(conteo_viviendas), conteo = as.numeric(conteo_viviendas))
# Calcular los porcentajes
df_conteo$porcentaje <- df_conteo$conteo / sum(df_conteo$conteo) * 100
# Crear el gráfico de pastel con etiquetas de porcentaje
ggplot(df_conteo, aes(x = "", y = conteo, fill = tipo)) +
geom_bar(stat = "identity", width = 1) +
geom_text(aes(label = paste0(round(porcentaje), "%")), position = position_stack(vjust = 0.5)) +
coord_polar("y", start = 0) +
labs(title = "Distribucion por Numero de parqueaderos") +
theme_minimal()
Por Barrios
# Contar las viviendas por barrio
conteo_viviendas <- table(vivienda$barrio)
df_conteo <- data.frame(tipo = names(conteo_viviendas), conteo = as.numeric(conteo_viviendas))
# Calcular los porcentajes
df_conteo$porcentaje <- df_conteo$conteo / sum(df_conteo$conteo) * 100
# Agrupar en "Otros" los barrios con menos de 5%
df_conteo <- df_conteo %>%
mutate(tipo = ifelse(porcentaje < 2, "Otros", tipo)) %>%
group_by(tipo) %>%
summarise(conteo = sum(conteo), porcentaje = sum(porcentaje), .groups = 'drop')
# Crear el gráfico de barras agrupadas
p <- ggplot(df_conteo, aes(x = tipo, y = conteo, fill = tipo)) +
geom_bar(stat = "identity", position = "dodge") +
labs(title = "Distribucion Resumida por Barrio", x = "Barrio", y = "Numero de Viviendas", fill = "Barrio") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 0.5, vjust = 1)) # Ajusta la posición vertical de las etiquetas
# Mostrar el gráfico
print(p)
print('Se muestran los barrios cuya repetición es igual o superior al 2%')
[1] "Se muestran los barrios cuya repetición es igual o superior al 2%"
# Crear el gráfico usando un mapa base
#ggplot() +
# borders("world") + # Añadir fronteras del mapa mundial
# geom_point(data = data, aes(x = longitude, y = latitud, color = descripcion), size = 4) +
# geom_text(data = data, aes(x = longitude, y = latitud, label = descripcion), vjust = -1, hjust = 0.5) +
# coord_fixed(1.3) + # Mantener el aspecto fijo
# labs(title = "Puntos de Interés en el Mapa", x = "Longitud", y = "Latitud") +
# theme_minimal()
vivienda_num <- vivienda[sapply(vivienda, is.numeric)]
viviendaZ <- scale(vivienda_num) # datos estandarizados
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
print('-----------------------------------------------------------------------')
[1] "-----------------------------------------------------------------------"
summary(viviendaZ)
id estrato preciom areaconst
Min. :-1.7317 Min. :-1.5872 Min. :-1.1438 Min. :-1.0138
1st Qu.:-0.8659 1st Qu.:-0.6156 1st Qu.:-0.6508 1st Qu.:-0.6640
Median : 0.0000 Median : 0.3560 Median :-0.3161 Median :-0.3633
Mean : 0.0000 Mean : 0.0000 Mean : 0.0000 Mean : 0.0000
3rd Qu.: 0.8659 3rd Qu.: 0.3560 3rd Qu.: 0.3229 3rd Qu.: 0.3782
Max. : 1.7317 Max. : 1.3276 Max. : 4.7623 Max. :10.9822
NA's :3 NA's :3 NA's :2 NA's :3
parqueaderos banios habitaciones longitud
Min. :-0.7425 Min. :-2.17847 Min. :-2.4702 Min. :-3.47989
1st Qu.:-0.7425 1st Qu.:-0.77812 1st Qu.:-0.4148 1st Qu.:-0.74572
Median : 0.1465 Median :-0.07794 Median :-0.4148 Median :-0.08013
Mean : 0.0000 Mean : 0.00000 Mean : 0.0000 Mean : 0.00000
3rd Qu.: 0.1465 3rd Qu.: 0.62224 3rd Qu.: 0.2704 3rd Qu.: 0.55844
Max. : 7.2582 Max. : 4.82330 Max. : 4.3813 Max. : 3.77083
NA's :1605 NA's :3 NA's :3 NA's :3
latitud
Min. :-1.98516
1st Qu.:-0.86422
Median :-0.03856
Mean : 0.00000
3rd Qu.: 0.80575
Max. : 1.87755
NA's :3
Ahora se validan los datos faltantes Se crea un Dataset para la revision de compomentes principales Se eliminan columnas no necesarias
#vivienda_componentes <- subset(vivienda, select = -c("zona", "piso", "estrato", "preciom", "areaconst", "parqueaderos", "banios",
#"habitaciones","tipo"))
vivienda_componentes <- subset(vivienda, select = -c(id, barrio, latitud, longitud))
#Creo un dataset alterno para el trabajo con los clusters
vivienda_cluster <- subset(vivienda, select = -c(id))
md.pattern(vivienda_componentes)
preciom zona estrato areaconst banios habitaciones tipo parqueaderos piso
4808 1 1 1 1 1 1 1 1 1
1909 1 1 1 1 1 1 1 1 0
876 1 1 1 1 1 1 1 0 1
726 1 1 1 1 1 1 1 0 0
1 1 0 0 0 0 0 0 0 0
2 0 0 0 0 0 0 0 0 0
2 3 3 3 3 3 3 1605 2638
4808 0
1909 1
876 1
726 2
1 8
2 9
4263
Se hace el proceso de imputacion en las variables objetivo
Primero se hace la imputacion al estrato
#para estrato
moda <- names(which.max(table(vivienda_componentes$estrato)))
vivienda_componentes <- vivienda_componentes %>%
mutate(estrato = ifelse(is.na(estrato), moda, estrato))
vivienda_cluster <- vivienda_cluster %>%
mutate(estrato = ifelse(is.na(estrato), moda, estrato))
Para imputar el precio por metro, se hará con la media, pero de cada uno de los estratos por separado. Esto se logra con agrupamiento
Tambien se hace el proceso para el área construida
# Calcular la media de 'preciom' por cada estrato
medias_precio <- vivienda_componentes %>%
group_by(estrato) %>%
summarize(media_precio = mean(preciom, na.rm = TRUE))
vivienda_componentes <- vivienda_componentes %>%
left_join(medias_precio, by = "estrato") %>%
mutate(preciom = ifelse(is.na(preciom), media_precio, preciom))
vivienda_cluster <- vivienda_cluster %>%
left_join(medias_precio, by = "estrato") %>%
mutate(preciom = ifelse(is.na(preciom), media_precio, preciom)) %>%
select(-media_precio) # Eliminar columna temporal de medias
# Calcular la media de 'areaconst' por cada estrato
medias_areaconst <- vivienda_componentes %>%
group_by(estrato) %>%
summarize(media_areaconst = mean(areaconst, na.rm = TRUE))
vivienda_componentes <- vivienda_componentes %>%
left_join(medias_areaconst, by = "estrato") %>%
mutate(areaconst = ifelse(is.na(areaconst), media_areaconst, areaconst))
vivienda_cluster <- vivienda_cluster %>%
left_join(medias_areaconst, by = "estrato") %>%
mutate(areaconst = ifelse(is.na(areaconst), media_areaconst, areaconst)) %>%
select(-media_areaconst) # Eliminar columna temporal de medias
print(vivienda_componentes)
# A tibble: 8,322 × 11
zona piso estrato preciom areaconst parqueaderos banios habitaciones tipo
<chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <chr>
1 Zona … <NA> 3 250 70 1 3 6 Casa
2 Zona … <NA> 3 320 120 1 2 3 Casa
3 Zona … <NA> 3 350 220 2 2 4 Casa
4 Zona … 02 4 400 280 3 5 3 Casa
5 Zona … 01 5 260 90 1 2 3 Apar…
6 Zona … 01 5 240 87 1 3 3 Apar…
7 Zona … 01 4 220 52 2 2 3 Apar…
8 Zona … 01 5 310 137 2 3 4 Apar…
9 Zona … 02 5 320 150 2 4 6 Casa
10 Zona … 02 5 780 380 2 3 3 Casa
# ℹ 8,312 more rows
# ℹ 2 more variables: media_precio <dbl>, media_areaconst <dbl>
De igual manera el numero de habitaciones por estrato
# Calcular la media de 'preciom' por cada estrato
medias_habitaciones <- vivienda_componentes %>%
group_by(estrato) %>%
summarize(media_habitaciones = mean(habitaciones, na.rm = TRUE))
vivienda_componentes <- vivienda_componentes %>%
left_join(medias_habitaciones, by = "estrato") %>%
mutate(habitaciones = ifelse(is.na(habitaciones), media_habitaciones, habitaciones))
vivienda_cluster <- vivienda_cluster %>%
left_join(medias_habitaciones, by = "estrato") %>%
mutate(habitaciones = ifelse(is.na(habitaciones), media_habitaciones, habitaciones)) %>%
select(-media_habitaciones) # Eliminar columna temporal de medias
Ahora la zona
moda <- names(which.max(table(vivienda_componentes$zona)))
vivienda_componentes <- vivienda_componentes %>%
mutate(zona = ifelse(is.na(zona), moda, zona))
vivienda_cluster <- vivienda_cluster %>%
mutate(zona = ifelse(is.na(zona), moda, zona))
print(vivienda_componentes)
# A tibble: 8,322 × 12
zona piso estrato preciom areaconst parqueaderos banios habitaciones tipo
<chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <chr>
1 Zona … <NA> 3 250 70 1 3 6 Casa
2 Zona … <NA> 3 320 120 1 2 3 Casa
3 Zona … <NA> 3 350 220 2 2 4 Casa
4 Zona … 02 4 400 280 3 5 3 Casa
5 Zona … 01 5 260 90 1 2 3 Apar…
6 Zona … 01 5 240 87 1 3 3 Apar…
7 Zona … 01 4 220 52 2 2 3 Apar…
8 Zona … 01 5 310 137 2 3 4 Apar…
9 Zona … 02 5 320 150 2 4 6 Casa
10 Zona … 02 5 780 380 2 3 3 Casa
# ℹ 8,312 more rows
# ℹ 3 more variables: media_precio <dbl>, media_areaconst <dbl>,
# media_habitaciones <dbl>
El procedimiento de imputacion se continúa con: banios parqueaderos piso tipo
#para banios
moda <- names(which.max(table(vivienda_componentes$banios)))
vivienda_componentes <- vivienda_componentes %>%
mutate(banios = ifelse(is.na(banios), moda, banios))
vivienda_cluster <- vivienda_cluster %>%
mutate(banios = ifelse(is.na(banios), moda, banios))
#para parqueaderos
moda <- names(which.max(table(vivienda_componentes$parqueaderos)))
vivienda_componentes <- vivienda_componentes %>%
mutate(parqueaderos = ifelse(is.na(parqueaderos), moda, parqueaderos))
vivienda_cluster <- vivienda_cluster %>%
mutate(parqueaderos = ifelse(is.na(parqueaderos), moda, parqueaderos))
#para piso
moda <- names(which.max(table(vivienda_componentes$piso)))
vivienda_componentes <- vivienda_componentes %>%
mutate(piso = ifelse(is.na(piso), moda, piso))
vivienda_cluster <- vivienda_cluster %>%
mutate(piso = ifelse(is.na(piso), moda, piso))
#para tipo
moda <- names(which.max(table(vivienda_componentes$tipo)))
vivienda_componentes <- vivienda_componentes %>%
mutate(tipo = ifelse(is.na(tipo), moda, tipo))
vivienda_cluster <- vivienda_cluster %>%
mutate(tipo = ifelse(is.na(tipo), moda, tipo))
print(vivienda_componentes)
# A tibble: 8,322 × 12
zona piso estrato preciom areaconst parqueaderos banios habitaciones tipo
<chr> <chr> <chr> <dbl> <dbl> <chr> <chr> <dbl> <chr>
1 Zona … 02 3 250 70 1 3 6 Casa
2 Zona … 02 3 320 120 1 2 3 Casa
3 Zona … 02 3 350 220 2 2 4 Casa
4 Zona … 02 4 400 280 3 5 3 Casa
5 Zona … 01 5 260 90 1 2 3 Apar…
6 Zona … 01 5 240 87 1 3 3 Apar…
7 Zona … 01 4 220 52 2 2 3 Apar…
8 Zona … 01 5 310 137 2 3 4 Apar…
9 Zona … 02 5 320 150 2 4 6 Casa
10 Zona … 02 5 780 380 2 3 3 Casa
# ℹ 8,312 more rows
# ℹ 3 more variables: media_precio <dbl>, media_areaconst <dbl>,
# media_habitaciones <dbl>
Volvemos a revisar los faltantes
md.pattern(vivienda_componentes)
/\ /\
{ `---' }
{ O O }
==> V <== No need for mice. This data set is completely observed.
\ \|/ /
`-----'
zona piso estrato preciom areaconst parqueaderos banios habitaciones tipo
8322 1 1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0 0
media_precio media_areaconst media_habitaciones
8322 1 1 1 0
0 0 0 0
Validamos el estado de las variables en este momento para el dataSet organizado. Antes de la presentacion, se hace la conversión de los tipos de columnas de categoricos a numéricos Iniciamos con la conversion de “piso” para volverla cuantitativa De igual manera el numero de parqueaderos y baños tambien
vivienda_componentes$piso <- as.numeric(vivienda_componentes$piso)
vivienda_componentes$parqueaderos <- as.numeric(vivienda_componentes$parqueaderos)
vivienda_componentes$banios <- as.numeric(vivienda_componentes$banios)
# Configurar el diseño del gráfico
par(mfrow = c(3, 3))
# Histogramas de frecuencia para la variable preciom
hist(vivienda_componentes$preciom, main = "Precios", xlab = "preciom", ylab = "Cantidad",col = "#c4441e")
# Histogramas de frecuencia para la variable areaconst
hist(vivienda_componentes$areaconst, main = "Área_construida", xlab = "areaconst", ylab = "Mts2",col = "#e0e616")
# Histogramas de frecuencia para la variable parqueaderos
hist(vivienda_componentes$parqueaderos, main = "Parqueaderos", xlab = "parqueaderos", ylab = "Cantidad",col = "#87d228")
# Histogramas de frecuencia para la variable banios
hist(vivienda_componentes$banios, main = "Baños", xlab = "banios", ylab = "cantidad",col = "#1298db")
# Histogramas de frecuencia para la variable habitaciones
hist(vivienda_componentes$habitaciones, main = "Habitaciones", xlab = "habitaciones", ylab = "Cantidad",col = "#8122c8")
# Histogramas de frecuencia para la variable piso
hist(vivienda_componentes$piso, main = "Piso", xlab = "piso", ylab = "Cantidad",col = "#f5093f")
Análisis de Componentes Principales (PCA) 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.
Iniciamos seleccionando las variables que se van a trabajar en el ejercicio Estan son: Precio por metro area construida Parqueaderos Baños Habitaciones piso
Una vez seleccionadaas se procede a estandarizarlas
Y Finalmente sobre las variables estandarizadas, se realiza el proceso de PCA
#Seleccion de las variables
variables_pca <- vivienda_componentes %>%
select(preciom, areaconst, parqueaderos, banios, habitaciones, piso)
#Proceso de estandarizacion
variables_pca <- scale(variables_pca)
# Se realiza el proceso de PCA
variables_pca <- PCA(variables_pca, graph = FALSE)
summary(variables_pca)
Call:
PCA(X = variables_pca, graph = FALSE)
Eigenvalues
Dim.1 Dim.2 Dim.3 Dim.4 Dim.5 Dim.6
Variance 3.196 1.087 0.801 0.399 0.325 0.192
% of var. 53.259 18.115 13.352 6.650 5.417 3.207
Cumulative % of var. 53.259 71.374 84.725 91.376 96.793 100.000
Individuals (the 10 first)
Dist Dim.1 ctr cos2 Dim.2 ctr cos2 Dim.3
1 | 2.056 | -0.287 0.000 0.020 | -1.424 0.022 0.480 | 1.114
2 | 1.312 | -1.085 0.004 0.684 | -0.509 0.003 0.151 | -0.414
3 | 1.100 | -0.069 0.000 0.004 | -0.530 0.003 0.232 | -0.362
4 | 2.074 | 1.377 0.007 0.441 | 0.058 0.000 0.001 | -0.713
5 | 1.651 | -1.228 0.006 0.553 | -0.895 0.009 0.294 | -0.616
6 | 1.490 | -0.926 0.003 0.386 | -0.914 0.009 0.376 | -0.439
7 | 1.717 | -1.021 0.004 0.354 | -0.628 0.004 0.134 | -0.944
8 | 1.140 | -0.023 0.000 0.000 | -0.878 0.009 0.594 | -0.416
9 | 1.897 | 0.816 0.003 0.185 | -1.113 0.014 0.344 | 0.860
10 | 1.927 | 1.185 0.005 0.378 | 0.067 0.000 0.001 | -0.970
ctr cos2
1 0.019 0.293 |
2 0.003 0.100 |
3 0.002 0.108 |
4 0.008 0.118 |
5 0.006 0.139 |
6 0.003 0.087 |
7 0.013 0.303 |
8 0.003 0.133 |
9 0.011 0.206 |
10 0.014 0.253 |
Variables
Dim.1 ctr cos2 Dim.2 ctr cos2 Dim.3 ctr
preciom | 0.840 22.092 0.706 | 0.300 8.298 0.090 | -0.225 6.317
areaconst | 0.864 23.343 0.746 | -0.064 0.373 0.004 | -0.003 0.001
parqueaderos | 0.746 17.404 0.556 | 0.317 9.264 0.101 | -0.342 14.611
banios | 0.869 23.651 0.756 | -0.003 0.001 0.000 | 0.207 5.334
habitaciones | 0.631 12.476 0.399 | -0.442 18.014 0.196 | 0.571 40.694
piso | -0.182 1.035 0.033 | 0.834 64.049 0.696 | 0.514 33.042
cos2
preciom 0.051 |
areaconst 0.000 |
parqueaderos 0.117 |
banios 0.043 |
habitaciones 0.326 |
piso 0.265 |
Ahora, se procede a realizar la visualización de los componentes, con el fin de poder determinar cuantas dimensiones se van a utilizar en el proceso
fviz_eig(variables_pca, addlabels = TRUE)
Del anterior gráfico se puede observar: 1. El componente CP1 contiene información relevante del 53.3% 2. El componente CP2 contiene información relevante del 18.1% en este caso, solamente tomando estos dos compnentes, se logra superar el 71.4% que es un valos bastante importante que explica el comportamiento de los atributos del sistema
fviz_pca_var(variables_pca,
col.var = "contrib", # Color by contributions to the PC
gradient.cols = c("#FF7F00", "#034D94"),
repel = TRUE # Avoid text overlapping
)
Del anterior gráfico de correlaciones, se pueden determinar las siguientes conclusiones:
La variable “parqueadero”habitaciones” tiene una influencia en las dos dimensiones, pero por el color, se puede apreciar que su contribucion no es muy significativa
“piso” es una variable que tiene afectación importante en la Dim2, pero no asi en la Dim1. Su afectacion a la correlación no es impactacte.
Las variables “paqrqueaderos” y “preciom” tienen una correlacion fuerte con las variables de “areaconst” y “habitaciones” (en menor magnitu)
A continuación se va a realizar una representación gráfica de las variables analizando la contribución que realizan a las dos primeras componentes
fviz_contrib(variables_pca, choice = "var", axes = 1:2)
Confirmando la información anterior, se evidencia claramente que la variable “preciom” principalmente; al igual que las variables “banios”, “areacont” y “piso tien”piso” tienen un peso fuerte en la determinacion de las dimensiones 1 y 2.
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.
Primero determinamos cuales van a ser las variables que se van a utilizar en este análisis de conglomerados y de la misma manera que en el punto anterior, se debe hacer un proceso de normalizacion de los datos que se van a trabajar
#Seleccion de las variables
variables_conglo <- vivienda_componentes %>%
select(preciom, areaconst, parqueaderos, banios, habitaciones, piso)
#Proceso de estandarizacion
variables_conglo <- scale(variables_conglo)
summary(variables_conglo)
preciom areaconst parqueaderos banios
Min. :-1.1439 Min. :-1.0140 Min. :-0.6342 Min. :-2.17834
1st Qu.:-0.6509 1st Qu.:-0.6642 1st Qu.:-0.6342 1st Qu.:-0.77789
Median :-0.3161 Median :-0.3633 Median :-0.6342 Median :-0.07766
Mean : 0.0000 Mean : 0.0000 Mean : 0.0000 Mean : 0.00000
3rd Qu.: 0.3229 3rd Qu.: 0.3782 3rd Qu.: 0.3066 3rd Qu.: 0.62256
Max. : 4.7629 Max. :10.9842 Max. : 7.8326 Max. : 4.82393
habitaciones piso
Min. :-2.4706 Min. :-0.9554
1st Qu.:-0.4148 1st Qu.:-0.5230
Median :-0.4148 Median :-0.5230
Mean : 0.0000 Mean : 0.0000
3rd Qu.: 0.2704 3rd Qu.: 0.3418
Max. : 4.3821 Max. : 3.8009
Ahora se procede a determinar el numero de CLUSTER que se van a trabajar
# Creamos una función para calcular la suma de los cuadrados internos (WCSS) para diferentes números de clústeres
calcular_wcss <- function(data, k_max) {
wcss <- vector("numeric", length = k_max)
for (k in 1:k_max) {
model <- kmeans(data, centers = k, nstart = 10)
wcss[k] <- model$tot.withinss
}
return(wcss)
}
# Aplicamos la función para diferentes números de clústeres
k_max <- 6
wcss_valores <- calcular_wcss(variables_conglo, k_max)
# Graficamos la curva del codo para identificar el número óptimo de clústeres
plot(1:k_max, wcss_valores, type = "b", pch = 19, frame = FALSE, xlab = "Número de clústeres", ylab = "Suma de cuadrados internos",col = "#5586B3")
Con este método, se puede evaluar de manera visual cuantos cluster se deben utilizar, teniendo en cuanta el codo que se presenta en la caida de la gráfica. Se evidencia que se presenta un cambio significativo en el 2 y/o 3
Ya teniendo en cuenta el nuemero de cluster a trabajar, se va a proceder a trabajar con K-Means tomando como base 3 clusters.
# El numero de cluster es 3
num_clusters <- 3
# Aplicamos el algoritmo K-Means
modelo_kmeans <- kmeans(variables_conglo, centers = num_clusters, nstart = 10)
# Agregamos los resultados del clustering al conjunto de datos original
vivienda_cluster$cluster <- as.factor(modelo_kmeans$cluster)
summary(vivienda_cluster)
zona piso estrato preciom
Length:8322 Length:8322 Length:8322 Min. : 58.0
Class :character Class :character Class :character 1st Qu.: 220.0
Mode :character Mode :character Mode :character Median : 330.0
Mean : 433.9
3rd Qu.: 540.0
Max. :1999.0
areaconst parqueaderos banios habitaciones
Min. : 30.0 Length:8322 Length:8322 Min. : 0.000
1st Qu.: 80.0 Class :character Class :character 1st Qu.: 3.000
Median : 123.0 Mode :character Mode :character Median : 3.000
Mean : 174.9 Mean : 3.605
3rd Qu.: 229.0 3rd Qu.: 4.000
Max. :1745.0 Max. :10.000
tipo barrio longitud latitud
Length:8322 Length:8322 Min. :-76.59 Min. :3.333
Class :character Class :character 1st Qu.:-76.54 1st Qu.:3.381
Mode :character Mode :character Median :-76.53 Median :3.416
Mean :-76.53 Mean :3.418
3rd Qu.:-76.52 3rd Qu.:3.452
Max. :-76.46 Max. :3.498
NA's :3 NA's :3
cluster
1:2498
2: 931
3:4893
print('Cantidad de elementos en cada uno de los clusters creados')
[1] "Cantidad de elementos en cada uno de los clusters creados"
table(vivienda_cluster$cluster)
1 2 3
2498 931 4893
Ya se encuentra en el dataset principal, la clasificacion por cluster que se generó con el método de k-means.
A continuacion se hace una representación gráfica de dichos clusters
# Paleta de colores personalizada
colores_personalizados <- c("#084575", "#e6eb3d", "#3b9b48")
# Gráfico de barras para mostrar la distribución de viviendas en cada clúster
ggplot(vivienda_cluster, aes(x = factor(cluster))) +
geom_bar(fill = colores_personalizados) +
labs(title = "Distribución de viviendas por clúster",
x = "Clúster",
y = "Cantidad de viviendas") +
theme_minimal() +
geom_text(stat='count', aes(label=..count..), vjust=-0.5)
Warning: The dot-dot notation (`..count..`) was deprecated in ggplot2 3.4.0.
ℹ Please use `after_stat(count)` instead.
This warning is displayed once every 8 hours.
Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
generated.
En este ejercicio se puede apreciar que el cluster 1 con 4893 posee mayor número de registros (viviendas), seguido por el cluster 3 con 2498 y finalmente el número 2 con 931.
Ya teniendo esta información y con el fin de poder evidenciar como se encuntran estructurados los cluster, se va a representar a continuación los datos de las viviendas. Se van a mantener los colores definidos anteriormente para poder ubicar más fácil la información.
# Mapa con colores para representar cada clúster
ggplot(vivienda_cluster, aes(x = longitud, y = latitud, color = factor(cluster))) +
geom_point() +
labs(title = "Clústeres de propiedades residenciales",
x = "Longitud",
y = "Latitud",
color = "Clúster") +
theme_minimal() +
theme(legend.position = "bottom")
Warning: Removed 3 rows containing missing values or values outside the scale range
(`geom_point()`).
Esta grafica, representa la ubicacion de las propidades coloreadas por el cluster al que pertenecen. Se pueden evidenciar los diferentes grupos.
Es claro, que la segmentacion de los mismos no se realizó por su ubicacion geográfica, sino por las demas características que son las que se definieron para el ejercicio, como son: preciom, areaconst, parqueaderos, banios, habitaciones y piso.
Para poder determinar las caracteristicas de las propiedades, se va a realizar una tabla resumen, donde se evidencian las principales características de los cluster. Esto teniendo en cuenta que tenemos el dataset con la información original sin el id ni el barrio; pero aumentando el cluster al que pertenecen.
#Convierte los datos categoricos a numeros para poder tomar la media
vivienda_cluster$estrato <- as.numeric(vivienda_cluster$estrato)
vivienda_cluster$parqueaderos <- as.numeric(vivienda_cluster$parqueaderos)
vivienda_cluster$banios <- as.numeric(vivienda_cluster$banios)
vivienda_cluster$piso <- as.numeric(vivienda_cluster$piso)
moda <- function(x) {
uniq_x <- unique(x) # Valores únicos
uniq_x[which.max(tabulate(match(x, uniq_x)))] # Calcular la moda
}
# Tabla resumen de características promedio por clúster
tabla_resumen <- vivienda_cluster %>%
group_by(cluster) %>%
summarise(promedio_estrato = mean(estrato),
promedio_preciom = mean(preciom),
promedio_areaconst = mean(areaconst),
promedio_parqueaderos = mean(parqueaderos),
promedio_banios = mean(banios),
promedio_habitaciones = mean(habitaciones),
promedio_tipo = moda(tipo),
promedio_piso = mean(piso))
# Mostrar tabla resumen
print(tabla_resumen)
# A tibble: 3 × 9
cluster promedio_estrato promedio_preciom promedio_areaconst
<fct> <dbl> <dbl> <dbl>
1 1 4.80 519. 239.
2 2 5.64 1120. 419.
3 3 4.36 260. 96.1
# ℹ 5 more variables: promedio_parqueaderos <dbl>, promedio_banios <dbl>,
# promedio_habitaciones <dbl>, promedio_tipo <chr>, promedio_piso <dbl>
Esta presentación, muestra muy claramente como se crearon los clusters para este ejecicio.
En el cluster 1 se tienen propiedades de estrato 3, 4 principalmente, cuyo precio promedio del metro cuadrado es de 260.000 y tienen una área de 96 metros cuadrados. Estos tienen 2 baños, 3 habitaciones y son tipo apartamento.
En el grupo 2 tenemos propiedades de estrato 5, 6 con un valor por metro de 1.120.000. Las áreas son mas ámplias, llegando a un promedio de 420 metros cuadrados. 5 baños ente 4 y 5 habitaciones y son tipo casa. Este es el grupo mas reducido teniendo en cuenta las características que poseen.
Y finalmente se encuentra el cluster 3, que son estrato 4 y 5 principalmente, con un precio promedio por metro de 520.000 y una area de 240 metros cuadrados. 4 baños, entre 4 y 5 habitaciones y son casas principalmente.
A continuación se presenta el diagrama de dispersion para evidenciar la relacione entre las variables de preciom y areaconst
ggplot(vivienda_cluster, aes(x = preciom, y = areaconst, color = factor(cluster))) +
geom_point() +
labs(title = "Relación entre precio y area por clúster",
x = "Precio",
y = "Área construida",
color = "Clúster") +
theme_minimal() +
theme(legend.position = "bottom")
En esta representación gráfica se puede apreciar la distribución que tienen los cluster creados en relacion con el precio y el área. Se evidencia que en el primer cluster se encuentran las propiedades de menor valor y menor tamaño. En el cluster azul, se cuentran la propiedades de valor medio y han aumentado el tamaño Finalmente, en el cluster verde se evidencia el aumento significativo de los precios y tamaños, y es en este cluster donde tenermos un mayor y más pronunciado número de Outliers. En los otros dos grupos los casos de estos eran muy pocos.
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 inmobilia
Se van a revisar entronces, las variables categóricas, para identificar patrones que se presenten con los inmuebles.
Iniciamos tomando únicamente las variables categóricas Se va a evidenciar el analisis de correspondencia múltiple (MCA) con las variables categóricas
vivienda_categorica <- vivienda_cluster[, c("tipo", "zona", "barrio")]
mca_result <- MCA(vivienda_categorica)
Se evidencia una correlación muy fuerte entre la zona y el barrio. Por el contrario, el tipo esta muy distante de generar una correspondencia con las nombradas anteriormente.
fviz_mca_ind(mca_result,
geom.ind = "point",
pointsize = 3,
repel = TRUE,
title = "Individuos en el MCA") +
scale_color_brewer(palette = "Set1") + # Cambiar colores
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5),
axis.text = element_text(size = 12),
axis.title = element_text(size = 14),
legend.position = "bottom") +
coord_fixed()
Análisis de Correspondencia múltiple (MCA)
# Se evidencian los resultados del analisis
summary(mca_result)
Call:
MCA(X = vivienda_categorica)
Eigenvalues
Dim.1 Dim.2 Dim.3 Dim.4 Dim.5 Dim.6 Dim.7
Variance 0.711 0.660 0.651 0.623 0.444 0.333 0.333
% of var. 0.484 0.449 0.443 0.424 0.302 0.227 0.227
Cumulative % of var. 0.484 0.933 1.376 1.799 2.102 2.328 2.555
Dim.8 Dim.9 Dim.10 Dim.11 Dim.12 Dim.13 Dim.14
Variance 0.333 0.333 0.333 0.333 0.333 0.333 0.333
% of var. 0.227 0.227 0.227 0.227 0.227 0.227 0.227
Cumulative % of var. 2.782 3.009 3.236 3.462 3.689 3.916 4.143
Dim.15 Dim.16 Dim.17 Dim.18 Dim.19 Dim.20 Dim.21
Variance 0.333 0.333 0.333 0.333 0.333 0.333 0.333
% of var. 0.227 0.227 0.227 0.227 0.227 0.227 0.227
Cumulative % of var. 4.369 4.596 4.823 5.050 5.276 5.503 5.730
Dim.22 Dim.23 Dim.24 Dim.25 Dim.26 Dim.27 Dim.28
Variance 0.333 0.333 0.333 0.333 0.333 0.333 0.333
% of var. 0.227 0.227 0.227 0.227 0.227 0.227 0.227
Cumulative % of var. 5.957 6.183 6.410 6.637 6.864 7.090 7.317
Dim.29 Dim.30 Dim.31 Dim.32 Dim.33 Dim.34 Dim.35
Variance 0.333 0.333 0.333 0.333 0.333 0.333 0.333
% of var. 0.227 0.227 0.227 0.227 0.227 0.227 0.227
Cumulative % of var. 7.544 7.771 7.997 8.224 8.451 8.678 8.904
Dim.36 Dim.37 Dim.38 Dim.39 Dim.40 Dim.41 Dim.42
Variance 0.333 0.333 0.333 0.333 0.333 0.333 0.333
% of var. 0.227 0.227 0.227 0.227 0.227 0.227 0.227
Cumulative % of var. 9.131 9.358 9.585 9.811 10.038 10.265 10.492
Dim.43 Dim.44 Dim.45 Dim.46 Dim.47 Dim.48 Dim.49
Variance 0.333 0.333 0.333 0.333 0.333 0.333 0.333
% of var. 0.227 0.227 0.227 0.227 0.227 0.227 0.227
Cumulative % of var. 10.719 10.945 11.172 11.399 11.626 11.852 12.079
Dim.50 Dim.51 Dim.52 Dim.53 Dim.54 Dim.55 Dim.56
Variance 0.333 0.333 0.333 0.333 0.333 0.333 0.333
% of var. 0.227 0.227 0.227 0.227 0.227 0.227 0.227
Cumulative % of var. 12.306 12.533 12.759 12.986 13.213 13.440 13.666
Dim.57 Dim.58 Dim.59 Dim.60 Dim.61 Dim.62 Dim.63
Variance 0.333 0.333 0.333 0.333 0.333 0.333 0.333
% of var. 0.227 0.227 0.227 0.227 0.227 0.227 0.227
Cumulative % of var. 13.893 14.120 14.347 14.573 14.800 15.027 15.254
Dim.64 Dim.65 Dim.66 Dim.67 Dim.68 Dim.69 Dim.70
Variance 0.333 0.333 0.333 0.333 0.333 0.333 0.333
% of var. 0.227 0.227 0.227 0.227 0.227 0.227 0.227
Cumulative % of var. 15.480 15.707 15.934 16.161 16.387 16.614 16.841
Dim.71 Dim.72 Dim.73 Dim.74 Dim.75 Dim.76 Dim.77
Variance 0.333 0.333 0.333 0.333 0.333 0.333 0.333
% of var. 0.227 0.227 0.227 0.227 0.227 0.227 0.227
Cumulative % of var. 17.068 17.294 17.521 17.748 17.975 18.202 18.428
Dim.78 Dim.79 Dim.80 Dim.81 Dim.82 Dim.83 Dim.84
Variance 0.333 0.333 0.333 0.333 0.333 0.333 0.333
% of var. 0.227 0.227 0.227 0.227 0.227 0.227 0.227
Cumulative % of var. 18.655 18.882 19.109 19.335 19.562 19.789 20.016
Dim.85 Dim.86 Dim.87 Dim.88 Dim.89 Dim.90 Dim.91
Variance 0.333 0.333 0.333 0.333 0.333 0.333 0.333
% of var. 0.227 0.227 0.227 0.227 0.227 0.227 0.227
Cumulative % of var. 20.242 20.469 20.696 20.923 21.149 21.376 21.603
Dim.92 Dim.93 Dim.94 Dim.95 Dim.96 Dim.97 Dim.98
Variance 0.333 0.333 0.333 0.333 0.333 0.333 0.333
% of var. 0.227 0.227 0.227 0.227 0.227 0.227 0.227
Cumulative % of var. 21.830 22.056 22.283 22.510 22.737 22.963 23.190
Dim.99 Dim.100 Dim.101 Dim.102 Dim.103 Dim.104 Dim.105
Variance 0.333 0.333 0.333 0.333 0.333 0.333 0.333
% of var. 0.227 0.227 0.227 0.227 0.227 0.227 0.227
Cumulative % of var. 23.417 23.644 23.870 24.097 24.324 24.551 24.777
Dim.106 Dim.107 Dim.108 Dim.109 Dim.110 Dim.111 Dim.112
Variance 0.333 0.333 0.333 0.333 0.333 0.333 0.333
% of var. 0.227 0.227 0.227 0.227 0.227 0.227 0.227
Cumulative % of var. 25.004 25.231 25.458 25.684 25.911 26.138 26.365
Dim.113 Dim.114 Dim.115 Dim.116 Dim.117 Dim.118 Dim.119
Variance 0.333 0.333 0.333 0.333 0.333 0.333 0.333
% of var. 0.227 0.227 0.227 0.227 0.227 0.227 0.227
Cumulative % of var. 26.592 26.818 27.045 27.272 27.499 27.725 27.952
Dim.120 Dim.121 Dim.122 Dim.123 Dim.124 Dim.125 Dim.126
Variance 0.333 0.333 0.333 0.333 0.333 0.333 0.333
% of var. 0.227 0.227 0.227 0.227 0.227 0.227 0.227
Cumulative % of var. 28.179 28.406 28.632 28.859 29.086 29.313 29.539
Dim.127 Dim.128 Dim.129 Dim.130 Dim.131 Dim.132 Dim.133
Variance 0.333 0.333 0.333 0.333 0.333 0.333 0.333
% of var. 0.227 0.227 0.227 0.227 0.227 0.227 0.227
Cumulative % of var. 29.766 29.993 30.220 30.446 30.673 30.900 31.127
Dim.134 Dim.135 Dim.136 Dim.137 Dim.138 Dim.139 Dim.140
Variance 0.333 0.333 0.333 0.333 0.333 0.333 0.333
% of var. 0.227 0.227 0.227 0.227 0.227 0.227 0.227
Cumulative % of var. 31.353 31.580 31.807 32.034 32.260 32.487 32.714
Dim.141 Dim.142 Dim.143 Dim.144 Dim.145 Dim.146 Dim.147
Variance 0.333 0.333 0.333 0.333 0.333 0.333 0.333
% of var. 0.227 0.227 0.227 0.227 0.227 0.227 0.227
Cumulative % of var. 32.941 33.167 33.394 33.621 33.848 34.075 34.301
Dim.148 Dim.149 Dim.150 Dim.151 Dim.152 Dim.153 Dim.154
Variance 0.333 0.333 0.333 0.333 0.333 0.333 0.333
% of var. 0.227 0.227 0.227 0.227 0.227 0.227 0.227
Cumulative % of var. 34.528 34.755 34.982 35.208 35.435 35.662 35.889
Dim.155 Dim.156 Dim.157 Dim.158 Dim.159 Dim.160 Dim.161
Variance 0.333 0.333 0.333 0.333 0.333 0.333 0.333
% of var. 0.227 0.227 0.227 0.227 0.227 0.227 0.227
Cumulative % of var. 36.115 36.342 36.569 36.796 37.022 37.249 37.476
Dim.162 Dim.163 Dim.164 Dim.165 Dim.166 Dim.167 Dim.168
Variance 0.333 0.333 0.333 0.333 0.333 0.333 0.333
% of var. 0.227 0.227 0.227 0.227 0.227 0.227 0.227
Cumulative % of var. 37.703 37.929 38.156 38.383 38.610 38.836 39.063
Dim.169 Dim.170 Dim.171 Dim.172 Dim.173 Dim.174 Dim.175
Variance 0.333 0.333 0.333 0.333 0.333 0.333 0.333
% of var. 0.227 0.227 0.227 0.227 0.227 0.227 0.227
Cumulative % of var. 39.290 39.517 39.743 39.970 40.197 40.424 40.650
Dim.176 Dim.177 Dim.178 Dim.179 Dim.180 Dim.181 Dim.182
Variance 0.333 0.333 0.333 0.333 0.333 0.333 0.333
% of var. 0.227 0.227 0.227 0.227 0.227 0.227 0.227
Cumulative % of var. 40.877 41.104 41.331 41.558 41.784 42.011 42.238
Dim.183 Dim.184 Dim.185 Dim.186 Dim.187 Dim.188 Dim.189
Variance 0.333 0.333 0.333 0.333 0.333 0.333 0.333
% of var. 0.227 0.227 0.227 0.227 0.227 0.227 0.227
Cumulative % of var. 42.465 42.691 42.918 43.145 43.372 43.598 43.825
Dim.190 Dim.191 Dim.192 Dim.193 Dim.194 Dim.195 Dim.196
Variance 0.333 0.333 0.333 0.333 0.333 0.333 0.333
% of var. 0.227 0.227 0.227 0.227 0.227 0.227 0.227
Cumulative % of var. 44.052 44.279 44.505 44.732 44.959 45.186 45.412
Dim.197 Dim.198 Dim.199 Dim.200 Dim.201 Dim.202 Dim.203
Variance 0.333 0.333 0.333 0.333 0.333 0.333 0.333
% of var. 0.227 0.227 0.227 0.227 0.227 0.227 0.227
Cumulative % of var. 45.639 45.866 46.093 46.319 46.546 46.773 47.000
Dim.204 Dim.205 Dim.206 Dim.207 Dim.208 Dim.209 Dim.210
Variance 0.333 0.333 0.333 0.333 0.333 0.333 0.333
% of var. 0.227 0.227 0.227 0.227 0.227 0.227 0.227
Cumulative % of var. 47.226 47.453 47.680 47.907 48.133 48.360 48.587
Dim.211 Dim.212 Dim.213 Dim.214 Dim.215 Dim.216 Dim.217
Variance 0.333 0.333 0.333 0.333 0.333 0.333 0.333
% of var. 0.227 0.227 0.227 0.227 0.227 0.227 0.227
Cumulative % of var. 48.814 49.041 49.267 49.494 49.721 49.948 50.174
Dim.218 Dim.219 Dim.220 Dim.221 Dim.222 Dim.223 Dim.224
Variance 0.333 0.333 0.333 0.333 0.333 0.333 0.333
% of var. 0.227 0.227 0.227 0.227 0.227 0.227 0.227
Cumulative % of var. 50.401 50.628 50.855 51.081 51.308 51.535 51.762
Dim.225 Dim.226 Dim.227 Dim.228 Dim.229 Dim.230 Dim.231
Variance 0.333 0.333 0.333 0.333 0.333 0.333 0.333
% of var. 0.227 0.227 0.227 0.227 0.227 0.227 0.227
Cumulative % of var. 51.988 52.215 52.442 52.669 52.895 53.122 53.349
Dim.232 Dim.233 Dim.234 Dim.235 Dim.236 Dim.237 Dim.238
Variance 0.333 0.333 0.333 0.333 0.333 0.333 0.333
% of var. 0.227 0.227 0.227 0.227 0.227 0.227 0.227
Cumulative % of var. 53.576 53.802 54.029 54.256 54.483 54.709 54.936
Dim.239 Dim.240 Dim.241 Dim.242 Dim.243 Dim.244 Dim.245
Variance 0.333 0.333 0.333 0.333 0.333 0.333 0.333
% of var. 0.227 0.227 0.227 0.227 0.227 0.227 0.227
Cumulative % of var. 55.163 55.390 55.616 55.843 56.070 56.297 56.523
Dim.246 Dim.247 Dim.248 Dim.249 Dim.250 Dim.251 Dim.252
Variance 0.333 0.333 0.333 0.333 0.333 0.333 0.333
% of var. 0.227 0.227 0.227 0.227 0.227 0.227 0.227
Cumulative % of var. 56.750 56.977 57.204 57.431 57.657 57.884 58.111
Dim.253 Dim.254 Dim.255 Dim.256 Dim.257 Dim.258 Dim.259
Variance 0.333 0.333 0.333 0.333 0.333 0.333 0.333
% of var. 0.227 0.227 0.227 0.227 0.227 0.227 0.227
Cumulative % of var. 58.338 58.564 58.791 59.018 59.245 59.471 59.698
Dim.260 Dim.261 Dim.262 Dim.263 Dim.264 Dim.265 Dim.266
Variance 0.333 0.333 0.333 0.333 0.333 0.333 0.333
% of var. 0.227 0.227 0.227 0.227 0.227 0.227 0.227
Cumulative % of var. 59.925 60.152 60.378 60.605 60.832 61.059 61.285
Dim.267 Dim.268 Dim.269 Dim.270 Dim.271 Dim.272 Dim.273
Variance 0.333 0.333 0.333 0.333 0.333 0.333 0.333
% of var. 0.227 0.227 0.227 0.227 0.227 0.227 0.227
Cumulative % of var. 61.512 61.739 61.966 62.192 62.419 62.646 62.873
Dim.274 Dim.275 Dim.276 Dim.277 Dim.278 Dim.279 Dim.280
Variance 0.333 0.333 0.333 0.333 0.333 0.333 0.333
% of var. 0.227 0.227 0.227 0.227 0.227 0.227 0.227
Cumulative % of var. 63.099 63.326 63.553 63.780 64.006 64.233 64.460
Dim.281 Dim.282 Dim.283 Dim.284 Dim.285 Dim.286 Dim.287
Variance 0.333 0.333 0.333 0.333 0.333 0.333 0.333
% of var. 0.227 0.227 0.227 0.227 0.227 0.227 0.227
Cumulative % of var. 64.687 64.914 65.140 65.367 65.594 65.821 66.047
Dim.288 Dim.289 Dim.290 Dim.291 Dim.292 Dim.293 Dim.294
Variance 0.333 0.333 0.333 0.333 0.333 0.333 0.333
% of var. 0.227 0.227 0.227 0.227 0.227 0.227 0.227
Cumulative % of var. 66.274 66.501 66.728 66.954 67.181 67.408 67.635
Dim.295 Dim.296 Dim.297 Dim.298 Dim.299 Dim.300 Dim.301
Variance 0.333 0.333 0.333 0.333 0.333 0.333 0.333
% of var. 0.227 0.227 0.227 0.227 0.227 0.227 0.227
Cumulative % of var. 67.861 68.088 68.315 68.542 68.768 68.995 69.222
Dim.302 Dim.303 Dim.304 Dim.305 Dim.306 Dim.307 Dim.308
Variance 0.333 0.333 0.333 0.333 0.333 0.333 0.333
% of var. 0.227 0.227 0.227 0.227 0.227 0.227 0.227
Cumulative % of var. 69.449 69.675 69.902 70.129 70.356 70.582 70.809
Dim.309 Dim.310 Dim.311 Dim.312 Dim.313 Dim.314 Dim.315
Variance 0.333 0.333 0.333 0.333 0.333 0.333 0.333
% of var. 0.227 0.227 0.227 0.227 0.227 0.227 0.227
Cumulative % of var. 71.036 71.263 71.489 71.716 71.943 72.170 72.397
Dim.316 Dim.317 Dim.318 Dim.319 Dim.320 Dim.321 Dim.322
Variance 0.333 0.333 0.333 0.333 0.333 0.333 0.333
% of var. 0.227 0.227 0.227 0.227 0.227 0.227 0.227
Cumulative % of var. 72.623 72.850 73.077 73.304 73.530 73.757 73.984
Dim.323 Dim.324 Dim.325 Dim.326 Dim.327 Dim.328 Dim.329
Variance 0.333 0.333 0.333 0.333 0.333 0.333 0.333
% of var. 0.227 0.227 0.227 0.227 0.227 0.227 0.227
Cumulative % of var. 74.211 74.437 74.664 74.891 75.118 75.344 75.571
Dim.330 Dim.331 Dim.332 Dim.333 Dim.334 Dim.335 Dim.336
Variance 0.333 0.333 0.333 0.333 0.333 0.333 0.333
% of var. 0.227 0.227 0.227 0.227 0.227 0.227 0.227
Cumulative % of var. 75.798 76.025 76.251 76.478 76.705 76.932 77.158
Dim.337 Dim.338 Dim.339 Dim.340 Dim.341 Dim.342 Dim.343
Variance 0.333 0.333 0.333 0.333 0.333 0.333 0.333
% of var. 0.227 0.227 0.227 0.227 0.227 0.227 0.227
Cumulative % of var. 77.385 77.612 77.839 78.065 78.292 78.519 78.746
Dim.344 Dim.345 Dim.346 Dim.347 Dim.348 Dim.349 Dim.350
Variance 0.333 0.333 0.333 0.333 0.333 0.333 0.333
% of var. 0.227 0.227 0.227 0.227 0.227 0.227 0.227
Cumulative % of var. 78.972 79.199 79.426 79.653 79.880 80.106 80.333
Dim.351 Dim.352 Dim.353 Dim.354 Dim.355 Dim.356 Dim.357
Variance 0.333 0.333 0.333 0.333 0.333 0.333 0.333
% of var. 0.227 0.227 0.227 0.227 0.227 0.227 0.227
Cumulative % of var. 80.560 80.787 81.013 81.240 81.467 81.694 81.920
Dim.358 Dim.359 Dim.360 Dim.361 Dim.362 Dim.363 Dim.364
Variance 0.333 0.333 0.333 0.333 0.333 0.333 0.333
% of var. 0.227 0.227 0.227 0.227 0.227 0.227 0.227
Cumulative % of var. 82.147 82.374 82.601 82.827 83.054 83.281 83.508
Dim.365 Dim.366 Dim.367 Dim.368 Dim.369 Dim.370 Dim.371
Variance 0.333 0.333 0.333 0.333 0.333 0.333 0.333
% of var. 0.227 0.227 0.227 0.227 0.227 0.227 0.227
Cumulative % of var. 83.734 83.961 84.188 84.415 84.641 84.868 85.095
Dim.372 Dim.373 Dim.374 Dim.375 Dim.376 Dim.377 Dim.378
Variance 0.333 0.333 0.333 0.333 0.333 0.333 0.333
% of var. 0.227 0.227 0.227 0.227 0.227 0.227 0.227
Cumulative % of var. 85.322 85.548 85.775 86.002 86.229 86.455 86.682
Dim.379 Dim.380 Dim.381 Dim.382 Dim.383 Dim.384 Dim.385
Variance 0.333 0.333 0.333 0.333 0.333 0.333 0.333
% of var. 0.227 0.227 0.227 0.227 0.227 0.227 0.227
Cumulative % of var. 86.909 87.136 87.362 87.589 87.816 88.043 88.270
Dim.386 Dim.387 Dim.388 Dim.389 Dim.390 Dim.391 Dim.392
Variance 0.333 0.333 0.333 0.333 0.333 0.333 0.333
% of var. 0.227 0.227 0.227 0.227 0.227 0.227 0.227
Cumulative % of var. 88.496 88.723 88.950 89.177 89.403 89.630 89.857
Dim.393 Dim.394 Dim.395 Dim.396 Dim.397 Dim.398 Dim.399
Variance 0.333 0.333 0.333 0.333 0.333 0.333 0.333
% of var. 0.227 0.227 0.227 0.227 0.227 0.227 0.227
Cumulative % of var. 90.084 90.310 90.537 90.764 90.991 91.217 91.444
Dim.400 Dim.401 Dim.402 Dim.403 Dim.404 Dim.405 Dim.406
Variance 0.333 0.333 0.333 0.333 0.333 0.333 0.333
% of var. 0.227 0.227 0.227 0.227 0.227 0.227 0.227
Cumulative % of var. 91.671 91.898 92.124 92.351 92.578 92.805 93.031
Dim.407 Dim.408 Dim.409 Dim.410 Dim.411 Dim.412 Dim.413
Variance 0.333 0.333 0.333 0.333 0.333 0.333 0.333
% of var. 0.227 0.227 0.227 0.227 0.227 0.227 0.227
Cumulative % of var. 93.258 93.485 93.712 93.938 94.165 94.392 94.619
Dim.414 Dim.415 Dim.416 Dim.417 Dim.418 Dim.419 Dim.420
Variance 0.333 0.333 0.333 0.333 0.333 0.333 0.333
% of var. 0.227 0.227 0.227 0.227 0.227 0.227 0.227
Cumulative % of var. 94.845 95.072 95.299 95.526 95.753 95.979 96.206
Dim.421 Dim.422 Dim.423 Dim.424 Dim.425 Dim.426 Dim.427
Variance 0.333 0.333 0.333 0.333 0.333 0.333 0.333
% of var. 0.227 0.227 0.227 0.227 0.227 0.227 0.227
Cumulative % of var. 96.433 96.660 96.886 97.113 97.340 97.567 97.793
Dim.428 Dim.429 Dim.430 Dim.431 Dim.432 Dim.433 Dim.434
Variance 0.333 0.333 0.333 0.333 0.333 0.333 0.333
% of var. 0.227 0.227 0.227 0.227 0.227 0.227 0.227
Cumulative % of var. 98.020 98.247 98.474 98.700 98.927 99.154 99.381
Dim.435 Dim.436 Dim.437 Dim.438 Dim.439 Dim.440 Dim.441
Variance 0.333 0.333 0.161 0.046 0.018 0.012 0.006
% of var. 0.227 0.227 0.110 0.032 0.012 0.008 0.004
Cumulative % of var. 99.607 99.834 99.944 99.975 99.988 99.996 100.000
Individuals (the 10 first)
Dim.1 ctr cos2 Dim.2 ctr cos2 Dim.3 ctr
1 | 2.720 0.125 0.008 | 0.908 0.015 0.001 | 2.620 0.127
2 | 2.720 0.125 0.008 | 0.908 0.015 0.001 | 2.620 0.127
3 | 2.720 0.125 0.008 | 0.908 0.015 0.001 | 2.620 0.127
4 | 0.680 0.008 0.000 | -0.637 0.007 0.000 | -0.223 0.001
5 | -0.198 0.001 0.002 | 1.319 0.032 0.094 | -0.723 0.010
6 | -0.198 0.001 0.002 | 1.319 0.032 0.094 | -0.723 0.010
7 | -0.198 0.001 0.002 | 1.319 0.032 0.094 | -0.723 0.010
8 | -0.198 0.001 0.002 | 1.319 0.032 0.094 | -0.723 0.010
9 | 0.268 0.001 0.004 | 1.325 0.032 0.093 | -0.697 0.009
10 | 0.268 0.001 0.004 | 1.325 0.032 0.093 | -0.697 0.009
cos2
1 0.007 |
2 0.007 |
3 0.007 |
4 0.000 |
5 0.028 |
6 0.028 |
7 0.028 |
8 0.028 |
9 0.026 |
10 0.026 |
Categories (the 10 first)
Dim.1 ctr cos2 v.test Dim.2 ctr cos2
Apartamento | -0.457 5.993 0.330 -52.439 | -0.006 0.001 0.000
Casa | 0.724 9.500 0.330 52.439 | 0.009 0.002 0.000
Zona Centro | 2.007 2.813 0.061 22.512 | 0.239 0.043 0.001
Zona Norte | -0.056 0.033 0.001 -2.775 | 1.602 29.903 0.770
Zona Oeste | -1.725 20.081 0.500 -64.524 | 0.159 0.184 0.004
Zona Oriente | 2.930 16.982 0.378 56.095 | 1.087 2.515 0.052
Zona Sur | 0.189 0.956 0.047 19.821 | -0.778 17.354 0.796
20 de julio | 3.225 0.176 0.004 5.587 | 1.117 0.023 0.000
3 de julio | 0.806 0.004 0.000 0.806 | -0.784 0.004 0.000
acopi | 0.011 0.000 0.000 0.139 | 1.619 2.514 0.051
v.test Dim.3 ctr cos2 v.test
Apartamento -0.644 | -0.024 0.019 0.001 -2.808 |
Casa 0.644 | 0.039 0.030 0.001 2.808 |
Zona Centro 2.684 | 0.773 0.456 0.009 8.673 |
Zona Norte 80.039 | -0.845 8.445 0.214 -42.232 |
Zona Oeste 5.948 | 1.573 18.251 0.416 58.855 |
Zona Oriente 20.802 | 3.054 20.151 0.411 58.465 |
Zona Sur -81.390 | -0.302 2.660 0.120 -31.637 |
20 de julio 1.935 | 3.247 0.195 0.004 5.625 |
3 de julio -0.784 | -0.277 0.000 0.000 -0.277 |
acopi 20.550 | -0.880 0.753 0.015 -11.170 |
Categorical variables (eta2)
Dim.1 Dim.2 Dim.3
tipo | 0.330 0.000 0.001 |
zona | 0.872 0.990 0.976 |
barrio | 0.931 0.990 0.976 |
Al revisar los datos, se evidencia que el valor para Dim1 es de 0.711 y para Dim2 es de 0.660. Esto significa que en estas dos dimensiones representan un alto nivel de informacion; ya que es la representacion de las varianzas, Estos son los valores propios
Los valores de η² son herramientas poderosas en el análisis de correspondencias, ya que proporcionan información sobre qué variables son las más influyentes. En tu caso, las variables “zona” y “barrio” son claves, mientras que “tipo” presenta un impacto limitado.
A continuación, se crea otro dataframe con las variables numéricas y realizamos el anaálisis PCA de estas variables (presentado anteriormente)
vivienda_numericas <- vivienda_cluster[, c("preciom", "areaconst", "parqueaderos", "banios", "habitaciones")]
#PCA para las variables numéricas
pca_numericas <- PCA(vivienda_numericas)
Se aprecia que existe una correlación fuerte entre las columnas “banios” y “areaconst”. Estas estan aportando a la definicion del Dim2. Muentras que habitaciones aporta en la misma Dim2 pero no expresa una correlacion con las otras dos variables. El Dim1 esta influenciado principalmente por el preciom que tiene una alta correlacion con parqueaderos.
Este proceso de naálisis se realiza con el objetivo de dar herramientas sobre el valor de las propiedades en Cali, tomando una data entregada. Para lograr este objetivo, se va a trabajar haciendo una descripcion inicial de los datos. Posteriormente se hace un análisis de componentes, análisis de conglomerados y un análisis de correspondencia.
Con estos procesos se busca dar lineamientos sobre las mejores alternativas que se presentan para el proceso de compra y venta de inmuebles en la ciudad de Cali.
Analizando las varianzas presentadas se evidenció qu la Dim1 logró un 53.3% y la Dim 2 tiene un indicador de 18.1%, logrando un 71.4%. Esto indica que para el ejercicio es mas que suficiente tener solamente estas dos varianzas
Estas diomensiones estan siendo afectadas principalmente por los datos: preciom, banios, areaconst y piso. Estos son los factores determinantes del comportamiento de las dimensiones.
En el gráfico de correlaciones, se evidencia que el preciom y los parqueaderos tienen una correlacion muy alta. Este comportamiento es similar a la relacion de banios y areaconst.
La variable piso, aunque influye significativamente en la Dim2, es independiente de las demás variables.
Con esto concluimos que: 1. Aplicando la reducción de variables que se realiza con PCA, se logra la interpretación del estado de los inmuebles en la ciudad de Cali. 2. Los factores que más influyen son en su orden preciom, banios, areaconst y piso
La idea principal de este análisis, es crear grupos para la informacion recibida, donde se encuentran agrupados por características en su similitud. En este proceso se detectaron TRES grupos principalmente.
A continuación hago un resumen de las caracterísiticas de los grupos presentados:
| Clúster | Estrato | Precio por metro | Área Construida | Otros datos | Num. registros |
|---|---|---|---|---|---|
| Clúster 1 | Entre 3 y 4 | 260.000 | 96 | Son apartamentos con 2 baños y 3 habitaciones | 4893 |
| Clúster 2 | Entre 5 y 6 | 1.120.000 | 420 | en su mayoría son casas con 5 baños y entre 4 y 5 habitaciones | 931 |
| Clúster 3 | Algunos 3, muchos 4 y algunos 5 | 520.000 | 240 | Son casas y apartamentos con 4 baños y entre 4 y 5 habitaciones | 2498 |
En el proceso de reducción de componentes, se evidencia que el proceso logró dejar las Dim1 con 71.1% y Dim2 con 6.6%. Es decir, un valor conjugado del 77.7%
Este análisis revela que existen relaciones significativas entre las variables categóricas y numéricas, lo que evidencia que factores como el tipo de propiedad y la zona se relacionan con características numéricas como el precio y el tamaño.
Se debe enfocar la estratégia de ventas, teniendo en cuenta las características de precio por metro, pero soportado por el numero de banios que posee la propiedad.
Se evidencia an el análisis de clústers que la gran mayoria de inmuebles que se encuentran en venta, corresponden al cluster No.1. Esto indica que el movimiento real del mercado se encuentra en los apartamentos que se encuentran en los estratos 3 y 4 y cuyo tamaño es de alrededor de 96 metros cuadrados. Es en este rango donde se estan haciendo los principales negocios y donde se debe enfocar la empresa para maximizar sus rendimientos financieros.
En el análisis de correspondencia, se evidencian unos grupos en cuanto a la ubicacion de los predios, relacionados con el precio y el tamaño.
Se recomienda realizar este ejecicio de manera periodica para poder determinar el mejor comportamiento del mercado en el paso del tiempo y así, lograr ajustar las estrategias dependiendo de las características del mismo.