INTRODUCCIÓN


El sector inmobiliario es aquel que abarca toda actividad sobre bienes inmuebles y uno de los pocos mercados transversales a la economía. Específicamente en la ciudad de Cali dicho sector ha crecido significativamente en los últimos años debido a factores como el crecimiento de la población, la inversión extranjera y el desarrollo de nuevos proyectos de vivienda.

Por esto es importante realizar un análisis descriptivo de la información recolectada por la empresa B&C, donde se evidencien comportamientos específicos y algunas dinámicas del mercado inmobiliario que pueden ayudar a la toma de diferentes decisiones estratégicas. Es por lo anterior que se desarrolla el presente reporte el cual expone el objetivo, los métodos, los resultados y las conclusiones del análisis descriptivo para la empresa B&C. Cada una de estas secciones tiene la finalidad de abordar y comprender aspectos que no se pueden aprender solo mediante la construcción de la base de datos.


OBJETIVO


Aplicar el análisis descriptivo de datos en la empresa B&C (Bienes y Servicios) del sector inmobiliario de la ciudad de Cali, con el fin de identificar patrones o tendencias que ayuden a tomar las mejores decisiones para el futuro de la empresa.


MÉTODOS


Para realizar este reporte se partió de la base de datos nombrada vivienda_faltantes la cual fue suministrada por la empresa B&C, donde inicialmente se comprendió el estado inicial de la base (registros, variables y tipos de variables), posteriormente se procedió con el ordenamiento y limpieza de esta, ejecutando validaciones de datos faltantes, imputación de datos y estandarización de variables. Para el análisis detallado se aplicó la técnica de análisis descriptivo de datos, evaluando el comportamiento de cada una de las variables de interés a través de gráficos, tablas de frecuencias y también algunas correlaciones entre ellas.


1. Base de datos


Este apartado pretende realizar un entendimiento del estado inicial de la base de datos, la cual cuenta con 8330 registros y 13 variables.

dim(vivienda_faltantes)
## [1] 8330   13

De las cuales las siguientes son variables cuantitativas:

  1. id: Identificación única de cada registro
  2. piso: Número del piso en que se encuentra ubicada la vivienda
  3. estrato: Número del estrato de la vivienda
  4. preciom: Precio en millones de la vivienda
  5. areaconstruida: Área en metros cuadros de la vivienda
  6. parquea: Número de parqueaderos con los que cuenta la vivienda
  7. banios: Número de baños que tiene la vivienda
  8. habitac: Número de habitaciones que tiene la vivienda
  9. longitud: Coordenada de longitud de ubicación de la vivienda
  10. latitud: Coordenada de latitud de ubicación de la vivienda

y las siguientes las variables cualitativas:

  1. zona: Identifica la zona en la cual se encuentra la vivienda
  2. tipo: Indica el tipo de vivienda
  3. barrio: Indica el barrio en el cual esta ubicada la vivienda

Un resumen inicial de la base de datos es el siguiente:

head(vivienda_faltantes)
## # A tibble: 6 × 13
##      id zona        piso estrato preciom areaconst parquea banios habitac tipo  
##   <dbl> <chr>      <dbl>   <dbl>   <dbl>     <dbl>   <dbl>  <dbl>   <dbl> <chr> 
## 1  8312 Zona Oeste     4       6    1300       318       2      4       2 Apart…
## 2  8311 Zona Oeste     1       6     480       300       1      4       4 Casa  
## 3  8307 Zona Oeste    NA       5    1200       800       4      7       5 Casa  
## 4  8296 Zona Sur       2       3     220       150       1      2       4 Casa  
## 5  8297 Zona Oeste    NA       5     330       112       2      4       3 Casa  
## 6  8298 Zona Sur      NA       5    1350       390       8     10      10 Casa  
## # ℹ 3 more variables: barrio <chr>, longitud <dbl>, latitud <dbl>

En donde se puede validar que efectivamente la base suministrada cuenta con 13 variables, de las cuales 3 de ellas son cualitativas y 10 cuantitativas. Adicionalmente esta vista nos muestra los 6 primeros valores que toma cada una de estas.


2. Limpieza de la base de datos


Aqui se depurara la base de datos, usando las técnicas adecuadas para cada variable.

  • Validación datos faltantes

Para analizar más a fondo la información contenida en la base se evalua si esta cuenta con datos faltantes en alguna de las variables.

faltantes <- colSums(is.na(vivienda_faltantes)) %>%   
  as.data.frame() 
faltantes
##              .
## id           3
## zona         3
## piso      2641
## estrato      3
## preciom      2
## areaconst    3
## parquea   1606
## banios       3
## habitac      3
## tipo         3
## barrio       3
## longitud     3
## latitud      3

Y efectivamente contiene datos faltantes en todas sus variables como se muestra en el resumen anterior, siendo la variable piso y parquea las más afectadas con 2641 y 1606 resgistros faltantes respectivamente.

  • Imputación de datos
md.pattern(vivienda_faltantes, rotate.names = TRUE)

##      preciom id zona estrato areaconst banios habitac tipo barrio longitud
## 4812       1  1    1       1         1      1       1    1      1        1
## 1912       1  1    1       1         1      1       1    1      1        1
## 877        1  1    1       1         1      1       1    1      1        1
## 726        1  1    1       1         1      1       1    1      1        1
## 1          1  0    0       0         0      0       0    0      0        0
## 2          0  0    0       0         0      0       0    0      0        0
##            2  3    3       3         3      3       3    3      3        3
##      latitud parquea piso     
## 4812       1       1    1    0
## 1912       1       1    0    1
## 877        1       0    1    1
## 726        1       0    0    2
## 1          0       0    0   12
## 2          0       0    0   13
##            3    1606 2641 4279

Del gráfico anterior se logra identificar que tres registros no cuentan con la mayoría de los datos, solo uno de estos registros cuenta con la variable preciom y es por esto que se decide eliminar estos tres registros ya que en comparación con la base total es una cantidad muy pequeña, por lo cual esta no se verá afectada. Quedando con una base de 8327 registros.

#Eliminar los registros sin variables
vivienda_falt <- vivienda_faltantes[!is.na(vivienda_faltantes$id),]
dim(vivienda_falt)
## [1] 8327   13

La variable piso y parquea continuan con valores faltantes, siendo estos del 32% y 19% respectivamente.

vis_miss(vivienda_falt)

Es por esto que se procede a evaluar estas variables y definir la mejor forma de organizarlas.

  • Variable parquea: Los datos faltantes de esta variable se deben a que cuando se recolecto la información se le indico a los propietarios omitir la respuesta en esta variable si la vivienda no contaba con parqueadero. Por tal motivo, en esta variable los datos NA serán reemplazados por cero indicando que estas propiedades no cuentan con parqueadero.
vivienda_falt$parquea[is.na(vivienda_falt$parquea)] <- 0
  • Variable piso: Para esta variable no se tiene una explicación del porque se encuentran valores faltantes, por lo que se plantea analizar su comportamiento y realizar una imputación con el indicador de centro que más se ajuste a la necesidad.
barplot(table(vivienda_falt$piso), main = "Distribución de la variable piso", ylab = "Frecuencia", xlab = "Piso",col = "cadetblue", border = par("fg"))

summary(vivienda_falt$piso)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##   1.000   2.000   3.000   3.772   5.000  12.000    2638

El gráfico de barras nos muestra que la variable piso tiene una asimetria positiva hacia la derecha como lo muestra su cola. Igualmente el resumen estadistico indica una media de 3.7 y una mediana de 3, por lo que trabajaremos con la mediana ya que es el valor que más se ajusta al tipo de esta variable.

#Completar valores faltantes
vivienda_falt$piso[is.na(vivienda_falt$piso)] <- 3

Con la imputación realizada a las diferentes variables podemos evidenciar que la base de datos ya no tiene datos faltantes, como lo certifica el siguiente mapa de valores faltantes:

gg_miss_var(vivienda_falt)

Otra validación importante es garantizar que no se cuente con registros duplicados en la base ya que esto podria modificar los resultados del informe.

duplicados <- duplicated(vivienda_falt) #identificar registros duplicados
table(duplicados) #Conocer la cantidad de registros duplicados
## duplicados
## FALSE  TRUE 
##  8319     8

Efectivamente la base cuenta con registros duplicados (8), los cuales se decide eliminar para no afectar los resultados y también porque es un número muy pequeño de registros en comparación con el total de la base.

vivienda_unicos <- distinct (vivienda_falt) #Base con datos únicos

Por ende la dimensión de la base de datos se disminuye a 8319 registros.

nrow(vivienda_unicos)
## [1] 8319
  • Estandarización de variables

Superada la etapa de imputación nos adentramos a la etapa de la estandarización de variables, ya que la variable tipo, tiene valores que significan lo mismo solo que fueron diligenciados de diferentes maneras.

Los valores actuales de esta son:

unique(vivienda_unicos$tipo)
## [1] "Apartamento" "Casa"        "APARTAMENTO" "casa"        "CASA"       
## [6] "apto"

Con lo que podemos comprobar que actualmente se tiene 6 categorias diferentes pero que básicamente son solo dos opciones, Apartamento o Casa. Por esto se procede a estandarizar las categorias de la variable tipo en estos dos únicos valores.

vivienda_unicos$tipo[vivienda_unicos$tipo=="APARTAMENTO"] = "Apartamento"
vivienda_unicos$tipo[vivienda_unicos$tipo=="apto"] = "Apartamento"
vivienda_unicos$tipo[vivienda_unicos$tipo=="casa"] = "Casa"
vivienda_unicos$tipo[vivienda_unicos$tipo=="CASA"] = "Casa"
unique(vivienda_unicos$tipo)
## [1] "Apartamento" "Casa"


3. Análisis descriptivo

  • Análisis variables preciom, areaconst y zona

Para comenzar daremos un vistazo de la distribución de la primeras variables a analizar como lo son el preciom, areaconst y la zona.

par(mfrow = c(1, 3))
hist(vivienda_unicos$preciom, main = "Distribución variable preciom",
     xlab="Precio (millones)", ylim= c(0,2000), xlim= c(0,2000), col ="#B4EEB4")  
grid()
hist(vivienda_unicos$areaconst, main = "Distribución variable areaconst",
     xlab="Área construida (m^2)",ylim= c(0,3400), col ="#A52A2A")  
grid()
barplot(table(vivienda_unicos$zona), main = "Distribución variable zona",
        xlab = "Frecuencia", xlim = c(0,5000),
        #ylab = "Zona",border = par("fg"),
        horiz=TRUE, las=1,
        col = c("#2E8B57","#B5B5B5","#00C5CD","#CDB5CD","#FFDAB9")) 
grid()

summary(vivienda_unicos$preciom)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    58.0   220.0   330.0   433.9   540.0  1999.0

De la variable preciom se evidencia que en las propiedades predominan precios bajos entre 58 y 330 millones, sucediendo algo parecido para la variable areaconst donde también prevalecen las propiedades de pequeñas áreas construidas. Por otro lado, la variable zona enseña que la mayoria de las propiedades a la venta se encuentran principalmente en la Zona Sur y en la Zona Norte.

boxplot(vivienda_unicos$preciom~vivienda_unicos$zona,
        main = "Distribución de precios por zonas",
        ylab="Precio (millones)", xlab = "Zona", las=1,
        col= c("#2E8B57","#B5B5B5","#00C5CD","#CDB5CD","#FFDAB9"))
grid()

Ahora comparando las variables preciom versus la zona (gráfico “Distribución de Precios por zonas”), nos damos cuenta que la Zona Oriente es la que cuenta con el precio más bajo y la Zona Oeste tiene el precio más alto. Por otro lado las medianas de las Zonas Centro, Norte y Sur son muy similares entre si.

# Grafico de dispersión area vs precio
ggplot(vivienda_unicos, aes(y=preciom , x=areaconst))+
geom_point()+
  xlab ("Área construida (m^2)") +
  ylab ("Precio (millones)") +
  labs(title = "Gráfico de dispersión del área construida vs el precio")

summary(vivienda_unicos$areaconst)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    30.0    80.0   123.0   174.9   229.0  1745.0

En el gráfico anterior (preciom contra areaconst) se observa que la mayoria de las áreas de las propiedades oscila entre 30 y 229 m^2, independientemente del precio. Y esto dado que tambien existen propiedades de aproximadamente 1900 millones de 250 m^2, lo que evidencia que estas variables no estan muy correlacionas.

  • Análisis variables tipo y estrato
#analizar la variable tipo y estrato
par(mfrow = c(1, 2))
pie(table(vivienda_unicos$tipo))
boxplot(vivienda_unicos$preciom~vivienda_unicos$tipo,
        main = "Distribución precios por tipo",
        ylab="Precio (millones)", xlab = "Tipo de vivienda", las=1,
        col= c("#FFFFFF","#63B8FF"))
grid()

table(vivienda_unicos$tipo)  %>% prop.table()*100
## 
## Apartamento        Casa 
##    61.29342    38.70658

De lo anterior podemos concluir tres cosas:

  1. El tipo de vivienda que más se tiene disponible es Apartamento con el 61.3% del total, lo cual se puede explicar dado el auge en las últimas decadas de construir más edificaciones con apartamentos que casas.
  2. La mediana del precio de las casas es mayor que la de los apartamentos, lo que indica que las casas tienden hacer un poco más costosas.
  3. Ambas distribuciones contienen muchos datos atipicos (extraños), por lo cual seria bueno evaluar el detalle de estos y revisar que manejo darles, ya que esto podria afectar los resultados de estos analisis.
conteo <- table(vivienda_unicos$tipo, vivienda_unicos$zona)
barplot(conteo, main="Número de viviendas por zona y tipo",  
        xlab="Zona",
        ylab ="Frecuencia",
        col=c("#FFFFFF","#63B8FF"),
        las=1, ylim = c(0,5500))
legend("top", legend = rownames(conteo), 
       col=c("#F0F0F0","#63B8FF"),
       bty = "n", pch=20 , pt.cex = 3, cex = 1, horiz = FALSE, inset = c(0.05, 0.05))
grid()

También se resalta que en la Zona Centro y Oriente predomina la tipologia casa mientras que en la Norte, Oeste y Sur los apartamentos.

par(mfrow = c(1, 2))
barplot(table(vivienda_unicos$estrato), main = "Distribución variable estrato", ylab = "Frecuencia", xlab = "Zona", ylim = c(0,3000), col = "#EEA9B8", border = par("fg"))
grid()
boxplot(vivienda_unicos$preciom~vivienda_unicos$estrato,
        main = "Distribución precios por estrato",
        ylab="Precio (millones)", xlab = "Estrato", las=1,
        col= c("#2E8B57","#B5B5B5","#00C5CD","#CDB5CD"))
grid()

table(vivienda_unicos$estrato)  %>% prop.table()*100
## 
##        3        4        5        6 
## 17.46604 25.59202 33.05686 23.88508

Los gráficos y resumen anterior revelan que solo se tienen propiedades desde el estrato 3 al 6, siendo el 5 es más predominante en la base con un 33.1%. Adicionalmente se puede concluir que a medida que aumenta el estrato aumenta el precio, lo cual es bastante logico ya que van mejorando las condiciones en terminos de acabados, ubicación, seguridad, entre otros.

  • Análisis variables banio y habitac
par(mfrow = c(1, 2))
barplot(table(vivienda_unicos$banios), 
        main = "Distribución variable banios", 
        ylab = "Frecuencia", xlab = "Número de baños", ylim = c(0,4500),
        col = "#FFF0F5", border = par("fg"))
grid()
barplot(table(vivienda_unicos$habitac), 
        main = "Distribución variable habitac",
        ylab = "Frecuencia", xlab = "Número de habitaciones", ylim = c(0,4500),
        col = "lavenderblush3", border = par("fg"))
grid()

#Resumen estadístico variable banios
summary(vivienda_unicos$banios)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   0.000   2.000   3.000   3.111   4.000  10.000
#Resumen estadístico variable habitac
summary(vivienda_unicos$habitac)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   0.000   3.000   3.000   3.605   4.000  10.000

Por último se evaluo el comportamiento de las variables banios y habitac donde se concluye que el promedio de baños y habitaciones en las viviendas es de aproximadamente 3 y de 4 respectivamente. Adicional a esto se observan unos datos extraños ya que estas variables pueden tomar el valor de cero lo cual no es coherente en este contexto ya que una vivienda debe tener minimo 1 baño y 1 habitación.


RESULTADOS

Los principales resultados del análisis son:

  • Los precios de las propiedades ofertadas van desde 58 hasta 1999 millones lo cual representa una gran variabilidad, pero los precios predominantes en esta base son valores medianamente bajos.

  • Con respecto al área construida se encuentra que esta oscila en su mayoría entre los 80 y 229 m^2.

  • Otra característica importante es que los precios de las viviendas van aumentando mientras el estrato aumenta, lo cual evidencia diferencias culturales, socioeconómicas y de infraestructuras en la ciudad.

  • Las propiedades en oferta en la ciudad de Cali son mucho más asequibles en el Zona Oriente, seguido de la Zona Centro y la Zona Norte, siendo Oriente y Centro las zonas más balanceadas y con menor variabilidad en comparación con las demás.

  • Los tipos de viviendas disponibles en la empresa son dos Apartamento y Casa, siendo el de mayor oferta el tipo Apartamento con el 61.3% del total, lo que indica una mayor construcción en la ciudad de Cali enfocada en edificaciones con torres y apartamentos, con la intención de aprovechar el espacio en altura.

  • Las variables número de baños y de habitaciones presentan datos extraños como lo es el valor de cero, ya que entendiendo el contexto del análisis no es lógico que una vivienda no cuente con ningún baño o ninguna habitación.


CONCLUSIONES

Basados en la información compartida, se aplico un analisis de datos exploratorio y descriptivo, utilizando el software R, con la intención de llegar a posibles estrategias que pueda implementar la empresa B&C y lograr mejorar sus ventas y por ende sus ganancias.

Por eso algunas de las acciones que podria implementar la empresa para continuar mejorando, son las siguientes:

  • Enfocar esfuerzos por realizar mejoras sencillas y économicas pero evidentes en las viviendas de más bajos precios (Centro, Norte y Oriente) para aumentar estos y así lograr obtener un poco más de ganancias sobre estas.

  • También se pueden enfocar en ofrecer y vender las propiedades de las zonas sur y norte que es donde más se tienen propiedades ofertadas especificamente en el tipo apartamento. Lo cual, también traera beneficios en terminos de ahorro de tiempos y costos de desplazamiento si se muestran varios apartamentos al cliente en el mismo día.

  • Es bueno conocer y analizar las variables de las viviendas, pero esto se puede complementar con un analísis de potenciales clientes los cuales se segmentarian por preferencias, ingresos, gustos, entre otros, lo cual serviria para saber que ofrecerles de lo que se tenga disponible.

  • Dado que la zona oriente presenta los precios más bajos pueden implementar estrategias de venta con diferenciación en el precio, donde se ofrezcan varias viviendas por un menor precio indicandole a los clientes que se pueden asociar con vecinos, amigos o conocidos que también quieran comprar vivienda y asi obtener mayores ventas.

  • Desarrollar estrategias de marketing especificamente para las viviendas de la zona oeste las cuales son más costosas en promedio, destacando los mejores, exclusivos y lujosos aspectos de la zona y las viviendas para atraer más clientes con presupuestos más altos.

  • Y por último pero no menos importante, poner atención especial en la recolección de la información, implementando algún front con lógicas y controles que permita diligenciar y obtener información de calidad y confiable, para continuar sacandole provecho y disminuir el tiempo de limpieza y estandarización de datos en estos analisis.


ANEXOS


Librerias utilizadas

Librerías para trabajar con RMarkdown:

  • library(knitr)
  • library(rmarkdown)
#install.packages("knitr", dependencies = TRUE)
#install.packages("rmarkdown", dependencies = TRUE)
library(knitr)
library(rmarkdown)

Librerías utilizadas para cargar base de datos:

  • library(usethis)
  • library(devtools)
  • library(paqueteMETODOS)
#install.packages("devtools")
#devtools::install_github("dgonxalex80/paqueteMETODOS")
#install.packages("usethis")
library(usethis)
library(devtools)
library(paqueteMETODOS)

Librerías para realizar imputación de datos:

  • library(naniar)
  • library(mice)
  • library(visdat)
#install.packages("naniar")
#install.packages("mice")
#install.packages("visdat")
library(naniar)
library(mice)
library(visdat)

Librerías para realizar analisis descriptivo:

  • library(dplyr)
  • library(ggplot2)
#install.packages("dplyr")
# install.packages("ggplot2") 
library(dplyr)
library(ggplot2)