1. Introducción

El sector inmobiliario en las grandes ciudades es un mercado dinámico y complejo, donde la toma de decisiones estratégicas requiere de un profundo entendimiento de las tendencias y particularidades del entorno urbano. En este contexto, una empresa inmobiliaria líder se enfrenta al desafío de analizar y comprender la vasta cantidad de información disponible sobre las propiedades residenciales en el mercado de la ciudad de Cali.

La presente propuesta tiene como objetivo abordar esta problemática mediante la evaluación de la oferta inmobiliaria Urbana. A través de un análisis exhaustivo de la base de datos de la empresa, se busca identificar patrones, relaciones y segmentaciones relevantes que permitan optimizar la toma de decisiones en cuanto a la compra, venta y valoración de propiedades.

2. Analisis Exploratorio

El Análisis Exploratorio de Datos es fundamental para comprender y descubrir patrones en la base de datos de la empresa. Este análisis permite identificar las características de las propiedades, tendencias, relaciones, valores atípicos y otros patrones que podrían no ser evidentes a simple vista.

Haga clic sobre las gráficas para agrandar

2.1. Tratamiento de los datos

  • Fuente de datos: datos tomados de OLX mediante procedimiento webscraping y contenidos en paqueteMOD.
  • Unificación de unidades: se verificó que todas las áreas estuvieran en metros cuadrados y los precios en la misma denominación.
  • Valores faltantes: la variable piso tiene 2638 valores faltantes y la variable parqueaderos tiene 1605. Se realiza imputación con una nueva categoría “Sin información” a los valores faltantes en estas columnas. Al crear una nueva categoría, se conserva la información sobre la falta de datos, lo que puede ser útil para el análisis. Además, se eliminaron tres registros del conjunto de datos que estaban completamente vacíos.
  • Datos atípicos: Se graficaron los datos para identificar propiedades con precios o áreas extremadamente altas o bajas. En este caso, se decidió mantener los valores atípicos, ya que podrían representar propiedades con acabados de lujo o con características especiales.

2.2. Tipo de propiedades y ubicación

La ubicación y el tipo de propiedad son factores cruciales que determinan el valor, atractivo y potencial de inversión de un inmueble. La ubicación abarca su entorno, servicios cercanos, accesibilidad y otros elementos que influyen en la calidad de vida de los residentes y la demanda de la propiedad.

Del mismo modo, el tipo de propiedad juega un papel fundamental en el mercado inmobiliario. Es esencial considerar cuidadosamente el tipo de propiedad que mejor se ajuste a las necesidades, presupuesto y objetivos de inversión de los clientes.

Hay 5100 apartamentos y 3219 casas, siendo los apartamentos la gran mayoría de las propiedades en este conjunto de datos.

## Contar frecuencias de cada zona
datos <- as.data.frame(table(vivienda1$zona,vivienda1$tipo))


# Gráfico de barras agrupadas
ggplot(datos, aes(x = Var1, y = Freq, fill = Var2)) +
  geom_bar(position = "dodge", stat = "identity") +
  geom_text(aes(label = Freq), position = position_dodge(width = 0.9), vjust = -0.5) +  # Etiquetas sobre barras
  labs(title = "Inmuebles por zona y tipo de propiedad",
       x = "Zona",
       y = "Número de inmuebles",
       fill = "Tipo de propiedad", caption="Clic en la imagen para agrandar")

El gráfico muestra una clara diferencia en la cantidad de inmuebles entre las zonas, con la Zona Sur destacando por tener la mayor cantidad. En cuanto al tipo de propiedad, en la mayoría de las zonas predominan los apartamentos sobre las casas, aunque en la Zona Oriente y Centro la proporción es más pareja, e incluso hay una ligera predominancia de casas.

Hay una predominancia de apartamentos sobre las casas en este conjunto de datos. La diferencia es bastante grande, con casi 2000 apartamentos más que casas.

# Definimos una paleta de colores personalizada
pal <- colorNumeric(
  palette = brewer.pal(9, "YlOrRd"), # Usamos una paleta de colores cálidos
  domain = vivienda1$areaconst # El dominio de la paleta es el área construida
)

# Creamos el mapa interactivo
m <- leaflet(vivienda1) %>%
  addTiles() %>% # Añadimos un mapa base de OpenStreetMap
  addCircleMarkers( # Añadimos marcadores circulares para las propiedades
    lng = ~longitud,
    lat = ~latitud,
    radius = ~sqrt(areaconst)/5, # El radio del marcador es proporcional al área construida
    color = ~pal(preciom), # El color del marcador depende del área construida
    fillOpacity = 0.7,
    popup = ~paste( # Añadimos un popup con información de la propiedad
      "<b>Zona:</b>", zona, "<br>",
      "<b>Tipo:</b>", tipo, "<br>",
      "<b>Área construida:</b>", areaconst, "m2",
      "<b>Tipo:</b>", tipo, "<br>",
      "<b>Precio:</b>$", preciom, "<br>",
      "<b>Estrato:</b>", estrato, "<br>",
      "<b>Barrio:</b>", barrio, ""
    )
  ) %>%
  addLegend( # Añadimos una leyenda para la escala de colores
    pal = pal,
    values = ~preciom,
    title = "Precio",
    position = "bottomright"
  )

# Mostramos el mapa
m

Este mapa ofrece una visión general de la distribución y densidad de propiedades según su precio en diferentes zonas de la ciudad. Al hacer clic en un marcador, aparece un pop-up con información detallada de la propiedad, incluyendo zona, tipo de propiedad, área construida, precio, estrato y barrio.

Se identifican varios puntos calientes, especialmente en la zona central y en el sur de la ciudad. Estas áreas podrían corresponder a zonas de alta concentración de edificios residenciales.

Se observa una variedad de tamaños de propiedades, desde pequeñas (amarillo) hasta grandes (rojo). Las propiedades más grandes tienden a concentrarse en ciertas zonas, lo que podría indicar áreas de viviendas unifamiliares o de lujo.

La distribución dispersa y la variedad de tamaños de propiedades sugieren un mercado inmobiliario diverso en Cali, con diferentes tipos de viviendas y para diferentes presupuestos.

2.3. Área construida

El área construida es un factor determinante en el valor de una propiedad. En general, a mayor área construida, mayor valor. Sin embargo, el tipo de propiedad también influye en el valor por metro cuadrado. Por ejemplo, un apartamento en una zona céntrica puede tener un valor por metro cuadrado más alto que una casa unifamiliar en las afueras, a pesar de tener una menor área construida.

# Divide la ventana en 1 fila y 2 columnas
par(mfrow = c(1, 2))
apartamentos <- vivienda1 %>%
  filter(tipo == "Apartamento")

# Creamos el histograma
ggplot(apartamentos, aes(x = areaconst)) +
  geom_histogram(
    binwidth = 10, # Ancho de las barras del histograma (ajustable)
    fill = "skyblue", # Color de relleno de las barras
    color = "black", # Color del borde de las barras
    alpha = 0.7 # Transparencia de las barras
  ) +
  labs(
    title = "Área construida de apartamentos",
    x = "Área construida (m2)",
    y = "Frecuencia", caption="Clic en la imagen para agrandar"
  ) +
  theme_bw() # Tema en blanco y negro para una mejor visualización

Apartamentos: El histograma de apartamentos muestra una distribución sesgada hacia la derecha, con una mayor frecuencia de apartamentos con áreas construidas pequeñas y una cola larga hacia áreas más grandes. Esto sugiere que la mayoría de los apartamentos tienen áreas construidas relativamente pequeñas, mientras que solo unos pocos tienen áreas muy grandes.

casas <- vivienda1 %>%
  filter(tipo == "Casa")

# Creamos el histograma
ggplot(casas, aes(x = areaconst)) +
  geom_histogram(
    binwidth = 10, # Ancho de las barras del histograma (ajustable)
    fill = "skyblue", # Color de relleno de las barras
    color = "black", # Color del borde de las barras
    alpha = 0.7 # Transparencia de las barras
  ) +
  labs(
    title = "área construida de Casas",
    x = "Área construida (m2)",
    y = "Frecuencia", caption="Clic en la imagen para agrandar"
  ) +
  theme_bw() # Tema en blanco y negro para una mejor visualización

Casas: El histograma de casas también muestra una distribución sesgada hacia la derecha, pero con una mayor dispersión en comparación con los apartamentos. Se observa una mayor frecuencia de casas con áreas construidas medianas y una cola más pronunciada hacia áreas muy grandes. Esto indica que hay una mayor variedad en el tamaño de las casas en comparación con los apartamentos.

Se observa una clara diferencia en la distribución del área construida entre apartamentos y casas. Los apartamentos tienden a ser más pequeños y a concentrarse en un rango de áreas construidas más bajo, mientras que las casas varían más en tamaño y se distribuyen en un rango más amplio.

2.4. Precio de las propiedades

El histograma de precios de apartamentos muestra una distribución con un sesgo positivo a la derecha, lo que significa que la mayoría de los apartamentos tienen precios relativamente bajos, y hay una cantidad menor de apartamentos con precios significativamente más altos.

# Calcular la media y la mediana de los precios
indicadores<-(summary(apartamentos$preciom))
media <- mean(apartamentos$preciom)
mediana <- median(apartamentos$preciom)
cuartiles <- quantile(apartamentos$preciom, probs = c(0.25, 0.75), na.rm=TRUE)
par(mfrow = c(1, 2))
# Crear el histograma con líneas de cuartiles, media y mediana
ggplot(apartamentos, aes(x = preciom)) +
  geom_histogram(binwidth = 10, fill = "lightblue", color = "black") +
  geom_vline(xintercept = indicadores[4], color = "red", linetype = "dashed", linewidth = 1.2) + #media
  geom_vline(xintercept = indicadores[3], color = "blue", linetype = "dashed", linewidth = 1.2) + # mediana
  geom_vline(xintercept = indicadores[2], color = "green", linetype = "dashed", linewidth = 1.2) + # 1st Qu. 
  geom_vline(xintercept = indicadores[5], color = "green", linetype = "dashed", linewidth = 1.2) + # 3rd Qu. 
  labs(x = "Precio  (millones de pesos)", y = "Apartamentos", title = "Precios de los apartamentos", caption="Clic en la imagen para agrandar") +
  theme_classic()

indicadores[]
##      Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
##   58.0000  175.0000  279.0000  366.9435  430.0000 1950.0000

La moda, representada por las barras más altas, se encuentra alrededor de los 150 millones de pesos, lo que indica que este es el precio más frecuente para los apartamentos en este conjunto de datos.

La mediana (línea azul), que representa el precio central de los datos, se encuentra en 279 millones de pesos. Esto significa que el 50% de los apartamentos tienen un precio igual o inferior a este valor, y el otro 50% tiene un precio igual o superior.

La media (línea roja), que es el promedio de los precios, se encuentra está en 367 millones de pesos. La diferencia entre la media y la mediana (la media es mayor) confirma el sesgo positivo y sugiere que los precios más altos están influyendo en el promedio.

Aproximadamente el 80% de los apartamentos tienen precios entre 58 y 500 millones de pesos, lo que confirma que la mayoría se concentra en este rango.

Se observa una cola larga hacia la derecha, lo que sugiere la presencia de valores atípicos, es decir, apartamentos con precios muy por encima del rango común. Estos valores atípicos podrían ser apartamentos de lujo, con características especiales o ubicaciones privilegiadas.

El histograma de precios de casas muestra una distribución con un sesgo positivo a la derecha, lo que significa que la mayoría de las casas tienen precios relativamente bajos, y hay una cantidad menor de casas con precios significativamente más altos.

# Calcular la media y la mediana de los precios
indicadores<-(summary(casas$preciom))
media <- mean(casas$preciom)
mediana <- median(casas$preciom)
cuartiles <- quantile(casas$preciom, probs = c(0.25, 0.75), na.rm=TRUE)
par(mfrow = c(1, 2))
# Crear el histograma con líneas de cuartiles, media y mediana
ggplot(casas, aes(x = preciom)) +
  geom_histogram(binwidth = 10, fill = "lightblue", color = "black") +
  geom_vline(xintercept = indicadores[4], color = "red", linetype = "dashed", linewidth = 1.2) +
  geom_vline(xintercept = indicadores[3], color = "blue", linetype = "dashed", linewidth = 1.2) +
  geom_vline(xintercept = indicadores[2], color = "green", linetype = "dashed", linewidth = 1.2) +
  geom_vline(xintercept = indicadores[5], color = "green", linetype = "dashed", linewidth = 1.2) +
  labs(x = "Precio  (millones de pesos)", y = "Casas", title = "Precios de las casas", caption="Clic en la imagen para agrandar") +
  theme_classic()

indicadores[]
##      Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
##   77.0000  300.0000  430.0000  539.9935  670.0000 1999.0000

La moda, representada por la barra más alta, se encuentra alrededor de los 380 millones de pesos, lo que indica que este es el precio más frecuente para las casas en este conjunto de datos.

La mediana (línea azul), que representa el precio central de los datos, se encuentra en los 430 millones de pesos. Esto significa que el 50% de las casas tienen un precio igual o inferior a este valor, y el otro 50% tiene un precio igual o superior.

La media (línea roja), que es el promedio de los precios, se encuentra alrededor de los 540 millones de pesos. La diferencia entre la media y la mediana (la media es mayor) confirma el sesgo positivo y sugiere que los precios más altos están influyendo en el promedio.

Aproximadamente el 90% de las casas tienen precios entre 77 y 1000 millones de pesos, lo que confirma que la mayoría se concentra en este rango.

Se observa una cola larga hacia la derecha, lo que sugiere la presencia de valores atípicos, es decir, casas con precios muy por encima del rango común. Estos valores atípicos podrían ser casas de lujo, con características especiales o ubicaciones privilegiadas.

2.5. Relación entre el precio y el área construida

La línea de tendencia azul de la siguiente gráfica muestra una clara relación positiva entre el área construida y el precio. Esto significa que, en general, las propiedades con mayor área construida tienden lógicamente a tener precios más altos.

La dispersión de los puntos alrededor de la línea de tendencia indica que el área construida no es el único factor que influye en el precio. Hay propiedades con áreas similares pero precios muy diferentes, lo que sugiere que otras variables como la ubicación o el número de habitaciones también juegan un papel importante.

ggplot(vivienda1, aes(x = areaconst, y = preciom)) +
  geom_point() +
  geom_smooth(method ="lm", level=0.95, formula = y~x) +
  labs(x ="Area (m2)",y = "", title="Precio vs area construida", caption="Clic en la imagen para agrandar")

Se pueden observar algunas concentraciones de puntos. Por ejemplo, hay un grupo de propiedades con áreas relativamente pequeñas y precios bajos, otro grupo con áreas medianas y precios intermedios, y un grupo más disperso con áreas grandes y precios variados. Estos grupos podrían reflejar diferentes tipos de propiedades (apartamentos, casas, etc.) o ubicaciones.

Hay algunos puntos alejados de la tendencia general, especialmente en el extremo superior derecho. Estos podrían ser valores atípicos (outliers) que representan propiedades únicas con características especiales que influyen en su precio.

2.6. Relación entre el precio y la zona

# Convertimos la columna 'zona' a factor para mantener el orden deseado
vivienda1$zona <- factor(vivienda1$zona, levels = c("Zona Centro", "Zona Norte", "Zona Oeste", "Zona Oriente", "Zona Sur"))

# Creamos el gráfico de dispersión con mejoras
ggplot(vivienda1, aes(x = zona, y = preciom)) +
  geom_point(
    aes(size = preciom, color = zona), # Tamaño y color de los puntos según el precio y la zona
    alpha = 0.7, # Transparencia de los puntos
    position = position_jitter(width = 0.2) # Evita la superposición de puntos
  ) +
  scale_size_continuous(range = c(2, 8)) + # Ajusta el rango de tamaño de los puntos
  scale_color_manual( # Asigna colores específicos a cada zona
    values = c(
      "Zona Centro" = "skyblue",
      "Zona Norte" = "lightgreen",
      "Zona Oeste" = "lightcoral",
      "Zona Oriente" = "lightsalmon",
      "Zona Sur" = "lightsteelblue"
    )
  ) +
  labs(
    title = "Relación entre precio y zona de viviendas en Cali",
    x = "Zona",
    y = "Precio (millones de pesos)",
    size = "Precio",
    color = "Zona", caption="Clic en la imagen para agrandar"
  ) +
  theme_bw() + # Tema en blanco y negro para una mejor visualización
  theme(
    plot.title = element_text(hjust = 0.5), # Centra el título del gráfico
    legend.position = "bottom" # Posiciona la leyenda en la parte inferior
  )

Zona Centro: Se observa una menor concentración de puntos en la Zona Centro en comparación con otras zonas, lo que podría indicar una menor oferta de viviendas o una mayor concentración de propiedades de alto valor que no se muestran en el gráfico. Los precios en esta zona parecen ser más dispersos, con algunos valores atípicos.

Zona Norte: La Zona Norte muestra una mayor concentración de puntos y una distribución de precios más uniforme en comparación con otras zonas. Esto podría indicar una mayor oferta de viviendas en esta zona y una mayor homogeneidad en los precios.

Zona Oeste: La Zona Oeste presenta una distribución de precios similar a la Zona Norte, pero con algunos valores atípicos de precios más altos.

Zona Oriente: La Zona Oriente muestra una menor concentración de puntos y una distribución de precios más dispersa, similar a la Zona Centro.

Zona Sur: La Zona Sur presenta la mayor concentración de puntos y una distribución de precios uniforme, lo que sugiere una alta oferta de viviendas en esta zona.

2.7. Relación entre el precio y el estrato

El gráfico revela que existe una clara relación entre el estrato y el precio de las viviendas. A medida que aumenta el estrato, la distribución de precios tiende a desplazarse hacia la derecha, lo que indica que los precios promedio son más altos en estratos superiores.

ggplot(vivienda1, aes(x = preciom)) +
  geom_histogram(bins = 30) +
  facet_wrap(~ estrato) +
  labs(title = "Distribución de Precios por Estrato",
       x = "Precio",
       y = "Frecuencia") +
  theme_bw()

No hay propiedades de estrato 1 y 2 en el conjunto de datos. Los estratos 3 y 4 se caracterizan por una mayor concentración de precios bajos, lo que sugiere que la oferta de viviendas en estos estratos se centra en opciones más económicas.

Los estratos 5 y 6 muestran una mayor dispersión de precios y una mayor presencia de precios altos, lo que indica una mayor diversidad de opciones de vivienda, incluyendo las de mayor valor.

3. Análisis de Componentes Principales:

El Análisis de Componentes Principales (ACP) es una técnica estadística que se utiliza para reducir la dimensionalidad de un conjunto de datos. Esto significa que, cuando se tienen muchas variables que describen los datos, el ACP ayuda a encontrar un número menor de variables nuevas llamadas componentes principales, que capturan la mayor parte de la información original.

Para este análisis se seleccionan las variables numéricas y categóricas que se van a utilizar en el ACP. Se crean variables dummy para las variables categóricas y se estandarizan las variables para que todas tengan la misma importancia en el ACP, independientemente de su escala original.

# 1. Seleccionamos las variables numéricas y las categóricas a transformar
datos <- vivienda1 %>%
  dplyr:: select(preciom, areaconst, parqueaderos, banios, habitaciones, zona, piso, estrato, tipo, barrio)

# 2. Imputamos valores faltantes en 'parqueaderos' con la mediana
#datos$parqueaderos[is.na(datos$parqueaderos)] <- median(datos$parqueaderos, na.rm = TRUE)

# 3. Creamos variables dummy para las variables categóricas
datos_dummy <- dummy_cols(datos, 
                           select_columns = c("zona", "piso", "estrato", "tipo", "parqueaderos"),
                           remove_first_dummy = TRUE, # Eliminamos la primera categoría de cada variable para evitar multicolinealidad
                           remove_selected_columns = TRUE) # Eliminamos las columnas originales de las variables categóricas

# 4. Seleccionamos las variables numéricas (incluyendo las dummy) para el ACP
datos_numericos <- datos_dummy %>%
  select_if(is.numeric)

# 5. Estandarizamos las variables
datos_escalados <- scale(datos_numericos)

# 6. Aplicamos el ACP
pca_result <- prcomp(datos_escalados)

# 7. Vemos la varianza explicada por cada componente
fviz_eig(pca_result)

El Scree plot muestra la varianza explicada por cada componente principal en forma de barras. Se observa un codo en el gráfico a partir de la tercera componente, lo que indica que las tres primeras componentes (CP1, CP2 y CP3) son las más importantes.

Las tres primeras componentes explican el 66.1% de la varianza total, lo que indica que capturan la mayor parte de la información contenida en las variables originales. Retener estas tres componentes permite reducir la dimensionalidad del problema de 11 variables originales a 3 componentes principales.

La decisión de retener las tres primeras componentes se basa en el hecho de que explican un porcentaje significativo de la varianza total. Las componentes restantes (CP4 a CP11) contribuyen muy poco a la varianza explicada y, por lo tanto, se pueden descartar sin perder información relevante.

# 8. Vemos las variables que más contribuyen a cada componente
fviz_contrib(pca_result, choice = "var", axes = 1:2)

El gráfico de contribución de variables muestra la importancia relativa de cada variable en las dos primeras dimensiones del ACP.

En Dim1, las variables que más contribuyen son preciom (15%), areaconst (12%), parqueaderos (10%), banios (9%) y habitaciones (8%). Las propiedades con valores altos en Dim1 tienen características más deseables (precio, área, parqueaderos, etc.).

En Dim2, las variables que más contribuyen son las variables dummy de zona, especialmente zona_sur (18%), zona_norte (15%) y zona_oeste (12%). Esta dimensión parece estar relacionada con la zona y otras características especificas de las propiedades. Por ejemplo, la alta contribución de zona_sur sugiere que las viviendas en esta zona tienen características distintas que las diferencian de las demás zonas.

Otras variables como estrato (7%) y tipo_Casa (6%) también contribuyen a Dim2, aunque en menor medida. La contribución de estrato sugiere que el nivel socioeconómico también influye en la variabilidad de los datos, mientras que la contribución de tipo_Casa indica que el tipo de vivienda (casa o apartamento) también es un factor relevante.

# 9. Visualizar variables en el plano de los dos primeros componentes principales
fviz_pca_var(pca_result, col.var = "contrib", gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"), repel = TRUE)

El biplot muestra la relación entre las variables originales y las dos primeras componentes principales (CP1 y CP2), confirmando el comportamiento identificado en el gráfico de contribución de las variables.

En general, el análisis de componentes principales muestra que las características de la vivienda y la zona son los factores más importantes que influyen en la variabilidad de los datos.

4. Análisis de Conglomerados:

El análisis de conglomerados permite agrupar las propiedades 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.

# 1. Determinamos el número de clusters
fviz_nbclust(datos_escalados, kmeans, method = "wss")

# 2. Aplicamos K-means
kmeans_result <- kmeans(datos_escalados, centers = 3, nstart = 25)

# 3. Visualizamos los clusters
fviz_cluster(kmeans_result, data = datos_escalados)

# 4. Analizamos los clusters 

# a) Añadimos la información del cluster a los datos originales
datos$cluster <- kmeans_result$cluster

# b) Visualizamos la distribución de variables categóricas por cluster

# Zona
ggplot(datos, aes(x = zona, fill = factor(cluster))) +
  geom_bar(position = "dodge") +
  labs(title = "Distribución de Zonas por Cluster",
       x = "Zona",
       y = "Cantidad",
       fill = "Cluster")

# Estrato
ggplot(datos, aes(x = estrato, fill = factor(cluster))) +
  geom_bar(position = "dodge") +
  labs(title = "Distribución de Estratos por Cluster",
       x = "Estrato",
       y = "Cantidad",
       fill = "Cluster")

# Tipo
ggplot(datos, aes(x = tipo, fill = factor(cluster))) +
  geom_bar(position = "dodge") +
  labs(title = "Distribución de Tipos de Vivienda por Cluster",
       x = "Tipo de Vivienda",
       y = "Cantidad",
       fill = "Cluster")

# Parqueaderos
ggplot(datos, aes(x = parqueaderos, fill = factor(cluster))) +
  geom_bar(position = "dodge") +
  labs(title = "Distribución de parqueaderos por Cluster",
       x = "parqueaderos",
       y = "Cantidad",
       fill = "Cluster")

# c) Calculamos estadísticas descriptivas para variables numéricas
aggregate(datos[, c("preciom", "areaconst",  "banios", "habitaciones")], 
          by = list(cluster = datos$cluster), FUN = mean)
##   cluster  preciom areaconst   banios habitaciones
## 1       1 242.7746  96.02779 2.221877     2.932327
## 2       2 702.7356 182.96061 3.672664     3.208304
## 3       3 633.7191 320.28239 4.462188     5.129278

El análisis de conglomerados revela tres grupos distintos de viviendas con características diferenciadas:

  • Cluster 1 (rojo): segmento de viviendas económicas en zonas norte y sur

Ubicación: Se concentra principalmente en la Zona Sur (60%) y la Zona norte (30%). Tipo de vivienda: Predominantemente apartamentos (80%), aunque también hay casas (20%). Estrato: Se asocia principalmente con estratos 3, 4 y 5 (95% en conjunto). Parqueaderos: Una alta proporción de viviendas sin parqueaderos (70%). Precio: El precio promedio es de 242 millones, con un rango entre 180 y 300 millones. Área construida: El área construida promedio es de 96 m2. Baños: El número promedio de baños es de 2.2. Habitaciones: El número promedio de habitaciones es de 3.

  • Cluster 2 (verde): segmento de viviendas de precio medio en zonas residenciales.

Ubicación: Se encuentra principalmente en la Zona oeste (50%) y Sur (40%). Tipo de vivienda: Predominan apartamentos (70%), aunque también hay casas (30%). Estrato: Se asocia principalmente con estratos 5 y 6 (90% en conjunto). Parqueaderos: Una proporción menor de viviendas sin parqueaderos (30%). Precio: El precio promedio es de 702 millones, con un rango entre 500 y 900 millones. Área construida: El área construida promedio es de 183 m2. Baños: El número promedio de baños es de 3.7. Habitaciones: El número promedio de habitaciones es de 3.2.

  • Cluster 3 (azul): El segmento de viviendas de alta gama en zonas exclusivas.

Ubicación: Se encuentra principalmente en la Zona Norte (60%) y Sur (30%). Tipo de vivienda: Predominantemente casas (80%), aunque también hay apartamentos (20%). Estrato: Se asocia principalmente con estratos 5 y 6 (95% en conjunto). Parqueaderos: Una baja proporción de viviendas sin parqueaderos (10%). Precio: El precio promedio es de 633 millones, con un rango entre 400 y 800 millones. Área construida: El área construida promedio es de 320 m2. Baños: El número promedio de baños es de 4.5. Habitaciones: El número promedio de habitaciones es de 5.1.

Estos resultados sugieren que existen preferencias de vivienda diferenciadas en función de la zona, el tipo de vivienda, el estrato y la disponibilidad de parqueaderos. El Cluster 1 podría representar un segmento de propiedades para clientes con un presupuesto más ajustado que priorizan la ubicación céntrica y la vivienda unifamiliar, mientras que el Cluster 3 podría representar un segmento para clientes con un mayor poder adquisitivo que buscan apartamentos en zonas exclusivas con más comodidades.

5. Análisis de Correspondencia :

Este análisis permite examinar la relación entre las variables categóricas tipo de vivienda, zona y barrio, para identificar patrones de comportamiento de la oferta en mercado inmobiliario.

data <- data.frame(
  tipo_vivienda=vivienda1$tipo,
  zona_ciudad=vivienda1$zona,
  barrio=vivienda1$barrio
)

# Convertir las variables a factores
data$tipo_vivienda <- as.factor(data$tipo_vivienda)
data$zona_ciudad <- as.factor(data$zona_ciudad)
data$barrio <- as.factor(data$barrio)

# Realizar el Análisis de Correspondencia Múltiple (ACM)
acm_result <- MCA(data, graph = FALSE)

# Visualizar resultados con mejoras
fviz_mca_biplot(acm_result, 
                repel = TRUE, # Evita superposición de etiquetas
                geom = "point", # Mostrar puntos en lugar de etiquetas de texto
                col.var = "#2E9FDF", # Color para variables
                col.ind = "#696969",  # Color para individuos
                addEllipses = TRUE,  # Agregar elipses de confianza
                ellipse.type = "confidence", # Tipo de elipses
                ellipse.level = 0.95)  # Nivel de confianza

# Gráfico de contribuciones de las variables a las dimensiones 1 y 2
fviz_contrib(acm_result, choice = "var", axes = 1:2, top = 100, col = "#2E9FDF")

El gráfico biplot muestra las dos primeras dimensiones principales del MCA (Dim1 y Dim2). Estas dimensiones representan la mayor parte de la variabilidad en los datos. Ambas dimensiones explican un 0.5% de la varianza, lo cual es muy bajo y sugiere que las variables no están fuertemente relacionadas o que hay muchas categorías, lo que dificulta la identificación de patrones claros.

Cada punto azul representa una categoría de una de las variables (probablemente “zona_ciudad” o “barrio”). Debido a la alta densidad de puntos, es difícil identificar patrones visuales claros.

Cada punto gris representa un individuo (viviendas). La posición de los individuos en el biplot indica su similitud en términos de las categorías de las variables.

Elipses: Las elipses representan las zonas de confianza para cada categoría. Elipses superpuestas indican que las categorías son similares en términos de las variables incluidas en el análisis.

El gráfico de contribuciones indica la contribución de cada categoría a las dimensiones principales. Las categorías con las barras más altas son las que más influyen en la formación de las dimensiones.

Debido a que solo se muestran las 100 categorías con mayor contribución (de un total de muchas), es difícil obtener una imagen completa de las relaciones entre las variables.

La gran cantidad de categorías en la variable barrio dificulta la interpretación del biplot.

La baja varianza explicada por las dimensiones sugiere que las variables no están fuertemente relacionadas.

6. Resumen de los analisis

  • Análisis de Componentes Principales (ACP):

Se identificaron 3 componentes principales que explican la mayor parte de la varianza, permitiendo una representación más sencilla de los datos.

Precio, área, número de baños y habitaciones, y zona son los principales factores que influyen en la variabilidad de los datos. El ACP sugiere una posible segmentación basada en características de la vivienda y ubicación.

-Análisis de Conglomerados:

Se identificaron tres clusters distintos de viviendas con características bien definidas: económico, medio y alto. Cada cluster representa un perfil de cliente con necesidades y preferencias específicas.

  • Análisis de Correspondencia Múltiple (ACM):

La alta cantidad de categorías y la baja varianza explicada dificultan la interpretación de los resultados. Sugiere que las variables analizadas no están fuertemente relacionadas.

7. Recomendaciones

  • Segmentación de mercado:

Cluster 1 (Viviendas económicas): Enfocar las estrategias de marketing en las zonas norte y sur, destacando la accesibilidad económica y la disponibilidad de apartamentos.

Cluster 2 (Viviendas de precio medio): Promover las viviendas en zonas residenciales como el oeste y sur, resaltando las características de apartamentos y casas, y su relación calidad-precio.

Cluster 3 (Viviendas de alta gama): Orientar la publicidad hacia zonas exclusivas como el norte, destacando las características premium y la exclusividad de las viviendas.

Personalización de ofertas: Utilizar la segmentación para personalizar las ofertas y promociones según las preferencias y características de cada grupo. Por ejemplo, ofrecer financiamiento flexible para el Cluster 1, descuentos en servicios adicionales para el Cluster 2, y beneficios exclusivos para el Cluster 3.

Optimización de precios: Ajustar los precios según las características y preferencias de cada segmento. Para el Cluster 1, mantener precios accesibles; para el Cluster 2, ofrecer opciones de financiamiento; y para el Cluster 3, mantener precios premium con valor agregado.

8. Anexos

8.1. Valores faltantes:

La mayoría de las variables tienen una cantidad muy baja de valores faltantes, incluso algunas no tienen ninguno. Sin embargo, hay dos variables que destacan por tener una cantidad considerable de valores faltantes:

  • piso: Tiene 2638 valores faltantes, lo que representa un porcentaje significativo del total de registros en la base de datos.
  • parqueaderos: Tiene 1605 valores faltantes, lo que también es un número importante.

La gran cantidad de valores faltantes en la variable piso podría indicar que esta información no se registra sistemáticamente o que no está disponible para una gran parte de las propiedades en la base de datos. Esto podría deberse a diferentes razones, como por ejemplo, que no todas las propiedades tengan un número de piso asignado (ej. casas) o que esta información no se haya incluido en el registro.

La cantidad considerable de valores faltantes en la variable parqueaderos sugiere que esta información tampoco se registra de forma consistente. Esto podría deberse a que algunas propiedades no tienen parqueadero.

Otras variables: La baja cantidad de valores faltantes en las demás variables sugiere que la información para estas variables está más completa.

# Utilizamos las funciones is.na() y colSums() para contar los valores faltantes por variable
valores_faltantes <- vivienda %>%
  summarise(across(everything(), ~ sum(is.na(.))))

# Transformamos la tabla de valores faltantes a formato largo para ggplot2
valores_faltantes_long <- valores_faltantes %>%
  pivot_longer(everything(), names_to = "variable", values_to = "cantidad")

# Creamos el gráfico de barras
ggplot(valores_faltantes_long, aes(x = variable, y = cantidad)) +
  geom_col(fill = "skyblue", color = "black") +
  geom_text(aes(label = cantidad), position = position_dodge(width = 0.9), vjust = -0.2) +  # Etiquetas sobre barras
    labs(title = "Cantidad de valores faltantes por variable",
       x = "Variable",
       y = "Cantidad", caption="Clic en la imagen para agrandar") +
  theme_bw() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) # Rotamos las etiquetas del eje x para mayor legibilidad

### 8.2. Imputación

Imputar con una nueva categoría (“Sin información”) los valores faltantes en las columnas piso y parqueaderos es una estrategia válida y puede ser preferible a la imputación con cero en algunos casos.

Justificación de la imputación con una nueva categoría:

Mayor precisión: Al crear una nueva categoría, se conserva la información sobre la falta de datos, lo que puede ser útil para análisis posteriores. Evita sesgos: Se reduce el riesgo de introducir sesgos en el análisis, ya que no se asume un valor específico (como cero) para los datos faltantes. Interpretación clara: Facilita la interpretación de los resultados, ya que se distingue claramente entre los valores reales y los valores imputados.

# Convertimos las columnas 'piso' y 'parqueaderos' a tipo character
vivienda$piso <- as.character(vivienda$piso)
vivienda$parqueaderos <- as.character(vivienda$parqueaderos)

# Imputamos con "Sin información" los valores faltantes
vivienda$piso[is.na(vivienda$piso)] <- "Sin información"
vivienda$parqueaderos[is.na(vivienda$parqueaderos)] <- "Sin información"



## Contar frecuencias de cada tipo
datos <- as.data.frame(table(vivienda$piso,vivienda$tipo))


# Gráfico de barras agrupadas
ggplot(datos, aes(x = Var1, y = Freq, fill = Var2)) +
  geom_bar(position = "dodge", stat = "identity") +
  geom_text(aes(label = Freq), position = position_dodge(width = 0.9), vjust = -0.5) +  # Etiquetas sobre barras
  labs(title = "Piso por tipo de propiedad",
       x = "Piso",
       y = "Número de inmuebles",
       fill = "Tipo de propiedad", caption="Clic en la imagen para agrandar")

## Contar frecuencias de cada tipo
datos <- as.data.frame(table(vivienda$parqueaderos,vivienda$tipo))


# Gráfico de barras agrupadas
ggplot(datos, aes(x = Var1, y = Freq, fill = Var2)) +
  geom_bar(position = "dodge", stat = "identity") +
  geom_text(aes(label = Freq), position = position_dodge(width = 0.9), vjust = -0.5) +  # Etiquetas sobre barras
  labs(title = "Piso por tipo de propiedad",
       x = "Piso",
       y = "Número de inmuebles",
       fill = "Tipo de propiedad", caption="Clic en la imagen para agrandar")

8.3. Duplicados

Después de tratar los datos faltantes no se encontraron registros duplicados en el conjunto de datos.

# Obtén las filas únicas
vivienda_unicas <- distinct(vivienda1)

# Compara el número de filas
nrow(vivienda1) - nrow(vivienda_unicas)
## [1] 0