Tabla de Contenidos
Efecto Airbnb > Recetas
Recetas y manuales
Esta página recoge diferentes recetas y scripts para facilitar el análisis en diferentes lenguages y herramientas.
Documentación tipo
Para documentar una pregunta que aún no esté en wiki hay que crear una nueva página y se puede copiar la estructura de documentación de la siguiente plantilla: documentacion-tipo
Preguntas y manuales
Este es un listado de preguntas con sus manuales correspondientes para analizar y producir visualizaciones sobre datos de Airbnb que se han ido desarrollando en los diferentes talleres de Efecto Airbnb:
- ¿Cómo se concentra la oferta por barrios de Airbnb? Dificultad ALTA. Manual Completo. Resultados: sí.
- ¿Cómo está repartida la propiedad de los pisos de Airbnb?. Dificultad FÁCIL. Manual: Completo. Resultados: sí.
- ¿Cuántos anuncios en Airbnb son "legales"? ¿Cuántos ilegales, no legales o alegales? ¿Cuál es la distribución de ambos tipos por barrios? Dificultad ALTA.Manual Completo. Resultados: sí.
- ¿Cómo se anuncian los pisos? Un análisis de las palabras usadas. Dificultad MEDIA. Manual: Completo. Resultados: sí.
- Variaciones espaciales de precios por plaza Dificultad MEDIA-ALTA. Manual: Completo. Resultados: sí.
- ¿Qué anuncios están activos?. Manual: en proceso.
Por completar:
- ¿Qué cantidad de anuncios Airbnb son pisos completos? ¿Cuántos son habitaciones?. Dificultad FÁCIL. Manual No realizado. Resultados: sí.
- ¿Qué porcentaje del total de plazas de alojamiento turístico no están "reguladas"? ¿Qué cantidad de alojamientos turísticos son pisos Airbnb?. Dificultad ALTA. Manual No realizado. Resultados: en parte.
- ¿Cuánta actividad hay en Airbnb en Donosti? ¿Cuántas reservas hay en Airbnb durante un año? ¿Cuál ha sido la evolución durante los 10 últimos años?. Dificultad MEDIA/ALTA. Manual No realizado. Resultados: no.
- Comparativa entre capitales vascas. Comparativa con otras ciudades (Madrid, Barcelona y Mallorca). Dificultad MEDIA. Manual No realizado. Resultados: en parte.
D3
Cómo realizar un cartograma para representar dos variables: tamaño de las áreas en función del número de viviendas y color en función de ratio de número de anuncios de Airbnb por número de viviendas:
R
Desde Montera34 hemos preparado 2 scripts de R para procesar los datos:
- prepare-segmented-files.R para procesar los datos y generar archivos más manejables. Genera archivos .csv y .tsv. Lo que hace este script es “partir” los datos de Airbnb en Euskadi en cómodos .tsv y csv por ciudades. También selecciona ciertas columnas para tener archivos más ligeros, de ahí el sufijo “_simple”.
- Este script generado con Rmarkdown está pensado para comparar dos bases de datos de Airbnb y poder evaluar los métodos de scraping. Más información sobre el script.
- airbnb-informe-ciudad.Rmd para generar informes de las ciudades con múltiples gráficos. El archivo tiene una variable que permite cambiar el nombre del municipio sobre la que se genera el informe. Genera artchivos .html con knitr.
Los informes no están muy depurados (hay muchas gráficas no del todo útiles) y son mejorables, pero son una buena base de la que partir. Y sobre todo ¡se producen automatizadamente!
Desde Terraferida han generado una serie de scripts de R para analizar datos de Airbnb y Homeaway.
Python
Scraping: obtiene info a partir de listado de id de hosts en Airbnb
Un script para scrapear una lista de usuarios de Airbnb basado en sus id:
import csv import urllib2 from bs4 import BeautifulSoup outputpath = "airbnbusers.csv" hdr = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3', 'Accept-Encoding': 'none', 'Accept-Language': 'en-US,en;q=0.8', # cambia idioma 'Accept-Language': 'es-ES,es;q=0.8' 'Connection': 'keep-alive'} with open(outputpath, "w") as outfile: writer = csv.writer(outfile) for counter in [102947901,3566146,54310958,143666717]: # cambia la lista de usuarios url = "https://www.airbnb.com/users/show/"+str(counter) print url # Get URL response = urllib2.Request(url, headers=hdr) pagedata = urllib2.urlopen(response) html = pagedata.read() # Get links soup = BeautifulSoup(html, "html.parser") # boxes = soup.select(".news-body") title = soup.select("h1")[0].get_text().encode('utf-8').strip() since = soup.select(".text-normal")[0].get_text().encode('utf-8').strip() review = soup.select("#reviews h2")[0].get_text().encode('utf-8').strip() review = review.translate(None, 'Reviews\n(').translate(None, ')') desc= soup.select("p")[0].get_text().encode('utf-8').strip() print counter print title print since print review print desc writer.writerow([counter,title,since,review,desc])
Scraping: obtiene info a partir de listado de id de listings en Airbnb
import csv import urllib2 from bs4 import BeautifulSoup outputpath = "airbnblistings.csv" hdr = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3', 'Accept-Encoding': 'none', 'Accept-Language': 'en-US,en;q=0.8', #cambia idioma 'Accept-Language': 'es-ES,es;q=0.8' 'Connection': 'keep-alive'} count=0 with open(outputpath, "w") as outfile: writer = csv.writer(outfile) for counter in [23321245,20407971,12163858]: # incluye aquí la lista de id de listings completa count +=1 print count url = "https://www.airbnb.com/rooms/"+str(counter) print url try: print "try1" # Get URL response = urllib2.Request(url, headers=hdr) pagedata = urllib2.urlopen(response) html = pagedata.read() # Get links soup = BeautifulSoup(html, "html.parser") except: print "except1" try: print "try2" nreviews = soup.select("#reviews ._1vbkutid")[0].get_text().encode('utf-8').strip() nreviews = nreviews.translate(None, ' Reviews').encode('utf-8').strip() lastreview = soup.select("#reviews ._hylizj6")[0].get_text().encode('utf-8').strip() except: print "except2" print url print nreviews print lastreview writer.writerow([counter,nreviews,lastreview])
SQL
Cómo hacer una búsqueda con sustitución en una tabla
Esta receta es útil para solucionar errores de codificación de caracteres o unificar valores semejantes o equivalentes para hacer counts o estadísticas después (San Sebastian y Donostia por ejemplo).
UPDATE TABLE_NAME SET col_name = REPLACE(col_name,'old_value','new_value')
Cómo incluir una columna de una tabla en otra
Esta operación se resuelve con una unión (join) de SQL entre dos tablas. Para ello hay que usar un valor que relacione los registros de ambas tablas. En el siguiente ejemplo vamos a unir las tablas table_1 y table_2, seleccionando las columnas col_1 y col_4 de la table_1 y la columna col_3 de la table_2. Las columnas de relación serán code de la table_1 e id de la table_2:
SELECT table_1.col_1,table_1.col_4,table_2.col_3 FROM table_1, table_2 WHERE table_1.code = table_2.id
También se puede hacer con el siguiente código con el que, a modo de ejemplo, se añade la población de cada barrio a una tabla de barrios que no la tiene:
UPDATE table_1 SET poblacion = table_2.habitantes FROM table_2 WHERE table_1.barrio = table_2.barrio
CARTO
CARTO es un servicio web open source para crear mapas y visualizaciones. Utiliza SQL para hacer llamadas a los sets de datos. Para saber cómo interactuar con los datasets usando el editor SQL de CARTO se puede consultar el siguiente manual: https://carto.com/academy/courses/sql-postgis/