La empresa B&C (Bines y Casas) es una agencia de bienes raíces que opera en la ciudad de Cali, Colombia. La empresa fue fundada por Sandra Milena hace 10 años y actualmente cuenta con ocho agentes de bienes raíces.
El mercado de bienes raíces en Cali ha crecido significativamente en los últimos años, impulsado por el crecimiento de la población, la inversión extranjera directa y el desarrollo de nuevos proyectos inmobiliarios. En 2021, las ventas del sector en Cali llegaron a $6700 millones y en 2022 a $6100 mil millones. Se espera que este sector continue creciendo durante los próximos años, permitiendo un desarrollo dinámico en la economía regional.
El objetivo de este informe estadístico es realizar la demostración de la evolución del mercado de los bienes raíces en Cali que puede ser de interés para la empresa B&C (Bines y Casas). Gracias al análisis obtenido tomar decisiones sobre su nicho de mercado, desarrollo de estrategias de marketing, estableces precios de venta, ofrecer servicios personalizados a sus clientes entre otros.
Los métodos utilizados para la interpretación de los datos inicialmente empiezan por la limpieza de las variables identificando cuales son los datos vacíos NA resumiendo estos mediante tablas y gráficas, además los datos NA no se realizara la eliminación de estos ya que pueden tener gran porcentaje de información, por lo tanto se utilizara la imputación para manipular los datos gracias a sustitución de los NA por la media o mediana de los datos generales de acuerdo al tipo de variable si es cualitativa o cuantitativa y determinar mediante el cruce de variables cuales son sus frecuencias y valores de interés.
La importación de los datos es a partir de la base de datos cargada de “vivienda_faltantes” contenida en el paquete met, se realiza un análisis de una muestra del 24 % de 2000 x 13 teniendo como información total 8330 x 13 registros y estas se puede obtener del siguiente código en el cual se puede visualizar el tamaño de la base de datos, las variables que lo conforman en conjunto con el tipo de variables.
# install.packages("learnr") # solo una vez#·
# install.packages("devtools") # solo una vez
#devtools::install_github("dgonxalex80/paqueteMET", force = TRUE)
library(paqueteMET)
library(dplyr)
##
## 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
data(vivienda_faltantes)
set.seed(123)
datosNA<-sample_n(vivienda_faltantes, 2000)
str(datosNA)
## spc_tbl_ [2,000 × 13] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
## $ id : num [1:2000] 122 190 880 1663 1401 ...
## $ zona : chr [1:2000] "Zona Norte" "Zona Oriente" "Zona Oriente" "Zona Sur" ...
## $ piso : num [1:2000] 1 4 1 NA NA 1 7 NA 2 4 ...
## $ estrato : num [1:2000] 3 3 3 4 4 5 5 3 5 3 ...
## $ preciom : num [1:2000] 150 360 250 375 150 270 290 235 450 125 ...
## $ areaconst: num [1:2000] 93 420 210 74 57 75 93 122 252 72 ...
## $ parquea : num [1:2000] NA 1 NA 1 NA 1 1 1 2 NA ...
## $ banios : num [1:2000] 1 6 4 5 2 2 3 2 2 2 ...
## $ habitac : num [1:2000] 4 9 4 5 3 3 3 5 7 3 ...
## $ tipo : chr [1:2000] "Casa" "Casa" "Apartamento" "Casa" ...
## $ barrio : chr [1:2000] "la rivera" "las ceibas" "morichal de comfandi" "calicanto viii" ...
## $ longitud : num [1:2000] -76.5 -76.5 -76.5 -76517 -76.5 ...
## $ latitud : num [1:2000] 3.48 3.46 3.4 3373 3.38 ...
## - 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_double" "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"
## .. ..$ parquea : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
## .. ..$ banios : list()
## .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
## .. ..$ habitac : 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>
Existen otras formas de poder visualizar las datos cuando estos tienen datos NA o faltantes en este caso la tabla nos muestra que para la variable “piso” hace falta 684 datos y para la variable “parquea” faltan 391 datos.
faltantes <- colSums(is.na(datosNA))
faltantes
## id zona piso estrato preciom areaconst parquea banios
## 0 0 684 0 0 0 391 0
## habitac tipo barrio longitud latitud
## 0 0 0 0 0
Con la siguiente funcion evidenciamos el numero total de datos faltantes por variable.
# install.packages("naniar")
library(naniar)
library(ggplot2)
gg_miss_var(datosNA) + labs(x="Variables", y = "Datos Na")
En esta gráfica podemos visualizar que las variables piso y parquea presentan datos faltantes donde 492 tiene información faltante en la variable “piso”, 199 en la variable “parquea”, 192 tienen información faltante en ambas variables, el total de datos faltantes supera un total de 1075 datos, adicional a esto 1117 presentan toda la información completa en las 13 variables a analizar.
# 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(datosNA, rotate.names = TRUE)
Para el proceso de imputación se puede realizar eliminación de datos faltantes, pero no se va a tener en cuenta ya que se puede perder un gran porcentaje de la información, por este motivo se opta por reemplazar los datos NA con el siguiente análisis:
La variable “parqueo” los valores NA se puede deber a que los propietarios omitieron la respuesta porque su vivienda no posee parqueadero por tal motivo en esta variable los datos NA serán reemplazados por Cero “0”.
datosNA$parquea[is.na(datosNA$parquea)] <- 0
grafico <-md.pattern(datosNA, rotate.names = TRUE)
La variable “piso” se va a sustituir los datos NA por el valor correspondiente a la media de todos los datos.
media_piso <- mean(datosNA$piso, na.rm = TRUE)
datosNA$piso[is.na(datosNA$piso)] <- media_piso
grafico <-md.pattern(datosNA, rotate.names = TRUE)
## /\ /\
## { `---' }
## { O O }
## ==> V <== No need for mice. This data set is completely observed.
## \ \|/ /
## `-----'
Una vez imputados los datos mediante el código “summary()” podemos evidenciar los valores de las diferentes variables como lo son los mínimos y máximos, la media y mediana, 1st y 3rd Cuartil.
summary(datosNA)
## id zona piso estrato
## Min. : 1 Length:2000 Min. : 1.000 Min. :3.000
## 1st Qu.:2130 Class :character 1st Qu.: 2.000 1st Qu.:4.000
## Median :4096 Mode :character Median : 3.822 Median :5.000
## Mean :4137 Mean : 3.822 Mean :4.636
## 3rd Qu.:6178 3rd Qu.: 4.000 3rd Qu.:5.000
## Max. :8317 Max. :12.000 Max. :6.000
## preciom areaconst parquea banios
## Min. : 70.0 Min. : 30.00 Min. : 0.00 Min. : 0.000
## 1st Qu.: 220.0 1st Qu.: 80.87 1st Qu.: 1.00 1st Qu.: 2.000
## Median : 335.0 Median : 126.00 Median : 1.00 Median : 3.000
## Mean : 441.2 Mean : 177.53 Mean : 1.47 Mean : 3.122
## 3rd Qu.: 560.0 3rd Qu.: 227.25 3rd Qu.: 2.00 3rd Qu.: 4.000
## Max. :1940.0 Max. :1745.00 Max. :10.00 Max. :10.000
## habitac tipo barrio longitud
## Min. : 0.000 Length:2000 Length:2000 Min. :-76576.00
## 1st Qu.: 3.000 Class :character Class :character 1st Qu.:-76507.00
## Median : 3.000 Mode :character Mode :character Median : -76.54
## Mean : 3.659 Mean :-21750.50
## 3rd Qu.: 4.000 3rd Qu.: -76.52
## Max. :10.000 Max. : -76.46
## latitud
## Min. : 3.333
## 1st Qu.: 3.389
## Median : 3.450
## Mean : 976.885
## 3rd Qu.:3367.000
## Max. :3496.000
Para esto identificamos las cantidades de viviendas que puede tener una zona con su respectiva frecuencia absoluta.
table(datosNA$zona, datosNA$tipo)
##
## Apartamento APARTAMENTO apto casa Casa CASA
## Zona Centro 7 0 0 0 26 0
## Zona Norte 270 3 3 1 183 2
## Zona Oeste 244 1 0 0 34 0
## Zona Oriente 15 0 0 4 72 1
## Zona Sur 653 9 1 2 468 1
table(datosNA$zona, datosNA$tipo) %>%
prop.table()
##
## Apartamento APARTAMENTO apto casa Casa CASA
## Zona Centro 0.0035 0.0000 0.0000 0.0000 0.0130 0.0000
## Zona Norte 0.1350 0.0015 0.0015 0.0005 0.0915 0.0010
## Zona Oeste 0.1220 0.0005 0.0000 0.0000 0.0170 0.0000
## Zona Oriente 0.0075 0.0000 0.0000 0.0020 0.0360 0.0005
## Zona Sur 0.3265 0.0045 0.0005 0.0010 0.2340 0.0005
Analizando la información suministrada entendemos de que al momento de recopilar la información hubo errores de redacción o digitación por lo tanto se realizara la siguiente sustitución:
Los datos Apartamento, APARTAMENTO y apto se sustituirá por Apartamento. Los datos casa, Casa y CASA se sustituirá por Casa.
Lo anterior se verá reflejado en el siguiente código:
datosNA <- datosNA %>% mutate(tipo = replace(tipo,tipo == 'apto', 'Apartamento'))
datosNA <- datosNA %>% mutate(tipo = replace(tipo,tipo == 'APARTAMENTO', 'Apartamento'))
datosNA <- datosNA %>% mutate(tipo = replace(tipo,tipo == 'CASA', 'Casa'))
datosNA <- datosNA %>% mutate(tipo = replace(tipo,tipo == 'casa', 'Casa'))
datos_piso <- datosNA
table(datosNA$zona, datosNA$tipo)
##
## Apartamento Casa
## Zona Centro 7 26
## Zona Norte 276 186
## Zona Oeste 245 34
## Zona Oriente 15 77
## Zona Sur 663 471
Ahora iniciaremos identificando la zona más común en las que viven las personas con su respectiva grafica. En este caso la zona sur reporta 1134 viviendas, seguido de la zona norte con 462 viviendas. Adicional a esto encontramos que los tipos de viviendas preferidas son los Apartamentos con la cantidad de 1206.
table(datosNA$zona)
##
## Zona Centro Zona Norte Zona Oeste Zona Oriente Zona Sur
## 33 462 279 92 1134
barplot(prop.table(table(datosNA$zona)),col=c("blue","orange", "green", "yellow", "red"),
ylim=c(0,0.7),ylab="Frecuencias Relativas")
table(datosNA$tipo)
##
## Apartamento Casa
## 1206 794
Ya con la información depurada y con las gráficas obtenidas procedemos con el análisis de los promedios de precios por tipo de viviendas en las diferentes zonas de Cali, para esto se expresa de la siguiente forma. Donde encontramos que las viviendas más costosas están ubicadas en la Zona Oeste y el tipo de vivienda son Casas, por lo contrario, en la Zona Oriente se encuentran las viviendas más económicas y son de tipo Apartamento.
t1 = aggregate(by = list(datosNA$zona,datosNA$tipo), datosNA$preciom, FUN=mean)
colnames(t1)=c("Zona", "Tipo de vivienda", "Precio promedio de vivienda")
t1 <- t1[with(t1, order(-t1$`Precio promedio de vivienda`)), ]
t1
## Zona Tipo de vivienda Precio promedio de vivienda
## 8 Zona Oeste Casa 765.0000
## 3 Zona Oeste Apartamento 698.6612
## 10 Zona Sur Casa 599.1019
## 7 Zona Norte Casa 488.4355
## 6 Zona Centro Casa 350.8462
## 5 Zona Sur Apartamento 302.2247
## 2 Zona Norte Apartamento 287.1413
## 9 Zona Oriente Casa 257.1429
## 1 Zona Centro Apartamento 192.8571
## 4 Zona Oriente Apartamento 156.5333
Características más buscadas en las viviendas
En este primer caso vamos a evaluar las características de las viviendas más buscadas de acuerdo a el tipo de vivienda y cantidad de pisos que la conforman donde se evidencian que las viviendas más buscadas son entre 3 y 4 pisos en promedio.
conteo <- table(datos_piso$tipo, datos_piso$piso)
conteo
##
## 1 2 3 3.82218844984802 4 5 6 7 8 9 10 11 12
## Apartamento 91 122 139 348 116 119 59 49 60 30 33 20 20
## Casa 89 234 120 336 12 2 0 1 0 0 0 0 0
barplot(conteo, main = "Numero de tipos de viviendas por pisos",
xlab = "Tipos de viviendas",
col = c("#0d3b66","#f4d35e"),
legend= rownames(conteo),
las=1, ylim = c(0,700)
)
Promedio de habitaciones, área construida, parqueaderos, baños y pisos.
# Promedio de pisos
mean(datos_piso$piso)
## [1] 3.822188
# Promedio de estrato
mean(datos_piso$estrato)
## [1] 4.6355
# Promedio de precios
mean(datos_piso$preciom)
## [1] 441.227
# Promedio de area construida
mean(datos_piso$areaconst)
## [1] 177.5276
# Promedio de parqueaderos
mean(datos_piso$parquea)
## [1] 1.4695
# Promedio de baños
mean(datos_piso$banios)
## [1] 3.122
# Promedio de habitaciones
mean(datos_piso$parquea)
## [1] 1.4695
Comprendiendo todo el análisis realizado a continuación verificaremos por medio de los diagramas de caja en donde se centra o donde se concentra mas la información de los datos, lo datos atípicos y sesgos.
par(mfrow=c(1,2))
boxplot(datos_piso$piso, vertical=TRUE, xlab="Piso")
boxplot(datos_piso$estrato, vertical=TRUE, xlab="Estrato")
boxplot(datos_piso$preciom, vertical=TRUE, xlab="Precio")
boxplot(datos_piso$areaconst, vertical=TRUE, xlab="Area Construida")
boxplot(datos_piso$parquea, vertical=TRUE, xlab="Parqueaderos")
boxplot(datos_piso$banios, vertical=TRUE, xlab="Baños")
boxplot(datos_piso$habitac, vertical=TRUE, xlab="Habitaciones")
Como conclusiones para finalizar el análisis se obtiene lo siguientes:
A pesar de tener en dos variables (Piso, Parquea) datos vacíos por medio de la justician se logran dejar los datos con valores de media y mediana y de esta forma se exprime más la información.
La zona con mas cantidad de viviendas o favoritismo por los clientes es la Zona Sur donde existe un 56.7 % de viviendas de cualquier tipo, seguido de la Zona Norte.
En promedio el 60.3 % de viviendas son Apartamentos y el 39.7 % son Casa.
En la Zona Oeste se encuentran las Casas y Apartamentos que en promedio las Casas tienen un costo de 765 millones y los Apartamentos en promedio de 698 millones.
En las Zonas Centro y Oriente se pueden encontrar los Apartamentos más económicos cuyos precios están entre 156 millones a 192.85 millones en promedio.
El tipo de viviendas mas vendidas son las que tienen entre 3 a 4 pisos.
En el diagrama de cajas para la variable estrato, variable baños y variable piso la mediana de estas se encuentra en dentro de la caja, pero en la parte superior por lo que tiene una leve tendencia a que existan valores atípicos.
En el diagrama de cajas para la variable preciom, variable parquea variable areaconst la mediana se encuentra en la mitad de la caja por lo que se concluye que la información es simétrica, a pesar de esto existen valores atípicos.
En el diagrama de cajas para la variable habitac la mediana esta por debajo del valor de la casa por lo que existe gran cantidad de datos sesgados, de igual manera para los datos atípicos se encuentra por encima y por debajo de la caja.
Diagrama de puntos.