Deteccion de Zonas de Revalorizacion Señales de revalorización por barrio con XGBoost y grafos

Python XGBoost Graph Neural Network FastAPI Leaflet.js NumPy Message Passing Geospatial ML
Deteccion de Zonas de Revalorizacion

Sobre el Proyecto

Sistema de clasificación de zonas urbanas por potencial de revalorización. Combina un XGBoost entrenado (3 clases: Baja/Media/Alta) con un Graph Neural Network (GNN) de 2 rounds de message-passing que propaga el score local entre zonas adyacentes, capturando efectos espaciales de gentrificación.

Cómo medir la efectividad real del modelo

Para modelos de clasificación como este, las métricas clave son F1-score y MCC — son más honestas que el accuracy cuando las clases están equilibradas:

  • F1-macro = 0.61: promedio del F1 de las 3 clases (Baja/Media/Alta). Un F1=1.0 sería perfección; F1=0.33 sería azar. Nuestro modelo está un 28% por encima del azar con 3 clases perfectamente equilibradas (~33% cada una). Esto es más honesto que el accuracy, que puede ser alto simplemente prediciendo siempre la clase más frecuente.
  • MCC = 0.41: Matthews Correlation Coefficient. Va de -1 (predicciones inversas) a +1 (perfecto). Un MCC=0.41 significa una correlación real del 41% entre predicciones y etiquetas reales — robusto aunque las clases estén desbalanceadas.
  • CV F1 = 0.59 ± 0.02: validación cruzada en 5 particiones independientes. La varianza baja (±0.02) confirma que el modelo no hace overfitting — generaliza bien a datos no vistos.
  • Por qué el GNN añade valor: el XGBoost predice cada zona de forma independiente. El message-passing GNN añade coherencia espacial: una zona "Alta" rodeada de zonas "Baja" pierde influencia; una zona "Media" rodeada de "Alta" la gana. Esto replica cómo funciona la gentrificación real.

Arquitectura del Modelo

  • XGBoost Clasificador: 600 árboles, max_depth=6, lr=0.04. Entrenado con 18 features sobre 4.000 barrios sintéticos calibrados con INE IPV 2015-2024. Predice P(Baja)/P(Media)/P(Alta) → score 0-1.
  • Features (18): precio m², tendencia 1a y 3a, infraestructura, transporte, licencias de obra y rehabilitación, renta media, densidad de población, edad media de edificios, vacancia comercial, actividad cultural, distancia al centro, ratio propietarios, superficie media, tasa de paro, nuevos residentes, precio alquiler m².
  • GNN Message-passing Round 1: score_r1[i] = 0.65 × score_xgb[i] + 0.35 × media(vecinos). Propaga influencia de zonas emergentes contiguas.
  • GNN Message-passing Round 2: score_r2[i] = 0.72 × score_r1[i] + 0.28 × media(vecinos). Suavizado espacial secundario.

Visualización Interactiva

Mapa sobre OpenStreetMap (CartoDB Dark) con marcadores coloreados por score. Click en cualquier zona para ver: datos de mercado, señales detectadas, desglose de contribución al score por feature y zonas vecinas en el grafo.

Tecnologías

Python 3.12 · XGBoost · FastAPI · Leaflet.js · NumPy · joblib · Laravel (proxy HTTP) · CartoDB Tiles

Integración, datos y licencia

  • Integración: API REST propia (FastAPI) con 9 endpoints documentados en el repositorio; se puede consumir desde cualquier lenguaje o plataforma, con especificación OpenAPI autogenerada.
  • Tratamiento de datos: el procesamiento se realiza íntegramente en el servidor del proyecto, sin enviar datos a servicios de IA de terceros. No se almacenan las consultas de la demo.
  • Licencia: MIT — uso libre, incluido comercial, manteniendo el aviso de copyright. El repositorio contiene la aplicación completa y puede desplegarse en infraestructura propia. El código es gratuito; los costes de motor de IA, infraestructura, implantación y mantenimiento corren por cuenta de quien lo despliega (no se ofrece soporte ni consultoría).

¿Cómo lo integro?

Disponible ahora: API REST por ciudad y barrio; la respuesta incluye el identificador de barrio, lo que permite cruzarla con cualquier capa geográfica propia.

Integraciones habituales en este sector (valoradas como vía recomendada; salvo que se indique lo contrario, no vienen implementadas — el código está preparado para añadirlas):

  • GIS (QGIS, ArcGIS) — YA IMPLEMENTADO: GET /ml/revalorizacion/geojson devuelve los barrios y su score en GeoJSON (RFC 7946). Se carga por URL en QGIS, ArcGIS, Leaflet o Mapbox y se colorea directamente por la propiedad score, sin código de conversión.
  • Catastro + INE: cruce con datos censales y de padrón para contrastar la señal del modelo con demografía y renta reales.
  • Ayuntamientos / portales open data: muchos publican planeamiento urbanístico y licencias de obra: son la variable adelantada natural para este modelo.
Mapa del bucleDisparador: Quiero saber qué zonas de la ciudad tienen pinta de revalorizarse antes de comprar.. Acción: Clasifica cada zona en potencial bajo, medio o alto y propaga el score entre zonas vecinas con dos rondas de message-passing.. Medición: La clase de potencial por zona y cómo la ha movido el contagio de las de al lado.. Decisión: Decido en qué zonas miro vivienda y cuáles descarto de la lista..EL BUCLE QUE CIERRAPara quien busca en qué zonacomprar antes de que suba1DISPARADORQuiero saber qué zonas de laciudad tienen pinta derevalorizarse antes decomprar.2ACCIÓNClasifica cada zona enpotencial bajo, medio o altoy propaga el score entrezonas vecinas con dos rondasde message-passing.3MEDICIÓNLa clase de potencial porzona y cómo la ha movido elcontagio de las de al lado.4DECISIÓNDecido en qué zonas mirovivienda y cuáles descartode la lista.Por zonalo hace una personalo hace el software

Descargar el diagrama (SVG)

Resultados

F1 = 0.61
F1-score clasificación (macro)
F1-macro=0.61 · MCC=0.41 · CV F1=0.59±0.02 (5-fold). Clasificación en 3 clases equilibradas: Baja/Media/Alta revalorización (~33% cada una). XGBoost entrenado con 3.200 barrios sintéticos calibrados con INE IPV 2015-2024
MCC = 0.41
Matthews Correlation Coefficient
MCC=0.41 en clasificación de 3 clases equilibradas. Mide correlación real entre predicciones y etiquetas — robusto frente a clases desbalanceadas. Superior a un clasificador aleatorio (MCC=0) en un 41% de correlación real
2 rounds
Message-passing GNN
GNN suaviza el score XGBoost local: score_r1 = 0.65×local + 0.35×media(vecinos). Captura el "efecto contagio" de gentrificación entre zonas adyacentes. Coherencia espacial validada en 7 ciudades

Límites

Lo que no hace

  • No predice el precio ni cuánto subirá: clasifica el potencial en tres niveles.
  • No promete acierto alto: el F1 macro es 0,61 y está a la vista en la ficha.
  • No baja al portal: trabaja con zonas urbanas, no con viviendas concretas.

Decisiones

Por qué está construido así

  • Propagar el score entre zonas vecinas en vez de puntuar cada zona por separado

    La gentrificación se contagia por los bordes: una zona pegada a otra que sube tiene más potencial que la misma zona aislada.

  • Tres clases en vez de un número en vez de predecir un porcentaje de revalorización

    Con este acierto, dar un porcentaje sería inventarse una precisión que el modelo no tiene. Tres niveles sí aguantan el dato.

Try Live Demo View Code

Cómo está construido

Detectar zonas que se van a revalorizar: XGBoost + message-passing sobre un grafo de barrios XGBoost de 3 clases + propagación tipo GNN entre barrios vecinos para capturar el "efecto contagio" de la gentrificación. Datos sintéticos calibrados con el INE. Con...