Skip to content

¿De dónde vienen los usuarios de Airbnb?

numeroteca edited this page Jul 18, 2017 · 2 revisions

El objetivo es identificar a partir del id del inquilino su procedencia. La fuente de información serán los reviews (comentarios en la web) de cada estancia.

En el archivo reviews_euskadi.csv tenemos la id de cada usuario que ha hecho una review en Euskadi, y el id del alojamiento.

En el archivo listings_donostia_merged.csv tenemos el id de los alojamientos existentes en Donostia.

Hemos montado un script en R para obtener los id de los usuarios que han dejado comentario (review) en Donostia (reviewers_in_listings.Rmd:

  1. El primer paso es asociar a cada archivo una variable:
#introduce el path de tu archivo listings. Necesitas desactivar Quotes, porque el texto incluye \"
listings_simple_1 <- read.delim("../../data/listings_donostia_merged.csv",sep = ",")
reviews <- read.delim("../../data/reviews_euskadi.csv",sep = ",")
  1. El segundo paso es hacer un filtrado para obtener solamente los reviews de los alojamientos que estén en Donostia. Para ello partimos de la lista de reviews de Euskadi y seleccionamos solo aquellos cuya id del alojamiento coincide con las id del archivo de alojamientos de Donostia:
reviews_donostia <- reviews[listings_simple_1$id %in% reviews$listing_id,]
  1. Tercer paso: necesitamos contar cada id del reviewer como un valor único para no contarle más de una vez si ha hecho más de una review, cambiando el formato de la variable de ‘int’ a ‘factor’:

reviews_donostia$reviewer_id <- as.factor(reviews_donostia$reviewer_id)

  1. Contamos el número de valores únicos de las ‘id’ de las reviews:

levels(reviews_donostia$reviewer_id)

  1. Por último, sacamos la información en formato .csv:

write.table(levels(reviews_donostia$reviewer_id), "../../data/reviewers_donostia_merged.csv", sep=",", row.names=FALSE)

Siguientes pasos:

Ya tenemos el archivo csv con el que realizar un scrapping en la web de airbnb y obtener la procedencia de los usuarios. Esperamos encontrar en la procedencia información relativa a ciudad, región y país.

Creemos que será necesario un trabajo de limpieza porque pueden estar nombradas de diferentes formas, o incluso no incluir información.

El objetivo es generar dos tipos de formatos de visualización:

Gráficas de columnas según ciudad/país/región en función del nivel de detalle de la información. Mapa geográfico con la información obtenida sobre la procedencia de los usuarios que han realizado una estancia via Airbnb en Donostia.

14/07/2017

Script del scrapping en Python disponible gracias a @saigesp: https://gist.github.com/Saigesp/5cbcf6c1f6685df7717a89e0c2145894

# -*- coding: UTF-8 -*-
import csv, urllib2, time
from bs4 import BeautifulSoup


# python -c "from airbnb_guest_procedence import *; crawler()"

def read_external_csv(url, delimiter=','):
    data = []
    for row in csv.DictReader(urllib2.urlopen(url), delimiter=delimiter):
        data.append(row)
    return data


def crawler():

    guest_url = 'https://www.airbnb.es/users/show/'
    filename = '/home/hirikilabs/git/summerbnb-master/scrappers/data/reviewers_donostia_localization.csv'

    with open(filename, 'wb') as csvfile:
        writer = csv.writer(csvfile, delimiter = ',')
        writer.writerow(['id', 'localization'])

        for user in read_external_csv('file:/home/hirikilabs/git/summerbnb-master/scrappers/data/reviewers_donostia_merged.csv'):
            try:
                time.sleep(5)
                print ('Entrando en ' + guest_url + user['x'])

                page = urllib2.urlopen(guest_url + user['x']).read()
                soup = BeautifulSoup(page, "html.parser")
#location is in the class "h5"
                loc = soup.select('.h5 a')[0].get_text()

                writer.writerow([user['x'], loc])

            except Exception as e:
                print(e)

El documento introducido con las “id” (reviewers_donostia_merged.csv) tenía +/- 33.000 inquilinos y el documento resultante (reviewers_donostia_localization.csv) tiene solamente 3.551. Habría que analizar cuál ha sido el problema.

De los 3.551, 9 no ha podido identificarse el país. El número total de países reflejados es 3.542. De los 9 sin identificar, 4 de ellos son considerados destinos nulos.

Con el documento .csv resultado del scrapping, hemos visualizado los datos. Está compuesto por dos columnas, la “id” introducida desde el inicio, más otra columna con la información sobre localización que tenía introducida cada usuario. Los formatos son los siguientes:

País Ciudad, País Ciudad, Región, País

Para conocer únicamente la información relativa a la procedencia por país, hemos trabajado con el programa “numbers”, filtrando los nombres de los países encontrados y apuntando cuantas veces sale cada uno en un libro de calculo. Desde la misma hoja de cálculo hemos hecho los gráficos.

Con un “script” de “bash” se ha llamado a “awq” para que divida la información de la columna “Localization” del archivo que se ha conseguido mediante scrapping, en tres columnas organizando la información por País, Región y Ciudad:

#!/bin/bash
touch tmp.list
awk -F ',' '{ print $1,","$4,","$3,","$2 }' $1 > tmp.list
sed -i 's/, ,/,/;s/, ,/,/' tmp.list

Pudiendo trabajar estos datos en una hoja de cálculo, hemos realizado dos tablas dinámicas para organizar la información de forma automática. Así hemos conocido:

  • Número de ciudades de procedencia
  • Número de países de procedencia

[La automatización del procedimiento nos ha permitido obtener la información de forma más rápida, pero, para detectar errores y conocer los matices de la información que trabajamos, con el proceso manual hemos podido detectar abreviaturas, entre otros formatos, pudiendo corregir más fácilmente errores. Tal vez con un conocimiento más avanzado en la utilización de los diferentes programas podríamos conseguir lo mismo de forma aún más ràpida].