Análisis Urbanístico Multicriterio del Precio del Alquiler de la Ciudad de Madrid
| Trabajo sobre SIG | |
|---|---|
| Título | Análisis Urbanístico Multicriterio del Precio del Alquiler de la Ciudad de Madrid |
| Autores | Juan Casteres Cortiñas Roddyk Arven Inocencio Bahía Mario González López |
| Asignatura | Sistemas de Información Geográfica Aplicados a la Ingeniería Civil |
| Curso | Curso 25/26 |
| Este artículo ha sido escrito por estudiantes como parte de su evaluación en la asignatura | |
Contenido
- 1 Introducción
- 2 Metodología
- 3 Resultados
- 4 Conclusiones
- 5 Referencias
- 6 Anejos
1 Introducción
|
El presente estudio documenta una investigación de ciencia de datos espaciales orientada a identificar y cuantificar el peso estadístico de los diferentes factores urbanísticos, demográficos y ambientales que inciden en la fijación de los precios del mercado de alquiler en la ciudad de Madrid. Mediante la aplicación de un Modelo de Precios Hedónicos, se analiza la correlación entre la oscilación del precio de la vivienda y variables espaciales en los 131 barrios del municipio. 1.1 Contexto y JustificaciónEl mercado inmobiliario de Madrid ha experimentado fluctuaciones significativas en el periodo comprendido entre 2019 y 2026. Históricamente, el valor del suelo y de los alquileres en la capital se explicaba mediante factores dotacionales clásicos, como la proximidad al centro (M-30) o la cobertura de transporte público. Sin embargo, la irrupción de nuevas dinámicas urbanas ha alterado este modelo tradicional. Este proyecto surge de la necesidad de establecer un diagnóstico objetivo y cuantificable que permita entender si las reglas clásicas de habitabilidad siguen dictando los precios, o si factores contemporáneos ejercen una mayor presión sobre el mercado residencial. 1.2 Objetivos del EstudioEl objetivo principal de esta investigación es determinar qué porcentaje de la variación del precio del alquiler se explica por factores estructurales y qué porcentaje obedece a nuevas presiones del mercado. Para ello, se establecen los siguientes objetivos específicos:
2 MetodologíaEl núcleo analítico de esta investigación se basa en la estructuración de un Modelo de Precios Hedónicos. Según el INE (Instituto Nacional de Estadística), este modelo econométrico asume que el precio de un bien inmobiliario no es un valor indivisible, sino la suma matemática de las disposiciones a pagar por cada una de las características que lo componen. Para aislar y cuantificar estos componentes de forma precisa en el entorno urbano de Madrid, las variables independientes se han procesado de forma geoespacial y se han estructurado en tres grandes dimensiones: 1. Influencia Geográfica y Dotacional Esta dimensión evalúa el valor espacial clásico dictado por la estructura y la morfología de la ciudad. Se centra en cómo la conectividad, la localización y el urbanismo penalizan o añaden primas al valor del alquiler.
2. Influencia Socioeconómica y de Mercado Esta dimensión trata de analizar y comparar las principales variables socioeconómicas y de mercado. Se centra tanto en la parte residencial (variación de la población, stock de viviendas, variación del precio) como en la parte turística (viviendas uso turístico, VUT).
3. Influencia Ambiental y Climática La tercera dimensión introduce la habitabilidad y el confort medioambiental como un vector emergente de estudio. El análisis busca determinar si el mercado inmobiliario internaliza o ignora el peso de la diferencia climática de los barrios.
A continuación se hará una descripción detallada de la metodología específica de cada una de las tres partes. 2.1 Estudio geográfico y DotacionalA continuación se detalla la metodología empleada para estudiar las diferentes variables geométricas de la Ciudad de Madrid. 2.1.1 Densidad dotacionalLa valoración de los activos residenciales está condicionada significativamente por las externalidades espaciales y la accesibilidad a dotaciones urbanas del entorno. La proximidad a centros de decisión política, nodos culturales y servicios de alta gama genera una renta de situación que se traduce en un incremento del precio del alquiler. Por otro lado, la presencia de infraestructuras críticas de servicio o centros de asistencia social puede generar externalidades negativas que impactan en la percepción del valor residencial del entorno inmediato. Origen y Captura de Datos Los datos brutos proceden del Portal de Datos Abiertos del Ayuntamiento de Madrid, que ofrece una lista exhaustiva de los equipamientos y servicios distribuidos en la ciudad de Madrid.
Clasificación jerárquica Dado el gran volumen de puntos y tipologías de la capa de puntos de interés en Madrid, se ha realizado una filtración anterior, consistente en una categorización jerárquica de 4 clases y asignándoles un coeficiente de ponderación basado en su impacto socioeconómico estimado:
Este proceso de asignación de pesos en la tabla de atributos se ha realizado mediante un script de Python con la asistencia de la IA, cuyo código se incluye en el Anejo 1: Scripts de Python. Agregación por barrios Para trasladar la información puntual a una unidad de análisis territorial, se procedió a la agregación espacial de los coeficientes de ponderación.
Normalización y Obtención del Índice Para obtener una variable que permitiera la comparación equitativa entre barrios, eliminando el sesgo producido por el diferente tamaño de las unidades territoriales, se realizó una normalización por superficie. El coeficiente de ponderación total obtenido para cada barrio se dividió entre su área en kilómetros cuadrados, obteniendo así la densidad dotacional por barrio. A continuación, se presenta el mapa de los puntos de interés en la Ciudad de Madrid, y el mapa de la densidad dotacional: 2.1.2 Cobertura de transporte públicoEl transporte público y su infraestructura son uno de los principales motores de revalorización del suelo, influyendo directamente en los precios del alquiler de las viviendas. Con el objeto de determinar el grado de conexión de los distintos barrios, se ha analizado la cobertura espacial de las estaciones de Metro, Cercanías y Metro Ligero, evaluando su área de influencia sobre el tejido urbano. Origen y Captura de Datos Para este análisis se han utilizado las capas vectoriales de la red de transporte ferroviario y la base de datos de ocupación del suelo.
Modelización de Áreas de Influencia mediante buffers En primer lugar, se generaron áreas de influencia alrededor de cada estación para simular la accesibilidad peatonal, asignando distancias diferenciadas según la relevancia y capacidad de cada modo de transporte:
Posteriormente, estas tres capas se integraron mediante un proceso de "Disolver" en QGIS para obtener una única geometría que represente el área de influencia total del transporte público, evitando solapamientos de superficie. Procesamiento Espacial en QGIS El cálculo del indicador requiere identificar qué parte del suelo estrictamente urbano de cada barrio está efectivamente cubierta por la red de transporte.
2.1.3 Influencia de barreras geográficas (M-30 y M-40)Históricamente, las autopistas de circunvalación de la M-30 y M-40 han actuado como verdaderas barreras geográficas, que no solamente generaron separaciones físicas entre barrios, sino que han influido socialmente y económicamente en la determinación del valor de suelo de los barrios. Se ha integrado dicho factor en el análisis multicriterio, Origen de Datos Los datos se han obtenido del Padrón de Madrid, en el que ya se clasifican los barrios y distritos de Madrid según su situación relativa a la M-30 y M-40 en una tabla, distinguiendo:
2.2 Estudio Socioeconómico y de MercadoA continuación se detalla la metodología empleada para estudiar las principales variables socioeconómicas y de mercado, tales como, la presión turística, el stock de viviendas, la variación de la población o la variación del precio medio de las viviendas en los últimos años.
2.2.1 Metodología de Análisis de la Presión TurísticaEl análisis de la influencia del mercado de viviendas de uso turístico (VUT) se ha integrado en el modelo como una variable de distorsión de precios residenciales. Para ello, se ha generado una base de datos propia mediante el procesamiento de datos masivos de oferta turística. Los pasos empleados para obtener una base de datos capaz de otorgar información de calidad para el estudio ha sido la siguiente: Origen y Captura de Datos Los datos brutos fueron obtenidos de la plataforma de datos abiertos Inside Airbnb, un proyecto independiente de análisis de datos que proporciona registros detallados de la actividad de la plataforma en las principales capitales mundiales.
Importación y Preparación en QGIS La integración de los datos en el Sistema de Información Geográfica (QGIS) se realizó siguiendo los siguientes pasos técnicos:
Cálculo de la Densidad de Airbnb (VUT) Para cuantificar la intensidad turística de cada barrio, se realizó un análisis de agregación espacial:
Cálculo del Precio Medio por Noche Con el fin de identificar la brecha de renta entre el uso turístico y el residencial, se calculó el valor económico medio de la oferta de Airbnb:
A continuación, se muestra el mapa relativo a la densidad de VUT obtenido mediante esta metodología, representando el rojo oscuro una mayor densidad y el rojo claro una menor. 2.2.2 Metodología de Análisis de Stock de ViviendasEl estudio del parque residencial es un factor determinante en el modelo de precios hedónicos, ya que permite evaluar la elasticidad de la oferta frente a la demanda. Esta variable analiza cómo el crecimiento físico de la ciudad (nuevas edificaciones) influye en la estabilización o incremento de los precios del alquiler. Fuente y Origen de los Datos La información relativa al número de unidades residenciales se ha obtenido a partir de los registros administrativos de la Dirección General del Catastro y el Portal de Datos Abiertos del Ayuntamiento de Madrid.
Cálculo de la Variación del Stock Para medir el crecimiento del parque inmobiliario, se ha procesado la diferencia relativa entre ambos periodos mediante la siguiente fórmula matemática implementada en la calculadora de campos de QGIS: [math]\text{Var}_{pct} = \frac{\text{Stock}_{2026} - \text{Stock}_{2019}}{\text{Stock}_{2019}} \cdot 100[/math]
2.2.3 Metodología de Análisis de Variación PoblacionalEl análisis de las dinámicas demográficas constituye un pilar fundamental para comprender la presión de la demanda en el mercado inmobiliario. Esta variable cuantifica el crecimiento o vaciamiento poblacional de cada barrio, permitiendo contrastar la teoría clásica de oferta y demanda residencial con fenómenos contemporáneos de sustitución vecinal. 1. Fuente y Origen de los Datos La información demográfica se ha extraído de los registros oficiales del Padrón Municipal de Habitantes, procesados a través de los paneles de indicadores del Portal de Datos Abiertos del Ayuntamiento de Madrid.
2. Cálculo de la Variación Poblacional Para evaluar la evolución demográfica de forma equitativa entre barrios de distinta densidad, no se utilizó el incremento absoluto de personas, sino la tasa de variación relativa. Este cálculo se ejecutó mediante la calculadora de campos de QGIS aplicando la siguiente expresión algebraica:
2.2.4 Metodología de Análisis de Variación del Precio del AlquilerEl estudio de la variación del precio de la vivienda en régimen de alquiler constituye el eje central del análisis de las dinámicas de mercado de este proyecto. A diferencia del valor absoluto actual (€/m²), que describe la estructura consolidada de la ciudad, el análisis de la variación porcentual permite identificar la velocidad a la que se encarece la vida en cada barrio, mapeando así la diferencia de precios y los procesos de tensionamiento inmobiliario. 1. Origen y Tratamiento de los Datos Los datos relativos al mercado inmobiliario residencial se han obtenido a partir de fuentes secundarias especializadas y portales inmobiliarios de referencia (como Idealista), que registran los precios de oferta reales frente a los valores catastrales teóricos.
2. Cálculo de la Variación del Precio Para medir la agresividad de la subida de los alquileres de manera estandarizada, se procedió a calcular la tasa de crecimiento relativo de cada barrio. Mediante la calculadora de campos de QGIS, se aplicó la siguiente formulación matemática:
2.3 Estudio de la Influencia Ambiental y ClimáticaA continuación se procederá a explicar la metodología empleada para el estudio de la influencia ambiental y climática. Cabe destacar, la ayuda obtenida por el profesor Carlos Morillas durante la obtención de los datos e imágenes satelitales respectivos al apartado de Teledetección y Temperatura Superficial (LST) 2.3.1 Teledetección y Temperatura Superficial (LST)El análisis del impacto ambiental en los precios del alquiler se ha instrumentado a través del estudio de la Temperatura Superficial Terrestre (LST, por sus siglas en inglés). Esta variable permite cartografiar y modelizar el fenómeno de la Isla de Calor Urbana (ICU) y la distribución del confort térmico en el municipio de Madrid.
A continuación se muestran las imágenes satelitales de la Comunidad de Madrid con el gradiente de temperatura visualizado en tonos rojizos. Para facilitar la vista de los barrios, se ha solapado el mapa de la Ciudad de Madrid por encima del de la Comunidad. Cabe destacar, que en la Imagen 13, tal y como se ha explicado anteriormente, no es posible analizar todos los píxeles debido a la nubosidad de la fecha seleccionada. 2.3.2 Nivel de Frecuencia de Limpieza de CallesEl análisis del nivel de frecuencia de limpieza de calles se ha integrado en el modelo como una variable representativa del mantenimiento del espacio público y de la calidad percibida del entorno urbano. La limpieza viaria puede actuar como un indicador indirecto de intensidad de uso, centralidad, presión peatonal y cuidado municipal del espacio urbano. Para obtener una variable comparable entre barrios, se ha construido un índice ponderado a partir de la longitud de calles asignada a cada nivel de limpieza. Origen y Captura de Datos Los datos de limpieza viaria utilizados proceden del Portal de Descarga de Datos del Ayuntamiento de Madrid, en la que se recogen los tramos de calle clasificados según su nivel de frecuencia de limpieza.
Importación y Preparación en QGIS La integración de la capa de limpieza viaria en QGIS se realizó mediante la incorporación del archivo vectorial correspondiente, junto con la capa poligonal de barrios de Madrid, obtenida también en el Portal de Descargas de Datos del Ayuntamiento de Madrid.
Asignación de Tramos de Calle a Barrios Para obtener el nivel de limpieza de calles por barrio, fue necesario cruzar espacialmente la red viaria con la capa poligonal de barrios.
Tras realizar la intersección, se recalculó la longitud de los nuevos tramos generados mediante la calculadora de campos de QGIS, utilizando la expresión $length El nuevo campo de longitud representa la longitud efectiva de cada tramo dentro de su barrio correspondiente. Construcción del Índice de Frecuencia de Limpieza Viaria Una vez obtenida la capa de calles dividida por barrios, se exportó la tabla de atributos a Excel para realizar la agregación de longitudes por barrio y nivel de limpieza. Para transformar la clasificación original en un indicador comparable, se asignó una ponderación inversa al número de nivel:
Posteriormente, para cada barrio se calculó la longitud total de calles perteneciente a cada nivel de limpieza. A partir de estos valores, se obtuvo un índice ponderado mediante la siguiente fórmula: [math] Índice = \frac{(L_1 \cdot 4) + (L_2 \cdot 3) + (L_3 \cdot 2) + (L_4 \cdot 1)}{L_1 + L_2 + L_3 + L_4} [/math]
3 ResultadosA continuación, se presentan los resultados obtenidos, clasificados nuevamente en tres grupos principales (geográfico y dotacional, socioeconómico, e influencia ambiental y climática). Posteriormente, estos datos se analizarán en conjunto para ofrecer una perspectiva integral y establecer las conclusiones globales de la investigación. Para dotar de rigor al estudio, el geoprocesamiento tradicional se ha complementado con modelos estadísticos de regresión lineal ejecutados en el propio entorno de QGIS. Mediante el desarrollo de scripts automatizados en el lenguaje de programación Python, se ha extraído la información de las capas vectoriales para someterla a análisis estadístico, y de este modo, ser capaces de otorgar pesos y un criterio comparativo común entre todos los campos de estudio. Para ello, se ha procedido en todos los scripts con los siguientes puntos clave:
3.1 Estudio Geográfico y DotacionalA continuación se presentan los resultados relativos al análisis geográfico y dotacional: 3.1.1 Densidad DotacionalEl análisis entre la densidad de Puntos de Interés (POIs) y el valor del alquiler residencial permite evaluar económicamente el concepto de "vitalidad urbana" o la "ciudad de los 15 minutos". El objetivo de este modelo es determinar si el mercado inmobiliario madrileño penaliza factores asociados a la saturación comercial (ruido, congestión) o si, por el contrario, capitaliza fuertemente la proximidad peatonal a los servicios. Interpretación del Modelo Estadístico A partir del cruce espacial de las variables, la regresión lineal arroja los siguientes resultados clave que definen la estructura de precios:
1. La Capitalización de los Servicios (Pendiente Positiva) El modelo revela una correlación positiva y directamente proporcional. La pendiente de la recta indica que, estadísticamente, el incremento en la concentración de servicios por kilómetro cuadrado presiona el precio del alquiler al alza. Esto demuestra que en Madrid, la demanda valora positivamente la centralidad y la accesibilidad a los servicios, estando los ciudadanos dispuestos a pagar una prima por residir en entornos mixtos y vibrantes. Según la ordenada en el origen de la ecuación, el precio base de partida para un barrio puramente residencial (sin apenas comercios) se sitúa en los 16 €/m², incrementándose progresivamente a medida que aumenta la dotación.
3.1.2 Cobertura de Transporte PúblicoEl análisis entre la cobertura de transporte público y el valor del alquiler residencial permite evaluar económicamente el grado de capitalización de la accesibilidad en la ciudad de Madrid. El objetivo de este modelo es determinar cómo la dotación y proximidad a las redes de movilidad (Metro, Cercanías, nodos de autobuses) influye en la formación de las rentas urbanas, cuantificando la disposición de la demanda a pagar por una mayor conectividad. Interpretación del Modelo Estadístico A partir del cruce espacial de las variables, la regresión lineal arroja los siguientes resultados clave que definen la estructura de precios:
1. La Capitalización de la Accesibilidad (Pendiente Positiva) El modelo revela una correlación positiva y directa. La pendiente de la recta indica que el incremento en la cobertura de transporte público empuja el precio del alquiler sistemáticamente al alza. Esto demuestra que, en Madrid, la red de transporte actúa como un fuerte elemento estructural del valor del suelo; los residentes asumen una prima de conectividad para reducir sus tiempos de desplazamiento diarios. Según la ordenada en el origen de la ecuación, el precio base teórico para un barrio con una conectividad nula (aislamiento total) se situaría en torno a los 16 €/m², cifra que escala de forma constante a medida que mejora la infraestructura del entorno. 2. Capacidad Explicativa (Análisis del [math]R^2[/math]) El coeficiente [math]R^2[/math] de 0.231 indica que, por sí sola, la cobertura de transporte público es capaz de explicar cerca del 23% de la variabilidad del precio del alquiler en el municipio. Aunque su peso explicativo individual es inferior al de la vitalidad urbana (densidad de servicios), explicar una quinta parte del precio de la vivienda con una sola infraestructura es un valor sumamente robusto. Esto consolida al transporte como una variable independiente esencial para comprender los contrastes inmobiliarios de la capital.
3.1.3 Influencia de Barrerras Geográficas (M-30 y M-40)El análisis espacial del precio del alquiler en relación con los grandes anillos de circunvalación viaria (M-30 y M-40) permite evaluar la estructura de la renta urbana basada en el concepto centro-periferia. El objetivo de esta categorización es determinar si las grandes infraestructuras viarias actúan únicamente como ejes de movilidad o si, por el contrario, funcionan como fronteras psicológicas y económicas que segmentan drásticamente el mercado inmobiliario madrileño. Interpretación del Análisis Espacial A partir de la agregación espacial de los barrios en función de su ubicación respecto a los anillos de circunvalación, el gráfico de barras arroja una clara estructura escalonada de los precios medios:
1. La M-30 como "Frontera Económica" El hallazgo más contundente del análisis es la abrupta discontinuidad espacial de precios que genera la M-30. Al cruzar esta autopista hacia el exterior, el valor medio del metro cuadrado sufre un desplome severo. Esto confirma que la M-30 no es solo una vía de tránsito, sino una barrera socioeconómica que delimita el área más valiosa (la almendra central, dotada de la mayor densidad de servicios, transporte e interés turístico) del resto del municipio. La demanda está dispuesta a pagar una enorme prima de centralidad por residir dentro de este primer anillo.
3.2 Estudio Socioeconómico y de MercadoEl análisis socioeconómico aborda la interacción entre las lógicas del mercado turístico, los movimientos demográficos y la disponibilidad de vivienda. Este bloque es fundamental para comprender si el encarecimiento del alquiler en Madrid responde a un crecimiento orgánico de la ciudad o se pueden encontrar anomalías relacionadas con el aumento del turismo o la masificación. Nota Metodológica: Evaluación del Ajuste (Lineal vs. Polinómico) Antes de consolidar los resultados de este bloque, se llevó a cabo un análisis exploratorio para determinar la naturaleza matemática de la relación de los datos previamente obtenidos. Para ello, se evaluó si el comportamiento de los datos respondía mejor a una función lineal simple o a un modelo polinómico de mayor grado. Aunque los ajustes polinómicos (representados en las curvas de regresión exploratorias) pueden aumentar marginalmente el coeficiente [math]R^2[/math] al perseguir a los datos atípicos (outliers), se determinó que la regresión lineal simple explica el fenómeno subyacente con la suficiente robustez estadística sin caer en el sobreajuste (overfitting). Por tanto, los resultados definitivos presentados a continuación se basan exclusivamente en relaciones lineales, garantizando así un modelo explicativo sólido, generalizable y acorde a la teoría urbana tradicional.
2. Dinámicas de Población, Stock de Vivienda y Variación de Precio El análisis conjunto (representado en la visualización multidimensional de regresión múltiple) de la variación poblacional, la evolución del stock de vivienda, la densidad de VUT y el incremento del precio del alquiler confronta la teoría clásica de oferta y demanda con la realidad urbana tensionada. Sin embargo, tal y como se puede apreciar, los valores obtenidos tanto de [math]R^2[/math] como de p-valor son estadísticamente malos, por lo que se necesitará más contexto para determinar si son o no relevantes para el módelo (ver apartado 3.4) Interpretación Demográfica y Residencial Los resultados visibilizan la complejidad de las dinámicas de gentrificación y expansión en Madrid:
Conclusión del Modelo Socioeconómico Las dinámicas analizadas en este bloque demuestran empíricamente que el mercado del alquiler en Madrid se encuentra estructuralmente tensionado por usos no residenciales y crecimiento sistemático de la población. La rentabilidad del mercado turístico (Airbnb), sumado a otros factores mencionados en este estudio, establecen un suelo económico elevado en las áreas centrales, forzando dinámicas de desplazamiento vecinal. Simultáneamente, la capacidad de la periferia para absorber esta demanda desplazada mediante nuevo stock de vivienda amortigua en parte el impacto, aunque no evita el contagio generalizado del alza de precios en toda el área metropolitana. 3.3 Estudio de Influencia Ambiental y ClimáticaA continuación, se muestran y discuten los datos obtenidos relativos a la influencia ambiental y climática: 3.3.1 Teledetección y Temperatura Superficial (LST)El análisis de las temperaturas superficiales (extraídas mediante teledetección satelital para los meses de verano e invierno) frente al precio del alquiler permite evaluar la capitalización de las condiciones ambientales en el mercado inmobiliario. Este enfoque busca determinar cómo el fenómeno de la "Isla de Calor Urbana" (ICU) —la acumulación de calor debido a la densificación, el asfalto y la escasez de zonas verdes— interactúa con el valor del suelo en la capital. 1. El Efecto de la Isla de Calor en Verano El análisis de las temperaturas estivales arroja resultados altamente significativos que revelan una paradoja en la valoración del confort ambiental:
Interpretación del Modelo Estival La recta de regresión presenta una pendiente ligeramente negativa y un [math]R^2[/math] cercano al 6%. Esto indica que, estadísticamente, a menor temperatura superficial en verano, mayor es el precio del alquiler. Evidentemente, la demanda no paga un sobreprecio por sufrir estrés térmico. Lo que este modelo demuestra es que la temperatura estival actúa como un "proxy" (indicador indirecto) de la densidad urbana y la centralidad. Los barrios que retienen más calor en verano son precisamente los de la "almendra central": áreas con altísima compacidad edificatoria, escasa cubierta vegetal, gran sellado del suelo y alta actividad antrópica. Puesto que estos barrios centrales son los más cotizados por su conectividad y dotación, el mercado asume la "penalización climática" de la isla de calor como un mal necesario derivado de vivir en el núcleo económico de la ciudad. 1. El Efecto de la Isla de Calor en Verano El análisis de las temperaturas estivales frente a las rentas residenciales revela una clara estratificación climática y urbana en la capital:
2. El Efecto de la Temperatura en Invierno El cruce del precio con los datos térmicos invernales ofrece un panorama muy similar sobre la estructura del tejido residencial:
Conclusión de la Dinámica Ambiental y Urbana El análisis conjunto de las temperaturas superficiales estivales e invernales constata que la mitigación climática funciona en Madrid como un bien posicional que incrementa el precio. Lejos de ser un fenómeno neutro, la Isla de Calor Urbana (ICU) evidencia una profunda segregación espacial: los distritos de mayores rentas registran temperaturas más bajas todo el año gracias a su menor edificabilidad y abundante arbolado, actuando como refugios climáticos. Por el contrario, los tejidos residenciales más asequibles del sur y sureste sufren una severa penalización ambiental debido a su alta compacidad y jóvenes zonas verdes. En definitiva, estos modelos demuestran empíricamente que el confort térmico es un atributo fuertemente ligado al precio de los alquileres madrileños. 3.3.2 Nivel de Frecuencia de Limpieza de CallesEl análisis entre el Índice de Limpieza (basado en la densidad de avisos y gestión de residuos urbanos) y el valor del alquiler residencial permite evaluar cómo influye el mantenimiento del espacio público en la formación de rentas. Este enfoque busca determinar si la degradación visual o la saturación de residuos actúan como un factor devaluador del suelo o si, por el contrario, el mercado prioriza otros factores de localización pese a los posibles puntos negativos que pudiese ofrecer una mala gestión urbana. Interpretación del Modelo Estadístico A partir del cruce espacial de las variables en los 131 barrios de Madrid, la regresión lineal arroja los siguientes resultados clave:
1. Interpretación de la pendiente (Pendiente positiva) El modelo revela una correlación positiva: a medida que el índice de gestión de residuos aumenta (lo que suele correlacionar con zonas de mayor presión, actividad comercial y avisos), el precio del alquiler tiende a ser más elevado. Esto confirma que, en Madrid, la limpieza actúa como un determinante directo del precio. Aunque los barrios del centro histórico y comercial, que presentan los precios más altos de la ciudad, son los que sufren un mayor desgaste del espacio público y una mayor generación de residuos debido a la población flotante y la actividad turística, tienen un nivel de índice de recogida de basura mayor, lo que proporciona que los espacios públicos estén limpios, y por ende no se vean perjudicados negativamente por la creciente actividad turísitica en el centro de la capital. 2. Capacidad Explicativa (Análisis del [math]R^2[/math]) El coeficiente [math]R^2[/math] de 0.279 indica que el estado de limpieza y gestión de residuos explica aproximadamente el 27.9% de la variabilidad del precio. Aunque es un peso moderado, su significatividad es irrefutable.
3.4 El Modelo Hedónico de Precios Global: Síntesis y Conclusiones del AnálisisEl epígrafe final del análisis de resultados se articula en torno al Modelo Hedónico de Precios Global. Este marco matemático funciona como la conclusión analítica de la investigación, unificando todas las dimensiones aisladas previamente analizadas (accesibilidad, barreras físicas, variables ambientales y dinámicas socioeconómicas) en una única ecuación predictiva y explicativa. Fundamento Teórico del Modelo Hedónico La aplicación de este modelo se fundamenta en la Teoría de los Precios Hedónicos (Rosen, 1974), la cual establece que los bienes heterogéneos —como la vivienda— no poseen un valor fijado de forma monolítica, sino que su precio es la suma de los precios implícitos de cada uno de los atributos que los componen. En el mercado del alquiler de Madrid, un inquilino no paga únicamente por la superficie construida (característica estructural); paga por un "paquete de externalidades" espaciales, ambientales y sociales. El objetivo de transicionar desde los análisis bivariados previos hacia este modelo global es evitar el sesgo de variable omitida. En la realidad urbana, las variables no actúan de forma aislada: la proximidad al transporte público suele correlacionar con una alta densidad comercial y, a su vez, con una mayor densidad de viviendas de uso turístico. Este modelo multivariable permite limpiar esas interferencias interconectadas, aislando el peso neto y real de cada factor sobre el precio del alquiler mensual (€/m²). Metodología Estadística del Modelo Global El modelo global se ha construido mediante una regresión lineal múltiple por Mínimos Cuadrados Ordinarios (OLS) ejecutada a través de los scripts programados en Python. La ecuación matemática general responde a la siguiente estructura: [math]Y = \beta_0 + \beta_1(Transporte) + \beta_2(M30\_M40) + \beta_3(ICU) + \beta_4(Limpieza) + \beta_5(Airbnb) + \beta_6(Stock) + \dots + \epsilon[/math] Donde:
Para garantizar la validez econométrica del modelo global y evitar el problema de la multicolinealidad (que variables independientes se expliquen entre sí distorsionando los resultados), el algoritmo en Python evaluó el Factor de Inflación de la Varianza (VIF). Tras asegurar la independencia de los factores, el modelo normalizó los coeficientes, permitiendo establecer un ranking de importancia relativa: a mayor valor absoluto del coeficiente estandarizado, mayor es el impacto y la sensibilidad de esa variable sobre el precio final. (Anselin, 1988) Interpretación de los Pesos y Jerarquía de Variables Los resultados del modelo global ofrecen la lectura más robusta de la investigación, ya que obligan a todas las variables urbanas a competir simultáneamente entre sí. La lectura que se puede obtener del modelo final es la siguiente:
4 ConclusionesEl presente estudio ha demostrado empíricamente que el mercado del alquiler en la ciudad de Madrid constituye un ecosistema altamente complejo que debe explicarse mediante el uso de variables multidisciplinares. La aplicación de Sistemas de Información Geográfica (SIG/QGIS) y modelos de econometría espacial han permitido diseccionar la geografía del precio, tratando de cuantificar de manera matemática cómo interactúan las externalidades urbanas en la fijación de las rentas residenciales. De la integración del Modelo Hedónico Global se extraen las siguientes conclusiones fundamentales, las cuales dialogan directamente con las principales teorías de la economía urbana y la sociología espacial: 1. El determinismo geográfico y la accesibilidad (El cimiento del valor) Tal y como demuestra el modelo, la geografía física y funcional constituye el pilar fundamental que vertebra el precio del suelo madrileño. Los resultados confirman las teorías clásicas de la renta de situación espacial, donde la proximidad a los nodos de centralidad y la vitalidad urbana (densidad de POIs) justifican las mayores primas económicas. Asimismo, se constata que infraestructuras como la M-30 o la M-40 actúan como verdaderas fronteras socioeconómicas. Cruzar este primer anillo de circunvalación supone una fractura abrupta en los precios, demostrando que la accesibilidad estructurada en torno a la "almendra central" y la cobertura de transporte público pesado siguen siendo las directrices inamovibles de la tasación inmobiliaria (en consonancia con los postulados de la econometría espacial de Anselin, 1988). 2. El medio ambiente urbano como bien posicional de lujo Uno de los hallazgos más reveladores de la investigación es la constatación empírica de la importancia de la componente ambiental. Los datos relativos a la Temperatura Superficial Terrestre (LST) demuestran que el mercado inmobiliario internaliza el confort climático. Lejos de ser un factor neutro, la mitigación de la Isla de Calor Urbana (ICU) actúa como un bien posicional que incrementa el precio: los barrios más exclusivos (norte y noroeste) operan como refugios climáticos gracias a su menor edificabilidad y arbolado maduro. Por el contrario, los distritos del sur y sureste asumen una fuerte penalización ambiental (mayor temperatura estival y sellado del suelo). Esto demuestra que la resiliencia climática y la calidad del entorno (medida también a través de la eficacia en la limpieza viaria) son atributos residenciales fuertemente capitalizados por la demanda. 3. La irrupción del mercado turístico y la reestructuración vecinal Aunque subordinada a la estructura geográfica, la dimensión socioeconómica opera como el catalizador que tensiona actualmente el mercado. El modelo valida matemáticamente la teoría de la "Brecha de Renta" o Rent Gap (Smith, 1979), demostrando que la rentabilidad de las viviendas de uso turístico (VUT) y la continuación del crecimiento poblacional en toda la ciudad, ejercen un efecto de arrastre sobre el alquiler tradicional. Esta presión turística y no reducción de la demanda, imponen lógicas de inversión alcista en los barrios centrales, lo que se traduce en un evidente proceso de reestructuración vecinal (gentrificación): las áreas centrales pierden población residente tradicional, desplazando la demanda hacia coronas periféricas (PAUs) donde el nuevo stock de vivienda amortigua, pero no detiene, la escalada general de precios.
5 ReferenciasAnselin, L. (1988). Spatial econometrics: methods and models. Kluwer Academic Publishers. (1) Ayuntamiento de Madrid. (2026). Portal de Datos Abiertos y Geoportal cartográfico. Recuperado de https://datos.madrid.es/ y https://geoportal.madrid.es/ (2) Banco de España. (2019). El impacto del alquiler turístico en el mercado de la vivienda. Boletín Económico, 3/2019. (3) Consorcio Regional de Transportes de Madrid [CRTM]. (2026). Datos Abiertos y cartografía de la red de Transporte Público. (4) Freeman, L. (2006). There goes the 'hood: Views of gentrification from the ground up. Temple University Press. (5) Idealista. (2026). Informes históricos de evolución del precio de la vivienda en alquiler en la ciudad de Madrid. (6) Inside Airbnb. (2026). Madrid Dataset: Archivo Listings. Recuperado de http://insideairbnb.com/ (7) Ley, D. (1986). Alternative explanations for inner-city gentrification: a Canadian assessment. Annals of the Association of American Geographers, 76(4), 521-535. (8) Ley, D. (1996). The New Middle Class and the Remaking of the Central City. Oxford University Press. (9) Rosen, S. (1974). Hedonic prices and implicit markets: product differentiation in pure competition. Journal of Political Economy, 82(1), 34-55. (10) Smith, N. (1979). Toward a Theory of Gentrification: A Back to the City Movement by Capital, not People. Journal of the American Planning Association, 45(4), 538-548. (11) U.S. Geological Survey [USGS] / NASA. (2026). Landsat 8-9 OLI/TIRS Surface Temperature. Archivo de teledetección espacial EarthExplorer. (12) --- Detalles y uso de las fuentes: 1. Referencia fundamental para la aplicación de los modelos estadísticos de econometría espacial empleados en el estudio y la interpretación del aislamiento de variables. 2. Fuente primaria oficial de la que se ha extraído toda la cartografía base (límites de los 131 barrios, M-30 y M-40), las bases de datos demográficas (Padrón), variaciones del stock residencial catastral, el nivel de frecuencia de limpieza viaria y el catálogo geolocalizado de Puntos de Interés (POIs). 3. Referencia teórica y macroeconómica utilizada para dar contexto y respaldar los hallazgos sobre el tensionamiento de los precios residenciales derivado de la penetración de plataformas de corta estancia. 4. Base de datos espaciales empleada para extraer las geometrías de las estaciones de Metro, Metro Ligero y Cercanías, permitiendo la generación de las áreas de influencia (buffers) del indicador de cobertura de transporte. 5. Estudio sociológico y estadístico utilizado para matizar las teorías de desplazamiento absoluto, aportando evidencia empírica de que la gentrificación y el encarecimiento del suelo no siempre resultan en la expulsión total de las clases bajas residentes, quienes en ocasiones logran permanecer y beneficiarse de la revitalización del entorno. 6. Proveedor de los datos empíricos de mercado utilizados para establecer la variable dependiente de los modelos: la estimación del precio absoluto (€/m²) y el cálculo de la variación porcentual del coste del alquiler (2019-2026). 7. Repositorio de datos masivos a partir del cual se extrajeron las coordenadas y el precio por noche de las Viviendas de Uso Turístico (VUT) para cuantificar la presión de Airbnb en cada barrio. 8. Artículo académico clave empleado para contrastar las teorías de la oferta (Neil Smith). En este texto se evalúan empíricamente las explicaciones alternativas de la gentrificación, demostrando la importancia de los factores demográficos y los cambios en el mercado laboral frente a la pura especulación del suelo. 9. Obra magna y referencia teórica principal para la "teoría del consumo" o enfoque cultural de la gentrificación. Se utiliza para argumentar cómo la transición hacia una economía postindustrial y la aparición de una "nueva clase media" (con nuevas preferencias estéticas, culturales y residenciales) actúan como el motor principal de la revalorización de los centros urbanos. 10. Referencia teórica fundacional sobre la que se sostiene la metodología del Modelo Hedónico de Precios Global desarrollado en Python, justificando la descomposición del precio de la vivienda en la suma de sus atributos (servicios, transporte, clima, etc.). 11. Soporte teórico clave para interpretar la dinámica demográfica en el modelo socioeconómico, justificando el proceso de "Brecha de Renta" (Rent Gap) y la sustitución vecinal (gentrificación) que expulsa a los vecinos hacia las periferias. 12. Fuente de las imágenes satelitales ópticas y térmicas empleadas en el análisis geoespacial para medir la Temperatura Superficial Terrestre (LST) y cartografiar las dinámicas de la Isla de Calor Urbana (ICU) en verano e invierno. 6 AnejosA continuación, se presentan los scripts elaborados en el lenguaje de programación Python para llevar a cabo los diferentes mapas, cálculos y gráficos en el entorno de QGIS. Para no saturar el apartado de anejos, y permitir una buena comprensión de la estructura de programas que han sido utilizados a lo largo del trabajo (aproximadamente un script por cada gráfico generado), se ha decidido incluir los cuatro scripts más representativos, que a su vez, han sido aquellos que han servido como base para realizar todos los demás. Ejemplo Gráfico y regresión lineal import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import linregress
from qgis.core import NULL
# ==========================================================
# 1. CONFIGURACION NOMBRE DE LAS COLUMNAS
# ==========================================================
col_barrio = 'NOMBRE'
col_precio_act = 'Prec_PRECIO_2026'
col_transporte = 'Rod_Cobertura'
capa = iface.activeLayer()
Y_act, X_transp, Nombres = [], [], []
# Extraer datos asegurando que no haya NULLs
for f in capa.getFeatures():
if f[col_precio_act] != NULL and f[col_transporte] != NULL and f[col_barrio] != NULL:
Y_act.append(float(f[col_precio_act]))
X_transp.append(float(f[col_transporte]))
Nombres.append(str(f[col_barrio])) # Guardamos el nombre como texto
Y_act = np.array(Y_act)
X = np.array(X_transp)
# ==========================================================
# 2. CÁLCULOS ESTADÍSTICOS
# ==========================================================
slope, intercept, r_value, p_value, std_err = linregress(X, Y_act)
r2 = r_value**2
# ==========================================================
# 3. GRÁFICO CON CAJA DE ESTADÍSTICAS E INTERACCIÓN
# ==========================================================
fig, ax = plt.subplots(figsize=(9, 6))
fig.suptitle('Impacto del Transporte Público en el Precio del Alquiler',
fontsize=14, fontweight='bold')
props_caja = dict(boxstyle='round,pad=0.5', facecolor='white', alpha=0.9, edgecolor='gray')
# Dibujar puntos guardando la variable "sc" (scatter) para la interactividad
sc = ax.scatter(X, Y_act, alpha=0.6, color='#27ae60', edgecolor='black')
ax.plot(X, slope*X + intercept, color='black', linewidth=2)
# Texto de estadísticas
texto_stats = (f"Ecuación: y = {slope:.2f}x + {intercept:.2f}\n"
f"$R^2$: {r2:.3f}\n"
f"p-valor: {p_value:.4f}")
ax.text(0.05, 0.95, texto_stats, transform=ax.transAxes, fontsize=11,
verticalalignment='top', horizontalalignment='left', bbox=props_caja)
ax.set_title('Cobertura de Transporte vs Precio (2026)', fontweight='bold')
ax.set_xlabel('Cobertura de Transporte Público', fontweight='bold')
ax.set_ylabel('Precio Actual del Alquiler (€/m²)', fontweight='bold', color='#2c3e50')
ax.grid(True, linestyle='--', alpha=0.5)
# ==========================================================
# 4. PROGRAMACIÓN DEL RATÓN
# ==========================================================
# Creamos la etiqueta de anotación vacía e invisible
annot = ax.annotate("", xy=(0,0), xytext=(10,10), textcoords="offset points",
bbox=dict(boxstyle="round,pad=0.4", fc="yellow", alpha=0.8),
arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=0"))
annot.set_visible(False)
# Función que actualiza el texto y posición de la etiqueta
def update_annot(ind):
pos = sc.get_offsets()[ind["ind"][0]]
annot.xy = pos
# Recoger los nombres de los puntos superpuestos (por si hay varios muy juntos)
text = ", ".join([Nombres[n] for n in ind["ind"]])
annot.set_text(text)
annot.get_bbox_patch().set_alpha(0.9)
# Función que detecta el movimiento del ratón
def hover(event):
vis = annot.get_visible()
if event.inaxes == ax:
cont, ind = sc.contains(event)
if cont:
update_annot(ind)
annot.set_visible(True)
fig.canvas.draw_idle()
else:
if vis:
annot.set_visible(False)
fig.canvas.draw_idle()
# Conectar el evento de movimiento del ratón a nuestra gráfica
fig.canvas.mpl_connect("motion_notify_event", hover)
plt.tight_layout()
plt.show()Modelo Hedónico de Precios import numpy as np
import matplotlib.pyplot as plt
from qgis.core import NULL
from qgis.PyQt.QtWidgets import QDialog, QVBoxLayout, QTextEdit, QPushButton
# ==========================================================
# 1. CONFIGURACIÓN DE LOS DOS MODELOS CON LAS VARIABLES
# ==========================================================
# MODELO 1: DETERMINANTES DEL VALOR ACTUAL
y1_col = 'Prec_PRECIO_2026'
x1_cols = [
('Rod_Cobertura', 'Cobertura Transporte'),
('POIS_Indicador', 'Densidad POIs (Servicios)'),
('Indice_field_12', 'Índice de Basura'),
('t_mean_C', 'Isla de Calor (Verano)'),
('invierno_t_mean_C', 'Isla de Calor (Invierno)'),
('Airbnb_precio_n_1', 'Precio Noche Airbnb'),
('Airbnb_densidad', 'Presión Turística (Densidad)') # <-- Ahora evalúa el Precio Actual
]
# MODELO 2: ACELERADORES DEL PRECIO
y2_col = 'Prec_VAR_PRECIO_PCT'
x2_cols = [
('Var_Pob', 'Variación Población'),
('Stock_VAR_STOCK_19_24_PCT', 'Variación Stock Vivienda')
# Presión Turística eliminada de este modelo
]
capa = iface.activeLayer()
# Iniciamos el texto HTML explicativo
texto_resultados = """
<h1 style='color: #2c3e50; text-align: center;'>Informe del Análisis Hedónico Espacial</h1>
<p style='font-size: 14px; text-align: center;'><i>Resumen estadístico de las dinámicas de mercado en Madrid</i></p>
<hr>
"""
def ejecutar_modelo(y_nombre, lista_x, titulo_grafico):
global texto_resultados
nombres_x = [item[1] for item in lista_x]
cols_x = [item[0] for item in lista_x]
data_y, data_x = [], []
# ------------------------------------------------------
# A. Extracción y Limpieza
# ------------------------------------------------------
for f in capa.getFeatures():
if f[y_nombre] == NULL or any(f[c] == NULL for c in cols_x):
continue
try:
val_y = float(str(f[y_nombre]).replace(',', '.'))
vals_x = [float(str(f[c]).replace(',', '.')) for c in cols_x]
data_y.append(val_y)
data_x.append(vals_x)
except ValueError:
continue
if not data_y: return
Y = np.array(data_y)
X = np.array(data_x)
# ------------------------------------------------------
# B. Estandarización y Regresión Global
# ------------------------------------------------------
Y_norm = (Y - np.mean(Y)) / np.std(Y)
X_norm = (X - np.mean(X, axis=0)) / np.std(X, axis=0)
X_norm_int = np.column_stack((np.ones(len(Y_norm)), X_norm))
coefs, _, _, _ = np.linalg.lstsq(X_norm_int, Y_norm, rcond=None)
y_pred = X_norm_int.dot(coefs)
ss_tot = np.sum((Y_norm - np.mean(Y_norm))**2)
r2_global = 1 - (np.sum((Y_norm - y_pred)**2) / ss_tot)
pesos = coefs[1:]
# ------------------------------------------------------
# C. Cálculo de Aportación Única (Drop-in R²)
# ------------------------------------------------------
aportaciones = []
for i in range(len(cols_x)):
X_reduced = np.delete(X_norm_int, i+1, axis=1)
c_red, _, _, _ = np.linalg.lstsq(X_reduced, Y_norm, rcond=None)
y_pred_red = X_reduced.dot(c_red)
r2_red = 1 - (np.sum((Y_norm - y_pred_red)**2) / ss_tot)
caida_r2 = max(0, r2_global - r2_red)
aportaciones.append(caida_r2)
# ------------------------------------------------------
# D. GUARDAR EN EL TEXTO PARA LA VENTANA (Formato Explicativo)
# ------------------------------------------------------
texto_resultados += f"<h2 style='color: #2980b9;'>{titulo_grafico}</h2>"
texto_resultados += "<h3 style='color: #34495e;'>Desglose del impacto por variable:</h3>"
texto_resultados += "<ul style='font-size: 14px; line-height: 1.6;'>"
for i in range(len(nombres_x)):
direccion = "impulsa al alza" if pesos[i] > 0 else "presiona a la baja"
color_dir = "green" if pesos[i] > 0 else "red"
texto_resultados += f"<li><b>{nombres_x[i]}</b>: Esta variable <span style='color: {color_dir}; font-weight: bold;'>{direccion}</span> el mercado (Fuerza Beta: {pesos[i]:+.3f}). Si la elimináramos del análisis, perderíamos un <b>{aportaciones[i]*100:.2f}%</b> de nuestra capacidad para explicar los precios.</li>"
texto_resultados += "</ul><hr>"
# ------------------------------------------------------
# E. Generación del Gráfico
# ------------------------------------------------------
fig, ax = plt.subplots(figsize=(11, 7), layout='constrained')
colores = ['#e74c3c' if p > 0 else '#2ecc71' for p in pesos]
bars = ax.barh(nombres_x, pesos, color=colores, edgecolor='black', alpha=0.8)
max_abs_val = max(abs(min(pesos)), abs(max(pesos)))
ax.set_xlim(-max_abs_val * 1.2, max_abs_val * 1.2)
for bar in bars:
w = bar.get_width()
desplazamiento = max_abs_val * 0.02
ax.text(w + (desplazamiento if w > 0 else -desplazamiento), bar.get_y() + bar.get_height()/2,
f'{w:+.3f}', va='center', ha='left' if w > 0 else 'right', fontweight='bold')
ax.axvline(0, color='black', linewidth=1)
ax.set_title(f'{titulo_grafico}\n(R² = {r2_global:.3f}
import numpy as np
from qgis.core import NULL
from qgis.PyQt.QtWidgets import QDialog, QVBoxLayout, QFormLayout, QDoubleSpinBox, QLabel, QFrame, QSlider, QHBoxLayout
from qgis.PyQt.QtCore import Qt
# ==========================================================
# 1. CONFIGURACIÓN DEL MODELO DE PRECIO (El de Valor Actual)
# ==========================================================
y_col = 'Prec_PRECIO_2026'
x_cols = [
('Rod_Cobertura', 'Cobertura Transporte (%)'),
('POIS_Indicador', 'Densidad de Servicios (POIs)'),
('Indice_field_12', 'Índice de Basura'),
('t_mean_C', 'Isla de Calor Verano (ºC)'),
('invierno_t_mean_C', 'Isla de Calor Invierno (ºC)'),
('Airbnb_precio_n_1', 'Precio Noche Airbnb (€)'),
('Airbnb_densidad', 'Presión Turística (Densidad)') # <-- Variable añadida aquí
]
capa = iface.activeLayer()
data_y, data_x = [], []
cols_x = [item[0] for item in x_cols]
nombres_x = [item[1] for item in x_cols]
# ==========================================================
# 2. EXTRACCIÓN DE DATOS Y ENTRENAMIENTO "REAL" (NO ESTANDARIZADO)
# ==========================================================
for f in capa.getFeatures():
if f[y_col] == NULL or any(f[c] == NULL for c in cols_x):
continue
try:
val_y = float(str(f[y_col]).replace(',', '.'))
vals_x = [float(str(f[c]).replace(',', '.')) for c in cols_x]
data_y.append(val_y)
data_x.append(vals_x)
except ValueError:
continue
Y = np.array(data_y)
X = np.array(data_x)
# Calculamos medias, mínimos y máximos para configurar la calculadora
X_means = np.mean(X, axis=0)
X_mins = np.min(X, axis=0)
X_maxs = np.max(X, axis=0)
# Regresión Múltiple en bruto (para obtener € reales)
X_int = np.column_stack((np.ones(len(Y)), X))
coefs, _, _, _ = np.linalg.lstsq(X_int, Y, rcond=None)
intercepto = coefs[0]
pesos_reales = coefs[1:]
# ==========================================================
# 3. CONSTRUCCIÓN DE LA INTERFAZ GRÁFICA (CALCULADORA)
# ==========================================================
class CalculadoraPrecios(QDialog):
def __init__(self):
super().__init__()
self.setWindowTitle("Tasador Inmobiliario - Madrid 2026")
self.resize(500, 550) # Aumentamos un poco el alto para que quepa bien el nuevo campo
self.setStyleSheet("background-color: #f4f6f7; font-size: 11pt;")
layout_principal = QVBoxLayout()
# Título
lbl_titulo = QLabel("<b>Simulador de Alquiler por Barrio</b>")
lbl_titulo.setAlignment(Qt.AlignCenter)
lbl_titulo.setStyleSheet("font-size: 14pt; color: #2c3e50; margin-bottom: 10px;")
layout_principal.addWidget(lbl_titulo)
# Formulario para los inputs del modelo
self.form_layout = QFormLayout()
self.spinboxes = []
for i in range(len(nombres_x)):
spinbox = QDoubleSpinBox()
spinbox.setRange(X_mins[i] - 10, X_maxs[i] + 10)
spinbox.setDecimals(2)
spinbox.setSingleStep( (X_maxs[i] - X_mins[i]) / 100 )
spinbox.setValue(X_means[i])
spinbox.setStyleSheet("background-color: white; padding: 3px;")
spinbox.valueChanged.connect(self.actualizar_precio)
self.spinboxes.append(spinbox)
self.form_layout.addRow(f"{nombres_x[i]}:", spinbox)
layout_principal.addLayout(self.form_layout)
# Línea separadora
linea1 = QFrame()
linea1.setFrameShape(QFrame.HLine)
linea1.setFrameShadow(QFrame.Sunken)
layout_principal.addWidget(linea1)
# === BARRA DE METROS CUADRADOS ===
layout_m2 = QVBoxLayout()
self.lbl_m2 = QLabel("<b>Superficie del piso: 80 m²</b>")
self.lbl_m2.setAlignment(Qt.AlignCenter)
self.lbl_m2.setStyleSheet("color: #2980b9; font-size: 12pt;")
layout_m2.addWidget(self.lbl_m2)
self.slider_m2 = QSlider(Qt.Horizontal)
self.slider_m2.setRange(20, 300) # De 20 a 300 metros cuadrados
self.slider_m2.setValue(80) # Empieza en 80m2 por defecto
self.slider_m2.setTickPosition(QSlider.TicksBelow)
self.slider_m2.setTickInterval(10)
self.slider_m2.valueChanged.connect(self.actualizar_precio)
layout_m2.addWidget(self.slider_m2)
layout_principal.addLayout(layout_m2)
# Línea separadora
linea2 = QFrame()
linea2.setFrameShape(QFrame.HLine)
linea2.setFrameShadow(QFrame.Sunken)
layout_principal.addWidget(linea2)
# Etiqueta del Precio Final (Muestra ambos: €/m2 y Total)
self.lbl_resultado = QLabel("Calculando...")
self.lbl_resultado.setAlignment(Qt.AlignCenter)
self.lbl_resultado.setStyleSheet("font-size: 13pt; color: #34495e; padding: 15px; background-color: #fdebd0; border-radius: 8px;")
layout_principal.addWidget(self.lbl_resultado)
self.setLayout(layout_principal)
# Calcular el valor inicial nada más abrir
self.actualizar_precio()
def actualizar_precio(self):
# 1. Calcular el precio por metro cuadrado según el modelo
precio_estimado_m2 = intercepto
for i in range(len(self.spinboxes)):
valor_usuario = self.spinboxes[i].value()
precio_estimado_m2 += valor_usuario * pesos_reales[i]
precio_estimado_m2 = max(0, precio_estimado_m2) # Evitar precios negativos
# 2. Leer los metros cuadrados de la barra
metros_cuadrados = self.slider_m2.value()
self.lbl_m2.setText(f"<b>Superficie del piso: {metros_cuadrados} m²</b>")
# 3. Calcular el precio total
precio_total = precio_estimado_m2 * metros_cuadrados
# 4. Actualizar el texto en pantalla (formateado con separador de miles)
texto_final = (
f"Valor de la zona: <b>{precio_estimado_m2:.2f} €/m²</b><br><br>"
f"<span style='font-size: 18pt; font-weight: bold; color: #e74c3c;'>"
f"ALQUILER TOTAL: {precio_total:,.0f} €/mes</span>"
)
self.lbl_resultado.setText(texto_final.replace(',', '.')) # Formato europeo para los miles
# Ejecutar la Calculadora
calc = CalculadoraPrecios()
calc.exec_()
6.1 Clasificación jerárquica de dotacionesfrom qgis.core import *
from qgis.utils import iface
capa = iface.activeLayer()
campo_tipo = 'CAT_TIPO'
campo_peso = 'peso_inmo'
pesos = {
3: [
'GALERÍAS DE ARTE', 'COLEGIOS PRIVADOS CONCERTADOS', 'OTROS ORGANISMOS INTERNACIONALES',
'ADMINISTRACIÓN CENTRAL', 'SALAS DE EXPOSICIONES', 'BIBLIOTECAS ESPECIALIZADAS',
'CONSEJERÍAS ASAMBLEA PRESIDENCIA CAM', 'AUDITORIOS Y SALAS DE CONCIERTO',
'MONUMENTOS EDIFICIOS ARTÍSTICOS', 'UNION EUROPEA', 'BIBLIOTECAS PATRIMONIALES',
'CAMPOS GOLF', 'CONSORCIOS', 'FUNDACIONES CULTURALES', 'MUSEOS', 'LIBRERÍAS',
'TEATROS', 'CENTROS ALTO RENDIMIENTO DEPORTIVO', 'OTROS CENTROS UNIVERSITARIOS',
'EMBAJADAS Y CONSULADOS', 'FACULTADES', 'SALAS DE CONGRESOS', 'COLECCIONES BOTÁNICAS',
'PARQUES HISTÓRICOS', 'REALES ACADEMIAS', 'SALAS DE SUBASTAS', 'HIPÓDROMOS'
],
2: [
'AEROPUERTOS Y AERÓDROMOS', 'ENTIDADES COLABORADORAS LICENCIAS DE ACTIVIDAD ECLUS',
'APARCAMIENTOS RESIDENTES', 'CÁMARAS COMERCIO', 'GALERÍAS COMERCIALES',
'ESCUELAS UNIVERSITARIAS', 'CINES Y FILMOTECAS', 'HOSPITALES CLÍNICAS SANATORIOS',
'ESCUELAS INFANTILES PRIVADAS GUARDERÍAS', 'CONSERVATORIOS ESCUELAS MÚSICA Y DANZA',
'ESTACIONES TREN', 'INTERCAMBIADORES TRANSPORTE', 'MERCADOS', 'RECINTOS FERIALES'
],
1: [
'OFICINAS AGENCIA TRIBUTARIA ESTATAL', 'OFICINAS DE INFORMACIÓN DE LA SEGURIDAD SOCIAL',
'AGENCIAS ORGANISMOS Y EMPRESAS', 'ORGANISMOS EMPRESAS MUNICIPALES',
'GOBIERNO MUNICIPAL ALCALDE JUNTA GOBIERNO', 'ARCHIVOS CENTROS DOCUMENTACION',
'ENTIDADES RELIGIOSAS', 'ASOCIACIONES CULTURALES Y CASAS REGIONALES', 'JUZGADOS',
'AUDIENCIAS TRIBUNALES', 'CENTROS CULTURALES', 'SALAS DE ESTUDIO Y LECTURA',
'TEMPLOS IGLESIAS CATÓLICAS', 'BIBLIOMETRO Y BIBLIORED', 'BIBLIOTECAS PÚBLICAS',
'PARQUES Y JARDINES', 'ALQUILER TALLERES Y BICICLETAS', 'ESCUELAS INFANTILES PÚBLICAS',
'COLEGIOS PÚBLICOS', 'GIMNASIOS', 'PISCINAS', 'CAMPOS ESTADIOS FUTBOL',
'INSTITUTOS ENSEÑANZA SECUNDARIA', 'COMISARIAS OFICINAS DE POLICÍA',
'OFICINAS DNI Y PASAPORTE', 'AYUNTAMIENTO DE MADRID', 'ESTACIONES AUTOBÚS',
'VIVEROS EMPRESAS', 'INSTALACIONES DEPORTIVAS BÁSICAS', 'OFICINAS DE CORREOS',
'ZOOS Y ACUARIOS', 'PLANETARIOS', 'CLÍNICAS CENTROS VETERINARIOS', 'CANCHAS BALONCESTO'
],
-3: [
'ALBERGUES SOCIALES Y CENTROS DE ACOGIDA', 'CENTROS DE DÍA PERSONAS CON DISCAPACIDAD',
'CENTROS OCUPACIONALES PERSONAS CON DISCAPACIDAD', 'CENTROS ATENCIÓN SOCIAL A PERSONAS CON DISCAPACIDAD',
'ASOCIACIONES ACCIÓN SOCIAL', 'ASOCIACIONES INMIGRANTES', 'ASOCIACIONES COOPERACIÓN Y DESARROLLO',
'CEMENTERIOS', 'CENTROS ASISTENCIA DROGODEPENDIENTES', 'CENTROS ATENCIÓN SOCIAL INTEGRACIÓN DE INMIGRANTES',
'COMEDORES SOCIALES', 'SERVICIOS GRUA', 'TANATORIOS', 'DEPURADORAS TRATAMIENTO RESIDUOS',
'PUNTOS LIMPIOS FIJOS', 'PUNTOS LIMPIOS MÓVILES', 'FUNERARIAS', 'CENTROS SALUD MENTAL',
'CENTROS DE REHABILITACIÓN PSICOSOCIAL'
]
}
pr = capa.dataProvider()
if capa.fields().indexFromName(campo_peso) == -1:
pr.addAttributes([QgsField(campo_peso, QVariant.Int)])
capa.updateFields()
idx_tipo = capa.fields().indexFromName(campo_tipo)
idx_peso = capa.fields().indexFromName(campo_peso)
capa.startEditing()
for feature in capa.getFeatures():
valor_texto = str(feature[idx_tipo]).upper().strip()
peso_asignado = 0 # Neutro por defecto
for peso, lista in pesos.items():
if valor_texto in lista:
peso_asignado = peso
break
capa.changeAttributeValue(feature.id(), idx_peso, peso_asignado)
capa.commitChanges()
print("Proceso de pesaje inmobiliario finalizado.") |