Cuánto cuesta una habitación según el municipio en España

Mapa que representa el precio mediano de alquiler de habitaciones en España.

Data Visualization Python d3.js

Introducción

El mercado inmobiliario español puede ser intenso:

Dada esta situación, compartir piso se ha convertido en la única solución para muchos trabajadores que quieren vivir cerca de donde trabajan.

Se va a tratar de explorar un poco más en profundida qué está pasando en el mercado de alquiler de habitación en España con el siguiente mapa interactivo:

Se puede explorar el mapa en una página distinta para ver mejor el código fuente asociado.

A continuación se explica cómo se han sacado los datos y se ha hecho el mapa.

Datos

El mayor actor digital en el mercado de los marketplaces de alquiler de habitaciones es idealista.com. También hay muchos actores secundarios como Badi, Milanuncios, Spotahome

Se han extraido los datos de Idealista porque ya había desarrollado un scrapeador que funcionaba medianamente bien extrayendo datos de Idealista: Dedomeno: Extrayendo datos de Idealista. El mercado inmobiliario español.

Se ha tomado una captura del mercado de alquilerde habitaciones en España mostrado en Idealista para un día aleatorio de febrero 2018. Se ha usado, al igual que en la entrada Precio de aquiler de garages en barrios de Madrid, dos frameworks de Python: Scrapy (para el escrapeo) and Django (para consulta sencillas).

También se ha utilizado pandas, una libreria de Python para limpiar los datos en un formato DataFrame, agrupando por el código de provincia y municipio para calcular la mediana. También se ha añadido el geocode oficial m_codepara cada municipio para que sea compatible con código de municipio dado por el Instituto Nacional de Estadística (INE): m_code = int(province) + munic

# Panda DataFrame grouping by administrative boundaries
country  province  area  zone  munic  m_code     € median
ES       01        01    001   059    1059     287.5
                   02    001   001    1001     175.0
                               021    1021     600.0
                   04    001   031    1031     250.0
                   05    001   901    1901     200.0
                   06    001   002    1002     260.0
                               036    1036     225.0
         02        01    001   003    2003     175.0
                         003   029    2029     125.0
                               039    2039     150.0
                   02    001   069    2069     155.0
                         003   081    2081     180.0
                   05    001   037    2037     175.0
         03        01    001   137    3137     300.0
                         002   063    3063     200.0
                         003   138    3138     130.0
                         004   082    3082     250.0
                         006   047    3047     250.0
                         007   026    3026     200.0
                               030    3030     250.0
                               110    3110     275.0
                                               ...  
                         003   032    48032    250.0
                         004   095    48095    315.0
                   06    001   065    48065    230.0
                         004   025    48025    220.0
                               075    48075    212.5
                   07    002   090    48090    300.0
         49        01    001   275    49275    150.0
                   02    001   219    49219    150.0
         50        02    001   165    50165    250.0
                   08    001   095    50095    170.0
                               252    50252    100.0
                   14    003   008    50008    300.0
                   17    001   297    50297    250.0
                         002   272    50272    225.0
                         003   089    50089    232.5
                               131    50131    230.0
                         004   219    50219    205.0
                         005   235    50235    250.0
                               288    50288    300.0
         51        01    001   001    51001    290.0
         52        01    001   001    52001    300.0
  

Se puede descargar el csv resultante en : spain_muni_median_rent_room.csv

Como se puede ver en el mapa interactivo al principio de esta entrada, hay muchos municipios sin datos.

Por ejemplo, la provincia de guadalajara solo tiene unos pocos municipios cercanos a Madrid donde hay oferta de alquiler de habitaciones. Esto es debido a que en las áreas rurales el precio de alquilar una casa completa es más bajo que el alquiler de una habitación en las grandes ciudades. Así pues, el precio de alquiler de un piso en los municipios fronterizos a Madrid ha crecido considerablemente, haciendo atractivo el alquiler de habitaciones en estos municipios.

Explorando en profundidad el mapa podemos ver un fenómeno extraño; el mayor precio de alquiler de habitaciones se situa en las dos pequñenas islas del Mediterrano Ibiza y Formentera. Esto puede ser explicado por la alta demanda existente en alquiler vacacional (especialmente con Airbnb) y no hay suficientes casas disponibles para el alquiler de larga estancia.

Esto lo cuenta en mayor detalle Alfredo Pascual en un artículo en El Confidencial llamado En Ibiza no hay quien viva

En Ibiza se puede comprobar cuál es el tamaño de la muestra para cada municipio. Por ejemplo en Sant Josep de sa Talia o Santa Euleria des Rius hay alrededor de 10 habitaciones en alquiler:

# Formentera (7024)
     province area zone munic district neighborhood  code  
8943       07   04  001   024     None         None  7024

Sant Josep de sa Talaia (7048)
df2.loc[df2['code']=='7048'].count()
geocode_raw     12
Santa Euleria des Riu
df2.loc[df2['code']=='7054'].count()
geocode_raw     10

Visualización

Martín Gonzalez mantiene un repositorio que proporciona un simple script para general archivos TopoJSON a partir del Instituto Geografico Nacional español llamado es-atlas. Este está inspirado en us-atlas y world-atlas de Mike Bostock. También mantiene Span junto con Lukas Appelhans, una pequeña libreria para crear mapas Canvas modernos con D3.

Se ha copiado uno de sus ejemplos, cambiado las leyendas y colores, detallado más las fronteras administrativas y se ha hecho un pequeño snippet directamente en la consola de Django para cambiar la variable rate:

for i in range(len(data['objects']['municipios']['geometries'])):
    municipality_id = data['objects']['municipios']['geometries'][i]['id']
    price = 0
    try:
        price = m.loc[municipality_id].price_raw
    except KeyError:
        pass
    data['objects']['municipios']['geometries'][i]['properties']['rate'] = price

Se puede descargar el json usado en este ejemplo de:

Conclusiones

Como ocurrió en la entrada anterior, Precio de aquiler de garages en barrios de Madrid, la calidad de la muestra es pobre:

df2.count()
geocode_raw     16653
price_raw       16653
planet          16653
continent       16653
country         16653
province        16653
area            16653
zone            16653
munic           16653
district        15526
neighborhood    10213
code            16653
dtype: int64

Esto es debido a que no se dispone de precios finales (16,5K habitaciones es una muestra decente). No se tiene forma de saber cuál fue el precio final de alquilier de la habitación.

Tal y como se concluyó en la entrada anterior, esto se podía haber evitado si se hubiese tomado una captura diária durante al menos un mes y deshacerse de aquellos inmuebles que estuvieran activos durante largos periodos de tiempo. Esto evitaría los precios inflados de habitaciones que jamás de alquilarían a la vez que tendríamos una muestra mayor y de mejor calidad.

Por otro lado, este mapa mejora mucho la versión de la entrada anterior: es in interactivo, se puede hacer zoom y muestra la información del nombre del municipio y su precio mediano de alquiler.