Commit 5bd1df3d authored by numeroteca's avatar numeroteca

busca registros (license) de 5 cifras únicamente, gráficos de barraslicencias por distrito

parent 6681941f
# load libraries
library(tidyverse) library(tidyverse)
datos <- read.csv("./data/original/airbnb/190227/listings_valencia_insideairbnb.csv")
# Selecciona variables de configuración
# región/lugar, fechas a analizar...
local_activo_name <- "Valencia"
fecha <- "2019-02-27" # date last scraping
fecha_simple <- "Febrero 2019"
caption_1 <- paste("Datos: InsideAIrbnb ", fecha_simple ,". Info: lab.montera34.com", sep = "")
# Cargamos los datos de insideairbnb # Cargamos los datos de insideairbnb
datos <- read.csv("./data/original/airbnb/190227/listings_valencia_insideairbnb.csv")
# Clasificamos si tiene o no licencia
datos <- datos %>% mutate(legal = ifelse(license =="","Sin licencia","Con licencia")) datos <- datos %>% mutate(legal = ifelse(license =="","Sin licencia","Con licencia"))
# seleccionamos los apartamentos enteros # seleccionamos los apartamentos enteros
datos2 <- datos %>% filter(room_type=="Entire home/apt") datos2 <- datos %>% filter(room_type=="Entire home/apt")
# plots básicos -------------------------------------
# grafico barras licencias/no licencias # grafico barras licencias/no licencias
ggplot(datos2,aes(neighbourhood,fill=legal)) + ggplot(datos2,aes(neighbourhood,fill=legal)) +
geom_bar() + geom_bar() +
...@@ -43,22 +54,77 @@ ggplot(datos2,aes(neighbourhood)) + ...@@ -43,22 +54,77 @@ ggplot(datos2,aes(neighbourhood)) +
y="Neighbourhood") + y="Neighbourhood") +
coord_flip() coord_flip()
# identifica numero de 5 cifras como licencia
# barras por distrito. reordena por cantidad de anuncios -------------
# reorder levels of factor
datos2$legal <- as.factor(datos2$legal)
levels(datos2$legal)
datos2$legal <- factor(datos2$legal, levels= c("Sin licencia","Con licencia" ))
levels(datos2$legal)
datos2 %>% group_by(neighbourhood,legal) %>% summarise( anuncios = n()) %>%
ggplot(aes(reorder(neighbourhood,anuncios),anuncios,fill=legal)) +
geom_col()+ # geom_col(position = "fill")+
geom_text(data = datos2 %>% group_by(neighbourhood,legal) %>% summarise( anuncios = n()),
aes(label = anuncios, group=legal),
position = position_stack(vjust = 0.5), hjust = 0.4,
size=3,color="#000000") +
coord_flip() +
labs(title="Distribución de licencias por distrito de viviendas completas",
subtitle = paste("Airbnb en ", local_activo_name, ". ",fecha_simple,".",sep=""),
x="distrito",
y="anuncios",
caption = caption_1,
fill="") +
theme_minimal(base_family = "Roboto Condensed", base_size = 14) +
theme(
panel.grid.minor.y = element_blank(),
panel.grid.major.y = element_blank(),
legend.position = "top"
)
# gráfico anterior sobre 100 de cada barra ----------------------
datos2 %>% group_by(neighbourhood,legal) %>% summarise( anuncios = n()) %>%
ggplot(aes(reorder(neighbourhood,anuncios),anuncios,fill=legal)) +
geom_col(position = "fill") +
geom_hline(yintercept=0.5,size=0.5,linetype=2) +
# geom_text(data = datos2 %>% group_by(neighbourhood,legal) %>% summarise( anuncios = n()),
# aes(label = anuncios, group=legal),
# position = position_stack(vjust = 0.5), hjust = 0.4,
# size=3,color="#000000") +
coord_flip() +
labs(title="Distribución de licencias por distrito de viviendas completas",
subtitle = paste("Airbnb en ", local_activo_name, ". ",fecha_simple,".",sep=""),
x="distrito",
y="anuncios",
caption = caption_1,
fill="") +
theme_minimal(base_family = "Roboto Condensed", base_size = 14) +
theme(
panel.grid.minor.y = element_blank(),
panel.grid.major.y = element_blank(),
legend.position = "top"
)
# identifica numero de 5 cifras como licencia -----------------
library(stringr) library(stringr)
# nos quedmos con apartamentos enteros # nos quedamos con apartamentos enteros
datos2 <- datos %>% filter(room_type=="Entire home/apt") # datos2 <- datos %>% filter(room_type=="Entire home/apt")
# Detecta si existe código alfanumérico que sea como un número de registro de 3 a 5 cifras
datos2 <- datos2 %>% mutate(legal_note1 = ifelse(is.na(str_extract(notes,"[:punctuation:]?[:blank:]?\\d{3,5}")),"","Con licencia")) datos2 <- datos2 %>% mutate(legal_note1 = ifelse(is.na(str_extract(notes,"[:punctuation:]?[:blank:]?\\d{3,5}")),"","Con licencia"))
datos2 <- datos2 %>% mutate(legal_note2 = ifelse(is.na(str_extract(name,"[:punctuation:]?[:blank:]?\\d{3,5}")),"","Con licencia")) datos2 <- datos2 %>% mutate(legal_note2 = ifelse(is.na(str_extract(name,"[:punctuation:]?[:blank:]?\\d{3,5}")),"","Con licencia"))
datos2 <- datos2 %>% mutate(legal_note3 = ifelse(is.na(str_extract(summary,"[:punctuation:]?[:blank:]?\\d{3,5}")),"","Con licencia")) datos2 <- datos2 %>% mutate(legal_note3 = ifelse(is.na(str_extract(summary,"[:punctuation:]?[:blank:]?\\d{3,5}")),"","Con licencia"))
datos2 <- datos2 %>% mutate(legal_note4 = ifelse(is.na(str_extract(description,"[:punctuation:]?[:blank:]?\\d{3,5}")),"","Con licencia")) datos2 <- datos2 %>% mutate(legal_note4 = ifelse(is.na(str_extract(description,"[:punctuation:]?[:blank:]?\\d{3,5}")),"","Con licencia"))
datos2 <- datos2 %>% mutate(legal_note5 = ifelse(is.na(str_extract(space,"[:punctuation:]?[:blank:]?\\d{3,5}")),"","Con licencia")) datos2 <- datos2 %>% mutate(legal_note5 = ifelse(is.na(str_extract(space,"[:punctuation:]?[:blank:]?\\d{3,5}")),"","Con licencia"))
datos2 <- datos2 %>% mutate(legal_note = ifelse(legal=="Con licencia" | legal_note1=="Con licencia" | legal_note2=="Con licencia" | legal_note3=="Con licencia" | legal_note4=="Con licencia" | legal_note5=="Con licencia", # Recopila los que tengan número de registro en algún apartado
datos2 <- datos2 %>% mutate(legal_note = ifelse(legal=="Con licencia" | legal_note1=="Con licencia" | legal_note2=="Con licencia" |
legal_note3=="Con licencia" | legal_note4=="Con licencia" | legal_note5=="Con licencia",
"Con licencia", "Sin licencia")) "Con licencia", "Sin licencia"))
datos2 %>% group_by(legal) %>% count() datos2 %>% group_by(legal) %>% count()
datos2 %>% group_by(legal_note) %>% count() datos2 %>% group_by(legal_note) %>% count()
...@@ -86,45 +152,137 @@ ggplot(datos2,aes(neighbourhood)) + ...@@ -86,45 +152,137 @@ ggplot(datos2,aes(neighbourhood)) +
y="Neighbourhood") + y="Neighbourhood") +
coord_flip() coord_flip()
# comprobando si funciona
# test <- datos2[!datos2$legal_note1=="",c("notes","legal_note1")]
# test <- datos2[!datos2$legal_note2=="",c("name","legal_note2")]
# test <- datos2[!datos2$legal_note3=="",c("summary","legal_note3")]
# test <- datos2[!datos2$legal_note4=="",c("description","legal_note4")]
# test <- datos2[!datos2$legal_note5=="",c("space","legal_note5")]
# Mejora de sistema de detección---------------------------------------------------------------------------------------------
# Este sistema es demasiado permisivo y detecta números de 3 cifras y 4 que nos son números de registro
# guarda los números de registro en una variable. Ahora forzamos a que sean 5 cifras seguidas.
datos2$registro.detect <- str_extract(datos2$notes,"[:punctuation:]?[:blank:]?\\d{5}")
# solamente guarda donde esté vacío
datos2[is.na(datos2$registro.detect),]$registro.detect <- str_extract(datos2[is.na(datos2$registro.detect),]$name,"[:punctuation:]?[:blank:]?\\d{5}")
datos2[is.na(datos2$registro.detect),]$registro.detect <- str_extract(datos2[is.na(datos2$registro.detect),]$summary,"[:punctuation:]?[:blank:]?\\d{5}")
datos2[is.na(datos2$registro.detect),]$registro.detect <- str_extract(datos2[is.na(datos2$registro.detect),]$description,"[:punctuation:]?[:blank:]?\\d{5}")
datos2[is.na(datos2$registro.detect),]$registro.detect <- str_extract(datos2[is.na(datos2$registro.detect),]$space,"[:punctuation:]?[:blank:]?\\d{5}")
# guarda el campo licencia en los lugares donde este vacio
datos2[is.na(datos2$registro.detect),]$registro.detect <- as.character(datos2[is.na(datos2$registro.detect),]$license)
# datos2[!is.na(datos2$registro.detect),]$registro.detect
# test2 <- datos2[,c("license","registro.detect")]
# datos2[197,c("summary","description","space")]
library(gsubfn) # select text in the parenthesis with regex
# Extrae las 5 cifrasa nueva vaiable
datos2$registro.num <-as.character( strapplyc( datos2$registro.detect, ".*(\\d{5}).*", simplify = TRUE))
datos2[datos2$registro.detect=="" & datos2$license=="",]$registro.num <- "no tiene"
# test2 <- datos2[,c("license","registro.detect","registro.num")]
# Convierte los characcter(0) en NA
# test2[test2$registro.detect=="" & test2$license=="",]$registro.num <- "no tiene"
# test2$registro.num <- as.character(test2$registro.num)
# table(as.factor(test2$registro.num))
datos2 <- datos2 %>% mutate(legal_number = ifelse(registro.num =="no tiene","Sin licencia","Con licencia"))
datos2 %>% group_by(legal) %>% count() # 2457 sin licencia
datos2 %>% group_by(legal_note) %>% count() # 1585 sin licencia, pero el valor es erróneo
datos2 %>% group_by(legal_number) %>% count() # 2325 sin licencia, valor más ajustado
# plots barras -----------------
# reorder levels of factor
datos2$legal_number <- as.factor(datos2$legal_number)
levels(datos2$legal_number)
datos2$legal_number <- factor(datos2$legal_number, levels= c("Sin licencia","Con licencia" ))
levels(datos2$legal_number)
png(filename=paste("images/airbnb/registrados/anuncios-por-distrito-valencia-con-licencia-filtro2.png", sep = ""),width = 900,height = 600)
datos2 %>% group_by(neighbourhood,legal_number) %>% summarise( anuncios = n()) %>%
ggplot(aes(reorder(neighbourhood,anuncios),anuncios,fill=legal_number)) +
geom_col()+ # geom_col(position = "fill")+
geom_text(data = datos2 %>% group_by(neighbourhood,legal_number) %>% summarise( anuncios = n()) %>% filter(anuncios > 45),
aes(label = anuncios, group=legal_number),
position = position_stack(vjust = 0.5), hjust = 0.4,
size=4,color="#FFFFFF") +
coord_flip() +
labs(title="Anuncios de viviendas completas con número de registro publicado por distrito",
subtitle = paste("Airbnb en ", local_activo_name, ". ",fecha_simple,". Filtrado 2.",sep=""),
x="distrito",
y="anuncios",
caption = caption_1,
fill="") +
theme_minimal(base_family = "Roboto Condensed", base_size = 18) +
theme(
panel.grid.minor.y = element_blank(),
panel.grid.major.y = element_blank(),
legend.position = "top"
)
dev.off()
png(filename=paste("images/airbnb/registrados/anuncios-por-distrito-valencia-con-licencia-porcentaje-filtro2.png", sep = ""),width = 900,height = 600)
datos2 %>% group_by(neighbourhood,legal_number) %>% summarise( anuncios = n()) %>%
ggplot(aes(reorder(neighbourhood,anuncios),anuncios,fill=legal_number)) +
geom_col(position = "fill")+
geom_hline(yintercept=0.5,size=0.5,linetype=2) +
# geom_text(data = datos2 %>% group_by(neighbourhood,legal_number) %>% summarise( anuncios = n()),
# aes(label = anuncios, group=legal_number),
# position ="fill", hjust = -0.5,
# size=3,color="#000000") +
coord_flip() +
labs(title="Proporción de anuncios de viviendas completas con número de registro por distrito",
subtitle = paste("Airbnb en ", local_activo_name, ". ",fecha_simple,". Filtrado 2.",sep=""),
x="distrito",
y="porcentaje",
caption = caption_1,
fill="") +
theme_minimal(base_family = "Roboto Condensed", base_size = 18) +
theme(
panel.grid.minor.y = element_blank(),
panel.grid.major.y = element_blank(),
legend.position = "top"
)
dev.off()
# Filtrado por activos ----------------------------------------------------------------------------------
# nos quedmos con apartamentos enteros y numero de reviews cero y tasa de respuesta del host 0 (indicadores de apartamento inactivo) # nos quedmos con apartamentos enteros y numero de reviews cero y tasa de respuesta del host 0 (indicadores de apartamento inactivo)
# datos3 <- datos2 %>% filter(number_of_reviews!=0 & host_response_rate!=0)
datos3 <- datos2 %>% filter(number_of_reviews!=0 & host_response_rate!=0) datos3 <- datos2 %>% filter(number_of_reviews!=0 & host_response_rate!=0)
datos3 <- datos3 %>% mutate(legal_note1 = ifelse(is.na(str_extract(notes,"[:punctuation:]?[:blank:]?\\d{3,5}")),"","Con licencia")) # datoswwwww <- datos %>% filter(number_of_reviews!=0 & host_response_rate!=0)
datos3 <- datos3 %>% mutate(legal_note2 = ifelse(is.na(str_extract(name,"[:punctuation:]?[:blank:]?\\d{3,5}")),"","Con licencia"))
datos3 <- datos3 %>% mutate(legal_note3 = ifelse(is.na(str_extract(summary,"[:punctuation:]?[:blank:]?\\d{3,5}")),"","Con licencia"))
datos3 <- datos3 %>% mutate(legal_note4 = ifelse(is.na(str_extract(description,"[:punctuation:]?[:blank:]?\\d{3,5}")),"","Con licencia"))
datos3 <- datos3 %>% mutate(legal_note5 = ifelse(is.na(str_extract(space,"[:punctuation:]?[:blank:]?\\d{3,5}")),"","Con licencia"))
datos3 <- datos3 %>% mutate(legal_note = ifelse(legal=="Con licencia" | legal_note1=="Con licencia" | legal_note2=="Con licencia" | legal_note3=="Con licencia" | legal_note4=="Con licencia" | legal_note5=="Con licencia", datos3 %>% group_by(legal_number) %>% count() # 1.905 sin licencia y que están activos
"Con licencia", "Sin licencia"))
datos3 %>% group_by(legal_note) %>% count()
write.csv(datos3,"datos_licencias_activos.csv") write.csv(datos3,"datos_licencias_activos.csv")
# grafico anterior girando ejes # Plots básicos
ggplot(datos3,aes(neighbourhood,fill=legal_note)) + # # grafico anterior girando ejes
geom_bar() + # ggplot(datos3,aes(neighbourhood,fill=legal_note)) +
labs(title="Distribución de licencias activos revisadas por barrio", # geom_bar() +
x= "Licencias revisadas", # labs(title="Distribución de licencias activos revisadas por barrio",
y="Neighbourhood") + # x= "Licencias revisadas",
geom_text(stat='count',aes(label=..count..), # y="Neighbourhood") +
position = "stack", # geom_text(stat='count',aes(label=..count..),
vjust=1, # position = "stack",
hjust=1, # vjust=1,
size=3, # hjust=1,
color="black") + # size=3,
coord_flip() # color="black") +
# coord_flip()
# grafico anterior sobre 100% cada barra #
ggplot(datos3,aes(neighbourhood)) + # # grafico anterior sobre 100% cada barra
geom_bar(aes(fill=legal_note),position="fill") + # ggplot(datos3,aes(neighbourhood)) +
labs(title="Distribución de licencias activos revisadas por barrio", # geom_bar(aes(fill=legal_note),position="fill") +
x= "Licence revisadas", # labs(title="Distribución de licencias activos revisadas por barrio",
y="Neighbourhood") + # x= "Licence revisadas",
coord_flip() # y="Neighbourhood") +
# coord_flip()
#### scrapping de licencias #### scrapping de licencias
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment