Introducción

La ciudad de Cali es uno de los principales centros económicos de Colombia, constituyéndose a su vez como la tercera ciudad más poblada del país, con aproximadamente 2.5 millones de habitantes, de los cuales se estima que el 70% vive en zonas urbanas. Estas características poblacionales hacen que Cali cuente con una sólida industria inmobiliaria, encontrando una gran variedad de opciones a nivel residencial, industrial y comercial.

Este informe está focalizado netamente en la oferta residencial, a fin de analizar de manera descriptiva, el comportamiento del precio de acuerdo a una serie de variables inherentes a las características de diseño interior de los mismos, entendiendo que existen diferencias significativas según tipo de propiedad (Casa/Apartamento), el área construida y la ubicación (zona); es importante denotar que a nivel de esta última variable, la ciudad de Cali está dividida en 22 comunas y 15 corregimientos, que a su vez se sub-dividen en 249 barrios. Mapa de comunas de Cali. Sin embargo, aunque la base de datos objeto de este informe cuenta con datos del Barrio, al no encontrarse estandarizada esta variable, no se considera de valor en el análisis, reemplazándola por la variable Zona.

A nivel general se analizan:

  • -Precio de venta: Precio promedio por metro cuadrado, por Zona y por tipo de vivienda.

  • -Zona: Cantidad de predios ofertados (frecuencia) por zona y desglosando también por tipo de vivienda.

  • -Área Construida: Promedios por tipo de vivienda y por Zona.

  • -Número de habitaciones, baños y parqueaderos: identificando mínimos, máximos y promedios.

Los resultados plasmados en este documento pueden ser útiles para determinar nichos de mercado y establecer estrategias comerciales customizadas que permitan apuntar a ese target, aumentando los rendimientos de los recursos invertidos. No cabe duda que el sector inmobiliario juega un papel fundamental en la economía de una región, y contribuye significativamente al crecimiento económico y al desarrollo urbano, por tanto es fundamental contar con herramientas adecuadas para su análisis e interpretación.


Objetivo

Proveer a los directivos de la empresa B&C, un análisis descriptivo del sector inmobiliario de Cali a partir de una muestra de oferta del sector residencial, consolidada en la base de datos vivienda_faltantes, que permita la toma decisiones estratégicas del negocio, enfocadas a la definición del nicho de mercado, desarrollos de servicios y de estrategias de marketing canalizadas hacia su mercado objetivo.


1. Método

Teniendo claro el objetivo a lograr con este análisis, se procede con el reconocimiento y limpieza de la base de datos, identificando las variables de interés, para su procesamiento y análisis exploratorio, a fin de generar conclusiones y recomendaciones para la empresa B&C que permitan la toma de decisiones informadas respecto al mercado inmobiliario de Cali.

1.1 Reconocimiento de BD

La base de datos inicial cuenta con 8330 registros de ofertas de inmuebles residenciales de la ciudad de Cali, distribuidos en las diferentes zonas de la ciudad. Se tienen 13 variables (columnas) entre las cuales se encuentran el precio, área construida (en metros), la zona donde se encuentra ubicado el predio, el tipo de vivienda y otras características de distribución al interior del inmueble.

A continuación se describen cada una de las variables contenidas en la base:

  • id - Identificador único de la vivienda

  • zona - Zona de la ciudad (Centro/Sur/Oeste/Este/Norte)

  • piso - Piso en que está ubicada la vivienda (entre 1 y 12 pisos)

  • estrato - Estrato socioeconómico del sector de la vivienda (3 al 6. No se presentan registros de 1 y 2)

  • preciom - Precio en millones de pesos (entre 58 y 1999 millones)

  • areaconst - Área construida en metros cuadrados (entre 30 y 1745 m cuadrados)

  • parqueaderos - Número de parqueaderos que tiene la vivienda(entre 0 y 10)

  • banios - Número de baños que tiene la vivienda (entre 0 y 10)

  • habitaciones - Número de habitaciones que tiene la vivienda (entre 0 y 10)

  • tipo - Tipo de vivienda (casa/apartamento)

  • barrio - Barrio donde está ubicada la vivienda (436 registros únicos)

  • longitud - Coordenada de longitud donde está ubicada la vivienda

  • latitud - Coordenada de latitud donde está ubicada la vivienda

En la revisión y reconocimiento preliminar de la base de datos, se identificó que algunas de esas variables no se encontraban estadarizadas durante la captura de la data, por lo que se hace necesario realizar la limpieza y depuración de los registros.


Muestra de la BD

library(paqueteMETODOS)
head(vivienda_faltantes)

1.2 Limpieza de Datos

Durante la etapa de organización y limpieza de la data, se identificaron una serie de issues originados principalmente por la ausencia de estandarización en la captura de los datos, de tal forma que se obtuvieros registros con espacios vacíos, textos unidos, con y sin tilde, con y sin artículos (el/la/los/las), con combinaciones de mayúsculas y minúsculas, entre otras. Una de las variables más afectadas por esta situación fue el Barrio, por tanto, aunque se aplicaron varias prácticas de limpieza, y se logró acotar el listado de barrios de 436 a 366 registros, se consideró que no existe suficiente certeza para continuar depurando la data y tomar como referencia esta variable, por tanto se opta por reemplazarla por la Zona.

Ejemplos de errores en barrios que se corrigieron durante la limpieza:

  • “agua blanca” vs “aguablanca”

  • “barrio 7de agosto” vs “7 de agosto”

  • “el tr?cbol” vs “el trebol”

  • “cristales” vs “los cristales”

Otra variable que se vio afectada por la ausencia de estandarización, fue el tipo de vivienda, siendo necesario mutarla para simpificar a 2 únicos tipos “casa” y “apartamento”. La mutación se realizó convirtiendo a minúsculas sostenida todos los caracteres de los registros de esa variable.

Mutación Variable Tipo
Mutación Variable Tipo

Otro hallazgo encontrado fue la ausencia de múltiples datos (NA), principalmente en las variables de parqueadero y piso. Al consultar los datos faltantes de la tabla, generó este resultado:

colSums(is.na(vivienda_faltantes)) 
##        id      zona      piso   estrato   preciom areaconst   parquea    banios 
##         3         3      2641         3         2         3      1606         3 
##   habitac      tipo    barrio  longitud   latitud 
##         3         3         3         3         3

Esto permitió identificar que para la mayoría de variables existían 3 datos ausentes por lo cual se infiere que podrían provenir de los mismos 3 registros; se procedió a consultarlos directamente y se confirmó el supuesto decidiendo eliminarlos debido que son datos inválidos sin ningún aporte al análisis.

Para la variable parqueadero, se determina imputar valor 0 a los registros faltantes, partiendo del supuesto de que la ausencia del dato es porque al no tener parqueadero, el registro se cargó vacío y quedó erradamente con “NA”.

#LIMPIEZA DE LA DATA

library(DescTools)
library(paqueteMETODOS)
library(devtools)
library(dplyr)
library(kableExtra)
library(ggplot2)
library(plotly)
library(VIM)
library(DT)
library(plotly)
library(summarytools)
library(pandoc)

BD_FRAME = vivienda_faltantes
BD_FRAME$tipo = tolower(BD_FRAME$tipo)
BD_FRAME = BD_FRAME  %>%
  mutate(tipo = ifelse(tipo == "apto", "apartamento", tipo))
BD_FRAME$barrio = tolower(BD_FRAME$barrio)
BD_FRAME$barrio = iconv(BD_FRAME$barrio, to = "ASCII//TRANSLIT")
BD_FRAME$barrio <- ifelse(BD_FRAME$barrio == "agua blanca", "aguablanca", BD_FRAME$barrio)
BD_FRAME$barrio <- ifelse(BD_FRAME$barrio == "alférez real", "alferez real", BD_FRAME$barrio)
BD_FRAME$barrio <- ifelse(BD_FRAME$barrio == "alfonso lopez i", "alfonso lopez", BD_FRAME$barrio)
BD_FRAME$barrio <- ifelse(BD_FRAME$barrio == "arboledas", "arboleda", BD_FRAME$barrio)
BD_FRAME$barrio <- ifelse(BD_FRAME$barrio == "barrio 7de agosto", "7 de agosto", BD_FRAME$barrio)
BD_FRAME$barrio <- ifelse(BD_FRAME$barrio == "barrio el recuerdo", "el recuerdo", BD_FRAME$barrio)
BD_FRAME$barrio <- ifelse(BD_FRAME$barrio == "barrio eucaristico", "eucaristico", BD_FRAME$barrio)
BD_FRAME$barrio <- ifelse(BD_FRAME$barrio == "barrio obrero", "obrero", BD_FRAME$barrio)
BD_FRAME$barrio <- ifelse(BD_FRAME$barrio == "barrio tranquilo y", "tranquilo", BD_FRAME$barrio)
BD_FRAME$barrio <- ifelse(BD_FRAME$barrio == "calibella", "cali bella", BD_FRAME$barrio)
BD_FRAME$barrio <- ifelse(BD_FRAME$barrio == "cali canto", "calicanto", BD_FRAME$barrio)
BD_FRAME$barrio <- ifelse(BD_FRAME$barrio == "ciudad mel?cndez", "ciudad melendez", BD_FRAME$barrio)
BD_FRAME$barrio <- ifelse(BD_FRAME$barrio == "base a?crea", "base aerea", BD_FRAME$barrio)
BD_FRAME$barrio <- ifelse(BD_FRAME$barrio == "ciudadela paso ancho", "ciudadela pasoancho", BD_FRAME$barrio)
BD_FRAME$barrio <- ifelse(BD_FRAME$barrio == "el tr?cbol", "el trebol", BD_FRAME$barrio)
BD_FRAME$barrio <- ifelse(BD_FRAME$barrio == "juanamb??", "juanambu", BD_FRAME$barrio)
BD_FRAME$barrio <- ifelse(BD_FRAME$barrio == "la riviera", "la rivera", BD_FRAME$barrio)
BD_FRAME$barrio <- ifelse(BD_FRAME$barrio == "las am?cricas", "las americas", BD_FRAME$barrio)
BD_FRAME$barrio <- ifelse(BD_FRAME$barrio == "mel?cndez", "melendez", BD_FRAME$barrio)
BD_FRAME$barrio <- ifelse(BD_FRAME$barrio == "rep??blica de israel", "republica de israel", BD_FRAME$barrio)
BD_FRAME$barrio <- ifelse(BD_FRAME$barrio == "laflora", "la flora", BD_FRAME$barrio)
BD_FRAME$barrio <- ifelse(BD_FRAME$barrio == "flora", "la flora", BD_FRAME$barrio)
BD_FRAME$barrio <- ifelse(BD_FRAME$barrio == "el ingenio 3", "el ingenio iii", BD_FRAME$barrio)
BD_FRAME$barrio <- ifelse(BD_FRAME$barrio == "ingenio i", "el ingenio i", BD_FRAME$barrio)
BD_FRAME$barrio <- ifelse(BD_FRAME$barrio == "ingenio ii", "el ingenio ii", BD_FRAME$barrio)
BD_FRAME$barrio <- ifelse(BD_FRAME$barrio == "ingenio", "el ingenio", BD_FRAME$barrio)
BD_FRAME$barrio <- ifelse(BD_FRAME$barrio == "los alamos", "alamos", BD_FRAME$barrio)
BD_FRAME$barrio <- ifelse(BD_FRAME$barrio == "alborada", "la alborada", BD_FRAME$barrio)
BD_FRAME$barrio <- ifelse(BD_FRAME$barrio == "alcazares", "los alcazares", BD_FRAME$barrio)
BD_FRAME$barrio <- ifelse(BD_FRAME$barrio == "alf?Crez real", "alferez real", BD_FRAME$barrio)
BD_FRAME$barrio <- ifelse(BD_FRAME$barrio == "base a?Crea", "base aerea", BD_FRAME$barrio)
BD_FRAME$barrio <- ifelse(BD_FRAME$barrio == "ciudad mel?Cndez", "ciudad melendez", BD_FRAME$barrio)
BD_FRAME$barrio <- ifelse(BD_FRAME$barrio == "ciudadela paso ancho", "ciudadela pasoancho", BD_FRAME$barrio)
BD_FRAME$barrio <- ifelse(BD_FRAME$barrio == "mel?Cndez", "melendez", BD_FRAME$barrio)
BD_FRAME$barrio <- ifelse(BD_FRAME$barrio == "cristales", "los cristales", BD_FRAME$barrio)
BD_FRAME$barrio <- ifelse(BD_FRAME$barrio == "normandia west point", "normandia", BD_FRAME$barrio)
DF_SINNA = BD_FRAME[-c(8320,8321,8322), ]
BD_FRAME = DF_SINNA
BD_FRAME$parquea[is.na(BD_FRAME$parquea)]<-0
barrio = table(BD_FRAME$barrio) %>% data.frame()
tipo = table(BD_FRAME$tipo) %>% data.frame()
zona = table(BD_FRAME$zona) %>% data.frame()
piso = table(BD_FRAME$piso) %>% data.frame()
estrato = table(BD_FRAME$estrato) %>% data.frame()
NumHabitac = table(BD_FRAME$habitac) %>% data.frame()
area = table(BD_FRAME$areaconst) %>% data.frame()
NumParquea = table(BD_FRAME$parquea) %>% data.frame()
NumBanios = table(BD_FRAME$banios) %>% data.frame()
precios = table(BD_FRAME$preciom) %>% data.frame()

Por otra parte, para la variable piso se determina no imputar datos pues se observó que tanto para casas como apartamentos, hay registros con piso NA; Para las casas podría asumirse que son de un solo nivel y por ende no se diligenció la variable dando a entender que estarían en piso 0, pero para los apartamentos no necesariamente aplicaría la misma lógica, por lo cual a fin de no inyectar errores a la base, se mantiene en su estado original.

BD_PISOTIPO = select (BD_FRAME, piso, tipo)
BD_PISOTIPO$piso[is.na(BD_PISOTIPO$piso)] <- 0
PT = filter(BD_PISOTIPO, piso == 0)
PTFRAME = table(PT$tipo) %>% data.frame()
print(PTFRAME)
##          Var1 Freq
## 1 apartamento 1383
## 2        casa 1255

Una vez realizadas las modificaciones anteriores, la base queda con los siguientes datos ausentes:

colSums(is.na(BD_FRAME)) 
##        id      zona      piso   estrato   preciom areaconst   parquea    banios 
##         0         0      2638         0         0         0         0         0 
##   habitac      tipo    barrio  longitud   latitud 
##         0         0         0         0         0
VIM::aggr(BD_FRAME, cex.axis = 0.8, cex.lab= 0.8)

Finalmente, debido que este informe no tiene pos objeto profudizar en un análisis via georeferenciación, se determina no limpiar las variables de coordenadas (latitud y longitud), las cuales tampoco presentan información veráz de las coordenadas reales, debido en parte al formato de miles utilizado para capturar la información.

1.3 Procesamiento Datos

1.3.1 Antes de Iniciar

Para efectos prácticas de los análisis de precio, se define mutar la variable Zona, realizando una concatenación entre la Zona y el Tipo de Vivienda, de tal forma que esa variable conjunta pueda cruzarse con otras variables.

La lectura de la nueva variable Zona_tipo, es la siguiente:

ZZZ_T

donde, ZZZ son los 3 primeros dígitos de la Zona, y T el tipo de vivienda (A - Apartamento y C - Casa)

Ejemplo:

  • Oes_C –> corresponde a Zona Oeste, Tipo Casa

  • Sur_A –> corresponde a Zona Sur, Tipo Apartamento

Nota: antes de mutar la variable Zona se genera una copia/backup de la base, que contiene todos los ajustes de limpieza realizados a la base, pues en algunas gráficas se hará uso de la variable en su estado original.

BACKUPFRAME = BD_FRAME

  • Mutación de ZONA por Zona Tipo
######Mutación de ZONA por Zona Tipo######

TipoApto = subset(BD_FRAME, BD_FRAME$tipo == "apartamento")
TipoCasa = subset(BD_FRAME, BD_FRAME$tipo == "casa")

TipoCasa <- TipoCasa %>%
  mutate(zona = ifelse(zona == "Zona Sur", "Sur_C", zona))
TipoCasa <- TipoCasa %>%
  mutate(zona = ifelse(zona == "Zona Centro", "Cen_C", zona))
TipoCasa <- TipoCasa %>%
  mutate(zona = ifelse(zona == "Zona Norte", "Nor_C", zona))
TipoCasa <- TipoCasa %>%
  mutate(zona = ifelse(zona == "Zona Oeste", "Oes_C", zona))
TipoCasa <- TipoCasa %>%
  mutate(zona = ifelse(zona == "Zona Oriente", "Ori_C", zona))

TipoApto <- TipoApto %>%
  mutate(zona = ifelse(zona == "Zona Sur", "Sur_A", zona))
TipoApto <- TipoApto %>%
  mutate(zona = ifelse(zona == "Zona Centro", "Cen_A", zona))
TipoApto <- TipoApto %>%
  mutate(zona = ifelse(zona == "Zona Norte", "Nor_A", zona))
TipoApto <- TipoApto %>%
  mutate(zona = ifelse(zona == "Zona Oeste", "Oes_A", zona))
TipoApto <- TipoApto %>%
  mutate(zona = ifelse(zona == "Zona Oriente", "Ori_A", zona))

BD_FRAME=rbind(TipoApto,TipoCasa)

BD_FRAMEMENOS = select (BD_FRAME, 2:10)

1.3.2 Análisis General - Variables Descriptivas

summarytools::descr(BD_FRAMEMENOS)
## Descriptive Statistics  
## BD_FRAMEMENOS  
## N: 8327  
## 
##                     areaconst    banios   estrato   habitac   parquea      piso   preciom
## ----------------- ----------- --------- --------- --------- --------- --------- ---------
##              Mean      174.99      3.11      4.63      3.61      1.48      3.77    434.25
##           Std.Dev      142.95      1.43      1.03      1.46      1.24      2.62    329.03
##               Min       30.00      0.00      3.00      0.00      0.00      1.00     58.00
##                Q1       80.00      2.00      4.00      3.00      1.00      2.00    220.00
##            Median      123.00      3.00      5.00      3.00      1.00      3.00    330.00
##                Q3      229.00      4.00      5.00      4.00      2.00      5.00    540.00
##               Max     1745.00     10.00      6.00     10.00     10.00     12.00   1999.00
##               MAD       84.51      1.48      1.48      1.48      1.48      1.48    209.05
##               IQR      149.00      2.00      1.00      1.00      1.00      3.00    320.00
##                CV        0.82      0.46      0.22      0.40      0.84      0.69      0.76
##          Skewness        2.69      0.92     -0.18      1.64      1.65      1.28      1.85
##       SE.Skewness        0.03      0.03      0.03      0.03      0.03      0.03      0.03
##          Kurtosis       12.90      1.12     -1.11      3.99      5.41      1.05      3.66
##           N.Valid     8327.00   8327.00   8327.00   8327.00   8327.00   5689.00   8327.00
##         Pct.Valid      100.00    100.00    100.00    100.00    100.00     68.32    100.00

Las frecuencias por variable más recurrentes son:

  • Tipo = Apartamentos

  • Piso = Segundo

  • Baños = 2

  • Habitaciones = 3

  • Parqueadero = 1

  • Estrato = 5

  • Área promedio construida = 175 metros cuadrados

1.3.3 Análisis de Precio


  • Histograma de Precios
hist(BD_FRAME$preciom, main="Histograma de Precios", xlab="Precio (Millones)", ylab="Frecuencia",
axes=TRUE, plot=TRUE, labels=TRUE, col="blue", border="white", breaks=8, ylim = c(0,3500),
xlim=c(0,max(BD_FRAME$preciom)))+ theme_minimal()

## NULL

  • Promedio de Precio por Metro Cuadrado, por Zona

La siguiente tabla presenta el precio promedio, el metraje construido promedio y los valores promedio del metro cuadrado construido, para cada zona_tipo.

PXZ= BD_FRAME %>% 
  group_by(zona) %>% 
  summarise(precio_promedio = mean(preciom))

AXZ= BD_FRAME %>% 
  group_by(zona) %>% 
  summarise(area_promedio = mean(areaconst))

PXM = BD_FRAME %>% 
  group_by(zona) %>% 
  summarise(pxm_promedio = mean(preciom)/mean(areaconst))

zonatipofrec = table(BD_FRAME$zona) %>% data.frame()

zonatipofrec <- zonatipofrec %>% 
  rename(zona = Var1)

AYPXZ = merge(PXZ, AXZ, by = "zona", all = TRUE)
AYPXZ_PXM = merge(AYPXZ, PXM, by = "zona", all = TRUE)
AYPXZ_PXMFREQ = merge(AYPXZ_PXM, zonatipofrec, by = "zona", all = TRUE)

AYPXZ_PXMFREQ_ordenado <- AYPXZ_PXMFREQ[order(-AYPXZ_PXMFREQ$pxm_promedio), ]

print(AYPXZ_PXMFREQ_ordenado)
##     zona precio_promedio area_promedio pxm_promedio Freq
## 5  Oes_A        669.2676     172.56413     3.878371 1035
## 9  Sur_A        297.3550      97.48839     3.050158 2786
## 3  Nor_A        285.2577      98.70945     2.889872 1199
## 10 Sur_C        612.0077     282.20148     2.168691 1940
## 6  Oes_C        736.3550     343.22698     2.145388  169
## 1  Cen_A        186.5833      95.07333     1.962520   24
## 4  Nor_C        446.0913     264.89216     1.684049  723
## 7  Ori_A        152.5968      94.24097     1.619219   62
## 2  Cen_C        339.2400     217.79500     1.557612  100
## 8  Ori_C        244.8201     213.37415     1.147375  289

  • Gráfica precio promedio por metro cuadrado, por Zona
ggplot(AYPXZ_PXMFREQ_ordenado, aes(x = zona, y = pxm_promedio))+ 
  geom_bar(stat = "identity", width = 0.7, fill = "blue")+ 
  labs(title = "Precio Cuadrado Promedio", x = "Zona Tipo", y = "Precio por Metro cuadrado") +
  theme_minimal() +
  theme(legend.position = "none") 

Dada la relación Zona, Precio Promedio por metro cuadrado y Tipo de Vivienda, se infiere que las viviendas más costosas son en promedio los apartamentos de la zona oeste, seguidos por los de la zona Sur. Para este resultado se consideró además la cantidad de viviendas por cada zona tipo (variable Freq de la tabla)

1.3.4 Análisis de Zona

  • Gráfica frecuencia viviendas por zona

zonafrec = transform(zona,
                 Rel = (round(prop.table(zona$Freq),3))*100)
zonafrecmej <- data.frame(
  Categoria = factor(zonafrec$Var1, levels = zonafrec$Var1), Frecuencia = zonafrec$Freq, Frec_Relat = zonafrec$Rel) ####tabla ver como la publico


ggplot(zonafrecmej, aes(x = Categoria, y = Frecuencia, fill = Categoria)) +
  geom_bar(stat = "identity", width = 0.7) +
  scale_fill_manual(values = c("#f95738", "#ee964b", "#f4d35e", "#faf0ca", "#0d3b66")) +
  labs(title = "Distribución por Zonas",
       x = "Categoría",
       y = "Frecuencia") +
  theme_minimal() +
  theme(legend.position = "none") 

#mean(BD_FRAME$preciom)

en la tabla se evidencia que a nivel de zona, el pareto de los inmuebles está comprendido en las zonas sur y norte, con una participación del 56.8% y 23.1%, respectivamente.

  • Gráfica frecuencia viviendas por zona

p =ggplot(BACKUPFRAME, aes(x = zona, fill = tipo)) +
  geom_bar(position = "stack", width = 0.7) +
  labs(title = "Distribución por Zona",
       x = "Zona de Cali",
       y = "Tipo de Vivienda") +
  scale_fill_manual(values = c("#0d3b66", "#f4d35e")) +
  theme_minimal() +
  theme(legend.position = "top", legend.title = element_blank())
print(p)

1.3.5 Análisis de Área Construida (m2)

Área promedio por tipo de Vivienda

AXT= BD_FRAME %>% 
  group_by(tipo) %>% 
  summarise(area_promedio_tipo = mean(areaconst))

AXTO = AXT[order(-AXT$area_promedio_tipo), ]
print(AXTO)
## # A tibble: 2 × 2
##   tipo        area_promedio_tipo
##   <chr>                    <dbl>
## 1 casa                      273.
## 2 apartamento               113.

Área promedio por zona

AXZ= BD_FRAME %>% 
  group_by(zona) %>% 
  summarise(area_promedio_zona = mean(areaconst))

AXZO= AXZ[order(-AXZ$area_promedio_zona), ]
print(AXZO)
## # A tibble: 10 × 2
##    zona  area_promedio_zona
##    <chr>              <dbl>
##  1 Oes_C              343. 
##  2 Sur_C              282. 
##  3 Nor_C              265. 
##  4 Cen_C              218. 
##  5 Ori_C              213. 
##  6 Oes_A              173. 
##  7 Nor_A               98.7
##  8 Sur_A               97.5
##  9 Cen_A               95.1
## 10 Ori_A               94.2

2. Resultados Obtenidos


  • La zona residencial con precios de vivienda promedios más elevados, es la Zona Oeste, independientemente del tipo de vivienda (es decir, tanto para Apartamentos como para Casas), lo cual podría inferir que es la zona más costosa de la ciudad.Ver Promedio de Precio por Metro Cuadrado, por Zona pero ordenando por precio_promedio.

sin embargo debido que esta variable está directamente relacionada con el área construida, al calcular la variable precio por metro cuadrado promedio el orden de la tabla cambia un poco, evidenciando que la zona más costosa sigue siendo la Oeste cuando se trata de apartamentos (3.88 millones/metro), pero le siguiría ahora la zona Sur también en la oferta de Aprtamentos (3.05 millones el metro). Ver tabla y gráfica del precio promedio por metro cuadrado, por Zona.

  • La zona con mayor oferta de vivienda es la zona SUR, seguida de la zona NORTE, entre las cuales se conjuga el pareto (80%) de la muestra analizada.

  • En las zonas NORTE, SUR y OESTE de Cali es mayor la frecuencia del tipo de vivienda Apartamento, que el de las Casas, mientras que en Centro y Oriente el resultario es contrario.

  • Las casa tienen un tamaño promedio de 273 metros cuadrados construidos, mientras que los apartamentos 113 metros cuadrados, es decir menos de la mitad que las primeras.

  • Al analizar el tamaño promedio por zona y tipo, se identifica que todas las casas, indistinto de la zona, tienen un área construida promedio superior a los 200 metros cuadrados

  • El área promedio de los apartamentos de la zona Oeste, es considerablemente mayor que la de los apartamentos de las demás Zonas de la ciudad de Cali (cerca del doble del metraje).

3. Conclusiones

Dados los resultados anteriores, los cuales constituyen un análisis preliminar muy a alto nivel de una muestra del sector inmobiliario de Cali, se recomienda a la compañía enfocar su nicho en los apartamentos de las zonas Oeste, Sur y Norte, y en las casas de la Zona Sur. Lo antaerior en razón a que contenien un volumen de oferta significativamente mayor que en las demás categorías (estas 4 representan el 84% del total de registros de la base), y a que el precio por metro es considerablemente mayor también.

Oes_A 669.2676 172.56413 3.878371 1035 Sur_A 297.3550 97.48839 3.050158 2786 Nor_A 285.2577 98.70945 2.889872 1199 Sur_C 612.0077 282.20148 2.168691 1940

Adicionalmente, para fines prácticos se recomienda a la compañía estandarizar las variables para la captura de información, a fin de agilizar el proceso de limpieza y procesamiento de los datos, y aumentar la efectividad del resultado.

Anexos


1. Frec. Piso

  • Frecuencia de Piso
pisofrec = table(BD_FRAME$piso) %>% data.frame()
pisofreco = pisofrec[order(-pisofrec$Freq), ]
print(pisofreco)
##    Var1 Freq
## 2     2 1450
## 3     3 1097
## 1     1  861
## 4     4  607
## 5     5  568
## 6     6  245
## 8     8  211
## 7     7  207
## 9     9  146
## 10   10  130
## 11   11   84
## 12   12   83

2. Frec. Estrato

  • Frecuencia de Estrato
estratofrec = table(BD_FRAME$estrato) %>% data.frame()
estratofreco = estratofrec[order(-estratofrec$Freq), ]
print(estratofreco)
##   Var1 Freq
## 3    5 2751
## 2    4 2131
## 4    6 1992
## 1    3 1453

3. Frec. cant. parqueaderos

  • Frecuencia de parqueadero
parqueafrec = table(BD_FRAME$parquea) %>% data.frame()
parqueafreco = parqueafrec[order(-parqueafrec$Freq), ]
print(parqueafreco)
##    Var1 Freq
## 2     1 3156
## 3     2 2478
## 1     0 1603
## 4     3  521
## 5     4  386
## 6     5   68
## 7     6   68
## 8     7   18
## 9     8   17
## 11   10    8
## 10    9    4

4. Frec. cant. baños

  • Frecuencia de baños
baniosfrec = table(BD_FRAME$banios) %>% data.frame()
baniosfreco = baniosfrec[order(-baniosfrec$Freq), ]
print(baniosfreco)
##    Var1 Freq
## 3     2 2946
## 4     3 1994
## 5     4 1460
## 6     5  891
## 2     1  497
## 7     6  315
## 8     7  107
## 9     8   48
## 1     0   45
## 10    9   15
## 11   10    9

5. Frec. cant. habitaciones

  • Frecuencia de habitaciones
habitacfrec = table(BD_FRAME$habitac) %>% data.frame()
habitacfreco = habitacfrec[order(-habitacfrec$Freq), ]
print(habitacfreco)
##    Var1 Freq
## 4     3 4101
## 5     4 1731
## 3     2  927
## 6     5  680
## 7     6  318
## 8     7  173
## 9     8  138
## 10    9   83
## 1     0   66
## 2     1   59
## 11   10   51