#Actividad 1, Modelos Estadísticos para la toma de decisiones.
#Evaluación del inmobiliario urbano
#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.
#1. Importar datos
devtools::install_github("dgonxalex80/paqueteMOD", force = TRUE) #descarga paquete
## Downloading GitHub repo dgonxalex80/paqueteMOD@HEAD
## ── R CMD build ─────────────────────────────────────────────────────────────────
##
checking for file 'C:\Users\ALEJANDRA\AppData\Local\Temp\Rtmp6TyWul\remotes34a01d7414eb\dgonxalex80-paqueteMOD-f93b750/DESCRIPTION' ...
✔ checking for file 'C:\Users\ALEJANDRA\AppData\Local\Temp\Rtmp6TyWul\remotes34a01d7414eb\dgonxalex80-paqueteMOD-f93b750/DESCRIPTION' (682ms)
##
─ preparing 'paqueteDAT': (2.3s)
## checking DESCRIPTION meta-information ...
✔ checking DESCRIPTION meta-information
##
─ checking for LF line-endings in source and make files and shell scripts
##
─ checking for empty or unneeded directories
##
─ building 'paqueteDAT_0.1.0.tar.gz'
##
##
## Installing package into 'C:/Users/ALEJANDRA/AppData/Local/R/win-library/4.2'
## (as 'lib' is unspecified)
library(paqueteDAT)
data("vivienda") # Datos
head(vivienda,5)
## 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 02 4 400 280 3 5
## 5 1212 Zona Norte 01 5 260 90 1 2
## 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
tail(vivienda,5)
## id zona piso estrato preciom areaconst parqueaderos banios
## 8318 6998 Zona Sur <NA> 6 1000 189 3 5
## 8319 8139 Zona Sur <NA> 5 530 142 2 4
## 8320 NA <NA> <NA> NA NA NA NA NA
## 8321 NA <NA> <NA> NA NA NA NA NA
## 8322 NA <NA> <NA> NA 330 NA NA NA
## habitaciones tipo barrio longitud latitud
## 8318 4 Apartamento zona sur -76.54666 3.44620
## 8319 4 Casa zona sur -76.55587 3.40889
## 8320 NA <NA> <NA> NA NA
## 8321 NA <NA> <NA> NA NA
## 8322 NA <NA> <NA> NA NA
#2. Análisis exploratorio de datos: se realiza con el propósito de conocer la estructura del conjunto de datos denominado "vivenda"
str(vivienda)
## Classes 'spec_tbl_df', 'tbl_df', 'tbl' and 'data.frame': 8322 obs. of 13 variables:
## $ id : num 1147 1169 1350 5992 1212 ...
## $ zona : chr "Zona Oriente" "Zona Oriente" "Zona Oriente" "Zona Sur" ...
## $ piso : chr NA NA NA "02" ...
## $ estrato : num 3 3 3 4 5 5 4 5 5 5 ...
## $ preciom : num 250 320 350 400 260 240 220 310 320 780 ...
## $ areaconst : num 70 120 220 280 90 87 52 137 150 380 ...
## $ parqueaderos: num 1 1 2 3 1 1 2 2 2 2 ...
## $ banios : num 3 2 2 5 2 3 2 3 4 3 ...
## $ habitaciones: num 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 ...
## - attr(*, "spec")=List of 3
## ..$ cols :List of 13
## .. ..$ id : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
## .. ..$ zona : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_character" "collector"
## .. ..$ piso : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_character" "collector"
## .. ..$ estrato : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
## .. ..$ preciom : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
## .. ..$ areaconst : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
## .. ..$ parqueaderos: list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
## .. ..$ banios : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
## .. ..$ habitaciones: list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
## .. ..$ tipo : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_character" "collector"
## .. ..$ barrio : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_character" "collector"
## .. ..$ longitud : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
## .. ..$ latitud : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
## ..$ default: list()
## .. ..- attr(*, "class")= chr [1:2] "collector_guess" "collector"
## ..$ delim : chr ";"
## ..- attr(*, "class")= chr "col_spec"
## - attr(*, "problems")=<externalptr>
#El conjunto de datoso "vivienda" es integrado por 8,322 observaciones, que para este caso son viviendas a las que se les realizó medición 12 variables: zona, piso, estrato, preciom (valor comercial en millones COP), areaconst(en mts2), parqueaderos, banios, habitaciones, tipo, barrio, longitud y latitud.
#Se procede a revisar si el conjunto de datos tiene datos ausentes - missing data
sum(is.na(vivienda$piso)) # un número significativo de missing values
## [1] 2638
sum(is.na(vivienda$zona))
## [1] 3
sum(is.na(vivienda$estrato))
## [1] 3
sum(is.na(vivienda$preciom))
## [1] 2
sum(is.na(vivienda$areaconst))
## [1] 3
sum(is.na(vivienda$parqueaderos)) # de manera similar a la variable piso, parqueaderos tiene un número significativo de missing values
## [1] 1605
sum(is.na(vivienda$banios))
## [1] 3
sum(is.na(vivienda$habitaciones))
## [1] 3
sum(is.na(vivienda$tipo))
## [1] 3
sum(is.na(vivienda$barrio))
## [1] 3
sum(is.na(vivienda$longitud))
## [1] 3
sum(is.na(vivienda$latitud))
## [1] 3
#Todas las variables cuentan con missing values, pero piso y parqueaderos aún más, por lo tanto se procede a eliminar aquellos datos ausentes para facilitar el análisis del conjunto de datos, adicionalmente se elimina la variable "Barrio" debido a que dada la heterogeneidad de la misma, pone un reto en la recodificación
delete <- c("piso", "parqueaderos", "barrio")
vivienda <- vivienda[ , !(names(vivienda) %in% delete)]
#Se procede a eliminar filas con missing values
vivienda <- vivienda[complete.cases(vivienda),]
sum(is.na(vivienda)) #conteo de missing values
## [1] 0
#se revisa cómo quedó el conjunto de datos luego de ejecutar comandos de limpieza de missing values
str(vivienda)# se reduce el conjunto de datos a 9 variables
## Classes 'spec_tbl_df', 'tbl_df', 'tbl' and 'data.frame': 8319 obs. of 10 variables:
## $ id : num 1147 1169 1350 5992 1212 ...
## $ zona : chr "Zona Oriente" "Zona Oriente" "Zona Oriente" "Zona Sur" ...
## $ estrato : num 3 3 3 4 5 5 4 5 5 5 ...
## $ preciom : num 250 320 350 400 260 240 220 310 320 780 ...
## $ areaconst : num 70 120 220 280 90 87 52 137 150 380 ...
## $ banios : num 3 2 2 5 2 3 2 3 4 3 ...
## $ habitaciones: num 6 3 4 3 3 3 3 4 6 3 ...
## $ tipo : chr "Casa" "Casa" "Casa" "Casa" ...
## $ longitud : num -76.5 -76.5 -76.5 -76.5 -76.5 ...
## $ latitud : num 3.43 3.43 3.44 3.44 3.46 ...
#Para facilitar el análisis de las variables categóricas, se recodifican Zona y tipo
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.2.3
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
#Zona
vivienda <- vivienda %>% mutate(zona = recode(zona, "Zona Norte" = 1, "Zona Oeste" = 2, "Zona Centro" = 3, "Zona Oriente" = 4, "Zona Sur" = 5))
#Tipo de inmuelbe
vivienda <- vivienda %>% mutate(tipo = recode(tipo,"Casa" = 1, "Apartamento" = 2))
head(vivienda, 5)
## # A tibble: 5 × 10
## id zona estrato preciom areaconst banios habitaciones tipo longitud
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1147 4 3 250 70 3 6 1 -76.5
## 2 1169 4 3 320 120 2 3 1 -76.5
## 3 1350 4 3 350 220 2 4 1 -76.5
## 4 5992 5 4 400 280 5 3 1 -76.5
## 5 1212 1 5 260 90 2 3 2 -76.5
## # ℹ 1 more variable: latitud <dbl>
matriz_cor <- cor(vivienda) # matriz de correlaciones
print(matriz_cor)
## id zona estrato preciom areaconst
## id 1.00000000 0.112543216 0.45057962 0.37511177 0.196165396
## zona 0.11254322 1.000000000 0.03775424 -0.01983534 0.008706912
## estrato 0.45057962 0.037754235 1.00000000 0.60980664 0.274323323
## preciom 0.37511177 -0.019835339 0.60980664 1.00000000 0.687351963
## areaconst 0.19616540 0.008706912 0.27432332 0.68735196 1.000000000
## banios 0.26964006 0.063368625 0.42032178 0.66914558 0.648416477
## habitaciones 0.02459590 0.056392728 -0.07137615 0.26409121 0.516912916
## tipo 0.06501004 -0.100305578 0.11453194 -0.25645935 -0.547249986
## longitud -0.96072604 -0.130085118 -0.44414040 -0.34358822 -0.173742834
## latitud -0.19347768 -0.746947530 -0.22749944 -0.11566757 -0.051887809
## banios habitaciones tipo longitud latitud
## id 0.26964006 0.024595903 0.06501004 -0.960726038 -0.19347768
## zona 0.06336863 0.056392728 -0.10030558 -0.130085118 -0.74694753
## estrato 0.42032178 -0.071376147 0.11453194 -0.444140396 -0.22749944
## preciom 0.66914558 0.264091206 -0.25645935 -0.343588223 -0.11566757
## areaconst 0.64841648 0.516912916 -0.54724999 -0.173742834 -0.05188781
## banios 1.00000000 0.589906412 -0.43561976 -0.249569746 -0.13003729
## habitaciones 0.58990641 1.000000000 -0.54678569 -0.008002016 0.02125096
## tipo -0.43561976 -0.546785694 1.00000000 -0.073830687 0.05408973
## longitud -0.24956975 -0.008002016 -0.07383069 1.000000000 0.23606961
## latitud -0.13003729 0.021250965 0.05408973 0.236069614 1.00000000
library(corrplot)
## Warning: package 'corrplot' was built under R version 4.2.3
## corrplot 0.92 loaded
corrplot(matriz_cor, method = "color")
library(ggcorrplot)
## Warning: package 'ggcorrplot' was built under R version 4.2.3
## Loading required package: ggplot2
## Warning: package 'ggplot2' was built under R version 4.2.3

ggcorrplot(matriz_cor, type = "lower", lab = TRUE)

#Sobre las correlaciones: se puede interpretar que, preciom y estrato: 0.6, es positiva, a mayor estrato, mayor precio de la vivienda y viscervesa, el valor más alto de correlación en la matriz fue entre areaconst y preciom: 0.69 aprox 0.7. siendo positiva, a mayor área construida, mayor precio de la vivienda. Banios y preciom: 0.67, fue positiva, lo cual tien sentido entre más cantidade baños tenga una vivienda, mayor será el precio de la misma, de igual manera, banios y areaconst se correlacionaron positivamente: 0.65, entre más grande sea el área de la bien inmueble, tendrá más baños.
# La correlación entre habitaciones y areaconst fue moderadamente fuerte: 0.52, indicando que, entre más grande sea el área de construcción de la vivienda, hay una mayor cantidad de habitaciones. Así mismo, entre habitaciones y banios, se dió una correlación de 0.6 positiva, pues entre más habitaciones tenga una vivienda, mayor es el número de baños.
#Dado a que las variables zona y tipo son categóricas, su interpretación bajo esta técnica estadística no es precisa para este tipo de variables.
#Variables Categóricas
#Zona
library(ggplot2)
hist(vivienda$zona, breaks = 10, col = "lightgreen", border = "darkgreen", main = "Histograma de Zona", xlab = "Zona", ylab = "Frecuencia")

hist(vivienda$tipo, breaks = 5, col = "lightblue", border = "darkblue", main = "Histograma de Tipo", xlab = "Tipo", ylab = "Frecuencia")

hist(vivienda$estrato, breaks = 10, col = "pink", border = "red", main = "Histograma de Estrato", xlab = "Estratp", ylab = "Frecuencia")

hist(vivienda$banios, breaks = 10, col = "lightyellow", border = "yellow", main = "Histograma de Baños", xlab = "Baños", ylab = "Frecuencia")

hist(vivienda$habitaciones, breaks = 10, col = "skyblue", border = "navy", main = "Histograma de Habitaciones", xlab = "No de Habitaciones", ylab = "Frecuencia")

hist(vivienda$preciom, breaks = 10, col = "magenta", border = "lightpink", main = "Histograma de Precios", xlab = "Precio", ylab = "Frecuencia")

hist(vivienda$areaconst, breaks = 10, col = "violet", border = "pink", main = "Histograma de Área Construida", xlab = "Área Construida", ylab = "Frecuencia")

#Sobre los histogramas es posible inferir que no son simétricos, sin distribución de normalidad
#Reto: realizar un análisis integral y multidimensional de la base de datos "vivienda" para obtener una comprensión del mercado inmobiliario urbano. Se requiere aplicar diversas técnicas de análisis de datos, incluyendo:
#a) Análisis de Componentes Principales (PCA): 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.
#El PCA es una técnica para descubrir la forma en que covarían varaibles númericas, el conjunto más pequeños de variables, explican la mayor parte de la variabiliad de un conjunto de variables, reduciendo la dimensión de los datos, para ello, se toman las variables; preciom, areacons, baños, habitaciones y estrato.
datapca <- vivienda[, c("preciom", "areaconst", "banios", "habitaciones", "estrato")]
pca <- princomp(datapca)
pca$loadings
##
## Loadings:
## Comp.1 Comp.2 Comp.3 Comp.4 Comp.5
## preciom 0.950 0.312
## areaconst 0.312 -0.950
## banios -0.532 -0.619 0.578
## habitaciones -0.841 0.309 -0.444
## estrato -0.722 -0.685
##
## Comp.1 Comp.2 Comp.3 Comp.4 Comp.5
## SS loadings 1.0 1.0 1.0 1.0 1.0
## Proportion Var 0.2 0.2 0.2 0.2 0.2
## Cumulative Var 0.2 0.4 0.6 0.8 1.0
loadings <- pca$loadings
library(factoextra)
## Warning: package 'factoextra' was built under R version 4.2.3
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
fviz_pca_ind(pca, geom.ind = "point", col.ind = "pink",
axes = c(1, 2),
pointsize = 1.5)

cargas <- pca$loadings
ggplot(data = datapca, aes(x = preciom, y = areaconst)) +
geom_point(alpha = 3) +
stat_ellipse(type = "norm", level = 99) +
geom_abline(intercept = 0, slope = cargas[2, 1]/cargas[1, 1]) +
geom_abline(intercept = 0, slope = cargas[2, 2]/cargas[1, 2])
## Warning in stats::qf(level, dfn, dfd): NaNs produced
## Warning: Removed 52 rows containing missing values (`geom_path()`).

#Los loadings indican cómo cada variable se relaciona con los componentes principales. Valores más altos en los loadings indican una mayor contribución de la variable al componente correspondiente.En el primer componente (Comp.1), preciom tiene un loading de 0.950, lo que significa que está muy correlacionado positivamente con este componente. Esto sugiere que el precio de la vivienda (preciom) tiene un impacto importante en la formación del primer componente. Similarmente, en el segundo componente (Comp.2), areaconst tiene un loading de -0.950, lo que indica una correlación fuerte, de acuerdo con Bruce y Godeck (2022), invertir el signo de la ponderación del componente no cambia su valor ni su relevancia, esto sugiere que el área de construcción (areaconst) está relacionada con el segundo componente. Las variables banios, habitaciones y estrato tienen cargas en los componentes 3, 4 y 5, lo que significa que están más relacionadas con estos componentes que con los primeros dos.
#SS loadings, Proportion Var y Cumulative Var: Estas estadísticas indican la proporción de varianza explicada por cada componente y la acumulativa a medida que avanzan los componentes.SS loadings representa la suma de los cuadrados de los loadings en cada componente. En este caso, todos los componentes tienen una suma de cuadrados de 1.0, lo que significa que están normalizados. Proportion Var muestra la proporción de la varianza total explicada por cada componente. Cada componente explica aproximadamente el 20% de la varianza total en los datos. Cumulative Var muestra cómo se acumula la varianza a medida que agregamos componentes. Después del quinto componente, la varianza acumulativa es del 100%, lo que significa que todos los componentes juntos explican toda la varianza de los datos. En resumen, este análisis de componentes principales sugiere que las variables preciom y areaconst están relacionadas con el primer componente, mientras que banios, habitaciones y estrato están relacionadas con otros componentes. Además, los cinco componentes combinados explican la totalidad de la varianza en los datos.