1 PROBLEMA

Una empresa inmobiliaria líder en una gran ciudad está buscando comprender en profundidad el mercado de viviendas urbanas para tomar decisiones estratégicas más informadas. La empresa posee una base de datos extensa que contiene información detallada sobre diversas propiedades residenciales disponibles en el mercado. Se requiere realizar un análisis holístico de estos datos para identificar patrones, relaciones y segmentaciones relevantes que permitan mejorar la toma de decisiones en cuanto a la compra, venta y valoración de propiedades.

2 RETOS

El reto principal consisten en realizar un análisis integral y multidimensional de la base de datos para obtener una comprensión del mercado inmobiliario urbano. Se requiere aplicar diversas técnicas de análisis de datos, incluyendo:

  • Análisis de Componentes Principales: Reducir la dimensionalidad del conjunto de datos y visualizar la estructura de las variables en componentes principales para identificar características clave que influyen en la variación de precios y oferta del mercado.

  • Análisis de Conglomerados: Agrupar las propiedades residenciales en segmentos homogéneos con características similares para entender las dinámicas de las ofertas específicas en diferentes partes de la ciudad y en diferentes estratos socioeconómicos.

  • Análisis de Correspondencia: 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.

  • Visualización de resultados: Presentar gráficos, mapas y otros recursos visuales para comunicar los hallazgos de manera clara y efectiva a la dirección de la empresa.

3 CONTEXTO

3.1 Área de Estudio

Santiago de Cali, la capital del departamento de Valle del Cauca, es la tercera ciudad más grande de Colombia con una población estimada de 2.460.392 habitantes en 2024. Esta metrópoli ha experimentado un notable crecimiento poblacional, constituyendo más del 60% de la población total del departamento. Distribuida en 336 barrios y 22 comunas, Cali es un centro urbano vibrante que ha visto una expansión significativa debido a la migración interna desde áreas rurales hacia zonas urbanas.

La ciudad ofrece una atractiva combinación de oportunidades para el mercado inmobiliario, caracterizado por la constante valorización de propiedades. Esta tendencia se debe a una creciente demanda, respaldada por su clima agradable y estable que facilita un estilo de vida activo y saludable. Además, Cali es un epicentro cultural y de entretenimiento, famoso por sus festivales de salsa, teatros, galerías de arte, y una variada oferta gastronómica. La diversidad del mercado inmobiliario incluye desde lujosas residencias hasta apartamentos vacacionales, lo que ofrece opciones para una amplia gama de compradores y un entorno favorable para la inversión, con propiedades que aumentan su valor de forma constante.

library(sf)
library(leaflet)

ruta_archivo <- "C:/Users/lvasquez/OneDrive - PUJ Cali/2024_2/Metodos_estadisticos_para_toma_decisiones/Unidad_1/Barrios_Cali.gpkg"
#ruta_archivo <- "C:/Users/ASUS/OneDrive - PUJ Cali/2024_2/Metodos_estadisticos_para_toma_decisiones/Unidad_1/Cali_WGS84.gpkg"

file.exists(ruta_archivo)
## [1] TRUE
Cali_WGS84 <- st_read(ruta_archivo) # fuente de datos secundaria (www.cali.gov.co)
## Reading layer `Barrios_Cali' from data source 
##   `C:\Users\lvasquez\OneDrive - PUJ Cali\2024_2\Metodos_estadisticos_para_toma_decisiones\Unidad_1\Barrios_Cali.gpkg' 
##   using driver `GPKG'
## Simple feature collection with 336 features and 6 fields
## Geometry type: POLYGON
## Dimension:     XY
## Bounding box:  xmin: -76.59078 ymin: 3.331802 xmax: -76.46124 ymax: 3.501895
## Geodetic CRS:  WGS 84
Cali_WGS84 <- st_transform(Cali_WGS84, crs = '+proj=longlat +datum=WGS84')

leaflet() %>%
  addTiles() %>%
  setView(lng = -76.53, lat = 3.42, zoom = 11.5) %>%
  addPolygons(data = Cali_WGS84, color = "gray",weight = 2,fillColor = "gray", stroke = 0.1, opacity = 0.9, popup = paste0("Barrio: ",Cali_WGS84$barrio,"<br>","Comuna: ",Cali_WGS84$comuna))

3.2 Fuentes de datos

Datos primarios

Los datos empleados en el análisis de la oferta inmobiliaria en la ciudad de Cali, fue extraída de OLX mediante procedimiento webscraping y contenidos en el paquete MODELOS de R. Este conjunto de datos cuenta con un total de 8327 registros y 15 atributos, de interés para el sector. Esta base de datos fue, transformada empleando técnicas estadísticas de limpieza e imputación y creando nuevas variables que serán útiles para analizar el nicho de mercado, objetivo esencial para la compañía. El proceso EDL puede consultarse a detalle en apartado ANEXOS.

if (!is.element("DT", installed.packages()[,1])){
  install.packages("DT", repos = "http://mirror.fcaglp.unlp.edu.ar/CRAN/")
}
library(DT)

vivienda5 <- read.csv("C:/Users/ASUS/OneDrive - PUJ Cali/2024_2/Metodos_estadisticos_para_toma_decisiones/Unidad_1/vivienda5.csv")

datatable(vivienda5, rownames = FALSE, filter="top", options = list(pageLength = 5, scrollX=T) ) %>% formatStyle(names(vivienda5), backgroundColor = "lightgray") 

Datos secundarios

Como estrategia para la limpieza e imputación de datos, se consultó e incluyó en el proceso, como base de datos adicional, la capa geográfica de división político - administrativa de la ciudad de Cali, emitido por la página de la alcaldía www.cali.gov.co, basada en la información del censo del 2018. Esta capa cuenta con un total de 366 registros y 7 atributos.

datatable(Shape_BCali, filter="top", options = list(pageLength = 5, scrollX=T))%>%
  formatStyle(names(Shape_BCali), backgroundColor = "lightgray")

4 RESULTADOS Y DISCUCIÓN

4.1 Análisis de Componentes Principales

El Análisis de Componentes Principales (PCA) es una técnica estadística utilizada para reducir la dimensionalidad de un conjunto de datos, conservando al mismo tiempo la mayor parte de la variabilidad presente en los datos. El PCA transforma un conjunto de variables posiblemente correlacionadas en un nuevo conjunto de variables no correlacionadas, conocidas como componentes principales. Estos componentes principales son combinaciones lineales de las variables originales, ordenadas de tal manera que el primer componente captura la mayor variabilidad posible en los datos, el segundo componente captura la mayor variabilidad posible restante, y así sucesivamente.

El PCA es especialmente útil cuando se trabaja con conjuntos de datos grandes y complejos con muchas variables, ya que permite simplificar el análisis al reducir el número de variables sin perder información significativa. Se aplica principalmente a variables numéricas continuas. Los resultados del PCA pueden facilitar la visualización, la compresión de los datos y la identificación de patrones ocultos.

Para aplicar un Análisis de Componentes Principales (PCA) es fundamental que se cumplan ciertos supuestos que garantizan la validez y efectividad del análisis. En primer lugar, las variables deben ser cuantitativas y preferiblemente de tipo continuo. Además, es necesario que exista una correlación significativa entre las variables, ya que el PCA se basa en la identificación de relaciones lineales entre ellas. Asimismo, se debe verificar que la matriz de datos no presente multicolinealidad extrema, y es recomendable que los datos estén estandarizados, especialmente si las variables tienen diferentes unidades de medida. Cumplir con estos supuestos asegura que los componentes principales extraídos representen de manera adecuada la estructura subyacente de los datos y que los resultados del análisis sean interpretables y útiles.

4.1.1 Verificación de cumplimiento de supuestos

  • Linealidad

En el análisis bivariado realizado, la matriz de correlación muestra que las variables Precio y Área Construida tienden a agruparse en una línea recta, aunque también se observan datos dispersos asociados a los outliers. Esta tendencia se confirma con un índice de correlación de 0.68, que indica una relación positiva moderada entre ambas variables.

Por otro lado, aunque las variables discretas muestran agrupamientos en líneas rectas en el gráfico, esto no garantiza necesariamente una relación lineal entre ellas. Debido a la naturaleza de las variables discretas, es esencial realizar análisis adicionales para confirmar la existencia de una relación lineal. La visualización inicial y la correlación observada proporcionan información, pero se requieren análisis complementarios para validar la relación entre estas variables.

  • Correlación entre Variables

Según la matriz de correlación realizada, se observa que la mayoría de las variables presentan una correlación moderada entre sí. Esto sugiere que existe una relación significativa, aunque no extremadamente fuerte, entre las variables analizadas.

  • Ausencia de Multicolinealidad Perfecta

De acuerdo con la matriz de correlación, se observa que ninguna de las variables presenta correlaciones extremadamente altas cercanas a -1 o 1, lo cual podría indicar multicolinealidad. Esto sugiere que el conjunto de datos es adecuado para su uso en el análisis de componentes principales (PCA).

  • Escala de medición

Dado que el conjunto de datos es mixto y contiene variables cuantitativas y categóricas con escalas de medición diferentes, es esencial realizar dos pasos de preprocesamiento: estandarización y codificación. Primero, se debe estandarizar las variables cuantitativas numéricas para asegurar que todas tengan una escala comparable, evitando que las diferencias en magnitudes influyan de manera desproporcionada en el análisis. Con estos pasos, todas las variables estarán adecuadamente preparadas para ser incluidas en el Análisis de Componentes Principales (PCA), permitiendo una evaluación más precisa de las estructuras subyacentes en el mercado inmobiliario.

library(dplyr)
library(DT)

vivienda5<- read.csv("C:/Users/lvasquez/OneDrive - PUJ Cali/2024_2/Metodos_estadisticos_para_toma_decisiones/Unidad_1/vivienda5.csv")
#vivienda5 <- read.csv("C:/Users/ASUS/OneDrive - PUJ Cali/2024_2/Metodos_estadisticos_para_toma_decisiones/Unidad_1/vivienda5.csv")

vivienda6<-vivienda5  # Realizar una copia
vivienda6<-vivienda6 %>% select(-Id, -Longitud, -Latitud,-Barrio, -Comuna)

# Estandarizar variables numéricas 
vivienda6$Area_construida<- scale(vivienda6$Area_construida)
vivienda6$Precio_m<- scale(vivienda6$Precio_m)
vivienda6$No_Parqueaderos <- scale(vivienda6$No_Parqueaderos)
vivienda6$No_Banios <- scale(vivienda6$No_Banios)
vivienda6$No_Habitaciones <- scale(vivienda6$No_Habitaciones)
vivienda6$Estrato <- scale(vivienda6$Estrato)
vivienda6$Piso<- scale(as.numeric(vivienda6$Piso))

# Estandarizar variables categóricas
#vivienda6$Piso <- as.factor(vivienda6$Piso)
vivienda6$Tipo_inmueble <- as.factor(vivienda6$Tipo_inmueble)
vivienda6$Zona <- as.factor(vivienda6$Zona)

# # Crear el one-hot encoding usando model.matrix y lo vuelve dataframe
# piso_dummies <- as.data.frame(model.matrix(~ Piso - 1, data = vivienda6))
# tipo_inmueble_dummies <-  as.data.frame(model.matrix(~ Tipo_inmueble - 1, data = vivienda6))
# zona_dummies <-  as.data.frame(model.matrix(~ Zona - 1, data = vivienda6))
# 
# # Agregar las nuevas columnas al dataframe original
# vivienda6 <- cbind(vivienda6, piso_dummies)
# vivienda6 <- cbind(vivienda6, tipo_inmueble_dummies)
# vivienda6 <- cbind(vivienda6, zona_dummies)
# 
vivienda6<-vivienda6 %>% select(-Tipo_inmueble, -Zona)

datatable(vivienda6, filter="top", options = list(pageLength = 5, scrollX=T))%>%
formatStyle(names(vivienda6), backgroundColor = "lightgray")

4.1.2 Aplicación de Análisis de componentes principales

Una vez verificados los supuestos del método y estandarizado el conjunto de datos, se implementa la técnica de Análisis de Componentes Principales (PCA) con el objetivo de extraer información relevante. Esta información será clave para llevar a cabo un análisis técnico que servirá como herramienta en la toma de decisiones estratégicas de marketing para la empresa inmobiliaria.

La gráfica a continuación muestra la varianza explicada por los componentes principales, donde los tres primeros representa el 82.4% del total, indicando que estos tres componentes capturan adecuadamente la variabilidad de los datos y, por lo tanto, serán los considerados para el análisis.

En particular, el primer componente principal (PC1) está dominado por las variables precio, número de baños, área construida y número de parqueaderos, con contribuciones de 21.7%, 21.3%, 20.0% y 17.5%, respectivamente. El segundo componente principal (PC2) está principalmente influenciado por el estrato, el número de habitaciones y el piso, mientras que el tercer componente principal (PC3) está dominado por la variable piso, con una contribución del 70.1%.

En general, el análisis sugiere que las variables que más influyen en el mercado inmobiliario son el precio, el área construida, el estrato, la ubicación y las comodidades del inmueble.

# Cargar las bibliotecas necesarias
library(factoextra)
library(ggplot2)
library(gridExtra)

# Aplicar análisis de componentes principales 
res.pca <-prcomp(vivienda6)

# Extraer los datos de varianza explicada
eig <- fviz_eig(res.pca, addlabels = TRUE)

# Ajustar el gráfico con ggplot2 para modificar el ancho de la línea
p1 <- eig + 
      geom_line(color = "red", size = 0.8) +  # Ajustar el ancho de la línea aquí+
          theme(
              plot.title = element_text(hjust = 0.5),
              ) +
            labs(
                title = "Varianza Explicada por Componentes Principales",
                x = "Número de Componente",
                y = "Porcentaje de varianza explicada"
            )


# Contribución de Variables a Componentes Principales
# Número de componentes principales a visualizar
num_pcs <- 3

# Lista para almacenar los gráficos
plots <- list()

# Bucle para crear gráficos de contribución para cada componente
for (i in 1:num_pcs) {
  # Extraer datos de contribución
  contrib_data <- fviz_contrib(res.pca, choice = "var", axes = i, top = 10)$data
  
  # Ordenar los datos de mayor a menor contribución
  contrib_data <- contrib_data[order(-contrib_data$contrib), ]
  
  # Convertir la columna de las variables en un factor con niveles ordenados
  contrib_data$variable <- factor(rownames(contrib_data), levels = rownames(contrib_data))
  
  # Crear el gráfico de barras
  p <- ggplot(contrib_data, aes(x = variable, y = contrib, fill = variable)) +
    geom_bar(stat = "identity", color = "black", width = 0.7) +
    geom_text(aes(label = sprintf("%.1f%%", contrib), 
                  y = contrib + 1.8), 
              color = "black", 
              size = 3, 
              fontface = "bold") +
    labs(title = paste("Contribución al PC", i), 
         x = "Variable", 
         y = "Contribución (%)") +
    theme_minimal() +
    theme(axis.text.x = element_text(angle = 45, hjust = 1), 
          legend.position = "none")
  
  # Agregar el gráfico a la lista
  plots[[i]] <- p
}

# Disposición de los gráficos
grid.arrange(
  p1,  # Gráfico de varianza explicada
  plots[[1]], plots[[2]], plots[[3]],  # Gráficos de contribución para PC1, PC2 y PC3
  nrow = 2, 
  ncol = 3, 
  layout_matrix = rbind(c(1, 1, 1), c(2, 3, 4))
)

  • Análisis de relación de los PCA con Zona, Estrato y Tipo de inmueble

Al analizar la relación entre los tres primeros componentes principales (PC1, PC2 y PC3) y la variable “zona”, la gráfica resultante muestra que no hay una relación claramente definida. Los registros (inmuebles) no presentan un agrupamiento visualmente identificable según las variables de mayor peso en cada componente principal.

En el gráfico superior, por ejemplo, el agrupamiento por zonas no resulta ser una característica suficientemente distintiva para agrupar los inmuebles cuyas variables más representativas son el precio, el número de baños, el área construida, el estrato, el número de parqueaderos, habitaciones y pisos.

De manera similar, en el gráfico del medio, la variable “zona” no refleja de manera representativa las variables de mayor peso en los dos primeros componentes principales, ni en la tercera gráfica. En otras palabras, el hecho de que los inmuebles estén agrupados por zona no implica que deban tener precios similares, pertenecer a un estrato específico, o contar con una cantidad particular de parqueaderos, pisos, habitaciones, baños o área construida.

library(factoextra)
library(gridExtra)

vivienda7 <- vivienda6
rownames(vivienda7)<-vivienda5$Id  

# verificar que zona es factor
zona<-as.factor(vivienda5$Zona)

PCA_12_zona<-fviz_pca_ind(res.pca,
                                       axes = c(1,2),
                                       col.ind = zona, # color by groups
                                       palette = rainbow(5),
                                       addEllipses = TRUE, # Concentration ellipses
                                       ellipse.type = "confidence",
                                       legend.title = "Groups",
                                       repel = FALSE
)+
  labs(title="PC1-PCA2 - Agrupado por zona",x="PC1 (50.8%)", y="PC2 (20.1%)") +
  theme(plot.title = element_text(hjust = 0.5))  # Centrar el título

PCA_13_zona<-factoextra::fviz_pca_ind(res.pca,
                                       axes = c(1,3),
                                       col.ind = zona, # color by groups
                                       palette = rainbow(5),
                                       addEllipses = TRUE, # Concentration ellipses
                                       ellipse.type = "confidence",
                                       legend.title = "Groups",
                                       repel = FALSE
)+
  labs(title="PC1-PCA3 - Agrupado por zona",x="PC1 (50.8%)", y="PC3 (11.5%)")+
   theme(plot.title = element_text(hjust = 0.5))  # Centrar el título

PCA_23_zona<-factoextra::fviz_pca_ind(res.pca,
                                       axes = c(2,3),
                                       col.ind = zona, # color by groups
                                       palette = rainbow(5),
                                       addEllipses = TRUE, # Concentration ellipses
                                       ellipse.type = "confidence",
                                       legend.title = "Groups",
                                       repel = FALSE
)+
  labs(title="PC2-PCA3 - Agrupado por zona",x="PC2 (20.1%)", y="PC3 (11.5%)")+
   theme(plot.title = element_text(hjust = 0.5))  # Centrar el título


gridExtra::grid.arrange(PCA_12_zona, PCA_13_zona,  PCA_23_zona,
             ncol=1)

El análisis del agrupamiento realizado con la variable “estrato” muestra que esta variable tiene una relación más clara con los componentes principales. Se observa que los registros tienden a agruparse en clusters de acuerdo con el estrato. Este efecto es particularmente notable en el primer gráfico, lo cual es de esperar, ya que tanto el PCA 1 como el PCA 2, especialmente el segundo, muestran una alta contribución de la variable estrato a la variabilidad de los datos en estos componentes. Por lo tanto, los gráficos superior e inferior evidencian cómo los clusters tienden a situarse cerca del eje de los componentes 1 y 2.Esto indica que el estrato es una variable representativa para definir las características principales de los inmuebles.

library(factoextra)
library(gridExtra)

vivienda7 <- vivienda6
rownames(vivienda7)<-vivienda5$Id  

# verificar que zona es factor
estrato<-as.factor(vivienda5$Estrato)

PCA_12_zona<-fviz_pca_ind(res.pca,
                                       axes = c(1,2),
                                       col.ind = estrato, # color by groups
                                       palette = rainbow(4),
                                       addEllipses = TRUE, # Concentration ellipses
                                       ellipse.type = "confidence",
                                       legend.title = "Groups",
                                       repel = FALSE
)+
  labs(title="PC1-PCA2 - Agrupado por estrato",x="PC1 (50.8%)", y="PC2 (20.1%)") +
  theme(plot.title = element_text(hjust = 0.5))  # Centrar el título

PCA_13_zona<-factoextra::fviz_pca_ind(res.pca,
                                       axes = c(1,3),
                                       col.ind = estrato, # color by groups
                                       palette = rainbow(4),
                                       addEllipses = TRUE, # Concentration ellipses
                                       ellipse.type = "confidence",
                                       legend.title = "Groups",
                                       repel = FALSE
)+
  labs(title="PC1-PCA3 - Agrupado por estrato",x="PC1 (50.8%)", y="PC3 (11.5%)")+
   theme(plot.title = element_text(hjust = 0.5))  # Centrar el título

PCA_23_zona<-factoextra::fviz_pca_ind(res.pca,
                                       axes = c(2,3),
                                       col.ind = estrato, # color by groups
                                       palette = rainbow(4),
                                       addEllipses = TRUE, # Concentration ellipses
                                       ellipse.type = "confidence",
                                       legend.title = "Groups",
                                       repel = FALSE
)+
  labs(title="PC2-PCA3 - Agrupado por estrato",x="PC2 (20.1%)", y="PC3 (11.5%)")+
   theme(plot.title = element_text(hjust = 0.5))  # Centrar el título


gridExtra::grid.arrange(PCA_12_zona, PCA_13_zona,  PCA_23_zona,
             ncol=1)

La variable “tipo de inmueble” muestra la mayor relación con los componentes principales. Se observa que los registros se agrupan de manera bastante clara en las dos categorías principales: casa y apartamento. Este agrupamiento es especialmente notable en la relación entre PCA1 - PCA2 y PCA2 - PCA3, con los registros distribuyéndose alrededor de estos ejes. Esto sugiere que el tipo de inmueble es una variable determinante que influye significativamente en las características principales de los inmuebles. Es decir que el teipo de inumeble es una variable estatégica para las estrategias de marketing en la ciudad de Cali.

library(factoextra)
library(gridExtra)

vivienda7 <- vivienda6
rownames(vivienda7)<-vivienda5$Id  

# verificar que zona es factor
tipo<-as.factor(vivienda5$Tipo_inmueble)

PCA_12_zona<-fviz_pca_ind(res.pca,
                                       axes = c(1,2),
                                       col.ind = tipo, # color by groups
                                       palette = rainbow(2),
                                       addEllipses = TRUE, # Concentration ellipses
                                       ellipse.type = "confidence",
                                       legend.title = "Groups",
                                       repel = FALSE
)+
  labs(title="PC1-PCA2 - Agrupado por tipo de inmueble",x="PC1 (50.8%)", y="PC2 (20.1%)") +
  theme(plot.title = element_text(hjust = 0.5))  # Centrar el título

PCA_13_zona<-factoextra::fviz_pca_ind(res.pca,
                                       axes = c(1,3),
                                       col.ind = tipo, # color by groups
                                       palette = rainbow(2),
                                       addEllipses = TRUE, # Concentration ellipses
                                       ellipse.type = "confidence",
                                       legend.title = "Groups",
                                       repel = FALSE
)+
  labs(title="PC1-PCA3 - Agrupado por tipo de inmueble",x="PC1 (50.8%)", y="PC3 (11.5%)")+
   theme(plot.title = element_text(hjust = 0.5))  # Centrar el título

PCA_23_zona<-factoextra::fviz_pca_ind(res.pca,
                                       axes = c(2,3),
                                       col.ind = tipo, # color by groups
                                       palette = rainbow(2),
                                       addEllipses = TRUE, # Concentration ellipses
                                       ellipse.type = "confidence",
                                       legend.title = "Groups",
                                       repel = FALSE
)+
  labs(title="PC2-PCA3 - Agrupado por tipo de inmueble",x="PC2 (20.1%)", y="PC3 (11.5%)")+
   theme(plot.title = element_text(hjust = 0.5))  # Centrar el título


gridExtra::grid.arrange(PCA_12_zona, PCA_13_zona,  PCA_23_zona,
             ncol=1)

  • Análisis de relación de los PCA segmentado por tipo de inmueble

Se realizó un análisis de componentes principales (PCA) sobre un conjunto de datos inmobiliarios, segmentado en dos categorías: tipo casa y tipo apartamento. El objetivo era identificar patrones de asociación adicionales que pudieran proporcionar un análisis más detallado de los registros inmobiliarios.

Los resultados mostraron que, en el caso de los apartamentos, los tres primeros componentes principales explican el 83.5% de la varianza total, mientras que para las casas, esta cifra es del 78.5%. La varianza explicada por los componentes en el conjunto de apartamentos es muy similar a la obtenida en el análisis del conjunto completo. Asimismo, se observa que las variables con mayor peso en los componentes principales son las mismas en ambos casos, aunque con diferentes proporciones, y la mayoría de estas variables se concentran en el primer componente.

Estos hallazgos sugieren que la estructura subyacente del conjunto de datos no cambia significativamente al segmentar por tipo de inmueble, lo que indica que las mismas variables clave influyen en ambos segmentos, pero en distintas magnitudes.

# Filtrar los registros de tipo 'Apartamento'
apartamentos <- subset(vivienda5, Tipo_inmueble == "Apartamento")
apartamentos1 <- apartamentos %>% select(-Id, -Longitud, -Latitud,-Barrio, -Comuna, -Tipo_inmueble, - Zona)

casa <- subset(vivienda5, Tipo_inmueble == "Casa")
casa1 <- casa %>% select(-Id, -Longitud, -Latitud,-Barrio, -Comuna, -Tipo_inmueble, - Zona)

# PCA para apartamentos
res.pca_apart <- prcomp(apartamentos1, scale. = TRUE)

# PCA para casas
res.pca_casa <- prcomp(casa1, scale. = TRUE)


# Función para crear gráficos de varianza explicada y contribución de variables
create_plots <- function(pca_res, title_prefix) {
  # Varianza explicada
  eig <- fviz_eig(pca_res, addlabels = TRUE)
  p1 <- eig + 
        geom_line(color = "red", size = 0.8) + 
        theme(
            plot.title = element_text(hjust = 0.5)
        ) +
        labs(
            title = paste(title_prefix, "Varianza Explicada por Componentes Principales"),
            x = "Número de Componente",
            y = "Porcentaje de varianza explicada"
        )
  
  # Contribución de Variables a Componentes Principales
  num_pcs <- 3
  plots <- list()
  
  for (i in 1:num_pcs) {
    contrib_data <- fviz_contrib(pca_res, choice = "var", axes = i, top = 10)$data
    contrib_data <- contrib_data[order(-contrib_data$contrib), ]
    contrib_data$variable <- factor(rownames(contrib_data), levels = rownames(contrib_data))
    
    p <- ggplot(contrib_data, aes(x = variable, y = contrib, fill = variable)) +
      geom_bar(stat = "identity", color = "black", width = 0.7) +
      geom_text(aes(label = sprintf("%.1f%%", contrib), 
                    y = contrib + 2.0), 
                color = "black", 
                size = 3, 
                fontface = "bold") +
      labs(title = paste(title_prefix, "Contribución al PC", i), 
           x = "Variable", 
           y = "Contribución (%)") +
      theme_minimal() +
      theme(axis.text.x = element_text(angle = 45, hjust = 1), 
            legend.position = "none")
    
    plots[[i]] <- p
  }
  
  list(var_exp = p1, contribs = plots)
}

# Crear gráficos para apartamentos
plots_apart <- create_plots(res.pca_apart, "Apartamentos")

# Crear gráficos para casas
plots_casa <- create_plots(res.pca_casa, "Casas")

# Mostrar los gráficos para apartamentos
grid.arrange(
  plots_apart$var_exp,  # Gráfico de varianza explicada para apartamentos
  plots_apart$contribs[[1]], plots_apart$contribs[[2]], plots_apart$contribs[[3]],  # Contribución para PC1, PC2 y PC3
  nrow = 2, 
  ncol = 3, 
  layout_matrix = rbind(c(1, 1, 1), c(2, 3, 4))
)

# Mostrar los gráficos para casas
grid.arrange(
  plots_casa$var_exp,  # Gráfico de varianza explicada para casas
  plots_casa$contribs[[1]], plots_casa$contribs[[2]], plots_casa$contribs[[3]],  # Contribución para PC1, PC2 y PC3
  nrow = 2, 
  ncol = 3, 
  layout_matrix = rbind(c(1, 1, 1), c(2, 3, 4))
)

# Realizar PCA para cada tipo de inmueble
res.pca.list <- list(
  Apartamento = prcomp(apartamentos1, scale. = TRUE),
  Casa = prcomp(casa1, scale. = TRUE)
)

# Crear una lista con zonas correspondientes
zona.list <- list(
  Apartamento = as.factor(apartamentos$Zona),
  Casa = as.factor(casas$Zona)
)

# Crear gráficos PCA para cada tipo de inmueble
plots <- list()

for (tipo in names(res.pca.list)) {
  res.pca <- res.pca.list[[tipo]]
 
   # Obtener la variable de color correspondiente para el tipo de inmueble
  zona <- zona.list[[tipo]]
  
  PCA_12 <- fviz_pca_ind(res.pca,
                         axes = c(1,2),
                         col.ind = zona,
                         palette = rainbow(5),
                         addEllipses = TRUE,
                         ellipse.type = "confidence",
                         legend.title = "Groups",
                         repel = FALSE) +
    labs(title = paste("PC1-PCA2 -", tipo), x = "PC1 (50.8%)", y = "PC2 (20.1%)") +
    theme(plot.title = element_text(hjust = 0.5))
  
  PCA_13 <- fviz_pca_ind(res.pca,
                         axes = c(1,3),
                         col.ind = zona,
                         palette = rainbow(5),
                         addEllipses = TRUE,
                         ellipse.type = "confidence",
                         legend.title = "Groups",
                         repel = FALSE) +
    labs(title = paste("PC1-PCA3 -", tipo), x = "PC1 (50.8%)", y = "PC3 (11.5%)") +
    theme(plot.title = element_text(hjust = 0.5))
  
  PCA_23 <- fviz_pca_ind(res.pca,
                         axes = c(2,3),
                         col.ind = zona,
                         palette = rainbow(5),
                         addEllipses = TRUE,
                         ellipse.type = "confidence",
                         legend.title = "Groups",
                         repel = FALSE) +
    labs(title = paste("PC2-PCA3 -", tipo), x = "PC2 (20.1%)", y = "PC3 (11.5%)") +
    theme(plot.title = element_text(hjust = 0.5))
  
  # Añadir gráficos a la lista
  plots[[paste(tipo, "12")]] <- PCA_12
  plots[[paste(tipo, "13")]] <- PCA_13
  plots[[paste(tipo, "23")]] <- PCA_23
}

# Disposición de los gráficos en dos columnas
gridExtra::grid.arrange(
  # Apartamentos
  plots[["Apartamento 12"]], plots[["Apartamento 13"]], plots[["Apartamento 23"]],
  # Casas
  plots[["Casa 12"]], plots[["Casa 13"]], plots[["Casa 23"]],
  ncol = 3,
  layout_matrix = rbind(c(1, 2, 3),
                         c(4, 5, 6))
)
# Realizar PCA para cada tipo de inmueble
res.pca.list <- list(
  Apartamento = prcomp(apartamentos1, scale. = TRUE),
  Casa = prcomp(casa1, scale. = TRUE)
)

# Crear una lista con zonas correspondientes
estrato.list <- list(
  Apartamento = as.factor(apartamentos$Estrato),
  Casa = as.factor(casas$Estrato)
)

# Crear gráficos PCA para cada tipo de inmueble
plots <- list()

for (tipo in names(res.pca.list)) {
  res.pca <- res.pca.list[[tipo]]
 
   # Obtener la variable de color correspondiente para el tipo de inmueble
  estrato <- estrato.list[[tipo]]
  
  PCA_12 <- fviz_pca_ind(res.pca,
                         axes = c(1,2),
                         col.ind = estrato,
                         palette = rainbow(4),
                         addEllipses = TRUE,
                         ellipse.type = "confidence",
                         legend.title = "Groups",
                         repel = FALSE) +
    labs(title = paste("PC1-PCA2 -", tipo), x = "PC1 (50.8%)", y = "PC2 (20.1%)") +
    theme(plot.title = element_text(hjust = 0.5))
  
  PCA_13 <- fviz_pca_ind(res.pca,
                         axes = c(1,3),
                         col.ind = estrato,
                         palette = rainbow(4),
                         addEllipses = TRUE,
                         ellipse.type = "confidence",
                         legend.title = "Groups",
                         repel = FALSE) +
    labs(title = paste("PC1-PCA3 -", tipo), x = "PC1 (50.8%)", y = "PC3 (11.5%)") +
    theme(plot.title = element_text(hjust = 0.5))
  
  PCA_23 <- fviz_pca_ind(res.pca,
                         axes = c(2,3),
                         col.ind = estrato,
                         palette = rainbow(4),
                         addEllipses = TRUE,
                         ellipse.type = "confidence",
                         legend.title = "Groups",
                         repel = FALSE) +
    labs(title = paste("PC2-PCA3 -", tipo), x = "PC2 (20.1%)", y = "PC3 (11.5%)") +
    theme(plot.title = element_text(hjust = 0.5))
  
  # Añadir gráficos a la lista
  plots[[paste(tipo, "12")]] <- PCA_12
  plots[[paste(tipo, "13")]] <- PCA_13
  plots[[paste(tipo, "23")]] <- PCA_23
}

# Disposición de los gráficos en dos columnas
gridExtra::grid.arrange(
  # Apartamentos
  plots[["Apartamento 12"]], plots[["Apartamento 13"]], plots[["Apartamento 23"]],
  # Casas
  plots[["Casa 12"]], plots[["Casa 13"]], plots[["Casa 23"]],
  ncol = 3,
  layout_matrix = rbind(c(1, 2, 3),
                         c(4, 5, 6))
)

4.2 Análisis de Conglomerados

El análisis de conglomerados, también conocido como clustering, es una técnica de aprendizaje no supervisado utilizada para agrupar un conjunto de datos en subconjuntos homogéneos denominados conglomerados o clusters. Los elementos dentro de un conglomerado presentan una mayor similitud entre sí en comparación con los elementos de otros conglomerados. Este método es especialmente útil para descubrir patrones y relaciones subyacentes en los datos, particularmente cuando no se dispone de información previa sobre las categorías o etiquetas de los datos.

El análisis de conglomerados se aplica en una variedad de contextos, como marketing, biología, reconocimiento de patrones y análisis de imágenes, cuando se desea segmentar datos en grupos naturales. Funciona de manera más efectiva con variables numéricas, ya que permite evaluar la similitud entre elementos utilizando medidas de distancia, como la distancia euclidiana, Manhattan o Minkowski.

Existen diferentes métodos para llevar a cabo el análisis de conglomerados. El K-means clustering es uno de los más populares, en el cual los datos se agrupan en un número predefinido de k conglomerados mediante la minimización de la varianza dentro de cada uno. Aunque es rápido y eficiente, requiere que se especifique de antemano el número de conglomerados. Otro enfoque es el hierarchical clustering, que no requiere especificar el número de conglomerados y puede ser aglomerativo, comenzando con cada punto como un conglomerado individual y fusionando los más similares, o divisivo, comenzando con un único conglomerado que incluye todos los puntos y dividiéndolo en conglomerados más pequeños. Por último, el método DBSCAN (Density-Based Spatial Clustering of Applications with Noise) agrupa puntos basándose en la densidad, lo que permite identificar conglomerados de formas arbitrarias y manejar bien el ruido en los datos.

4.2.1 Aplicación de análisis de conglomerados

Teniendo en cuenta lo anterior, se selecciona la técnica de K-means para realizar el análisis. Es importante primero llevar a cabo una normalización, ya que en esta técnica se utiliza la distancia euclidiana para asignar puntos a conglomerados. Sin la normalización, una variable con un rango mayor podría distorsionar las distancias, lo que influenciaría la formación de los conglomerados de manera no

Al evaluar el índice de silueta promedio para diferentes valores de k en el análisis de clustering K-means, se observa que el valor más alto se presenta para k=2 con un índice de 0.53. Este valor indica una separación relativamente buena entre los dos clusters. Sin embargo, a medida que aumentamos el número de clusters, el índice de silueta promedio tiende a disminuir: k=3 muestra un índice de 0.21, k=4 se sitúa en 0.22, y k=5 en 0.23. A partir de k=6, el índice de silueta comienza a caer, alcanzando 0.20 para k=6, 0.21 para k=7 y 0.18 para k=8.

Este descenso en el índice de silueta promedio con valores más altos de k sugiere que los clusters generados a partir de más de cinco grupos tienden a ser menos homogéneos y más difusos. En el contexto inmobiliario, esto puede implicar que el modelo con k=2 ofrece una representación más clara y diferenciada de los segmentos de mercado, reflejando mejor las características distintas entre dos grandes tipos de inmuebles.

Este análisis de K-means contrasta con los resultados del análisis de componentes principales (para PCA1-PCA2), donde la agrupación por tipo de inmueble mostró una separación significativa entre los conjuntos de datos segmentados. La mayor relación observada en el PCA con respecto al tipo de inmueble destaca una influencia importante del tipo de propiedad en la segmentación del mercado inmobiliario. Por lo tanto, mientras que el análisis de K-means revela la estabilidad de dos grandes grupos, la variabilidad observada con valores mayores de k puede indicar que la segmentación basada en más de dos clusters no proporciona una separación significativa, reforzando la importancia del tipo de inmueble en el marketing inmobiliario.

knitr::opts_chunk$set(echo = TRUE)

library(shiny)
library(ggplot2)
library(cluster)
library(factoextra)

# Normalizar los datos
datos <- scale(vivienda6)

# Interfaz de usuario de Shiny
ui <- fluidPage(
  titlePanel("Análisis K-means Clustering Interactivo"),
  
  sidebarLayout(
    sidebarPanel(
      sliderInput("clusters", "Número de Clusters (k):",
                  min = 2, max = 10, value = 2)
    ),
    
    mainPanel(
      plotOutput("clusterPlot"),
      plotOutput("silhouettePlot"),
      tableOutput("silhouetteTable")  # Agrega un espacio para mostrar la tabla
    )
  )
)

# Servidor de Shiny
server <- function(input, output) {
  
  output$clusterPlot <- renderPlot({
    set.seed(123)
    kmeans_result <- kmeans(datos, centers = input$clusters, nstart = 25)
    
    # Gráfico de clusters
    fviz_cluster(kmeans_result, data = datos, 
                 geom = "point", ellipse.type = "norm") +
      labs(title = paste("Gráfico Cluster con k =", input$clusters))
  })

  output$silhouettePlot <- renderPlot({
    set.seed(123)
    kmeans_result <- kmeans(datos, centers = input$clusters, nstart = 25)
    
    # Calcular silhouette
    silhouette_score <- silhouette(kmeans_result$cluster, dist(datos))
    
    # Gráfico de silhouette
    fviz_silhouette(silhouette_score) +
      labs(title = paste("Gráfico Silhouette con k =", input$clusters))
  })
  
   output$silhouetteTable <- renderTable({
    set.seed(123)
    kmeans_result <- kmeans(datos, centers = input$clusters, nstart = 25)
    
    # Calcular silhouette
    silhouette_score <- silhouette(kmeans_result$cluster, dist(datos))
    
    # Crear una tabla con el número de cluster y el valor promedio de silhouette
    silhouette_summary <- aggregate(silhouette_score[, 3], 
                                    by = list(Cluster = silhouette_score[, 1]), 
                                    FUN = mean)
    colnames(silhouette_summary) <- c("Cluster", "Silhouette Score Promedio")
    silhouette_summary
  })
  
}

# Ejecutar la aplicación Shiny
shinyApp(ui = ui, server = server)

4.3 Análisis de Correspondencias

El Análisis de Correspondencia es una técnica estadística multivariante que se utiliza para analizar y visualizar las relaciones entre variables categóricas en una tabla de contingencia. Este método es especialmente útil cuando se busca explorar patrones de asociación o correspondencia entre dos o más variables categóricas, permitiendo representar estas relaciones en un espacio de baja dimensionalidad, generalmente en un plano bidimensional. Al mapear las categorías de las variables en este espacio, el análisis permite identificar grupos de categorías que están asociadas entre sí y observar cómo se relacionan con otras categorías. En el contexto del análisis de mercado inmobiliario, por ejemplo, el Análisis de Correspondencia puede ayudar a identificar cómo diferentes tipos de viviendas se distribuyen en distintas zonas o barrios, lo que a su vez puede ofrecer insights valiosos para estrategias de marketing y segmentación del mercado.

4.3.1 Verificación de no independencia entre variables

En el análisis de conglomerados, la prueba de Chi-cuadrado se utiliza para evaluar la independencia entre las variables categóricas antes de aplicar técnicas como el análisis de correspondencia. Esta prueba nos permite verificar si las variables categóricas, como el tipo de inmueble, la zona y el barrio, están significativamente asociadas entre sí, o si sus distribuciones son independientes. En el contexto inmobiliario, aplicar la prueba de Chi-cuadrado es crucial para asegurar que las relaciones entre variables, como las características de los inmuebles y su ubicación, sean lo suficientemente fuertes para justificar un análisis más profundo. Un valor p menor a 0.05 indica que existe una asociación significativa entre las variables, lo que valida el uso del análisis de correspondencia para explorar y visualizar estas relaciones en detalle.

Los resultados de las pruebas de chi-cuadrado realizadas sobre las relaciones entre las variables categóricas del dataset vivienda5 revelan patrones significativos en el mercado inmobiliario. Las asociaciones detectadas entre zonas, estratos, barrios y tipos de inmuebles indican que estas variables están estrechamente vinculadas, lo que sugiere que la distribución de propiedades varía considerablemente según la zona y el estrato. Por ejemplo, la alta significancia en la relación entre la zona y el tipo de inmueble indica que ciertos tipos de inmuebles predominan en áreas específicas, lo que puede reflejar preferencias del mercado o restricciones de oferta en diferentes zonas. Asimismo, la fuerte asociación entre estrato y barrio muestra cómo las características socioeconómicas influyen en la ubicación de los barrios, lo que podría afectar el valor de las propiedades y las oportunidades de desarrollo en esas áreas. En el contexto inmobiliario, estos hallazgos son importantes para diseñar estrategias de marketing más efectivas, orientar el desarrollo urbano y realizar inversiones más informadas, ajustando las ofertas a las características demográficas y geográficas del mercado.

library(FactoMineR)
library(factoextra)
library(gridExtra)

# Convertir variables a factores si no lo están
vivienda5$Tipo_inmueble <- as.character(vivienda5$Tipo_inmueble)
vivienda5$Zona <- as.character(vivienda5$Zona)
vivienda5$Barrio <- as.character(vivienda5$Barrio)
vivienda5$Estrato <- as.character(vivienda5$Estrato)

# Construcción de tablas cruzadas 
tablas <- list(
  "Zona - Estrato" = table(vivienda5$Zona, vivienda5$Estrato),
  "Zona - Barrio" = table(vivienda5$Zona, vivienda5$Barrio),
  "Zona - Tipo_inmueble" = table(vivienda5$Tipo_inmueble, vivienda5$Zona),
  "Estrato - Tipo_inmueble" = table(vivienda5$Estrato, vivienda5$Tipo_inmueble),
  "Estrato - Barrio" = table(vivienda5$Estrato, vivienda5$Barrio),
  "Tipo_inmueble - Barrio" = table(vivienda5$Tipo_inmueble, vivienda5$Barrio)
)

# Definir una función para realizar las pruebas y extraer los resultados
test_chisq <- function(tabla) {
  test <- chisq.test(tabla)
  p_value <- ifelse(is.null(test$p.value), NA, test$p.value)
  result <- data.frame(
    "Chi-squared" = test$statistic,
    "Degrees of Freedom" = test$parameter,
    "p-value" = p_value
  )
  return(result)
}

# Aplicar la función a cada tabla
resultados <- lapply(tablas, test_chisq)

# Convertir los resultados en un data frame para su visualización
resultados_df <- do.call(rbind, lapply(names(resultados), function(x) {
  cbind(Prueba = x, resultados[[x]])
}))

# Mostrar los resultados
print(resultados_df)
##                             Prueba Chi.squared Degrees.of.Freedom       p.value
## X-squared           Zona - Estrato   3830.7812                 12  0.000000e+00
## X-squared1           Zona - Barrio  32340.0000                872  0.000000e+00
## X-squared2    Zona - Tipo_inmueble    482.7805                  4 3.548693e-103
## X-squared3 Estrato - Tipo_inmueble    204.5627                  3  4.357576e-44
## X-squared4        Estrato - Barrio  14153.7869                654  0.000000e+00
## X-squared5  Tipo_inmueble - Barrio   2152.4545                218 9.329394e-315

4.3.2 Aplicación de análisis de correspondencia

A partir de los mapas factoriales, se observa una relación significativa entre zonas y estratos en el mercado inmobiliario de Cali. La Zona Norte, Zona Centro y Zona Oriente están relativamente asociadas con el Estrato 3, lo que sugiere que estas áreas podrían estar caracterizadas por propiedades de estrato medio-bajo o incluso inferior, dadas las distancias evidenciadas. Esto implica que estas zonas pueden ofrecer propiedades más accesibles o con características más básicas. En contraste, la Zona Oeste, situada en el cuadrante superior izquierdo, muestra una fuerte asociación con los Estratos 5 y 6, indicando que esta zona es conocida por su desarrollo residencial de mayor calidad. Por otro lado, en el cuadrante inferior izquierdo, la Zona Sur y el Estrato 4 están vinculados, sugiriendo una oferta de propiedades de calidad intermedia. La relación entre zonas y barrios muestra una agrupación estrecha, con distancias muy próximas entre ellos, lo que indica una fuerte asociación. En cuanto al análisis de barrios frente a estratos, se observa una mayor dispersión, con una concentración significativa de registros en los estratos 5, 3 y 4, y una menor cantidad en el estrato 6. Esto refleja la división socioeconómica del municipio de Cali y ayuda a comprender mejor el mercado inmobiliario local.

# Ejecutar el análisis de correspondencia para cada tabla
resultados_ac <- lapply(tablas, function(tabla) {
  tryCatch({
    CA(tabla)
  }, error = function(e) {
    message(paste("Error en el análisis de Correspondencia:", e$message))
    NULL
  })
})

# Función para crear gráficos de mapas factoriales
crear_grafico_factorial <- function(resultados_ac, titulo) {
  fviz_ca_biplot(resultados_ac, repel = TRUE) +
    labs(title = titulo, x = "Dimensión 1", y = "Dimensión 2") +
    theme_minimal() +
    theme(
      plot.title = element_text(size = 12, face = "bold"),
      axis.title = element_text(size = 10),
      axis.text = element_text(size = 10)
    )
}

A partir de las gráficas de varianza explicada para las diferentes relaciones entre las características categóricas de los inmuebles, se observan tres patrones distintos. En el caso de la relación entre “Zona” y “Estrato”, así como entre “Estrato” y “Barrio”, la varianza del conjunto de datos es explicada principalmente por tres dimensiones en el espacio factorial. Para la primera relación, la varianza explicada por la primera dimensión es del 94.13%, lo que indica que esta dimensión es casi suficiente para capturar la relación existente entre estas dos variables. En contraste, la relación entre “Estrato” y “Barrio” se explica en un 84.45% por las dos primeras dimensiones.

Por otro lado, el segundo comportamiento característico se observa en las relaciones entre “Estrato” y “Tipo de inmueble”, “Zona” y “Tipo de inmueble”, y “Barrio” con “Tipo de inmueble”, donde la varianza es explicada en su totalidad por una sola dimensión, lo que sugiere una fuerte relación directa entre estas variables.

Finalmente, el comportamiento entre “Zona” y “Barrio” se caracteriza por la existencia de cuatro dimensiones, cada una explicando una proporción similar de la varianza, con aproximadamente un 25% cada una. Esto sugiere una relación más dispersa y equitativa entre estas dos variables, sin una dimensión predominante que explique la mayor parte de la varianza.

library(FactoMineR)
library(factoextra)
library(gridExtra)
library(ggplot2)

# Suponiendo que las tablas cruzadas están en la lista 'tablas'
# Crear una lista para almacenar los gráficos de varianza explicada
eig_plots <- list()

# Iterar sobre la lista de tablas cruzadas para realizar el Análisis de Correspondencia y crear los gráficos
for (i in 1:length(tablas)) {
  # Realizar el Análisis de Correspondencia
  ac_result <- CA(tablas[[i]], graph = FALSE)
  
  # Crear un dataframe con la varianza explicada
  var_explained_df <- data.frame(
    Dim = 1:nrow(ac_result$eig),
    Eigenvalue = ac_result$eig[, 1],
    Percentage = ac_result$eig[, 2]
  )
  
  # Crear el gráfico de varianza explicada con una línea roja que una los porcentajes
  eig_plot <- ggplot(var_explained_df, aes(x = Dim, y = Percentage)) +
    geom_bar(stat = "identity", fill = "lightgray", color = "black", width = 0.4) +
    geom_line(color = "red", size = 0.8) +  # Línea roja que une los porcentajes
    geom_point(color = "black", size = 1.5) + # Puntos rojos en los porcentajes
    geom_text(aes(label = paste(round(Percentage, 2),"%")), vjust = -0.5, color = "black") +
    ggtitle(paste("Varianza Explicada - Tabla", names(tablas)[i])) +
    xlab("Dimensiones") + ylab("Porcentaje de Varianza Explicada") +
    ylim(0, max(var_explained_df$Percentage) * 1.2) +
    theme_minimal()
  
  # Añadir el gráfico a la lista
  eig_plots[[i]] <- eig_plot
}

# Organizar los gráficos en una disposición 3x2
do.call(grid.arrange, c(eig_plots, nrow = 3, ncol = 2))

#summary(resultados_ac)

Análisis de la influencia de las categorías en la primera dimensión del AC

En el diagrama de contribución para la relación entre Zona y Estrato en la primera dimensión del Análisis de Correspondencia, se observa que la Zona Norte representa casi el 68% de la varianza, lo que indica una alta influencia de esta zona en esta dimensión. Esto sugiere que las propiedades en la Zona Norte tienen características que se alinean significativamente con la primera dimensión. La Zona Oriente también contribuye, pero en menor medida, con un 15%, lo que indica una influencia secundaria. En cuanto a los estratos, el Estrato 3 representa casi el 80% de la varianza en la primera dimensión, destacándose como la categoría más influyente en esta dimensión. Este patrón sugiere que las propiedades en el Estrato 3 son las que más definen esta dimensión. En conjunto, estos resultados indican que la Zona Norte y el Estrato 3 son fundamentales para entender la estructura de los datos en esta dimensión, proporcionando información clave para la toma de decisiones en el mercado inmobiliario de Cali.

En la relación entre Zona y Barrio, el Análisis de Correspondencia revela que los barrios La Flora y Santa Teresita son los que más contribuyen a esta relación. En términos de zonas, la Zona Oriente destaca con una contribución cercana al 70%. Este hallazgo es coherente, ya que ambos barrios están ubicados en el Oeste de Cali, lo que refuerza la asociación significativa entre la Zona Oriente y estos barrios específicos.

Finalmente, en la relación entre Barrios y Estratos, el Análisis de Correspondencia muestra una clara influencia del Estrato 3, que representa casi el 70% de la contribución a esta dimensión. Entre los barrios, aquellos que más aportan a esta relación incluyen Parcelaciones Pance, Ciudad Jardín y Santa Teresita, todos pertenecientes al Estrato 6 en Cali. Además, un gran porcentaje de barrios del Estrato 3, como Salomia, Meléndez, Torres de Confandi, entre otros, también contribuyen significativamente. Este patrón resalta la importancia del Estrato 3 y muestra cómo las características de los barrios están estrechamente vinculadas a los estratos económicos en el contexto del mercado inmobiliario de Cali.

# Tabla Zona - Estrato

# Realiza el Análisis de Correspondencia
ac_result <- CA(tablas[[1]], graph = FALSE)

# Visualiza la contribución de las filas (Zona) 
contrib_row <- fviz_contrib(ac_result, choice = "row", axes = 1) + 
  ggtitle("Contribucion de las Zona") +
  theme(plot.title = element_text(hjust = 0.5))  # Centra el título
  
# Visualiza la contribución de las columnas (Estrato) c
contrib_col <- fviz_contrib(ac_result, choice = "col", axes = 1) + 
  ggtitle("Contribucion del Estrato") +
  theme(plot.title = element_text(hjust = 0.5))  # Centra el título
  
# Organiza las gráficas en un subplot de 2 filas y 1 columna
grid.arrange(contrib_row, contrib_col, nrow = 2)

#  Tabla Zona - Barrio 
# Realiza el Análisis de Correspondencia
ac_result <- CA(tablas[[2]], graph = FALSE)

# Visualiza la contribución de las filas (Zona) 
contrib_row <- fviz_contrib(ac_result, choice = "row", axes = 1) + 
  ggtitle("Contribucion de las Zona") +
  theme(plot.title = element_text(hjust = 0.5))  # Centra el título
  
# Visualiza la contribución de las columnas (Estrato) c
contrib_col <- fviz_contrib(ac_result, choice = "col", axes = 1) + 
  ggtitle("Contribucion del Barrio") +
  theme(plot.title = element_text(hjust = 0.5))  # Centra el título
  
# Organiza las gráficas en un subplot de 2 filas y 1 columna
grid.arrange(contrib_row, contrib_col, nrow = 2)

# Tabla Estrato - Barrio
# Realiza el Análisis de Correspondencia
ac_result <- CA(tablas[[5]], graph = FALSE)

# Visualiza la contribución de las filas (Zona) 
contrib_row <- fviz_contrib(ac_result, choice = "row", axes = 1) + 
  ggtitle("Contribucion de las Estrato") +
  theme(plot.title = element_text(hjust = 0.5))  # Centra el título
  
# Visualiza la contribución de las columnas (Estrato) c
contrib_col <- fviz_contrib(ac_result, choice = "col", axes = 1) + 
  ggtitle("Contribucion del Barrio") +
  theme(plot.title = element_text(hjust = 0.5))  # Centra el título
  
# Organiza las gráficas en un subplot de 2 filas y 1 columna
grid.arrange(contrib_row, contrib_col, nrow = 2)

5 CONCLUSIONES

6 ANEXO

6.1 Análisis exploratorio de los datos

La exploración de los datos es una de las etapa más importante en el proceso de análisis de datos, cuyo objetivo es comprender las características principales de un conjunto de datos antes de aplicar modelos estadísticos o técnicas de machine learning. Este análisis incluye la identificación de patrones, detección de anomalías, verificación de suposiciones y la comprensión de la estructura de los datos. La base de datos de bienes raíces empleada para el análisis, se muestra en la siguiente tabla.

library(DT)
library(paqueteMODELOS)

data(vivienda)  # Carga de los datos 
vivienda1=vivienda # Crea una copia de la base de datos

#Renombramiento de variables
colnames(vivienda1)<- c("id","Zona","Piso","Estrato","Precio_m","Area_construida","No_Parqueaderos","No_banios","No_habitaciones","Tipo_inmueble","Barrio","Longitud","Latitud")


datatable(vivienda, filter="top", options = list(pageLength = 5, scrollX=T))%>%
  formatStyle(names(vivienda), backgroundColor = "lightgray")

6.1.1 Análisis univariado

Dentro del análisis exploratorio se encuentra el análisis univariado, el cual se centra en la evaluación de una sola variable a la vez. Este tipo de análisis utiliza estadísticas resumen como la media, mediana, moda, desviación estándar y percentiles para proporcionar una visión general de la distribución de la variable. También se utilizan visualizaciones como histogramas, gráficos de barras y diagramas de caja para representar gráficamente la distribución y detectar posibles outliers.

Identificación de tipos de datos

Identificar el tipo de variable al comenzar un análisis estadístico es importante para determinar el enfoque metodológico adecuado y seleccionar las herramientas estadísticas apropiadas. Las variables se clasifican en cualitativas (categóricas) y cuantitativas (numéricas), y esta clasificación es esencial para aplicar las técnicas estadísticas correctas.

Las variables cualitativas requieren métodos específicos de análisis, como pruebas de frecuencia y proporción, mientras que las variables cuantitativas se abordan mediante técnicas estadísticas como la media, la mediana y la desviación estándar.

En el conjunto de datos de interés, se identifican un total de 9 variables cuantitativas de tipo numérico y 4 variables cualitativas (categóricas) de tipo carácter. De estas últimas, 3 son ordinales y 1 es nominal.

library(DT)

# Filtrar variables numéricas y de tipo carácter
numericas <- sapply(vivienda1, is.numeric)
caracteres <- sapply(vivienda1, is.character)

# Crear data frames para cada tipo
tabla_numericas <- data.frame(
  Variable = names(numericas[numericas]),
  Tipo = sapply(vivienda1[numericas], class)
)

tabla_caracteres <- data.frame(
  Variable = names(caracteres[caracteres]),
  Tipo = sapply(vivienda1[caracteres], class)
)

# Mostrar las tablas 
datatable(tabla_numericas, filter = "top", options = list(pageLength = 5, scrollX = TRUE)) %>%
  formatStyle(columns = 'Variable', backgroundColor = 'lightgray')
datatable(tabla_caracteres, filter = "top", options = list(pageLength = 5, scrollX = TRUE)) %>%
  formatStyle(columns = 'Variable', backgroundColor = 'lightgray')

Distribución de los datos

  • Variables Cuantitativas

A partir del análisis de los siguientes gráficos estadísticos, se observa que las variables continuas, como el área construida y el precio, presentan una distribución sesgada hacia la derecha. Esto indica que la mayoría de los datos se concentran en valores bajos tanto para el área construida como para el precio, una asimetría confirmada por los gráficos cuantil-cuantil, los cuales muestran que los datos no siguen una distribución normal.

Por otro lado, las variables discretas, como el estrato y el número de habitaciones, muestran una mayor simetría en comparación con las variables número de baños y parqueaderos, que presentan un sesgo hacia la derecha. Este comportamiento se contrasta con los diagramas de cajas y bigotes, los cuales evidencian la presencia de datos atípicos en la mayoría de las variables, especialmente en las variables precio y área construida. Asimismo, se observa que la mayoría de los inmuebles, son estrato 5, cuentan con 1 parqueadero, 2 baños y 3 habitaciones.

library(dplyr)
library(ggplot2)
library(gridExtra)
library(grid) 

# Filtrar solo las variables numéricas
vivienda_numericas <- vivienda1 %>% select(where(is.numeric))

# Asegurar el tipo numérico
vivienda_numericas <- vivienda_numericas %>%
  mutate(across(everything(), as.numeric))

# Eliminar la columna id
vivienda_numericas <- vivienda_numericas%>% 
  select(-id)

# Crear una lista para almacenar los histogramas
histogramas <- list()

# Crear un histograma para cada variable numérica
binwidths <- c(0.5, 60, 60, 0.5, 0.5, 0.5, 0.03, 0.03)

for (i in seq_along(vivienda_numericas)) {
  p <- ggplot(vivienda_numericas, aes_string(x = names(vivienda_numericas)[i])) +
    geom_histogram(binwidth = binwidths[i], fill = 'darkgray', color = 'black', alpha = 0.7) +
    labs(x = names(vivienda_numericas)[i],
         y = 'Frecuencia') +
    theme_minimal()+
    theme(axis.title.x = element_text(size = 9),   
    axis.title.y = element_text(size = 9))
   
  #Almacenar histogramas
  histogramas[[i]] <- p
}

# Crear un texto general para el título
titulo_general <- textGrob("Histogramas de Distribucion de Variables", 
                            gp = gpar(fontsize = 14, fontface = "bold"))

# Crear el subplot con grid.arrange y agregar el título general
grid.arrange(
  do.call("arrangeGrob", c(histogramas, ncol = 2)),
  top = titulo_general
)

library(ggplot2)
library(gridExtra)
library(grid) 

# Seleccionar las variables continuas
variables_continuas <- vivienda_numericas %>% select(Precio_m, Area_construida)

# Crear una lista para almacenar los gráficos Q-Q
qq_plots <- list()

# Lista con los nombres de las variables para usar en el loop
var_names <- names(variables_continuas)

# Generar un gráfico Q-Q para cada variable continua
for (i in seq_along(var_names)) {
  var_name <- var_names[i]
  qq_plots[[i]] <- ggplot(variables_continuas, aes(sample = .data[[var_name]])) +
    stat_qq() +
    stat_qq_line(color = "red") +
    labs(x = "Cuantiles Teoricos",
         y = "Cuantiles Muestrales") +
    theme_minimal() +
    theme(
      axis.title.x = element_text(size = 9),
      axis.title.y = element_text(size = 9),
      )
}

# Combinar los gráficos Q-Q en un subplot de 1x2
grid.arrange(
  grobs = qq_plots,
  ncol = 2,
  top = textGrob("Diagrama Q-Q de las Variables Continuas", gp = gpar(fontsize = 14, fontface = "bold"))
)

# Crear una lista para almacenar los gráficos de boxplot
boxplots <- list()

# Lista con los nombres de las variables numéricas para usar en el loop
var_names <- names(vivienda_numericas)

# Generar un gráfico de boxplot para cada variable numérica
for (i in seq_along(var_names)) {
  var_name <- var_names[i]
  boxplots[[i]] <- ggplot(vivienda_numericas, aes(x = .data[[var_name]], y ="" )) +
    geom_boxplot(fill = "darkgray", color = "black") +
    labs(x = var_name,
         y = "") +
    theme_minimal() +
    theme(
      axis.title.x = element_text(size = 9),
      axis.title.y = element_text(size = 9),
      
    )
}

# Combinar los gráficos de boxplot en un subplot de 4x2
grid.arrange(
  grobs = boxplots,
  ncol = 2,
  nrow = 4,
  top = textGrob("Boxplots de las Variables Numericas", gp = gpar(fontsize = 14, fontface = "bold"))
)

  • Variables Cualitativas

El gráfico de barras permite identificar la categoría más frecuente en cada una de las variables analizadas. En este caso, se observa que las tres variables presentan datos faltantes, siendo la variable “Piso” la que tiene mayor afectación. Además, la mayoría de los registros están localizados en el sur de Cali, son de tipo apartamento y, dentro de las unidades residenciales, se encuentran ubicados entre el 1 y el 5 piso, siendo el segundo piso el más frecuente. Esta información es relevante para realizar la imputación de los datos faltantes, especialmente cuando se combina con las relaciones que puedan existir con otras variables.

# Filtrar solo las variables cualitativas
vivienda_char <- vivienda1 %>% select(where(is.character))

# Convertir las variables cualitativas a factores
vivienda_char <- vivienda_char %>% mutate(across(everything(), as.factor))

# Eliminar la columna Barrio
vivienda_char <- vivienda_char%>% 
  select(-Barrio)

# Crear una lista para almacenar los gráficos
plots <- list()

# Crear diagramas de barras para cada variable cualitativa

binwidths <- c(0.5, 1, 0.2)
for (col in names(vivienda_char)) {
  p <- ggplot(vivienda_char, aes_string(x = col)) +
    geom_bar(binwidth = binwidths[i],fill = "darkgray", color = "black") +
    labs(title = col, x = '', y = 'Frecuencia') +
    theme(axis.title.x = element_text(size = 9),  # Tamaño del título del eje x
      axis.title.y = element_text(size = 9),  # Tamaño del título del eje y
      axis.text.x = element_text(size = 9, angle = 45, hjust = 1),  # Tamaño del texto del eje x
      axis.text.y = element_text(size = 9),  # Tamaño del texto del eje y
      plot.title = element_text(size = 11, face = "bold", hjust = 0.5) )
  
  plots[[col]] <- p
}

# Ajustar la cantidad de gráficos a 2x2
grid.arrange(
  grobs = plots, 
  nrow = 2, 
  ncol = 2, 
  top = textGrob("Diagrama de barras variables categoricas", 
                 gp = gpar(fontsize = 14, fontface = "bold"))
)

6.1.2 Análisis bivariado

  • Variables Cuantitativas

El análisis de correlación permite inferir que las relaciones más fuertes se observan entre el precio de los inmuebles y las variables estrato, área construida, número de parqueaderos y número de baños. Esta es una relación directa muy común en el mercado inmobiliario.

library(GGally)

# Eliminar la columna lon y lat
corr_matrix <- vivienda_numericas%>% 
  select(-Longitud,-Latitud)


# Crear el pair plot
ggpairs(corr_matrix%>% select(where(is.numeric)))

  • Variables Cualitativas

El gráfico de barras apiladas muestra la relación entre las variables categóricas, permitiendo observar que en todas las zonas de Cali, la mayoría de los inmuebles de tipo casa tienen hasta 3 pisos, excepto en la zona oriente, donde pueden llegar a tener hasta 4 pisos. Por otro lado, los apartamentos constituyen la mayoría de los inmuebles construidos a partir del quinto piso, un comportamiento que se mantiene en todas las zonas de Cali, salvo en la zona oriente, donde en el piso 10 se cataloga un inmueble como casa. Esto podría ser un error de clasificación o un inmueble con un área construida bastante grande, semejante a una casa. Adicionalmente, se aprecia que estas variables también contienen datos faltantes.

# Gráfico de barras apiladas con facet grid
ggplot(vivienda_char, aes(x = vivienda_char$Zona, fill = vivienda_char$Tipo_inmueble)) +
  geom_bar(position = "fill") +
  facet_wrap(~ vivienda_char$Piso) +
  labs(x = 'Zona', y = 'Proporcion', fill = 'Tipo_inmueble', title = 'Grafico de relacion variables categoricas')+
  theme(
    plot.title = element_text(size = 14,face = "bold", hjust = 0.5),     
    axis.text.x = element_text(size = 8, angle = 50, hjust = 1)  
  )

6.1.3 Analisis de datos faltantes

A partir de la información suministrada por el siguiente gráfico, se puede establecer que las variables que presentan datos faltantes son: Piso, Número de Parqueaderos, Longitud, Latitud y Barrio, siendo las dos primeras las que contienen la mayor cantidad de datos faltantes con 1909 y 876, correspondientes al 22.9% y 10.5% del total de los datos, respectivamente. Además, se puede identificar que, de este grupo de datos faltantes, 726 registros presentan ausencia tanto en la variable Piso como en la variable Número de Parqueaderos, y 3 registros tienen datos faltantes en las cinco variables al mismo tiempo.

library(naniar)

# Visualizar los datos faltantes
gg_miss_upset(vivienda1)

6.2 Limpieza y transformación de los datos

Limpieza de registros sin datos en todas las variables

Se identificaron los registros con ausencia de datos en la mayoría de las variables. Dado que estos registros no aportan información relevante para el análisis es necesario eliminarlos, según sea su proporción dentro del conjunto de datos. En total, se encontraron solo 3 registros con esta característica, lo que equivale a una pérdida mínima.

# Calcular el número de NA en cada fila
na_cont <- apply(vivienda1, 1, function(row) sum(is.na(row)))

# Calcular el umbral (más de la mitad de las columnas)
umbral <- ncol(vivienda1) / 2

# Identificar las filas con NA en más de la mitad de las columnas
fil_na_mayoria <- which(na_cont > umbral)

# Mostrar las posiciones de las filas
mensaje <- paste("Las filas con la mayoria de datos con NA son:", paste(fil_na_mayoria, collapse = ", ") )
print(mensaje)
## [1] "Las filas con la mayoria de datos con NA son: 8320, 8321, 8322"
# Eliminar las filas con NA en más de la mitad de las columnas
vivienda2 <- vivienda1[-fil_na_mayoria, ]

Limpieza variable Barrio y Zona

Para corregir las variable Barrios, se utilizó una base de datos secundaria que contenía información geográfica oficial de los barrios como referencia. Esta capa geográfica sirvió como patrón principal para la corrección de los nombres de los barrios en la base de datos original. En primer lugar, se estandarizaron los nombres de los barrios en ambas bases de datos, eliminando acentos, tildes y convirtiendo todo a mayúsculas. Luego, se compararon los nombres de los barrios en ambas bases de datos y se identificaron aquellos que coincidían. Los barrios que no coincidían se corrigieron manualmente, utilizando la información de la capa geográfica como guía. Este proceso también se validó utilizando google maps para identificar cualquier discrepancia entre los nombres de los barrios en las dos fuentes de datos. Es importante destacar que la base de datos de la alcaldía no estaba actualizada, por lo que los barrios que no se encontraron en el patrón se asignaron como NA y fueron eliminados junto con los que no hacen parte del municipio.

## Reading layer `Barrios' from data source 
##   `C:\Users\lvasquez\OneDrive - PUJ Cali\2024_2\Metodos_estadisticos_para_toma_decisiones\Unidad_1\Cali_WGS84.gpkg' 
##   using driver `GPKG'
## Simple feature collection with 335 features and 5 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -76.59078 ymin: 3.331802 xmax: -76.46124 ymax: 3.501895
## Geodetic CRS:  WGS 84 (CRS84)

Imputación de datos faltantes

Teniendo en cuenta que el porcentaje de datos faltantes es bastante representativo, eliminarlos podría resultar en la pérdida de información valiosa. Por lo tanto, se optó por realizar una agrupación por las variables con mayor relación tanto con la variable piso como zona. En este caso, se filtraron los datos por zona, estrato y tipo de inmueble y se calculó el valor más frecuente para el caso de la variable piso (variable categórica) y la mediana en el caso de la variable numero de parqueaderos (variable numérica discreta) para realizar la imputación.

vivienda4<-vivienda3
vivienda4$Piso<-as.numeric(vivienda4$Piso)
vivienda4$No_Parqueaderos<-as.numeric(vivienda4$No_Parqueaderos)

vivienda4$Piso_imputado<-vivienda4$Piso # copia de piso
vivienda4$Parquea_imputado<-vivienda4$No_Parqueaderos # copia de piso


vivienda4 <- vivienda4 %>%
  mutate(
    Posicion_Piso_NA = ifelse(is.na(Piso), row_number(), NA),
    Posicion_Parqueaderos_NA = ifelse(is.na(No_Parqueaderos), row_number(), NA)
  )

# Función para calcular la moda
calcular_moda <- function(x) {
  tbl <- table(x)
  moda <- as.numeric(names(tbl)[tbl == max(tbl)])
  return(moda)
}

#Lista de zonas, estratos y tipos de inmueble
zonas <- unique(vivienda4$Zona_limpia)
estratos <- unique(vivienda4$Estrato)
tipos_inmueble <- unique(vivienda4$Tipo_inmueble)

# Crear listas para almacenar los subconjuntos y los resultados
subconjuntos <- list()
resultados <- list()

# Iterar a través de las combinaciones de zona, estrato y tipo de inmueble
for (zona in zonas) {
  for (estrato in estratos) {
    for (tipo in tipos_inmueble) {
      
      
      # Crear el subconjunto
      subconjunto <- subset(vivienda4, Zona_limpia == zona & Estrato == estrato & Tipo_inmueble == tipo)
      
      # Guardar el subconjunto
      subconjuntos[[paste(zona, estrato, tipo, sep = "_")]] <- subconjunto
      
      # Calcular la moda para Piso
      moda_piso <- calcular_moda(subconjunto$Piso)
      
      # Calcular la mediana de Parqueaderos y redondear a un solo dígito
      mediana_parqueaderos <- median(subconjunto$No_Parqueaderos, na.rm = TRUE)
      mediana_parqueaderos_redondeada <- round(mediana_parqueaderos, 1)
      
    
      valores_no_na_piso <- na.omit(subconjunto$Posicion_Piso_NA) #extrae las posiciones de este subconjunto donde piso tiene NA del conjunto original 
      valores_no_na_parq<- na.omit(subconjunto$Posicion_Parqueaderos_NA) #extrae las posiciones de este subconjunto donde piso tiene NA del conjunto original 
      
      # Asignar moda a los NA en Piso
      vivienda4$Piso_imputado[valores_no_na_piso] <- moda_piso
      vivienda4$Piso<-as.factor(vivienda4$Piso_imputado)
      
      # Asignar mediana los NA en Parqueaderos
      vivienda4$Parquea_imputado[valores_no_na_parq] <-  mediana_parqueaderos_redondeada
      
      # Guardar el resultado
      resultados[[paste(zona, estrato, tipo, sep = "_")]] <- list(
        Moda_Piso = moda_piso,
        Mediana_Parqueaderos_Redondeada = mediana_parqueaderos_redondeada
      )
    }
  }
}

Limpieza de valores cero en la variable baños y habitaciones

Dado que durante el análisis exploratorio se identificaron registros de inmuebles con valores de cero en las variables No_habitaciones y No_baños, se decidió imputar estos datos. Estos valores no tenían una relación lógica con las otras variables registradas, por lo que se empleó un método similar al utilizado para el manejo de datos faltantes, utilizando la mediana para reemplazar los valores en cero. Finalmente, en la tabla y gráfica siguientes se presenta la base de datos definitiva, confirmando que no existen datos faltantes que puedan afectar el análisis.

vivienda4$No_banios<-as.numeric(vivienda4$No_banios)
vivienda4$No_habitaciones<-as.numeric(vivienda4$No_habitaciones)

vivienda4$Banios_limpio<-vivienda4$No_banios # copia 
vivienda4$Habita_limpio<-vivienda4$No_habitaciones # copia 

vivienda4 <- vivienda4 %>%
  mutate(
    Posicion_Banios_Cero = ifelse(No_banios == 0, row_number(), NA),
    Posicion_Habitaciones_Cero = ifelse(No_habitaciones == 0, row_number(), NA)
  )

#Lista de  estratos y tipos de inmueble
estratos <- unique(vivienda4$Estrato)
tipos_inmueble <- unique(vivienda4$Tipo_inmueble)

# Crear listas para almacenar los subconjuntos y los resultados
subconjuntos <- list()
resultados <- list()

# Iterar a través de las combinaciones de zona, estrato y tipo de inmueble
for (estrato in estratos) {
  for (tipo in tipos_inmueble) {
      
      
      # Crear el subconjunto
      subconjunto <- subset(vivienda4, Estrato == estrato & Tipo_inmueble == tipo)
      
      # Guardar el subconjunto
      subconjuntos[[paste(estrato, tipo, sep = "_")]] <- subconjunto
      
      # Calcular la mediana baños
      mediana_banios <- median(subconjunto$No_banios, na.rm = TRUE)
      mediana_banios <- round( mediana_banios, 1)
      
      # Calcular la mediana habitaciones
      mediana_habita <- median(subconjunto$No_habitaciones, na.rm = TRUE)
      mediana_habita <- round( mediana_habita, 1)
      
    
      valores_no_na_banio <- na.omit(subconjunto$Posicion_Banios_Cero) 
      valores_no_na_habita <- na.omit(subconjunto$Posicion_Habitaciones_Cero) 
      
      # Asignar mediana a los NA en baño
      vivienda4$Banios_limpio[valores_no_na_banio] <- mediana_banios
      
      # Asignar mediana los NA en habitación
      vivienda4$Habita_limpio[ valores_no_na_habita] <- mediana_habita
      
      # Guardar el resultado
      resultados[[paste(estrato, tipo, sep = "_")]] <- list(
        Mediana_Banio = mediana_banios,
        Mediana_Habitacion = mediana_habita
      )
  }
}

vivienda5<-vivienda4 %>% select(-Zona, -Piso, -No_banios,-No_habitaciones, -No_Parqueaderos, -Barrio, -Posicion_Piso_NA, -Posicion_Parqueaderos_NA, -Posicion_Banios_Cero, -Posicion_Habitaciones_Cero)
colnames(vivienda5)<- c("Id","Estrato","Precio_m","Area_construida","Tipo_inmueble","Longitud","Latitud","Barrio","Comuna","Zona","Piso","No_Parqueaderos", "No_Banios", "No_Habitaciones")

#write.csv(vivienda5, "C:/Users/lvasquez/OneDrive - PUJ Cali/2024_2/Metodos_estadisticos_para_toma_decisiones/Unidad_1/vivienda5.csv", row.names = FALSE)

datatable(vivienda5, filter="top", options = list(pageLength = 5, scrollX=T))%>%
formatStyle(names(vivienda5), backgroundColor = "lightgray")
# Visualizar los datos faltantes
gg_miss_var(vivienda5)

fviz_pca_var(res.pca,
col.var = "contrib", # Color by contributions to the PC
gradient.cols = c("#FF7F00",  "#034D94"),
repel = TRUE     # Avoid text overlapping
)

fviz_pca_ind(res.pca, col.ind = "#DEDEDE", gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"))


fviz_pca_biplot(res.pca, 
repel = TRUE,
habillage = vivienda5$Zona,
col.var = "#034A94", # Variables color
col.ind = c("#DEDEDE", "#034A94")  # Individuals color
)

Aplicar ACP sacar las grafcias de los tutoriales y la que exlico cris que es mas sencilla con las de mayor peso por cada componente ponerlas en el analisi de resultados del informe.

6.2.1 Análisis de conglomerados

Verificar supuestos antes de aplicarlos

Aplicar AC sacar las grafcias de los tutoriales y buscra mas sencilla con para ponerlas en el analisi de resultados del informe.

6.2.2 Analisis de correpondencia

Verificar supuestos antes de aplicarlos

Aplicar AC sacar las grafcias de los tutoriales y buscra mas sencilla con para ponerlas en el analisi de resultados del informe.