El análisis de los precios de la vivienda en Cali es esencial para comprender las dinámicas del mercado inmobiliario y tomar decisiones informadas. En este estudio, se emplean metodologías clave como la estandarización de variables, imputación de datos y la identificación y corrección de valores atípicos. Para lograr estos objetivos, se hacen uso de diversas librerías en R, como DescTools, tidyverse, mice, dplyr, paqueteMET, knitr y ggplot2.
Dentro de esta investigación, la variable “tipo” juega un papel crucial, por lo que se realiza una estandarización del contenido de las celdas para asegurar uniformidad en el análisis. Dos variables de interés, “piso” y “Parqueaderos”, cuentan con datos faltantes que requieren imputación. Dado que el uso de métodos de regresión para la imputación resultaría inadecuado, se opta por el método de imputación de datos aleatorios utilizando la función “Sample”.
Es esencial garantizar que la imputación no genere sesgos en los datos. Por lo tanto, se verifica que las medias, distribuciones y rangos de las variables con datos faltantes no varíen de manera significativa entre la base original y la modificada. Los histogramas ilustran que las distribuciones se mantienen similares y la imputación conserva la estructura original de las variables.
En cuanto a la corrección de valores atípicos, se emplea la técnica de winsorización, que reemplaza los valores extremos por valores cercanos a los límites del rango intercuartil (IQR). Esta estrategia permite mitigar el impacto de los valores atípicos en los análisis.
El análisis también se enfoca en la variable principal, el precio de la vivienda. Se identifica que está sesgada a la izquierda debido a regulaciones gubernamentales que establecen precios máximos para viviendas de interés social y prioritario. Se revela que una porción significativa de viviendas cuenta con subsidios estatales, lo que sugiere que su venta está dirigida a segmentos de ingresos bajos y medios.
El contenido del análisis incluye la descripción de la variabilidad de los precios, expresada en alta varianza y un coeficiente de variación elevado. Se resalta la presencia de una asimetría en la distribución de precios debido a las regulaciones antes mencionadas.
Se identifican diferencias en los valores por metro cuadrado en diferentes zonas geográficas de Cali, lo que aporta información crucial para estrategias de marketing y enfoque de segmentos. Se propone un análisis de clusterización por barrios para futuros estudios, que permitiría una personalización aún más precisa en las estrategias de marketing.
En resumen, este estudio aborda de manera integral el análisis de los precios de la vivienda en Cali, empleando técnicas estadísticas y herramientas de programación en R para obtener conclusiones valiosas que pueden guiar decisiones en el mercado inmobiliario.
Aplicar Métodos de Estandarización, Imputación y Detección de Outliers: Utilizar los métodos de estandarización de variables, imputación de datos y detección de outliers en el análisis de los precios de la vivienda en Cali para asegurar que los datos estén limpios y preparados adecuadamente.
Evaluar Impacto de Imputación de Datos: Verificar que las técnicas de imputación de datos no generen sesgos ni afecten significativamente las estadísticas descriptivas y la forma de la distribución de las variables más relevantes, como el piso y la cantidad de parqueaderos, para garantizar la confiabilidad del análisis.
Corrección de Outliers mediante Winsorización: Aplicar el método de winsorización para corregir valores atípicos en variables como número de baños, habitaciones y parqueaderos, evitando distorsiones en el análisis y asegurando que los datos sigan siendo razonables.
Análisis de Distribución de Precios por Segmentos de Interés: Realizar un análisis de la distribución de precios por metro cuadrado y evaluar la concentración de viviendas en diferentes zonas de Cali, para identificar oportunidades de segmentación de mercado y estrategias de marketing dirigidas a diferentes grupos de ingresos.
Generar Recomendaciones Estratégicas: Proponer recomendaciones basadas en el análisis de precios por metro cuadrado y los segmentos identificados, sugiriendo en qué zonas y tipos de vivienda enfocar esfuerzos de marketing y desarrollo, y sugiriendo una posible clusterización por barrios para futuros análisis.
Para el estudio de los precios de la vivienda en Cali se eligen los métodos de estandarización de variables, imputación de datos y detección y corrección de outliers.
Para cumplir dichos objetivos se utilizan las librerias, DescTools, tidyverse, mice, dplyr, paqueteMET, knitr, ggplot2.
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.2 ✔ readr 2.1.4
## ✔ forcats 1.0.0 ✔ stringr 1.5.0
## ✔ ggplot2 3.4.2 ✔ tibble 3.2.1
## ✔ lubridate 1.9.2 ✔ tidyr 1.3.0
## ✔ purrr 1.0.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
##
## Attaching package: 'mice'
##
##
## The following object is masked from 'package:stats':
##
## filter
##
##
## The following objects are masked from 'package:base':
##
## cbind, rbind
##
##
## Skipping install of 'paqueteMET' from a github remote, the SHA1 (624823ee) has not changed since last install.
## Use `force = TRUE` to force installation
Dado que la variable tipo es de vital importancia para el desarrollo del análisis, se modifican las celdas para que todas cuenten con la misma composición de texto.
table(vivienda_faltantes$tipo)
##
## Apartamento APARTAMENTO apto casa Casa CASA
## 5032 61 13 14 3195 12
vivienda_faltantes<- mutate_if(vivienda_faltantes,is.character,toupper)
vivienda_faltantes$tipo<-ifelse(vivienda_faltantes$tipo=='CASA','CASA','APARTAMENTO')
table(vivienda_faltantes$tipo)
##
## APARTAMENTO CASA
## 5106 3221
Existen dos variables de interés que requieren de imputación, la variable piso que cuenta con 2641 datos faltantes y Parqueaderos, que cuenta con 1606 datos faltantes. La elección de un método de regresión para la imputación se considera inviable dado que arrojaría valores negativos e ilógicos, por tanto se elige el método de imputación de datos aleatorios que tiene en cuenta los datos disponibles de cada columna, para ello se utiliza la función “Sample”.
imputacion <- mice(vivienda_faltantes, method = "sample")
##
## iter imp variable
## 1 1 id piso estrato preciom areaconst parquea banios habitac longitud latitud
## 1 2 id piso estrato preciom areaconst parquea banios habitac longitud latitud
## 1 3 id piso estrato preciom areaconst parquea banios habitac longitud latitud
## 1 4 id piso estrato preciom areaconst parquea banios habitac longitud latitud
## 1 5 id piso estrato preciom areaconst parquea banios habitac longitud latitud
## 2 1 id piso estrato preciom areaconst parquea banios habitac longitud latitud
## 2 2 id piso estrato preciom areaconst parquea banios habitac longitud latitud
## 2 3 id piso estrato preciom areaconst parquea banios habitac longitud latitud
## 2 4 id piso estrato preciom areaconst parquea banios habitac longitud latitud
## 2 5 id piso estrato preciom areaconst parquea banios habitac longitud latitud
## 3 1 id piso estrato preciom areaconst parquea banios habitac longitud latitud
## 3 2 id piso estrato preciom areaconst parquea banios habitac longitud latitud
## 3 3 id piso estrato preciom areaconst parquea banios habitac longitud latitud
## 3 4 id piso estrato preciom areaconst parquea banios habitac longitud latitud
## 3 5 id piso estrato preciom areaconst parquea banios habitac longitud latitud
## 4 1 id piso estrato preciom areaconst parquea banios habitac longitud latitud
## 4 2 id piso estrato preciom areaconst parquea banios habitac longitud latitud
## 4 3 id piso estrato preciom areaconst parquea banios habitac longitud latitud
## 4 4 id piso estrato preciom areaconst parquea banios habitac longitud latitud
## 4 5 id piso estrato preciom areaconst parquea banios habitac longitud latitud
## 5 1 id piso estrato preciom areaconst parquea banios habitac longitud latitud
## 5 2 id piso estrato preciom areaconst parquea banios habitac longitud latitud
## 5 3 id piso estrato preciom areaconst parquea banios habitac longitud latitud
## 5 4 id piso estrato preciom areaconst parquea banios habitac longitud latitud
## 5 5 id piso estrato preciom areaconst parquea banios habitac longitud latitud
## Warning: Number of logged events: 3
datos_imputados <- complete(imputacion)
Se verifica que las medias, la distribución y los rangos no cambien de forma considerable entre la base original y la modificada en las dos variables con mayor número de datos faltantes. Esto con el fin que la imputación de datos no haya generado un sesgo y distancia de la base original. Los histogramas nos muestran que las distribuciones no varían de forma considerable y son similares. La imputación conserva la distribución original de las variables.
summary(vivienda_faltantes$piso)
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## 1.000 2.000 3.000 3.772 5.000 12.000 2641
summary(datos_imputados$piso)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1.000 2.000 3.000 3.794 5.000 12.000
summary(vivienda_faltantes$parquea)
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## 1.000 1.000 2.000 1.836 2.000 10.000 1606
summary(datos_imputados$parquea)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1.000 1.000 2.000 1.832 2.000 10.000
#Variable piso
data1 <- vivienda_faltantes$piso
data2 <- datos_imputados$piso
combined_data <- data.frame(
value = c(data1, data2),
group = factor(rep(c("Data1", "Data2")))
)
ggplot(combined_data, aes(x = value, fill = group)) +
geom_histogram(binwidth = 0.5, alpha = 0.7, position = "identity") +
labs(title = "Histograma pisos",
x = "Valor",
y = "Frecuencia") +
scale_fill_manual(values = c("Data1" = "blue", "Data2" = "yellow")) +
theme_minimal()
## Warning: Removed 2641 rows containing non-finite values (`stat_bin()`).
#Variable parqueadero
data1 <- vivienda_faltantes$parquea
data2 <- datos_imputados$parquea
combined_data <- data.frame(
value = c(data1, data2),
group = factor(rep(c("Data1", "Data2")))
)
ggplot(combined_data, aes(x = value, fill = group)) +
geom_histogram(binwidth = 0.5, alpha = 0.7, position = "identity") +
labs(title = "Histograma parqueaderos",
x = "Valor",
y = "Frecuencia") +
scale_fill_manual(values = c("Data1" = "blue", "Data2" = "red")) +
theme_minimal()
## Warning: Removed 1606 rows containing non-finite values (`stat_bin()`).
Para la corrección de outliers se utiliza el método de winsorización. Dicho método estadístico es utilizado para mitigar los efectos de los valores atípicos (outliers) en un conjunto de datos. En lugar de eliminar o transformar drásticamente los valores extremos, la winsorización reemplaza estos valores por valores cercanos a los límites del rango intercuartil (IQR) para reducir su impacto en los análisis y cálculos posteriores. El supuesto básico para la elección de variables a winsorizar es que se asume que no deberán existir casas con valores 0 o valores altos en las variables Baños, Parqueaderos y habitaciones.
Con el comparativo de cajas y bigotes se corrobora que el tratamiento de outliers modifica las variables extremas que de otro modo no tendrían lógica, puesto que es poco creíble que se pueda vender un apartamento con 0 baños, 0 habitaciones o 0 Parqueaderos.
boxplot(datos_imputados$parquea)
datos_imputados$parquea <- Winsorize(datos_imputados$parquea, probs = c(0.05, 0.95))
boxplot(datos_imputados$parquea)
boxplot(datos_imputados$banios)
datos_imputados$banios <- Winsorize(datos_imputados$banios, probs = c(0.05, 0.95))
boxplot(datos_imputados$banios)
boxplot(datos_imputados$habitac)
datos_imputados$habitac <- Winsorize(datos_imputados$habitac, probs = c(0.05, 0.95))
boxplot(datos_imputados$habitac)
Se crea estadística básica para las variable precio, las cual se considera la variable principal para el análisis. Dicha variable se encuentra sesgada a la izquierda, lo cual no se considera un comportamiento atípico si se toma en cuenta la ley 1955 de 2019. A partir del III trimestre de 2019 en los municipios donde aplica la ley 1955 de 2019 y el decreto 1467 de 2019, se indica que el precio máximo para la Vivienda de Interés social (VIS) es de 150 smmlv mientras que para la Vivienda de interés Prioritario (VIP) el valor maximo sera de 90 smmlv.
Dicho esto, el 2.34% de las viviendas son de interés prioritario y 15.16% viviendas de interés social. Alrededor del 80.92% de las viviendas son de 550 salarios mínimos o menos. Estas 1458 viviendas o el 17.5% del total cuentan con subsidios estatal y se podría esperar que su venta sea enfocada a clientes con ingresos bajos y medios.
plot(density(datos_imputados$preciom), lwd=3, col="#0d3b66",
main = "Distribucion precio de las viviendas",
xlab="Precio en millones",
ylab = "Densidad", las=1,
cex.lab=1, # tamaño de etiqueta ejes
cex.axis=.8, # tamaño escalas de los ejes
cex.main=1, # tamaño del titulo
cex.sub=1) # tamaño del subtitulo)
breaks= c(0,105,174,406, 464, 522, 638, 870, 2000)
# limites de intervalos
Fprecio=cut(datos_imputados$preciom , breaks)
summarytools::freq(Fprecio)
## Frequencies
## Fprecio
## Type: Factor
##
## Freq % Valid % Valid Cum. % Total % Total Cum.
## ----------------- ------ --------- -------------- --------- --------------
## (0,105] 195 2.34 2.34 2.34 2.34
## (105,174] 1264 15.17 17.52 15.17 17.52
## (174,406] 3755 45.08 62.59 45.08 62.59
## (406,464] 550 6.60 69.20 6.60 69.20
## (464,522] 387 4.65 73.84 4.65 73.84
## (522,638] 590 7.08 80.92 7.08 80.92
## (638,870] 768 9.22 90.14 9.22 90.14
## (870,2e+03] 821 9.86 100.00 9.86 100.00
## <NA> 0 0.00 100.00
## Total 8330 100.00 100.00 100.00 100.00
Los datos cuentan con una alta varianza y desviación estándar esperable, un coeficiente de variación de 75.8%, bastante alto indica que los datos tienen una alta dispersión en relación con su media. El coeficiente de curtosis es mayor que 3, por lo cual la distribución es mayo en las colas, concretamente en la izquierda, como ya se pudo observar en la gráfica y que confirma la curtosis.
var(datos_imputados$preciom) #Varianza
## [1] 108256.2
sd(datos_imputados$preciom) #desviación estandar
## [1] 329.0231
sd(datos_imputados$preciom)/mean(datos_imputados$preciom)*100 #coeficiente de variación
## [1] 75.76764
rapportools::kurtosis(datos_imputados$preciom) #coeficiente de curtosis
## [1] 3.656106
rapportools::skewness(datos_imputados$preciom) #coeficiente de asimetría
## [1] 1.846891
La Zona oriente cuenta con el menor valor por metro cuadrado, seguido por la zona centro. Las zonas con valores más altos por metro cuadrado son la zona norte y la zona oeste. Esto nos aporta datos importantes para la focalización de la estrategia de marketing, sobre todo en el segmento de apartamentos que son el tipo de viviendas con un valor por m2 más alto. 214 viviendas cuentan con un precio por metro cuadrado de hasta 1 millón de pesos, por su parte 2142 viviendas de 1 a 2 millones por m2 pueden ser focalizadas a los segmentos de ingresos bajos y medios bajos, mientras que los segmentos de 2 a 4 millones por m2 se pueden focalizar para los ingresos medios. medios altos y altos. Las viviendas por encima 4 millones por m2 pueden ser considerados como vivienda premium con un tipo de cliente de muy altos ingresos.
datos_imputados <- datos_imputados %>%
mutate(m2 = datos_imputados$preciom/datos_imputados$areaconst)
ggplot(datos_imputados, aes(y=m2 , x=tipo))+
geom_boxplot()+
facet_wrap(~ zona)
ggplot(datos_imputados, aes(y=m2 , x=tipo))+
geom_violin()+
facet_wrap(~ zona)
breaks2= c(0,1,2,3,4,5,6, 10, 20)
# limites de intervalos
Fprecio2=cut(datos_imputados$m2 , breaks2)
summarytools::freq(Fprecio2)
## Frequencies
## Fprecio2
## Type: Factor
##
## Freq % Valid % Valid Cum. % Total % Total Cum.
## ------------- ------ --------- -------------- --------- --------------
## (0,1] 215 2.581 2.581 2.581 2.581
## (1,2] 2141 25.702 28.283 25.702 28.283
## (2,3] 2954 35.462 63.745 35.462 63.745
## (3,4] 2030 24.370 88.115 24.370 88.115
## (4,5] 755 9.064 97.179 9.064 97.179
## (5,6] 170 2.041 99.220 2.041 99.220
## (6,10] 64 0.768 99.988 0.768 99.988
## (10,20] 1 0.012 100.000 0.012 100.000
## <NA> 0 0.000 100.000
## Total 8330 100.000 100.000 100.000 100.000
data=datos_imputados
t1=table(data$zona)
pie(t1)
Las casas cuentan con un valor total más alto con respecto a los apartamentos, sin embargo, los apartamentos cuentan con un valor mayor por m2.
Para todos los efectos la zona oeste debe ser tratada como una zona de oferta de viviendas para ingresos muy altos con promedios de apartamentos de 669 millones y de casas 736 millones. Dicha zona cuenta a su vez con el mayor número de baños, habitaciones, una mayor área y parqueaderos en promedio.
Las zonas centro y oriente pueden ser tratadas para efectos de marketing como de ingresos bajos y medios debido a que el promedio de los apartamentos tiene un valor de 186 millones y 152 millones, y las casas de 339 millones y 244 millones respectivamente. Con promedios similares en dotaciones de baños, habitaciones, parqueaderos y demás.
La zona sur, donde de centran la mayoría de las viviendas, cuenta con un valor promedio de apartamentos de 297 millones, lo que se puede considerar aplicable a ingresos medios. Y un valor promedio de casas de 612 millones, los cual es un valor aplicable a ingresos altos.
Se recomienda ampliar el análisis con una clusterización por barrios en estudios posteriores, lo que permitiría un despliegue de jornadas de marketing focalizadas.
tabla_promedio <- datos_imputados %>%
group_by(zona, tipo) %>%
summarise(Precio = mean(preciom),
Area= mean(areaconst), Habitacion = mean(habitac),
Baños = mean(banios),
Parqueaderos = mean(parquea),
Precio_por_m2 = mean(m2))
## `summarise()` has grouped output by 'zona'. You can override using the
## `.groups` argument.
Tabla <- kable(tabla_promedio, format = "markdown")
print(Tabla)
##
##
## |zona |tipo | Precio| Area| Habitacion| Baños| Parqueaderos| Precio_por_m2|
## |:------------|:-----------|--------:|---------:|----------:|--------:|------------:|-------------:|
## |ZONA CENTRO |APARTAMENTO | 186.5833| 95.07333| 3.000000| 2.125000| 1.500000| 1.949521|
## |ZONA CENTRO |CASA | 339.2400| 217.79500| 4.860000| 2.990000| 1.600000| 1.697014|
## |ZONA NORTE |APARTAMENTO | 285.2577| 98.70945| 2.922435| 2.312761| 1.488741| 2.810486|
## |ZONA NORTE |CASA | 446.0913| 264.89216| 4.432918| 3.510373| 1.932227| 1.846196|
## |ZONA OESTE |APARTAMENTO | 669.2676| 172.56413| 3.089855| 3.388406| 2.101449| 3.851723|
## |ZONA OESTE |CASA | 736.3550| 343.22698| 4.538462| 4.142012| 2.094675| 2.386436|
## |ZONA ORIENTE |APARTAMENTO | 152.5968| 94.24097| 3.080645| 1.741936| 1.532258| 1.695022|
## |ZONA ORIENTE |CASA | 244.8201| 213.37415| 5.013841| 2.920415| 1.539792| 1.388767|
## |ZONA SUR |APARTAMENTO | 297.3550| 97.48839| 2.978464| 2.489950| 1.458363| 2.988555|
## |ZONA SUR |CASA | 612.0077| 282.20148| 4.424742| 4.081443| 2.190206| 2.335353|
## |NA |NA | 433.3333| 138.00000| 3.000000| 3.333333| 1.333333| 4.537562|