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 |
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
Descriptiva | precio_millon | Area_contruida |
n | 843 | 843 |
Minimo | 108 | 40 |
1er Cuarti | 165 | 60 |
Mediana | 225 | 72 |
Media | 224.57 | 74.98 |
3er Cuartil | 260 | 84 |
Maximo | 415 | 932 |
SD | 64.27 | 33.12 |
AsimetĆa | 0.49 | 20.61 |
Curtosis | 2.75 | 532.97 |
CV | 28.62 | 44.17 |
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\)
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.
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
Descriptiva | 3 | 4 | 5 | 6 |
n_Registros | 2 | 501 | 336 | 4 |
Promedio_Precio | 167.5 | 198.47 | 262.37 | 347.5 |
Mediana_Precio | 167.5 | 190 | 250 | 365 |
Promedio_Area | 61 | 68.57 | 84.26 | 104.5 |
Mediana_Area | 61 | 65 | 82 | 110 |
n_Registros_Area_Sin_Atipicos | 2 | 501 | 335 | 3 |
Promedio_Area_Sin_Atipicos | 61 | 68.57 | 81.73 | 97.67 |
Mediana_Area_Sin_Atipicos | 61 | 65 | 82 | 110 |
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)