Actividad 1 - Evaluación de la oferta inmobiliaria urbana

# Importación de datos
#install.packages(devtools) # solo una vez
#devtools::install_github("dgonxalex80/paqueteMODELOS", force = TRUE)
#library(paqueteMODELOS)
#data(vivenda)
#str(vivienda)
# Carga los datos
datos <- read.csv("vivienda.csv")

# Crea el objeto "vivienda"
vivienda <- data.frame(datos)

# Verifica si el objeto "vivienda" se ha creado correctamente
str(vivienda)
## 'data.frame':    8322 obs. of  13 variables:
##  $ id          : int  1147 1169 1350 5992 1212 1724 2326 4386 1209 1592 ...
##  $ zona        : chr  "Zona Oriente" "Zona Oriente" "Zona Oriente" "Zona Sur" ...
##  $ piso        : int  NA NA NA 2 1 1 1 1 2 2 ...
##  $ estrato     : int  3 3 3 4 5 5 4 5 5 5 ...
##  $ preciom     : int  250 320 350 400 260 240 220 310 320 780 ...
##  $ areaconst   : num  70 120 220 280 90 87 52 137 150 380 ...
##  $ parqueaderos: int  1 1 2 3 1 1 2 2 2 2 ...
##  $ banios      : int  3 2 2 5 2 3 2 3 4 3 ...
##  $ habitaciones: int  6 3 4 3 3 3 3 4 6 3 ...
##  $ tipo        : chr  "Casa" "Casa" "Casa" "Casa" ...
##  $ barrio      : chr  "20 de julio" "20 de julio" "20 de julio" "3 de julio" ...
##  $ longitud    : num  -76.5 -76.5 -76.5 -76.5 -76.5 ...
##  $ latitud     : num  3.43 3.43 3.44 3.44 3.46 ...
#write.csv(vivienda, "vivienda.csv", row.names = FALSE)

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.

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.

#Cargamos los datos y paquetes adicionales necesarios

#install.packages("tidyverse")
#install.packages("corrplot")
#install.packages("leaflet")
#install.packages("mapview")
#install.packages("table1")
#install.packages("leaflet.extras")
#install.packages("base")
#install.packages("zoo")


library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.4.4     ✔ tibble    3.2.1
## ✔ lubridate 1.9.3     ✔ tidyr     1.3.1
## ✔ purrr     1.0.2     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(corrplot)
## corrplot 0.92 loaded
library(leaflet)
library(leaflet.extras)
library(base)
library(zoo)
## 
## Attaching package: 'zoo'
## 
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
#install.packages("factoextra")
library(factoextra)
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
#install.packages("missForest")
library(missForest)
#Verificamos la cantidad de filas y columnas que tiene el dataset
str(vivienda)
## 'data.frame':    8322 obs. of  13 variables:
##  $ id          : int  1147 1169 1350 5992 1212 1724 2326 4386 1209 1592 ...
##  $ zona        : chr  "Zona Oriente" "Zona Oriente" "Zona Oriente" "Zona Sur" ...
##  $ piso        : int  NA NA NA 2 1 1 1 1 2 2 ...
##  $ estrato     : int  3 3 3 4 5 5 4 5 5 5 ...
##  $ preciom     : int  250 320 350 400 260 240 220 310 320 780 ...
##  $ areaconst   : num  70 120 220 280 90 87 52 137 150 380 ...
##  $ parqueaderos: int  1 1 2 3 1 1 2 2 2 2 ...
##  $ banios      : int  3 2 2 5 2 3 2 3 4 3 ...
##  $ habitaciones: int  6 3 4 3 3 3 3 4 6 3 ...
##  $ tipo        : chr  "Casa" "Casa" "Casa" "Casa" ...
##  $ barrio      : chr  "20 de julio" "20 de julio" "20 de julio" "3 de julio" ...
##  $ longitud    : num  -76.5 -76.5 -76.5 -76.5 -76.5 ...
##  $ latitud     : num  3.43 3.43 3.44 3.44 3.46 ...
head(vivienda)
##     id         zona piso estrato preciom areaconst parqueaderos banios
## 1 1147 Zona Oriente   NA       3     250        70            1      3
## 2 1169 Zona Oriente   NA       3     320       120            1      2
## 3 1350 Zona Oriente   NA       3     350       220            2      2
## 4 5992     Zona Sur    2       4     400       280            3      5
## 5 1212   Zona Norte    1       5     260        90            1      2
## 6 1724   Zona Norte    1       5     240        87            1      3
##   habitaciones        tipo      barrio  longitud latitud
## 1            6        Casa 20 de julio -76.51168 3.43382
## 2            3        Casa 20 de julio -76.51237 3.43369
## 3            4        Casa 20 de julio -76.51537 3.43566
## 4            3        Casa  3 de julio -76.54000 3.43500
## 5            3 Apartamento       acopi -76.51350 3.45891
## 6            3 Apartamento       acopi -76.51700 3.36971
# Realizamos una copia del dataset original

#vivienda_copy <- copy(vivienda)
  • Realizamos un resumen estadístico
# Muestra un resumen estadístico de las variables numéricas en el dataset.
summary(vivienda)  
##        id           zona                piso           estrato     
##  Min.   :   1   Length:8322        Min.   : 1.000   Min.   :3.000  
##  1st Qu.:2080   Class :character   1st Qu.: 2.000   1st Qu.:4.000  
##  Median :4160   Mode  :character   Median : 3.000   Median :5.000  
##  Mean   :4160                      Mean   : 3.771   Mean   :4.634  
##  3rd Qu.:6240                      3rd Qu.: 5.000   3rd Qu.:5.000  
##  Max.   :8319                      Max.   :12.000   Max.   :6.000  
##  NA's   :3                         NA's   :2638     NA's   :3      
##     preciom         areaconst       parqueaderos        banios      
##  Min.   :  58.0   Min.   :  30.0   Min.   : 1.000   Min.   : 0.000  
##  1st Qu.: 220.0   1st Qu.:  80.0   1st Qu.: 1.000   1st Qu.: 2.000  
##  Median : 330.0   Median : 123.0   Median : 2.000   Median : 3.000  
##  Mean   : 433.9   Mean   : 174.9   Mean   : 1.835   Mean   : 3.111  
##  3rd Qu.: 540.0   3rd Qu.: 229.0   3rd Qu.: 2.000   3rd Qu.: 4.000  
##  Max.   :1999.0   Max.   :1745.0   Max.   :10.000   Max.   :10.000  
##  NA's   :2        NA's   :3        NA's   :1605     NA's   :3       
##   habitaciones        tipo              barrio             longitud     
##  Min.   : 0.000   Length:8322        Length:8322        Min.   :-76.59  
##  1st Qu.: 3.000   Class :character   Class :character   1st Qu.:-76.54  
##  Median : 3.000   Mode  :character   Mode  :character   Median :-76.53  
##  Mean   : 3.605                                         Mean   :-76.53  
##  3rd Qu.: 4.000                                         3rd Qu.:-76.52  
##  Max.   :10.000                                         Max.   :-76.46  
##  NA's   :3                                              NA's   :3       
##     latitud     
##  Min.   :3.333  
##  1st Qu.:3.381  
##  Median :3.416  
##  Mean   :3.418  
##  3rd Qu.:3.452  
##  Max.   :3.498  
##  NA's   :3
  • Visualizamos los datos
#Porcentaje de distribución de las zonas
Dist_Zonas = table(vivienda$zona)/length(vivienda$estrato)*100
Dist_Zonas
## 
##  Zona Centro   Zona Norte   Zona Oeste Zona Oriente     Zona Sur 
##     1.490026    23.071377    14.395578     4.217736    56.789233
#Gráfico de barras para la zona

ggplot(vivienda, aes(x = zona)) +
  geom_bar()

#Histograma de distribución de los estratos

ggplot(vivienda, aes(x = estrato)) +
  geom_histogram(bins = 30)
## Warning: Removed 3 rows containing non-finite values (`stat_bin()`).

#Cómo se distribuyen los precios de las viviendas

ggplot(vivienda, aes(x = preciom)) +
  geom_histogram(bins = 30)
## Warning: Removed 2 rows containing non-finite values (`stat_bin()`).

Análisis de Componentes Principales PCA

Este análisis consiste en describir la variación producida por las observaciones de p variables aleatorias, mediante un conjunto de nuevas variables que están correlacionadas entre si, denominadas componentes y que están conformadas por combinación lineal de las variables originales.

vivienda_scale= vivienda[, 3:9]
# Convertimos Piso en numérico (Anteriormente está como categórico)
vivienda_scale$piso <- as.numeric(vivienda_scale$piso)
# Reemplazamos los NA por cero

viviendas_sin_na <- replace(vivienda_scale, is.na(vivienda_scale), 0)
head(viviendas_sin_na)
##   piso estrato preciom areaconst parqueaderos banios habitaciones
## 1    0       3     250        70            1      3            6
## 2    0       3     320       120            1      2            3
## 3    0       3     350       220            2      2            4
## 4    2       4     400       280            3      5            3
## 5    1       5     260        90            1      2            3
## 6    1       5     240        87            1      3            3
prcomp(viviendas_sin_na)
## Standard deviations (1, .., p=7):
## [1] 344.4662164  99.0796550   2.7296511   1.3910664   1.0245999   0.7965084
## [7]   0.6374926
## 
## Rotation (n x k) = (7 x 7):
##                        PC1           PC2          PC3           PC4
## piso          0.0004573421 -5.562096e-03  0.997479024 -0.0418302696
## estrato      -0.0017621859 -2.648470e-03  0.040422931  0.0728490783
## preciom      -0.9499197222 -3.124671e-01 -0.001505748  0.0004024692
## areaconst    -0.3124642717  9.498828e-01  0.005789996  0.0073176391
## parqueaderos -0.0023193042 -2.099384e-05  0.032478661 -0.0757735536
## banios       -0.0028656735  2.820808e-03 -0.002335654 -0.5436848524
## habitaciones -0.0013017755  6.412748e-03 -0.048015339 -0.8315976673
##                        PC5          PC6           PC7
## piso          0.0552449364 -0.012628227  0.0065729403
## estrato      -0.4738024973  0.508128922 -0.7143983977
## preciom       0.0036011189 -0.001167243  0.0002388284
## areaconst    -0.0004606223  0.001080919 -0.0006025970
## parqueaderos -0.7916462095 -0.598084248  0.0937530637
## banios       -0.3061823852  0.559546477  0.5454770795
## habitaciones  0.2280233240 -0.266169060 -0.4280845996

Elección del número de Componentes Principales

res.pca <- prcomp(viviendas_sin_na)
fviz_eig(res.pca, addlabels = TRUE)

En este caso, el primer componente principal explica el 92.4% de la variabilidad contenida en la base de datos.

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

### Observando el gráfico de los componentes principales, observamos en este ejercicio que el primer CP está asociado el preciom mientras que el segundo (aunque muy alejado) es el área construida.

datos<- rbind(vivienda[1762,], # ok
vivienda[2878,],
vivienda[1797,],
vivienda[8000,])

datos <- as.data.frame(datos)
rownames(datos) = c("Inmueble 1762","Inmueble 2878","Inmueble 1797","Inmueble 8000")
datos
##                 id       zona piso estrato preciom areaconst parqueaderos
## Inmueble 1762 5684   Zona Sur   NA       6    1800      1586           10
## Inmueble 2878 6472   Zona Sur    3       5     170       605            1
## Inmueble 1797 6136   Zona Sur   NA       6    1800       850            6
## Inmueble 8000 3800 Zona Norte   11       5     550       660            1
##               banios habitaciones        tipo        barrio  longitud latitud
## Inmueble 1762      4            5        Casa ciudad jardín -76.53798 3.35961
## Inmueble 2878      2            2 Apartamento    el limonar -76.54294 3.39992
## Inmueble 1797      6            4        Casa ciudad jardín -76.54098 3.35723
## Inmueble 8000      5            0 Apartamento     versalles -76.52862 3.45962
casos1 <- rbind(res.pca$x[8000,1:2],res.pca$x[2878]) # CP1
rownames(casos1) = c("78","5284")
casos1 <- as.data.frame(casos1)

casos2 <- rbind(res.pca$x[1797,1:2], res.pca$x[1762,1:2]) # CP2
rownames(casos2) = c("8236","5865")
casos2 <- as.data.frame(casos2)

fviz_pca_ind(res.pca, col.ind = "#DEDEDE", gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07")) +
geom_point(data = casos1, aes(x = PC1, y = PC2), color = "red", size = 3) +
geom_point(data = casos2, aes(x = PC1, y = PC2), color = "blue", size = 3)

datos<- rbind(vivienda[1762,], # ok
vivienda[2878,],
vivienda[1797,],
vivienda[8000,])

datos <- as.data.frame(datos)
rownames(datos) = c("Inmueble 1762","Inmueble 2878","Inmueble 1797","Inmueble 8000")
datos
##                 id       zona piso estrato preciom areaconst parqueaderos
## Inmueble 1762 5684   Zona Sur   NA       6    1800      1586           10
## Inmueble 2878 6472   Zona Sur    3       5     170       605            1
## Inmueble 1797 6136   Zona Sur   NA       6    1800       850            6
## Inmueble 8000 3800 Zona Norte   11       5     550       660            1
##               banios habitaciones        tipo        barrio  longitud latitud
## Inmueble 1762      4            5        Casa ciudad jardín -76.53798 3.35961
## Inmueble 2878      2            2 Apartamento    el limonar -76.54294 3.39992
## Inmueble 1797      6            4        Casa ciudad jardín -76.54098 3.35723
## Inmueble 8000      5            0 Apartamento     versalles -76.52862 3.45962

Encontramos que el Inmueble 1762 (Id 5684) tiene un precio de $1.800 y un área construida de 1.586 y se encuentra en el extremo izquierado junto al Inmueble 1797.

Análisis de Conglomerados

El análisis de conglomerados (clusters) es una técnica estadística que permite agrupar observaciones en función de sus características comunes. En el caso de la base de datos Vivienda, podemos realizar un análisis de clusters para identificar diferentes tipos de viviendas en función de variables como precio, zona, estrato, etc.

1.Selección de Variables

Las variables más relevantes para este caso podrían ser: precio, zona, estrato, área construida, número de habitaciones, número de baños, número de parqueaderos y tipo vivienda.
# Seleccionar variables
variables <- c("zona", "estrato", "preciom", "areaconst", "parqueaderos", "banios", "habitaciones", "tipo")
vivienda_nuevo <- vivienda[, variables]
# Asignamos valores numéricos a las variables categóricas
# Zona: Zona Sur = 1, Zona Norte = 2, Zona Oeste = 3, Zona Centro = 4
# Tipo: Casa = 1, Apartamento = 2

vivienda_nuevo$zona <- ifelse(vivienda_nuevo$zona == "Zona Sur", 1,
                        ifelse(vivienda_nuevo$zona == "Zona Norte", 2,
                               ifelse(vivienda_nuevo$zona == "Zona Oeste", 3,
                                      ifelse(vivienda_nuevo$zona == "Zona Centro", 4,NA))))

vivienda_nuevo$tipo <- ifelse(vivienda_nuevo$tipo == "Casa", 1,
                       ifelse(vivienda_nuevo$tipo == "Apartamento", 2, NA))

# Verificar resultados
summary(vivienda_nuevo)
##       zona          estrato         preciom         areaconst     
##  Min.   :1.000   Min.   :3.000   Min.   :  58.0   Min.   :  30.0  
##  1st Qu.:1.000   1st Qu.:4.000   1st Qu.: 220.0   1st Qu.:  80.0  
##  Median :1.000   Median :5.000   Median : 330.0   Median : 123.0  
##  Mean   :1.588   Mean   :4.634   Mean   : 433.9   Mean   : 174.9  
##  3rd Qu.:2.000   3rd Qu.:5.000   3rd Qu.: 540.0   3rd Qu.: 229.0  
##  Max.   :4.000   Max.   :6.000   Max.   :1999.0   Max.   :1745.0  
##  NA's   :354     NA's   :3       NA's   :2        NA's   :3       
##   parqueaderos        banios        habitaciones         tipo      
##  Min.   : 1.000   Min.   : 0.000   Min.   : 0.000   Min.   :1.000  
##  1st Qu.: 1.000   1st Qu.: 2.000   1st Qu.: 3.000   1st Qu.:1.000  
##  Median : 2.000   Median : 3.000   Median : 3.000   Median :2.000  
##  Mean   : 1.835   Mean   : 3.111   Mean   : 3.605   Mean   :1.613  
##  3rd Qu.: 2.000   3rd Qu.: 4.000   3rd Qu.: 4.000   3rd Qu.:2.000  
##  Max.   :10.000   Max.   :10.000   Max.   :10.000   Max.   :2.000  
##  NA's   :1605     NA's   :3        NA's   :3        NA's   :3
head(vivienda_nuevo)
##   zona estrato preciom areaconst parqueaderos banios habitaciones tipo
## 1   NA       3     250        70            1      3            6    1
## 2   NA       3     320       120            1      2            3    1
## 3   NA       3     350       220            2      2            4    1
## 4    1       4     400       280            3      5            3    1
## 5    2       5     260        90            1      2            3    2
## 6    2       5     240        87            1      3            3    2
# Muestra un resumen estadístico de las variables numéricas en el dataset.
summary(vivienda_nuevo)  
##       zona          estrato         preciom         areaconst     
##  Min.   :1.000   Min.   :3.000   Min.   :  58.0   Min.   :  30.0  
##  1st Qu.:1.000   1st Qu.:4.000   1st Qu.: 220.0   1st Qu.:  80.0  
##  Median :1.000   Median :5.000   Median : 330.0   Median : 123.0  
##  Mean   :1.588   Mean   :4.634   Mean   : 433.9   Mean   : 174.9  
##  3rd Qu.:2.000   3rd Qu.:5.000   3rd Qu.: 540.0   3rd Qu.: 229.0  
##  Max.   :4.000   Max.   :6.000   Max.   :1999.0   Max.   :1745.0  
##  NA's   :354     NA's   :3       NA's   :2        NA's   :3       
##   parqueaderos        banios        habitaciones         tipo      
##  Min.   : 1.000   Min.   : 0.000   Min.   : 0.000   Min.   :1.000  
##  1st Qu.: 1.000   1st Qu.: 2.000   1st Qu.: 3.000   1st Qu.:1.000  
##  Median : 2.000   Median : 3.000   Median : 3.000   Median :2.000  
##  Mean   : 1.835   Mean   : 3.111   Mean   : 3.605   Mean   :1.613  
##  3rd Qu.: 2.000   3rd Qu.: 4.000   3rd Qu.: 4.000   3rd Qu.:2.000  
##  Max.   :10.000   Max.   :10.000   Max.   :10.000   Max.   :2.000  
##  NA's   :1605     NA's   :3        NA's   :3        NA's   :3
# Reemplazamos los NA por cero

vivienda_nuevo_sin_na <- replace(vivienda_nuevo, is.na(vivienda_nuevo), 0)

head(vivienda_nuevo_sin_na)
##   zona estrato preciom areaconst parqueaderos banios habitaciones tipo
## 1    0       3     250        70            1      3            6    1
## 2    0       3     320       120            1      2            3    1
## 3    0       3     350       220            2      2            4    1
## 4    1       4     400       280            3      5            3    1
## 5    2       5     260        90            1      2            3    2
## 6    2       5     240        87            1      3            3    2

2.Selección del método de clustering

Existen diversos métodos de clustering, cada uno con sus ventajas y desventajas. Algunos de los métodos más utilizados son:

- K-means: Es un método simple y rápido que divide las observaciones en K grupos predefinidos.

- Jerárquico: Este método crea una jerarquía de clusters a partir de la distancia entre las observaciones.

- Fuzzy c-means: Es una variante del método K-means que permite que una observación pertenezca a varios clusters con diferentes grados de pertenencia.

# Para este ejemplo utilizaremos K-means
metodo <- "kmeans"
# Definir un rango de valores para k
k_values <- seq(2, 10)

# Almacenar los resultados de kmeans para cada valor de k
kmeans_results <- lapply(k_values, function(k) kmeans(vivienda_nuevo_sin_na, k))

# Calcular la suma total de cuadrados dentro para cada valor de k
withinss_values <- sapply(kmeans_results, function(res) res$withinss)
# Extraer los valores numéricos (suponiendo que cada sublista contiene un solo valor)
withinss_numeric <- sapply(withinss_values, function(x) x[[1]])

# Crear el gráfico
plot(k_values, withinss_numeric, type = "b", 
     main = "Grafica del codo", xlab = "Numero de clusters (k)", 
     ylab = "Suma total de cuadrados dentro (Withinss)")

Observamos que según la gráfica del codo, la cantidad de clusters más ideal es 4

# Realizar análisis de clusters
clusters <- kmeans(vivienda_nuevo_sin_na, 4)
# Visualizar clusters
fviz_cluster(clusters, data = vivienda_nuevo_sin_na)

# Interpretar resultados
summary(clusters)
##              Length Class  Mode   
## cluster      8322   -none- numeric
## centers        32   -none- numeric
## totss           1   -none- numeric
## withinss        4   -none- numeric
## tot.withinss    1   -none- numeric
## betweenss       1   -none- numeric
## size            4   -none- numeric
## iter            1   -none- numeric
## ifault          1   -none- numeric

Comparamos las medias de las variables entre clusters

#Obtener la media de los Cluster
aggregate(vivienda_nuevo_sin_na,by=list(clusters$cluster),FUN=mean)
##   Group.1     zona  estrato   preciom areaconst parqueaderos   banios
## 1       1 1.835271 5.798450 1389.8740 444.22180    3.4864341 5.189922
## 2       2 1.627916 4.852644  434.5793 196.60568    1.6419129 3.505443
## 3       3 1.733844 5.530612  779.9439 306.76613    2.4515306 4.543367
## 4       4 1.351158 4.083292  211.3982  88.62457    0.8432725 2.179892
##   habitaciones     tipo
## 1     4.315891 1.383721
## 2     4.018274 1.460342
## 3     4.259354 1.414966
## 4     3.061114 1.795219

validando las medias de las variables, vemos que el Cluster 1 está cercano al estrato 5, que tiene un preciom promedio de $434 millones y un área construida promedio de 196 metros, mientras que el cluster 2 tiene un preciom promedio de $211 millones y un área construida promedio de 88 metros, para el cluster 3, el precio es de $1.389 millones y el área es de 444 metros y finalmente para el cluster 4, el precio es de $779 millones y el área es de 306 metros.

Análisis de Correspondencia

El Análisis de Correspondencia es un método estadístico utilizado para representar posibles asociaciones entre variables categóricas, es decir la asociación entre sus cagarías, con el fin establecer si existe, patrones o estructuras en los datos.

# Seleccionar variables
variables <- c("zona", "estrato", "preciom", "areaconst", "parqueaderos", "banios", "habitaciones", "tipo")
vivienda_nuevo_2 <- vivienda[, variables]
# Trabajaremos con una copia del dataframe del punto anterior 

Vivienda_correspondencia = vivienda_nuevo_2
head(Vivienda_correspondencia)
##           zona estrato preciom areaconst parqueaderos banios habitaciones
## 1 Zona Oriente       3     250        70            1      3            6
## 2 Zona Oriente       3     320       120            1      2            3
## 3 Zona Oriente       3     350       220            2      2            4
## 4     Zona Sur       4     400       280            3      5            3
## 5   Zona Norte       5     260        90            1      2            3
## 6   Zona Norte       5     240        87            1      3            3
##          tipo
## 1        Casa
## 2        Casa
## 3        Casa
## 4        Casa
## 5 Apartamento
## 6 Apartamento
#Convertimos estrato en factor
Vivienda_correspondencia$estrato <- as.factor(Vivienda_correspondencia$estrato)
#Validamos datos faltantes
summary(Vivienda_correspondencia)
##      zona           estrato        preciom         areaconst     
##  Length:8322        3   :1453   Min.   :  58.0   Min.   :  30.0  
##  Class :character   4   :2129   1st Qu.: 220.0   1st Qu.:  80.0  
##  Mode  :character   5   :2750   Median : 330.0   Median : 123.0  
##                     6   :1987   Mean   : 433.9   Mean   : 174.9  
##                     NA's:   3   3rd Qu.: 540.0   3rd Qu.: 229.0  
##                                 Max.   :1999.0   Max.   :1745.0  
##                                 NA's   :2        NA's   :3       
##   parqueaderos        banios        habitaciones        tipo          
##  Min.   : 1.000   Min.   : 0.000   Min.   : 0.000   Length:8322       
##  1st Qu.: 1.000   1st Qu.: 2.000   1st Qu.: 3.000   Class :character  
##  Median : 2.000   Median : 3.000   Median : 3.000   Mode  :character  
##  Mean   : 1.835   Mean   : 3.111   Mean   : 3.605                     
##  3rd Qu.: 2.000   3rd Qu.: 4.000   3rd Qu.: 4.000                     
##  Max.   :10.000   Max.   :10.000   Max.   :10.000                     
##  NA's   :1605     NA's   :3        NA's   :3

Tenemos varios atributos con datos faltantes, para el fin de este ejercicio, eliminaremos dichos faltantes

Vivienda_correspondencia <- na.omit(Vivienda_correspondencia)
summary(Vivienda_correspondencia)
##      zona           estrato     preciom         areaconst       parqueaderos   
##  Length:6717        3: 684   Min.   :  58.0   Min.   :  30.0   Min.   : 1.000  
##  Class :character   4:1641   1st Qu.: 248.0   1st Qu.:  86.0   1st Qu.: 1.000  
##  Mode  :character   5:2522   Median : 355.0   Median : 130.0   Median : 2.000  
##                     6:1870   Mean   : 468.9   Mean   : 181.1   Mean   : 1.835  
##                              3rd Qu.: 580.0   3rd Qu.: 233.0   3rd Qu.: 2.000  
##                              Max.   :1999.0   Max.   :1745.0   Max.   :10.000  
##      banios        habitaciones        tipo          
##  Min.   : 0.000   Min.   : 0.000   Length:6717       
##  1st Qu.: 2.000   1st Qu.: 3.000   Class :character  
##  Median : 3.000   Median : 3.000   Mode  :character  
##  Mean   : 3.255   Mean   : 3.611                     
##  3rd Qu.: 4.000   3rd Qu.: 4.000                     
##  Max.   :10.000   Max.   :10.000
Construiremos tablas para hacer combinaciones de variables, la tabla uno tendrá la zona y el estrato, la tabla dos tendrá la zona y el tipo y la tabla tres tendrá el tipo y el estrato.
library(FactoMineR)
tabla_1 <- table(Vivienda_correspondencia$zona, Vivienda_correspondencia$estrato)
colnames(tabla_1) <- c("Estrato3", "Estrato4", "Estrato5", "Estrato6" )
tabla_1
##               
##                Estrato3 Estrato4 Estrato5 Estrato6
##   Zona Centro        53        8        3        0
##   Zona Norte        237      268      669      113
##   Zona Oeste         24       62      265      747
##   Zona Oriente      159        2        1        1
##   Zona Sur          211     1301     1584     1009
tabla_2 <- table(Vivienda_correspondencia$zona, Vivienda_correspondencia$tipo)
colnames(tabla_2) <- c("Casa", "Apartamento")
tabla_2
##               
##                Casa Apartamento
##   Zona Centro    10          54
##   Zona Norte    852         435
##   Zona Oeste    966         132
##   Zona Oriente   22         141
##   Zona Sur     2381        1724
tabla_3 <- table(Vivienda_correspondencia$tipo, Vivienda_correspondencia$estrato)
colnames(tabla_3) <- c("Estrato3", "Estrato4", "Estrato5", "Estrato6" )
tabla_3
##              
##               Estrato3 Estrato4 Estrato5 Estrato6
##   Apartamento      296     1047     1659     1229
##   Casa             388      594      863      641
chisq.test(tabla_1)
## 
##  Pearson's Chi-squared test
## 
## data:  tabla_1
## X-squared = 3188.9, df = 12, p-value < 2.2e-16
chisq.test(tabla_2)
## 
##  Pearson's Chi-squared test
## 
## data:  tabla_2
## X-squared = 576.44, df = 4, p-value < 2.2e-16
chisq.test(tabla_3)
## 
##  Pearson's Chi-squared test
## 
## data:  tabla_3
## X-squared = 128.92, df = 3, p-value < 2.2e-16
Se rechaza la hipótesis de independencia de las variables en los 3 casos (p-value < 2.2e-16),indicando grado tipo de relación entre ellas.

Procedemos a realizar el análisis de correspondencia y representarlas en un plano cartesiano.

# Tabla uno
resultados_ac_1 <- CA(tabla_1)

El gráfico nos permite establecer las siguientes relaciones
- El estrato 6 se encuentra en la Zona Oeste.
- El estrato 4 y 5 se encuentra en la Zona Sur y Norte.
- El estrato 3 se encuentra en la Zona Centro y Oriente.
# Tabla dos
resultados_ac_2 <- CA(tabla_2)
# Tabla dos
resultados_ac_3 <- CA(tabla_3)
#Valores propios de la varianza acumulada de la tabla uno
valores_prop_1 <-resultados_ac_1$eig ; valores_prop_1
##       eigenvalue percentage of variance cumulative percentage of variance
## dim 1 0.31503422              66.358860                          66.35886
## dim 2 0.14320084              30.163848                          96.52271
## dim 3 0.01650821               3.477292                         100.00000
fviz_screeplot(resultados_ac_1, addlabels = TRUE, ylim = c(0, 80))+ggtitle("")+
ylab("Porcentaje de varianza explicado") + xlab("Ejes")

#Valores propios de la varianza acumulada de la tabla dos
valores_prop_2 <-resultados_ac_2$eig ; valores_prop_2
##       eigenvalue percentage of variance cumulative percentage of variance
## dim 1   0.085818                    100                               100
fviz_screeplot(resultados_ac_2, addlabels = TRUE, ylim = c(0, 80))+ggtitle("")+
ylab("Porcentaje de varianza explicado") + xlab("Ejes")
## `geom_line()`: Each group consists of only one observation.
## ℹ Do you need to adjust the group aesthetic?

#Valores propios de la varianza acumulada de la tabla tres
valores_prop_3 <-resultados_ac_3$eig ; valores_prop_3
##       eigenvalue percentage of variance cumulative percentage of variance
## dim 1 0.01919318                    100                               100
fviz_screeplot(resultados_ac_3, addlabels = TRUE, ylim = c(0, 80))+ggtitle("")+
ylab("Porcentaje de varianza explicado") + xlab("Ejes")
## `geom_line()`: Each group consists of only one observation.
## ℹ Do you need to adjust the group aesthetic?

En los gráficos anteriores, vemos que en la tabla uno el primer componente explica el 66.4% y entre los dos primeros representan el 96.6%, mientras que en la tabla 2 y 3 solo se tiene un componente que representa el 100% de la información.

Conclusiones

- Encontramos que el componente principal 1, representado por el precio explica el 92% de la variabilidad, seguido por el área construida.

- Realizamos un análisis de codo y entendimos que la mejor cantidad de clusters era de 4 grupos principales

- Vemos que el Cluster 1 está cercano al estrato 5, que tiene un preciom promedio de $434 millones y un área construida promedio de 196 metros, mientras que el cluster 2 tiene un preciom promedio de $211 millones y un área construida promedio de 88 metros, para el cluster 3, el precio es de $1.389 millones y el área es de 444 metros y finalmente para el cluster 4, el precio es de $779 millones y el área es de 306 metros.

- La información sobre los clusters puede ser útil para la segmentación del mercado inmobiliario, el análisis de precios y las estrategias de marketing.

- La gráfica de AC muestra una asociación positiva entre las variables “Precio” y “Tamaño”. Esto indica que las viviendas con mayor tamaño tienden a tener un precio más alto.

- Se observan diferencias en las características de las viviendas según el estrato socioeconómico y la zona.

Recomendaciones específicas:

- Segmentación del mercado: Utilizar los componentes principales para segmentar el mercado en diferentes grupos de potenciales compradores.

- Análisis de precios: Ajustar los precios de las viviendas de acuerdo a su ubicación en el espacio de los componentes principales.

- Marketing: Dirigir las estrategias de marketing a los diferentes grupos de potenciales compradores.