El sector inmobiliario es uno de los sectores que se encuentran en mayor movimiento en la actualidad; la postura del gobierno nacional sobre dar apoyo a las personas que deseen adquirir su propio inmueble, y el crecimiento de las ciudades de acuerdo con sus actividades económicas (turísmo, zona industrial, oportunidades académicas, entre otros) hacen necesario para las entidades comercializadoras de este tipo de productos estar siempre actualizados sobre las tendencias que se tienen en cuanto a oferta y demanda.
Teniendo en cuenta lo anterior, se elabora este informe para la empresa Bienes y Casas (B&C en adelante) buscando una mirada actual a la base consolidada de ofertas de viviendas y sus principales características partiendo de un análisis descriptivo de los datos, con el fin de llegar a conclusiones de focalización de nuevas estrategias de marketing, entendimientos de la oferta disponible y análisis de las zonas para poder ofrecer a los clientes de la empresa una experiencia completa sobre la vista de oportunidades de viviendas en las que pueda estar interesado.
Realizar un análisis descriptivo del sector inmobiliario en Cali, partiendo de una base de inmuebles con características como el precio, área construida, número de habitaciones, baños o parqueaderos, y enfocando la descripción por zonas y estratos teniendo en cuenta que tipos de inmueble tienen mayor oportunidad de mercadeo.
Para lograr el objetivo de este reporte, se establece la siguiente metodología:
Para dar inicio al proyecto, se unifican los punto 1 y 2 en la siguiente sección.
Para iniciar el análisis del caso para la entidad B&C realizaremos la importación del paquete MET de la base de datos vivienda_faltantes, y definiremos la integridad de los datos y la limpieza necesaria teniendo en cuenta las condiciones en las que encontramos la información.
Instalación de librerías:
#install.packages("devtools")
#install.packages("ggplot")
#install.packages("psych")
#install.packages("dplyr")
#install.packages("tidyverse")
#install.packages("mice")
devtools::install_github("dgonxalex80/paqueteMET")
library(paqueteMET)
library(ggplot2)
library(psych)
library(dplyr)
library(tidyverse)
library(mice)
Ejecución de la importación de la información y primera lectura de los datos:
data(vivienda_faltantes)
BaseInicial<-vivienda_faltantes
glimpse(BaseInicial)
## Rows: 8,330
## Columns: 13
## $ id <dbl> 8312, 8311, 8307, 8296, 8297, 8298, 8299, 8300, 8286, 8287, …
## $ zona <chr> "Zona Oeste", "Zona Oeste", "Zona Oeste", "Zona Sur", "Zona …
## $ piso <dbl> 4, 1, NA, 2, NA, NA, 2, NA, NA, 2, 1, NA, 6, NA, 2, 8, NA, 6…
## $ estrato <dbl> 6, 6, 5, 3, 5, 5, 6, 5, 5, 5, 5, 3, 6, 3, 5, 6, 5, 6, 6, 6, …
## $ preciom <dbl> 1300, 480, 1200, 220, 330, 1350, 305, 480, 275, 285, 310, 17…
## $ areaconst <dbl> 318, 300, 800, 150, 112, 390, 125, 280, 74, 120, 166, 155, 1…
## $ parquea <dbl> 2, 1, 4, 1, 2, 8, 2, 4, 1, 2, 2, NA, 2, NA, 1, 2, 2, 2, 4, 1…
## $ banios <dbl> 4, 4, 7, 2, 4, 10, 3, 4, 2, 4, 4, 4, 3, 2, 2, 3, 3, 5, 7, 1,…
## $ habitac <dbl> 2, 4, 5, 4, 3, 10, 3, 4, 3, 3, 3, 6, 3, 3, 2, 4, 3, 4, 3, 2,…
## $ tipo <chr> "Apartamento", "Casa", "Casa", "Casa", "Casa", "Casa", "Apar…
## $ barrio <chr> "arboleda", "normandía", "miraflores", "el guabal", "bella s…
## $ longitud <dbl> -76576, -76571, -76568, -76565, -76565, -76565, -76565, -765…
## $ latitud <dbl> 3454.00000, 3454.00000, 3455.00000, 3417.00000, 3408.00000, …
Para tener una base de datos limpia y óptima en primer lugar estandarizaremos la información categórica de la variable tipo:
#Reemplazamos los valores vacíos por NA
BaseInicial$tipo[is.na(BaseInicial$tipo)]<-"NA"
#Identificamos inicialmente que valores está tomando la variable tipo
table(BaseInicial$tipo)
##
## Apartamento APARTAMENTO apto casa Casa CASA
## 5032 61 13 14 3195 12
## NA
## 3
#Transformamos los valores a una forma estandarizada y vemos nuevamente el resultado
BaseInicial<-BaseInicial %>% mutate(tipo=recode(tipo,"Apartamento"="Apartamento", "APARTAMENTO"="Apartamento","apto"="Apartamento", "casa"="Casa", "CASA"="Casa"))
table(BaseInicial$tipo)
##
## Apartamento Casa NA
## 5106 3221 3
Para seguir limpiando la base de datos, identificaremos los datos faltantes en para todas la variables:
InformacionNA<-colSums(is.na(BaseInicial))
InformacionNA
## id zona piso estrato preciom areaconst parquea banios
## 3 3 2641 3 2 3 1606 3
## habitac tipo barrio longitud latitud
## 3 0 3 3 3
BaseInicial[is.na(BaseInicial$id),]
## # A tibble: 3 × 13
## id zona piso estrato preciom areaconst parquea banios habitac tipo
## <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <chr>
## 1 NA <NA> NA NA NA NA NA NA NA NA
## 2 NA <NA> NA NA NA NA NA NA NA NA
## 3 NA <NA> NA NA 330 NA NA NA NA NA
## # ℹ 3 more variables: barrio <chr>, longitud <dbl>, latitud <dbl>
Como podemos ver en el resultado anterior, existen tres registros con valores faltantes para todas las variables (solamente tiene valor en la variable precio el cual es insignificante ya que no se puede analizar en conjunto con los demás valores), por lo tanto, vamos a eliminar de la base estos registros vacíos identificándolos por medio de la columna id cuando toma el valor nulo.
BaseAj1 <- BaseInicial[!is.na(BaseInicial$id),]
Luego de eliminar los registros que en todos los campos tenían valores nulos, identificamos nuevamente que variables tienen registros vacíos.
InformacionNA<-colSums(is.na(BaseAj1))
InformacionNA
## id zona piso estrato preciom areaconst parquea banios
## 0 0 2638 0 0 0 1603 0
## habitac tipo barrio longitud latitud
## 0 0 0 0 0
De acuerdo con el resultado anterior, tenemos dos variables con registros vacíos las cuales son piso y parquea. Para estos dos casos y con el fin de no eliminar información de la base, realizaremos un ejercicio de imputación para los datos faltantes en el que teniendo en cuenta la magnitud de los datos para ambas variables, los reemplazaremos por la media de cada variable. Al finalizar la imputación, revisamos nuevamente que no tengamos valores vacíos para las columnas ajustadas.
mean_parquea <- round(mean(BaseAj1$parquea, na.rm = TRUE), digits=0)
BaseAj1$parquea[is.na(BaseAj1$parquea)] <- mean_parquea
mean_piso <- round(mean(BaseAj1$piso, na.rm = TRUE), digits=0)
BaseAj1$piso[is.na(BaseAj1$piso)] <- mean_piso
InformacionNA<-colSums(is.na(BaseAj1))
InformacionNA
## id zona piso estrato preciom areaconst parquea banios
## 0 0 0 0 0 0 0 0
## habitac tipo barrio longitud latitud
## 0 0 0 0 0
Luego de verificar que no tengamos valores vacíos en nuestra base de datos, damos por terminada la etapa de limpieza para generar un análisis descriptivo de la información.
Para iniciar el análisis descriptivo, por medio de una tabla de frecuencias según la variable categórica zona tenemos los siguientes resultados:
summarytools::freq(BaseAj1$zona, cumul = F)
## Frequencies
## BaseAj1$zona
## Type: Character
##
## Freq % Valid % Total
## ------------------ ------ --------- ---------
## Zona Centro 124 1.49 1.49
## Zona Norte 1922 23.08 23.08
## Zona Oeste 1204 14.46 14.46
## Zona Oriente 351 4.22 4.22
## Zona Sur 4726 56.76 56.76
## <NA> 0 0.00
## Total 8327 100.00 100.00
De acuerdo con lo anterior, realizaremos una división de la base de datos según zona, para realizar un análisis más profundo por zona, que permita la creación de estrategias de marketing más focalizadas a las necesidades de los clientes.
ZonaCentro=subset(BaseAj1, BaseAj1$zona=="Zona Centro")
ZonaNorte=subset(BaseAj1, BaseAj1$zona=="Zona Norte")
ZonaSur=subset(BaseAj1, BaseAj1$zona=="Zona Sur")
ZonaOriente=subset(BaseAj1, BaseAj1$zona=="Zona Oriente")
ZonaOeste=subset(BaseAj1, BaseAj1$zona=="Zona Oeste")
Inicialmente, graficamos el número de inmuebles por estrato y tipo de vivienda.
resum1<-table(ZonaCentro$tipo, ZonaCentro$estrato)
barplot(resum1, main = "Numero de inmuebles por estrato y tipo
Zona Centro",
xlab = "Estrato",
col=c("#00304E","#B5B2B2"),
legend.text = rownames(resum1))
Para identificar oportunidades en la zona, en primer lugar creamos una tabla resumen por promedios de las variables más importantes en el mercado.
tablaZC1<-data.frame(ZonaCentro%>%
group_by(estrato,tipo)%>%
summarise(prom_precio=round(mean(preciom),2),
prom_area=round(mean(areaconst),2),
prom_banios=round(mean(banios),0),
prom_hab=round(mean(habitac),0),
prom_parq=round(mean(parquea),0)))
También describimos la información para la variable precio, la cual se considera determinante al momento de elegir una vivienda.
summarytools::descr(ZonaCentro$preciom)
## Descriptive Statistics
## ZonaCentro$preciom
## N: 124
##
## preciom
## ----------------- ---------
## Mean 309.69
## Std.Dev 162.15
## Min 100.00
## Q1 187.50
## Median 297.00
## Q3 362.50
## Max 1100.00
## MAD 126.02
## IQR 172.50
## CV 0.52
## Skewness 1.94
## SE.Skewness 0.22
## Kurtosis 5.92
## N.Valid 124.00
## Pct.Valid 100.00
Inicialmente, graficamos el número de inmuebles por estrato y tipo de vivienda.
resum1<-table(ZonaNorte$tipo, ZonaNorte$estrato)
barplot(resum1, main = "Numero de inmuebles por estrato y tipo
Zona Norte",
xlab = "Estrato",
col=c("#00304E","#B5B2B2"),
legend.text = rownames(resum1))
Para identificar oportunidades en la zona, en primer lugar creamos una tabla resumen por promedios de las variables más importantes en el mercado.
tablaZN1<-data.frame(ZonaNorte%>%
group_by(estrato,tipo)%>%
summarise(prom_precio=round(mean(preciom),2),
prom_area=round(mean(areaconst),2),
prom_banios=round(mean(banios),0),
prom_hab=round(mean(habitac),0),
prom_parq=round(mean(parquea),0)))
También describimos la información para la variable precio, la cual se considera determinante al momento de elegir una vivienda.
summarytools::descr(ZonaNorte$preciom)
## Descriptive Statistics
## ZonaNorte$preciom
## N: 1922
##
## preciom
## ----------------- ---------
## Mean 345.76
## Std.Dev 240.80
## Min 65.00
## Q1 160.00
## Median 300.00
## Q3 430.00
## Max 1940.00
## MAD 200.15
## IQR 270.00
## CV 0.70
## Skewness 1.97
## SE.Skewness 0.06
## Kurtosis 5.74
## N.Valid 1922.00
## Pct.Valid 100.00
Inicialmente, graficamos el número de inmuebles por estrato y tipo de vivienda.
resum1<-table(ZonaSur$tipo, ZonaSur$estrato)
barplot(resum1, main = "Numero de inmuebles por estrato y tipo
Zona Sur",
xlab = "Estrato",
col=c("#00304E","#B5B2B2"),
legend.text = rownames(resum1))
Para identificar oportunidades en la zona, en primer lugar creamos una tabla resumen por promedios de las variables más importantes en el mercado.
tablaZS1<-data.frame(ZonaSur%>%
group_by(estrato,tipo)%>%
summarise(prom_precio=round(mean(preciom),2),
prom_area=round(mean(areaconst),2),
prom_banios=round(mean(banios),0),
prom_hab=round(mean(habitac),0),
prom_parq=round(mean(parquea),0)))
También describimos la información para la variable precio, la cual se considera determinante al momento de elegir una vivienda.
summarytools::descr(ZonaSur$preciom)
## Descriptive Statistics
## ZonaSur$preciom
## N: 4726
##
## preciom
## ----------------- ---------
## Mean 426.52
## Std.Dev 322.72
## Min 75.00
## Q1 222.00
## Median 320.00
## Q3 520.00
## Max 1900.00
## MAD 192.74
## IQR 298.00
## CV 0.76
## Skewness 2.00
## SE.Skewness 0.04
## Kurtosis 4.29
## N.Valid 4726.00
## Pct.Valid 100.00
Inicialmente, graficamos el número de inmuebles por estrato y tipo de vivienda.
resum1<-table(ZonaOriente$tipo, ZonaOriente$estrato)
barplot(resum1, main = "Numero de inmuebles por estrato y tipo
Zona Oriente",
xlab = "Estrato",
col=c("#00304E","#B5B2B2"),
legend.text = rownames(resum1))
Para identificar oportunidades en la zona, en primer lugar creamos una tabla resumen por promedios de las variables más importantes en el mercado.
tablaZO1<-data.frame(ZonaOriente%>%
group_by(estrato,tipo)%>%
summarise(prom_precio=round(mean(preciom),2),
prom_area=round(mean(areaconst),2),
prom_banios=round(mean(banios),0),
prom_hab=round(mean(habitac),0),
prom_parq=round(mean(parquea),0)))
También describimos la información para la variable precio, la cual se considera determinante al momento de elegir una vivienda.
summarytools::descr(ZonaOriente$preciom)
## Descriptive Statistics
## ZonaOriente$preciom
## N: 351
##
## preciom
## ----------------- ---------
## Mean 228.53
## Std.Dev 122.06
## Min 58.00
## Q1 145.00
## Median 210.00
## Q3 290.00
## Max 1350.00
## MAD 103.78
## IQR 145.00
## CV 0.53
## Skewness 2.87
## SE.Skewness 0.13
## Kurtosis 20.21
## N.Valid 351.00
## Pct.Valid 100.00
Inicialmente, graficamos el número de inmuebles por estrato y tipo de vivienda.
resum1<-table(ZonaOeste$tipo, ZonaOeste$estrato)
barplot(resum1, main = "Numero de inmuebles por estrato y tipo
Zona Oeste",
xlab = "Estrato",
col=c("#00304E","#B5B2B2"),
legend.text = rownames(resum1))
Para identificar oportunidades en la zona, en primer lugar creamos una tabla resumen por promedios de las variables más importantes en el mercado.
tablaZO2<-data.frame(ZonaOeste%>%
group_by(estrato,tipo)%>%
summarise(prom_precio=round(mean(preciom),2),
prom_area=round(mean(areaconst),2),
prom_banios=round(mean(banios),0),
prom_hab=round(mean(habitac),0),
prom_parq=round(mean(parquea),0)))
También describimos la información para la variable precio, la cual se considera determinante al momento de elegir una vivienda.
summarytools::descr(ZonaOeste$preciom)
## Descriptive Statistics
## ZonaOeste$preciom
## N: 1204
##
## preciom
## ----------------- ---------
## Mean 678.68
## Std.Dev 392.57
## Min 85.00
## Q1 394.00
## Median 580.00
## Q3 900.00
## Max 1999.00
## MAD 326.17
## IQR 505.50
## CV 0.58
## Skewness 0.98
## SE.Skewness 0.07
## Kurtosis 0.45
## N.Valid 1204.00
## Pct.Valid 100.00
Luego de todo el proceso realizado con la segmentación de información por Zonas, estratos y tipos de vivienda, se interpretan los resultados de la siguiente manera:
En cuanto a zonificación, encontramos la mayor oferta de inmuebles en la Zona Sur, seguida por la Zona Norte, luego la Zona Oeste y en las posiciones finales las zonas Oriente y Centro.
## Frequencies
## BaseAj1$zona
## Type: Character
##
## Freq % Valid % Total
## ------------------ ------ --------- ---------
## Zona Centro 124 1.49 1.49
## Zona Norte 1922 23.08 23.08
## Zona Oeste 1204 14.46 14.46
## Zona Oriente 351 4.22 4.22
## Zona Sur 4726 56.76 56.76
## <NA> 0 0.00
En un análisis por zona podemos identificar los siguientes resultados:
Para la zona centro, se tiene una mayor oferta de viviendas tipo Casa que apartamentos, con una mayor ubicación en barrios estrato 3, para los cuales el promedio de precio de este tipo de inmueble se encuentra en 314.000.000 COP, contando con una amplia área construida con promedio de 208,42m2. De igual manera vemos como el precio en general para la zona tiene un comportamiento asimétrico a la derecha y una curva leptocúrtica.
tablaZC1
## estrato tipo prom_precio prom_area prom_banios prom_hab prom_parq
## 1 3 Apartamento 140.79 84.91 2 3 2
## 2 3 Casa 314.00 208.42 3 5 2
## 3 4 Apartamento 236.00 107.71 2 3 1
## 4 4 Casa 528.57 326.29 4 6 2
## 5 5 Apartamento 285.00 113.00 3 3 1
## 6 5 Casa 650.00 129.00 2 1 2
## 7 6 Casa 1000.00 400.00 5 10 2
En cuanto a la distribución de viviendas por tipo y precio podemos evidenciar que en esta zona los apartamentos tienen un costo más bajo que las casa, pero que dentro de su misma distribución la mayoría de Apartamentos tienen precios por encima de la mediana, pero sin valores atípicos a diferencia de las casas, que existen varios inmuebles muy lejos del valor promedio, apesar de tener una distribución más simétrica.
boxplot(ZonaCentro$preciom~ZonaCentro$tipo,
main = "Distribucion de precios por tipo vivienda",
ylab = "Precio (mm)",
xlab = "Tipo vivienda")
Para la zona norte vemos que para todos los estratos el mayor número de inmuebles son apartamentos. Para el estrato 5 vemos que el promedio de precios se encuentra $347.65mm para apartamentos y $549.53mm para casas, teniendo en cuenta que la diferencia entre el promedio de áreas construidas es de 213.06m2.
tablaZN1
## estrato tipo prom_precio prom_area prom_banios prom_hab prom_parq
## 1 3 Apartamento 119.66 60.80 2 3 2
## 2 3 Casa 244.15 166.09 3 4 2
## 3 4 Apartamento 215.02 84.88 2 3 1
## 4 4 Casa 439.64 262.18 4 4 2
## 5 5 Apartamento 347.65 112.20 3 3 2
## 6 5 Casa 549.53 325.26 4 5 2
## 7 6 Apartamento 643.79 179.44 3 3 2
## 8 6 Casa 818.25 397.60 5 5 2
En esta zona encontramos distribuciones asimétricas para ambos tipos de vivienda (apartamentos y casas) con tendencia hacia el extremo inferior, pero al mismo tiempo encontramos un gran número de valores atípicos de precio para ambos tipos.
boxplot(ZonaNorte$preciom~ZonaNorte$tipo,
main = "Distribucion de precios por tipo vivienda",
ylab = "Precio (mm)",
xlab = "Tipo vivienda")
En la zona sur vemos una mayor distribución de inmuebles en los estratos 4 y 5 teniendo más apartamentos que casas en oferta, en la que ambos tipos de inmuebles ofrecen áreas construidas amplias interesantes para los clientes, y distribuciones del espacio pensadas para las necesidades de los compradores.
tablaZS1
## estrato tipo prom_precio prom_area prom_banios prom_hab prom_parq
## 1 3 Apartamento 141.12 68.70 2 3 2
## 2 3 Casa 311.78 215.64 3 5 2
## 3 4 Apartamento 203.68 75.97 2 3 1
## 4 4 Casa 393.14 222.08 4 4 2
## 5 5 Apartamento 293.71 102.24 3 3 1
## 6 5 Casa 531.89 262.89 4 5 2
## 7 6 Apartamento 594.50 150.15 4 3 2
## 8 6 Casa 993.60 379.04 5 4 3
boxplot(ZonaSur$preciom~ZonaSur$tipo,
main = "Distribucion de precios por tipo vivienda",
ylab = "Precio (mm)",
xlab = "Tipo vivienda")
La Zona Oriente por su parte tiene una mayor oferta de inmuebles en estrato 3, con precio más competitivos ya que para los apartamentos el promedio está en $128.98mm y para las casas en $243.55mm con amplias áreas construidas.En esta zona en particular vemos distribuciones casi simétricas de los precios, con pocos inmuebles que tengan valores atípicos los cuales están ubicados en los estratos más altos.
tablaZO1
## estrato tipo prom_precio prom_area prom_banios prom_hab prom_parq
## 1 3 Apartamento 128.98 93.05 2 3 2
## 2 3 Casa 243.55 213.25 3 5 2
## 3 4 Apartamento 262.50 87.00 2 3 2
## 4 4 Casa 320.83 229.83 4 5 2
## 5 5 Apartamento 105.00 60.00 1 3 1
## 6 5 Casa 148.00 150.00 1 3 2
## 7 6 Apartamento 1350.00 212.00 4 3 3
boxplot(ZonaOriente$preciom~ZonaOriente$tipo,
main = "Distribucion de precios por tipo vivienda",
ylab = "Precio (mm)",
xlab = "Tipo vivienda")
Para finalizar, la Zona Oeste en oposición a la zona oriente ofrece la mayoría de sus inmuebles en barrios de estrato 6, con los precios más altos en toda la ciudad, en especial para inmuebles de tipo casa. El promedio general de precios en esta zona es de $678.68mm con una distribución leptocúrtica con una asimetría a la derecha, teniendo en cuenta que es una de las zonas con menor participación en el total de inmuebles.
tablaZO2
## estrato tipo prom_precio prom_area prom_banios prom_hab prom_parq
## 1 3 Apartamento 147.31 66.14 2 3 2
## 2 3 Casa 484.88 235.89 3 5 2
## 3 4 Apartamento 228.81 84.44 2 2 2
## 4 4 Casa 469.19 273.48 4 5 2
## 5 5 Apartamento 494.33 142.17 3 3 2
## 6 5 Casa 678.83 374.08 4 5 2
## 7 6 Apartamento 783.14 193.94 4 3 2
## 8 6 Casa 1018.17 388.59 5 4 3
boxplot(ZonaOeste$preciom~ZonaOeste$tipo,
main = "Distribucion de precios por tipo vivienda",
ylab = "Precio (mm)",
xlab = "Tipo vivienda")
Según los resultados anteriores podemos concluir los siguiente:
Las zonas con mayor oferta de inmuebles son la Sur y la Norte, lo cual nos permite evidenciar la distribución poblacional de la ciudad, concentrándose en los extremos.
La mayoría de las zonas (a excepción de la zona oeste) presentan una distribución de precios, tendiendo a tener valores atípicos altos, los cuales representarían un reto a la hora de la venta del inmueble.
La zona oriente y la zona oeste son extremos opuestos en cuanto a estratificación, por lo cual se pueden crear estrategias enfocadas en personas con mayor poder adquisitivo para la oferta de inmuebles en la zona oeste; y estrategias de conveniencia para la venta de los inmuebles de la zona oriente por su valor un poco más accesible.
En la mayoría de las zona vemos una mayor oferta de inmueble de tipo Apartamento que Casas (a excepción de las zonas centro y oriente) por lo cual si se desea conmbinar con otros factores como el promedio de habitantes por unidad, o edades de compradores, permiten enfocar mejor las estrategias de venta.