Introducción

El mercado inmobiliario en la ciudad de Cali, ha presentado un crecimiento significativo en los últimos años, lo anterior obedece a factores como: desarrollo de nuevos proyectos, inversión extranjera directa, otorgamiento de beneficios de parte del gobierno y el crecimiento de la población. En 2021, las ventas del sector en Cali llegaron a $6700 millones y en 2022 a $6100 mil millones. Por lo anterior, se espera que el sector continúe en crecimiento en los siguientes años, propiciando así desarrollo en la economía de la región.

En el presente informe se interpretan y analizan datos sobre oferta de viviendas en Cali, se incluye precio de viviendas en diferentes zonas de la ciudad, tipo de viviendas disponibles, caracteristicas de los inmuebles, entre otros.

Objetivos

Realizar un análisis descriptivo que permita identificar tendencias de comportamiento en el sector inmobiliario, patrones atípicos, relación entre las variables existentes. Los resultados proporcionan información útil para la toma de decisiones de la empresa B&C respecto a estrategias de marketing, definición de precios de vivienda e identificación de nichos de mercado.

Métodos

Se tomó la base de datos denominada vivienda_faltantes la cual fue suministrada por la inmobiliaria y se realizó la identificación de variables, posteriormente se hizo una limpieza de datos donde se eliminaron los registros vacíos, estandarizando resultados de variables y reemplazando valores ausentes.

Respecto al análisis estadístico se aplicaron métodos descriptivos, inicialmente se realizó un análisis univariado. Las variables cualitativas se analizaron con tablas de frecuencias y gráficos de torta y/o de barras. Las variables cuantitativas se analizaron con medidas de tendencia central o de dispersión.

Se realizaron cruces de variables para identificar patrones por tipo de vivienda y zonas.

Depuración-Limpieza de Datos

El primer paso que se llevo a cabo fue la limpieza de datos, con el propósito de corregir o eliminar registros imprecisos, campos vacios o con información duplicada.

El dataset proporcionado se denomina vivienda_faltantes, se procede a organizar los registros de forma ascendente por la variable “ID”, así mismo se redujo el número de variables debido a que se excluyeron aquellas que se considera no agregan valor al análisis.

# asigna la variable df(dataframe)
df <- vivienda_faltantes 
# organizar los datos de manera ascendente por la columna 'id'
df_ordenado <- vivienda_faltantes[order(df$id), ]
# muestra la base de datos vivienda_faltantes con las columnas seleccionadas 
df1 <- df_ordenado [, c(1, 3, 4, 5, 6, 7, 10, 11)] 

En la base datos se observa que existen datos que no estan estandarizados, es decir se tienen una combinación de mayusculas y minusculas, por lo que se decide realizar un homologación con la opción tolower con el propósito de evidenciar uniformidad en los datos

# Convertir los datos registrados en minúsculas, a Mayúsculas usando toupper en vez de tolower
df1 <- mutate_if(df1, is.character, tolower)
df2 <- df1
(df1)

Interpretación de datos

skim(df1)
Data summary
Name df1
Number of rows 8330
Number of columns 8
_______________________
Column type frequency:
character 2
numeric 6
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
tipo 3 1 4 11 0 3 0
barrio 3 1 4 29 0 407 0

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
id 3 1.00 4163.99 2403.93 1 2082.5 4164 6245.5 8319 ▇▇▇▇▇
piso 2641 0.68 3.77 2.62 1 2.0 3 5.0 12 ▇▃▁▁▁
estrato 3 1.00 4.63 1.03 3 4.0 5 5.0 6 ▅▆▁▇▆
preciom 2 1.00 434.24 329.02 58 220.0 330 540.0 1999 ▇▂▁▁▁
areaconst 3 1.00 174.99 142.95 30 80.0 123 229.0 1745 ▇▁▁▁▁
parquea 1606 0.81 1.84 1.13 1 1.0 2 2.0 10 ▇▁▁▁▁

A continuación se observan las variables identificadas en el análisis:

Variables Cuantitativas

Se observa que existen 6 valores y/o variables de tipo numérico, las cuales se relacionan a continuación: id, piso, estrato, preciom,areaconst, parquea

Variables Cualitativas

Se evidencian 2 variables de tipo categórico, las cuales son: tipo y barrio ambas de carácter nominal

___________________________________________________________________________________________________________

Imputación de datos

A continuación se realiza la estimación de los valores ausentes en el conjunto de datos entregado.

n_miss(df1)
## [1] 4264

El resultado arroja un total de (4264) datos perdidos y/o sin poblar. _____________________________________________________________________________________________________________

Validación de imputación

Se observa que existen dos variables que presentan el mayor número de valores perdidos.

La variable piso tiene un total de 2641 datos sin poblar, lo que representa un 31.70%, mientras que la variable parquea tiene 1606 campos sin poblar que corresponde al 19.30% de datos faltantes.

De lo anterior se concluye que para la variable piso, es necesario tener un concepto de los administradores de la base para conocer las alternativas de poblamiento y/o determinar si es optimo trabajar con el porcentaje de datos faltantes. Respecto a la variable de parqueo los datos faltantes no superan el porcentaje de 20% por lo que no cumple con el porcentaje mínimo para considerar alternativa de imputación.

vis_miss(df1, cluster = TRUE)

aggr(df1,numbers=T,sortVar=T)

## 
##  Variables sorted by number of missings: 
##   Variable        Count
##       piso 0.3170468187
##    parquea 0.1927971188
##         id 0.0003601441
##    estrato 0.0003601441
##  areaconst 0.0003601441
##       tipo 0.0003601441
##     barrio 0.0003601441
##    preciom 0.0002400960

Se determino realizar la imputación de los datos a través de la media absoluta de los registros presentes en la base de datos y de esta manera poblar los datos ausentes. Es de aclarar que se empleo la media exclusivamente para las variables cuantitativas, mientras que las variables categóricas o cualitativas se poblaron a través de la moda.

datos_faltantes_1 <-is.na(df2$piso)
datos_faltantes_2 <-is.na(df2$parquea)
datos_faltantes_3 <-is.na(df2$tipo)
datos_faltantes_4 <-is.na(df2$barrio)

Imputación por media

Para la variable piso se empleó la instrucción común para imputación, remplazando el valor de la media (3.772368) en los (2641) registros vacios.

df2$piso[datos_faltantes_1]<-mean(df2$piso,na.rm = T)
df2$parquea[datos_faltantes_2]<-mean(df2$parquea,na.rm = T)
#n_miss(df1$piso)
#n_miss(df2$piso)
#n_miss(df1$parquea)
#n_miss(df2$parquea)

Imputación por moda

Aunque los datos NA´s con las variables categóricas tipo y barrio corresponden a 3 valores faltantes no sería necesario hacer imputación, sin embargo para el ejercicio se realiza de la siguiente manera:

df2$tipo[datos_faltantes_3]<-mfv(df2$tipo[!datos_faltantes_3])
df2$barrio[datos_faltantes_4]<-mfv(df2$barrio[!datos_faltantes_4])

A continuación se muestra un dataframe de los valores NA´s de las variables, piso, parqueadero, tipo y barrio los cuales podemos observar la comparación con registros disminuidos a cero datos_faltantes

miss_var_summary(df1)
miss_var_summary(df2)

Se observa como se realizó de manera exitosa el reemplazado los datos NA´s por la media para variables númericas y por la moda para las variables categóricas

(df1$piso[4]) # posición 4 de la variable piso en el dataframe df1
## [1] NA
(df2$piso[4]) # posición 4 de la variable piso en el dataframe df2
## [1] 3.772368
(df1$parquea[129]) # posición 129 de la variable piso en el dataframe df1
## [1] NA
(df2$parquea[129]) # posición 129 de la variable piso en el dataframe df2
## [1] 1.835961

Construcción y relación de la data

tabla1 <- table(df1$id)
tabla2 <- table(df1$piso)
tabla3 <- table(df1$estrato)
tabla4 <- table(df1$preciom)
tabla5 <- table(df1$areaconst)
tabla6 <- table(df1$parquea)
tabla7 <- table(df1$tipo) 
tabla8 <- table(df1$barrio)
# variable cualitativa con 2 opciones apartamento o casa
color <- brewer.pal(length(tabla7), "Set2") 
etiquetas7 <- paste0(tabla7, " = ", round(100 * tabla7/sum(tabla7), 2), "%")
pie(tabla7, labels = etiquetas7, col = color)
legend("topright", legend = c("apto", "apartamento", "casa"),
       fill =  c("lightgreen", "lightgreen", "lightblue"))

Análisis descriptivo

Indicadores de centro

En cuanto a las medidas de tendencia central se calcula la media solo para las variables cuantitativas, así como la mediana permite calcular sin importar el tipo de variable, y para la moda solo la variable id evitaría realizar el cálculo pues sus datos corresponden a un dato de indentificación único _________________________________________________________________________________________________________

md1 <- mean(df1$id, na.rm = TRUE)
#md2 <- mean(df1$piso, na.rm = TRUE), comando a usar antes de la imputación df1
md2 <- mean(df2$piso) # comando a usar después de la imputación df2
md3 <- mean(df1$estrato, na.rm = TRUE)
md4 <- mean(df1$preciom, na.rm = TRUE)
md5 <- mean(df1$areaconst, na.rm = TRUE)
#md6 <- mean(df1$parquea, na.rm = TRUE)
md6 <- mean(df2$parquea)


media <- c(md1,md2,md3,md4,md5,md6)
media
## [1] 4163.990873    3.772368    4.634322  434.240634  174.987601    1.835961

Media: Se observa que el promedio del precio de las viviendas que se encuentran disponibles para la venta en la ciudad de Cali es de $434.000.000 m/c ___________________________________________________________________________________________________________

m1 <- median(df1$id, na.rm = TRUE)
m2 <- median(df2$piso)
m3 <- median(df1$estrato, na.rm = TRUE)
m4 <- median(df1$preciom, na.rm = TRUE)
m5 <- median(df1$areaconst, na.rm = TRUE)
m6 <- median(df2$parquea)
m7 <- median(df1$tipo, na.rm = TRUE)
m8 <- median(df1$barrio, na.rm = TRUE)

mediana <- c(m1,m2,m3,m4,m5,m6,m7,m8)
mediana
## [1] "4164"             "3.77236772719283" "5"                "330"             
## [5] "123"              "1.83596073765616" "apartamento"      "los andes"

Mediana: El 50% de las viviendas que faltan por vender en la ciudad de Cali es menor o igual a un area de construcción de 123 metros cuadrados ___________________________________________________________________________________________________________

#mo1 es el código id es único por tanto no se puede calcular la moda
mo2 <- mfv(df2$piso)
mo3 <- mfv(df1$estrato, na_rm = TRUE)
mo4 <- mfv(df1$preciom, na_rm = TRUE)
mo5 <- mfv(df1$areaconst, na_rm = TRUE)
mo6 <- mfv(df2$parquea)
mo7 <- mfv(df1$tipo, na_rm = TRUE)
mo8 <- mfv(df1$barrio, na_rm = TRUE)

moda <- c(mo2,mo3,mo4,mo5,mo6,mo7,mo8)
moda
## [1] "3.77236772719283" "5"                "350"              "60"              
## [5] "1"                "apartamento"      "valle del lili"

Moda: el barrio con más frecuencia para las viviendas disponibles para la venta en la ciudad de Cali se llama Valle de Lili ________________________________________________________________________________________________________

Indicadores de posición

____________________________________________________________________________________________________

# Cálculo cuartiles
q1 <- quantile(df1$id, prob=seq(0, 1, 1/4), na.rm = TRUE)  
q2 <- quantile(df2$piso, prob=seq(0, 1, 1/4)) 
q3 <- quantile(df1$estrato, prob=seq(0, 1, 1/4), na.rm = TRUE) 
q4 <- quantile(df1$preciom, prob=seq(0, 1, 1/4), na.rm = TRUE) 
q5 <- quantile(df1$areaconst, prob=seq(0, 1, 1/4), na.rm = TRUE) 
q6 <- quantile(df2$parquea, prob=seq(0, 1, 1/4)) 


q2
##        0%       25%       50%       75%      100% 
##  1.000000  2.000000  3.772368  4.000000 12.000000

Quartil No.4 de la variable piso (Q75%=4)

el 75% de las viviendas faltantes se encuentra como máximo en el 4 piso y el 25% de las viviendas faltantes se encuentran como mínimo en el piso 4 ____________________________________________________________________________________________________

# Cálculo deciles
d3 <- quantile(df1$estrato, prob=seq(0, 1, length = 11), na.rm = TRUE)  
d4 <- quantile(df1$preciom, prob=seq(0, 1, length = 11), na.rm = TRUE)  

d3
##   0%  10%  20%  30%  40%  50%  60%  70%  80%  90% 100% 
##    3    3    4    4    4    5    5    5    6    6    6
d4
##   0%  10%  20%  30%  40%  50%  60%  70%  80%  90% 100% 
##   58  145  190  240  285  330  390  475  610  870 1999

Decil No.2 de la variable estrato (D10%=3)

el 10% de las viviendas faltantes se encuentra como máximo en el estrato 3 y el 90% de las viviendas faltantes se encuentran como mínimo en el estrato 3

Decil No.9 de la variable precio (D90%=870)

el 90% de las viviendas faltantes tiene como máximo un precio de 870 millones y el 10% de las viviendas faltantes tiene como mínimo un precio de 870 millones ____________________________________________________________________________________________________________

# Cálculo percentiles

pc5 <- quantile(df1$areaconst, c(0.2, 0.40, 0.50, 0.60, 0.80), type = 6, na.rm = TRUE)
pc6 <- quantile(df2$parquea, c(0.2, 0.40, 0.50, 0.60, 0.80), type = 6)

pc5
## 20% 40% 50% 60% 80% 
##  73 102 123 153 258
pc6
##      20%      40%      50%      60%      80% 
## 1.000000 1.835961 1.835961 2.000000 2.000000

Percentil No.40 de la variable areaconst (P40%=102)

el 40% de las viviendas faltantes consta de un area de construcción como máximo de 102 metros cuadrados y el 60% de las viviendas faltantes consta de un area de construción como mínimo de 102 metros cuadrados

Percentil No.80 de la variable parqueadero (P80%=2)

el 80% de las viviendas faltantes tiene como máximo la opción de 2 puestos de parqueadero y el 20% de las viviendas faltantes tiene como mínimo la opción de 2 puestos de parqueadero _________________________________________________________________________________________________________

# Rango Mínimo y Máximo
Rgm7 <- min(df2$tipo)                              
Rgx7 <- max(df2$tipo)  
Rgm8 <- min(df2$barrio)                              
Rgx8 <- max(df2$barrio) 

Rgm7
## [1] "apartamento"
Rgm8
## [1] "20 de julio"

El valor mínimo de las viviendas faltantes de las variables tipo y barrio, corresponden respectivamente a un apartamento que se encuentra ubicado en el barrio 20 de Julio de la ciudad de Calí


Indicadores de dispersión

Para realizar el siguiente cálculo se debe tener en cuenta las variables númericas, sobre las cuales se encontrará la varianza y la desviación estandar aquella para interpretar que tan factible es el cambio entre dato y dato de la base vivienda_faltantes


# varianza
v1 <- var(df1$id, na.rm = TRUE)    
v2 <- var(df2$piso)  
v3 <- var(df1$estrato, na.rm = TRUE)  
v4 <- var(df1$preciom, na.rm = TRUE)  
v5 <- var(df1$areaconst, na.rm = TRUE)  
v6 <- var(df2$parquea)  

varianza <- c(v1,v2,v3,v4,v5,v6)
varianza
## [1] 5778862.154132       4.669974       1.059514  108251.333226   20434.659175
## [6]       1.021739

Se concluye que la variable precio es una de las que mayor importancia tiene en la elección de un bien inmueble. Por lo anterior, se considera imprescindible complementar los datos encontrados con las medidas de tendencia central.

Toda vez que el promedio del precio de las viviendas que se encuentran disponibles para la venta en la ciudad de Cali es de $434.000.000 m/c, el resultado de la varianza para dicho parámetro es de 108251.333226 apartir de lo cual se aplica una raiz cuadrada (√ 108521), que ofrece como resultado la desviación estandar con un valor de 329.015704 _________________________________________________________________________________________________________

# desviación estandar
dv1 <- sd(df1$id, na.rm = TRUE)  
dv2 <- sd(df2$piso) 
dv3 <- sd(df1$estrato, na.rm = TRUE) 
dv4 <- sd(df1$preciom, na.rm = TRUE) 
dv5 <- sd(df1$areaconst, na.rm = TRUE) 
dv6 <- sd(df2$parquea) 

desv_estandar <- c(dv1,dv2,dv3,dv4,dv5,dv6)
desv_estandar
## [1] 2403.926404    2.161012    1.029327  329.015704  142.949848    1.010811
intervalo_1 <- md4+dv4 
intervalo_1  # 68% de los datos
## [1] 763.2563
intervalo_2 <- md4-dv4 
intervalo_2  # 95% de los datos
## [1] 105.2249
precio_dv4_md4 <- c (intervalo_1,md4,intervalo_2)
precio_dv4_md4
## [1] 763.2563 434.2406 105.2249

Si la desviación estandar para la variable estandar es de 329 aproximadamente, entonces este valor lo sumamos y restamos de la media generando un intervalo que comprendería el 68% de los datos, es decir:

Media: 434 millones Media + desv_estandar_precio = 434 + 329 = 763 Media - desv_estandar_precio = 434 - 329 = 105

Se observa que el intervalo para la desviación de estandar donde se cubriria un 68% de los registros de la base de datos de viviendas faltantes en Cali es: [ 105.2249 - 434.2406 - 763.2563]

Se obtiene una desviación estandar de 329 y a este valor se le aplica otra ráiz cuadrada (√ 329) el resultado es de 18.13, este resultado lo sumamos y restamos a los datos 763 y 105 del intervalo anterior entonces tendriamos un intervalo con los siguientes datos: [ 87 - 434 - 781] el cual cubriria un 95% de los registros de la base de datos de viviendas faltantes en Cali. __________________________________________________________________________________________________________

Desviación estandar 95%

En resumen las 7913 viviendas disponibles para la venta en Cali, equivalen al 95% de 8330 registros en total de la base de datos, dichas casas o apartamentos oscilan entre valores de 87 a 781 millones

Discusión

Una vez finalizada la metodología de análisis exploratorio de datos implementada en este estudio se cita a continuación las tendencias actuales del mercado inmobiliario:

*Existe preferencia por inmuebles que estan ubicados en zonas que registran un estrato socioeconomico 3 y 4.

*Se observa que existe una oferta más amplia de apartamentos en contraste con casas en la cidad de Cali.

*Las viviendas que presentan mayor precio se encuentran situadas en zona oeste y sur de la ciudad

Conclusiones

Una vez realizado el análisis de los datos se concluye que la exploración de los datos permitió la identificación de patrones de comportamiento, valores atipicos, composición de las variables, lo cual provee información para la toma de decisiones.

Respecto a las tendencias identificadas, se observa preferencia por la compra de tipo de inmueble apartamento, con caracteristicas particulares como que esten situados en pisos bajos y que ademas cuente con parqueadero.

Es de aclarar que en el análisis se encontraron algunos retos, especialmente en integridad de los datos y en variables que no tenían información poblada, no obstante se obtuvieron resultados que serviran de apoyo a la toma de decisiones en la empresa B&C.