Mostrar/Ocultar Código
viviendaEl mercado inmobiliario de Cali, tercera ciudad más grande de Colombia, presenta un panorama dinámico y complejo, reflejo de su diversidad cultural, crecimiento económico y desafíos urbanísticos. Como capital del Valle del Cauca y punto estratégico en el suroccidente colombiano, Cali ha experimentado un desarrollo urbano acelerado en las últimas décadas.
En este contexto, una empresa inmobiliaria líder en Cali se propone comprender en profundidad las particularidades del mercado de viviendas urbanas local. Este estudio se centra en un análisis integral del mercado inmobiliario caleño, utilizando una base de datos extensa que abarca diversas zonas de la ciudad. El objetivo es desentrañar patrones, relaciones y segmentaciones del mercado que puedan ofrecer insights valiosos sobre las dinámicas inmobiliarias específicas de Cali.
Para lograr este objetivo, se implementará una metodología que incluye Análisis de Componentes Principales, Análisis de Conglomerados y Análisis de Correspondencia. Estas técnicas permitirán identificar características clave que influyen en precios y oferta, segmentar propiedades en grupos homogéneos y examinar relaciones entre variables categóricas como tipo de vivienda, zona y barrio.
Los resultados se complementarán con visualizaciones efectivas, incluyendo mapas de la ciudad, para facilitar la interpretación y comunicación de los hallazgos. Este enfoque integral busca no solo optimizar las operaciones de la empresa y maximizar sus beneficios, sino también contribuir a un desarrollo urbano más informado y equitativo en Cali, en un contexto de rápido crecimiento y transformación urbana.
Analizar integralmente el mercado inmobiliario de Cali mediante técnicas avanzadas de análisis de datos para guiar decisiones estratégicas de la empresa.
En esta sección, se aborda el proceso fundamental de preparación de datos para el análisis estadístico de viviendas en la ciudad de Cali. Comenzando con la importación del conjunto de datos, se detalla el proceso de exploración, limpieza y estandarización de los datos. Se abordan aspectos como la identificación y manejo de valores faltantes, la eliminación de registros duplicados, la verificación de datos espaciales y la estandarización de variables clave. Además, se describe el proceso de imputación de datos para variables con valores faltantes, asegurando así la integridad y coherencia del conjunto de datos antes de proceder con el análisis detallado. Este capítulo sienta las bases sólidas para los análisis subsiguientes, garantizando la fiabilidad y calidad de los resultados obtenidos.
Los datos utilizados en este informe corresponden con el conjunto de datos denominado vivienda. Este dataset fue importado y se estableció como la base principal para llevar a cabo el análisis del mercado inmobiliario.
viviendaLa base de datos consta de 13 variables y un total de 8,322 filas registradas. A continuación, se presenta una definición detallada de cada una de las 13 variables en el conjunto de datos, con el fin de facilitar una comprensión clara de su representación.
id: Identificador único asignado a cada registro.
zona: Zona de la ciudad de Cali en la que se ubica el inmueble.
piso: Número del piso en el que se encuentra el apartamento o número de pisos que tiene una casa.
estrato: Estrato socioeconómico del inmueble.
preciom: Precio del inmueble expresado en millones de pesos colombianos.
areaconst: Área construida del inmueble en metros cuadrados.
parqueaderos: Número de parqueaderos disponibles.
banios: Número de baños en el inmueble.
habitaciones: Número de habitaciones en el inmueble.
tipo: Tipo de vivienda.
barrio: Barrio en el que se encuentra la vivienda.
longitud: Coordenada geográfica de longitud.
latitud: Coordenada geográfica de latitud.
El proceso de ordenamiento y limpieza de datos es fundamental para garantizar la integridad y confiabilidad de cualquier análisis posterior. En esta sección, se abordan diferentes aspectos, desde la identificación de datos faltantes hasta la corrección de registros duplicados y la estandarización de variables clave. Además, se examinan datos espaciales para verificar su coherencia y se lleva a cabo la imputación de valores para garantizar la completitud del conjunto de datos. A continuación, se detallan los pasos realizados en cada etapa, destacando la importancia de cada proceso en la preparación de los datos para un análisis riguroso.
Debido a la variabilidad en la integridad de los datos, es importante destacar que no todos los registros contienen valores para cada variable. Por esta razón, se presenta a continuación una tabla resumida que muestra los valores faltantes en cada columna (variable) del dataframe vivienda. Cada entrada de esta tabla proporciona el nombre de la columna y la cantidad de valores faltantes correspondientes.
# tabla de datos faltantes
faltantes <- colSums(is.na(vivienda)) %>%
as.data.frame()
faltantes # tabla de datos faltantesDe acuerdo con esta tabla, se observa que las variables piso y parqueaderos presentan una cantidad significativa de datos faltantes, con 2,638 y 1,605 valores ausentes, respectivamente. Además, se evidencia que las demás variables presentan al menos dos registros sin información correspondiente.
Para obtener una mejor visión de los datos faltantes, se ha generado un gráfico que muestra la distribución de valores ausentes en el conjunto de datos vivienda. En este gráfico, la parte izquierda ilustra la proporción de datos faltantes para cada variable, mientras que en la parte derecha se observan las filas inferiores, representadas en azul, que indican registros completos sin datos faltantes. Las filas resaltadas con cuadrados rojos señalan las combinaciones de variables con datos faltantes. Este enfoque proporciona una representación visual clara de la presencia de datos faltantes en el conjunto de datos.
VIM::aggr(vivienda, cex.axis = 0.5, cex.lab= 0.8) # graficos de datos faltantesEstas gráficas revelan que la proporción de datos faltantes en las variables piso y parqueaderos es significativa y no pueden ser ignorados sin más. Es imperativo realizar una imputación de datos para estas variables a fin de evitar pérdida de información y asegurar la integridad del análisis.
En una primera instancia, se eliminaron aquellos registros que carecían de información en al menos dos variables, lo que resultó en la eliminación de 3 registros, quedandonos un total de 8319 filas (registros).
# Eliminar registros que no tengan por lo menos 2 variables con algun valor
dvf_sin_filas_vacias <- vivienda[rowSums(!is.na(vivienda)) >= 2, , drop = FALSE]
dim(dvf_sin_filas_vacias)[1] 8319 13
Posteriormente, se identificaron y examinaron posibles registros duplicados. Tras esta evaluación, no se encontraron registros duplicados.
# Identificar y visualizar filas duplicadas
duplicados_filas <- dvf_sin_filas_vacias[duplicated(dvf_sin_filas_vacias) | duplicated(dvf_sin_filas_vacias, fromLast = TRUE), ]
duplicados_filasPara concluir la verificación de duplicados, se aseguró de que la variable id tuviera un valor único para cada uno de los registros.
any(duplicated(dvf_sin_duplicados$id))[1] FALSE
El resultado FALSE indica que todos los valores de id son únicos, confirmando así la ausencia de registros duplicados. Con esta fase completada, la base de datos está lista para continuar con los siguientes procesos de verificación e imputación de datos.
Para Cali, la capital del departamento del Valle del Cauca en Colombia, se observa que las coordenadas geográficas generalmente se encuentran dentro del siguiente rango:
Estos valores definen el área geográfica específica de Cali. La longitud negativa indica su ubicación en el hemisferio oeste, mientras que la latitud positiva señala su posición en el hemisferio norte.
# Verifica que todas las longitudes están en el rango deseado
longitud_valida <- all(dvf_sin_duplicados$longitud >= -76.70 & dvf_sin_duplicados$longitud <= -76.46)
# Verifica que todas las latitudes están en el rango deseado
latitud_valida <- all(dvf_sin_duplicados$latitud >= 3.29 & dvf_sin_duplicados$latitud <= 3.50)
# Resultado final: TRUE si todos los valores están dentro de los rangos, FALSE si hay alguno fuera de rango
longitud_valida && latitud_valida[1] TRUE
Todas las longitudes y latitudes se encuentran en el rango esperado. Para realizar una comprobación visual, podemos explorar la distribución espacial de estos inmuebles y analizar nuestra otra variable espacial, la zona. Para lograr esto, vamos a generar un mapa que ilustre la distribución espacial de los registros según la zona:
# Combina las coordenadas en un objeto sf
dvf_sf <- st_as_sf(df2, coords = c("longitud", "latitud"), crs = 4326)
# Crea un mapa con ggplot2
ggplot() +
geom_sf(data = cali, fill = "white", color = "black") +
geom_sf(data = dvf_sf, aes(color = zona)) +
ggtitle("Distribución Espacial por Zona") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))Observamos que todos los puntos están dentro del área metropolitana de Cali, lo que confirma que todos los registros se encuentran dentro de la ciudad. Sin embargo, al examinar las zonas, notamos que hay algunos puntos que están ubicados en áreas que no les corresponden según su zona designada. Por ejemplo, hay puntos rosados de la zona sur en la parte norte del mapa. Esta discrepancia sugiere que la variable de zona puede no ser completamente confiable. Para corregir esto, sería necesario contar con polígonos que delimiten las diferentes zonas de Cali, y luego crear una nueva variable basada en la intersección de las coordenadas y estos polígonos. Sin embargo, para los propósitos de este estudio y dado que la mayoría de las zonas están bien distribuidas, dejaremos esta corrección para un posible estudio futuro más detallado.
Posteriormente, durante la revisión de los datos, se observa que existen inmuebles cuyas características no concuerdan con el tipo de inmueble reportado, como el registro con el ID 886. Este registro indica que es una casa con 10 pisos y un área construida de apenas 60 metros cuadrados, lo cual parece ser un error de ingreso de datos. Para abordar estas inconsistencias, se aplica una regla de corrección: un inmueble catalogado como “casa” no puede tener más de 5 pisos y debe tener un área construida mínima de 25 metros cuadrados por piso. En consecuencia, los registros que no cumplan la condición se reasignaran como “apartamento”.
# Convertir 'piso' a numérico, reemplazando NA con 0
df2$piso <- as.numeric(df2$piso)
# Verificar las condiciones y actualizar la variable "tipo"
df2$tipo[df2$tipo == "Casa" & df2$piso >= 5 & df2$areaconst < (25 * df2$piso)] <- "Apartamento"banios y habitacionesSe consideró que cualquier tipo de inmueble debe tener al menos una habitación y un baño. Sin embargo, se detectó que existen registros en estas variables que reportan un valor igual a cero, lo cual es incoherente ya que un inmueble habitable como mínimo debe poseer un baño y una habitación.
num_zerosb <- sum(df2$banios == 0, na.rm = TRUE)
num_zerosh <- sum(df2$habitaciones == 0, na.rm = TRUE)
cat(num_zerosb, num_zerosh)45 66
Se detectaron 45 registros con valor cero en la variable banios y 66 en la variable habitaciones Dado que estas ocurrencias representan una pequeña proporción con respecto al total de 8319 registros, se optó por un reemplazo directo, sustituyendo estos ceros (0) por el valor uno (1).
# Imputación de valores en la variable habitaciones
df2$habitaciones[df2$habitaciones == 0] <- 1
# Imputación de valores en la variable baños
df2$banios[df2$banios == 0] <- 1Al analizar la información de datos faltantes, se observa que las variables piso y parqueaderos presentan una alta proporción de datos ausentes. Eliminar estos registros podría resultar en una pérdida significativa de información. Por lo tanto, se opta por realizar la imputación de datos para estas dos variables. Inicialmente, se consideró utilizar la variable zona para ayudar en la imputación, pero debido a la variabilidad en las configuraciones de edificios y casas dentro de las zonas, así como la falta de confiabilidad en esta variable, se descarta esta opción.
pisoLos inmuebles que comparten características similares, como el tipo de vivienda y el número de habitaciones, suelen tener atributos estructurales parecidos, como el número de pisos. En una misma ciudad, es común encontrar patrones arquitectónicos y de construcción recurrentes en diferentes áreas. Por ejemplo, es probable que las casas con un número determinado de habitaciones presenten un número de pisos similar debido a consideraciones de diseño y necesidades de espacio habitable.
Por ende, al calcular la moda de los pisos para un tipo de vivienda específico y un número de habitaciones dado, aprovechamos la información disponible para hacer una estimación razonable del número de pisos que podría tener una casa o el piso en el que podría estar ubicado un apartamento con esas características. Esta aproximación es válida cuando no se dispone de información detallada sobre cada propiedad y proporciona un método sistemático para imputar datos faltantes basándose en patrones observados en el conjunto de datos.
Se procedio a imputar la variable piso, usando la moda según el tipo de vivienda y el número de habitaciones (habitaciones).
df2 <- df2 %>%
group_by(tipo, habitaciones) %>% # Agrupa el dataframe por las variables tipo y habitaciones
mutate(piso = ifelse(is.na(piso), as.numeric(names(which.max(table(piso)))), piso)) %>% #Se verifica si el valor de piso es NA, se calcula e imputa la moda.
ungroup() # Cancela el agrupamiento realizado previamente.Una vez imputados los valores de la variable piso, se verificó que no hubiera ningún valor faltante.
faltantes <- colSums(is.na(df2)) %>%
as.data.frame() # se revisa si quedaron datos sin imputar
faltantesSin embargo, hubo un registro que no se imputó exitosamente debido a que su combinación de tipo y número de habitaciones es única. Para este caso particular, se imputará utilizando el valor de la moda, pero teniendo en cuenta únicamente la variable tipo “apartamento”.
# Filtrar solo los registros de tipo "apartamento"
df2_apartamento <- df2[df2$tipo == "Apartamento", ]
# Calcular la moda de los pisos para el tipo "apartamento"
moda_apartamento <- as.numeric(names(which.max(table(df2_apartamento$piso))))
#moda_apartamento #La moda es igual a 3, no es relevante que se vea en pantalla
# Encuentra el índice del registro único de tipo "apartamento" con piso faltante
indice_registro <- which(df2$tipo == "Apartamento" & is.na(df2$piso))
# Imputa la moda calculada en el registro único
df2$piso[indice_registro] <- ifelse(length(indice_registro) > 0, moda_apartamento, df2$piso[indice_registro])
faltantes <- colSums(is.na(df2)) %>%
as.data.frame()
faltantes #se verifica la imputación.Finalmente, se verificó la imputación de la variable piso y se corroboró que esta fue completada para todos los registros.
parqueaderosSiguiendo el mismo razonamiento aplicado a la variable piso, podemos extender este análisis al número de parqueaderos. Es probable que propiedades con características similares, como tipo de vivienda y número de habitaciones, compartan también un número de parqueaderos similar.
Por lo tanto, al igual que hicimos con la variablepiso, podemos utilizar la moda considerando los tipos de vivienda y el número de habitaciones para imputar los datos faltantes en la variable parqueaderos.
df2 <- df2 %>%
group_by(tipo, habitaciones) %>%
mutate(parqueaderos = ifelse(is.na(parqueaderos), as.numeric(names(which.max(table(parqueaderos)))), parqueaderos)) %>%
ungroup()
faltantes <- colSums(is.na(df2)) %>%
as.data.frame()
faltantes #se verifica la imputación.Se verificó y se realizó la imputación de la variable parqueaderos en todos los registros del conjunto de datos.
Esta sección presenta un análisis descriptivo del mercado inmobiliario en Cali, abordando aspectos que van desde los precios de las viviendas hasta las preferencias de los compradores en términos de tipo, tamaño y ubicación de las propiedades. A través de herramientas visuales y estadísticas, se revelan las tendencias más relevantes, brindando una comprensión detallada para comprender la dinámica del sector en esta importante ciudad colombiana.
La variable de precio muestra un amplio rango, desde 58 hasta 1999 millones de pesos colombianos (COP), con una mediana de 330 millones y una media de 433.9 millones.
summary(df2$preciom) Min. 1st Qu. Median Mean 3rd Qu. Max.
58.0 220.0 330.0 433.9 540.0 1999.0
Para analizar los precios, se ha comenzado con un histograma que muestra la distribución de precios, seguido de un diagrama de cajas que representa la distribución de los precios por estrato. Además, se analiza la dispersión de los precios en función del área construida y el número de habitaciones por estrato. Posteriormente, se profundiza en el análisis espacial de la variable precio, uno de los objetivos específicos de este informe.
# Histograma de Precios
ggplot(df2, aes(x = preciom)) +
geom_histogram(binwidth = 20, fill = "#41B7C4", color = "black") +
labs(title = "Distribución de Precios de Viviendas",
x = "Precio (en millones de COP)",
y = "Frecuencia")Este histograma de precios permite observar que la mayoría de los inmuebles tienen precios concentrados por debajo de los 540 millones, el tercer cuartil.
# Boxplot de Estratos
ggplot(df2, aes(x = factor(estrato), y = preciom, fill = factor(estrato))) +
geom_boxplot() +
labs(title = "Distribución de Precios por Estrato",
x = "Estrato Socioeconómico",
y = "Precio (en millones de COP)") +
theme_minimal()En cuanto a los precios según el estrato, el boxplot muestra que a medida que aumenta el estrato, también lo hace el precio de la vivienda. Se observa que la variabilidad en los precios del estrato 6 es considerablemente más alta, como se refleja en el tamaño de su caja.
# Gráfico de Dispersión Precio vs Área Construida
ggplot(df2, aes(x = areaconst, y = preciom)) +
geom_point(aes(color = factor(estrato))) + geom_smooth(aes(color = factor(estrato), group = factor(estrato)), method= "lm", se=FALSE)+
labs(title = "Relación entre Precio y Área Construida",
x = "Área Construida (m²)",
y = "Precio (en millones de COP)") +
theme_minimal()+
ylim(0, 2300)Este gráfico de dispersión muestra que a medida que aumenta el tamaño en metros cuadrados, también lo hace el precio, lo cual es esperado y puede ser observado en las líneas de tendencia. Un aspecto destacable es la proximidad de los valores de los estratos 4 y 5 tanto en precio como en área.
# Diagrama de Dispersión Precio vs Número de Habitaciones
ggplot(df2, aes(x = factor(habitaciones), y = preciom)) +
geom_point(aes(color = factor(estrato))) +
labs(title = "Relación entre Precio y Número de Habitaciones",
x = "Número de Habitaciones",
y = "Precio (en millones de COP)") +
theme_minimal()Este gráfico que muestra la relación entre el precio y el número de habitaciones permite observar que la mayoría de los inmuebles tienen entre 3 y 5 habitaciones, donde también se concentra la mayor variabilidad de precios. Además, al incluir los estratos, se puede notar cómo el precio tiende a aumentar con el estrato.
Entre los objetivos especificos se encuentra explorar las variaciones de precios entre distintas áreas de la ciudad, así como de identificar las zonas con mayor oferta y las diferencias de precios más notables.
Para analizar la variable de precio de cada inmueble (preciom), de manera espacial, se inició con un gráfico de cajas y bigotes que muestra la distribución de precios en las diferentes zonas de Cali. Posteriormente, se elaboró otro gráfico para examinar cómo varían los precios según el tipo de vivienda. Por último, se incluyó un mapa que ilustra la distribución espacial de los inmuebles en la ciudad.
# Gráfico de cajas (Boxplot)
ggplot(df2, aes(x = zona, y = preciom, fill = zona)) +
geom_boxplot() +
labs(title = "Distribución del Precio de las Viviendas en Diferentes Zonas de Cali",
x = "",
y = "Precio por Inmueble en millones de COP")El gráfico muestra que la zona oeste tiene precios más altos, mientras que la zona oriente tiene precios más bajos. En la zona oeste, los precios varían más ampliamente, indicando una mayor diversidad de valores de propiedad. Por otro lado, en la zona oriente, los precios están más concentrados en un rango específico. Estas diferencias pueden deberse a factores como la demanda de vivienda, la ubicación y las características del vecindario.
ggplot(df2, aes(x = zona, y = preciom, fill = tipo)) +
geom_boxplot(position = position_dodge(0.8), width = 0.7) +
labs(title = "Distribución del Precio de las Viviendas Segun el Tipo de Vivienda",
x = "",
y = "Precio por Inmueble en millones de COP",
fill = "Tipo de Vivienda") Al analizar el gráfico, se destaca que los precios de las casas tienden a ser mayores que los de los apartamentos en todas las zonas. Además, en las zonas centro, oriente y sur, se observa una mayor variabilidad en los precios de las casas en comparación con los apartamentos. Estas diferencias en la distribución de precios según el tipo de vivienda y la ubicación geográfica pueden proporcionar insights importantes sobre las preferencias del mercado y las dinámicas locales del sector.
# Combina las coordenadas en un objeto sf
dvf_sf <- st_as_sf(df2, coords = c("longitud", "latitud"), crs = 4326)
# Crea un mapa con ggplot2
ggplot() +
geom_sf(data = cali, fill = "white", color = "black") + geom_sf(data = dvf_sf, aes(color = preciom)) +
scale_color_gradient(low = "#41B7C4", high = "black") +
ggtitle("Mapa de Puntos: Precio por Inmueble")+
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))En el mapa, se destacan áreas más oscuras que indican precios más altos de viviendas, principalmente concentrados en el sur y oeste de Cali.
Con el objetivo de profundizar en el análisis espacial de los precios en Cali, se decidió incorporar la variable de precio por metro cuadrado, una medida relevante para los compradores. Para ello, se calculó el precio por metro cuadrado y se agregó esta nueva columna al conjunto de datos.
# Calcula el precio por metro cuadrado y agrega una nueva columna
df2$precio_m2 <- df2$preciom / df2$areaconstSe utilizaron estos datos para crear diagramas de cajas y bigotes, así como un mapa de distribución de precios, teniendo en cuenta esta vez el precio por metro cuadrado.
# Gráfico de cajas (Boxplot)
ggplot(df2, aes(x = zona, y = precio_m2, fill = zona)) +
geom_boxplot() +
labs(title = "Distribución del Precio por Metro Cuadrado en Diferentes Zonas de Cali",
x = "",
y = "Precio por m2 en Millones de COP")La zona oeste continúa mostrando los precios más altos, mientras que la zona oriente exhibe los precios más bajos. Sin embargo, al analizar la variable del precio por metro cuadrado, se observa que el tamaño de las cajas no varía tanto en comparación con el análisis del precio total del inmueble. Esto sugiere que la variabilidad disminuye al considerar el área de los inmuebles.
ggplot(df2, aes(x = zona, y = precio_m2, fill = tipo)) +
geom_boxplot(position = position_dodge(0.8), width = 0.7) +
labs(title = "Distribución del Precio por Metro Cuadrado en Diferentes Zonas de Cali",
x = "",
y = "Precio por m2 en millones de COP",
fill = "Tipo de Vivienda") En este gráfico se observa un cambio notable al considerar el precio por metro cuadrado. Al hacer esta comparación, se destaca que los apartamentos son más costosos que las casas, lo cual contrasta con lo observado al analizar el precio sin tener en cuenta el área del inmueble.
# Combina las coordenadas en un objeto sf
dvf_sf <- st_as_sf(df2, coords = c("longitud", "latitud"), crs = 4326)
# Crea un mapa con ggplot2
ggplot() +
geom_sf(data = cali, fill = "white", color = "black") + geom_sf(data = dvf_sf, aes(color = precio_m2)) +
scale_color_gradient(low = "#41B7C4", high = "black") +
ggtitle("Mapa de Puntos: Precio m2 por inmueble")+
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))Al igual que en el mapa que únicamente considera el precio del inmueble sin tener en cuenta las áreas, se observa una concentración de precios más elevados en el sur y oeste de Cali. Sin embargo, esta disparidad de precios parece ser menos pronunciada considerando el precio por metro cuadrado.
En esta sección se analizan los tipos de vivienda más comunes en la ciudad de Cali y en sus distintas zonas. Para iniciar, se llevó a cabo un recuento de los diferentes tipos de vivienda presentes en la base de datos.
conteo_tipos <- table(df2$tipo)
cantidad_casas <- conteo_tipos["casa"]
cantidad_apartamento <- conteo_tipos["apartamento"]
cat( cantidad_casas, cantidad_apartamento)NA NA
Este recuento revela que en la base de datos hay 3214 registros correspondientes al tipo “casa” y 5105 registros correspondientes al tipo “apartamento”. Estos datos se presentan visualmente en el siguiente gráfico circular, donde se muestran los porcentajes correspondientes a cada tipo de vivienda.
ggplot(df2, aes(x = factor(1), fill = tipo)) +
geom_bar(width = 1) +
coord_polar(theta = "y") +
theme_void() +
labs(title = "Distribución de tipos de vivienda") +
geom_text(aes(label = sprintf("%.1f%%", after_stat(count)/sum(after_stat(count)) * 100)),
stat = "count", position = position_stack(vjust = 0.5))Aquí queda claro que en toda Cali la oferta de apartamentos es mayor que la de casas.
Ahora, exploraremos la distribución de los tipos de vivienda por zona, estrato y número de pisos, mediante dos gráficos de barras. Además, examinaremos la distribución espacial de estos tipos de vivienda a través de un mapa.
ggplot(df2, aes(x = zona, fill = tipo)) +
geom_bar(position = "dodge", stat = "count") +
labs(title = "Cantidad de tipos de vivienda por zona",
x = "", y = "Cantidad") En este gráfico, se observa que la oferta de casas es mayor en la zona centro y la zona oriente, mientras que en las otras zonas predomina la oferta de apartamentos. Además, se destaca que la mayoría de los inmuebles ofertados se concentran principalmente en la zona sur de la ciudad, y por el contrario, la zona centro es la que presenta la menor cantidad de inmuebles.
ggplot(df2, aes(x = estrato, fill = tipo)) +
geom_bar(position = "dodge", stat = "count") +
labs(title = "Cantidad de tipos de vivienda por estrato",
x = "Estrato", y = "Cantidad")En cuanto al estrato, se destaca que el estrato 3 muestra una oferta mayoritaria de casas, mientras que en los demás estratos predominan los apartamentos. Es notable que la mayoría de la oferta de inmuebles se encuentra en el estrato 5, seguido por el estrato 4. Sin embargo, llama la atención que el estrato 3 tenga la menor oferta de inmuebles. Además, se evidencia que no hay registros de estratos inferiores al 3 en esta base de datos, lo que sugiere un enfoque definido hacia un segmento específico al momento de la recolección de datos.
ggplot(df2, aes(x = factor(piso), fill = tipo)) +
geom_bar(position = "dodge", stat = "count") +
labs(title = "Cantidad de tipos de vivienda por número de pisos",
x = "Pisos", y = "Cantidad")Este gráfico es valioso ya que ofrece una visión clara de la distribución de las propiedades en Cali. Destaca que la mayoría de las casas disponibles tienen dos pisos, mientras que la mayor oferta de apartamentos se concentra en los niveles superiores, particularmente en el tercer piso.
dvf_sf <- st_as_sf(df2, coords = c("longitud", "latitud"), crs = 4326)
# Crea un mapa con ggplot2 usando "tipo de vivienda"
ggplot() +
geom_sf(data = cali, fill = "white", color = "black") +
geom_sf(data = dvf_sf, aes(color = tipo)) +
ggtitle("Distribución Espacial por Tipo de Vivienda") +
theme_minimal()+
theme(axis.text.x = element_text(angle = 45, hjust = 1))Finalmente, en el mapa se observa una concentración significativa de la oferta de apartamentos en la parte oeste de la ciudad, seguida por la zona norte. Por otro lado, las casas muestran una concentración mayor en el centro y la zona sur de la ciudad.
En esta sección se dará visibilidad a las caracteristicas relevantes de los inmuebles en Cali, como tamaño, número de habitaciones, número de parqueaderos, número de baños, para comprender mejor las preferencias del mercado.
summary(df2$areaconst) Min. 1st Qu. Median Mean 3rd Qu. Max.
30.0 80.0 123.0 174.9 229.0 1745.0
Se observa que el tamaño de los inmuebles varía entre 30 y 1745 metros cuadrados, con una mediana de 123 metros cuadrados y una media de 174.9 metros cuadrados. El siguiente histograma ilustra la distribución del tamaño de los inmuebles.
# Histograma de las áreas en metros cuadrados
ggplot(data = df2, aes(x = areaconst)) +
geom_histogram(binwidth = 80, fill = "#41B7C4", color = "black") +
labs(title = "Distribución de áreas en metros cuadrados",
x = "Área en metros cuadrados",
y = "Frecuencia") +
theme_minimal()El gráfico revela una concentración notable de áreas entre los valores de 80 y 240 metros cuadrados, lo cual coincide con el primer cuartil de 80 y el tercer cuartil de 229.
# Gráfico de Barras para Habitaciones
ggplot(df2, aes(x = factor(habitaciones))) +
geom_bar(fill = "#41B7C4", color = "black") +
labs(title = "Distribución de Viviendas por número de habitaciones",
x = "Habitaciones",
y = "Cantidad") +
theme_minimal()Aquí, observamos que más de 4000 registros corresponden a viviendas con 3 habitaciones, lo que sugiere que esta es una de las características más frecuentes entre los inmuebles analizados.
# Gráfico de Barras para Baños
ggplot(df2, aes(x = factor(banios))) +
geom_bar(fill = "#41B7C4", color = "black") +
labs(title = "Distribución de Viviendas por número de Baños",
x = "Baños",
y = "Cantidad") +
theme_minimal()En cuanto a los baños, es notable que la mayoría de las viviendas ofertadas cuentan con dos de ellos.
# Gráfico de Barras para Parqueaderos Disponibles
ggplot(df2, aes(x = factor(parqueaderos))) +
geom_bar(fill = "#41B7C4", color = "black") +
labs(title = "Distribución de Viviendas por Número de Parqueaderos",
x = "Número de Parqueaderos",
y = "Cantidad") +
theme_minimal()Finalmente, este gráfico de barras indica que la gran mayoría de las viviendas cuentan con al menos un parqueadero.
El Análisis de Componentes Principales (PCA) es una técnica utilizada para reducir la dimensionalidad del conjunto de datos mientras se conserva la mayor parte de la variabilidad presente en las variables originales. En este análisis, se escalaron las variables numéricas: piso, preciom, areaconst, parqueaderos, banios, habitaciones, longitud, y latitud.
Para comenzar, se realizó la normalización de las variables debido a que estas presentan escalas muy diferentes entre sí.
# Escalar las columnas seleccionadas y realizar PCA
vars_for_pca <- c('piso', 'preciom', 'areaconst', 'parqueaderos', 'banios', 'habitaciones', 'longitud', 'latitud')
# Escalar y seleccionar las columnas para PCA
dfscaled <- df2
dfscaled[, vars_for_pca] <- scale(df2[, vars_for_pca])Con las variables de interés normalizadas, se procedió a realizar el análisis de componentes principales. A continuación, se presentan las desviaciones estándar de los componentes principales y los valores propios correspondientes.
# Realizar PCA
res.pca <- prcomp(dfscaled[, vars_for_pca], center = FALSE, scale. = FALSE)
# Desviaciones estándar de los componentes principales y valores propios
cat("Desviaciones estándar de los componentes principales:\n",res.pca$sdev)Desviaciones estándar de los componentes principales:
1.832752 1.144772 1.006641 0.8590016 0.8364001 0.6213724 0.5528226 0.4336181
cat("\nValores propios:\n",res.pca$sdev^2)
Valores propios:
3.35898 1.310503 1.013327 0.7378837 0.6995651 0.3861036 0.3056128 0.1880247
La primera línea de números representa las desviaciones estándar de cada componente principal. El cuadrado de estos valores indica la varianza explicada por cada componente. A continuación, calcularemos el porcentaje de la variabilidad total explicada por cada componente.
# Porcentaje de variabilidad explicada por componente
variabilidad_explicada <- (res.pca$sdev^2 / sum(res.pca$sdev^2)) * 100
cat("Porcentaje de variabilidad explicada por componente:\n", variabilidad_explicada)Porcentaje de variabilidad explicada por componente:
41.98725 16.38129 12.66658 9.223547 8.744563 4.826295 3.82016 2.350309
La línea de porcentajes muestra la proporción de varianza explicada por cada componente principal: PC1 explica el 41.99% de la varianza, PC2 el 16.38% y PC3 el 12.67%. En conjunto, los primeros tres componentes explican aproximadamente el 71% de la varianza total, lo que constituye una proporción significativa para resumir la información del conjunto de datos. A conticuación se presenta el gráfico de Porcentaje de variabilidad explicada por componente.
# Gráfico de Porcentaje de variabilidad explicada por componente
fviz_eig(res.pca, addlabels = TRUE) +
xlab("Componentes Principales") +
ylab("Porcentaje de Variabilidad Explicada") +
ggtitle("Porcentaje de Variabilidad Explicada por Componente")El gráfico muestra el porcentaje de varianza explicada por cada componente. El PC1 es el más significativo, seguido por PC2 y PC3, corroborando los análisis anteriores. A continuación, procederemos con la elaboración de la matriz de cargas variables, la cual proporcionará una visión clara de cómo cada variable impacta en los componentes del análisis.
# Matriz de cargas variables
print(res.pca$rotation) PC1 PC2 PC3 PC4 PC5
piso 0.1222323 -0.41925160 0.69473313 0.54763349 0.05078074
preciom -0.4623475 -0.18030439 0.20367384 -0.17613813 -0.18156061
areaconst -0.4647639 0.15533381 0.05313901 -0.02200554 -0.06114243
parqueaderos -0.4134836 -0.13960264 0.15062846 -0.22197181 -0.44686223
banios -0.4730376 0.05940397 0.05535415 0.23802366 0.12371430
habitaciones -0.3310666 0.45466537 -0.09241215 0.46113673 0.40135455
longitud 0.2020626 0.56220552 0.13115131 0.32103919 -0.70333131
latitud 0.1006029 0.47093148 0.64926528 -0.49693932 0.29994529
PC6 PC7 PC8
piso -0.007124176 -0.15236955 0.02974695
preciom -0.338010507 0.24145486 -0.68971126
areaconst -0.545146351 -0.55769462 0.38027841
parqueaderos 0.690628260 -0.21672865 0.11814167
banios 0.012591832 0.69577705 0.46197163
habitaciones 0.313231086 -0.23643009 -0.38391258
longitud -0.097571071 0.12779568 -0.04797980
latitud 0.061268469 0.06443476 0.04166126
PC1, que explica el 41.99% de la varianza, presenta correlaciones negativas fuertes con preciom, areaconst,parqueaderos y banios, sugiriendo que puede interpretarse como un ‘índice de tamaño y lujo’ de las propiedades, donde valores más negativos indican propiedades más grandes y lujosas. Por otro lado, PC2, que explica el 16.38% de la varianza, muestra correlaciones positivas con longitud, latitud y habitaciones, y una correlación negativa con piso. Esto sugiere que PC2 podría interpretarse como un ‘índice de ubicación y tipo de vivienda’, donde valores positivos indican casas situadas en ciertas áreas geográficas y valores negativos sugieren apartamentos en pisos altos. Para corroborar lo anterior miraremos la contribución de las variables a los componentes de forma gráfica.
# Coordenadas en el espacio de componentes principales
scores <- res.pca$x
# Contribución de las variables a los componentes
fviz_contrib(res.pca, choice = "var", axes = 1) +
xlab("Variables") +
ylab("Contribución (%)") +
ggtitle("Contribución de las Variables al Componente 1")Este gráfico ilustra cómo las variables originales contribuyen a la componente PC1. Se evidencia que las variables preciom, areaconst, banios y parqueaderos están fuertemente relacionados y tienen una contribución predominante en este componente. La línea roja punteada representa el umbral de contribución promedio, indicando la contribución esperada si todas las variables tuvieran una influencia igual en la componente. Las variables que superan esta línea son las que tienen una influencia significativa y están por encima del promedio en la construcción de PC1.
fviz_contrib(res.pca, choice = "var", axes = 2)+
xlab("Variables") +
ylab("Contribución (%)") +
ggtitle("Contribución de las Variables al Componente 2")En contraste, el gráfico de la dimensión 2 muestra que longitud y latitud están más relacionadas con PC2, al igual que habitaciones y piso. Ahora examinaremos el círculo de correlación, también conocido como nube de variables, el cual permite visualizar cómo se relacionan entre sí las variables y cómo cada una contribuye a los componentes del análisis.
# Círculo de correlación (nube de variables)
fviz_pca_var(res.pca,
col.var = "contrib",
gradient.cols = c("#FF7F00", "#034D94"),
repel = TRUE
)El Círculo de Correlación confirma las interpretaciones anteriores al mostrar que preciom, areaconst, banios y parqueaderos están correlacionados entre sí y constituyen las principales contribuciones a PC1. Por otro lado, longitud y latitud tienen una mayor contribución a PC2.
Ahora procederemos con el análisis de las proyecciones individuales, para lo cual generaremos tres gráficos distintos. Primero, presentaremos un gráfico con únicamente los individuos. En el segundo gráfico, incluiremos tanto las observaciones individuales como los vectores de las variables originales. Finalmente, el tercer gráfico mostrará la información del segundo gráfico, diferenciando entre tipos de inmueble, es decir, casas y apartamentos.
# Nube de individuos
fviz_pca_ind(res.pca, col.ind = "blue")+
ggtitle("Nube de Individuos")Esta gráfica muestra la proyección de las observaciones individuales sobre los dos primeros componentes principales: Dim1 (42%) y Dim2 (16.4%). Cada punto representa una observación según sus puntuaciones en estos componentes. La mayoría de los puntos están concentrados en el centro, lo que indica similitudes en Dim1 y Dim2, mientras que algunos puntos, como los etiquetados 1762, 5179 y 8073, se alejan del centro, sugiriendo que podrían ser outliers con características distintas a las del resto.
# Biplot
fviz_pca_biplot(res.pca)Esta gráfica es un biplot que muestra tanto las observaciones individuales como los vectores de las variables originales. Los vectores indican la contribución de cada variable a los componentes principales: la dirección y longitud de los vectores reflejan su influencia. Por ejemplo, los vectores de parqueaderos, preciom y areaconst apuntan en direcciones similares, sugiriendo que están correlacionadas y contribuyen significativamente a Dim1 (42%), reforzando la interpretación de Dim1 como un índice de tamaño y lujo. En contraste, los vectores de longitud y latitud son más cortos y apuntan hacia la derecha, indicando su mayor contribución a Dim2 (16.4%), lo que sugiere que Dim2 captura variaciones relacionadas con la ubicación geográfica. La proximidad de los puntos a los vectores indica la dominancia de ciertas características; por ejemplo, los puntos cercanos al vector de preciom representan propiedades con precios más altos.
# Biplot con colores según el tipo de vivienda
fviz_pca_biplot(res.pca,
repel = TRUE,
habillage = df2$tipo,
col.var = "#034A94",
col.ind = c("#DEDEDE", "#034A94")
)La gráfica muestra cómo se distribuyen las propiedades (casas y apartamentos) en el espacio de los dos primeros componentes principales. Las casas (en azul) tienden a ubicarse más hacia la izquierda, indicando que son generalmente más grandes y lujosas, mientras que los apartamentos (en rojo) se concentran hacia la derecha y abajo, lo que sugiere que suelen estar en pisos más altos.
En resumen, el análisis de componentes principales ha revelado que las principales fuentes de variación en los datos de propiedades en Cali están relacionadas con el tamaño y lujo de la propiedad (PC1) y la ubicación geográfica y tipo de vivienda (casa vs. apartamento) (PC2). Estas dimensiones capturan las características más relevantes que diferencian las propiedades en el mercado inmobiliario de Cali.
El Análisis de Conglomerados es una técnica que agrupa observaciones o variables en clústeres que son similares entre sí pero diferentes de los elementos en otros clústeres.
Se realiza un Análisis de Conglomerados Jerárquico (HCPC) basado en el Análisis de Componentes Principales (PCA), seguido de la caracterización de los clusters identificados. El argumento nb.clust = -1 indica que el número de clusters a identificar se determinará automáticamente. Cuando se establece en -1, la función emplea criterios estadísticos internos, como el criterio de la silueta o el corte en el dendrograma, para identificar el número óptimo de clusters.
# Realizar PCA
res.pca <- PCA(dfscaled[, vars_for_pca], scale.unit = FALSE, ncp = Inf, graph = FALSE)
# Realizar HCPC
res.HCPC <- HCPC(res.pca, nb.clust = -1, graph = FALSE)
# Añadir la información del cluster al dataframe original
df2$cluster <- res.HCPC$data.clust$clust
# Caracterización de los clusters con coordenadas
cluster_summary <- df2 %>%
group_by(cluster) %>%
summarise(
count = n(),
avg_price = mean(preciom, na.rm = TRUE),
avg_area = mean(areaconst, na.rm = TRUE),
avg_rooms = mean(habitaciones, na.rm = TRUE),
avg_bathrooms = mean(banios, na.rm = TRUE),
avg_parking = mean(parqueaderos, na.rm = TRUE),
avg_latitude = mean(latitud, na.rm = TRUE),
avg_longitude = mean(longitud, na.rm = TRUE),
most_common_type = names(which.max(table(tipo))),
most_common_estrato = names(which.max(table(estrato)))
)
print(cluster_summary)# A tibble: 3 × 11
cluster count avg_price avg_area avg_rooms avg_bathrooms avg_parking
<fct> <int> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1 4594 248. 92.8 2.87 2.17 1.22
2 2 2762 508. 227. 4.52 3.96 1.83
3 3 963 1110. 418. 4.57 5.19 3.72
# ℹ 4 more variables: avg_latitude <dbl>, avg_longitude <dbl>,
# most_common_type <chr>, most_common_estrato <chr>
El análisis de los clusters revela tres segmentos distintos en el mercado inmobiliario. El Cluster 1, con 4594 registros, se caracteriza por propiedades de menor tamaño y precio, principalmente apartamentos en zonas densas de clase media-alta, con un precio promedio de 247.82 millones de COP y un área promedio de 92.83 m². El Cluster 2, con 2762 registros, agrupa propiedades más grandes y costosas, principalmente casas en estrato 5, con un precio promedio de 507.65 millones de COP y un área promedio de 226.81 m², indicando zonas residenciales acomodadas. Finalmente, el Cluster 3, que incluye 963 registros, representa propiedades de lujo, con un precio promedio de 1110.10 millones de COP y un área promedio de 417.83 m², ubicadas en zonas exclusivas y en estrato 6, reflejando las áreas más prestigiosas del mercado inmobiliario.
Para obtener una mejor comprensión de la distribución de precios en cada clúster, elaboraremos boxplots para cada uno de ellos.
# Visualización: distribución de precios por cluster
ggplot(df2, aes(x = factor(cluster), y = preciom, fill = factor(cluster))) +
geom_boxplot() +
labs(title = "Distribución de Precios por Cluster",
x = "Cluster",
y = "Precio (en millones de COP)") +
theme_minimal()La gráfica de caja muestra la distribución de los precios en cada clúster, permitiendo evaluar tanto la variabilidad como las diferencias de precios entre ellos. La caja más pequeña corresponde al Clúster 1, indicando una menor variabilidad en los precios y valores promedio más bajos. En contraste, el Clúster 2 presenta una caja de tamaño intermedio, reflejando una mayor variabilidad y precios más altos en comparación con el Clúster 1.
Por otro lado, el Clúster 3 muestra la caja más grande, lo que sugiere una mayor dispersión de precios y valores promedio significativamente más altos. Como se mencionó anteriormente, los precios tienden a aumentar en clústeres con números mayores. Además, el Clúster 1 parece tener una mayor cantidad de datos atípicos en comparación con los otros clústeres. Esta distribución confirma que los clústeres representan distintos segmentos del mercado inmobiliario con rangos de precios claramente diferenciados.
El mapa de calor a continuación muestra las características promedio de cada clúster. Este gráfico destaca cómo las propiedades se agrupan según su tamaño y precio, revelando que el precio y el área son las principales variables diferenciadoras entre los clústeres.
# Mapa de calor de las características promedio por cluster
cluster_heatmap <- cluster_summary %>%
select(-count, -avg_latitude, -avg_longitude, -most_common_type, -most_common_estrato) %>%
pivot_longer(cols = -cluster, names_to = "variable", values_to = "value") %>%
ggplot(aes(x = factor(cluster), y = variable, fill = value)) +
geom_tile() +
scale_fill_viridis_c() +
labs(title = "Características Promedio por Cluster",
x = "Cluster",
y = "Variable") +
theme_minimal()
print(cluster_heatmap)El mapa de calor muestra las características promedio de los clusters usando una escala de colores del morado oscuro al amarillo brillante para representar valores bajos y altos, respectivamente. El Cluster 1, con colores morados oscuros, abarca propiedades más pequeñas y económicas. El Cluster 2, con colores verde-azulados, incluye propiedades de rango medio en términos de precio, tamaño y comodidades. El Cluster 3, con colores amarillos brillantes, representa propiedades grandes, caras y lujosas. Las variables de precio y área son las más diferenciadoras entre los clusters, confirmando que el precio y el tamaño de las propiedades son factores clave en la clasificación de los clusters.
Para profundizar en el análisis, presentaremos el gráfico tridimensional del clustering jerárquico. Este gráfico visualiza la distribución de los clusters en relación con las dos primeras dimensiones principales y una tercera dimensión vertical, proporcionando una perspectiva más completa de cómo se agrupan las propiedades.
# Visualizar los resultados del HCPC
plot(res.HCPC, choice = "3D.map")El gráfico tridimensional del clustering jerárquico muestra cómo se distribuyen los clusters en función de las dos primeras dimensiones principales y una tercera dimensión vertical. El Cluster 1 (Negro), que se concentra en los valores más bajos de Dim 1 y Dim 2, coincide con propiedades más pequeñas y económicas, siendo el más grande y denso. El Cluster 2 (Rojo) ocupa una posición intermedia en Dim 1 y se extiende más que el Cluster 1, representando propiedades de rango medio. El Cluster 3 (Verde) se sitúa en los valores más altos de Dim 1 y tiene una mayor dispersión en Dim 2, indicando propiedades de lujo con mayor variabilidad. La clara separación entre clusters en Dim 1 sugiere que esta dimensión podría estar relacionada con el precio o el tamaño de las propiedades, mientras que la separación menos pronunciada en Dim 2 sugiere características secundarias. Las líneas jerárquicas en el gráfico muestran las relaciones entre clusters, confirmando la existencia de tres segmentos distintos en el mercado inmobiliario, desde propiedades económicas hasta de lujo, con el precio y el tamaño como factores clave en la formación de estos clusters.
Finalmente, se realizó un gráfico espacial de clusters utilizando las coordenadas geográficas de los inmuebles.
cali <- st_transform(cali, crs = 4326)
# Visualizar los clusters sobre el mapa de Cali
ggplot() +
geom_sf(data = cali, fill = "white", color = "black") + # Mapa base de Cali
geom_point(data = df2, aes(x = longitud, y = latitud, color = as.factor(cluster)), size = 1.5) + # Puntos de los clusters
labs(title = "Distribución de Clusters en Cali",
x = "Longitud",
y = "Latitud",
color = "Cluster") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))El mapa muestra la distribución geográfica de los clusters de propiedades en Cali, Colombia. El Cluster 1 (Rojo), que representa propiedades pequeñas y económicas, está ampliamente distribuido por toda la ciudad. El Cluster 2 (Verde), con propiedades de rango medio, se concentra en áreas centrales y algunas del norte. El Cluster 3 (Azul), que abarca propiedades de lujo, se encuentra principalmente en el sur y algunas áreas exclusivas del norte.
Esta distribución geográfica confirma la segmentación socioeconómica, con el Cluster 1 predominando en la mayoría de la ciudad y el Cluster 3 en zonas de alto valor. La visualización proporciona una perspectiva clara de cómo se distribuyen los diferentes segmentos del mercado inmobiliario en Cali, siendo útil para comprender la dinámica del mercado, así como planificar inversiones y desarrollos urbanos.
El Análisis de Correspondencia es una técnica estadística utilizada para analizar tablas de contingencia, permitiendo visualizar las relaciones entre categorías de variables cualitativas. En este estudio, se intentó aplicar el análisis a la variable “barrio”; sin embargo, debido a la gran cantidad de variables asociadas, no fue posible obtener interpretaciones claras ni gráficos adecuados. Además, al aplicar la técnica a los tipos de propiedades, se observó que las varianzas alcanzaban el 100%, resultando en una sola dimensión en el análisis de correspondencia. Por lo tanto, se decidió crear una nueva variable categórica significativa basada en el precio por metro cuadrado (precio_m2), utilizando las categorías “Bajo”, “Medio Bajo”, “Medio Alto” y “Alto”. Estas categorías se establecieron utilizando los cuartiles, como se explicará a continuación.
summary(df2$precio_m2) Min. 1st Qu. Median Mean 3rd Qu. Max.
0.1461 1.9167 2.6400 2.7222 3.3795 9.4681
Para categorizar la variable “precio_m2” en el análisis de correspondencia, se propusieron los siguientes rangos basados en los cuartiles:
# Definir los rangos para la categorización basado en cuartiles
breaks <- c(-Inf, 1.9167, 2.6400, 3.3795, Inf) # Ajusta según cuartiles
labels <- c("Bajo", "Medio Bajo", "Medio Alto", "Alto")
# Crear la nueva variable categórica
df2$categoria_precio <- cut(df2$precio_m2, breaks = breaks, labels = labels)El análisis de correspondencia se realizó utilizando los paquetes FactoMineR y factoextra en R para examinar las relaciones entre las variables cualitativas del conjunto de datos df2. Se convirtieron las variables categóricas (tipo, zona, estrato, y categoria_precio) en factores y se generaron tablas de contingencia para cada par de variables. Posteriormente, se llevó a cabo el análisis de correspondencia y se resumieron los valores propios para mostrar la proporción de varianza explicada por cada dimensión.
El siguiente gráfico del Análisis de Correspondencia (CA) entre zona y estrato en Cali ilustrará cómo las dimensiones principales reflejan la distribución socioeconómica en la ciudad, mostrando las asociaciones entre zonas y estratos y destacando las áreas de alto y bajo nivel socioeconómico.
# Convertir a factores
df2$tipo <- as.factor(df2$tipo)
df2$zona <- as.factor(df2$zona)
df2$estrato <- as.factor(df2$estrato)
df2$categoria_precio <- as.factor(df2$categoria_precio)
# Crear una tabla de contingencia entre zona y estrato
tabla_zona_estrato <- table(df2$zona, df2$estrato)
# Realizar el Análisis de Correspondencia
resultados_ac_zona_estrato <- CA(tabla_zona_estrato)El gráfico del Análisis de Correspondencia (CA) entre las variables de zona y estrato en Cali muestra que las dimensiones 1 (69.97% de varianza) y 2 (27.68% de varianza) capturan el 97.65% de la varianza total, proporcionando una representación efectiva de los datos. La Zona Oeste y la Zona Sur están asociadas con estratos más altos (6 y 5, respectivamente), indicando áreas de alto y medio-alto nivel socioeconómico, mientras que la Zona Oriente y Centro se relacionan con estratos más bajos (3), sugiriendo zonas de nivel socioeconómico medio-bajo. La Zona Norte muestra una mezcla equilibrada de estratos. La Dimensión 1 distingue principalmente por el nivel socioeconómico, y la Dimensión 2 podría capturar otras características urbanas. Este mapa revela patrones claros de segregación socioeconómica en Cali, con zonas exclusivas y áreas de menor estrato bien diferenciadas.
# Resumen de valores propios
valores_prop_zona_estrato <- resultados_ac_zona_estrato$eig
cat("Valores Propios para Zona y Estrato:\n",valores_prop_zona_estrato)Valores Propios para Zona y Estrato:
0.3221521 0.127451 0.01084108 69.96551 27.68 2.354483 69.96551 97.64552 100
# Gráfico de la varianza explicada
fviz_screeplot(resultados_ac_zona_estrato, addlabels = TRUE, ylim = c(0, 80)) +
ggtitle("Porcentaje de Varianza Explicado (Zona vs Estrato)") +
ylab("Porcentaje de varianza explicado (%)") +
xlab("Ejes")Los valores propios del Análisis de Correspondencia indican que la Dimensión 1 explica el 69.97% de la varianza, lo que la convierte en la dimensión más significativa en el análisis de las relaciones entre zona y estrato. La Dimensión 2 contribuye con el 27.68% de la varianza, añadiendo una cantidad significativa de información adicional. Juntas, estas dos dimensiones explican el 97.65% de la varianza total, destacando su capacidad para capturar la mayoría de la información sobre las variables analizadas. La Dimensión 3, que solo explica el 2.35% de la varianza, tiene una contribución mínima y puede considerarse marginal en el contexto del análisis.
El siguiente biplot del Análisis de Correspondencia entre zona y estrato en Cali proporcionará una visualización de cómo se distribuyen las zonas y estratos en función de las dos dimensiones principales. Este gráfico ilustra las asociaciones entre zonas y estratos, destacando las áreas con diferentes niveles socioeconómicos y sus ubicaciones en el espacio del análisis.
# Biplot del análisis de correspondencia
fviz_ca_biplot(resultados_ac_zona_estrato, repel = TRUE, ggtheme = theme_minimal()) +
ggtitle("Biplot del Análisis de Correspondencia (Zona vs Estrato)")El biplot del Análisis de Correspondencia entre Zona y Estrato en Cali muestra que Dimensión 1 (eje x) explica el 70% de la varianza y Dimensión 2 (eje y) el 27.7%, capturando el 97.7% en total. Las zonas se distribuyen así: Zona Oeste está en el extremo superior izquierdo, Zona Sur en el inferior izquierdo, Zona Oriente en el derecho, Zona Centro en el superior derecho y Zona Norte cerca del origen. Los estratos están asociados de la siguiente manera: Estrato 6 con Zona Oeste, Estrato 5 con Zona Sur, Estrato 3 con Zonas Oriente y Centro, y Estrato 4 entre estos dos. Dimensión 1 refleja un gradiente socioeconómico, mientras que Dimensión 2 puede capturar otras características urbanas. Esto revela una segmentación socioeconómica clara en Cali, con la Zona Oeste y Sur siendo más exclusivas, y Oriente y Centro con niveles más bajos.
En los análisis realizados, la variable “tipo” ha mostrado una capacidad limitada para diferenciar entre las categorías estudiadas. A continuación, se examinará un caso específico para ilustrar esta limitación.
# Crear una tabla de contingencia entre tipo y zona
tabla_tipo_zona <- table(df2$tipo, df2$zona)
# Realizar el Análisis de Correspondencia
resultados_ac_tipo_zona <- CA(tabla_tipo_zona)
# Resumen de valores propios
valores_prop_tipo_zona <- resultados_ac_tipo_zona$eig
cat("Valores Propios para Tipo y Zona:\n",valores_prop_tipo_zona)Valores Propios para Tipo y Zona:
0.08311298 100 100
# Gráfico de la varianza explicada
fviz_screeplot(resultados_ac_tipo_zona, addlabels = TRUE, ylim = c(0, 80)) +
ggtitle("Porcentaje de Varianza Explicado (Tipo vs Zona)") +
ylab("Porcentaje de varianza explicado (%)") +
xlab("Ejes")`geom_line()`: Each group consists of only one observation.
ℹ Do you need to adjust the group aesthetic?
La variable “tipo” no se considerará en futuros análisis debido a los resultados obtenidos en el Análisis de Correspondencia. El análisis reveló que el 100% de la varianza se explica mediante una sola dimensión, lo cual sugiere que toda la información sobre la relación entre “tipo” y “zona” se puede representar en una única dimensión. Este resultado limita la capacidad para crear un biplot significativo y refleja que la variable “tipo”, que solo tiene dos categorías, no está proporcionando una diferenciación adecuada en el análisis. El mismo problema ocurrió con el análisis entre “tipo” y “estrato”, donde también se obtuvo que una sola dimensión explicaba el 100% de la varianza. Por lo tanto, se optará por excluir esta variable en adelante para mejorar la precisión y utilidad de los análisis posteriores.
El siguiente gráfico del Análisis de Correspondencia (CA) entre categoría de precio y zona en Cali mostrará cómo se distribuyen las categorías de precio a lo largo de las diferentes zonas de la ciudad. Este gráfico destacará las asociaciones entre las zonas y los precios de las propiedades, revelando patrones clave en la segmentación del mercado inmobiliario.
# Crear una tabla de contingencia entre zona y categoria_precio
tabla_zona_precio <- table(df2$categoria_precio, df2$zona)
# Realizar el Análisis de Correspondencia
resultados_ac_zona_precio <- CA(tabla_zona_precio)El mapa factorial del Análisis de Correspondencia entre categorías de precio y zonas en Cali muestra que Dim 1 explica el 69.13% de la varianza y Dim 2 el 28.73%, juntas capturando el 97.86% de la varianza total. Las zonas y categorías de precio se distribuyen en el gráfico revelando que la “Zona Oeste” se asocia con precios altos, la “Zona Sur” con precios medios-altos, la “Zona Norte” con una mezcla equilibrada de precios, y las “Zonas Centro” y “Oriente” con precios bajos. Dim 1 refleja un gradiente de precios, mientras que Dim 2 puede capturar características adicionales que influyen en los precios. Esta visualización proporciona una clara imagen de la segmentación del mercado inmobiliario en Cali.
# Resumen de valores propios
valores_prop_zona_precio <- resultados_ac_zona_precio$eig
cat("Valores Propios para Zona y Categoria de Precio:\n",valores_prop_zona_precio)Valores Propios para Zona y Categoria de Precio:
0.1620484 0.0673518 0.005014237 69.12902 28.73194 2.139048 69.12902 97.86095 100
# Gráfico de la varianza explicada
fviz_screeplot(resultados_ac_zona_precio, addlabels = TRUE, ylim = c(0, 80)) +
ggtitle("Porcentaje de Varianza Explicado (Zona vs Categoria de Precio)") +
ylab("Porcentaje de varianza explicado (%)") +
xlab("Ejes")Los valores propios para el Análisis de Correspondencia entre zona y categoría de precio indican que Dim 1 explica el 69.13% de la varianza y Dim 2 explica el 28.73%, lo que en conjunto representa el 97.86% de la varianza total. Esto sugiere que el análisis captura la mayor parte de la información en las dos primeras dimensiones, con Dim 1 y Dim 2 describiendo la relación principal entre las zonas y las categorías de precio. La tercera dimensión, con solo un 2.14% de varianza explicada, no añade información significativa adicional, confirmando que el análisis es bien representado por las dos primeras dimensiones.
El siguiente biplot del Análisis de Correspondencia entre categoría de precio y zona en Cali proporcionará una visualización de cómo se distribuyen las categorías de precio y las zonas en función de las dos dimensiones principales. Este gráfico ilustra las asociaciones entre precios y zonas, destacando las áreas con diferentes rangos de precios y sus ubicaciones en el espacio del análisis.
# Biplot del análisis de correspondencia
fviz_ca_biplot(resultados_ac_zona_precio, repel = TRUE, ggtheme = theme_minimal()) +
ggtitle("Biplot del Análisis de Correspondencia (Zona vs Categoria de Precio)")Este biplot del Análisis de Correspondencia entre Zona y Categoría de Precio en Cali muestra cómo las zonas de la ciudad se asocian con distintas categorías de precios inmobiliarios. La Zona Oeste se asocia con precios altos, mientras que la Zona Sur está vinculada a precios medios y medio-altos. La Zona Norte presenta una distribución más equilibrada de precios, y las Zonas Centro y Oriente se relacionan con precios bajos. En conjunto, el biplot revela una segmentación geográfica del mercado inmobiliario en Cali, con claras distinciones en el valor de las propiedades según la ubicación.
El siguiente gráfico del Análisis de Correspondencia (CA) entre estrato y categoría de precio en Cali ilustrará cómo se distribuyen las categorías de precios en función del estrato socioeconómico. Este gráfico resaltará las asociaciones entre los niveles socioeconómicos y los precios de las propiedades, proporcionando una visión clara de cómo se relacionan estos dos factores en el mercado inmobiliario.
# Crear una tabla de contingencia entre estrato y categoria_precio
tabla_estrato_precio <- table(df2$estrato, df2$categoria_precio)
# Realizar el Análisis de Correspondencia
resultados_ac_estrato_precio <- CA(tabla_estrato_precio)Este mapa factorial del Análisis de Correspondencia entre Estrato y Categoría de Precio en Cali revela una fuerte correlación entre el nivel socioeconómico y los precios de las propiedades. Las dos dimensiones principales explican el 99.7% de la varianza, lo que indica una excelente representación de los datos. El Estrato 6 se asocia con precios altos, mientras que el Estrato 3 se vincula con precios bajos. Los estratos intermedios (4 y 5) muestran asociaciones con precios medio-bajo y medio-alto, respectivamente. La disposición lineal de los puntos sugiere una correspondencia directa entre estrato socioeconómico y categoría de precio, destacando una segmentación clara del mercado inmobiliario en la ciudad.
# Resumen de valores propios
valores_prop_estrato_precio <- resultados_ac_estrato_precio$eig
cat("Valores Propios para Estrato y Categoria de Precio:\n",valores_prop_estrato_precio)Valores Propios para Estrato y Categoria de Precio:
0.3040141 0.08367898 0.001154532 78.18335 21.51974 0.2969111 78.18335 99.70309 100
# Gráfico de la varianza explicada
fviz_screeplot(resultados_ac_estrato_precio, addlabels = TRUE, ylim = c(0, 80)) +
ggtitle("Porcentaje de Varianza Explicado (Estrato vs Categoria de Precio)") +
ylab("Porcentaje de varianza explicado (%)") +
xlab("Ejes")El análisis de los valores propios para Estrato y Categoría de Precio muestra que la primera dimensión (Dim 1) explica el 78.18% de la varianza, mientras que la segunda dimensión (Dim 2) captura un 21.52% adicional, lo que lleva a un total acumulado de 99.70% de la varianza explicada. Esto indica que prácticamente toda la variabilidad en la relación entre estrato y precio está representada en estas dos dimensiones principales. La tercera dimensión, con un aporte insignificante del 0.30%, no añade información relevante. Por lo tanto, el análisis se concentra eficazmente en las dos primeras dimensiones, lo que permite una interpretación sólida y confiable de la relación entre estrato socioeconómico y precios de las propiedades en Cali.
El siguiente biplot del Análisis de Correspondencia entre estrato y categoría de precio en Cali ofrecerá una visualización de cómo se distribuyen los estratos y las categorías de precio en función de las dos dimensiones principales. Este gráfico mostrará las asociaciones entre los niveles socioeconómicos y los precios de las propiedades, destacando cómo se agrupan estos factores en el espacio del análisis.
# Biplot del análisis de correspondencia
fviz_ca_biplot(resultados_ac_estrato_precio, repel = TRUE, ggtheme = theme_minimal()) +
ggtitle("Biplot del Análisis de Correspondencia (Estrato vs Categoria de Precio)")Este biplot del Análisis de Correspondencia entre Estrato y Categoría de Precio en Cali revela una asociación clara entre el nivel socioeconómico y los precios de las propiedades. La primera dimensión explica el 78.2% de la varianza y representa un gradiente de precios de bajo a alto. La segunda dimensión, que captura el 21.5% de la varianza, podría reflejar variaciones secundarias. Estratos más bajos, como el 3 y el 4, se asocian con categorías de precios bajos y medio bajos, mientras que el estrato 6 se relaciona con precios altos. El estrato 5, cercano al origen, indica una posición intermedia en el mercado. En conjunto, el biplot proporciona una representación robusta del mercado inmobiliario en Cali, destacando una segmentación socioeconómica bien definida.
El análisis integral del mercado inmobiliario de Cali ha revelado una compleja interacción de factores que influyen en la estructura y dinámica del sector. A través de la aplicación de técnicas avanzadas de análisis multivariado, hemos descubierto patrones significativos que ofrecen una nueva perspectiva sobre este mercado.
Uno de los hallazgos más significativos es la marcada segmentación del mercado inmobiliario de Cali. El análisis de componentes principales y de conglomerados reveló tres segmentos distintos, cada uno con características únicas. Esta segmentación no es solo una cuestión de precio o tamaño, sino que refleja una estratificación socioeconómica más profunda de la ciudad
El hecho de que el 55.2% de las propiedades se agrupen en el Cluster 1 (propiedades más pequeñas y económicas) sugiere una demanda significativa de viviendas accesibles, posiblemente impulsada por una creciente clase media o por limitaciones en el poder adquisitivo de gran parte de la población. Por otro lado, la existencia de un segmento de lujo (Cluster 3, 11.6% de las propiedades) indica una concentración de riqueza en ciertos sectores de la ciudad.
Esta estratificación plantea preguntas importantes sobre la equidad en el acceso a la vivienda y el desarrollo urbano sostenible. ¿Está el mercado atendiendo adecuadamente las necesidades de todos los segmentos de la población? ¿Cómo afecta esta segmentación a la movilidad social y la integración urbana?
El análisis de correspondencia entre zonas, estratos y categorías de precio reveló una fuerte asociación entre la ubicación geográfica y el valor de las propiedades. La concentración de propiedades de alto valor en las zonas Oeste y Sur, contrastando con precios más bajos en las zonas Centro y Oriente, sugiere una ciudad espacialmente segregada.
Esta distribución geográfica del valor inmobiliario puede tener implicaciones significativas para el desarrollo urbano y la planificación de infraestructuras. Por ejemplo, ¿cómo afecta esta distribución a la provisión de servicios públicos y oportunidades económicas en diferentes partes de la ciudad? ¿Está contribuyendo esta segregación espacial a perpetuar desigualdades socioeconómicas?
El análisis de componentes principales reveló que el tamaño y las comodidades de las propiedades (representados por el primer componente principal) son los factores más influyentes en la determinación del valor inmobiliario, seguidos por la ubicación y el tipo de vivienda. Este hallazgo sugiere que el mercado valora más las características intrínsecas de las propiedades que su ubicación específica.
Sin embargo, es importante considerar cómo estos factores interactúan. Por ejemplo, ¿cómo se relaciona el tamaño de las propiedades con su ubicación? ¿Existen zonas donde el valor del terreno supera el valor de las estructuras? Estas preguntas podrían ser objeto de futuras investigaciones para comprender mejor la formación de precios en el mercado inmobiliario de Cali.
Los patrones observados en este estudio tienen implicaciones importantes para el desarrollo urbano y la política de vivienda en Cali. La clara segmentación del mercado y la concentración geográfica de valor sugieren la necesidad de políticas que promuevan un desarrollo urbano más equilibrado y accesible.
Por ejemplo, se podrían considerar incentivos para el desarrollo de viviendas de calidad en zonas tradicionalmente asociadas con precios más bajos, o políticas de vivienda mixta que fomenten una mayor diversidad socioeconómica en diferentes áreas de la ciudad. Asimismo, la fuerte demanda de propiedades más pequeñas y económicas sugiere la necesidad de enfocarse en soluciones de vivienda asequible sin comprometer la calidad.
Es importante reconocer las limitaciones de este estudio. Los datos analizados representan una instantánea del mercado en un momento específico y pueden no capturar tendencias a largo plazo o cambios recientes en el mercado. Además, factores externos como cambios en la política económica, eventos globales o tendencias demográficas podrían influir significativamente en el mercado inmobiliario y no han sido considerados en este análisis.
Futuras investigaciones podrían beneficiarse de la inclusión de datos longitudinales para analizar cómo estos patrones evolucionan con el tiempo. También sería valioso incorporar variables adicionales como la proximidad a servicios públicos, áreas verdes o centros de empleo para obtener una comprensión más holística de los factores que influyen en el valor inmobiliario.
Con base en los resultados y el análisis realizados, se han identificado cinco insights clave para optimizar estrategias de inversión y maximizar beneficios en el sector inmobiliario de Cali:
El análisis multivariado del mercado inmobiliario de Cali ha proporcionado una visión profunda y matizada de su estructura y dinámica. A través de la aplicación de técnicas avanzadas como el Análisis de Componentes Principales, Análisis de Conglomerados y Análisis de Correspondencia, hemos desentrañado patrones complejos que subyacen en este mercado.
Uno de los hallazgos más significativos es la marcada segmentación del mercado, que refleja y posiblemente refuerza las divisiones socioeconómicas existentes en la ciudad. La identificación de tres clusters distintos de propiedades, cada uno con sus propias características y distribución geográfica, ofrece una base sólida para la toma de decisiones estratégicas en el sector inmobiliario.
La fuerte asociación entre la ubicación geográfica y el valor de las propiedades, revelada por el análisis de correspondencia, subraya la importancia de considerar el contexto espacial en las estrategias de inversión y desarrollo urbano. Esta segregación espacial plantea desafíos importantes para la planificación urbana y la equidad social, que deben ser abordados por los responsables de las políticas públicas.
El análisis también ha destacado la primacía de las características intrínsecas de las propiedades, como el tamaño y las comodidades, en la determinación de su valor. Esto sugiere que hay espacio para la innovación en el diseño y desarrollo de propiedades que optimicen estos factores valorados por el mercado.
Sin embargo, es crucial reconocer que el mercado inmobiliario no opera en el vacío. Está estrechamente vinculado a factores socioeconómicos más amplios, tendencias demográficas y políticas de desarrollo urbano. Por lo tanto, cualquier estrategia basada en estos hallazgos debe ser flexible y adaptable a los cambios en estos factores externos.
Mirando hacia el futuro, este estudio sienta las bases para una comprensión más profunda del mercado inmobiliario de Cali. Futuros análisis podrían beneficiarse de la incorporación de datos longitudinales para capturar tendencias a lo largo del tiempo, así como de la inclusión de variables adicionales como la proximidad a servicios públicos o centros de empleo.
En última instancia, el valor de este análisis radica no solo en su capacidad para informar estrategias de inversión, sino también en su potencial para contribuir a un desarrollo urbano más equitativo y sostenible. A medida que Cali continúa creciendo y evolucionando, será crucial utilizar este tipo de análisis basado en datos para guiar decisiones que beneficien no solo a los inversores, sino a la ciudad en su conjunto.
El mercado inmobiliario de Cali, como se revela en este estudio, es un ecosistema complejo y dinámico. Navegar con éxito en este mercado requerirá no solo una comprensión profunda de sus dinámicas internas, sino también una consideración cuidadosa de su impacto más amplio en el tejido urbano y social de la ciudad. Con los insights proporcionados por este análisis, los actores del mercado inmobiliario están mejor equipados para tomar decisiones informadas que puedan contribuir tanto al éxito económico como al bienestar de la comunidad en general.
Tomado de https://data.amerigeoss.org/dataset/capa-de-barrios-y-sectores-geograficos-de-santiago-de-cali
sessionInfo()R version 4.3.2 (2023-10-31 ucrt)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 11 x64 (build 22631)
Matrix products: default
locale:
[1] LC_COLLATE=English_World.utf8 LC_CTYPE=English_World.utf8
[3] LC_MONETARY=English_World.utf8 LC_NUMERIC=C
[5] LC_TIME=English_World.utf8
time zone: America/Bogota
tzcode source: internal
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] mice_3.16.0 purrr_1.0.2 cluster_2.1.4
[4] NbClust_3.0.1 tidyr_1.3.1 FactoMineR_2.11
[7] factoextra_1.0.7 dplyr_1.1.4 sf_1.0-15
[10] paqueteMODELOS_0.1.0 summarytools_1.0.1 knitr_1.48
[13] gridExtra_2.3 GGally_2.2.1 ggplot2_3.5.1
[16] broom_1.0.6 boot_1.3-28.1
loaded via a namespace (and not attached):
[1] DBI_1.2.1 tcltk_4.3.2 rlang_1.1.3
[4] magrittr_2.0.3 matrixStats_1.3.0 e1071_1.7-14
[7] compiler_4.3.2 mgcv_1.9-0 vctrs_0.6.5
[10] reshape2_1.4.4 stringr_1.5.1 pkgconfig_2.0.3
[13] shape_1.4.6.1 fastmap_1.1.1 backports_1.5.0
[16] magick_2.8.4 labeling_0.4.3 pander_0.6.5
[19] utf8_1.2.4 rmarkdown_2.26 nloptr_2.0.3
[22] xfun_0.46 glmnet_4.1-8 jomo_2.7-6
[25] jsonlite_1.8.8 flashClust_1.01-2 pan_1.9
[28] pryr_0.1.6 R6_2.5.1 vcd_1.4-12
[31] stringi_1.8.3 RColorBrewer_1.1-3 ranger_0.16.0
[34] car_3.1-2 rpart_4.1.21 lmtest_0.9-40
[37] lubridate_1.9.3 estimability_1.5.1 Rcpp_1.0.12
[40] iterators_1.0.14 zoo_1.8-12 base64enc_0.1-3
[43] Matrix_1.6-1.1 splines_4.3.2 nnet_7.3-19
[46] timechange_0.3.0 tidyselect_1.2.1 abind_1.4-5
[49] rstudioapi_0.15.0 yaml_2.3.10 codetools_0.2-19
[52] lattice_0.21-9 tibble_3.2.1 plyr_1.8.9
[55] withr_3.0.1 evaluate_0.24.0 survival_3.5-7
[58] ggstats_0.6.0 units_0.8-5 proxy_0.4-27
[61] ggpubr_0.6.0 pillar_1.9.0 carData_3.0-5
[64] KernSmooth_2.23-22 VIM_6.2.2 checkmate_2.3.2
[67] DT_0.33 foreach_1.5.2 generics_0.1.3
[70] sp_2.1-3 munsell_0.5.1 scales_1.3.0
[73] laeken_0.5.3 minqa_1.2.6 xtable_1.8-4
[76] leaps_3.2 class_7.3-22 glue_1.7.0
[79] emmeans_1.10.3 scatterplot3d_0.3-44 tools_4.3.2
[82] robustbase_0.99-2 data.table_1.15.4 lme4_1.1-35.1
[85] ggsignif_0.6.4 mvtnorm_1.2-5 rapportools_1.1
[88] grid_4.3.2 colorspace_2.1-1 nlme_3.1-163
[91] cli_3.6.2 fansi_1.0.6 viridisLite_0.4.2
[94] DEoptimR_1.1-3 gtable_0.3.5 rstatix_0.7.2
[97] digest_0.6.34 classInt_0.4-10 ggrepel_0.9.5
[100] farver_2.1.2 htmlwidgets_1.6.4 htmltools_0.5.8.1
[103] lifecycle_1.0.4 multcompView_0.1-10 mitml_0.4-5
[106] MASS_7.3-60