¡Esta es una revisión vieja del documento!
Tabla de Contenidos
Efecto Airbnb > Preguntas > Concentración oferta por barrio
¿Cómo se concentra la oferta por barrios de Airbnb?
Dificultad: ALTA
1. Qué análisis o visualización responde a la pregunta
Dos análisis complementarios:
- Un mapa en el que se vean os contornos de los barrios y los pisos de Airbnb representados por puntos. Las áreas pueden tener con un código de color que indique la cantidad de pisos de Airbnb en esa zona o la proporción de viviendas de Airbnb respecto del total. Esta segunda opción, la proporcionalidad, es más indicada para un mapa de coropletas.
- Un diagrama de barras de la cantidad de pisos airbnb por barrio.
Referencias: Airbnb vs Berlin
2. Qué datos necesito y dónde los encuentro
- Listado de alojamientos de Airbnb geolocaliados (con latitud y longitud).
- Donostia:
/data/listings_donostia_simple.csv
. - Pamplona:
/data/original/171002_airbnb_apartments-navarra_datahippo.csv
- Madrid:
/listings_airbnb-madrid_insideairbnb-datahippo_merged.csv
- Contorno de barrios.
- Madrid:
Con estos datos podremos calcular:
- Número de alojamientos de Airbnb por barrio.
Para la proporción de viviendas de Airbnb respecto del total:
- Donostia: Número de viviendas por barrio en Donostia. Viviendas de la C.A. de Euskadi por barrios de los municipios de más de 10.000 habitantes. Los datos en limpios en .csv utilizable: /data/viviendas-barrios-donostia.csv
- Pamplona: viviendas por barrio.
3. Qué herramientas uso para preparar los datos. Qué pasos debo seguir
3.1 Número de pisos Airbnb por barrio
Los datos disponibles de Airbnb no están segmentados por barrio. Para calcular el número de alojamienos por barrio necesitamos calcular cuantos puntos en cada polígono (barrio).
Nota sobre ubicación en Airbnb: los puntos de los alojamientos descargados por InsideAirbnb tienen una ubicación aproximada. Según su propia web: “Location information for listings are anonymized by Airbnb. In practice, this means the location for a listing on the map, or in the data will be from 0-450 feet (150 metres) of the actual address. Listings in the same building are anonymized by Airbnb individually, and therefore may appear “scattered” in the area surrounding the actual address”. Por tanto algunos pisos están ubicados fuera del barrio que les corresponde, incluso en el mar, lo cual hace que los números de alojamientos por barrios en los análisis que vamos a a realizar dejen algunos alojamientos fuera.
Opcional: Sin embargo los alojamientos sí que tienen asociado el código postal. Habría que hacer una tabla de equivalencia entre barrios y códigos postales. Con esta tabla podemos recorrer los registros de Inside Airbnb y añadir una columna que sea barrio. Esta unión de tablas puede ralizarse con QGIS.
3.2 Contorno de barrios
Convertir un shapefile de proyección ETRS89 (Donostia y Madrid)
Para poder usar el shapefile de barrios de Donostia - San Sebastián o de barrios de Madrid hace falta cambiar su sistema de proyección a “EPSG:25830 Name:ETRS89 / UTM zone 30N”. Eso se puede hacer, como suele ser habitual, con varios métodos. Listamos aquí 2: QGIS y R.
Conversión con QGIS
- Se añade el archivo como nueva capa al programa. Si tienes QGIS abierto, basta con arrastrar el archivo .zip.
- Si no funciona (por que el .zip tiene a su vez un directorio dentro), extrae el contenido del .zip.
- Una vez en QGIS. Ve al menú Layer > Add Layer > Add vector layer y selecciona el archivo
Barrios.shp
(u otro archivo con terminación .shp) de los archivos. Podrás ver los contornos.- En Project > Project Properties podrás definir los CRS del proyecto (para todas las capas).
- Dale a activar “Enable on-the-fly reprojection” de arriba a la izquierda.
- Ahora selecciona WGS 84/EPSG:4326 del panel de arriba o de abajo. Si no apareciera escribe 4326 en el campo para filtrar.
- Una vez se ha añadido la capa necesitamos exportarla, tenemos que salvar de nuevo la capa (“save as” con el botón derecho sobre el nombre de la capa) y salvarlo como “ESRI shapefile” seleccionando como CRS “EPSG:4326, WGS84”). También podemos salvarlo como archivo GeoJSON.
- Ahora que tiene su proyección correcta (por defecto QGIS utiliza la proyección “EPSG:4326, WGS84”. Ahora
- Por último, si queremos tener el conjunto de archivos que componen un shapefile comprimidos en un único archivo, hay que comprimir los archivos generados en un ZIP para poder usarlo, por ejemplo en Carto.com, una de las herramientas posibles para hacer el mapa.
Para el caso de Euskadi, este archivo contendrá todos los barrios de Euskadi. Se puede editar la tabla asociada a esa capa en QGIS [a completar explicación] y quitar todos los barrios que no nos interesen para dejar solamente los barrios de Donostia. El archivo con solo los barrios de Donostia puedes descargarlo aquí /data/barrios-donostia.zip.
Con R
# Leer un archivo SHP barrios_ETRS89_UTM <- readOGR(dsn = "SHP", layer = "BARRIOS_EUSTAT_5000_ETRS89") # Definir el sistema de coordenadas de entrada, EPSG:25830. proj4string(barrios_ETRS89_UTM) <- CRS("+init=epsg:25830") # Transformar al sistema de coordenadas de destino, EPSG:4326. barrios_WGS84_LL <- spTransform(barrios_ETRS89_UTM, CRS("+init=epsg:4326"))
Pamplona
Los contornos de los barrios indicados más arriba hace falta convertirlos a proyección “EPSG:4326, WGS84” igualmente. Basta con abirlos como capa vectorial en QGIS y salvarlas “save as…” la capa como proyección WGS84.
4. Qué herramientas uso para producir la visualización. Qué pasos debo seguir
4.1 Número de alojamientos en cada barrio
Necesitamos calcular los puntos (alojamientos) de Airbnb en cada polígono (barrio).
4.1.a Modo interfaz gráfica (QGIS)
Con el programa QGIS se pueden contar puntos en polígonos.
- Añadir la capa de puntos a QGIS. Añade capa desde el menú: Layers > Add layer > Add delimited text layer (porque vamos a importar un archivo csv) y selecciona el archivo donde esté los anunicios (listings) de Airbnb.
- Si el archivo tiene columnas que se llamen “latitude” y “longitud” las reconocerá como coordenadas y aparecerá la sección Point coordinates marcada.
- Escogemos el mismo sistema de proyección que con los contornos WGS 84.
- En el panel de la derecha Processing Toolbox selecciona en el menú: Processing Toolbox → QGIS Geoalgorithms → Vector analysis tools → Count Points in Polygon.
- Si ambas capas comparten CRS no me dará error ni avisao de error y realizará el cálculo. Crea un nuevo archivo de contornos que incluye el nuevo valor de alojamientos por barrio.
Manual en youtube para hace mapa de coropletas a partir de puntos y regiones en Carto: https://youtu.be/ULZE7pUW4y4
4.1.b Modo script (Carto.com)
Este modo requiere ejecutar comandos en SQL para unir los datos desde Carto.com.
Crea la columna alojamientos en la tabla de los contornos barrios-donostia, ponla como valor numérico y se ejecuta este el script de SQL desde la capa barrios-donostia:
UPDATE barrios-donostia SET alojamientos = (SELECT count(*) FROM listings_donostia_simple WHERE ST_Intersects(the_geom, barrios-donostia.the_geom))
Donde barrios-donostia
son los contornos y listings_donostia_simple
los puntos.
Este script de SQL llenará la columna alojamientos
con el número de puntos que haya en cada contorno. Si visitas de nuevo la tabla de datos barrios_donostia
podrás ver lo datos que hay en la columna alojamientos
. Nota: insideairbnb a veces posiciona los puntos en el mar (y por tanto fuera de la zona delimitada como barrio) por lo tanto el número total de puntos será algo menor que el total de alojamientos listados en airbnb.
4.1.c Modo Builder (Carto.com)
Este modo utiliza la interfaz gráfica nueva de Carto.com.
- Sube a tus bases de datos los archivos:
barrios-donsotia.zip
y listings_donostia_simple.csv - Crea un mapa y añade como capas
barrios-donsotia
ylistings_donostia_simple
- Sitúate en la capa
barrios-donsotia
y ve a “Analysis”. Añade “add” nuevo análisis. - Selecciona el modo “Intersect second layer. Intersect with a second layer and calculate aggregations on the fly”.
- En el menú desplegado debes tener: Aggregate intersection: Base layer - barrios_donostia; Intersect Layer - listings_donostia_simple Measure by: Operation - COUNT.
- Click en “Apply”. Eso generará una nueva columna en la base de datos llamada “count_values”.
- Entra en el modo tabla y cambia el nombre de la columna. Llámala “alojamientos_airbnb”.
Extra: 8. Puedes repetir el paso 5 pero ahora para usando COUNT y seleccionando la variable “accomodates” (plazas) para que sume todas las plazas por barrio: Measure by: Operation - sum(accommodates). Generará la columna “sum_accommodates”. Para hacer esto tienen que añadir otro análisis.
4.1.d Modo Editor(Carto.com)
Este modo utiliza la interfaz gráfica antigua de Carto.com. Algunos usuarios antiguos aún no tienen el modo “Builder”.
- Entra en el modo dataview del archivo de contornos de barrios de Donostia barrios_donostia.
- Haz click en el icono “merge datasets” de abajo a la derecha. merge-datasets-carto
- Selecciona la opción “Spatial join. Measure the number of intesecting records between two datasets (ex. count point inside polygons)”. merge-datasets-carto
- A la izquierda tendrás la base de datos de los barrios de Donostia (activa todos los campos). A la derecha selecciona la base de datos de los puntos, en nuestro caso listings_donostia_simple. Selecciona la opción “COUNT” de abajo. merge-datasets-carto
- Click en “Merge datasets”. La columna “intersect_count” de la nueva base de datos creada, voila, barrios_donostia_merge tiene el número de alojamientos en cada barrio. merge-datasets-carto Puedes cambiar el nombre de la columna por “viviendas_airbnb” o el nombre que quieras, para saber lo que contiene.
Extra: para calcular el número de plazas (la variable accommodates) seguiremos el mismo proceso pero en el paso 4. seleccionaremos la variable accommodates y la opción “SUM” para que sume todas las plazas que hay en esos alojamientos.
4.2 Añadir localización de barrio a cada punto
Otra forma de abordar el problema es calcular en qué barrio está cada punto y asociar esa información a la base de datos.
4.2.a Con QGIS
- Utilizamos la herramienta “Unir atributos por localizacion” (Menu: Vector > Data Management Tools > Join Attributes by location) para añadir informacion (de barrio) a cada unos de los anuncios de la base de datos de los anuncios.
- La capa “Target vector Layer” serán nuestros anuncios de Airbnb y la “Join Vector Layer” los barrios.
- Marca “Take attributes of first located feature” y “Only keep matching records” (para quedarte solamente con los puntos que están en los barrios“).
- Salva la capa como un shapefile, csv o geojson y comprueba que se ha añadido la columna de “barrio” a tus base de datos de anuncios.
El resultado puedes descargarlo aquí https://github.com/numeroteca/airbnbnavarra/blob/master/data/output/171002_airbnb_apartments-navarra-por-municipio_datahippo.csv
Ahora con una tabla dinámica puedes calcular el número de anuncios por barrio.
4.3 Proporción de pisos por barrio
Para hacer este paso necesitamos unir información que está en diferentes archivos. En concreto necesitamos hacer el cociente: nº de alojamientos de airbnb / nº viviendas para cada barrio. Los datos de nº de viviendas por barrio los tenemos en viviendas_barrios_donostia.csv en la columna total. Tenemos que pasar esos datos a la tabla de datos de barrios_donostia.
4.3.a Modo con QGIS
- Join table desde el menú de propiedades de una capa.
4.3.b Modo manual (Carto)
Puedes meter esos datos en Carto “a mano” en la tabla de valores. Añade columna y edita todos los campos. Copia pega. Son sólo 18 valores. Fácil.
Pero más fácil todavía lo siguiente:
- Descarga la tabla generada en el anterior ejercicio en table. Es la tabla de contornos de barrios que ahora incluye los valores de alojamientos por barrio.
- Edita con un editor de hojas de cálculo y añade los valores a cada barrio de los datos de /data/viviendas-barrios-donostia.csv
- Crea una columna percent_turisticas y haz el cálculo:
100 * (viviendas airbnb / viviendas totales)
para calcular el porcentaje. - Salva la tabla como .csv y súbela a carto.
4.3.c Modo script (Carto.com)
Junta dos tablas
Primero tenemos que añadir al mapa de carto la base de datos viviendas_barrios_donostia. Esta base de datos contiene el número de viviendas por barrio.
Usaremos el siguiente script (un join) para unir ambas tablas:
UPDATE barrios_donostia SET viviendas_join = viviendas_barrios_donostia.totalFROM viviendas_barrios_donostia WHERE barrios_donostia.bar_ds_o = viviendas_barrios_donostia.barrios
que traducido a lenguaje común significa: actualiza (UPDATE) la tabla barrios_donostia y pon (SET) el número de viviendas por barrio de la tabla viviendas_barrios_donostia (el nombre de la columna es total) (FROM) en las filas donde coincidan la columna bar_ds_o (nombre del barrio) de un archivo con la columna barrios de otro (WHERE).
De este modo tendremos los datos de viviendas por barrio en la tabla de contornos de barrios.
Calcula porcentaje de alojamientos de Airbnb por el total de viviendas
Luego nos queda calcular el porcentaje con otro script que divide una columna por otra (nº de alojamientos de airbnb / nº viviendas para cada barrio). Antes de esta operación hay que crear la coluna percent_turisticas:
UPDATE barrios_donostia SET percent_turisticas = alojamientos * 100 / viviendas
Esto es, en la tabla de los contornos de los barrios mete en la recién creada columna percent_turisticas el resultado de dividir el número de viviendas por el total de viviendas en ese barrio viviendas. Multiplica por 100 para obtener el porcentaje.
Para evitar que salgan muchos decimales correr este script:
UPDATE barrios_donostia SET percent_turisticas = round( CAST(percent_turisticas as numeric), 2 )
Pasará de 0.124342983492 a 0.12.
Manual: para join: https://carto.com/academy/courses/sql-postgis/joining-data
4.3.d Modo Builder (Carto.com)
Tienes que unir los datos incluidos en dos tablas diferentes: la tabla de barrios_donostia con el número de viviendas por barrio de la tabla viviendas_barrios_donostia.
Entra en el modo dataview del archivo de contornos de barrios de Donostia. Haz click en el icono “merge datasets” de abajo a la derecha. merge-datasets-carto Selecciona la opción “Column join. Merge two datasets based on a shared value (ex. ISO codes in both datasets)”. merge-datasets-carto A la izquierda selecciona barrios_donostia y la variable bar_ds_o (que contiene el nombre de los barrios) y a la derecha la tabla “viviendas_barrios_donostia” y la variable barrios. Click en “next”. merge-datasets-carto Selecciona las variables de ambas tablas que quieras incluir. De la izquierda todas, y de la derecha todas menos “barrios” ya que si la incluyes estarías duplicando el nombre del barrio. CLick en “merge data sets”. merge-datasets-carto Renombra la tabla para saber lo que inclute: barrios_donostia_viviendas_airbnb_normales
Mapa de coropletas 3
Ya solo nos queda hacer el mapa de coropletas utilizando la variable percent_turistica. Fácil.
Gráfico de barras
Con los datos que hemos calculado en Carto podemos descargarlos y utilizar cualquier programa de hojas de cálculo para generar un gráfico de barras.
En Carto: ve a modo Data view (tabla) de la capa barrios_donostia y en el menú Edit > Export Layer y descarga la capa como .csv.
Resultado
Puedes consultar el resultado en el informe para Donostia https://lab.montera34.com/airbnb/donostia/#2 y en este gráfico:
Documentación basada en https://github.com/montera34/airbnbeuskadi/wiki/%C2%BFC%C3%B3mo-se-concentra-la-oferta-por-barrios-de-Airbnb%3F