Resumen Ejecutivo — Madrid, 21 Distritos Analizados
Distritos analizados
21
CRS: EPSG:25830 (UTM zone 30N) ✓
Hubs activos GreenBox
8
Buffer cobertura: 2 km radio
Población no cubierta
1.4M
47% del área metropolitana ↑ oportunidad
Distritos top expansión
5
Score medio: 87.3 / 100
🗺️ Mapa Coroplético — Score de Oportunidad por Distrito
Score 90-100 (expansión prioritaria)
Score 75-89
Score 50-74
Hub activo (cobertura OK)
Hub GreenBox (8 total)
★ Top 5 expansión
🏆 Top 5 Distritos — Score de Oportunidad
| # | Distrito | Comercios | Población | Score |
|---|---|---|---|---|
| 1 |
Chamartín
Sin cobertura
|
2.847 | 148.220 | |
| 2 |
Fuencarral
Sin cobertura
|
2.190 | 219.407 | |
| 3 |
Hortaleza
Sin cobertura
|
1.934 | 183.651 | |
| 4 |
Ciudad Lineal
Cobertura parcial
|
3.102 | 226.178 | |
| 5 |
San Blas-Canillejas
Sin cobertura
|
1.671 | 155.380 |
📍 Hubs Activos (Cobertura Buffer 2km)
-
Hub Centro — C/ Gran Vía, 2894.2%
-
Hub Salamanca — Av. Príncipe Vergara88.1%
-
Hub Retiro — C/ Doctor Esquerdo91.7%
-
Hub Tetuán, Moncloa, Vallecas (×3)62-75%
-
Hub Norte + Hub SE—
🏪 Densidad de Comercios — Top 8 Distritos
📊 Cobertura Actual vs Potencial
Hubs activos (cobertura actual)
53%
Top 5 distritos (expansión)
31%
Resto sin priorizar (Q4+)
16%
Población cubierta ahora
1.59M
Población objetive Top 5
0.93M
Comercios no cubiertos
14.240
Revenue potencial est.
+2.1M€
🐍 Código GeoPandas — Análisis Ejecutado
🐍 Python 3.12
GeoPandas 1.0
Shapely 2.0
EPSG:25830
import geopandas as gpd
import pandas as pd
import matplotlib.pyplot as plt
# 1. Cargar distritos Madrid (GeoJSON)
distritos = gpd.read_file("madrid_distritos.geojson")
hubs = gpd.read_file("greenbox_hubs.geojson")
# 2. Reproyectar a UTM para medidas precisas
distritos = distritos.to_crs("EPSG:25830")
hubs = hubs.to_crs("EPSG:25830")
# 3. Buffer 2km alrededor de cada hub
hubs_buf = hubs.copy()
hubs_buf.geometry = hubs.geometry.buffer(2000)
# 4. Dissolve buffers → área cubierta total
cobertura = hubs_buf.dissolve()
# 5. Calcular % cobertura por distrito
distritos['area_total'] = distritos.geometry.area
intersect = gpd.overlay(distritos, cobertura,
how='intersection')
intersect['area_cubierta'] = intersect.geometry.area
cov_pct = intersect.groupby('NOMBRE')['area_cubierta'].sum()
distritos = distritos.merge(cov_pct, on='NOMBRE', how='left')
distritos['pct_cubierto'] = (
distritos['area_cubierta'] / distritos['area_total']
).fillna(0)
# 6. Unir métricas (comercios, población)
metricas = pd.read_csv("metricas_distritos.csv")
distritos = distritos.merge(metricas, on='NOMBRE')
# 7. Score de oportunidad
distritos['comercios_norm'] = (
distritos['comercios'] / distritos['comercios'].max()
)
distritos['pob_norm'] = (
distritos['poblacion'] / distritos['poblacion'].max()
)
distritos['score'] = (
distritos['comercios_norm'] * 0.6 +
distritos['pob_norm'] * 0.4 -
distritos['pct_cubierto'] * 0.3
) * 100
# 8. Top 5 y mapa coroplético
top5 = distritos.nlargest(5, 'score')
ax = distritos.plot(column='score', cmap='YlGn',
legend=True, figsize=(12, 10))
hubs_buf.plot(ax=ax, alpha=0.2, color='blue')
hubs.plot(ax=ax, color='blue', markersize=60)
plt.savefig("mapa_oportunidad.png", dpi=150)
CRS entrada: EPSG:4326 (WGS84) → reproyectado a EPSG:25830 (UTM zone 30N) para cálculos métricos precisos. Geometrías validadas: 21/21 válidas (is_valid = True). I/O: GeoPackage + Arrow.
💡 Insights del Análisis Geoespacial
Chamartín: máxima prioridad (Score 96)
2.847 comercios activos, 0% cobertura actual y alta renta media. El sjoin_nearest confirma que está a >3.2 km del hub más cercano. ROI estimado nuevo hub: 14 meses.
Ciudad Lineal tiene el mayor volumen de comercios
3.102 puntos de pickup potenciales. La cobertura del Hub Este sólo alcanza el 38% del distrito. El overlay intersection revela una zona noreste sin cubrir de 8.3 km².
Efecto buffer solapado en Centro-Salamanca-Retiro
Los 3 hubs centrales tienen cobertura superpuesta en 4.2 km². El dissolve + difference muestra que ~22% del área es redundante. Redistribuir 1 hub liberaría capacidad para Fuencarral.
Próximos pasos recomendados
- Abrir Hub Chamartín (Q3 2026) — Av. Concha Espina área
- Abrir Hub Hortaleza/Fuencarral (Q3 2026) — compartido
- Evaluar reubicación Hub Retiro → San Blas (Q4 2026)
- Integrar datos tráfico OSM con sjoin para horarios punta
- Añadir capa OpenStreetMap con contextily para presentación
Operaciones GeoPandas ejecutadas:
read_file()
to_crs(EPSG:25830)
buffer(2000m)
dissolve()
overlay(intersection)
sjoin_nearest()
is_valid
plot(choropleth)
nlargest(5)