# Cargar los datos
vivienda <- read.csv("vivienda.csv")
# Explorar la estructura de los datos
str(vivienda)
## 'data.frame': 8322 obs. of 13 variables:
## $ id : int 8312 8311 8307 8296 8297 8298 8299 8300 8286 8287 ...
## $ zona : chr "Zona Oeste" "Zona Oeste" "Zona Oeste" "Zona Sur" ...
## $ piso : int 4 1 NA 2 NA NA 2 NA NA 2 ...
## $ 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 ...
## $ parquea : int 2 1 4 1 2 8 2 4 1 2 ...
## $ 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 ...
# Seleccionar las columnas numéricas para el PCA
cols_numericas <- c("estrato", "preciom", "areaconst", "parquea", "banios", "habitac")
datos_pca <- vivienda %>%
select(all_of(cols_numericas))
# Convertir valores nulos a 0 en la columna "parquea"
datos_pca <- datos_pca %>%
mutate(parquea = ifelse(is.na(parquea), 0, parquea))
# Convertir la columna "areaconst" de decimal a entero
datos_pca <- datos_pca %>%
mutate(areaconst = as.integer(areaconst))
# Verificar valores infinitos
#infinite_values <- sum(is.infinite(datos_pca))
# Verificar valores faltantes
missing_values <- sum(is.na(datos_pca))
# Eliminar filas con valores faltantes
datos_pca <- na.omit(datos_pca)
# Imputar valores faltantes con 0
datos_pca[is.na(datos_pca)] <- 0
# Escalar los datos
datos_pca_scaled <- scale(datos_pca)
# Explorar la estructura del nuevo df
str(datos_pca)
## 'data.frame': 8319 obs. of 6 variables:
## $ 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: int 318 300 800 150 112 390 125 280 74 120 ...
## $ parquea : num 2 1 4 1 2 8 2 4 1 2 ...
## $ banios : int 4 4 7 2 4 10 3 4 2 4 ...
## $ habitac : int 2 4 5 4 3 10 3 4 3 3 ...
## - attr(*, "na.action")= 'omit' Named int [1:3] 8320 8321 8322
## ..- attr(*, "names")= chr [1:3] "8320" "8321" "8322"
head(datos_pca, n = 10)
## estrato preciom areaconst parquea banios habitac
## 1 6 1300 318 2 4 2
## 2 6 480 300 1 4 4
## 3 5 1200 800 4 7 5
## 4 3 220 150 1 2 4
## 5 5 330 112 2 4 3
## 6 5 1350 390 8 10 10
## 7 6 305 125 2 3 3
## 8 5 480 280 4 4 4
## 9 5 275 74 1 2 3
## 10 5 285 120 2 4 3
# Resumen estadístico de los datos
summary(datos_pca)
## estrato preciom areaconst parquea
## Min. :3.000 Min. : 58.0 Min. : 30.0 Min. : 0.000
## 1st Qu.:4.000 1st Qu.: 220.0 1st Qu.: 80.0 1st Qu.: 1.000
## Median :5.000 Median : 330.0 Median : 123.0 Median : 1.000
## Mean :4.634 Mean : 433.9 Mean : 174.9 Mean : 1.482
## 3rd Qu.:5.000 3rd Qu.: 540.0 3rd Qu.: 229.0 3rd Qu.: 2.000
## Max. :6.000 Max. :1999.0 Max. :1745.0 Max. :10.000
## banios habitac
## Min. : 0.000 Min. : 0.000
## 1st Qu.: 2.000 1st Qu.: 3.000
## Median : 3.000 Median : 3.000
## Mean : 3.111 Mean : 3.605
## 3rd Qu.: 4.000 3rd Qu.: 4.000
## Max. :10.000 Max. :10.000
# Realizar el PCA
pca_result <- prcomp(datos_pca, scale = TRUE)
# Variabilidad explicada por cada componente principal
var_explained <- pca_result$sdev^2 / sum(pca_result$sdev^2)
# Matriz de componentes principales
loadings <- pca_result$rotation
# Imprimir la varianza explicada
var_explained
## [1] 0.56922533 0.20990635 0.07660632 0.07243269 0.04017715 0.03165216
# Gráfico de varianza explicada acumulada
cumulative_var <- cumsum(var_explained)
plot(cumulative_var, type = "b", xlab = "Número de Componentes", ylab = "Varianza Explicada Acumulada")
# Gráfico de dispersión
fviz_pca_biplot(pca_result, geom.ind = "point", geom.var = "text")
# Realizar el análisis de conglomerados
num_clusters <- 4 # Número de clústeres deseado
clusters <- kmeans(datos_pca, centers = num_clusters)
# Agregar resultados al dataframe original
datos_pca$cluster <- clusters$cluster
# Gráfico de dispersión de los clústeres
fviz_cluster(clusters, data = datos_pca, geom = "point")
# Tabla de resumen de los clústeres
cluster_summary <- data.frame(ID = 1:nrow(datos_pca), Cluster = clusters$cluster)
# Agregar etiquetas a los clústeres
etiquetas <- c("Cluster 1", "Cluster 2", "Cluster 3", "Cluster 4")
cluster_summary$Cluster <- factor(cluster_summary$Cluster, levels = 1:num_clusters, labels = etiquetas)
# Limitar la tabla de resumen de clústeres a las primeras 10 filas
cluster_summary_limit <- head(cluster_summary, 10)
# Imprimir tabla de resumen de clústeres
knitr::kable(cluster_summary_limit, caption = "Tabla de Resumen de Clústeres")
| ID | Cluster |
|---|---|
| 1 | Cluster 4 |
| 2 | Cluster 1 |
| 3 | Cluster 4 |
| 4 | Cluster 3 |
| 5 | Cluster 3 |
| 6 | Cluster 4 |
| 7 | Cluster 3 |
| 8 | Cluster 1 |
| 9 | Cluster 3 |
| 10 | Cluster 3 |
# Descripción de cada clúster
cluster_desc <- datos_pca %>%
group_by(cluster) %>%
summarise(Media_Estrato = mean(estrato),
Media_PrecioM = mean(preciom),
Media_AreaConst = mean(areaconst),
Media_Parquea = mean(parquea),
Media_Banios = mean(banios),
Media_Habitac = mean(habitac))
# Imprimir descripción de clústeres
knitr::kable(cluster_desc, caption = "Descripción de los Clústeres")
| cluster | Media_Estrato | Media_PrecioM | Media_AreaConst | Media_Parquea | Media_Banios | Media_Habitac |
|---|---|---|---|---|---|---|
| 1 | 4.852644 | 434.5793 | 196.59642 | 1.6419129 | 3.505443 | 4.018274 |
| 2 | 5.530612 | 779.9439 | 306.75680 | 2.4515306 | 4.543367 | 4.259354 |
| 3 | 4.086313 | 211.4732 | 88.68039 | 0.8438964 | 2.181504 | 3.063378 |
| 4 | 5.798450 | 1389.8740 | 444.21705 | 3.4864341 | 5.189922 | 4.315892 |
# Cargando la bd origen
vivienda2 <- read.csv("vivienda.csv")
# Seleccionar las columnas para el MCA
cols_mca <- c("tipo", "zona", "barrio", "preciom", "areaconst", "parquea", "banios", "habitac")
datos_mca <- vivienda2 %>%
select(all_of(cols_mca))
# Convertir valores nulos a 0 en la columna "parquea"
datos_mca <- datos_mca %>%
mutate(parquea = ifelse(is.na(parquea), 0, parquea))
# Convertir la columna "areaconst" de decimal a entero
datos_mca <- datos_mca %>%
mutate(areaconst = as.integer(areaconst))
# Eliminar filas con valores faltantes
datos_mca <- na.omit(datos_mca)
# Seleccionar las variables categóricas y numéricas para el análisis
variables_categoricas <- datos_mca %>% select(tipo, zona, barrio)
variables_numericas <- datos_mca %>% select(preciom, areaconst, parquea, banios, habitac)
# Definir intervalos para las variables numéricas
intervalos_preciom <- cut(datos_mca$preciom, breaks = c(0, 100000, 200000, 300000, Inf))
intervalos_areaconst <- cut(datos_mca$areaconst, breaks = c(0, 100, 200, 300, Inf))
intervalos_parquea <- cut(datos_mca$parquea, breaks = c(0, 1, 2, 3, Inf))
intervalos_banios <- cut(datos_mca$parquea, breaks = c(0, 1, 2, 3, Inf))
intervalos_habitac <- cut(datos_mca$parquea, breaks = c(0, 1, 2, 3, Inf))
variables_discretas <- data.frame(intervalos_preciom, intervalos_areaconst, intervalos_parquea, intervalos_banios, intervalos_habitac)
# Agregar variables categóricas originales
variables_discretas <- cbind(variables_categoricas, variables_discretas)
# Realizar el análisis de correspondencia múltiple (MCA)
mca_result <- MCA(variables_discretas)
# Visualizar los resultados del análisis de correspondencia múltiple (MCA)
fviz_mca_biplot(mca_result, repel = TRUE)
# Agregar las coordenadas del MCA al dataframe original
datos_mca$MCA1 <- mca_result$ind$coord[, 1]
datos_mca$MCA2 <- mca_result$ind$coord[, 2]
# Gráfico de dispersión con las variables categóricas en el espacio del MCA
ggplot(datos_mca, aes(x = MCA1, y = MCA2, color = tipo)) +
geom_point() +
labs(title = "Relación entre Variables Categóricas y Análisis de Correspondencia Múltiple",
x = "Dimensión 1 (MCA1)", y = "Dimensión 2 (MCA2)", color = "Tipo de Vivienda")
vivienda3 <- read.csv("vivienda.csv")
# Se toma una muestra de la bd de 4k registros
#set.seed(1234)
#vivienda3 <- sample_n(vivienda3, 4000)
# Gráfico de barras de distribución de tipos de vivienda
ggplot(vivienda3, aes(x = tipo, fill = tipo)) +
geom_bar() +
labs(title = "Distribución de Tipos de Vivienda", x = "Tipo de Vivienda", y = "Frecuencia")
# Gráfico de caja y bigote por tipo de vivienda
ggplot(vivienda3, aes(x = tipo, y = preciom)) +
geom_boxplot() +
labs(title = "Distribución de Precios por Tipo de Vivienda", x = "Tipo de Vivienda", y = "Precio")
# Gráfico de dispersión con colores por zona
ggplot(vivienda3, aes(x = preciom, y = areaconst, color = zona)) +
geom_point() +
labs(title = "Relación entre Precio y Área Construida", x = "Precio", y = "Área Construida")
# Diagrama de Venn para relaciones entre estratos socioeconómicos y zonas
# Crear tabla de contingencia
tabla_contingencia <- table(vivienda3$estrato, vivienda3$zona)
# Crear mapa de calor
heatmap_plot <- ggplot(as.data.frame(tabla_contingencia), aes(x = Var2, y = Var1, fill = Freq)) +
geom_tile() +
scale_fill_gradient(low = "white", high = "blue") +
labs(title = "Mapa de Calor: Estratos Socioeconómicos y Zonas",
x = "Zona", y = "Estrato", fill = "Frecuencia") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 90, hjust = 1))
print(heatmap_plot)
PCA (Análisis de Componentes Principales):
El PCA es esencial en este ejercicio de análisis de datos del sector inmboliario urbano (vivenda.csv) porque nos permite reducir la dimensionalidad de las variables numéricas, como el precio, área construida y características de las propiedades. Al transformar estas variables en componentes principales, podemos identificar las combinaciones más significativas de características que explican la variabilidad en los datos. Esto nos ayuda a simplificar la complejidad de los datos y a destacar patrones ocultos en las propiedades inmobiliarias.
Análisis Conglomerado:
El análisis conglomerado es valioso en este contexto ya que nos permite agrupar propiedades similares en segmentos homogéneos. Al dividir el mercado inmobiliario en grupos basados en atributos como el tipo de vivienda, el área construida y la ubicación geográfica, podemos identificar patrones específicos en diferentes partes de la ciudad y estratos socioeconómicos. Esta información es crucial para comprender las preferencias y demandas de los compradores en cada segmento.
Análisis de Correspondencia:
La realización de un análisis de correspondencia es esencial para investigar las relaciones entre variables categóricas, como el tipo de vivienda, la zona y el barrio, con las variables numéricas. Este análisis nos permite comprender cómo las características categóricas se relacionan con los atributos numéricos, como el precio y el número de parqueaderos. En lo personal encontré dificultad para desarrollar este punto siguiendo las instrucciones del material de la plataforma, ya que tomaba de referencia solo dos variables para crear la tabla y eran numéricas y en el ejercicio de la actividad nos pedían examinar la relación entre varias variables categóricas y numéricas por lo cual utilice el análisis de correspondencia múltiple transformando las variable numéricas en categorías.
Integridad de los datos:
En las columna “piso” y “parquea” se encontraron valores nulos que fueron cambiados a 0.
En la columna “areaconst” se pasó de decimal a entero.
En las columnas “yipo” y “barrio” se encontraron datos que no tenían integridad ya que existían varias versiones con diferente ortografía lo que puede significar un ruido en los datos, es necesario entender como aplicar una estandarización de los datos en este tipo de situaciones para que el análisis sea lo más relevante posible.