#install.packages("learnr")
#install.packages("devtools")
devtools::install_github("dgonxalex80/paqueteMODELOS")

Realizamos la carga de la data vivienda

library(paqueteMODELOS)
data("vivienda")

Exploracion de datos

data(vivienda)
head(vivienda)
## # A tibble: 6 × 13
##      id zona    piso  estrato preciom areaconst parqueaderos banios habitaciones
##   <dbl> <chr>   <chr>   <dbl>   <dbl>     <dbl>        <dbl>  <dbl>        <dbl>
## 1  1147 Zona O… <NA>        3     250        70            1      3            6
## 2  1169 Zona O… <NA>        3     320       120            1      2            3
## 3  1350 Zona O… <NA>        3     350       220            2      2            4
## 4  5992 Zona S… 02          4     400       280            3      5            3
## 5  1212 Zona N… 01          5     260        90            1      2            3
## 6  1724 Zona N… 01          5     240        87            1      3            3
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>

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 Exploratorio

El resumen de la base de datos

summary(vivienda)
##        id           zona               piso              estrato     
##  Min.   :   1   Length:8322        Length:8322        Min.   :3.000  
##  1st Qu.:2080   Class :character   Class :character   1st Qu.:4.000  
##  Median :4160   Mode  :character   Mode  :character   Median :5.000  
##  Mean   :4160                                         Mean   :4.634  
##  3rd Qu.:6240                                         3rd Qu.:5.000  
##  Max.   :8319                                         Max.   :6.000  
##  NA's   :3                                            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

De acuerdo a este analisis de datos podemos observar que podemos eliminar la columna id, al ser una columna unicamente informativa, pero antes de eliminarla procederemos a eliminar los registros donde este campo es nulo ya que posiblemente se traten de error en los datos. Las viviendas estudiadas abarcan una variedad de tipos, desde casas hasta apartamentos, con un rango de estratos entre 3 y 6. Sus áreas construidas van desde los 30 hasta los 1745 metros cuadrados, con un promedio de 174 metros cuadrados. En cuanto a las comodidades, se observa una amplia gama, desde viviendas sin baños hasta aquellas con hasta 10 baños disponibles. El número de habitaciones varía entre 0 y 10, con una media de 3. El estacionamiento también varía, desde ninguna plaza hasta un máximo de 10. La diversidad de cada vivienda se ve influenciada por factores como el tipo de propiedad, la ubicación geográfica y el estrato socioeconómico. Sin embargo, para los propósitos de este estudio, no profundizaremos en estos detalles.

En cuanto a la exploración de los datos, se observa la presencia de valores faltantes. Es relevante señalar que las variables “piso” y “parqueadero” son las que presentan una mayor cantidad de datos faltantes.

vivienda <- vivienda[!is.na(vivienda$id),]
vivienda <- subset(vivienda, select = -id)

Realizando un analisis del comportamiento de datos perdidos, encontramos que:

#install.packages("naniar")
require(naniar)
## Loading required package: naniar
vis_miss(vivienda)

Del grafico anterior, podemos observar que el porcentaje de datos faltantes en piso es 32% y parqueaderos es 19%.

summary(vivienda$parqueaderos)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##   1.000   1.000   2.000   1.835   2.000  10.000    1602

Dado que la mayoría de los valores se encuentran en un rango relativamente estrecho entre 1 y 2, con una mediana de 2, una opción razonable podría ser imputar el valor medio (mean) a los valores faltantes, que es aproximadamente 1.835. Pero basandonos en hechos practicos lo mejor en este caso es suponer que los valores faltantes corresponden a apartamentos o casa sin parqueaderos, por lo tanto reemplazaremos en este caso los nulos por 0.

vivienda$parqueaderos[is.na(vivienda$parqueaderos)]<-0

Nuestro siguiente paso será completar los datos faltantes a través de un proceso de imputación. Para comenzar, vamos a convertir la variable “piso”, actualmente representada como caracteres, a números. Posteriormente, analizaremos su distribución estadística para comprender mejor su comportamiento.

vivienda$piso <- as.numeric(as.character(vivienda$piso))
summary(vivienda$piso)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##   1.000   2.000   3.000   3.771   5.000  12.000    2635

Dado que la mayoría de los valores se encuentran en un rango entre 1 y 5, y la mediana es 3, podría ser razonable utilizar la mediana para imputar los valores faltantes en esta variable. La mediana es menos sensible a valores atípicos que la media, lo que la hace una opción más robusta para imputar en este caso.

vivienda$piso[is.na(vivienda$piso)]<-3

Ahora realizaremos una validación nuevamente de los datos faltantes.

#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
grafico <- md.pattern(vivienda, rotate.names = TRUE)
##  /\     /\
## {  `---'  }
## {  O   O  }
## ==>  V <==  No need for mice. This data set is completely observed.
##  \  \|/  /
##   `-----'

Conversión de Variables Categoricas a Numericas

Recordando que nuestras dos variables categorias son Zona y Tipo. Vamos a proceder a realizar una conversión de estas variables, por lo tanto realizando una exploración del campo Zona encontramos:

valores_zona <- unique(vivienda$zona)
valores_zona
## [1] "Zona Oriente" "Zona Sur"     "Zona Norte"   "Zona Oeste"   "Zona Centro"

Por lo tanto, realizando la conversión de la variable Zona, podemos observar:

vivienda$zona <- factor(vivienda$zona, levels = c("Zona Oriente", "Zona Sur", "Zona Norte", "Zona Oeste", "Zona Centro"))
vivienda$zona <- as.numeric(vivienda$zona)
head(vivienda)
## # A tibble: 6 × 12
##    zona  piso estrato preciom areaconst parqueaderos banios habitaciones tipo   
##   <dbl> <dbl>   <dbl>   <dbl>     <dbl>        <dbl>  <dbl>        <dbl> <chr>  
## 1     1     3       3     250        70            1      3            6 Casa   
## 2     1     3       3     320       120            1      2            3 Casa   
## 3     1     3       3     350       220            2      2            4 Casa   
## 4     2     2       4     400       280            3      5            3 Casa   
## 5     3     1       5     260        90            1      2            3 Aparta…
## 6     3     1       5     240        87            1      3            3 Aparta…
## # ℹ 3 more variables: barrio <chr>, longitud <dbl>, latitud <dbl>

Realizando el mismo analisis para Tipo encontramos:

valores_tipo <- unique(vivienda$tipo)
valores_tipo
## [1] "Casa"        "Apartamento"
vivienda$tipo <- factor(vivienda$tipo, levels = c("Casa", "Apartamento"))
vivienda$tipo <- as.numeric(vivienda$tipo)
head(vivienda)
## # A tibble: 6 × 12
##    zona  piso estrato preciom areaconst parqueaderos banios habitaciones  tipo
##   <dbl> <dbl>   <dbl>   <dbl>     <dbl>        <dbl>  <dbl>        <dbl> <dbl>
## 1     1     3       3     250        70            1      3            6     1
## 2     1     3       3     320       120            1      2            3     1
## 3     1     3       3     350       220            2      2            4     1
## 4     2     2       4     400       280            3      5            3     1
## 5     3     1       5     260        90            1      2            3     2
## 6     3     1       5     240        87            1      3            3     2
## # ℹ 3 more variables: barrio <chr>, longitud <dbl>, latitud <dbl>

Ahora, ya que unicamete tenemos variables numericas procederemos a identificar la correlación entre las variables mediante una matriz de correlación, pero inicialmente debemos quedarnos unicamente con los valores numericos.

#install.packages("dplyr")
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following object is masked from 'package:gridExtra':
## 
##     combine
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
vivienda_num <- select_if(vivienda, is.numeric)
#install.packages("corrplot")
library(corrplot)
## corrplot 0.92 loaded
matrizcor <- cor(vivienda_num)
corrplot (matrizcor, method = "number", number.cex = 0.5)

Se observan correlaciones positivas significativas entre las siguientes variables:

Entre el precio de la vivienda y el estrato, con un coeficiente de correlación de 0.61. Entre el precio de la vivienda y el área construida, con un coeficiente de correlación de 0.69. Entre el precio de la vivienda y el número de parqueaderos, con un coeficiente de correlación de 0.64. Entre el precio de la vivienda y el número de baños, con un coeficiente de correlación de 0.67. Entre el área construida y el número de baños, con un coeficiente de correlación de 0.65.

A continuación, ajustaremos las variables mediante un proceso de estandarización, garantizando que tengan una media de 0 y una desviación estándar de 1. Esta técnica nos permite normalizar las distancias entre las observaciones.Este enfoque nos posibilita comparar las magnitudes de las variables directamente, independientemente de sus unidades originales o escalas de medición. Es especialmente útil cuando las variables difieren en unidades o tienen escalas muy diferentes entre sí. Además, asegura que todas las variables ejerzan un impacto equitativo en el modelo en desarrollo.

viviendaEst <- scale(vivienda_num)
head(viviendaEst)
##            zona       piso    estrato    preciom  areaconst parqueaderos
## [1,] -1.8036351 -0.2404274 -1.5872276 -0.5595498 -0.7339949   -0.3875522
## [2,] -1.8036351 -0.2404274 -1.5872276 -0.3465670 -0.3842568   -0.3875522
## [3,] -1.8036351 -0.2404274 -1.5872276 -0.2552886  0.3152194    0.4168506
## [4,] -0.6180757 -0.6968663 -0.6156201 -0.1031580  0.7349051    1.2212534
## [5,]  0.5674838 -1.1533052  0.3559875 -0.5291236 -0.5940997   -0.3875522
## [6,]  0.5674838 -1.1533052  0.3559875 -0.5899759 -0.6150839   -0.3875522
##           banios habitaciones       tipo   longitud    latitud
## [1,] -0.07793773    1.6406840 -1.2586312  0.9728466  0.3793708
## [2,] -0.77811479   -0.4147626 -1.2586312  0.9331875  0.3763219
## [3,] -0.77811479    0.2703863 -1.2586312  0.7607566  0.4225243
## [4,]  1.32241640   -0.4147626 -1.2586312 -0.6549016  0.4070454
## [5,] -0.77811479   -0.4147626  0.7944184  0.8682385  0.9678065
## [6,] -0.07793773   -0.4147626  0.7944184  0.6670691 -1.1242009

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.

pca_resultados <- prcomp(viviendaEst)
library(ggplot2)

# Extraer la varianza explicada por cada componente principal
varianza_explicada <- pca_resultados$sdev^2 / sum(pca_resultados$sdev^2)

# Crear un dataframe para almacenar la varianza explicada y el número de componente principal
df_varianza <- data.frame(Componente = paste("PC", 1:length(varianza_explicada)), Varianza = varianza_explicada)

# Seleccionar solo los nueve primeros componentes con los valores más altos
df_varianza <- df_varianza[1:9,]

# Crear el gráfico utilizando ggplot2
ggplot(df_varianza, aes(x = Componente, y = Varianza)) +
  geom_bar(stat = "identity", fill = "skyblue") +
  geom_text(aes(label = scales::percent(Varianza), y = Varianza), vjust = -0.5, size = 3) +
  labs(title = "Varianza explicada por los nueve PC más altos", x = "Nombre de la etiqueta original", y = "Varianza explicada") +
  theme_minimal()

#install.packages("factoextra")
library(factoextra)
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
fviz_contrib(pca_resultados, choice = "var", axes = 1, top = 10)

El gráfico generado con fviz_contrib para el primer componente principal en el análisis de componentes principales (PCA) revela la importancia relativa de varias variables en la explicación de la variabilidad de los datos. La variable que más influye en la formación del primer componente es “baños”, con casi el 20% de contribución, seguida por “área construida”, “precio” y “parqueaderos”. Estos resultados indican que la cantidad de baños en una propiedad tiene un impacto sustancial en la variación total. Además, el precio y la disponibilidad de parqueaderos también desempeñan roles significativos en la estructuración de la variabilidad observada. Este análisis permite identificar las principales variables que contribuyen a la formación del primer componente principal, proporcionando insights valiosos sobre los factores que más influyen en la variabilidad general de los datos analizados.

En la próxima gráfica, exploraremos la contribución de las variables originales a los componentes principales en el análisis de PCA. Observaremos cómo las variables identificadas como las más representativas en los componentes muestran una mayor contribución en la formación de estos componentes.

fviz_pca_var(pca_resultados, col.var = "contrib", repel = TRUE)

En este gráfico, se destaca una asociación significativa entre variables específicas, como parqueaderos y precio, así como baños y área construida. Esta observación sugiere que el precio de una propiedad está fuertemente influenciado por la presencia de un parqueadero, mientras que la cantidad de baños tiende a variar en función de la dimensión del área construida. En consecuencia, podemos llegar fácilmente a la conclusión de que la presencia de parqueaderos juega un papel crucial en la determinación del precio de un inmueble, y la cantidad de baños se correlaciona estrechamente con la extensión de la superficie construida. Estas asociaciones identificadas proporcionan perspicacias valiosas sobre las dinámicas que afectan a estas variables en el contexto analizado.

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.

#install.packages("stats")
#install.packages("cluster")

library(stats)
library(cluster)

# Calcular la WCSS para diferentes números de clusters
wcss <- numeric(10)
for (i in 1:10) {
  kmeans_model <- kmeans(viviendaEst, centers = i)
  wcss[i] <- kmeans_model$tot.withinss
}

# Graficamos la WCSS en función del número de clusters
plot(1:10, wcss, type = "b", pch = 19, frame = FALSE, 
     xlab = "Número de Clusters", ylab = "WCSS",
     main = "Método del Codo para determinar el número óptimo de clusters")

Aunque la gráfica no muestra una inclinación muy pronunciada, se destaca un cambio significativo en el cluster 2. Por lo tanto, realizaremos un análisis de clustering K-means sobre el dataframe viviendaEst, agrupando las observaciones en dos clusters y almacenando el resultado en la variable km.

km = kmeans(viviendaEst, centers = 2, nstart = 25)
# Visualizaremos los centros de los clústeres
cluster_centers <- km$centers
print(cluster_centers)
##          zona       piso    estrato    preciom  areaconst parqueaderos
## 1 -0.08257526  0.1210097 -0.3165794 -0.5162781 -0.5003402   -0.3917946
## 2  0.14564521 -0.2134353  0.5583788  0.9106048  0.8824938    0.6910424
##       banios habitaciones       tipo  longitud     latitud
## 1 -0.5595815   -0.3884355  0.3574348  0.233315  0.06765012
## 2  0.9869827    0.6851176 -0.6304390 -0.411518 -0.11932042

Donde una forma de representarlos graficamente es apartir del dendograma de clusteres.

# Calcularemos las distancias entre las observaciones y los centroides de los clusters
distancias <- dist(rbind(viviendaEst, cluster_centers))

# Calcularemos el agrupamiento jerárquico utilizando las distancias
agrupamiento <- hclust(distancias)

plot(agrupamiento, main = "Dendrograma de Clusters K-means", xlab = "Observaciones", sub = NULL, ylab = "Distancia")

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.

Este análisis ayuda a visualizar y comprender las asociaciones entre las variables categóricas, permitiendo la identificación de patrones y tendencias en el comportamiento de la oferta en el mercado inmobiliario. Puede revelar, por ejemplo, si ciertos tipos de viviendas son más comunes en determinadas zonas o barrios, lo que puede ser útil para tomar decisiones informadas en el ámbito inmobiliario, como la segmentación del mercado o la identificación de oportunidades y desafíos específicos en ciertas áreas geográficas.

En este caso ya que modificamos la data original, repetimos el modelo de transformación y limpieza de datos realizado anteriormente.

data("vivienda")
vivienda <- vivienda[!is.na(vivienda$id),]
vivienda <- subset(vivienda, select = -id)
vivienda$parqueaderos[is.na(vivienda$parqueaderos)]<-0
vivienda$piso <- as.numeric(as.character(vivienda$piso))
vivienda$piso[is.na(vivienda$piso)]<-3
head(vivienda)
## # A tibble: 6 × 12
##   zona     piso estrato preciom areaconst parqueaderos banios habitaciones tipo 
##   <chr>   <dbl>   <dbl>   <dbl>     <dbl>        <dbl>  <dbl>        <dbl> <chr>
## 1 Zona O…     3       3     250        70            1      3            6 Casa 
## 2 Zona O…     3       3     320       120            1      2            3 Casa 
## 3 Zona O…     3       3     350       220            2      2            4 Casa 
## 4 Zona S…     2       4     400       280            3      5            3 Casa 
## 5 Zona N…     1       5     260        90            1      2            3 Apar…
## 6 Zona N…     1       5     240        87            1      3            3 Apar…
## # ℹ 3 more variables: barrio <chr>, longitud <dbl>, latitud <dbl>

Convertimos la variable estrato en tipo factor, y seleccionamos las variables necesarias para el análisis de correspondencia

vivienda$estrato <- as.factor(vivienda$estrato)
viviendaCorr <- table(vivienda$estrato, vivienda$zona)
viviendaCorr
##    
##     Zona Centro Zona Norte Zona Oeste Zona Oriente Zona Sur
##   3         105        572         54          340      382
##   4          14        407         84            8     1616
##   5           4        769        290            2     1685
##   6           1        172        770            1     1043

Ahora, como nuestros datos son categoricos, podemos utilizar la prueba de independencia chi-cuadrado para evaluar si hay asociación entre las variables.

chisq.test(viviendaCorr)
## 
##  Pearson's Chi-squared test
## 
## data:  viviendaCorr
## X-squared = 3830.4, df = 12, p-value < 2.2e-16

El valor p extremadamente pequeño (p < 2.2e-16) indica que hay una fuerte evidencia en contra de la hipótesis nula de independencia entre las variables “estrato” y “zona”. En otras palabras, hay una asociación significativa entre el estrato y la zona en el conjunto de datos de viviendaCorr.

Dado que el valor p es muy pequeño, podemos rechazar la hipótesis nula y concluir que hay una relación estadísticamente significativa entre el estrato y la zona en el conjunto de datos. Otra forma de visualizar este resultado es por medio de un plano cartesiano.

library(FactoMineR)
resultados_ac <- CA(viviendaCorr)

El gráfico revela que la zona 6 está asociada principalmente con la zona oeste. De manera similar, la zona oriental y central muestra una mayor correlación con el estrato 3, mientras que los estratos 4 y 5 predominan en las zonas sur y norte.

Informe

Durante el análisis de los datos de oferta de vivienda en el portal de Fincaraiz para la ciudad de Cali, se examinaron un total de 8,319 propiedades disponibles. Estas viviendas se distribuyen principalmente en los estratos 3 al 6, y la mayoría se concentra en la zona Sur de la ciudad. En términos de tamaño, presentan una diversidad considerable, con áreas construidas que oscilan entre los 30 y los 1,745 metros cuadrados, y una mediana de 123 metros cuadrados.

En relación con los precios, se observa una tendencia directa con el tamaño de las viviendas, que varían entre 58 y 1,999 millones. El análisis de componentes principales muestra una reducción de la dimensionalidad, donde el primer componente, explicando el 34.72% de la variabilidad, está estrechamente vinculado al precio y las características físicas de las propiedades, como el número de baños y parqueaderos.

Asimismo, se destaca una fuerte correspondencia entre las variables de parqueaderos y precio, así como entre baños y área construida. Esto sugiere que el precio de una vivienda depende en gran medida de la presencia de parqueadero, mientras que la cantidad de baños varía en función del tamaño de la propiedad.

Por último, el análisis de correspondencia resalta la relación entre los estratos y las zonas de ubicación de las viviendas, lo que subraya la importancia de desarrollar proyectos con características específicas adaptadas al perfil de los clientes objetivo.