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 Realizar cargue yn depuración de datos

Se realiza cargue de la base de datos de forma local no funciono el cargue desde el enlace

ruta <- "E:/FABIAN/1-javeriana_cali/Semestre 2/2_estadistica/vivienda.csv"
# Cargar el archivo CSV
vivienda <- read.csv(ruta)
head(vivienda)

2.1 Resumen de estadísticas descriptivas de las columnas

#nstall.packages("knitr")
#nstall.packages("kableExtra")
library(knitr)

info_columnas <- data.frame(
  ID = seq_along(colnames(vivienda)),
  Tipo_Formato = sapply(vivienda, class),
  Cantidad_Diferentes = sapply(vivienda, function(col) length(unique(col))),
  Cantidad_NA = sapply(vivienda, function(col) sum(is.na(col))),
  Cantidad_Null = sapply(vivienda, function(col) sum(is.null(col)))
)

#Imprimir información de las columnas
#rint(info_columnas)



kable(info_columnas, format = "markdown")
ID Tipo_Formato Cantidad_Diferentes Cantidad_NA Cantidad_Null
id 1 integer 8320 3 0
zona 2 character 6 3 0
piso 3 integer 13 2638 0
estrato 4 integer 5 3 0
preciom 5 integer 540 2 0
areaconst 6 numeric 653 3 0
parquea 7 integer 11 1605 0
banios 8 integer 12 3 0
habitac 9 integer 12 3 0
tipo 10 character 7 3 0
barrio 11 character 437 3 0
longitud 12 numeric 2929 3 0
latitud 13 numeric 3680 3 0
cantidad_registros <- nrow(vivienda)
print(cantidad_registros)
## [1] 8322

RESULTADOS : Características de las variables y datos faltantes:

  • Se identifica que el dataframe cuenta con información de 8,322 viviendas medidas en 12 variables: zona, piso, estrato, preciom, areaconst, parqueaderos, banios, habitaciones, tipo, barrio, longitud y latitud.

  • En en analisis de datos faltantes en varias columnas identifica la presencia de registros con marca de NA en la columnas Piso con 2638 registros y parqueaderos en 1605 registros

  • Se identifica que el dataframe tiene en comun 3 filas los cuales NA en la en todas las columnas con excepcion en precio

# Filtrar registros donde todas las columnas seleccionadas tienen valores nulos
vivienda_filtrada <- subset(vivienda,  is.na(areaconst))


# Mostrar los registros filtrados
print(vivienda_filtrada)
##      id zona piso estrato preciom areaconst parquea banios habitac tipo barrio
## 8320 NA <NA>   NA      NA      NA        NA      NA     NA      NA <NA>   <NA>
## 8321 NA <NA>   NA      NA      NA        NA      NA     NA      NA <NA>   <NA>
## 8322 NA <NA>   NA      NA     330        NA      NA     NA      NA <NA>   <NA>
##      longitud latitud
## 8320       NA      NA
## 8321       NA      NA
## 8322       NA      NA
  • En en analisis de datos faltantes en varias columnas identifica la presencia de registros con NA En 3 filas los cuales no son necesarios para el analisis

2.2 Elimianr registros inconsistemntes filas y columnas

# Eliminar las columnas "piso" y "parquea" utilizando subset()
 vivienda <- subset(vivienda, select = -c(piso, parquea))


# Eliminar los registros con valores NA utilizando na.omit()
vivienda <- na.omit(vivienda)

library(knitr)

info_columnas <- data.frame(
  ID = seq_along(colnames(vivienda)),
  Tipo_Formato = sapply(vivienda, class),
  Cantidad_Diferentes = sapply(vivienda, function(col) length(unique(col))),
  Cantidad_NA = sapply(vivienda, function(col) sum(is.na(col))),
  Cantidad_Null = sapply(vivienda, function(col) sum(is.null(col)))
)

#Imprimir información de las columnas
#rint(info_columnas)



kable(info_columnas, format = "markdown")
ID Tipo_Formato Cantidad_Diferentes Cantidad_NA Cantidad_Null
id 1 integer 8319 0 0
zona 2 character 5 0 0
estrato 3 integer 4 0 0
preciom 4 integer 539 0 0
areaconst 5 numeric 652 0 0
banios 6 integer 11 0 0
habitac 7 integer 11 0 0
tipo 8 character 6 0 0
barrio 9 character 436 0 0
longitud 10 numeric 2928 0 0
latitud 11 numeric 3679 0 0
cantidad_registros <- nrow(vivienda)
print(cantidad_registros)
## [1] 8319
str(vivienda)
## 'data.frame':    8319 obs. of  11 variables:
##  $ id       : int  8312 8311 8307 8296 8297 8298 8299 8300 8286 8287 ...
##  $ zona     : chr  "Zona Oeste" "Zona Oeste" "Zona Oeste" "Zona Sur" ...
##  $ estrato  : int  6 6 5 3 5 5 6 5 5 5 ...
##  $ preciom  : int  1300 480 1200 220 330 1350 305 480 275 285 ...
##  $ areaconst: num  318 300 800 150 112 390 125 280 74 120 ...
##  $ banios   : int  4 4 7 2 4 10 3 4 2 4 ...
##  $ habitac  : int  2 4 5 4 3 10 3 4 3 3 ...
##  $ tipo     : chr  "Apartamento" "Casa" "Casa" "Casa" ...
##  $ barrio   : chr  "arboleda" "normandía" "miraflores" "el guabal" ...
##  $ longitud : num  -76576 -76571 -76568 -76565 -76565 ...
##  $ latitud  : num  3454 3454 3455 3417 3408 ...
##  - attr(*, "na.action")= 'omit' Named int [1:3] 8320 8321 8322
##   ..- attr(*, "names")= chr [1:3] "8320" "8321" "8322"
#install.packages("mice")

library(mice)
## 
## Attaching package: 'mice'
## The following object is masked from 'package:stats':
## 
##     filter
## The following objects are masked from 'package:base':
## 
##     cbind, rbind
md.pattern(vivienda)
##  /\     /\
## {  `---'  }
## {  O   O  }
## ==>  V <==  No need for mice. This data set is completely observed.
##  \  \|/  /
##   `-----'

##      id zona estrato preciom areaconst banios habitac tipo barrio longitud
## 8319  1    1       1       1         1      1       1    1      1        1
##       0    0       0       0         0      0       0    0      0        0
##      latitud  
## 8319       1 0
##            0 0

RESULTADOS : Características de las variables y datos faltantes:

  • Nos e identifica la presncia de datos en null o faltantes

  • Se identifica que el dataframe cuenta con información de 8,322 viviendas medidas en 12 variables: zona, piso, estrato, preciom, areaconst, parqueaderos, banios, habitaciones, tipo, barrio, longitud y latitud.

  • En en analisis de datos faltantes en varias columnas identifica la presencia de registros con marca de NA en la columnas Piso con 2638 registros y parqueaderos en 1605 registros

  • Se identifica que el dataframe tiene en comun 3 filas los cuales NA en la en todas las columnas con excepcion en precio

2.3 Analisis de variables Numericas

# Simulación de datos (puedes cargar tus propios datos)
# vivienda <- ...

# Dividir el espacio del gráfico en 2 filas y 3 columnas
par(mfrow = c(1, 2))

# Generar histogramas con colores diferentes
variables <- c("estrato", "preciom", "areaconst", "banios", "habitac")
colors <- rainbow(length(variables))  # Colores del arcoíris

# Diccionario de renombramiento
nombres_renombrados <- c("estrato"="ESTRATO","preciom" = "PRECIO", "areaconst" = "AREA_CONSTRUIDA",
                         "banios" = "BAnOS", "habitac" = "HABITACIONES")

for (i in 1:length(variables)) {
  variable_actual <- variables[i]
  
  # Obtener el nuevo nombre de la variable si existe en el diccionario
  nuevo_nombre <- ifelse(variable_actual %in% names(nombres_renombrados), nombres_renombrados[variable_actual], variable_actual)
  
  hist(x = vivienda[[variable_actual]], 
       main = toupper(nuevo_nombre),  # Convertir a mayúsculas y usar como título
       xlab = nuevo_nombre, ylab = "Frecuencia",  # Renombrar encabezados de ejes
       col = colors[i])
}

# Restaurar la configuración del gráfico
par(mfrow = c(1, 2))

Las variables mas adecuadas para relizar el analisis son : “estrato”, “preciom”, “areaconst”, “banios”, “habitac” las variables numericas como latitud y longitud son de ubicacion no darian un resultado ajustado ala medicion.

#install.packages("corrplot")
library(corrplot)
## corrplot 0.92 loaded
# Seleccionar las variables numéricas para calcular la matriz de correlación
columnas_numericas <- c("estrato", "preciom", "areaconst", "banios", "habitac")

# Calcular la matriz de correlación
correlacion <- round(cor(vivienda[columnas_numericas]), 1)

# Configurar parámetros para mejorar la visualización
corrplot(correlacion, method = "color", tl.cex = 0.6, tl.col = "blacK",
         cl.lim = c(-1, 1), cl.colors = c("lightblue", "white", "lightcoral3"),
         addCoef.col = "black", number.cex = 0.6, diag = FALSE)
## Warning in text.default(pos.xlabel[, 1], pos.xlabel[, 2], newcolnames, srt =
## tl.srt, : "cl.lim" is not a graphical parameter
## Warning in text.default(pos.xlabel[, 1], pos.xlabel[, 2], newcolnames, srt =
## tl.srt, : "cl.colors" is not a graphical parameter
## Warning in text.default(pos.ylabel[, 1], pos.ylabel[, 2], newrownames, col =
## tl.col, : "cl.lim" is not a graphical parameter
## Warning in text.default(pos.ylabel[, 1], pos.ylabel[, 2], newrownames, col =
## tl.col, : "cl.colors" is not a graphical parameter
## Warning in title(title, ...): "cl.lim" is not a graphical parameter
## Warning in title(title, ...): "cl.colors" is not a graphical parameter

LAs correalacionanes con valores positivos mas acertados son :

-Área construida y Precio: Existe una correlación positiva de 0.7 entre el área construida y el precio de la vivienda. Esto sugiere que a medida que aumenta el tamaño del área construida, el precio de la vivienda también tiende a aumentar. En otras palabras, las viviendas más grandes tienden a tener un precio más alto.

-Baños y Precio: Hay una correlación positiva de 0.7 entre la cantidad de baños en una vivienda y su precio. Esta relación indica que a medida que aumenta el número de baños en una vivienda, es más probable que su precio sea mayor. Las viviendas con más baños tienden a tener un valor más alto.

-Baños y Área Construida: Se observa una correlación positiva de 0.6 entre la cantidad de baños y el área construida de una vivienda. Esto sugiere que las viviendas más grandes tienden a tener más baños. El tamaño del área construida está relacionado con la cantidad de baños en la vivienda.

-Precio y Estrato: Existe una correlación positiva de 0.6 entre el precio de la vivienda y su estrato. Esta relación implica que a medida que el estrato de la vivienda es más alto, es más probable que su precio sea mayor. Los estratos más altos tienden a tener viviendas con precios más elevados.

-Habitaciones y Baños: Se observa una correlación positiva de 0.6 entre la cantidad de habitaciones en una vivienda y el número de baños. Esto sugiere que las viviendas con más habitaciones también tienden a tener más baños. A medida que aumenta el número de habitaciones, es probable que aumente la cantidad de baños.

-Habitaciones y Área Construida: Hay una correlación positiva de 0.5 entre la cantidad de habitaciones en una vivienda y el área construida. Esto implica que las viviendas más grandes tienden a tener más habitaciones. El tamaño del área construida está relacionado con la cantidad de habitaciones en la vivienda.

2.4 Analisis de variables categoricas

par(mfrow = c(1, 1))


variables_categoricas <- c("zona", "tipo", "barrio")
nombres_renombrados <- c("barrio" = "BARRIOS", "tipo" = "TIPO DE VIVIENDA", "zona" = "ZONA DE LA CIUDAD")
colors <- rainbow(length(variables_categoricas))  # Colores del arcoíris

for (i in 1:length(variables_categoricas)) {
  variable_actual <- variables_categoricas[i]
  

  frecuencias <- table(vivienda[[variable_actual]])
  

  categorias_ordenadas <- names(sort(frecuencias, decreasing = TRUE))
  

  barplot(frecuencias[categorias_ordenadas], 
          main = nombres_renombrados[variable_actual], 
          col = colors[i], 
          xlab = nombres_renombrados[variable_actual],
          names.arg = categorias_ordenadas,  # Usar nombres ordenados en el eje x
          cex.names = 0.7)  # Tamaño de fuente más pequeño para los nombres del eje x
}

# Restaurar la configuración del gráfico
par(mfrow = c(1, 1))

RESULTADOS

En el análisis de un estudio, los histogramas nos permiten visualizar la distribución de los datos y la frecuencia de los valores en cada gráfica. Al examinar la asimetría de los datos durante la ejecución de un control de calidad estadístico se evidencia que la información correspondiente a cada variables representa resultados asimétricos y en valores atípicos.

3 Análisis de Componentes Principales (ACP):

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 preferencias del mercado.

3.1 Elección del número de componentes principales

vivienda_FN <- vivienda[1:8319,3:7]
apply(X = vivienda_FN, MARGIN = 2, FUN = var)
##      estrato      preciom    areaconst       banios      habitac 
## 1.059298e+00 1.080207e+05 2.043874e+04 2.039784e+00 2.130248e+00
vivienda_FN
library(factoextra)
## Loading required package: ggplot2
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
library(ggplot2)
library(ggrepel)  

#
pca <- prcomp(vivienda_FN, scale = TRUE)

plot <- fviz_pca_ind(pca,
                     geom.ind = "point",
                     col.ind = "#53868B",
                     axes = c(1, 2),
                     pointsize = 1.5,
                     col.var = "blue",
                     label = "var")


plot_with_labels <- plot +
  geom_text_repel(aes(label = rownames(pca$x)))


print(plot_with_labels)
## Warning: ggrepel: 8297 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps

colores <- function(vec){
col <- rainbow(length(unique(vec)))
return(col[as.numeric(as.factor(vec))])
}
plot(pca$x[,1:2], col = colores(vivienda$zona), 
     pch = 19, 
     xlab = "Z1", 
     ylab = "Z2") 

library(factoextra)
library(ggplot2)

fviz_screeplot(pca, addlabels = TRUE, ylim = c(0, 100))

En este caso el primer componente principal explica el 58.7% de la variabilidad contenida en la base de datos y entre los dos primeros es del 82,5%, lo cual indicaría que con solo una variable (CP1) que se obtiene mediante una combinación lineal de las variables se puede resumir gran parte de la variabilidad que contiene la base de datos.

fviz_pca_var(pca,
col.var = "contrib",
gradient.cols = c("#FF7F00",  "#034D94"),
repel = TRUE)

La representación gráfica de las variables en el plano de los componentes principales ofrece la oportunidad de discernir la dirección y la naturaleza de los componentes fundamentales, aspectos que son capturados por los vectores propios de la matriz de covarianza (Σ). En el contexto de este análisis, el primer componente principal se halla predominantemente relacionado con las variables “estrato” y “precio”, siendo estas las principales contribuyentes a su orientación. Por otro lado, el segundo componente principal parece estar influenciado en gran medida por la variable “habitación y area construida”.

Para explicar el sentido de los ejes, se escogen cuatro casos extremos conformados por los siguientes clientes

#library(factoextra)
library(ggrepel)
biplot(pca, scale = 0.5, col = c("#458B74", "#00008B"), main = "Biplot de PCA")

RESULTADOS Análisis de Componentes Principales (PCA)

  • los principales componentes de analisis son “estrato”, “preciom”, “areaconst”, “banios”, “habitac”

  • Se identifica que estrato y precio, formando un grupo que presenta un mayor efecto sobre el primer componente

  • Se identificamientras habitación presenta un mayor efecto sobre el segundo componente y la cercania de las variables de area construida y baños.

  • El primer componente explica el 58.7% de la varianza observada de los datos

3.2 Análisis de Conglomerados ((Clustering)):

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

library(cluster)
#library(factoextra)

vivienda_subset <- vivienda[1:8319, c("estrato", "preciom", "areaconst", "banios", "habitac")]
vivienda_estandarizada <- scale(vivienda_subset)
num_clusters <- 2:10
wss <- numeric(length(num_clusters))

for (k in num_clusters) {
  kmeans_result <- kmeans(vivienda_estandarizada, centers = k)
  wss[k - num_clusters[1] + 1] <- kmeans_result$tot.withinss
}

# Graficar el método del codo
plot(num_clusters, wss, type = "b", pch = 19, frame = FALSE,
     xlab = "Número de Clusters", ylab = "Suma de Cuadrados Dentro de los Clusters",
     main = "Método del Codo para Selección de Clusters")

vivienda_AC <- vivienda[1:8319,3:7]
vivienda_AC_est <- scale(vivienda_AC)
vivienda_AC_est <- as.data.frame(vivienda_AC_est)
head(vivienda_AC_est,10)

Las distancias correspondientes a los valores estandarizados serán:

Distribución de los individuos por distancias

Analisis de primera relacion mas coincidente preciom y areaconst

#install.packages("tidyverse")
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.2     ✔ readr     2.1.4
## ✔ forcats   1.0.0     ✔ stringr   1.5.0
## ✔ lubridate 1.9.2     ✔ tibble    3.2.1
## ✔ purrr     1.0.1     ✔ tidyr     1.3.0
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks mice::filter(), stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
# distancia euclidiana
dist_emp <- dist(vivienda_AC_est, method = 'euclidean')

# Cluster jerarquico con el método complete
hc_emp <- hclust(dist_emp, method = 'complete')

# Determinamos a dónde pertenece cada observación
cluster_assigments <- cutree(hc_emp, k = 4)

# asignamos los clusters
assigned_cluster <- vivienda_AC_est %>% mutate(cluster = as.factor(cluster_assigments))


# gráfico de puntos
ggplot(assigned_cluster, aes(x = preciom, y = areaconst, color = cluster)) +
geom_point(size = 4) +
geom_text(aes(label = cluster), vjust = -.8) + # Agregar etiquetas del clúster
theme_classic()

Distribución de los individuos por distancias

plot(hc_emp, cex = 0.6, main = "Dendograma de Vivienda  preciom y  areaconst ", las=1,
ylab = "Distancia euclidiana", xlab = "Grupos")
rect.hclust(hc_emp, k = 2, border = 2:5)

Analisis del segunda relacion mas coincidente Baños y Precio

#install.packages("tidyverse")
#library(tidyverse)

# distancia euclidiana
dist_emp1 <- dist(vivienda_AC_est, method = 'euclidean')

# Cluster jerarquico con el método complete
hc_emp1 <- hclust(dist_emp1, method = 'complete')

# Determinamos a dónde pertenece cada observación
cluster_assigments1 <- cutree(hc_emp1, k = 4)

# asignamos los clusters
assigned_cluster1 <- vivienda_AC_est %>% mutate(cluster1 = as.factor(cluster_assigments1))


# gráfico de puntos
ggplot(assigned_cluster1, aes(x = preciom , y = banios, color = cluster1)) +
geom_point(size = 4) +
geom_text(aes(label = cluster1), vjust = -.8) + # Agregar etiquetas del clúster
theme_classic()

plot(hc_emp1, cex = 0.6, main = "Dendograma de Vivienda", las=1,
ylab = "Distancia euclidiana", xlab = "Grupos")
rect.hclust(hc_emp1, k = 2, border = 2:5)

fviz_nbclust(vivienda_AC_est, kmeans, method = "wss") + labs (subtitle="Elbow method")

Por último se mide el indice de Silhouette promedio con el fin de valorar la mejor alternativa para la elección del número de conglomerado identificando una relacion en los 3 perimeros clusters.

library(tidyverse)
library(cluster)
# distancia euclidiana
dist_emp <- dist(vivienda_AC_est, method = 'euclidean')

# Cluster jerarquico con el método complete
hc_emp <- hclust(dist_emp, method = 'complete')

# Determinamos a dónde pertenece cada observación
cluster_assigments <- cutree(hc_emp, k = 2)

# Calcular el coeficiente de Silhouette
sil <- silhouette(cluster_assigments, dist(vivienda_AC_est))
sil_avg <- mean(sil[,3])

# Imprimir el coeficiente de Silhouette promedio
cat("Coeficiente de Silhouette promedio k=2 : ", sil_avg)
## Coeficiente de Silhouette promedio k=2 :  0.6630623
# Determinamos a dónde pertenece cada observación
cluster_assigments <- cutree(hc_emp, k = 3)

# Calcular el coeficiente de Silhouette
sil <- silhouette(cluster_assigments, dist(vivienda_AC_est))
sil_avg <- mean(sil[,3])

# Imprimir el coeficiente de Silhouette promedio
cat("Coeficiente de Silhouette promedio k=3 : ", sil_avg)
## Coeficiente de Silhouette promedio k=3 :  0.4823289
# Determinamos a dónde pertenece cada observación
cluster_assigments <- cutree(hc_emp, k = 4)

# Calcular el coeficiente de Silhouette
sil <- silhouette(cluster_assigments, dist(vivienda_AC_est))
sil_avg <- mean(sil[,3])

# Imprimir el coeficiente de Silhouette promedio
cat("Coeficiente de Silhouette promedio k=4 : ", sil_avg)
## Coeficiente de Silhouette promedio k=4 :  0.3144261

Aplicar el método K-means con el número de clusters elegido = 2

num_clusters_elegido <- 2
kmeans_result <- kmeans(vivienda_AC_est, centers = num_clusters_elegido)


vivienda$cluster <- as.factor(kmeans_result$cluster)

fviz_cluster(kmeans_result, data = vivienda_AC_est, geom = "point", palette = "jco")

Estos resultados indican una mejor agrupación cuando se eligen k=2 conglomerados. (valores más cercanos a 1 indican un agrupamiento más coherente) e identifica una fuerte precencdia en los 2 primeros cluster con un numero total de 10 y se identica los clusters 1 y 2 están situados en los extremos del plano.

library(cluster)
clusterIris <- kmeans(vivienda_AC_est, center=2, nstart = 20)
vivienda_AC_est %>% 
ggplot(aes(x = factor(clusterIris$cluster), y = preciom, fill = factor(clusterIris$cluster))) + geom_boxplot() + geom_point() + xlab("Cluster") + labs(fill="Cluster")

num_clusters_elegido3 <- 3
kmeans_result3 <- kmeans(vivienda_AC_est, centers = num_clusters_elegido3)


vivienda$cluster3 <- as.factor(kmeans_result3$cluster)

fviz_cluster(kmeans_result3, data = vivienda_AC_est, geom = "point", palette = "jco")

clusterIris3 <- kmeans(vivienda_AC_est, center=3, nstart = 20)
vivienda_AC_est %>% 
ggplot(aes(x = factor(clusterIris3$cluster), y = preciom, fill = factor(clusterIris3$cluster))) + geom_boxplot() + geom_point() + xlab("Cluster") + labs(fill="Cluster")

Se identifica la gran cercania en relacion de los 2 perimeros cluster los cuales estan mas cercanos al 0

RESULTADOS Análisis de Conglomerados ((Clustering))

  • Se identifica gran relacion en los cluster 1,2 3
  • Al analizar en Coeficiente de Silhouette promedio k=2 : 0.6630623– k=3 : 0.4823289 — k=4 : 0.3144261 Se identifica que el cluter 2 es mas cercano a 1 lo que da mas indicios de tomar la decision

3.3 Análisis de Correspondencia Simple (ACS)

Examinar la relación entre las variables categóricas (tipo de vivienda, zona y barrio) y las variables numéricas (precio, área construida, número de parqueaderos, baños, habitaciones) para identificar patrones de comportamiento del mercado inmobiliario

vivienda33 <- vivienda[1:8319,2:7]
vivienda33
#install.packages(FactoMineR)

library(FactoMineR)
tabla <- table(vivienda33$zona, vivienda33$estrato)
tabla
##               
##                   3    4    5    6
##   Zona Centro   105   14    4    1
##   Zona Norte    572  407  769  172
##   Zona Oeste     54   84  290  770
##   Zona Oriente  340    8    2    1
##   Zona Sur      382 1616 1685 1043
chisq.test(tabla)
## 
##  Pearson's Chi-squared test
## 
## data:  tabla
## X-squared = 3830.4, df = 12, p-value < 2.2e-16

El resultado indica que se rechaza la hipótesis de independencia de las variables (p-value: 0.0000), indicando grado tipo de relación entre ellas.

Finalmente se procede a realizar el análisis de correspondencia que consistes en estimar las coordenadas para cada uno de los niveles de ambas variables y representarlas en un plano cartesiano

resultados_ac <- CA(tabla)

Se puede eidentiicar de acueros a cada :

  • El estrato 6 se ubica en la zona Oeste
  • El estrato 4 y 5 En la zonal sur
  • El estrato 3 se ubica en la zona centro y Oriente
  • No hay una difenencia significativa en el zona norte
valores_prop <-resultados_ac$eig ; valores_prop
##       eigenvalue percentage of variance cumulative percentage of variance
## dim 1 0.32215213              69.965515                          69.96551
## dim 2 0.12745096              27.680002                          97.64552
## dim 3 0.01084108               2.354483                         100.00000
library(factoextra)
library(gridExtra)
## 
## Attaching package: 'gridExtra'
## The following object is masked from 'package:dplyr':
## 
##     combine
fviz_screeplot(resultados_ac, addlabels = TRUE, ylim = c(0, 80))+ggtitle("")+
  ylab("Porcentaje de varianza explicado") + xlab("Ejes")

Indica que el primer componente tiene el 70 % del total de la varianza y la segunda componente explica el 27.7 % del total de la varianza, por tanto, las 2 primeras componentes en conjunto explican el 97.7 % de la varianza total de los datos.

generar_colores_aleatorios <- function(n) {
  hsv(h = runif(n), s = 0.9, v = 0.9)
}

# Asignar colores aleatorios a las zonas
colores_aleatorios <- generar_colores_aleatorios(length(unique(vivienda33$zona)))

ggplot(vivienda33, aes(x = zona, y = preciom, fill = zona)) +
  geom_boxplot() +
  scale_fill_manual(values = colores_aleatorios) +  # Asigna colores aleatorios
  labs(title = "Distribución Precio por Zona") +
  theme_minimal()  # Personaliza el tema del gráfico

library(ggplot2)

# Definir una paleta de colores para las zonas
paleta_colores <- c("#E41A1C", "#377EB8", "#4DAF4A", "#984EA3", "#FF7F00", "#FFFF33")

# Crear el gráfico de cajas multivariado
ggplot(vivienda33, aes(x = zona, y = preciom, fill = factor(estrato))) +
  geom_boxplot(alpha = 0.7) +
  scale_fill_manual(values = paleta_colores) +
  labs(title = "Distribución de Precios por Zona y Estrato",
       x = "Zona",
       y = "Precio") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))  # Rotar etiquetas en el eje X

dimension_descriptions <- dimdesc(resultados_ac)

# Imprimir la descripción de las variables para cada dimensión
print(dimension_descriptions)
## $`Dim 1`
## $`Dim 1`$row
##                   coord
## Zona Oeste   -0.5690714
## Zona Sur     -0.2090141
## Zona Norte    0.3898305
## Zona Centro   1.7245923
## Zona Oriente  2.0148839
## 
## $`Dim 1`$col
##        coord
## 6 -0.5190649
## 4 -0.1544575
## 5 -0.1323066
## 3  1.1865554
## 
## 
## $`Dim 2`
## $`Dim 2`$row
##                   coord
## Zona Sur     -0.1880737
## Zona Norte   -0.1471227
## Zona Centro   0.3637090
## Zona Oriente  0.5374546
## Zona Oeste    0.7826088
## 
## $`Dim 2`$col
##        coord
## 4 -0.3798066
## 5 -0.2042818
## 3  0.2066347
## 6  0.5385722

RESULTADOS Análisis de Conglomerados ((Clustering))

La representación gráfica resultante ofrece una perspectiva de las interacciones entre las variables “estrato” y “zona” en el sector inmobiliario. Esta visualización permite identificar patrones y orienta la segmentacion de las viviendas

4 Resultados finales

Análisis de Componentes Principales: Esta técnica te ayuda a reducir la dimensionalidad de tus datos mientras mantienes la mayor parte de la variabilidad. Puede ser útil para visualizar patrones en datos de alta dimensión .se logra identifiCar regfistro no utiles y fue necesario eliminar los regsitros para relaizar un analisis mas preciso minimanzo el error

Se logra identificar que los componentes de “estrato”, “preciom”, “areaconst”, “banios”, “habitac” son los adecuados para la medicion y la estrecha relacion en las variables de estrato y precio, formando un grupo que presenta un mayor efecto sobre el primer componente con un total de 58.7% de la varianza observada de los datos.

Análisis de Conglomerados:Apoyo el analisis en la agrupacion de las observaciones similares juntas estableciendo la medicon presento 10 cluster de los cuales Se identifica gran relacion en los cluster 1,2 3 con unos Coeficiente de Silhouettek=2 : 0.6630623– k=3 : 0.4823289 — k=4 : 0.3144261. Estableciento una gran medicion en el cluter 2 , el cual es el mas cercano a 1 .

Análisis de Correspondencia: Se logra identificar que las variables (“estrato” y “zona”) tienen las mas grandes y posibles relaciones lineales y la decision a tomar depende en gran dedida de estas 2 diemnciones.