Skip to content
Permalink
Branch: master
Find file Copy path
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
347 lines (259 sloc) 17 KB
---
title: "Efecto Airbnb en Bilbao"
output: html_document
---
```{r setup, include=FALSE, cache = TRUE}
# Este documento en Rmarkdown está pensado para producir un informe a partir de datos de Airbnb de InsideAirbnb.com (http://insideairbnb.com/)
# Selecciona región/lugar a analizar en las dos siguientes variables
local_activo_name = "Bilbao" #cambia 'Zarautz' por el municipio que quieras analizar
# Instala y carga librerías
# la primera vez necesitas instalar
# install.packages("tidyverse")
library(tidyverse)
# library(ggplot2) #ya incluido en tidyverse
# library(dplyr) #ya incluido en tidyverse
# carga librería para reagrupar tablas de datos y hacer "melt"
# library("reshape2") #no sé la diferencia con "reshape"
# Carga datos
# introduce el path de tu archivo listings. Necesitas desactivar Quotes, porque el texto incluye \"
listings <- read.delim("../../data/listings_euskadi.tsv",sep = "\t") # Algo no funciona, por incluir comillas en los textos. Salen 3453 pero deberían ser 2847 anuncios.
listings_simple <- read.delim("../../data/listings_euskadi_simple.csv",sep = ",")
# Load reviews
reviews <- read.csv("../../data/original/reviews_euskadi.csv",sep = ",")
attach(listings_simple)
# Selecciona archivo listings
local_activo = listings_simple[listings_simple$city==local_activo_name,]
attach(local_activo)
```
Este informe se ha generado automáticamente con R a partir del [script de Rmarkdown](https://github.com/montera34/airbnbeuskadi/tree/master/analisis/montera34/airbnb-informe-ciudad.Rmd) disponible en el [repositorio airbnbeuskadi](https://github.com/montera34/airbnbeuskadi/).
## Datos
+ InsideAirbnb.com/euskadi
+ Fecha scraping: 2017-03-24
## Resumen
En **`r local_activo_name`** hay publicados `r nrow(local_activo)` anuncios de Airbnb, que tienen capacidad para `r sum(na.omit(local_activo$accommodates)) ` personas (accommodates).
De esos anuncios `r nrow(local_activo[local_activo$withlicense==TRUE,])` han sido dados de alta en el Registro de Empresas Turísticas del Gobierno Vasco (lo que supone un `r format(round(100*nrow(local_activo[local_activo$withlicense==TRUE,])/nrow(local_activo), 1), nsmall = 1)` % del municipio).
Estos anuncios (listings, en la terminología de Airbnb) han sido publicados por `r length(levels(as.factor(local_activo$host_id)))` anfitriones.
```{r, echo = FALSE, warning=FALSE}
library(ggplot2)
ggplot(local_activo) + geom_bar(mapping = aes(x = requires_license, fill = withlicense)) + labs(title= "Número alojamientos sin y con registro", y = "anuncios", x = "con/sin registro") + coord_flip() + scale_fill_discrete(name="Experimental\nCondition", breaks=c("ctrl","wdw"), labels=c("Control", "Treatment 1"))
ggplot(local_activo) + geom_bar(mapping = aes(x = room_type, fill = withlicense)) + labs(title= "Nº alojamientos según tipo de habitación y con/sin registro", y = "anuncios", x = "" ) + coord_flip()
ggplot(local_activo) + geom_bar(mapping = aes(x = property_type, fill = withlicense)) + labs(title= "Nº alojamientos según tipo de alojamiento y con/sin registro" ) + coord_flip()
ggplot(local_activo) + geom_bar(mapping = aes(x = accommodates, fill = withlicense)) + labs(title= "Número alojamientos según sus plazas sin y con registro" ) + facet_wrap(~ withlicense, ncol= 2) + coord_flip()
# add this for nicer y axis
# + scale_x_continuous(breaks=seq(0,12,1))
ggplot(local_activo) + geom_bar(mapping = aes(x = accommodates, fill = withlicense)) + labs(title= "Número alojamientos según su nº de plazas sin y con registro" ) + scale_x_continuous(breaks=seq(0,16,1)) + coord_flip()
```
## Anfitriones en Airbnb
```{r, echo = FALSE, warning=FALSE}
# To change plot order of bars, change levels in underlying factor
reorder_size <- function(x) {
factor(x, levels = names(sort(table(x))))
}
ggplot(local_activo) +geom_bar(mapping = aes(reorder_size(host_id), fill = withlicense)) + coord_flip() + theme(axis.text.y = element_blank()) + labs(y = "Número de anuncios", x = "anfitrion")
# Otra forma de hacer lo mismo
nanuncios <- table(local_activo$host_id) #crea tabla con frecuencias (count) de anfitriones (host_id) con anuncios
nanuncios <- nanuncios[order(-nanuncios)] #reordena de mayor a menor
anfitriones_anuncios <- data.frame(nanuncios) # crea data frame
anfitriones_anuncios$host_id <- row.names(nanuncios)
# gráfico (repite el anterior, por eso está comentado)
# ggplot(anfitriones_anuncios) + geom_bar(stat='identity', aes(x = host_id, y = Freq)) + labs(x = "Número de anuncios", y = "anfitrion") + coord_flip()
# exporta datos a csv
# write.csv(propietarios, "data/output/propietarios_id_n_alojamientos_donostia.csv")
```
### Los anfitriones con más alojamientos
```{r table_propietarios, echo = FALSE, warning=FALSE}
# install package "knitr" and "rmarkdown" if not installed
# install.packages("knitr")
# install.packages("rmarkdown")
# Load "knitr"
library(knitr,quietly=T)
propietarios <- table(local_activo$host_id) #crea tabla con frecuencias (count) de anfitriones (host_id) con anuncios
propietarios <- propietarios[order(-propietarios)] #reordena de mayor a menor
propietarios_nalojamientos <- data.frame(propietarios) # crea data frame
kable(as.data.frame(propietarios_nalojamientos[1:20,]),caption = "Los 20 anfitriones con más alojamientos (id)",col.names = c("host_id","alojamientos"))
# nalojamientos <- donostia %>%
# group_by(host_id) %>%
# summarize(sum.alojamientos=count(requires_license)) %>%
# arrange(desc(sum.alojamientos))
# kable(nalojamientos[1:20,],caption = "Los 20 anfitriones con más alojamientos (id)")
```
### Los anfitriones con más plazas
```{r table_anfitriones_2, echo = FALSE, warning=FALSE}
library(dplyr)
# 1: filter to keep three states.
# basic_summ = filter(mprices, state %in% c("California", "New York", "Illinois"))
# 2: set up data frame for by-group processing.
naccommodates = group_by(local_activo, host_id)
# 3: calculate the three summary metrics
naccommodates = summarise( naccommodates, accommodates_sum = sum(accommodates) )
naccommodates <- naccommodates[with(naccommodates, order(-accommodates_sum)), ]
ggplot(naccommodates) +
geom_bar(stat='identity', aes(x = reorder(host_id,accommodates_sum), y = accommodates_sum)) + coord_flip() + theme(axis.text.y = element_blank()) +
labs(x = "anfitriones", y = "nº anuncios", title= "número de plazas por anfitrión" )
# + scale_y_continuous(breaks=seq(0,300,10))
```
Los 10 primeros anfitriones (`r format(round(100*10/length(levels(as.factor(local_activo$host_id))), 1), nsmall = 1)`% del total de anfitriones) con más plazas tienen `r sum(naccommodates[1:10,2])` plazas disponibles (que son el `r format(round(100*sum(naccommodates[1:10,2])/sum(local_activo$accommodates), 1), nsmall = 1)`% del total de plazas).
Los 20 primeros anfitriones (`r format(round(100*20/length(levels(as.factor(local_activo$host_id))), 1), nsmall = 1)`% del total de anfitriones) con más plazas tienen `r sum(naccommodates[1:20,2])` plazas disponibles (que son el `r format(round(100*sum(naccommodates[1:20,2])/sum(local_activo$accommodates), 1), nsmall = 1)`% del total de plazas).
Los 50 primeros anfitriones (`r format(round(100*50/length(levels(as.factor(local_activo$host_id))), 1), nsmall = 1)`% del total de anfitriones) con más plazas tienen `r sum(naccommodates[1:50,2])` plazas disponibles (que son el `r format(round(100*sum(naccommodates[1:50,2])/sum(local_activo$accommodates), 1), nsmall = 1)`% del total de plazas).
Los 100 primeros anfitriones (`r format(round(100*100/length(levels(as.factor(local_activo$host_id))), 1), nsmall = 1)`% del total de anfitriones) con más plazas tienen `r sum(naccommodates[1:100,2])` plazas disponibles (que son el `r format(round(100*sum(naccommodates[1:100,2])/sum(local_activo$accommodates), 1), nsmall = 1)`% del total de plazas).
```{r table_anfitriones_3, echo = FALSE}
kable(naccommodates[1:30,],caption = "Los 30 anfitriones (host_id) con más alojamientos tienen n plazas (accomodates)",col.names = c("host_id","plazas"))
```
### Número de reviews por cada alojamiento
```{r, echo = FALSE, warning=FALSE}
# TODO: hace falta filtrar las reviews por los listings que están presentes en el municipio analizado
# Selecciona las reviews de los listings que están local_activo
reviews_activo = reviews[(reviews$listing_id %in% local_activo$id),]
nreviews <- table(reviews_activo$listing_id) #crea tabla con frecuencias (count) de anfitriones (host_id) con anuncios
nreviews <- nreviews [order(-nreviews)] #reordena de mayor a menor
reviews_listings <- data.frame(nreviews) # crea data frame
reviews_listings$listing_id <- row.names(nreviews) # this value is the variable "number_of_reviews" in the listings file
# gráfico
# Imprime el número de reviews de todos los pisos que tienen reviews en local_activo
ggplot(reviews_listings) + geom_bar(stat='identity', aes(x = reorder(listing_id,-Freq), y = Freq)) + labs(y = "Número de reviews", x = "anuncios (id)") + coord_flip()
# Imprime el número de reviews de todos los pisos incluso los que tienen 0 reviews
ggplot(local_activo) + geom_bar(stat='identity', aes(x = reorder(id,-number_of_reviews), y = number_of_reviews)) + labs(y = "Número de reviews", x = "anuncios (id)") + coord_flip()
ggplot(local_activo) + geom_point(mapping = aes(x = reviews_per_month, y = number_of_reviews, fill = accommodates))
ggplot(local_activo) + geom_point(mapping = aes(x = host_listings_count, y = number_of_reviews, fill = accommodates))
ggplot(local_activo) + geom_point(mapping = aes(x = availability_365, y = number_of_reviews, fill = accommodates))
# exporta datos a csv
# write.csv(reviews_listings, "data/output/reviews_by_listing_.csv")
```
### Precio por noche
```{r, echo = FALSE, warning=FALSE}
# ggplot(local_activo) + geom_bar(mapping = aes(reorder_size(price), fill = withlicense)) + coord_flip() + labs(x = "precio", y = "nº anuncios", title= "número de anuncios con un determinado precio por noche ($)" )
ggplot(local_activo) + geom_bar(mapping = aes(x = precio, fill = withlicense)) + coord_flip() + labs(x = "precio", y = "nº anuncios", title= "número de anuncios con un determinado precio por noche ($)" )
ggplot(local_activo) + geom_point(mapping = aes(precio, y = accommodates, color = withlicense), position = "jitter") + coord_flip() + labs(x = "precio", y = "plazas por anuncio", title= "número de anuncios con un determinado precio por noche ($) vs plazas" )
# ggplot(local_activo) + geom_point(mapping = aes(x = precio, y = accommodates, color = withlicense), position = "jitter") + coord_flip()
# median(na.omit(precio))
# mean(na.omit(precio))
# quantile(na.omit(precio))
#
# boxplot(na.omit(precio), horizontal=TRUE)
#
# hist(na.omit(precio))
#
# # Filled Density Plot
# d <- density(na.omit(precio))
# plot(d, main="Kernel Density of prices. Todos", xlim = c(0,1000), ylim = c(0,0.01))
# polygon(d, col="grey", border="grey")
#
# d <- density(na.omit(precio[withlicense==TRUE]))
# plot(d, main="Kernel Density of prices con registro", xlim = c(0,1000), ylim = c(0,0.01))
# polygon(d, col="grey", border="grey")
#
# d <- density(na.omit(precio[withlicense==FALSE]))
# plot(d, main="Kernel Density of prices sin registro", xlim = c(0,1000), ylim = c(0,0.01))
# polygon(d, col="grey", border="grey")
```
```{r, echo = FALSE, warning=FALSE}
# # Dotplot: Grouped Sorted and Colored
# # Sort by mpg, group and color by cylinder
# x <- local_activo[order(local_activo$precio),] # sort by precio
# x$property_type <- factor(x$property_type) # it must be a factor
# x$color[x$property_type=="Apartment"] <- "red"
# x$color[x$property_type=="House"] <- "blue"
# x$color[x$property_type=="Villa"] <- "darkgreen"
# dotchart(x$precio,labels=row.names(x),cex=.7,groups= x$property_type,
# main="Precio por noche por tipo de alojamiento",
# xlab="dollars", gcolor="black", color=x$color)
#
#
# y <- local_activo[order(local_activo$precio),] # sort by mpg
# y$withlicense <- factor(y$withlicense) # it must be a factor
# y$color[y$pwithlicense==FALSE] <- "red"
# y$color[y$withlicense==TRUE] <- "blue"
# dotchart(y$precio,labels=row.names(y),cex=.7,groups= y$withlicense,
# main="Precio por noche para alojamientos con y sin registro",
# xlab="dollars", gcolor="black", color=x$color)
```
## Otros
```{r, echo = FALSE, warning=FALSE}
ggplot(local_activo) + geom_bar(mapping = aes(host_listings_count, fill = withlicense)) + labs(x = "anuncios por anfitrión", y = "nº anuncios", title= "distribución de nº anuncios por anfitrión con host_listings_count" )
ggplot(local_activo) + geom_bar(mapping = aes(host_total_listings_count, fill = withlicense)) + labs(x = "anuncios por anfitrión", y = "nº anuncios", title= "distribución de nº anuncios por anfitrión con host_total_listings_count" )
ggplot(local_activo) +
stat_summary(
mapping = aes(x = property_type, y = accommodates),
fun.ymin = min,
fun.ymax = max,
fun.y = median
) + coord_flip() + labs(y = "plazas", x = "tipo de alojamiento", title= "nº plazas por tipo de alojamiento" )
ggplot(local_activo) + geom_bar(mapping = aes(x = room_type, fill = withlicense)) + coord_flip()
ggplot(local_activo) + geom_bar(mapping = aes(x = accommodates, fill = withlicense)) + coord_flip()
ggplot(local_activo) + geom_bar(mapping = aes(x = bed_type, fill = withlicense )) + coord_flip()
ggplot(local_activo) + geom_bar(mapping = aes(x = review_scores_value, fill = withlicense )) + coord_flip()
ggplot(local_activo) + geom_bar(mapping = aes(x = instant_bookable, fill = withlicense )) + coord_flip()
ggplot(local_activo) + geom_bar(mapping = aes(x = require_guest_profile_picture )) + coord_flip()
ggplot(local_activo) + geom_bar(mapping = aes(x = require_guest_phone_verification )) + coord_flip()
ggplot(local_activo) + geom_bar(mapping = aes(x = calculated_host_listings_count )) + coord_flip()
ggplot(local_activo) + geom_bar(mapping = aes(x = reviews_per_month )) + coord_flip()
#scatter plots
ggplot(local_activo) + geom_point(mapping = aes(x = accommodates, y = reviews_per_month), position = "jitter")
ggplot(local_activo) + geom_point(mapping = aes(x = cancellation_policy, y = reviews_per_month, shape = property_type, color = property_type), position = "jitter")
ggplot(local_activo) + geom_point(mapping = aes(x = accommodates, y = calculated_host_listings_count, shape = property_type, color = withlicense), position = "jitter")
ggplot(local_activo) + geom_point(mapping = aes(x = accommodates, y = number_of_reviews, shape = property_type, color = withlicense), position = "jitter")
ggplot(local_activo[local_activo$city==local_activo_name,]) + geom_point(mapping = aes(x = reviews_per_month, y = number_of_reviews, fill = accommodates))
ggplot(local_activo) +
stat_summary(
mapping = aes(x = property_type, y = number_of_reviews),
fun.ymin = min,
fun.ymax = max,
fun.y = median
) + coord_flip() +
facet_wrap(~ withlicense, nrow = 2)
```
## Número de dormitorios y tipo de alojamiento `r local_activo_name`
```{r, echo = FALSE, warning=FALSE}
ggplot(data = local_activo) +
geom_point(mapping = aes(x = property_type, y = accommodates, color = withlicense), position = "jitter") + coord_flip()
```
## Número de dormitorios y tipo de oferta `r local_activo_name`
```{r, echo = FALSE, warning=FALSE}
ggplot(data = local_activo) +
geom_point(mapping = aes(x = room_type, y = minimum_nights, color = withlicense), position = "jitter") + coord_flip()
```
## Número de dormitorios y tipo de oferta en `r local_activo_name`
```{r, echo = FALSE, warning=FALSE}
ggplot(data = local_activo) +
geom_point(mapping = aes(x = room_type, y = accommodates, color = withlicense), position = "jitter") + coord_flip()
```
```{r, include=FALSE, cache = TRUE}
# Probando a separar los datos de las amenities sin éxitoo
# están en este formato "{TV,Internet,"Wireless Internet",Kitchen}"
# local_activodonostia[,35]
# grep("phone",as.character(donostia[6,35]))
# local_activo$email <- grep("email",local_activo[,35])
# donostia_features <- data.frame(as.character(donostia[,35]))
# donostia_features$email <- data.frame(grep("phone",as.character(donostia[,35])))
# n = nrow(donostia_features)
# #loop por todos los datos y los guarda en las categorías correspondientes
# for (j in 1:n) {
# if(gsub("\\[|\\]|'","",unlist(strsplit(as.character(donostia[j,35]), ", ")))[1]=="email") {
# donostia_features$email[j] = 1
# } else {
# donostia_features$email[j] = 0
# }
# }
# test = gsub("\\[|\\]|'","",unlist(strsplit(as.character(donostia[1,35]), ", ", fixed = TRUE)))[2]
#
# donostia[,59]
# grep("TV",as.character(donostia[6,59]))
# donostia_amenities <- data.frame(as.character(donostia[,59]))
#
# amenity_types = unique(tolower(gsub("\\{|\\}|\"","",unlist(strsplit(as.character(donostia[,59]), ",")))))
# n = nrow(donostia_amenities)
# m = length(amenity_types)
#
# #loop por todos los datos y los guarda en las categorías correspondientes
# for (j in 1:n) {
# for (i in 1:m) {
# if(gsub("\\{|\\}|\"","",unlist(strsplit(as.character(donostia[j,59]), ",", fixed = TRUE)))[m]=="TV") {
# donostia_amenities$tv[j] = 1
# } else {
# donostia_amenities$tv[j] = 0
# }
# }
# }
#
# gsub("\\{|\\}|\"","",unlist(strsplit(as.character(donostia[1,59]), ",")))[1]
```
You can’t perform that action at this time.