[[airbnb|Efecto Airbnb]] > [[airbnb:recetas|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 [[https://es.wikipedia.org/wiki/Mapa_coropl%C3%A9tico|un mapa de coropletas]]. * Un diagrama de barras de la cantidad de pisos airbnb por barrio. Referencias: [[http://airbnbvsberlin.com/|Airbnb vs Berlin]] ===== 2. Qué datos necesito y dónde los encuentro ===== * **Listado de alojamientos de Airbnb geolocalizados** (con latitud y longitud). * Donostia: ''/data/listings_donostia_simple.csv''. * Pamplona: ''/data/original/171002_airbnb_apartments-navarra_datahippo.csv'' * Madrid: ''[[https://github.com/montera34/airbnb.madrid.analisis/blob/master/data/output/listings_airbnb-madrid_insideairbnb-datahippo_merged.csv|listings_airbnb-madrid_insideairbnb-datahippo_merged.csv]]'' * Barcelona: [[https://github.com/montera34/airbnb.barcelona/blob/master/data/original/airbnb/180911/listings_summary_barcelona_insideairbnb.csv|/data/original/airbnb/180911/listings_summary_barcelona_insideairbnb.csv]] * **Contorno de barrios**. * Donostia: https://github.com/montera34/airbnbeuskadi/blob/master/data/original/BARRIOS_EUSTAT_5000_ETRS89.zip. * Pamplona: https://github.com/numeroteca/airbnbnavarra/blob/master/data/original/limites/DIADMI_Pol_Municipio.zip * Madrid: https://github.com/montera34/airbnb.madrid.analisis/blob/master/data/original/contornos/barrios_madrid_ETRS89.zip * Barcelona: [[https://github.com/montera34/airbnb.barcelona/blob/master/data/original/contornos/barrios_geo.json|barrios_geo.json]] Con estos datos podremos calcular: * Número de alojamientos de Airbnb por barrio. Para la proporción de anuncios de Airbnb respecto del total necesito el **número de viviendas por barrio**: * Donostia: [[http://opendata.euskadi.eus/catalogo/-/viviendas-de-la-c-a-de-euskadi-por-barrios-de-los-municipios-de-mas-de-10-000-habitantes-segun-tipo-y-caracteristicas-de-las-viviendas-familiares-principales/|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: [[https://github.com/numeroteca/airbnbnavarra/blob/master/data/original/pamplona-viviendas-por-barrio-2016.csv|viviendas por barrio]]. * Madrid https://github.com/montera34/airbnb.madrid.analisis/blob/master/data/output/madrid-variables-barrios-clean.csv * Barcelona: [[https://github.com/montera34/airbnb.barcelona/blob/master/data/original/demografia-vivienda/habitantes-viviendas-por-barrios_padron2018_ayto-barcelona.csv|habitantes-viviendas-por-barrios_padron2018_ayto-barcelona.csv]] [[airbnb:datos:barcelona|Ver datos para Barcelona]]. ===== 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. === 3.2 Contorno de barrios === **Convertir un shapefile de proyección ETRS89 (Donostia y Madrid)** Para poder usar el shapefile de [[ftp://ftp.geo.euskadi.eus/cartografia/Limites/Unidades_estadisticas/BARRIOS_EUSTAT_5000_ETRS89.zip|barrios de Donostia - San Sebastián]] o de [[https://datos.madrid.es/egob/catalogo/200078-10-distritos-barrios.zip|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í [[https://github.com/montera34/airbnbeuskadi/blob/master/data/barrios-donostia.zip|/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 ===== Necesitamos calcular los puntos (alojamientos) de Airbnb en cada polígono (barrio). A veces las bases de datos ya ofrecen la información de a qué barrio pertenece cada anuncios (ver variable ''neighborhood'' en las bases de datos de InsideAirbnb) por lo que no haría falta realizar los pasos 4.1 y 4.2. Bastaría con realizar una tabla dinámica en cualquier programa de hoja de cálculo para contar el numero de anuncios por barrio. ==== 4.1 Número de alojamientos en cada barrio (contar puntos en polígonos)==== === 4.1.a Modo interfaz gráfica (QGIS) === Con el programa [[https://qgis.org/|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. - Añade la capa con los barrios. Ejemplo para Madrid https://github.com/montera34/airbnb.madrid.analisis/blob/master/data/output/contornos/barrios_EPSG4326-WGS84.zip - En el panel de la derecha Processing Toolbox selecciona en el menú: Processing Toolbox -> QGIS Geoalgorithms -> Vector analysis tools -> Count Points in Polygon. {{:qgis-count-points-in-polygon.png?400|}} - Si ambas capas comparten CRS no me dará error ni avisao de error y realizará el cálculo. Puedo cambiar el nombre por defecto de la columan ''NUMPOINTS'' por ''n_listings_airbnb''. Tras calcular QGIS crea una nueva capa de contornos debarrios que incluye el nuevo valor de alojamientos por barrio. Podemos elegir en este paso crear el archivo csv o GeoJSON directamente. Preferimos ver resultados y luego salvar. - Botón derecho sobre capa "Open Atribute Table" para ver la tabla de datos. VEmos lo siguiente, a la derecha la columna ''n_listings_airbnb'' contiene los valores calculados. {{:qgis_n-listings-airbnb-table.png?500}} - Ahora puedo salvar esa capa como un GeoJSON (barrios-madrid_n-listings-airbnb.geojson) y un .csv (barrios-madrid_n-listings-airbnb.csv) para utilzarlas más adelante (botón derecho sobre capa y ''save layer as''). 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 [[https://carto.com/|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 script (R) === Con este script de R puedes añadir la columna de barrio a un archivo de puntos basado en su ubicación: https://github.com/montera34/airbnb.barcelona/blob/master/analisis/points-in-polygons.R ==== 4.2 Añadir localización de barrio a cada punto (añadir a cada punto el polígono en que se encuentra) ==== Otra forma de abordar el problema es calcular en qué barrio está cada punto y asociar esa información a la base de datos. Este método añadirá el nombre del barrio a cada anuncio según se ubique el punto dentro del contorno de un barrio. === 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 "Intersects" y las opciones “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 (listings_airbnb-madrid_insideairbnb-datahippo_merged_con-barrio.csv) o geojson y comprueba que se ha añadido la columna de “barrio” a tus base de datos de anuncios. El resultado de anuncios de Airbnb con el barrio añadido puedes descargarlo aquí: * Navarra https://github.com/numeroteca/airbnbnavarra/blob/master/data/output/171002_airbnb_apartments-navarra-por-municipio_datahippo.csv * Madrid data/output/listings_airbnb-madrid_insideairbnb-datahippo_merged_con-barrio.csv * Barcelona: Ahora mediante una tabla dinámica en culquier programa de hoja de cálculo puedes calcular el número de anuncios por barrio y salvarlo en un archivo .csv por separado. Resultado final para Barcelona: [[https://github.com/montera34/airbnb.barcelona/blob/master/data/output/airbnb/180911/barrios-n-listings-airbnb-barcelona-insideairbnb.csv|data/output/airbnb/180911/barrios-n-listings-airbnb-barcelona-insideairbnb.csv]]. ==== 4.3 Ratio de anuncios de Airbnb por viviendas existentes en el barrio ==== Para hacer calcular el ratio de anuncios de Airbnb por cada 100 viviendas existentes en el barrio 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. Tendremos por un lado una tabla con los datos de nº de viviendas por barrio y otra con el número de anuncios de airbnb por barrio, tenemos que unirlas. === 4.3.a Modo con QGIS === - Añade la capa de contornos de barrio que contiene el número de anuncios de Airbnb. Si añades un archivo geojson (como ''barrios-madrid_n-listings-airbnb.geojson'') no te dejará editarlo ([[https://gis.stackexchange.com/questions/61891/attribute-editing-in-qgis-on-geojson-file#61896|ver por qué]]) así que mejor conviértelos a formato Shapefile .sph (ESRI) y añádelo al mapa como nueva capa. - En propiedades de la capa ve a la sección ''Joins'' y dale al ''+'' verde. {{:qgis-join-table.png?500}} - Rellena: * Join Layer: la capa con la información de número de viviendas por barrio (del archivo ''madrid-variables-barrios-clean.csv'') * Join Field: la columna que tiene el nombre del barrio (''name'') * Target field: ''NOMBRE'' que es el nombre de la columan que incluye el nombre el barrio * Custom field name prefix: ''madridvar_'' * Dale a ''Apply'' {{ :qgis_add-vector-join.png?400 |}} - Si ahora vamos a la sección ''Fields'' de la capa veremos como se han añadido nuevas variables, las que vienen del archivo madrid-variables-barrios-clean.csv - Ahora con botón derecho sobre la capa ''Atribute table'' para editar los datos. Veremos las nuevas columans que acabamos de crear. {{ :qgis-edit-table.png?400 |}} - Pulsa en el lápiz de arriba a la izquierda para poder editar la capa. - Crea una columna nueva (botón de arriba a la derecha) {{ :qgis-add-field.png?400 |}} - Pulsa en el icono del ábaco para calcular el cociente entre número de anuncios por barrio y número de viviendas por barrio: ''"n_listings" / "madridvar_Nº Total de viviendas familiares (Censo Edificios y Viviendas 2011)" * 100''. Pon que actualice la variable recien creada en el paso anterior ''ratioturis''. Dale a aplicar. Nota: se pueden usar otras variables como: * Nº total de hogares * Nº de viviendas * Nº Total de viviendas familiares (Censo Edificios y Viviendas 2011) * Nº Total de viviendas (Censo Edificios y Viviendas 2011) {{ :qgis-calculate-ratio.png?400 |}} - Ya tienes la variable creada con el ratio de anuncios deAirbnb por cada 100 viviendas. Ahora quieres que tenga solamente 2 decimales, debes repetir el paso anterior pero con este cálculo para actualizar ''ratioturis'': ''round( ratioturis, 2 )'' {{ :qgis_menos-decimales.png?400 |}} - Dale a ok y vuelve a pulsar en el lápiz, para salvar los cambios. ===== Mapa de coropletas 3 ===== Ya solo nos queda hacer el mapa de coropletas utilizando la variable del ratio calculado. Fácil. ==== Modo QGIS ==== - Ahora vamos a dar estilo al mapa. Botón derecho sobre la capa, Propiedades > Style. Elige: * Graduated * Column: ''Ratioturis'' (la variable donde hemos guardado el ratio) * Mode: Juega con Equal interval, Natural breaks (jenks) y - Dale a ''Classify'', lo que genera los rangos y los colores. - Dale a ''Apply'' y ''OK''. {{ :qgis_coropletas-select.png?400 |}} - ¡Tenemos el mapa! Coloreado usando modo "jenks" de partición de intervalos. {{ :qgis_jenks-turistificacion-map.png?400 |}} - Es posible mirar el histograma para ver cómo Jenks hace las particiones: {{ :qgis_histograma.png?400 |}} - Ahora falta exportar el mapa.[[http://www.qgistutorials.com/en/docs/making_a_map.html|Mira a partir de paso 7 de este tutorial]]. [completar] - Crear layout - Añadir mapa - Cambiar nivel de zoom - Añadir leyenda - Exportar a pdf o SVG y continuar la edición en Inkscape para combinar un mapa con un gráfico de barras. ===== 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: {{https://lab.montera34.com/airbnb/donostia/images/bar-chart-barrios-capitales-euskadi-por-porcentaje_crop.png|}} ---- Documentación basada en https://github.com/montera34/airbnbeuskadi/wiki/%C2%BFC%C3%B3mo-se-concentra-la-oferta-por-barrios-de-Airbnb%3F