Introducción

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.

Objetivos

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.

Métodos

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.

Resultados

Importación de datos y visualización

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)

Imputación

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

Precios de las viviendas

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

Tipo de viviendas más vendidas

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")

Conclusiones

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.

Anexos

Diagrama de puntos.