DATOS DE OFERTAS DE VIVIENDA

require(readxl)
library(RecordLinkage)
require(tidyverse)
require(flextable)
require(moments) 
library(dplyr)
library(reshape)
library(reshape2)
library(officer)
library(plotly)
library(scales)
require(leaflet)
library(patchwork)

Se realiza un anÔlisis inicial a la base de ofertas de viviendas en Cali extraída de OLX, para este trabajo se consideraron las ofertas de apartamentos ubicados en el barrio Valle de Lili. La base del anÔlisis estÔ conformada por 843 registros. Donde se tiene información relacionada con características de los mismos, tales cómo, Área Construida en \(M^2\), el precio en millones, número de baños, número de habitaciones, número de parqueadero y las coordenadas de latitud y longitud para un posible anÔlisis espacial de las mismas.

datos <- read_excel("~/5. MAESTRIA CIENCIA DE DATOS/2. METODOS Y SIMULACION ESTADISTICA/Encuentros Sincronicos/Actividad 1/YDRAY-Datos_Vivienda.xlsx")
datos$id <- 1:dim(datos)[1]
pos = which(datos$Barrio == "valle del lili" & datos$Tipo == "Apartamentos")
datos_sub = datos[pos,]


pos2 = which(jarowinkler("valle del lili",datos$Barrio) > 0.8 & datos$Tipo == "Apartamento")
datos_sub = datos[pos2,]
head(datos_sub)
Zona piso Estrato precio_millon Area_contruida parqueaderos Banos Habitaciones Tipo Barrio cordenada_longitud Cordenada_latitud id
Zona Sur 5 5 310 82.5 1 2 3 Apartamento valle del lili -76.46438 3.43463 8
Zona Sur 9 4 240 80.0 1 2 3 Apartamento valle del lili -76.46438 3.43463 9
Zona Sur NA 5 230 70.0 1 2 2 Apartamento valle del lili -76.46500 3.43600 12
Zona Sur NA 5 160 63.0 NA 2 2 Apartamento valle del lili -76.46500 3.43600 13
Zona Sur 6 5 200 71.0 1 2 3 Apartamento valle del lili -76.46500 3.43600 14
Zona Sur NA 5 270 76.0 NA 2 3 Apartamento valle del lili -76.46500 3.43600 15

Analisis de variables cuatitativas

Inicialmente se le realizó un analisis exploratorio a las variables cuantitativas encontrando lo siguiente:

• La distribución del precio de los apartamentos presenta una baja variabilidad, siendo esta del 28.6%, con una leve asimetrĆ­a positiva inclinada hacia los apartamentos con montos mas altos. Por otro lado, se podrĆ­a pensar que la distribución de los precios se encuentra alrededor del promedio.

• En cuanto al Ć”rea construida, esta presenta mayor variabilidad en sus datos, con una distribución mĆ”s alejada del promedio adicional a esto se puede observar un posible dato atĆ­pico al tener un valor mĆ”ximo de 932 \(M^2\)

medidas=function(var){  
  
  n=length(var) 
  min = min(var)
  primer_cuantil = round(quantile(var,0.25),2)
  media=round(mean(var),2)
  mediana=round(median(var,2)) 
  tercer_cuantil = round(quantile(var,0.75),2)
  max = round(max(var),2)
  sd=round(sd(var),2)
  asimetria=round(skewness(var),2)
  curtosis=round(kurtosis(var),2)
  CV = round((sd/media)*100,2)
  resp <- data.frame(n,min,primer_cuantil,mediana,media,
                     tercer_cuantil,max,sd,asimetria,curtosis,CV)
  return(resp)
}

summary <- data.frame()
a = 0
for(Variable in c('precio_millon','Area_contruida')){
 
  a = a+1
  summary[a,1:12] <-  data.frame(Variable,medidas(as.vector(t(datos_sub[,Variable]))))
  
}

summary <- as.data.frame(t(data.frame(rbind(colnames(summary),summary))))
summary[,1] <- c('Descriptiva','n', 'Minimo', '1er Cuarti', 'Mediana',
                  'Media', '3er Cuartil', 'Maximo', 'SD', 'AsimetĆ­a',
                  'Curtosis', 'CV')

ft.var.final <- regulartable(summary) 
ft.var.final <- align(ft.var.final, align = "center", part = "all" ) 
ft.var.final <- border(ft.var.final,
                       border = fp_border(width = 0.6,
                                          color = "gray"),
                       border.left = fp_border(width = 0.6,
                                               color = "#4F81BD"),
                       part = "body")
ft.var.final <- delete_part(ft.var.final, part = "header") 
ft.var.final <- bg(ft.var.final, bg = "#006394", i = 1)
ft.var.final <- color(ft.var.final, color = "white", i = 1)
ft.var.final <- bold(ft.var.final, i = 1)
ft.var.final <- autofit(ft.var.final, add_w = 0.001, add_h = 0.001)
ft.var.final

Despues del analisis cunatitativo de las variables se procedio a realizar una representación grafica de estas donde se evidenció que la distribucion es bimodalcon la mayoria de sus datos concentrados por debajo de los 300 Millones.Por el lado del area construida, se observa que los valores se cincentran entre los 40 y 100 \(M^2\), presentando algunos valores atipicos por encima de este rango.

gr <- ggplot(datos_sub, aes(x=precio_millon))
gr <- gr + geom_histogram(aes(fill=..count..), position = 'identity',
                 alpha = 0.8, col='black')
gr <- gr + labs(title = 'Histograma del Precio /n de los apartamento en Valle de Lili (Cali)',
                x = 'Precio',
                y = 'conteos',
                subtitle = 'Valores en Millones')
gr <- gr + theme_classic()
gr <- gr + theme(axis.text.x = element_text(size = 10),
                 plot.title = element_text(size = 10,
                                           face = "bold",
                                           hjust = 0.5),
                 plot.subtitle = element_text(size = 7,
                                           hjust = 0.5,
                                           color = "#696969"),
                 legend.position="left",
                 legend.text = element_text(size = 7),
                 legend.title = element_blank(),
                 strip.background = element_blank())

gr1 <- ggplot(datos_sub, aes(x=Area_contruida))
gr1 <- gr1 + geom_histogram(aes(fill=..count..), position = 'identity',col='black')
gr1 <- gr1 + labs(title = 'Histograma del Area Construida /n de los apartamento en Valle de Lili (Cali)',
                  x = 'Area',
                  y = 'conteos',
                  subtitle = 'Valores en M2')
gr1 <- gr1 + theme_classic()
gr1 <- gr1 + theme(axis.text.x = element_text(size = 10),
                 plot.title = element_text(size = 10,
                                           face = "bold",
                                           hjust = 0.5),
                 plot.subtitle = element_text(size = 7,
                                           hjust = 0.5,
                                           color = "#696969"),
                 legend.position="left",
                 legend.text = element_text(size = 7),
                 legend.title = element_blank(),
                 strip.background = element_blank())


gr + gr1

Quitando los valors atipicos del area construida obtenemos el siguiente histograma

Area_contruida2 <- data.frame(datos_sub$Area_contruida[datos_sub$Area_contruida < 125])
colnames(Area_contruida2) <- 'Area_contruida'
gr1 <- ggplot(Area_contruida2, aes(x=Area_contruida))
gr1 <- gr1 + geom_histogram(aes(fill=..count..), position = 'identity',col='black')
gr1 <- gr1 + labs(title = 'Histograma del Area Construida \n de los apartamento en Valle de Lili (Cali)',
                  x = 'Area',
                  y = 'conteos',
                  subtitle = 'Valores en M2')
gr1 <- gr1 + theme_classic()
gr1 <- gr1 + theme(axis.text.x = element_text(size = 10),
                 plot.title = element_text(size = 10,
                                           face = "bold",
                                           hjust = 0.5),
                 plot.subtitle = element_text(size = 7,
                                           hjust = 0.5,
                                           color = "#696969"),
                 legend.position="left",
                 legend.text = element_text(size = 7),
                 legend.title = element_blank(),
                 strip.background = element_blank())

ggplotly(gr1)

El area presenta una distribución con mayor dispersión.Ademas, los apartamentos en Valle de Lili parecen tener en mayor proporción alrededor de 60, 70, 80 o 90 \(M^2\)

Analisis de variables cualitativas y discretas

datos_sub$piso[(datos_sub$piso == 'NA')] <- NA
datos_sub$piso <- as.factor(as.numeric(datos_sub$piso))


gr1 <- ggplot(datos_sub, aes(x=as.factor(piso)))
gr1 <- gr1 + geom_bar(aes(fill=..count..), position = 'identity',col='black', show.legend = F)
gr1 <- gr1 + geom_text(stat='count', 
                       aes(x = piso, label = ..count..,
                           fontface = 'bold'),
                       position = position_stack(vjust = 0.5))

gr1 <- gr1 + labs(title = 'Piso en el que se encuentra el \n apartamento en Valle de Lili (Cali)',
                  x = 'Numero del piso',
                  y = 'conteos')
gr1 <- gr1 + theme_classic()
gr1 <- gr1 + theme(axis.text.x = element_text(size = 10),
                 plot.title = element_text(size = 10,
                                           hjust = 0.5),
                 plot.subtitle = element_text(size = 7,
                                           hjust = 0.5,
                                           color = "#696969"),
                 legend.position="left",
                 legend.text = element_text(size = 7),
                 legend.title = element_blank(),
                 strip.background = element_blank(),
                 axis.text.y = element_blank(),
                 axis.line.y = element_line(color = "#404040"),
                 axis.ticks.y = element_blank(),
                 axis.title.y = element_blank())


datos_sub$Estrato[(datos_sub$Estrato == 'NA')] <- NA
datos_sub$Estrato <- as.factor(as.numeric(datos_sub$Estrato))

gr2 <- ggplot(datos_sub, aes(x=Estrato))
gr2 <- gr2 + geom_bar(aes(fill=..count..), position = 'identity',col='black', show.legend = F)
gr2 <- gr2 + geom_text(stat='count', 
                       aes(x = Estrato, label = ..count..,
                           fontface = 'bold'),
                       position = position_stack(vjust = 0.5))
gr2 <- gr2 + labs(title = 'Estrato en el que se encuentra el \n apartamento en Valle de Lili (Cali)',
                  x = 'Estrato',
                  y = 'conteos')
gr2 <- gr2 + theme_classic()
gr2 <- gr2 + theme(axis.text.x = element_text(size = 10),
                 plot.title = element_text(size = 10,
                                           hjust = 0.5),
                 plot.subtitle = element_text(size = 7,
                                           hjust = 0.5,
                                           color = "#696969"),
                 legend.position="left",
                 legend.text = element_text(size = 7),
                 legend.title = element_blank(),
                 strip.background = element_blank(),
                 axis.text.y = element_blank(),
                 axis.line.y = element_line(color = "#404040"),
                 axis.ticks.y = element_blank(),
                 axis.title.y = element_blank())

datos_sub$Banos[(datos_sub$Banos == 'NA')] <- NA
datos_sub$Banos <- as.factor(as.numeric(datos_sub$Banos))

gr3 <- ggplot(datos_sub, aes(x=Banos))
gr3 <- gr3 + geom_bar(aes(fill=..count..), position = 'identity',col='black', show.legend = F)
gr3 <- gr3 + geom_text(stat='count', 
                       aes(x = Banos, label = ..count..,),
                       position = position_stack(vjust = 0.5))
gr3 <- gr3 + labs(title = 'Numero de baƱos \n tiene un apartamento en Valle de Lili (Cali)',
                  x = 'Numero de baƱos',
                  y = 'conteos')
gr3 <- gr3 + theme_classic()
gr3 <- gr3 + theme(axis.text.x = element_text(size = 10),
                 plot.title = element_text(size = 10,
                                           hjust = 0.5),
                 plot.subtitle = element_text(size = 7,
                                           hjust = 0.5,
                                           color = "#696969"),
                 legend.position="left",
                 legend.text = element_text(size = 7),
                 legend.title = element_blank(),
                 strip.background = element_blank(),
                 axis.text.y = element_blank(),
                 axis.line.y = element_line(color = "#404040"),
                 axis.ticks.y = element_blank(),
                 axis.title.y = element_blank())

datos_sub$parqueaderos[(datos_sub$parqueaderos == 'NA')] <- NA
datos_sub$parqueaderos <- as.factor(as.numeric(datos_sub$parqueaderos))

gr4 <- ggplot(datos_sub, aes(x=parqueaderos))
gr4 <- gr4 + geom_bar(aes(fill=..count..), position = 'identity',col='black', show.legend = F)
gr4 <- gr4 + geom_text(stat='count', 
                       aes(x = parqueaderos, label = ..count..,
                           fontface = 'bold'),
                       position = position_stack(vjust = 0.5))
gr4 <- gr4 + labs(title = 'Numero de parqueaderos que \n tiene un apartamento en Valle de Lili (Cali)',
                  x = 'Numero de parqueadero',
                  y = 'conteos')
gr4 <- gr4 + theme_classic()
gr4 <- gr4 +theme(axis.text.x = element_text(size = 10),
                 plot.title = element_text(size = 10,
                                           hjust = 0.5),
                 plot.subtitle = element_text(size = 7,
                                           hjust = 0.5,
                                           color = "#696969"),
                 legend.position="left",
                 legend.text = element_text(size = 7),
                 legend.title = element_blank(),
                 strip.background = element_blank(),
                 axis.text.y = element_blank(),
                 axis.line.y = element_line(color = "#404040"),
                 axis.ticks.y = element_blank(),
                 axis.title.y = element_blank())


gr_final <- gr1 + gr2 + gr3 + gr4
gr_final <- gr_final + plot_annotation( title = 'Graficos descriptivos de las variables cualitativas y cuantitativas discretas',
                                        subtitle = 'Graficos de barra')
gr_final <- gr_final + theme(plot.title = element_text(size = 10,
                                           hjust = 0.5),
                 plot.subtitle = element_text(size = 8,
                                           hjust = 0.5,
                                           color = "#696969"),
                 strip.background = element_blank())


gr_final

Las ofertas de apartamentos en Valle de Lili se encuentra al parecer ubicado en los estratos 4 y 5, con 2 baƱos y un parqueadero. Evidenciamos un gran numero de ofertas sin informacion del piso donde esta ubicado y el numero de paqueadero.

Analisis Bivariado

agrupacion <- group_by(datos_sub, Estrato, Banos)%>%
summarise(conteo = n()) %>%
mutate(total = as.numeric(sum(conteo)))

agrupacion <- data.frame(agrupacion)
agrupacion$participacion <- agrupacion$conteo / agrupacion$total
colnames(agrupacion) <- c("Estrato",'Banos',"Conteo","Total","participacion")
agrupacion <- agrupacion[,c("Estrato",'Banos', "participacion")]
agrupacion$Banos <- as.factor(agrupacion$Banos)
agrupacion$Estrato <- as.factor(agrupacion$Estrato)

gr <- ggplot(data = agrupacion, aes(x = Estrato, y = participacion, fill = as.factor(Banos) ))
gr <- gr + geom_bar(stat = "identity",
                    position = "stack",
                    show.legend = T)
gr <- gr + geom_text(position = position_stack(vjust = 0.5),
                     size =4, 
                     show.legend = F,
                     aes(x = Estrato, y = (participacion),
                         label = percent(participacion, accuracy = 0.1),
                         colour = as.factor(Banos)))

gr <- gr + scale_colour_manual(values = c('white','white','white'))
gr <- gr + theme_classic()
gr <- gr + scale_fill_manual(values = c('#00126B','#073C82','#065578'))
gr <- gr + labs(title = 'Grafico de barras',
                subtitle = 'Estrato Vs Numero de baƱos',
                x = 'Estrato')
gr <- gr + guides(color = FALSE, fill = guide_legend(nrow = 1, title = 'Numero de BaƱos'))
gr <- gr + theme(axis.text.y = element_blank(),
                 axis.line.y = element_line(color = "#404040"),
                 axis.ticks.y = element_blank(),
                 plot.title = element_text(face = "bold",
                                           size = 12,
                                           hjust = 0.5),
                 plot.subtitle = element_text(size = 10,
                                           hjust = 0.5),
                 axis.title.y = element_blank(),
                 legend.position="bottom",
                 legend.title = element_text( size = 10),
                 legend.key.size = unit(0.5, "cm"),
                 legend.key.width = unit(0.5,"cm"),
                 legend.text = element_text( size = 10))
gr

Las ofertas de apartamentos en valle de lili que se encuentran en estrato 2, en mayor proporción tienen 2 baños, los de estrato 4 presentan 3 baños.

agrupacion <- group_by(datos_sub, Estrato)%>%
summarise(n_Registros = n(),
          Promedio_Precio = round(mean(precio_millon),2),
          Mediana_Precio = round(median(precio_millon),2),
          Promedio_Area = round(mean(Area_contruida),2),
          Mediana_Area = round(median(Area_contruida),2))

Area_contruida2 <- data.frame(datos_sub[datos_sub$Area_contruida < 125,])

agrupacion1 <- group_by(Area_contruida2, Estrato)%>%
summarise( n_Registros_Area_Sin_Atipicos = n(),
           Promedio_Area_Sin_Atipicos = round(mean(Area_contruida),2),
           Mediana_Area_Sin_Atipicos = round(median(Area_contruida),2))

agrupacion <- cbind(data.frame(agrupacion), data.frame(agrupacion1)[,-1])
colnames(agrupacion)[c(7,8,9)] <- c('n_Registros_Area_Sin_Atipicos', 'Promedio_Area_Sin_Atipicos', 'Mediana_Area_Sin_Atipicos')

agrupacion <- rbind(colnames(agrupacion),agrupacion)

agrupacion <- as.data.frame(t(agrupacion))
agrupacion[1,1] <- 'Descriptiva'

ft.var.final <- regulartable(agrupacion) 
ft.var.final <- align(ft.var.final, align = "center", part = "all" ) 
ft.var.final <- border(ft.var.final,
                       border = fp_border(width = 0.6,
                                          color = "gray"),
                       border.left = fp_border(width = 0.6,
                                               color = "#4F81BD"),
                       part = "body")
ft.var.final <- delete_part(ft.var.final, part = "header") 
ft.var.final <- bg(ft.var.final, bg = "#006394", i = 1)
ft.var.final <- color(ft.var.final, color = "white", i = 1)
ft.var.final <- bold(ft.var.final, i = 1)
ft.var.final 

A mayor estrato de las ofertas mayor es el area construida y de la misma forma mayor es el precio del apartamento ofrecido.

Por ultimo, con la informacion disponible de las coordenadas de latitud y longitud se realiza el grafico de un mapa ubicando cada una de ellas. Nos encontramos, que por la referenciacon geograficas muchas de las ofertas no pertenecen al barrio valle de Lili, sino a ubicaciones mas distantes del mismo.

leaflet()%>% addCircleMarkers(lng = datos_sub$cordenada_longitud,
                              lat = datos_sub$Cordenada_latitud,
                              radius = 0,2,
                              color = "black",
                              label = datos_sub$id) %>% addTiles()

Por ultimo para analizar la relación del precio con el area construida, se realiza una recta de regresión lineal, donde se evidencia que a mayor el area construida mayor es el costo de la vivienda.

gr <- ggplot(datos_sub, aes(y= precio_millon, x = Area_contruida))
gr <- gr + geom_point() 
gr <- gr + geom_smooth()
gr <- gr + theme_classic()
gr <- gr + labs(title = 'Grafico de Dispersión',
                subtitle = 'Precio Vs. Area Construida',
                x = 'Area Construida',
                y = 'Precio en millones')

gr <- gr + theme(axis.text.y = element_blank(),
                 axis.line.y = element_line(color = "#404040"),
                 axis.ticks.y = element_blank(),
                 plot.title = element_text(face = "bold",
                                           size = 12,
                                           hjust = 0.5),
                 plot.subtitle = element_text(size = 10,
                                           hjust = 0.5),
                 axis.title.y = element_blank(),
                 legend.position="bottom",
                 legend.title = element_text( size = 10),
                 legend.key.size = unit(0.5, "cm"),
                 legend.key.width = unit(0.5,"cm"),
                 legend.text = element_text( size = 10))

ggplotly(gr)
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'

Quitando el dato atipoco tenemos lo siguiente:

Area_contruida2 <- data.frame(datos_sub[datos_sub$Area_contruida < 125,])

gr <- ggplot(Area_contruida2, aes(y= precio_millon, x = Area_contruida))
gr <- gr + geom_point() 
gr <- gr + geom_smooth()
gr <- gr + theme_classic()
gr <- gr + labs(title = 'Grafico de Dispersión - Precio Vs. Area Construida',
                x = 'Area Construida',
                y = 'Precio en millones')

gr <- gr + theme(axis.line.y = element_line(color = "#404040"),
                 axis.ticks.y = element_blank(),
                 plot.title = element_text(face = "bold",
                                           size = 12,
                                           hjust = 0.5),
                 plot.subtitle = element_text(size = 10,
                                           hjust = 0.5))

ggplotly(gr)