Introducción
El presente documento constituye un reporte sobre la oferta o stock inmobiliario de la ciudad de Santiago de Cali a partir de datos consolidados por la agencia de bienes raíces Bienes y Casas (B&C), empresa a la que va dirigido el informe y que opera en la ciudad hace 10 años. Esto, teniendo en cuenta que el mercado inmobiliario muestra un crecimiento relevante en los últimos años y que, dado el crecimiento demográfico de las ciudades principales del país, se espera que siga creciendo en los próximos años.
Por lo anterior, reconociendo que es un sector atractivo a la inversión con dinámicas de competencia complejas por definición, la agencia B&C ha identificado la necesidad de aplicar metodologías para analizar las tendencias del mercado inmobiliario que lleven a tomar mejores decisiones en el ámbito operativo y de negocios con el fin de resaltar y consolidarse en el ecosistema de dicha actividad económica al dar más y mejores respuestas a la demanda.
En este sentido, se plantea un análisis estadístico del stock inmobiliario a partir de variables relativas a las condiciones propias de los inmuebles, como precios, área construida, zona, estrato y tipo de vivienda, entre otros. Así, es importante entender que este análisis implica un punto de partida que debe ser complementado con el entendimiento a detalle de las dinámicas barriales de cada inmueble, comprendiendo problemáticas y ventajas frente a condiciones de seguridad, acceso a espacio público, accesibilidad del transporte público y privado, cercanía a equipamientos y nodos comerciales, laborales y de negocios, los cuales se abordan general e indirectamente a partir de la identificación de la zona en la que se encuentra cada inmueble, cuya escala de análisis no permite una comprensión integral de la expresión de estas dinámicas en el entorno inmediato de cada inmueble.
I. Objetivos
El reporte tiene como principales objetivos:
Objetivo General:
• Construir información que promueva la mejora en la eficiencia y efectividad de la toma de decisiones operativas, comerciales y de inversión en la agencia de bienes raíces B&C.
Objetivos específicos:
• Identificar las tipologías y características de las viviendas más ofertadas y más demandadas (teniendo el precio como un criterio preliminar, es decir, se entiende que las viviendas más costosas son las más preferidas por el mercado, siendo el poder adquisitivo lo que condiciona el acceso a las mismas).
• Adelantar una caracterizar del comportamiento del stock inmobiliario para su segmentación en función de los distintos nichos de mercado de la población de Santiago de Cali.
2. Metodología
El ejercicio se adelanta cimentado en un análisis estadístico descriptivo a partir del uso de las herramientas R y RStudio, tanto para la limpieza de los datos como su procesamiento y visualización. En este sentido, se identificarán características del stock inmobiliario teniendo la identificación de distribuciones de frecuencias, medidas de tendencia central y medidas de variabilidad, como las principales herramientas para la construcción de la información solicitada por la agencia.
Así mismo, el eje estructurante del análisis será el estrato de las viviendas, en tanto constituye una de las variables que más pistas da frente a la predilección de los bienes y su asequibilidad, al grado de dar indicios frente a la estructura socio-espacial que toman las ciudades y los bienes y servicios que se ofrece en cada zona.
## Skipping install of 'paqueteMETODOS' from a github remote, the SHA1 (341036c5) has not changed since last install.
## Use `force = TRUE` to force installation
## Loading required package: cubature
## Loading required package: dplyr
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
## Loading required package: flextable
## Loading required package: ggplot2
## Loading required package: lmtest
## Loading required package: zoo
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
## Loading required package: MASS
##
## Attaching package: 'MASS'
## The following object is masked from 'package:dplyr':
##
## select
## Loading required package: psych
##
## Attaching package: 'psych'
## The following objects are masked from 'package:ggplot2':
##
## %+%, alpha
## Loading required package: summarytools
## Loading required package: randtests
## Loading required package: rapportools
##
## Attaching package: 'rapportools'
## The following objects are masked from 'package:summarytools':
##
## label, label<-
## The following object is masked from 'package:dplyr':
##
## n
## The following objects are masked from 'package:stats':
##
## IQR, median, sd, var
## The following objects are masked from 'package:base':
##
## max, mean, min, range, sum
##
## Attaching package: 'patchwork'
## The following object is masked from 'package:MASS':
##
## area
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats 1.0.0 ✔ readr 2.1.5
## ✔ lubridate 1.9.3 ✔ stringr 1.5.1
## ✔ purrr 1.0.2 ✔ tibble 3.2.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ psych::%+%() masks ggplot2::%+%()
## ✖ psych::alpha() masks ggplot2::alpha()
## ✖ purrr::compose() masks flextable::compose()
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ✖ rapportools::n() masks dplyr::n()
## ✖ MASS::select() masks dplyr::select()
## ✖ tibble::view() masks summarytools::view()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
# 1. Limpieza de datos
# 1.1. Limpieza de barrios
conteo_barrios<-count(vf, barrio)
vf$barrio <- tolower(vf$barrio)
vf <- vf %>%
mutate(barrio=ifelse(barrio=="ciudad jardin", "ciudad jardín", barrio)) %>%
mutate(barrio=ifelse(barrio=="ciudad cordoba", "ciudad córdoba", barrio)) %>%
mutate(barrio=ifelse(barrio=="agua blanca", "aguablanca", barrio)) %>%
mutate(barrio=ifelse(barrio=="alameda del rio", "alameda del río", barrio)) %>%
mutate(barrio=ifelse(barrio=="alférez real", "alferez real", barrio)) %>%
mutate(barrio=ifelse(barrio=="alfonso lopez", "alfonso lópez", barrio)) %>%
mutate(barrio=ifelse(barrio=="alfonso lópez i", "alfonso lópez", barrio)) %>%
mutate(barrio=ifelse(barrio=="altos de santa", "altos de santa elena", barrio)) %>%
mutate(barrio=ifelse(barrio=="arboleda campestre candelaria", "arboleda campestre", barrio)) %>%
mutate(barrio=ifelse(barrio=="barrio 7de agosto", "siete de agosto", barrio)) %>%
mutate(barrio=ifelse(barrio=="barrio tranquilo y", "barrio tranquilo", barrio)) %>%
mutate(barrio=ifelse(barrio=="base a√©rea", "base aérea", barrio)) %>%
mutate(barrio=ifelse(barrio=="belalcazar", "belalcázar", barrio)) %>%
mutate(barrio=ifelse(barrio=="brisas de los", "brisas de los alamos", barrio)) %>%
mutate(barrio=ifelse(barrio=="ciudad meléndez", "ciudad melendez", barrio)) %>%
mutate(barrio=ifelse(barrio=="ciudadela paso ancho", "ciudadela pasoancho", barrio)) %>%
mutate(barrio=ifelse(barrio=="cristobal colón", "cristóbal colón", barrio)) %>%
mutate(barrio=ifelse(barrio=="el ingenio 3", "el ingenio iii", barrio)) %>%
mutate(barrio=ifelse(barrio=="el tr√©bol", "el trébol", barrio)) %>%
mutate(barrio=ifelse(barrio=="fuentes de la", "fuentes de la bocha", barrio)) %>%
mutate(barrio=ifelse(barrio=="hacienda alferez real", "alferez real", barrio)) %>%
mutate(barrio=ifelse(barrio=="ingenio", "el ingenio i", barrio)) %>%
mutate(barrio=ifelse(barrio=="ingenio ii", "el ingenio ii", barrio)) %>%
mutate(barrio=ifelse(barrio=="juanamb√∫", "juanambu", barrio)) %>%
mutate(barrio=ifelse(barrio=="junin", "junín", barrio)) %>%
mutate(barrio=ifelse(barrio=="la portada al", "portada al mar", barrio)) %>%
mutate(barrio=ifelse(barrio=="la riviera", "la rivera", barrio)) %>%
mutate(barrio=ifelse(barrio=="laflora", "la flora", barrio)) %>%
mutate(barrio=ifelse(barrio=="las am√©ricas", "las américas", barrio)) %>%
mutate(barrio=ifelse(barrio=="las vegas de", "las vegas", barrio)) %>%
mutate(barrio=ifelse(barrio=="los alcazares", "los alcázares", barrio)) %>%
mutate(barrio=ifelse(barrio=="los cambulos", "los cámbulos", barrio)) %>%
mutate(barrio=ifelse(barrio=="los libertadores", "libertadores", barrio)) %>%
mutate(barrio=ifelse(barrio=="los cambulos", "los cámbulos", barrio)) %>%
mutate(barrio=ifelse(barrio=="meléndez", "melendez", barrio)) %>%
mutate(barrio=ifelse(barrio=="normandia", "normandía", barrio)) %>%
mutate(barrio=ifelse(barrio=="normandía west point", "normandía", barrio)) %>%
mutate(barrio=ifelse(barrio=="norte la flora", "la flora", barrio)) %>%
mutate(barrio=ifelse(barrio=="pacara", "pacará", barrio)) %>%
mutate(barrio=ifelse(barrio=="pampa linda", "pampalinda", barrio)) %>%
mutate(barrio=ifelse(barrio=="paseo de los", "paseo de los almendros", barrio)) %>%
mutate(barrio=ifelse(barrio=="quintas de don", "quintas de don simón", barrio)) %>%
mutate(barrio=ifelse(barrio=="rep√∫blica de israel", "república de israel", barrio)) %>%
mutate(barrio=ifelse(barrio=="refugio", "el refugio", barrio)) %>%
mutate(barrio=ifelse(barrio=="san joaquin", "san joaquín", barrio)) %>%
mutate(barrio=ifelse(barrio=="santa monica", "santa mónica", barrio)) %>%
mutate(barrio=ifelse(barrio=="santa monica residencial", "santa mónica residencial", barrio)) %>%
mutate(barrio=ifelse(barrio=="tejares de san", "tejares de san fernando", barrio)) %>%
mutate(barrio=ifelse(barrio=="tequendema", "tequendama", barrio)) %>%
mutate(barrio=ifelse(barrio=="cali canto", "calicanto", barrio)) %>%
mutate(barrio=ifelse(barrio=="valle de lili", "valle del lili", barrio))#1.2. Limpieza de tipo
#1.2.1. Estandarización de los nombres de categorias
vf$tipo <- tolower(vf$tipo)
cat_tipos<-count(vf, tipo)
vf <- vf %>%
mutate(tipo=ifelse(tipo=="apto", "apartamento", tipo))
cat_tipos<-count(vf, tipo)
#1.2.2. Eliminación de datos faltantes, ya que el tipo de vivienda es fundamental para el análisis y no puede instuir de las demás variables
vf<-vf %>% drop_na("tipo")
cat_tipos<-count(vf, tipo)#1.3. Creación de variable de precio por metro cuadrado, como una de las principales unidades de análisis del reporte
vf$precio_metro2m<-(vf$preciom/vf$areaconst)
vf$precio_metro2m<-format(round(vf$precio_metro2m, 2), nsmall = 3)
vf$precio_metro2m<-as.numeric(vf$precio_metro2m)# 1.4. Limpieza de coordenadas
vf$latitud <- as.numeric(vf$latitud)
vf$longitud <- as.numeric(vf$longitud)
vf <- vf %>%
mutate(latitud=ifelse(latitud>5,(vf$latitud/1000), latitud)) %>%
mutate(longitud=ifelse(longitud< -80, (vf$longitud/1000),longitud))
vf$longitud<-format(vf$longitud, decimal.mark = '.')
vf$latitud<-format(vf$latitud, decimal.mark = '.')A partir de la consolidación de una base de datos depurada, se presenta el análisis del mercado inmobiliario en Cali según las características ofrecidas por dicha base de datos.
Así, como primer aspecto, se plantean deducciones a partir de las características generales de la muestra en su totalidad.
resumen_muestra<-psych::describe(vf)
tabla_resumen<-matrix(c(resumen_muestra[6,3],resumen_muestra[6,4],
resumen_muestra[6,8],resumen_muestra[6,9],
resumen_muestra[6,11],resumen_muestra[6,12],
resumen_muestra[5,3],resumen_muestra[5,4],
resumen_muestra[5,8],resumen_muestra[5,9],
resumen_muestra[5,11],resumen_muestra[5,12],
resumen_muestra[14,3],resumen_muestra[14,4],
resumen_muestra[14,8],resumen_muestra[14,9],
resumen_muestra[14,11],resumen_muestra[14,12]),
ncol=6, byrow=TRUE)
tabla_resumen<-as.data.frame (tabla_resumen)
colnames(tabla_resumen) = c("Media","Desviación estándar", "Valor mínimo",
"Valor máximo", "Sesgo (Skewness)", "Curtosis")
rownames(tabla_resumen) <- c('Área','Precio','Precio por metro cuadrado')
tabla_resumen<-format(round(tabla_resumen, 2), nsmall = 2)
tabla_resumen1. Análisis de toda la muestra
Análisis de precios
A partir de la observación del sesgo (1.84) y Curtosis (3.9) se concluye que se trata de muestras en las que gran parte de los datos se acercan a la media, con una minoría de bienes con precios altos, de manera que, mientras el promedio de los precios es de 434.3 millones de pesos, el valor máximo alcanza casi los 2000 millones de pesos. Así mismo, se resalta la baja homogeneidad de la muestra en términos de precios, donde se denota una desviación estándar bastante alta.
vf %>% ggplot(aes(x=preciom))+
geom_histogram(color="black", fill="#43766C", bins=20) +
geom_vline(xintercept = mean(vf$preciom),
col = "#B19470",
lwd = 1) +
labs(x="Precio del inmueble")+
annotate("text",
x = mean(vf$preciom)*1.5,
y = mean(vf$preciom)*7,
label = paste("Media =", round(mean(vf$preciom), 1)),
col = "#B19470",
size = 3)+
geom_vline(xintercept = median(vf$preciom),
col = "#76453B",
lwd = 1) +
annotate("text",
x = median(vf$preciom)*0.4,
y = median(vf$preciom)*7,
label = paste("Mediana =", median(vf$preciom)),
col = "#76453B",
size = 3)Análisis de área
No obstante, el área es una de las variables donde mayores brechas se encuentran, mostrando un sesgo de 2.7 y una variable curtosis de 12.9. Es decir, si bien la mayoría de datos gravitan cerca a la media (175 metros cuadrados), se encuentran datos extremos en los que se superan los 1000 metros cuadrados, los cuales pueden darse de manera transversal en varios estratos, a diferencia de los precios. Es decir, un inmueble con una gran área construida en un estrato menor podría tener un costo similar a bienes mucho más pequeños en estratos altos.
vf %>% ggplot(aes(x=preciom))+
geom_histogram(color="black", fill="#43766C", bins=20) +
geom_vline(xintercept = mean(vf$areaconst),
col = "#B19470",
lwd = 1) +
labs(x="Área del inmueble")+
annotate("text",
x = mean(vf$areaconst)*2,
y = mean(vf$areaconst)*11,
label = paste("Media =", round(mean(vf$areaconst), 1)),
col = "#B19470",
size = 3)+
geom_vline(xintercept = median(vf$areaconst),
col = "#76453B",
lwd = 1) +
annotate("text",
x = median(vf$areaconst)*5,
y = median(vf$areaconst)*13,
label = paste("Mediana =", median(vf$areaconst)),
col = "#76453B",
size = 3)Análisis de precio por metro cuadrado
Al analizar la muestra en términos de precio por metro cuadrado, se observa un comportamiento más tendiente a una distribución normal, mostrando valores positivos menores a 1 tanto en el sesgo (0.7) como la variable curtosis (0.8), ya que esta variable logra plantear una relación que pone en proporción los precios con las áreas de los inmuebles. En promedio, el metro cuadrado de la muestra se comercializa en 2.7 millones de pesos.
vf %>% ggplot(aes(x=precio_metro2m))+
geom_histogram(color="black", fill="#43766C", bins=20) +
geom_vline(xintercept = mean(vf$precio_metro2m),
col = "#B19470",
lwd = 1) +
labs(x="Precio por metro cuadrado")+
annotate("text",
x = mean(vf$precio_metro2m)*1.5,
y = mean(vf$precio_metro2m)*540,
label = paste("Media =", round(mean(vf$precio_metro2m), 1)),
col = "#B19470",
size = 3)+
geom_vline(xintercept = median(vf$precio_metro2m),
col = "#76453B",
lwd = 1) +
annotate("text",
x = median(vf$precio_metro2m)*0.5,
y = median(vf$precio_metro2m)*550,
label = paste("Mediana =", median(vf$precio_metro2m)),
col = "#76453B",
size = 3)2. Análisis por estrato
Como se puede observar, al plantear el análisis por estratos, se logra observar en cada uno de ellos una homogeneidad mucho mayor a la de la muestra total.
En este sentido, a excepción del estrato 6, todas las desviaciones estándar se encuentran por debajo de uno. Esto puede explicarse en la medida que el estrato 6, al ser el techo, puede tener valores mucho más extremos frente al promedio del precio por metro cuadrado de los inmuebles de dicho estrato.
Por otro lado, se resalta que, si bien no ocurre de manera tan extrema como en la muestra total, los estratos revelan un comportamiento similar a la misma en la medida que los datos gravitan cerca a la media. Esto, a excepción, una vez más, del estrato 6, grupo que presenta valores más dispersos. Al observar los datos del estrato 3, se puede intuir que esto responde a dinámicas propias al sistema de estratificación de la ciudad, de manera que la localización del inmueble puede valorizarlo de manera considerable, sin afectar su estrato.
desviaciones_estrato<-aggregate(vf$precio_metro2m, by=list(vf$estrato), FUN=sd)
kurtosis_estrato<-aggregate(vf$precio_metro2m, by=list(vf$estrato), FUN=kurtosis)
sesgo_estrato<-aggregate(vf$precio_metro2m, by=list(vf$estrato), FUN=skewness)
medias_estrato<-aggregate(vf$precio_metro2m, by=list(vf$estrato), FUN=mean)
resumen_distri_estr<-matrix(c(desviaciones_estrato[1,2], desviaciones_estrato[2,2], desviaciones_estrato[3,2],
desviaciones_estrato[4,2], kurtosis_estrato[1,2],
kurtosis_estrato[2,2], kurtosis_estrato[3,2],
kurtosis_estrato[4,2], sesgo_estrato[1,2],
sesgo_estrato[2,2], sesgo_estrato[3,2],
sesgo_estrato[4,2], medias_estrato[1,2],
medias_estrato[2,2], medias_estrato[3,2],medias_estrato[4,2]),
ncol=4, byrow=FALSE)
resumen_distri_estr<-as.data.frame (resumen_distri_estr)
colnames(resumen_distri_estr) = c("Desviación estándar", "Curstosis", "Sesgo",
"Media")
rownames(resumen_distri_estr) <- c("Estrato 3","Estrato 4","Estrato 5",
"Estrato 6")
resumen_distri_estr %>% mutate(across(where(is.numeric), round, digits=1))## Warning: There was 1 warning in `mutate()`.
## ℹ In argument: `across(where(is.numeric), round, digits = 1)`.
## Caused by warning:
## ! The `...` argument of `across()` is deprecated as of dplyr 1.1.0.
## Supply arguments directly to `.fns` through an anonymous function instead.
##
## # Previously
## across(a:b, mean, na.rm = TRUE)
##
## # Now
## across(a:b, \(x) mean(x, na.rm = TRUE))
Así mismo, al analizar las distribuciones de precio por metro cuadrado de cada estrato, se observan comportamientos similares entre ellos, a excepción del estrato 6, donde los datos muestran mayor dispersión por razones ya expuestas.
histogramas_preciom2 <- function (x){subset(vf, estrato == "x")
return(as.data.frame(subset(vf, estrato == x)) %>%
ggplot(aes(x=precio_metro2m))+
geom_density(color="black", fill="#43766C")+
labs(x="Precio por metro cuadrado")+
ggtitle(paste0("Estrato ", x)) +
theme(plot.title = element_text(hjust = 0.5)))
}
(histogramas_preciom2(3)|histogramas_preciom2(4))/(histogramas_preciom2(5)|histogramas_preciom2(6))histogramas_precio <- function (x){subset(vf, estrato == "x")
return(as.data.frame(subset(vf, estrato == x)) %>%
ggplot(aes(x=preciom))+
geom_density(color="black", fill="#43766C")+
labs(x="Precio del bien")+
ggtitle(paste0("Estrato ", x)) +
theme(plot.title = element_text(hjust = 0.5)))
}
(histogramas_precio(3)|histogramas_precio(4))/(histogramas_precio(5)|histogramas_precio(6))histogramas_area<-function (x){subset(vf, estrato == "x")
return(as.data.frame(subset(vf, estrato == x)) %>%
ggplot(aes(x=areaconst))+
geom_density(color="black", fill="#43766C")+
labs(x="Area construida")+
ggtitle(paste0("Estrato ", x)) +
theme(plot.title = element_text(hjust = 0.5)))
}
(histogramas_area(3)|histogramas_area(4))/(histogramas_area(5)|histogramas_area(6))Esto, pensando en el mercado inmobiliario, denota que los compradores de estratos 5 y 6 tienen un mayor rango de decisión en términos de las distintas opciones que hay en precios y áreas. Por su parte, en general y para cada estrato, se observa concentración de valores hacia la media, lo que permite un identificación de bienes disponibles según el presupuesto y área que busca el comprador, planteando la necesidad de poner en marcha estrategias de marketing especiales para la promoción de bienes inmuebles ubicados en los extremos derechos de las gráficas.
Lo anterior teniendo en cuenta que los promedios para estos tres componentes, por estrato, son:
medias_areas<-aggregate(vf$areaconst, by=list(vf$estrato), FUN=mean)
medias_precios<-aggregate(vf$preciom, by=list(vf$estrato), FUN=mean)
medias_precios_m2<-aggregate(vf$precio_metro2m, by=list(vf$estrato), FUN=mean)
resumen_medias<-matrix(cbind((medias_areas$x),(medias_precios$x), (medias_precios_m2$x)),ncol = 3, byrow=FALSE)
resumen_medias<-as.data.frame(resumen_medias)
colnames(resumen_medias) = c("Media de área", "Media de precios",
"Media de precio por metro cuadrado")
rownames(resumen_medias) <- c("Estrato 3","Estrato 4","Estrato 5",
"Estrato 6")
resumen_medias %>% mutate(across(where(is.numeric), round, digits=1))En cuanto al tipo de vivienda que más se comercializa actualmente en Cali, se encuentra que de las 8327 viviendas que conforman la muestra estudiada, 5106 (61.3%) son apartamentos y 3221 (38.7%) son casas. De esta forma, en cada estrato muestran un comportamiento similar, en términos de proporciones, a excepción del estrato 3, donde la mayoría de viviendas registradas son casas.
vf %>% ggplot(aes(estrato, group = tipo, fill=tipo))+
geom_bar(position = position_dodge())+
xlab("Cantidad de inmuebles por estrato")+
scale_fill_manual(values=c("#43766C", "#B19470"))En este sentido, las cantidades concretas de cada tipo de inmueble en función del estrato son:
resumen_tipos<-matrix(c(count(subset(vf, estrato=="3"),tipo)[1,2],
count(subset(vf, estrato=="3"),tipo)[2,2],
count(subset(vf, estrato=="4"),tipo)[1,2],
count(subset(vf, estrato=="4"),tipo)[2,2],
count(subset(vf, estrato=="5"),tipo)[1,2],
count(subset(vf, estrato=="5"),tipo)[2,2],
count(subset(vf, estrato=="6"),tipo)[1,2],
count(subset(vf, estrato=="6"),tipo)[2,2]),
ncol=4, byrow=FALSE)
colnames(resumen_tipos) = c("Estrato 3","Estrato 4","Estrato 5",
"Estrato 6")
rownames(resumen_tipos) <- c("Apartamentos","Casas")
print(resumen_tipos)## Estrato 3 Estrato 4 Estrato 5 Estrato 6
## Apartamentos 639 1404 1767 1296
## Casas 814 727 984 696
En cuanto al análisis por estrato de cada tipo de inmueble, se encuentra que, repitiendo el patrón de muestras más generales (por estrato completo y la muestra completa), a excepción del estrato 5, las casas tienden a tener valores más altos en para curtosis y sesgo, lo que quiere decir que los precios por metro cuadrado para los apartamentos, tienden a ser más dispersos en relación a la media. Esto, en consecuencia, puede denotar que el mercado de casas tiende a ser más rígido en cuanto a las opciones de inmuebles en cuanto al precio por metro cuadrado. Lo anterior, sin embargo, entendiendo que los apartamentos tienen un precio por metro cuadrado más elevado que las casas en todos los estratos:
media_estrato<-aggregate(vf$precio_metro2m,by=list(vf$estrato,vf$tipo),
FUN=mean)
dv_estrato<-aggregate(vf$precio_metro2m,by=list(vf$estrato,vf$tipo),
FUN=sd)
kurtosis_estrato<-aggregate(vf$precio_metro2m,by=list(vf$estrato,vf$tipo),
FUN=kurtosis)
sesgo_estrato<-aggregate(vf$precio_metro2m,by=list(vf$estrato,vf$tipo),
FUN=skewness)
datos_tipo_estrato<-matrix(c(dv_estrato[1,3], dv_estrato[5,3], dv_estrato[2,3],
dv_estrato[6,3],dv_estrato[3,3], dv_estrato[7,3],
dv_estrato[4,3],dv_estrato[8,3],
kurtosis_estrato[1,3],kurtosis_estrato[5,3],
kurtosis_estrato[2,3], kurtosis_estrato[6,3],
kurtosis_estrato[3,3], kurtosis_estrato[7,3],
kurtosis_estrato[4,3], kurtosis_estrato[8,3],
sesgo_estrato[1,3], sesgo_estrato[5,3],
sesgo_estrato[2,3], sesgo_estrato[6,3],
sesgo_estrato[3,3], sesgo_estrato[7,3],
sesgo_estrato[4,3], sesgo_estrato[8,3],
media_estrato[1,3], media_estrato[5,3],
media_estrato[2,3], media_estrato[6,3],
media_estrato[3,3], media_estrato[7,3],
media_estrato[4,3],media_estrato[8,3]),
ncol=4, byrow=FALSE)
datos_tipo_estrato<-as.data.frame (datos_tipo_estrato)
colnames(datos_tipo_estrato) = c("Desviación estándar", "Curstosis", "Sesgo",
"Media")
rownames(datos_tipo_estrato) <- c("Apartamentos E. 3","Casas E. 3",
"Apartamentos E. 4","Casas E. 4",
"Apartamentos E. 5","Casas E. 5",
"Apartamentos E. 6","Casas E. 6")
datos_tipo_estrato %>% mutate(across(where(is.numeric), round, digits=2))Por otro lado, al analizar las áreas que se ofrecen en cada estrato y en cada tipo, se encuentra que, en promedio, las casas tienden a ser entre 2 y 3 veces más grandes que los apartamentos del mismo estrato. Muestran, además, mayor dispersión al tener una curtosis más baja que los apartamentos, a excepción del estrato 6, probablemente debido a que, en general, la oferta de casas en este estrato tiende a responder a grandes extensiones de área contruida y es más díficil encontrar valores extremos (entendiendo que la media ya son casi 400 metros cuadrados). Es decir, en este estrato existe poca oferta de casas pequeñas o de casas demasiado grandes (que ya podrían considerarse mansiones)
media_area <-aggregate(vf$areaconst,by=list(vf$estrato,vf$tipo),
FUN=mean)
dv_area <-aggregate(vf$areaconst,by=list(vf$estrato,vf$tipo),
FUN=sd)
kurtosis_area <-aggregate(vf$areaconst,by=list(vf$estrato,vf$tipo),
FUN=kurtosis)
sesgo_area<-aggregate(vf$areaconst,by=list(vf$estrato,vf$tipo),
FUN=skewness)
datos_tipo_area<-matrix(c(dv_area[1,3], dv_area[5,3], dv_area[2,3],
dv_area[6,3],dv_area[3,3], dv_area[7,3],
dv_area[4,3],dv_area[8,3],
kurtosis_area[1,3],kurtosis_area[5,3],
kurtosis_area[2,3], kurtosis_area[6,3],
kurtosis_area[3,3], kurtosis_area[7,3],
kurtosis_area[4,3], kurtosis_area[8,3],
sesgo_area[1,3], sesgo_area[5,3],
sesgo_area[2,3], sesgo_area[6,3],
sesgo_area[3,3], sesgo_area[7,3],
sesgo_area[4,3], sesgo_area[8,3],
media_area[1,3], media_area[5,3],
media_area[2,3], media_area[6,3],
media_area[3,3], media_area[7,3],
media_area[4,3],media_area[8,3]),
ncol=4, byrow=FALSE)
datos_tipo_area <-as.data.frame (datos_tipo_area)
colnames(datos_tipo_area) = c("Desviación estándar", "Curstosis", "Sesgo",
"Media")
rownames(datos_tipo_area) <- c("Apartamentos E. 3","Casas E. 3",
"Apartamentos E. 4","Casas E. 4",
"Apartamentos E. 5","Casas E. 5",
"Apartamentos E. 6","Casas E. 6")
datos_tipo_area %>% mutate(across(where(is.numeric), round, digits=2))Cuando se analiza la variación estándar de cada cuantil de estrato, se encuentra que, en general, se presenta una mayor homogeneidad, ya que se segmenta en mayor medida el mercado, haciendo hincapié en el hecho de que los cuantiles 2 y 3 de todos los estratos son los más homogéneos. Esto puede ocurrir porque los valores de los otros dos cuantiles tenderán a solaparse por la presencia de valores extremos, en ambas direcciones:
#Análisis por cuantiles
#cuantiles 1 de cada estrato
cuantil1_e3<-(subset(subset(vf,estrato==3),
subset(vf,estrato==3)$precio_metro2m<=(as.numeric(quantile(subset(vf,
estrato==3)$precio_metro2m, probs=c(0.25))))))
cuantil1_e4<-(subset(subset(vf,estrato==4),
subset(vf,estrato==4)$precio_metro2m<=(as.numeric(quantile(subset(vf,
estrato==4)$precio_metro2m, probs=c(0.25))))))
cuantil1_e5<-(subset(subset(vf,estrato==5),
subset(vf,estrato==5)$precio_metro2m<=(as.numeric(quantile(subset(vf,
estrato==5)$precio_metro2m, probs=c(0.25))))))
cuantil1_e6<-(subset(subset(vf,estrato==6),
subset(vf,estrato==6)$precio_metro2m<=(as.numeric(quantile(subset(vf,
estrato==6)$precio_metro2m, probs=c(0.25))))))
#Cuantiles 2 de cada estrato
cuantil2_e3<-(subset(subset(vf, estrato==3),
subset(vf,estrato==3)$precio_metro2m<=(as.numeric(quantile(subset(vf,
estrato==3)$precio_metro2m, probs=c(0.50)))) & subset(vf,
estrato==3)$precio_metro2m>(as.numeric(quantile(subset(vf,
estrato==3)$precio_metro2m, probs=c(0.25))))))
cuantil2_e4<-(subset(subset(vf, estrato==4),
subset(vf,estrato==4)$precio_metro2m<=(as.numeric(quantile(subset(vf,
estrato==4)$precio_metro2m, probs=c(0.50)))) & subset(vf,
estrato==4)$precio_metro2m>(as.numeric(quantile(subset(vf,
estrato==4)$precio_metro2m, probs=c(0.25))))))
cuantil2_e5<-(subset(subset(vf, estrato==5),
subset(vf,estrato==5)$precio_metro2m<=(as.numeric(quantile(subset(vf,
estrato==5)$precio_metro2m, probs=c(0.50)))) & subset(vf,
estrato==5)$precio_metro2m>(as.numeric(quantile(subset(vf,
estrato==5)$precio_metro2m, probs=c(0.25))))))
cuantil2_e6<-(subset(subset(vf, estrato==6),
subset(vf,estrato==6)$precio_metro2m<=(as.numeric(quantile(subset(vf,
estrato==6)$precio_metro2m, probs=c(0.50)))) & subset(vf,
estrato==6)$precio_metro2m>(as.numeric(quantile(subset(vf,
estrato==5)$precio_metro2m, probs=c(0.25))))))
# Cuantiles 3 de cada estrato
cuantil3_e3<-(subset(subset(vf, estrato==3), subset(vf,
estrato==3)$precio_metro2m<=(as.numeric(quantile(subset(vf,
estrato==3)$precio_metro2m, probs=c(0.75)))) & subset(vf,
estrato==3)$precio_metro2m>(as.numeric(quantile(subset(vf,
estrato==3)$precio_metro2m, probs=c(0.50))))))
cuantil3_e4<-(subset(subset(vf, estrato==4), subset(vf,
estrato==4)$precio_metro2m<=(as.numeric(quantile(subset(vf,
estrato==4)$precio_metro2m, probs=c(0.75)))) & subset(vf,
estrato==4)$precio_metro2m>(as.numeric(quantile(subset(vf,
estrato==4)$precio_metro2m, probs=c(0.50))))))
cuantil3_e5<-(subset(subset(vf, estrato==5), subset(vf,
estrato==5)$precio_metro2m<=(as.numeric(quantile(subset(vf,
estrato==5)$precio_metro2m, probs=c(0.75)))) & subset(vf,
estrato==5)$precio_metro2m>(as.numeric(quantile(subset(vf,
estrato==5)$precio_metro2m, probs=c(0.50))))))
cuantil3_e6<-(subset(subset(vf, estrato==6), subset(vf,
estrato==6)$precio_metro2m<=(as.numeric(quantile(subset(vf,
estrato==6)$precio_metro2m, probs=c(0.75)))) & subset(vf,
estrato==6)$precio_metro2m>(as.numeric(quantile(subset(vf,
estrato==6)$precio_metro2m, probs=c(0.50))))))
#Cuantiles 4 de cada estato
cuantil4_e3<-(subset(subset(vf,estrato==3),
subset(vf,estrato==3)$precio_metro2m>(as.numeric(quantile(subset(vf,
estrato==3)$precio_metro2m, probs=c(0.75))))))
cuantil4_e4<-(subset(subset(vf,estrato==4),
subset(vf,estrato==4)$precio_metro2m>(as.numeric(quantile(subset(vf,
estrato==4)$precio_metro2m, probs=c(0.75))))))
cuantil4_e5<-(subset(subset(vf,estrato==5),
subset(vf,estrato==5)$precio_metro2m>(as.numeric(quantile(subset(vf,
estrato==5)$precio_metro2m, probs=c(0.75))))))
cuantil4_e6<-(subset(subset(vf,estrato==6),
subset(vf,estrato==6)$precio_metro2m>(as.numeric(quantile(subset(vf,
estrato==6)$precio_metro2m, probs=c(0.75))))))
promedio_c1_e3<-mean(cuantil1_e3$precio_metro2m)
promedio_c2_e3<-mean(cuantil2_e3$precio_metro2m)
promedio_c3_e3<-mean(cuantil3_e3$precio_metro2m)
promedio_c4_e3<-mean(cuantil4_e3$precio_metro2m)
promedio_c1_e4<-mean(cuantil1_e4$precio_metro2m)
promedio_c2_e4<-mean(cuantil2_e4$precio_metro2m)
promedio_c3_e4<-mean(cuantil3_e4$precio_metro2m)
promedio_c4_e4<-mean(cuantil4_e4$precio_metro2m)
promedio_c1_e5<-mean(cuantil1_e5$precio_metro2m)
promedio_c2_e5<-mean(cuantil2_e5$precio_metro2m)
promedio_c3_e5<-mean(cuantil3_e5$precio_metro2m)
promedio_c4_e5<-mean(cuantil4_e5$precio_metro2m)
promedio_c1_e6<-mean(cuantil1_e6$precio_metro2m)
promedio_c2_e6<-mean(cuantil2_e6$precio_metro2m)
promedio_c3_e6<-mean(cuantil3_e6$precio_metro2m)
promedio_c4_e6<-mean(cuantil4_e6$precio_metro2m)
sd_c1_e3<-sd(cuantil1_e3$precio_metro2m)
sd_c2_e3<-sd(cuantil2_e3$precio_metro2m)
sd_c3_e3<-sd(cuantil3_e3$precio_metro2m)
sd_c4_e3<-sd(cuantil4_e3$precio_metro2m)
sd_c1_e4<-sd(cuantil1_e4$precio_metro2m)
sd_c2_e4<-sd(cuantil2_e4$precio_metro2m)
sd_c3_e4<-sd(cuantil3_e4$precio_metro2m)
sd_c4_e4<-sd(cuantil4_e4$precio_metro2m)
sd_c1_e5<-sd(cuantil1_e5$precio_metro2m)
sd_c2_e5<-sd(cuantil2_e5$precio_metro2m)
sd_c3_e5<-sd(cuantil3_e5$precio_metro2m)
sd_c4_e5<-sd(cuantil4_e5$precio_metro2m)
sd_c1_e6<-sd(cuantil1_e6$precio_metro2m)
sd_c2_e6<-sd(cuantil2_e6$precio_metro2m)
sd_c3_e6<-sd(cuantil3_e6$precio_metro2m)
sd_c4_e6<-sd(cuantil4_e6$precio_metro2m)
tabla_sd_cuantiles_e3<-matrix(c(sd_c1_e3, sd_c2_e3, sd_c3_e3,sd_c4_e3))
tabla_sd_cuantiles_e4<-matrix(c(sd_c1_e4,sd_c2_e4,sd_c3_e4,sd_c4_e4))
tabla_sd_cuantiles_e5<-matrix(c(sd_c1_e5,sd_c2_e5,sd_c3_e5,sd_c4_e5))
tabla_sd_cuantiles_e6<-matrix(c(sd_c1_e6, sd_c2_e6, sd_c3_e6,sd_c4_e6))
tabla_sd_cuantiles<-matrix(cbind(tabla_sd_cuantiles_e3, tabla_sd_cuantiles_e4, tabla_sd_cuantiles_e5, tabla_sd_cuantiles_e6),ncol=4, byrow = TRUE)
tabla_sd_cuantiles<-as.data.frame(tabla_sd_cuantiles)
colnames(tabla_sd_cuantiles) = c("Cuantil 1", "Cuantil 2", "Cuantil 3", "Cuantil4")
rownames(tabla_sd_cuantiles) <- c("Estrato 3","Estrato 4","Estrato 5",
"Estrato 6")
tabla_sd_cuantiles %>% mutate(across(where(is.numeric), round, digits=2)) No obstante, al analizar la media de precio por metro cuadrado, de manera sorpresiva se encuentra que cada cuantil, incluso en comparación con los de otros estratos, se comporta de manera única.
Por ejemplo, el promedio de precio por metro cuadrado en el cuantil 4 del estrato 3, es mayor al de los dos primeros cuantiles tanto del estrato 4 y 5 como, incluso, del 6.
Lo mismo ocurre con el cuantil 4 del estrato 4, que es mayor al de los 3 primeros cuantiles del estrato 5. En palabras simples: los inmuebles más caros del estrato 4, son más caros que el 75% más baratos del estrato 5:
tabla_med_cuantiles_e3<-matrix(c(promedio_c1_e3, promedio_c2_e3, promedio_c3_e3,promedio_c4_e3))
tabla_med_cuantiles_e4<-matrix(c(promedio_c1_e4,promedio_c2_e4,promedio_c3_e4,promedio_c4_e4))
tabla_med_cuantiles_e5<-matrix(c(promedio_c1_e5,promedio_c2_e5,promedio_c3_e5,promedio_c4_e5))
tabla_med_cuantiles_e6<-matrix(c(promedio_c1_e6, promedio_c2_e6, promedio_c3_e6,promedio_c4_e6))
tabla_med_cuantiles<-matrix(cbind(tabla_med_cuantiles_e3, tabla_med_cuantiles_e4, tabla_med_cuantiles_e5, tabla_med_cuantiles_e6),ncol=4, byrow = TRUE)
tabla_med_cuantiles<-as.data.frame(tabla_med_cuantiles)
colnames(tabla_med_cuantiles) = c("Cuantil 1", "Cuantil 2", "Cuantil 3", "Cuantil4")
rownames(tabla_med_cuantiles) <- c("Estrato 3","Estrato 4","Estrato 5",
"Estrato 6")
tabla_med_cuantiles %>% mutate(across(where(is.numeric), round, digits=2)) Esto podría explicarse en la medida que los precios por metro cuadrado no son el único criterio de asequibilidad, sino que también se concentra en aspectos tributarios o de pago de servicios públicos.
Es decir, como ejemplo, si bien el precio por metro cuadrado en el cuantil 4 del estrato 4 es más alto que el cuantil 1 y 2 del estrato 6, para una persona que tenga el poder adquisitivo para acceder a esas cifras, el pago de impuestos y servicios propios del estrato 6, genera desbalances (y desincentivos) presupuestales que no permiten equiparar las cargas económicas entre dichos estratos y cuantiles.
3. Análisis por características de inmuebles
Por otro lado, en cuanto a las características de los inmuebles, se percibe que predominan, a lo largo de todos los estratos, las viviendas con 3 habitaciones, siendo el estrato 6 el único en el que dicha predominancia se ve comprometida por viviendas con 4 habitaciones.
# No se realiza limpieza de datos en función del número de habitaciones, ya que se asume que 0 responde a inmuebles con un solo ambiente.
hab_est3<-subset(vf, estrato=="3")
bar_hab_3<-hab_est3 %>% ggplot(aes(x=habitac))+
geom_bar(color="black", fill="#43766C")+
labs(x="Cantidad de habitaciones")+
ggtitle(paste0("Estrato 3"))+
theme(plot.title = element_text(hjust = 0.5))+
scale_x_continuous(breaks=seq(0,10, 1))
hab_est4<-subset(vf, estrato=="4")
bar_hab_4<-hab_est4 %>% ggplot(aes(x=habitac))+
geom_bar(color="black", fill="#43766C", bins=13)+
labs(x="Cantidad de habitaciones")+
ggtitle(paste0("Estrato 4"))+
theme(plot.title = element_text(hjust = 0.5))+
scale_x_continuous(breaks=seq(0,10, 1))## Warning in geom_bar(color = "black", fill = "#43766C", bins = 13): Ignoring
## unknown parameters: `bins`
hab_est5<-subset(vf, estrato=="5")
bar_hab_5<-hab_est5 %>% ggplot(aes(x=habitac))+
geom_bar(color="black", fill="#43766C", bins=13)+
labs(x="Cantidad de habitaciones")+
theme(plot.title = element_text(hjust = 0.5))+
ggtitle(paste0("Estrato 5"))+
scale_x_continuous(breaks=seq(0,10, 1))## Warning in geom_bar(color = "black", fill = "#43766C", bins = 13): Ignoring
## unknown parameters: `bins`
hab_est6<-subset(vf, estrato=="6")
bar_hab_6<-hab_est6 %>% ggplot(aes(x=habitac))+
geom_bar(color="black", fill="#43766C", bins=13)+
labs(x="Cantidad de habitaciones")+
ggtitle(paste0("Estrato 6"))+
theme(plot.title = element_text(hjust = 0.5))+
scale_x_continuous(breaks=seq(0,10, 1))## Warning in geom_bar(color = "black", fill = "#43766C", bins = 13): Ignoring
## unknown parameters: `bins`
En este sentido, al observar la proporción de inmuebles con cada cantidad de habitaciones, frente al total de inmuebles del correspondiente estrato, se encuentra que:
# Preparación de funciones para elaboración de tablas
agg_hab <- vf %>% group_by(estrato) %>%
count(habitac)
freq_hab_est <- function(x){a<-sum(subset(agg_hab, estrato==x)$n)
return(a)
}
freq3<-freq_hab_est(3)
freq4<-freq_hab_est(4)
freq5<-freq_hab_est(5)
freq6<-freq_hab_est(6)
hab_est<- function(x) {a<-subset(agg_hab, estrato==x)
return(a)
}Estrato 3
hab_3<-hab_est(3)
hab_3<-as.data.frame(hab_3)
hab_3$prop_hab<- as.numeric((((hab_3$n)*100/freq3)),round, digits=2)
hab_3$prop_hab<-format(round(hab_3$prop_hab, 2), nsmall = 2)
hab_3<- hab_3[c(3:4)]
colnames(hab_3) = c("Frecuencia", "Proporción en el estrato 3")
rownames(hab_3) <- c(0:10)
hab_3Estrato 4
hab_4<-hab_est(4)
hab_4<-as.data.frame(hab_4)
hab_4$prop_hab<- as.numeric((((hab_4$n)*100/freq4)),round, digits=2)
hab_4$prop_hab<-format(round(hab_4$prop_hab, 2), nsmall = 2)
hab_4<- hab_4[c(3:4)]
colnames(hab_4) = c("Frecuencia", "Proporción en el estrato 4")
rownames(hab_4) <- c(0:10)
hab_4Estrato 5
hab_5<-hab_est(5)
hab_5<-as.data.frame(hab_5)
hab_5$prop_hab<- as.numeric((((hab_5$n)*100/freq5)),round, digits=2)
hab_5$prop_hab<-format(round(hab_5$prop_hab, 2), nsmall = 2)
hab_5<- hab_5[c(3:4)]
colnames(hab_5) = c("Frecuencia", "Proporción en el estrato 5")
rownames(hab_5) <- c(0:10)
hab_5Estrato 6
hab_6<-hab_est(6)
hab_6<-as.data.frame(hab_6)
hab_6$prop_hab<- as.numeric((((hab_6$n)*100/freq6)),round, digits=2)
hab_6$prop_hab<-format(round(hab_6$prop_hab, 2), nsmall = 2)
hab_6<- hab_6[c(3:4)]
colnames(hab_6) = c("Frecuencia", "Proporción en el estrato 6")
rownames(hab_6) <- c(0:10)
hab_6En este orden de ideas, resulta interesante observar que el precio por metro cuadrado en función del número de habitaciones es congruente en los 4 estatos analizados, de manera que los inmuebles con la misma cantidad de habitaciones tienden a ser más caros a medida que sube el estato. No obstante, al plantear el análisis dentro de cada estrato, se observa que el número de habitaciones no necesariamente aumenta el valor del precio por metro cuadrado, de manera que para los inmuebles de todos los estatos, los que tienen 2 y 3 habitaciones están más valorizados.
#promedio de precios por cantidad de habitaciones
pr_hab_3<-aggregate(hab_est3$precio_metro2m, by= list(hab_est3$habitac), FUN=mean)
pr_hab_3<- pr_hab_3[c(2)]
colnames(pr_hab_3) <-c("Promedio de precio / m2 (3)")
rownames(pr_hab_3) <- c(0:10)
pr_hab_3<-as.data.frame(pr_hab_3)
pr_hab_4<-aggregate(hab_est4$precio_metro2m, by= list(hab_est4$habitac), FUN=mean)
pr_hab_4<- pr_hab_4[c(2)]
colnames(pr_hab_4) <-c("Promedio de precio / m2 (4)")
rownames(pr_hab_4) <- c(0:10)
pr_hab_4<-as.data.frame(pr_hab_4)
pr_hab_5<-aggregate(hab_est5$precio_metro2m, by= list(hab_est5$habitac), FUN=mean)
pr_hab_5<- pr_hab_5[c(2)]
colnames(pr_hab_5) <-c("Promedio de precio / m2 (5)")
rownames(pr_hab_5) <- c(0:10)
pr_hab_5<-as.data.frame(pr_hab_5)
pr_hab_6<-aggregate(hab_est6$precio_metro2m, by= list(hab_est6$habitac), FUN=mean)
pr_hab_6<- pr_hab_6[c(2)]
colnames(pr_hab_6) <-c("Promedio de precio / m2 (6)")
rownames(pr_hab_6) <- c(0:10)
pr_hab_6<-as.data.frame(pr_hab_6)
pro_hab_m2<-matrix(cbind(pr_hab_3[,1],pr_hab_4[,1], pr_hab_5[,1], pr_hab_6[,1]),
ncol=4, byrow=FALSE)
colnames(pro_hab_m2) <-c("Promedio de precio / m2 (3)",
"Promedio de precio / m2 (4)",
"Promedio de precio / m2 (5)",
"Promedio de precio / m2 (6)")
rownames(pro_hab_m2) <- c(0:10)
pro_hab_m2<-format(round(pro_hab_m2, 2), nsmall = 2)
pro_hab_m2<-as.data.frame(pro_hab_m2)
pro_hab_m2Por su parte, al observar la cantidad de baños en los inmuebles, se revela que, similar a la cantidad de habitaciones, predominan aquellos con dos en los estratos 3, 4 y 5 (este último también con una cantidad importante de inmuebles con 3 baños). Al contrario, en el estrato 6 se responde en menor medida a esta tendencia, mostrando mayor dispersión en los datos según cantidad de baños (y variedad de oferta respecto a este elemento) y evidenciando una distribución prácticamente normal:
#Para el análisis de baños, si bien los datos no son lo suficientemente dicientes para realizar un análisis con la muestra total, como ejercicio análitico, se crea una base de datos reducida a partir de la eliminación de las muestras con 0 baños, entendiendo esto como algo poco probable en las viviendas de la ciudad.
vf_b<-vf %>% subset(banios>0)
conteoban1<-count(vf_b, banios)
ban_est3<-subset(vf_b, estrato=="3")
bar_ban_3<-ban_est3 %>% ggplot(aes(x=banios))+
geom_bar(color="black", fill="#43766C")+
labs(x="Cantidad de baños")+
ggtitle(paste0("Estrato 3"))+
theme(plot.title = element_text(hjust = 0.5))+
scale_x_continuous(breaks=seq(1,10, 1))
ban_est4<-subset(vf_b, estrato=="4")
bar_ban_4<-ban_est4 %>% ggplot(aes(x=banios))+
geom_bar(color="black", fill="#43766C", bins=13)+
labs(x="Cantidad de baños")+
ggtitle(paste0("Estrato 4"))+
theme(plot.title = element_text(hjust = 0.5))+
scale_x_continuous(breaks=seq(1,10, 1))## Warning in geom_bar(color = "black", fill = "#43766C", bins = 13): Ignoring
## unknown parameters: `bins`
ban_est5<-subset(vf_b, estrato=="5")
bar_ban_5<-ban_est5 %>% ggplot(aes(x=banios))+
geom_bar(color="black", fill="#43766C", bins=13)+
labs(x="Cantidad de baños")+
theme(plot.title = element_text(hjust = 0.5))+
ggtitle(paste0("Estrato 5"))+
scale_x_continuous(breaks=seq(1,10, 1))## Warning in geom_bar(color = "black", fill = "#43766C", bins = 13): Ignoring
## unknown parameters: `bins`
ban_est6<-subset(vf_b, estrato=="6")
bar_ban_6<-ban_est6 %>% ggplot(aes(x=banios))+
geom_bar(color="black", fill="#43766C", bins=13)+
labs(x="Cantidad de baños")+
ggtitle(paste0("Estrato 6"))+
theme(plot.title = element_text(hjust = 0.5))+
scale_x_continuous(breaks=seq(1,10, 1))## Warning in geom_bar(color = "black", fill = "#43766C", bins = 13): Ignoring
## unknown parameters: `bins`
Al igual que en el caso de las habitaciones, la tendencia de precios por metro cuadardo en función del número de baños es correspondiente al cambio de estrato. Es decir, un apartamento de un baño sería más costoso a medida que sube el estrato, tendencia que no fue tan explícita al analizar los datos generales.
Por otro lado, en los estratos 3 y 4 la cantidad de baños no es definitiva para el precio por metro cuadrado, mientras que para los estatos 5 y 6 sí, ya que en ambos casos los inmuebles con un solo baño tienden a ser pequeños y en estos estratos los precios base son elevados de entrada. Es decir, son inmuebles cuyos precios por metro cuadrado, en los primeros cuartiles, tienden a ser más inflexibles.
#precio por cantidad de baños
pr_ban_3<-aggregate(ban_est3$precio_metro2m, by= list(ban_est3$banios), FUN=mean)
pr_ban_3<- pr_ban_3[c(2)]
colnames(pr_ban_3) <-c("Promedio de precio / m2 (3)")
pr_ban_3<-as.data.frame(pr_ban_3)
pr_ban_3<- pr_ban_3 %>% add_row()
pr_ban_4<-aggregate(ban_est4$precio_metro2m, by= list(ban_est4$banios), FUN=mean)
pr_ban_4<- pr_ban_4[c(2)]
colnames(pr_ban_4) <-c("Promedio de precio / m2 (4)")
pr_ban_4<-as.data.frame(pr_ban_4)
pr_ban_4<- pr_ban_4 %>% add_row()
pr_ban_5<-aggregate(ban_est5$precio_metro2m, by= list(ban_est5$banios), FUN=mean)
pr_ban_5<- pr_ban_5[c(2)]
colnames(pr_ban_5) <-c("Promedio de precio / m2 (5)")
pr_ban_5<-as.data.frame(pr_ban_5)
pr_ban_5<- pr_ban_5 %>% add_row()
pr_ban_6<-aggregate(ban_est6$precio_metro2m, by= list(ban_est6$banios), FUN=mean)
pr_ban_6<- pr_ban_6[c(2)]
colnames(pr_ban_6) <-c("Promedio de precio / m2 (6)")
pr_ban_6<-as.data.frame(pr_ban_6)
pro_ban_m2<-matrix(cbind(pr_ban_3[,1],pr_ban_4[,1], pr_ban_5[,1], pr_ban_6[,1]),
ncol=4, byrow=FALSE)## Warning in cbind(pr_ban_3[, 1], pr_ban_4[, 1], pr_ban_5[, 1], pr_ban_6[, :
## number of rows of result is not a multiple of vector length (arg 4)
pro_ban_m2<-format(round(pro_ban_m2, 2), nsmall = 2)
pro_ban_m2<-as.data.frame(pro_ban_m2)
colnames(pro_ban_m2) <-c("Promedio de precio / m2 (3)",
"Promedio de precio / m2 (4)",
"Promedio de precio / m2 (5)",
"Promedio de precio / m2 (6)")
rownames(pro_ban_m2) <- c(1:11)
pro_ban_m2Como se hizo en el ejercicio de análisis por número de baños, para el caso de parqueaderos, y a manera de ejericicio complementario, se eliminaron las muestras sin esta variable registrada por dos razones: (a)son una proporción elevada de la muestra total y, si bien el artículo del Plan de Ordenamiento Territorial señala que:
1. En el caso de vivienda No VIS, se exige un mínimo de un (1) espacio de estacionamiento por cada dos (2) unidades de vivienda y un (1) espacio de estacionamiento para visitantes por cada diez (10) unidades.
2. En el caso de Vivienda de Interés Social (VIS), se exige un mínimo de (1) espacio de estacionamiento por cada tres (3) unidades de vivienda y de un (1) espacio de estacionamiento para visitantes por cada veinte (20) unidades.
3. En el caso de Vivienda de Interés Prioritario (VIP), se exige un mínimo de (1) espacio de estacionamiento por cada cuatro (4) unidades de vivienda y de un (1) espacio de estacionamiento para visitantes por cada veinte (20) unidades.
4. Se autorizará un máximo de un (1) estacionamiento por cada unidad de vivienda de cualquier tipo.
5. La construcción de estacionamientos adicionales por unidad de vivienda generará una compensación de un (1 m2) metro cuadrado, con base en el valor del metro cuadrado de la Zona Geoeconómica Homogénea, por cada estacionamiento adicional.
Por lo que (b) no se considera prudente igualar todos los valores nulos a uno (1) ya que sesgaría el análisis y, si bien se plantea que hay inmuebles con más de un parqueadero, no se puede intuir a partir de las otras variables que ofrece la base de datos.
Como se observa, en los estratos 3 y 4 predominan inmuebles con 1 solo parqueadero, mientras que en el estrato 5 también se destacan los que tienen dos y en el estrato 6 los inmuebles con un solo parqueadero son escasos y prevalecen los de 2 y hay una mayor proporción de aquellos con 3 o más parqueaderos. Esto se explica, en gran medida, por el poder adquisitivo de estas poblaciones y la tenencia de más de un automóvil.
# Análisis por número de parqueaderos
vf_p<-vf %>% drop_na("parquea")
par_est3<-subset(vf_p, estrato=="3")
bar_par_3<-par_est3 %>% ggplot(aes(x=parquea))+
geom_bar(color="black", fill="#43766C")+
labs(x="Cantidad de parqueaderos")+
ggtitle(paste0("Estrato 3"))+
theme(plot.title = element_text(hjust = 0.5))+
scale_x_continuous(breaks=seq(1,10, 1))
par_est4<-subset(vf_p, estrato=="4")
bar_par_4<-par_est4 %>% ggplot(aes(x=parquea))+
geom_bar(color="black", fill="#43766C", bins=13)+
labs(x="Cantidad de parqueaderos")+
ggtitle(paste0("Estrato 4"))+
theme(plot.title = element_text(hjust = 0.5))+
scale_x_continuous(breaks=seq(1,10, 1))## Warning in geom_bar(color = "black", fill = "#43766C", bins = 13): Ignoring
## unknown parameters: `bins`
par_est5<-subset(vf_p, estrato=="5")
bar_par_5<-par_est5 %>% ggplot(aes(x=parquea))+
geom_bar(color="black", fill="#43766C", bins=13)+
labs(x="Cantidad de parqueaderos")+
theme(plot.title = element_text(hjust = 0.5))+
ggtitle(paste0("Estrato 5"))+
scale_x_continuous(breaks=seq(1,10, 1))## Warning in geom_bar(color = "black", fill = "#43766C", bins = 13): Ignoring
## unknown parameters: `bins`
par_est6<-subset(vf, estrato=="6")
bar_par_6<-par_est6 %>% ggplot(aes(x=parquea))+
geom_bar(color="black", fill="#43766C", bins=13)+
labs(x="Cantidad de parqueaderos")+
ggtitle(paste0("Estrato 6"))+
theme(plot.title = element_text(hjust = 0.5))+
scale_x_continuous(breaks=seq(1,10, 1))## Warning in geom_bar(color = "black", fill = "#43766C", bins = 13): Ignoring
## unknown parameters: `bins`
## Warning: Removed 117 rows containing non-finite values (`stat_count()`).
Si bien al analizar la cantidad de parqueaderos se encuentra la misma tendencia de elementos anteriores en función del cambio de estrato (precio por metro cuadrado aumenta a medida que aumenta el estrato) no se observa que una cantidad específica de parqueaderos coincida a lo largo de los estratos como la más cara:
#precio por cantidad de parqueaderos
pr_par_3<-aggregate(par_est3$precio_metro2m, by= list(par_est3$parquea), FUN=mean)
pr_par_3<- pr_par_3[c(2)]
colnames(pr_par_3) <-c("Promedio de precio / m2 (3)")
pr_par_3<-as.data.frame(pr_par_3)
pr_par_3<- pr_par_3 %>% add_row()
pr_par_4<-aggregate(par_est4$precio_metro2m, by= list(par_est4$parquea), FUN=mean)
pr_par_4<- pr_par_4[c(2)]
colnames(pr_par_4) <-c("Promedio de precio / m2 (4)")
pr_par_4<-as.data.frame(pr_par_4)
pr_par_5<-aggregate(par_est5$precio_metro2m, by= list(par_est5$parquea), FUN=mean)
pr_par_5<- pr_par_5[c(2)]
colnames(pr_par_5) <-c("Promedio de precio / m2 (5)")
pr_par_5<-as.data.frame(pr_par_5)
pr_par_6<-aggregate(par_est6$precio_metro2m, by= list(par_est6$parquea), FUN=mean)
pr_par_6<- pr_par_6[c(2)]
colnames(pr_par_6) <-c("Promedio de precio / m2 (6)")
pr_ban_6<-as.data.frame(pr_ban_6)
pro_par_m2<-matrix(cbind(pr_par_3[,1],pr_par_4[,1], pr_par_5[,1], pr_par_6[,1]),
ncol=4, byrow=FALSE)## Warning in cbind(pr_par_3[, 1], pr_par_4[, 1], pr_par_5[, 1], pr_par_6[, :
## number of rows of result is not a multiple of vector length (arg 1)
pro_par_m2<-format(round(pro_par_m2, 2), nsmall = 2)
pro_par_m2<-as.data.frame(pro_par_m2)
colnames(pro_par_m2) <-c("Promedio de precio / m2 (3)",
"Promedio de precio / m2 (4)",
"Promedio de precio / m2 (5)",
"Promedio de precio / m2 (6)")
rownames(pro_par_m2) <- c(1:10)
pro_par_m2Para realizar el análisis de la incidencia del piso, se hace de manera separada para casas y apartamentos, ya que si bien la información de la variable plantea que responde al piso en el que se encuentra cada inmueble, este criterio no tiene sentido para el caso de las casas. En este sentido, primero se realiza el análisis en función del piso donde se encuentran ubicados los apartamentos y, posteriormente, en función del número de pisos de las casas.
Como se puede observar, en el caso de los apartamentos predominan los inmuebles en pisos bajos, lo cual se explica por las dinámicas de construcción de Cali, siendo, en términos generales, una ciudad que no construye mucho en altura. Por esto, los apartamentos en pisos altos no son tan predominantes, lo cual se presenta de manera cada vez menos marcada a medida que aumenta el estrato. Es decir, en los estratos altos se perciben más inmuebles en pisos altos, lo que puede explicarse por el hecho de que a el vivir en pisos altos se le ha dado una connotación de status.
#pisos de apartamentos
vf_piso<-vf %>% subset(piso>0)
vf_pisoapt<- vf_piso %>% subset(tipo=="apartamento")
psa_est3<-subset(vf_pisoapt, estrato=="3")
bar_psa_3<-psa_est3 %>% ggplot(aes(x=piso))+
geom_bar(color="black", fill="#43766C")+
labs(x="Piso del apartamento")+
ggtitle(paste0("Estrato 3"))+
theme(plot.title = element_text(hjust = 0.5))+
scale_x_continuous(breaks=seq(1,10, 1))
psa_est4<-subset(vf_pisoapt, estrato=="4")
bar_psa_4<-psa_est4 %>% ggplot(aes(x=piso))+
geom_bar(color="black", fill="#43766C", bins=13)+
labs(x="Piso del apartamento")+
ggtitle(paste0("Estrato 4"))+
theme(plot.title = element_text(hjust = 0.5))+
scale_x_continuous(breaks=seq(1,10, 1))## Warning in geom_bar(color = "black", fill = "#43766C", bins = 13): Ignoring
## unknown parameters: `bins`
psa_est5<-subset(vf_pisoapt, estrato=="5")
bar_psa_5<-psa_est5 %>% ggplot(aes(x=piso))+
geom_bar(color="black", fill="#43766C", bins=13)+
labs(x="Piso del apartamento")+
theme(plot.title = element_text(hjust = 0.5))+
ggtitle(paste0("Estrato 5"))+
scale_x_continuous(breaks=seq(1,10, 1))## Warning in geom_bar(color = "black", fill = "#43766C", bins = 13): Ignoring
## unknown parameters: `bins`
psa_est6<-subset(vf_pisoapt, estrato=="6")
bar_psa_6<-psa_est6 %>% ggplot(aes(x=piso))+
geom_bar(color="black", fill="#43766C", bins=13)+
labs(x="Piso del apartamento")+
ggtitle(paste0("Estrato 6"))+
theme(plot.title = element_text(hjust = 0.5))+
scale_x_continuous(breaks=seq(1,10, 1))## Warning in geom_bar(color = "black", fill = "#43766C", bins = 13): Ignoring
## unknown parameters: `bins`
No obstante a lo anterior, se observa que los inmuebles en pisos altos no son necesariamente más caros en términos de precio por metro cuadrado:
# precio de apartamentos según piso
pr_psa_3<-aggregate(psa_est3$precio_metro2m, by= list(psa_est3$piso), FUN=mean)
pr_psa_3<- pr_psa_3[c(2)]
colnames(pr_psa_3) <-c("Promedio de precio / m2 (3)")
pr_psa_3<-as.data.frame(pr_psa_3)
pr_psa_3<- pr_psa_3 %>% add_row()
pr_psa_4<-aggregate(psa_est4$precio_metro2m, by= list(psa_est4$piso), FUN=mean)
pr_psa_4<- pr_psa_4[c(2)]
colnames(pr_psa_4) <-c("Promedio de precio / m2 (4)")
pr_psa_4<-as.data.frame(pr_psa_4)
pr_psa_5<-aggregate(psa_est5$precio_metro2m, by= list(psa_est5$piso), FUN=mean)
pr_psa_5<- pr_psa_5[c(2)]
colnames(pr_psa_5) <-c("Promedio de precio / m2 (5)")
pr_psa_5<-as.data.frame(pr_psa_5)
pr_psa_6<-aggregate(psa_est6$precio_metro2m, by= list(psa_est6$piso), FUN=mean)
pr_psa_6<- pr_psa_6[c(2)]
colnames(pr_psa_6) <-c("Promedio de precio / m2 (6)")
pr_psa_6<-as.data.frame(pr_psa_6)
pro_psa_m2<-matrix(cbind(pr_psa_3[,1],pr_psa_4[,1], pr_psa_5[,1], pr_psa_6[,1]),
ncol=4, byrow=FALSE)## Warning in cbind(pr_psa_3[, 1], pr_psa_4[, 1], pr_psa_5[, 1], pr_psa_6[, :
## number of rows of result is not a multiple of vector length (arg 1)
pro_psa_m2<-format(round(pro_psa_m2, 2), nsmall = 2)
pro_psa_m2<-as.data.frame(pro_psa_m2)
colnames(pro_psa_m2) <-c("Promedio de precio / m2 (3)",
"Promedio de precio / m2 (4)",
"Promedio de precio / m2 (5)",
"Promedio de precio / m2 (6)")
rownames(pro_psa_m2) <- c(1:12)
pro_psa_m2En cuanto a las casas, se evidencia el hecho de que la mayoría de ellas, a lo largo de todos los estratos, tienden a no superar los 3 pisos de altura, siendo aquellas con 2 pisos las que más se presentan en la ciudad.
# pisos de casas
vf_pisoc<- vf_piso %>% subset(tipo=="casa")
vf_pisoc<- vf_pisoc %>% subset(piso<=7)
psc_est3<-subset(vf_pisoc, estrato=="3")
bar_psc_3<-psc_est3 %>% ggplot(aes(x=piso))+
geom_bar(color="black", fill="#43766C")+
labs(x="Cantidad de pisos")+
ggtitle(paste0("Estrato 3"))+
theme(plot.title = element_text(hjust = 0.5))+
scale_x_continuous(breaks=seq(1,10, 1))
psc_est4<-subset(vf_pisoc, estrato=="4")
bar_psc_4<-psc_est4 %>% ggplot(aes(x=piso))+
geom_bar(color="black", fill="#43766C", bins=13)+
labs(x="Cantidad de pisos")+
ggtitle(paste0("Estrato 4"))+
theme(plot.title = element_text(hjust = 0.5))+
scale_x_continuous(breaks=seq(1,10, 1))## Warning in geom_bar(color = "black", fill = "#43766C", bins = 13): Ignoring
## unknown parameters: `bins`
psc_est5<-subset(vf_pisoc, estrato=="5")
bar_psc_5<-psc_est5 %>% ggplot(aes(x=piso))+
geom_bar(color="black", fill="#43766C", bins=13)+
labs(x="Cantidad de pisos")+
theme(plot.title = element_text(hjust = 0.5))+
ggtitle(paste0("Estrato 5"))+
scale_x_continuous(breaks=seq(1,10, 1))## Warning in geom_bar(color = "black", fill = "#43766C", bins = 13): Ignoring
## unknown parameters: `bins`
psc_est6<-subset(vf_pisoc, estrato=="6")
bar_psc_6<-psc_est6 %>% ggplot(aes(x=piso))+
geom_bar(color="black", fill="#43766C", bins=13)+
labs(x="Cantidad de pisos")+
ggtitle(paste0("Estrato 6"))+
theme(plot.title = element_text(hjust = 0.5))+
scale_x_continuous(breaks=seq(1,10, 1))## Warning in geom_bar(color = "black", fill = "#43766C", bins = 13): Ignoring
## unknown parameters: `bins`
Así, no se evidencia una relación directa entre la cantidad de pisos de las casas y el precio por metro cuadrado. Esto podría denotar que la cantidad de pisos no es una variable a considerar en el momento de adquirir una casa, siendo el área uno de los criterios más importantes y que no necesariamente está ligado al número de pisos que tiene la casa.
#precio por cantidad de pisos de casa
pr_psc_3<-aggregate(psc_est3$precio_metro2m, by= list(psc_est3$piso), FUN=mean)
pr_psc_3<- pr_psc_3[c(2)]
colnames(pr_psc_3) <-c("Promedio de precio / m2 (3)")
pr_psc_3<-as.data.frame(pr_psa_3)
pr_psc_3<- pr_psc_3 %>% add_row()
pr_psc_3<- pr_psc_3 %>% add_row()
pr_psc_4<-aggregate(psc_est4$precio_metro2m, by= list(psc_est4$piso), FUN=mean)
pr_psc_4<- pr_psc_4[c(2)]
colnames(pr_psc_4) <-c("Promedio de precio / m2 (4)")
pr_psc_4<-as.data.frame(pr_psc_4)
pr_psc_5<-aggregate(psc_est5$precio_metro2m, by= list(psc_est5$piso), FUN=mean)
pr_psc_5<- pr_psc_5[c(2)]
colnames(pr_psc_5) <-c("Promedio de precio / m2 (5)")
pr_psc_5<-as.data.frame(pr_psc_5)
pr_psc_6<-aggregate(psc_est6$precio_metro2m, by= list(psc_est6$piso), FUN=mean)
pr_psc_6<- pr_psc_6[c(2)]
colnames(pr_psc_6) <-c("Promedio de precio / m2 (6)")
pr_psc_6<- pr_psc_6 %>% add_row()
pr_psc_6<- pr_psc_6 %>% add_row()
pr_psc_6<-as.data.frame(pr_psc_6)
pro_psc_m2<-matrix(cbind(pr_psc_3[,1],pr_psc_4[,1], pr_psc_5[,1], pr_psc_6[,1]),
ncol=4, byrow=FALSE)## Warning in cbind(pr_psc_3[, 1], pr_psc_4[, 1], pr_psc_5[, 1], pr_psc_6[, :
## number of rows of result is not a multiple of vector length (arg 2)
pro_psc_m2<-format(round(pro_psc_m2, 2), nsmall = 2)
pro_psc_m2<-as.data.frame(pro_psc_m2)
pro_psc_m2<-subset(pro_psc_m2[1:5,1:4])
colnames(pro_psc_m2) <-c("Promedio de precio / m2 (3)",
"Promedio de precio / m2 (4)",
"Promedio de precio / m2 (5)",
"Promedio de precio / m2 (6)")
rownames(pro_psc_m2) <- c(1:5)
pro_psc_m24. Análisis por tamaño de inmuebles
Se observa que, dentro del 5% de las viviendas más grandes de la muestra, las áreas mínimas y máximas son relativamente similares entre estratos, en especial entre el 3 y 4 y el 5 y 6 (siendo estos dos estratos con las viviendas más grandes para este subgrupo), siendo marcadamente superior la media de tamaño en el estrato 6
#más grandes por tipo y estrato
m_grandes_3<-subset(hab_est3, areaconst > quantile(hab_est3$areaconst, probs=c(0.95)))
ming_p3<-min(m_grandes_3$areaconst)
maxg_p3<-max(m_grandes_3$areaconst)
prmg_p3<-mean(m_grandes_3$areaconst)
m_grandes3_barrio<-count(m_grandes_3, barrio)
m_grandes3_barrio<-m_grandes3_barrio[order(m_grandes3_barrio$n, decreasing = TRUE),]
colnames(m_grandes3_barrio) <-c("Barrio",
"Cantidad")
m_grandes3_barrio<-subset(m_grandes3_barrio[1:10,])
m_grandes_4<-subset(hab_est4, areaconst > quantile(hab_est4$areaconst, probs=c(0.95)))
ming_p4<-min(m_grandes_4$areaconst)
maxg_p4<-max(m_grandes_4$areaconst)
prmg_p4<-mean(m_grandes_4$areaconst)
m_grandes4_barrio<-count(m_grandes_4, barrio)
m_grandes4_barrio<-m_grandes4_barrio[order(m_grandes4_barrio$n, decreasing = TRUE),]
colnames(m_grandes4_barrio) <-c("Barrio",
"Cantidad")
m_grandes4_barrio<-subset(m_grandes4_barrio[1:10,])
m_grandes_5<-subset(hab_est5, areaconst > quantile(hab_est5$areaconst, probs=c(0.95)))
ming_p5<-min(m_grandes_5$areaconst)
maxg_p5<-max(m_grandes_5$areaconst)
prmg_p5<-mean(m_grandes_5$areaconst)
m_grandes5_barrio<-count(m_grandes_5, barrio)
m_grandes5_barrio<-m_grandes5_barrio[order(m_grandes5_barrio$n, decreasing = TRUE),]
colnames(m_grandes5_barrio) <-c("Barrio",
"Cantidad")
m_grandes5_barrio<-subset(m_grandes5_barrio[1:10,])
m_grandes_6<-subset(hab_est4, areaconst > quantile(hab_est6$areaconst, probs=c(0.95)))
ming_p6<-min(m_grandes_6$areaconst)
maxg_p6<-max(m_grandes_6$areaconst)
prmg_p6<-mean(m_grandes_6$areaconst)
m_grandes6_barrio<-count(m_grandes_6, barrio)
m_grandes6_barrio<-m_grandes5_barrio[order(m_grandes6_barrio$n, decreasing = TRUE),]
colnames(m_grandes6_barrio) <-c("Barrio",
"Cantidad")
m_grandes6_barrio<-subset(m_grandes6_barrio[1:10,])
mas_grandes<-matrix(c(ming_p3, maxg_p3, prmg_p3, ming_p4, maxg_p4, prmg_p4,
ming_p5, maxg_p5, prmg_p5,ming_p6, maxg_p6, prmg_p6),
ncol=3, byrow=TRUE)
mas_grandes[,3]<-format(round(mas_grandes[,3], 2), nsmall = 2)
mas_grandes<-as.data.frame (mas_grandes)
colnames(mas_grandes) = c("Área mínima","Área máxima", "Promedio de área")
rownames(mas_grandes) <- c('Estrato 3','Estrato 4','Estrato 5',"Estrato 6")
mas_grandesPor el contrario, para el 5% de viviendas más pequeñas se observan más similitudes, ya que hay una menor dispersión de los datos, ya que existen mínimos de áreas establecidas para viviendas pero no máximos. Así mismo, resalta el hecho de que tanto el valor mínimo, como el máximo y la media son mayores a medida que aumenta el estrato
#mas pequeñas
m_pequeñas_3<-subset(hab_est3, areaconst < quantile(hab_est3$areaconst, probs=c(0.05)))
min_p3<-min(m_pequeñas_3$areaconst)
max_p3<-max(m_pequeñas_3$areaconst)
prm_p3<-mean(m_pequeñas_3$areaconst)
m_pequeñas3_barrio<-count(m_pequeñas_3, barrio)
m_pequeñas3_barrio<-m_pequeñas3_barrio[order(m_pequeñas3_barrio$n, decreasing = TRUE),]
colnames(m_pequeñas3_barrio) <-c("Barrio",
"Cantidad")
m_pequeñas3_barrio<-subset(m_pequeñas3_barrio[1:10,])
m_pequeñas_4<-subset(hab_est4, areaconst < quantile(hab_est4$areaconst, probs=c(0.05)))
min_p4<-min(m_pequeñas_4$areaconst)
max_p4<-max(m_pequeñas_4$areaconst)
prm_p4<-mean(m_pequeñas_4$areaconst)
m_pequeñas4_barrio<-count(m_pequeñas_4, barrio)
m_pequeñas4_barrio<-m_pequeñas4_barrio[order(m_pequeñas4_barrio$n, decreasing = TRUE),]
colnames(m_pequeñas4_barrio) <-c("Barrio",
"Cantidad")
m_pequeñas4_barrio<-subset(m_pequeñas4_barrio[1:10,])
m_pequeñas_5<-subset(hab_est5, areaconst < quantile(hab_est5$areaconst, probs=c(0.05)))
min_p5<-min(m_pequeñas_5$areaconst)
max_p5<-max(m_pequeñas_5$areaconst)
prm_p5<-mean(m_pequeñas_5$areaconst)
m_pequeñas5_barrio<-count(m_pequeñas_5, barrio)
m_pequeñas5_barrio<-m_pequeñas5_barrio[order(m_pequeñas5_barrio$n, decreasing = TRUE),]
colnames(m_pequeñas5_barrio) <-c("Barrio",
"Cantidad")
m_pequeñas5_barrio<-subset(m_pequeñas5_barrio[1:10,])
m_pequeñas_6<-subset(hab_est6, areaconst < quantile(hab_est6$areaconst, probs=c(0.05)))
min_p6<-min(m_pequeñas_6$areaconst)
max_p6<-max(m_pequeñas_6$areaconst)
prm_p6<-mean(m_pequeñas_6$areaconst)
m_pequeñas6_barrio<-count(m_pequeñas_6, barrio)
m_pequeñas6_barrio<-m_pequeñas6_barrio[order(m_pequeñas6_barrio$n, decreasing = TRUE),]
colnames(m_pequeñas6_barrio) <-c("Barrio",
"Cantidad")
m_pequeñas6_barrio<-subset(m_pequeñas6_barrio[1:10,])
mas_pequeñas<-matrix(c(min_p3, max_p3, prm_p3, min_p4, max_p4, prm_p4,
min_p5, max_p5, prm_p5,min_p6, max_p6, prm_p6),
ncol=3, byrow=TRUE)
mas_pequeñas<-format(round(mas_pequeñas, 2), nsmall = 2)
mas_pequeñas<-as.data.frame (mas_pequeñas)
colnames(mas_pequeñas) = c("Área mínima","Área máxima", "Promedio de área")
rownames(mas_pequeñas) <- c('Estrato 3','Estrato 4','Estrato 5',"Estrato 6")
mas_pequeñas5. Análisis por ubicación de inmuebles
En cuanto a los barrios que registran más inmuebles se encuentran:
#barrios con más inmuebles
conteo_barrios<-conteo_barrios[order(conteo_barrios$n, decreasing = TRUE),]
conteo_barrios Nótese que, de los 10 barrios más frecuentes en la oferta inmobiliaria, los tres primeros se encuentran en los límites del sur de la ciudad, entendiendo que son estás las tendencias que muestra el crecimiento urbano de Santiago de Cali.
Por otro lado, los barrios más caros del registro de inmuebles estudiado son:
#barrios más caros
barrios_caros<-aggregate(vf$precio_metro2m, by=list(vf$barrio), FUN=mean)
barrios_caros<-barrios_caros[order(barrios_caros$x, decreasing = TRUE),]
barrios_caros<-subset(barrios_caros[1:10,])
barrios_caros$x<-format(round(barrios_caros$x, 2), nsmall = 2)
barrios_caros<-as.data.frame(barrios_caros)
colnames(barrios_caros) <-c("Barrio",
"Promedio de precio / m2")
rownames(barrios_caros) <-c(1:10)
barrios_carosEn cuanto a los barrios más caros en términos de precio por metro cuadrado, por estrato, se encuentran:
Estrato 3
barrios_caros3<-aggregate(hab_est3$precio_metro2m, by=list(hab_est3$barrio), FUN=mean)
barrios_caros3<-barrios_caros3[order(barrios_caros3$x, decreasing = TRUE),]
barrios_caros3<-subset(barrios_caros3[1:10,])
barrios_caros3$x<-format(round(barrios_caros3$x, 2), nsmall = 2)
barrios_caros3<-as.data.frame(barrios_caros3)
colnames(barrios_caros3) <-c("Barrio",
"Promedio de precio / m2")
rownames(barrios_caros3) <-c(1:10)
barrios_caros3Estrato 4
barrios_caros4<-aggregate(hab_est4$precio_metro2m, by=list(hab_est4$barrio), FUN=mean)
barrios_caros4<-barrios_caros4[order(barrios_caros4$x, decreasing = TRUE),]
barrios_caros4<-subset(barrios_caros4[1:10,])
barrios_caros4$x<-format(round(barrios_caros4$x, 2), nsmall = 2)
barrios_caros4<-as.data.frame(barrios_caros4)
colnames(barrios_caros4) <-c("Barrio",
"Promedio de precio / m2")
rownames(barrios_caros4) <-c(1:10)
barrios_caros4Estrato 5
barrios_caros5<-aggregate(hab_est5$precio_metro2m, by=list(hab_est5$barrio), FUN=mean)
barrios_caros5<-barrios_caros5[order(barrios_caros5$x, decreasing = TRUE),]
barrios_caros5<-subset(barrios_caros5[1:10,])
barrios_caros5$x<-format(round(barrios_caros5$x, 2), nsmall = 2)
barrios_caros5<-as.data.frame(barrios_caros5)
colnames(barrios_caros5) <-c("Barrio",
"Promedio de precio / m2")
rownames(barrios_caros5) <-c(1:10)
barrios_caros5Estrato 6
barrios_caros6<-aggregate(hab_est6$precio_metro2m, by=list(hab_est6$barrio), FUN=mean)
barrios_caros6<-barrios_caros6[order(barrios_caros6$x, decreasing = TRUE),]
barrios_caros6<-subset(barrios_caros6[1:10,])
barrios_caros6$x<-format(round(barrios_caros6$x, 2), nsmall = 2)
barrios_caros6<-as.data.frame(barrios_caros6)
colnames(barrios_caros6) <-c("Barrio",
"Promedio de precio / m2")
rownames(barrios_caros6) <-c(1:10)
barrios_caros6En cuanto a los barrios más baratos, se identificaron:
#barrios más baratos
barrios_baratos<-aggregate(vf$precio_metro2m, by=list(vf$barrio), FUN=mean)
barrios_baratos<-barrios_baratos[order(barrios_baratos$x, decreasing = FALSE),]
barrios_baratos<-subset(barrios_baratos[1:10,])
barrios_baratos$x<-format(round(barrios_baratos$x, 2), nsmall = 2)
barrios_baratos<-as.data.frame(barrios_baratos)
colnames(barrios_baratos) <-c("Barrio",
"Promedio de precio / m2")
rownames(barrios_baratos) <-c(1:10)
barrios_baratosAl identificar los 10 barrios más baratos por estrato se halla:
Estrato 3
barrios_baratos3<-aggregate(hab_est3$precio_metro2m, by=list(hab_est3$barrio), FUN=mean)
barrios_baratos3<-barrios_baratos3[order(barrios_baratos3$x, decreasing = FALSE),]
barrios_baratos3<-subset(barrios_baratos3[1:10,])
barrios_baratos3$x<-format(round(barrios_baratos3$x, 2), nsmall = 2)
barrios_baratos3<-as.data.frame(barrios_baratos3)
colnames(barrios_baratos3) <-c("Barrio",
"Promedio de precio / m2")
rownames(barrios_baratos3) <-c(1:10)
barrios_baratos3Estrato 4
barrios_baratos4<-aggregate(hab_est4$precio_metro2m, by=list(hab_est4$barrio), FUN=mean)
barrios_baratos4<-barrios_baratos4[order(barrios_baratos4$x, decreasing = FALSE),]
barrios_baratos4<-subset(barrios_baratos4[1:10,])
barrios_baratos4$x<-format(round(barrios_baratos4$x, 2), nsmall = 2)
barrios_baratos4<-as.data.frame(barrios_baratos4)
colnames(barrios_baratos4) <-c("Barrio",
"Promedio de precio / m2")
rownames(barrios_baratos4) <-c(1:10)
barrios_baratos4Estrato 5
barrios_baratos5<-aggregate(hab_est5$precio_metro2m, by=list(hab_est5$barrio), FUN=mean)
barrios_baratos5<-barrios_baratos5[order(barrios_baratos5$x, decreasing = FALSE),]
barrios_baratos5<-subset(barrios_baratos5[1:10,])
barrios_baratos5$x<-format(round(barrios_baratos5$x, 2), nsmall = 2)
barrios_baratos5<-as.data.frame(barrios_baratos5)
colnames(barrios_baratos5) <-c("Barrio",
"Promedio de precio / m2")
rownames(barrios_baratos5) <-c(1:10)
barrios_baratos5Estrato 6
barrios_baratos6<-aggregate(hab_est6$precio_metro2m, by=list(hab_est6$barrio), FUN=mean)
barrios_baratos6<-barrios_baratos6[order(barrios_baratos6$x, decreasing = FALSE),]
barrios_baratos6<-subset(barrios_baratos6[1:10,])
barrios_baratos6$x<-format(round(barrios_baratos6$x, 2), nsmall = 2)
barrios_baratos6<-as.data.frame(barrios_baratos6)
colnames(barrios_baratos6) <-c("Barrio",
"Promedio de precio / m2")
rownames(barrios_baratos6) <-c(1:10)
barrios_baratos6Por su parte, al analizar las características de los inmuebles según la zona en la que se localizan, se encuentra que más del 50% se concentran en la zona sur de la ciudad, seguido por el norte con el 23.1% y el oeste con el 14.5%. Esto se puede explicar por la naturaleza de la muestra, ya que solo incluye estratos a partir del 3 y estas 3 zonas tienden agregar distintos estratos. Caso contrario al del oriente y centro de Cali, que concentran inmuebles de estratos menores al 3 y que no son tenidos en cuenta en esta muestra.
#inmuebles por zona
conteo_zonas<-count(vf, zona)
conteo_zonas<-subset(conteo_zonas[,2])
conteo_zonas<- as.data.frame(conteo_zonas)
conteo_zonas$porcentaje<- (conteo_zonas$n*(100))/(as.numeric(count(vf)))
conteo_zonas$porcentaje<-format(round(conteo_zonas$porcentaje, 2), nsmall = 2)
conteo_zonas$porcentaje<-as.numeric(conteo_zonas$porcentaje)
colnames(conteo_zonas) <-c("Cantidad de Inmuebles","Porcentaje sobre total")
rownames(conteo_zonas)<- c("Zona Centro", "Zona Norte", "Zona Oeste",
"Zona Oriente", "Zona Sur")Lo anterior se corrobora al observar la siguiente tabla:
# Cantidad de Estatos por Zona
zona_centro<- vf %>% subset(zona=="Zona Centro", estrato)
zona_centro<- count(zona_centro, estrato)
zona_centro<-as.data.frame(zona_centro)
zona_norte<- vf %>% subset(zona=="Zona Norte", estrato)
zona_norte<- count(zona_norte, estrato)
zona_norte<-as.data.frame(zona_norte)
zona_oeste<- vf %>% subset(zona=="Zona Oeste", estrato)
zona_oeste<- count(zona_oeste, estrato)
zona_oeste<-as.data.frame(zona_oeste)
zona_oriente<- vf %>% subset(zona=="Zona Oriente", estrato)
zona_oriente<- count(zona_oriente, estrato)
zona_oriente<-as.data.frame(zona_oriente)
zona_sur<- vf %>% subset(zona=="Zona Sur", estrato)
zona_sur<- count(zona_sur, estrato)
zona_sur<-as.data.frame(zona_sur)
estratos_zona<-matrix(cbind(zona_centro[,2],zona_norte[,2], zona_oeste[,2],
zona_oriente[,2],zona_sur[,2]),
ncol=5, byrow=FALSE)
estratos_zona<-as.data.frame(estratos_zona)
colnames(estratos_zona) <-c("Zona Centro", "Zona Norte", "Zona Oeste",
"Zona Oriente", "Zona Sur")
rownames(estratos_zona)<- c("Estrato 3", "Estrato 4", "Estrato 5",
"Estrato 6")
estratos_zonaPor último, se puede ver que, en términos generales, la zona centro tiende a ser la más cara si se analiza por estrato. Es decir, sus inmuebles de estrato 3, 4, 5 y 6, son de un mayor precio por metro cuadrado en relación a inmuebles del mismo estrato en otras zonas. Lo anterior, entendiendo que para todas las zonas, a medida que se sube de estrato aumenta el precio por metro cuadrado
# zonas más caras
zonas_caras<-aggregate(vf$precio_metro2m, by=list(vf$zona), FUN=mean)
zonas_caras<-zonas_caras[order(zonas_caras$x, decreasing = TRUE),]
zonas_caras3<-aggregate(hab_est3$precio_metro2m, by=list(hab_est3$zona), FUN=mean)
zonas_caras3<-zonas_caras3[order(zonas_caras3$x, decreasing = TRUE),]
zonas_caras4<-aggregate(hab_est4$precio_metro2m, by=list(hab_est4$zona), FUN=mean)
zonas_caras4<-zonas_caras4[order(zonas_caras4$x, decreasing = TRUE),]
zonas_caras5<-aggregate(hab_est5$precio_metro2m, by=list(hab_est5$zona), FUN=mean)
zonas_caras5<-zonas_caras5[order(zonas_caras5$x, decreasing = TRUE),]
zonas_caras6<-aggregate(hab_est6$precio_metro2m, by=list(hab_est6$zona), FUN=mean)
zonas_caras6<-zonas_caras6[order(zonas_caras6$x, decreasing = TRUE),]
zonas_caras3<-subset(zonas_caras3[1:5,])
zonas_caras3<-as.data.frame(zonas_caras3)
colnames(zonas_caras3) <-c("Zona",
"Promedio de precio / m2")
zonas_caras4<-subset(zonas_caras4[1:5,])
zonas_caras4<-as.data.frame(zonas_caras4)
colnames(zonas_caras4) <-c("Zona",
"Promedio de precio / m2")
zonas_caras5<-subset(zonas_caras5[1:5,])
zonas_caras5<-as.data.frame(zonas_caras5)
colnames(zonas_caras5) <-c("Zona",
"Promedio de precio / m2")
zonas_caras6<-subset(zonas_caras6[1:5,])
zonas_caras6<-as.data.frame(zonas_caras6)
colnames(zonas_caras6) <-c("Zona",
"Promedio de precio / m2")
zonas_caras<-subset(zonas_caras[1:5,])
zonas_caras<-as.data.frame(zonas_caras)
colnames(zonas_caras) <-c("Zona",
"Promedio de precio / m2")
prec_zona_est<-matrix(cbind(zonas_caras3[,2],zonas_caras4[,2], zonas_caras5[,2],
zonas_caras6[,2]),
ncol=4, byrow=FALSE)
prec_zona_est<-format(round(prec_zona_est, 2), nsmall = 2)
prec_zona_est<-as.data.frame(prec_zona_est)
colnames(prec_zona_est) <-c("Estrato 3", "Estrato 4", "Estrato 5",
"Estrato 6")
rownames(prec_zona_est)<- c("Zona Centro", "Zona Norte", "Zona Oeste",
"Zona Oriente", "Zona Sur")
prec_zona_est6. Discusión y conclusiones
A partir de un análisis descriptivo de los bienes inmuebles de la ciudad de Cali, se identificaron patrones en cuanto al precio por metro cuadrado, entendido como uno de los criterios más relevantes para evaluar el mercado inmobiliario de manera estandarizada en Colombia y el mundo)
En este sentido, se encontró que, en términos generales los estratos 3 y 4 conservan similitudes tanto en los valores como en las características estructurales de los inmuebles, siendo el estrato 5 un punto de quiebre de dichas tendencias y el estrato 6 donde concurren la mayor cantidad de datos extremos (y reales) en cada elemento y/o componente.
En cuanto al manejo de las bases de datos, se hacen las siguientes recomendaciones en el levantamiento y procesamiento de la misma, según variable:
Piso: se recomienda discriminar esta variable entre apartamentos y casas, ya que no tiene las mismas implicaciones para cada tipo de inmueble e ignorando la posibilidad de evaluar apartamentos con varios pisos.
Estrato: para enriquecer el análisis y el comportamiento de cada barrio y zona, así como las diferencias en las características de los inmuebles ofertados, se recomienda procurar levantar información sobre apartamentos y casas de los estratos 2 y 3. Así mismo, se sugiere registrar información entorno a la condición de VIS o VIP de cada inmueble
Parqueaderos: se recomienda levantar esta información de manera más juiciosa, ya que existen muchos datos faltantes y constituye una variable que, según la norma, no guarda ninguna relación y/o proporción con otras variables registradas.
Baños: se recomienda aclarar en los metadatos las implicaciones de cuando esta variable presenta el valor “0”
Habitaciones: se replica recomendación hecha en torno a los baños.
Barrios: estandarizar la forma de registrar los nombres de los mismos para evitar duplicidades. Así mismo, asegurarse de registrar nombres existentes y no generales como “zona sur”, ya que esto responde a otra variable ya definida.