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.
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.
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.
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:
y las siguientes las variables cualitativas:
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.
Aqui se depurara la base de datos, usando las técnicas adecuadas para cada variable.
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.
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.
vivienda_falt$parquea[is.na(vivienda_falt$parquea)] <- 0
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
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"
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.
#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:
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.
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.
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.
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.
Librerias utilizadas
Librerías para trabajar con RMarkdown:
#install.packages("knitr", dependencies = TRUE)
#install.packages("rmarkdown", dependencies = TRUE)
library(knitr)
library(rmarkdown)
Librerías utilizadas para cargar base de datos:
#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:
#install.packages("naniar")
#install.packages("mice")
#install.packages("visdat")
library(naniar)
library(mice)
library(visdat)
Librerías para realizar analisis descriptivo:
#install.packages("dplyr")
# install.packages("ggplot2")
library(dplyr)
library(ggplot2)