BiznagaFest

El detector
de verdades

Turismo, territorio, Google Cloud e IA en Málaga

0 / 5 ★
Laura Morillo-Velarde
Laura Morillo-Velarde
GDE Google Cloud laura.morillovelarde@gmail.com
BiznagaFest
2 / 34
Bloque 01 · El problema y enfoque global

La ilusión de
la nota media

4,46 / 5
NOTA MEDIA GLOBAL EN LA PROVINCIA DE MÁLAGA
01

Invita a la autocomplacencia

Un sobresaliente provincial transmite que todo funciona y que no hace falta actuar

02

Los extremos se anulan

Mezcla la cala tranquila por la mañana con la calle saturada de madrugada

03

Ceguera para gestionar

Una media global no indica dónde reforzar limpieza, movilidad o descanso

4,87 M
RESEÑAS ANALIZADAS
103 mun.
9 COMARCAS + 11 DIST.
4 fuentes
GMAPS · BOOKING · TRIP · AIRBNB
BiznagaFest
3 / 34
Bloque 01 · El problema y enfoque global

Un «mar de 4,4»
que no discrimina nada

Escala de estrellas (1 ★ a 5 ★)Franja real: 4,17 ★ – 4,61 ★
Los 11 distritos y las 9 comarcas quedan concentrados en la misma banda de color verde.
Mapa de los 11 distritos de Málaga con notas entre 4,17 y 4,61 estrellas
01

Compresión entre 4,2 y 4,6 ★

Al bajar a los 11 distritos y 103 municipios, casi todos empatan en la misma franja

02

Barrios opuestos, misma nota

El Centro (4,50 ★), Málaga Este (4,47 ★), Ctra. Cádiz (4,44 ★) o Teatinos (4,43 ★) parecen iguales

03

Un mapa teñido del mismo verde

Si todos los barrios salen en verde, no sabes dónde hay ruido, dónde faltan aparcamientos o dónde todo va bien

BiznagaFest
4 / 34
Bloque 01 · El problema y enfoque global

¿Por qué todo
sale en 4,5 ★?

38,2% con «PERO»
RESEÑAS POSITIVAS CON QUEJA OPERATIVA REAL
01

La cortesía con el negocio

Nos da apuro bajarle la nota a un camarero amable y dejamos 4 o 5 estrellas

02

Elogio antes, queja después

Antes del «pero» se aplaude el trato; detrás aparece la incomodidad real

03

Lo que las estrellas no ven

El calor por falta de sombra o la saturación del local quedan ocultos en el texto

5 / 5
Dashboard: «Todo perfecto»
1 · Elogio de cortesía al negocio (lo que da las 5 ★)

«El espeto estaba muy bueno y el camarero fue un encanto...»

PERO · BUT · MAIS · ABER
2 · Lo que queda oculto en el texto (invisible para las estrellas)

«... en la terraza hacía mucho calor porque no había sombrillas y el interior estaba un poco abarrotado.»

Calor · Sin sombrillas
Interior abarrotado
BiznagaFest
5 / 34
Bloque 01 · El problema y enfoque global

Cuatro preguntas que vamos a responder hoy

PREGUNTA 01

¿Qué esconden las estrellas tras el «PERO»?

Separar el halago cortés de la queja real (aparcamiento, colas, precios o ruido) en 4,87 M de reseñas

PREGUNTA 02

¿Dónde se concentra la presión y quién sufre más la fricción?

Medir el peso de la costa y del Centro frente al interior, y comparar al visitante extranjero con el vecino local

PREGUNTA 03

¿Qué barrios y negocios permiten desconcentrar los flujos?

Localizar zonas cercanas con identidad sin agobios y descubrir grandes locales fuera de las rutas saturadas

PREGUNTA 04

¿Cómo ha evolucionado la situación con los años?

Seguir la evolución 2019–2026 en cada sector afectado sin que la media provincial esconda qué mejora y qué se deteriora

BiznagaFest
6 / 34
Bloque 01 · El problema y enfoque globalHOJA DE RUTA · 7 ETAPAS (01 → 07)

El viaje del dato: las 7 etapas de nuestro recorrido

0101 · REALIDADEscuchar la calle y su contexto0202 · INGESTAConservar el dato en bruto0303 · DATOSCalidad, gobierno y blindaje0404 · CONOCIMIENTOUnir espacio y significado0505 · COMPRENSIÓNLeer 4,87 M de voces sin sesgo0606 · ACCIÓNConsultar, flujos y gemelos0707 · APRENDIZAJEVigilar la evolución real
BiznagaFest
7 / 34
ETAPAS 01–03 · REALIDAD, INGESTA Y DATOS

De la señal en
la calle al dato gobernado

1 / 5 ★
01REALIDAD02INGESTA03DATOS04CONOCIMIENTO05COMPRENSIÓN06ACCIÓN07APRENDIZAJE
BiznagaFest
8 / 34
ETAPA 01 DE 07 · REALIDAD

Una reseña no
vive en el vacío

1 · FUENTES ORIGINALES→2 · BRONZE (PARQUET)→3 · SILVER (LIMPIEZA)
4 Fuentes de Realidad
VOZ DEL VISITANTE + ALOJAMIENTO + CLIMA AEMET + MOVILIDAD MITMA
01

El texto cuenta el síntoma

Nos dice que hubo ruido, colas o calor, pero no qué ocurría alrededor en esa calle

02

El entorno explica el contexto

No es igual una queja a 24 °C que con terral a 38 °C, ni en zona de hoteles que de pisos turísticos

03

Mismo barrio y ventana temporal

Cruzamos el entorno del local con el clima de la temporada, los flujos de paso y la franja citada en el texto

Las 4 Señales del Territorio Mismo lugar y hora
1 · Voz del Visitante 4,87 M reseñas

Opiniones en 10.402 POIs activos en Google Maps y 45.733 establecimientos unificados (8.706 POIs públicos y 37.027 alojamientos).

2 · Oferta de Alojamiento 11.158 VUT vs 649 hoteles

Censo oficial de pisos turísticos (agregados por celda H3) frente a hoteles reglados en cada barrio.

3 · Clima a Pie de Calle (AEMET) Picos > 35 °C

Episodios de terral por ventana temporal para distinguir calor climático de falta de sombra.

4 · Movilidad y Flujos (MITMA) 103 municipios

Flujos de paso agregados entre la Costa del Sol, el interior y los distritos de la capital.

BiznagaFest
9 / 34
ETAPA 02 DE 07 · INGESTA

Conservar el dato en
bruto antes de transformarlo

1 · FUENTES ORIGINALES→2 · BRONZE (PARQUET)→3 · SILVER (LIMPIEZA)
✕ Transformar al descargar: si hay un bug o necesitas otro campo, pierdes el JSON/CSV original.
✓ Bronze en Parquet + SHA-256: conserva el dato en bruto y salta lotes repetidos (return 0).
Python · simple_extractor.py · Guardar en Parquet local solo si cambia el hashParquet + SQLite (0 €)
# 1. Calcula SHA-256 y compara contra SQLite (sync_manifest.db)
df_sha256 = compute_dataframe_sha256(df)
existing_sha = get_local_content_hash(self.SOURCE_NAME, table_name)
if hashes_match(existing_sha, df_sha256):
    return 0  # Sin cambios: omite escritura Parquet

# 2. Si cambió, persiste en bronze/<source>/<table>.parquet
return write_local_bronze_parquet(
    df, source=self.SOURCE_NAME, table_name=table_name,
    content_sha256=df_sha256,
)
01 · PASO COMÚN

Descarga en formato original

Recibimos el JSON, CSV o Excel en memoria con sus columnas intactas.

→
02 · PASO COMÚN

Cálculo del hash SHA-256

Calculamos el hash sobre los datos reales y lo cruzamos con sync_manifest.db.

SI HASH IGUALSin escritura (return 0)

No escribe en disco ni dispara el pipeline aguas abajo.

SI HASH DIFERENTEGeneración del Parquet

Guarda el lote en bruto en bronze/<fuente>.parquet.

BiznagaFest
10 / 34
ETAPA 03 DE 07 · DATOS

Un esquema para
unificarlos a todos

1 · FUENTES ORIGINALES→2 · BRONZE (PARQUET)→3 · SILVER (LIMPIEZA)
4,87 M → 1 Esquema Silver
DE FUENTES Y ESCALAS DISPARES A UNA TABLA ÚNICA, VALIDADA Y SIN PII
01

4 plataformas en un mismo formato

Pasamos todas las notas a escala 1–5 ★ (Booking va de 0 a 10), unimos sus textos y eliminamos duplicados

02

Score de calidad ISO 8000 y cuarentena

Puntuamos completitud (ID, nota, texto, fecha, municipio INE) y desviamos lotes corruptos a quarantine/

03

Seudonimización SHA-256 y escudo PII

Convertimos el autor en anon:sha256 (name = NULL) y limpiamos [EMAIL], [PHONE] y [URL]

4 FUENTES MULTI-PLATAFORMA EN BRUTO (4,87 M) Google Maps 1–5 ★ · Pulso local y calle Booking.com Nota 0–10 · Pros y contras TripAdvisor 1–5 ★ · Ocio y hostelería Airbnb 1–5 ★ · Huella VUT 1 ESQUEMA ÚNICO SILVER 01 · ESCALA 8,6 / 10 → 4,30 ★ (1–5) 02 · ISO 8000 Score calidad → ≥ 0,80 / 1,0 03 · ESCUDO PII anon:sha256 · [EMAIL] · [PHONE] ✓ LOCAL_VALIDATED Tabla Silver lista Pasa a BigQuery (WAP) ✕ QUARANTINED En quarantine/ No sube a BigQuery
BiznagaFest
11 / 34
ETAPA 04 DE 07 · CONOCIMIENTO

De tablas aisladas
al contexto del territorio

2 / 5 ★
01REALIDAD02INGESTA03DATOS04CONOCIMIENTO05COMPRENSIÓN06ACCIÓN07APRENDIZAJE
BiznagaFest
12 / 34
ETAPA 04 DE 07 · CONOCIMIENTO

El problema de las fronteras:
el panal Uber H3 a 170 metros

1 · ESPACIO (H3)→2 · TIEMPO (DIM_PERIODS)→3 · SEMÁNTICA (YAML)
170 m de lado (2 manzanas)
NIVEL 9 DE UBER H3 (ESCALA 0–15): DEL DISTRITO A LA CALLE
01

Por qué no bastan los 11 distritos

Son polígonos enormes y desiguales cuyas fronteras parten calles por la mitad y diluyen el problema en la media

02

16 niveles de zoom en Uber H3 (0 a 15)

Elegimos el nivel 9 (170 m de lado) porque equivale a dos manzanas a pie (~0,1 km²)

03

Cómo afecta una zona a las de alrededor

Cada celda está rodeada por 6 zonas vecinas a igual distancia, permitiendo medir cómo el ruido o el gentío se extienden a las calles de al lado

MapLibre GL · 11 Distritos vs Panal H3 (170 m)
Celda 170 m 6 vecinos (k-ring=1) Malla H3 11 Distritos (D01–D11)
BiznagaFest
13 / 34
ETAPA 04 DE 07 · CONOCIMIENTO

Unificar cada local a 20 metros:
de múltiples chinchetas a 1 POI único

1 · ESPACIO (H3)→2 · TIEMPO (DIM_PERIODS)→3 · SEMÁNTICA (YAML)
1
TRIPADVISOR · Entrada C/ Granada, 62
«El Pimpi»
36.72189, -4.41822
2
GOOGLE MAPS · Terraza C/ Alcazabilla (a 18,6 m · ✓ Ancla elegida)
«Bodega Bar El Pimpi»
36.72176, -4.41803
Cómo decide el algoritmo (master.dim_pois)
1. Misma vertical UNE 178104: Si en el mismo edificio a 6,3 m conviven Only YOU Hotel y su Restaurante Sonora Sky & Bites, detecta distinto segmento y los mantiene como 2 POIs separados.
2. Qué coordenada gana al unir: Sin medias ciegas (caerían en la calle); gana la chincheta dentro del edificio (ST_Contains) con más reseñas verificadas.
FUSIÓN ≤ 20 M + NOMBRE 10.402 POIs GMaps (45.733 ent.)

Consolida las 4 plataformas en un solo poi_id y celda h3_r9.

RESCATE DE COSTA 14.200 reseñas

Asigna distrito a chiringuitos en la arena, Muelle Uno y calles frontera.

OpenStreetMap · PostGIS ≤ 20 m
✓ POI Maestro Unificado (master.dim_pois · ST_Contains edificio + mayor soporte)
Bodega Bar El Pimpi · 36.72176, -4.41803 (Google Maps)
H3: 893919584d3ffff D01 · Centro
BiznagaFest
14 / 34
ETAPA 04 DE 07 · CONOCIMIENTO

Relaciones temporales:
un solo calendario oficial

1 · ESPACIO (H3)→2 · TIEMPO (DIM_PERIODS)→3 · SEMÁNTICA (YAML)
01

Desfase al publicar

Se opina semanas después del viaje; por eso anclamos por mes de estancia (stay_date)

02

Formato único ISO 8601

Unificamos "ago 2025" o "2025-3T" en claves enteras period_key (202508 y '2025-Q3')

03

Cruce mensual y trimestral

Unimos el mes (Reseñas, AEMET, MITMA) con censos trimestrales (11.158 VUT) y el año previo

Nota: En ocasiones las reseñas nos darán una información más detallada; lo veremos en la Etapa 05 (Comprensión).
202508
MES DE ESTANCIA
'2025-Q3'
CENSO TRIMESTRAL
202408
AÑO PREVIO (YOY)
BiznagaFest
15 / 34
ETAPA 04 DE 07 · CONOCIMIENTO

Semántica gobernada:
qué añade cada métrica (YAML v2.5)

1 · ESPACIO (H3)→2 · TIEMPO (DIM_PERIODS)→3 · SEMÁNTICA (YAML)
✕ Columna desnuda en SQL: la tabla guarda solo un número mudo y cada equipo escribe su propia fórmula o interpretación.
✓ Conocimiento añadido en YAML: concentra en un único punto qué significa, su regla de agregación, privacidad y contexto IA.
YAML · SOST_DENS_001_densidad_oferta_turistica.yaml
schema v2.5
code: SOST_DENS_001  # Densidad hotelera: plazas de hotel / km²
business_meaning:    # 1. Significado de negocio y qué NO incluye
  phenomenon: 'concentración espacial de plazas hoteleras por km²'
  interpretation: 'valores altos indican mayor presión sobre servicios'
  limitations: ['solo hoteles (no incluye pisos turísticos VUT ni camping)']
aggregation:         # 2. Regla matemática de agregación
  is_additive: false
  weight_metric: TERR_SUP_001  # Ponderar siempre por superficie (km²)
  invalid_aggregations: [sum, avg_unweighted]
ai_context:          # 3. Contexto para la IA y errores habituales
  common_misuses: ['sumar densidades entre zonas', 'comparar sin km²']
lineage:             # Fuente oficial del dato
  survey: 'INE Encuesta de Ocupación Hotelera (EOH) + Superficie INE'
# ... (+310 líneas en el YAML v2.5: quality, statistical_disclosure, bq_integration, analytics_profile... clic para ver entero)
01

Significado de negocio y límites

Documenta qué fenómeno mide, cómo se interpreta y qué deja fuera (ej. solo plazas de hotel INE, sin VUT ni campings)

02

Regla matemática y privacidad

Declara si se puede sumar o no (is_additive: false), su variable de ponderación (km²) y el umbral de secreto estadístico

03

Contexto IA, linaje y columna SQL

Registra qué errores de lectura existen sobre esa métrica (common_misuses), su fuente oficial y su tabla en BigQuery

BiznagaFest
16 / 34
ETAPA 05 DE 07 · COMPRENSIÓN

Leer 4,87 millones
de voces tras la estrella

3 / 5 ★
01REALIDAD02INGESTA03DATOS04CONOCIMIENTO05COMPRENSIÓN06ACCIÓN07APRENDIZAJE
BiznagaFest
17 / 34
ETAPA 05 DE 07 · COMPRENSIÓN

Paso 1 · El contrato Pydantic único: SinglePassAspectExtraction

1 · IA HÍBRIDA→2 · CRUCE Y PERFILADO→3 · 3 HALLAZGOS CLAVE
Python · Contrato Pydantic único (Local Ollama + Cloud Gemini) 1 sola pasada JSON · temperature = 0.0
class SinglePassAspectExtraction(BaseModel):
    # 1. Los 6 ejes operativos (-1.0 muy negativo a +1.0 muy positivo, o None si no se menciona)
    service: float | None = Field(None, ge=-1, le=1, description="Trato, camareros y calidad de la comida")
    noise: float | None = Field(None, ge=-1, le=1, description="Ruido nocturno, música o jaleo en la calle")
    cleanliness: float | None = Field(None, ge=-1, le=1, description="Limpieza del local o basura en la calle")
    pricing: float | None = Field(None, ge=-1, le=1, description="Relación calidad-precio, cuenta o cobros")
    queues: float | None = Field(None, ge=-1, le=1, description="Colas, esperas de mesa o aparcamiento")
    weather_heat: float | None = Field(None, ge=-1, le=1, description="Calor extremo al sol, terraza o lluvia")

    # 2. Giro del «PERO», franja horaria vivida en el texto y alerta de ironía / sarcasmo
    has_adversative_pivot: bool = Field(False, description="True si contrapone ideas con 'pero' o 'aunque'")
    sentiment_before_but: float | None = Field(None, ge=-1, le=1, description="Sentimiento antes del 'pero'")
    sentiment_after_but: float | None = Field(None, ge=-1, le=1, description="Sentimiento real tras el 'pero'")
    lived_time_slot: TimeSlot = Field("no_especificado", description="Franja inferida ('14:30h', '2 AM')")
    suspected_irony: bool = Field(False, description="True si hay sarcasmo o choque estrellas vs texto")
BiznagaFest
18 / 34
ETAPA 05 DE 07 · COMPRENSIÓN

Paso 2 · GPU local
con Ollama (92 % a 0 €)

1 · IA HÍBRIDA→2 · CRUCE Y PERFILADO→3 · 3 HALLAZGOS CLAVE
01

12 idiomas sin traducir

Vectorizamos con bge-m3 reseñas en alemán, inglés, francés, neerlandés o español en el mismo espacio

02

92 % resuelto en Ollama

Si estrellas y texto coinciden o tratan 1–2 temas claros, Qwen rellena en local el contrato Pydantic

03

8 % con alerta hacia Gemini

Cuando chocan las estrellas con las palabras o un «PERO» mezcla ≥ 3 temas, salta la alarma a la nube

Semáforo en GPU Local · ¿Qué resuelve Ollama y qué escala? Contrato Pydantic único
✓ VÍA VERDE EN GPU LOCAL (92 % · OLLAMA BGE-M3 + QWEN) Estrellas = Texto
Reseñas sin texto, directas o de 1–2 temas sin contradicción (ej. 5 ★ «Espeto increíble y servicio rápido a las 14h») → se puntúan los 6 ejes y la hora en local.
⚠ ALARMA DE COMPLEJIDAD → GEMINI 3.8 FLASH (8 %) 3 disparadores
1. Choque Estrellas vs Palabras (ironía): pone 1 ★ con palabras de elogio («¡Qué maravilla 1h de cola al sol!») o 5 ★ con léxico de ruido/abuso.
2. Conector «PERO» (however / aber) con ≥ 3 ejes: al mezclar elogio y varios problemas en una frase, un modelo de 9B contamina unas notas con otras.
3. Hora o contexto implícito: frases como «cuando cierran los pubs no se pega ojo» que requieren inferir la franja 00:00–06:00.
BiznagaFest
19 / 34
ETAPA 05 DE 07 · COMPRENSIÓN

Paso 3 · Gemini 3.8 Flash
(8 % complejo por < 14 €)

1 · IA HÍBRIDA→2 · CRUCE Y PERFILADO→3 · 3 HALLAZGOS CLAVE
01

Desenreda cláusulas sin contaminar ejes

Separa el elogio antes del «PERO» (+0,95 al trato y al pescaíto) de las 3 quejas posteriores en la misma frase

02

Los 6 ejes + la franja horaria vivida

Puntúa cada eje mencionado (-1 a +1), deja el resto en null e infiere la hora («a partir de las 12 de la noche»)

03

Batch API (-50 %) + Context Caching (-75 %)

Enviamos las ~390.000 reseñas complejas en lotes con el prompt cacheado y el mismo contrato Pydantic

Anatomía de una reseña del 8 % complejo response_schema = Pydantic
RESEÑA EN TERRAZA · 4 ★ (4 TEMAS + HORA) Alerta semáforo
«El pescaíto espectacular y los camareros súper atentos, PERO a partir de las 12 de la noche en la terraza no se podía ni hablar del jaleo en la calle, tardaron casi una hora en traernos la cuenta y encima nos clavaron el pan.»
✕ MODELO PEQUEÑO (3B–9B) Contamina ejes
Al ver tres quejas seguidas tras el «PERO», arrastra el enfado al primer bloque (baja service a -0.20 a pesar del elogio inicial) o pierde la última queja del pan.
✓ SALIDA GEMINI 3.8 FLASH 1 pasada · Batch + Caché
service: +0.95
Pescaíto y trato
noise: -0.90
Jaleo en la calle
queues: -0.75
1h por la cuenta
pricing: -0.60
Cobro del pan
giro: +0.95 / -0.75
Antes / tras PERO
slot: 00:00–06:00
«12 de la noche»
BiznagaFest
20 / 34
ETAPA 05 DE 07 · COMPRENSIÓN

El ahorro de los 3 pasos: de 1.450 € a menos de 14 €

1 · IA HÍBRIDA→2 · CRUCE Y PERFILADO→3 · 3 HALLAZGOS CLAVE
COMPARATIVA SOBRE EL MISMO MODELO (GEMINI 3.8 FLASH) · 4,87 MILLONES DE RESEÑAS Ahorro total: -99,0 %
Dimensión / Paso aplicado A lo bruto (100 % Nube individual) Con los 3 pasos (Motor híbrido) Impacto
Paso 1 · Pasadas por reseña 5 llamadas separadas por reseña 1 sola pasada JSON (contrato Pydantic) 5x menos llamadas
Paso 2 · Reseñas directas (92 % · 4,48 M) API en la nube (pago por token) GPU local con Ollama (bge-m3 + Qwen · 0 €) 0 € en el 92 %
Paso 3 · Envío del 8 % complejo (~390k) Peticiones sueltas sin caché Batch API (-50 %) + Context Caching (-75 %) -75 % en prompt
Tiempo total de ejecución 38 horas 2,4 horas -93,7 % tiempo
Coste total (en Gemini 3.8 Flash) 1.450 € / ejecución < 14 € / ejecución -99,0 % coste
BiznagaFest
21 / 34
ETAPA 05 DE 07 · COMPRENSIÓN

Huella de los 6 ejes
por distrito tras el «4,5 ★»

1 · IA HÍBRIDA→2 · CRUCE Y PERFILADO→3 · 3 HALLAZGOS CLAVE
01

La media de estrellas aplana la ciudad

Centro (4,50 ★), Málaga Este (4,47 ★) y Teatinos (4,43 ★) parecen idénticos si solo miras su nota global

02

Telaraña de los 6 ejes (anillo neutro 0,0)

Fuera del anillo ámbar están las fortalezas (+0,88 en trato); dentro del anillo, las fricciones reales (-0,64 en ruido)

03

Una receta distinta para cada distrito

Actuar en convivencia nocturna en el Centro, movilidad al mediodía en el Este y proteger las joyas de barrio

Huella ABSA (6 ejes) · Selecciona un distrito Nota media: 4,50 ★ · 1,05 M reseñas
0,0 neutro 1. Trato y comida (+0,88) 2. Limpieza local +0,74 3. Calidad-precio -0,22 4. Clima / sombra (-0,48) 5. Colas y parking -0,55 6. Silencio nocturno -0,64 (ruido)
Diagnóstico D01 Centro: Hostelería sobresaliente (+0,88), pero fuerte fricción en ruido nocturno (-0,64) y esperas (-0,55).
Pico: 00:00–06:00
BiznagaFest
22 / 34
ETAPA 05 DE 07 · COMPRENSIÓN

Suavizado bayesiano:
por qué cambia la media de tantos sitios

1 · IA HÍBRIDA→2 · CRUCE Y PERFILADO→3 · 3 HALLAZGOS CLAVE
✕ El espejismo de la media simple: distorsiona la nota de miles de locales, celdas H3 y pueblos pequeños (con 3 amigos suben a 5,0 ★ o con 2 quejas caen a 3,50 ★).
✓ Corrección bayesiana relevante: pondera la nota del sitio (n) con un colchón comarcal (m = 50) tanto en estrellas (1–5 ★) como en los 6 ejes.
Balanza Bayesiana (Estrellas 1–5 ★ y 6 ejes) m = 50 reseñas de colchón
Nota Justa =
(n · Nota Local) + (m · Media Comarca)
n (reseñas reales)  +  m (50 de colchón comarcal)
Pueblo pequeño n = 12 reseñas
(12 × 3,50 ★) + (50 × 4,45 ★)
12 + 50 = 62 (19% local · 81% com.)
3,50 ★ (bruta) → 4,26 ★
Ciudad / Distrito n = 50.000
(50.000 × 4,47 ★) + (50 × 4,45 ★)
50.000 + 50 = 50.050 (99,9% local · 0,1% com.)
4,47 ★ (bruta) → 4,47 ★
01

La trampa de las muestras pequeñas (n = 12)

En un pueblo con 12 reseñas, dos malas notas por lluvia hunden su media bruta a 3,50 ★

02

Balanza con paracaídas comarcal (m = 50)

Sumamos un colchón de 50 reseñas con la media de su comarca (4,45 ★) que estabiliza la nota en 4,26 ★

03

En la nota media y en los 6 ejes

Con > 50.000 reseñas manda el dato local (99,9 %); en pueblos o celdas H3 evita falsas alarmas

BiznagaFest
23 / 34
ETAPA 05 DE 07 · COMPRENSIÓN

Cruzar quejas con el territorio:
la matriz de correlación en cada hexágono

1 · IA HÍBRIDA→2 · CRUCE Y PERFILADO→3 · 3 HALLAZGOS CLAVE
01 · CÁLCULO EN BIGQUERY (FUNCIÓN CORR)

Los 6 ejes de reseñas × las 4 fuentes físicas

Unimos por hexágono H3 y periodo los 6 ejes extraídos del texto (filas) con los datos oficiales del territorio (columnas) y calculamos CORR(queja, dato).

02 · QUÉ NOS DESCUBREN EL ROJO Y EL GRIS

Separar problemas del entorno y problemas del local

El rojo (≥ 0,70) revela con qué factor de la calle sube cada queja. En cambio, al ver «Trato y comida» siempre en gris (< 0,15), deducimos que no depende del barrio sino del propio local.

03 · FILA 1: PISOS VUT (+0,82) VS. HOTELES (+0,14)

Por qué el ruido nocturno no es «turismo en general»

Al separar el alojamiento reglado en dos columnas, vemos que el ruido nocturno se dispara con los pisos VUT (+0,82, rojo) pero no con los hoteles (+0,14, gris).

Mapa de calor · BigQuery CORR(queja_h3, dato_h3) Cruce por celda H3 (170 m) · FDR q < 0,05
< 0,20 · Nula
0,20–0,39 · Baja
0,40–0,69 · Media
≥ 0,70 · Fuerte
6 ejes reseñas ↓ Fuentes físicas →
Pisos VUT
11.158 VUT
Hoteles
649 hoteles
MITMA
Movilidad
AEMET
Calor °C
1. Ruido nocturno
+0,82
+0,14
+0,18
+0,12
2. Colas y parking
+0,31
+0,16
+0,79
+0,08
3. Clima / sombra
+0,05
+0,07
+0,14
+0,76
4. Limpieza / calle
+0,48
+0,11
+0,56
+0,15
5. Calidad-precio
+0,58
+0,34
+0,22
+0,04
6. Trato y comida
+0,09
+0,11
+0,08
+0,06
Motor SQL (BigQuery): SELECT CORR(a.value, b.value) AS pearson_r FROM panel a JOIN panel b USING (region_id, period_key) 0,00 = independiente · +1,00 = suben juntos
BiznagaFest
24 / 34
ETAPA 05 DE 07 · COMPRENSIÓN · DE SILVER A GOLD (1,13 M DE AUTORES PERFILADOS)

De Silver a Gold: datos cruzados y clasificación de cada usuario

1 · IA HÍBRIDA→2 · CRUCE Y PERFILADO→3 · 3 HALLAZGOS CLAVE
① QUÉ DICE (CONTENIDO IA)
6 ejes (-1..+1) + «PERO»
② DÓNDE OCURRE (TERRITORIO)
POI + celda H3 r9 + VUT
③ CUÁNDO SE VIVE (TIEMPO)
Mes + hora + clima AEMET
④ QUIÉN HABLA (AUTORES)
1,13 M hashes anon:sha256 ↓
01 · VÍNCULO CON MÁLAGA Huella anual del hash

Turista vs. vecino

1. Turista (puntual) 60,0 % · 4,49 ★
2. Vecino (todo el año) 40,0 % · 4,51 ★
Señal: Meses y barrios donde opina el hash + frases como «vivo en el barrio».
02 · EXPERIENCIA DEL AUTOR 65,4 % Local Guides

Experto vs. casual

1. Experto (>50 res.) 41,2 % · 4,43 ★
2. Intermedio (5–50 res.) 24,2 % · 4,47 ★
3. Casual (1–4 res.) 34,6 % · 4,49 ★
Sensor temprano: El Experto es más exigente (-0,06 ★) y detecta antes las caídas.
03 · IDIOMA DE LA RESEÑA 25 idiomas detectados

Español vs. idioma extranjero

1. En Español (nacional) 76,0 % · 4,49 ★
2. Extranjero (25 lenguas) 24,0 % · 4,49 ★
Rigurosidad: Clasificamos el idioma del texto, sin inventar nacionalidades.
BiznagaFest
25 / 34
ETAPA 05 DE 07 · COMPRENSIÓN · HALLAZGO 1 DE 3

Hallazgo 1: la paradoja de la
fama detrás del «pero»

1 · IA HÍBRIDA→2 · CRUCE Y PERFILADO→3 · 3 HALLAZGOS CLAVE
01

Qué sostiene el 4,46 ★ en Málaga

Al analizar los temas del texto, la gente aplaude el trato amable (+0,76) y la comida (+0,71)

02

Qué esconde esa nota tras el «PERO»

Esas mismas reseñas de 4 y 5 ★ se quejan de aparcar (-0,52), de las colas (-0,48) y de los precios (-0,41)

03

Dónde más ocurre: iconos y pueblos joya

En los bares más famosos del Centro (1 de cada 4 reseñas con queja de colas) y en Nerja, Frigiliana o Ronda

1 · Media provincial por tema Escala -1 a +1
Antes del «PERO» (4,46 ★)
Trato y hospitalidad+0,76
Comida y autenticidad+0,71
Detrás del «PERO» (oculto)
Aparcar y moverse-0,52
Colas y masificación-0,48
Subida de precios-0,41
2 · Ejemplos reales donde más ocurre Nota ★ vs. queja
Zona o Destino (Nota)
Lo que enamora (Antes)
La queja tras el «PERO»
Bares icono del Centro
4,3 ★ a 4,7 ★ (≥ 500 res.)
Tapas y trato de 10
La Tranca 4,68 ★ · Casa Lola 4,31 ★
25,65 % se queja de colas
1 de cada 4 reseñas
Nerja y Frigiliana
4,45–4,62 ★ (3.158 POIs)
Calas y pueblo blanco
Balcón de Europa 4,71 ★
9,3 % quejas de saturación
Atascos y parking
Ronda
4,48 ★ (1.371 POIs)
15,77 % elogia su encanto
Tajo y casco antiguo
7,5 % quejas de saturación
Accesos y Puente Nuevo
BiznagaFest
26 / 34
ETAPA 05 DE 07 · COMPRENSIÓN · HALLAZGO 2 DE 3

Hallazgo 2: dos Málagas por territorio, idioma y vecino

1 · IA HÍBRIDA→2 · CRUCE Y PERFILADO→3 · 3 HALLAZGOS CLAVE
01 · CONCENTRACIÓN 87,7 % en la costa

Costa y Centro vs. Interior

3 comarcas de costa suman el 87,7 %; el interior lidera en ★.

Costa (3): 87,7 %
Interior (6): 12,3 % (4,5 ★)
MAR MEDITERRÁNEO Antequera 4,44 ★ Ronda 4,53 ★ Guadalhorce Axarquía Marbella Centro: 80,8 % reseñas 4.380 VUT · 4.420 €/m²
Zoom Capital (Centro: 80,8 %) 4.380 VUT · 4.420 €/m²
El Centro concentra 4 de cada 5 reseñas y desplaza presión hacia Humilladero y Ctra. Cádiz.
02 · IDIOMA (24 % EXTRANJERO) Misma ★ · +24,5 % quejas

Turista extranjero vs. español

Misma nota ★, pero el extranjero sufre +24,5 % de colas.

Nota media en estrellas (empatados) 4,49 ★ = 4,49 ★
Español (76%)
4,49 ★
Extranjero (24%)
4,49 ★
Reseñas con queja de colas y esperas +24,5 % en extranjero
Español
8,2 %
Extranjero
10,2 %
Últimos 3 años (+3,0 pp) 23,3 % (2023) → 26,3 % (2026)
Supera 1 de cada 4 reseñas y acude a los mismos iconos.
03 · VECINO LOCAL (40 %) Nota Vecino vs. Turista

Vecino de Málaga vs. turista

Nota del vecino frente al turista por sector.

Turista ocasional
Vecino (40 %)
1. Mercados Brecha: -1,26 ★
Turista
4,50 ★
Vecino
3,24 ★
2. Hostelería Brecha: -1,12 ★
Turista
4,52 ★
Vecino
3,40 ★
3. Museos y cultura Brecha: -0,39 ★
Turista
4,63 ★
Vecino
4,24 ★
¿Por qué cae en mercados y bares?
Subida de precios y pérdida de comercio de barrio.
BiznagaFest
27 / 34
ETAPA 05 DE 07 · COMPRENSIÓN · HALLAZGO 3 DE 3

Hallazgo 3: barrios con identidad
y «Joyas Invisibles» sin agobios

1 · IA HÍBRIDA→2 · CRUCE Y PERFILADO→3 · 3 HALLAZGOS CLAVE
01

Barrios con identidad y sin agobios

Al restar las quejas de saturación a los elogios de autenticidad, Puerto de la Torre (+4,75 pp) y Bailén-Miraflores (+4,64 pp) lideran frente al Centro (-2,69 pp)

02

135 «Joyas Invisibles» consolidadas (4,73 ★)

Entre los 1.538 locales consolidados de cara al público (sin alojamientos), afloran 135 sitios con 15,2 % de autenticidad y sin colas ocultos tras los rankings

03

176 «Bastiones Locales» de referencia (4,46 ★)

Negocios tradicionales consolidados donde come el vecino sin sobreprecio (15,9 % autenticidad), frente a 47 locales en trampa turística (3,51 ★) y 115 en declive

1 · Barrios: Autenticidad vs. Saturación ← Saturación | Autenticidad →
Pto. de la Torre (13,3%)
+4,75 pp
Bailén-Miraflores (8,4%)
+4,64 pp
C. Cádiz / Málaga Este
-2,36 pp
Centro Histórico (11,1%)
-2,69 pp
2 · Ejemplos detectados
Restaurante Bodega Mercado Cultura
Joyas Invisibles · 135 consolidadas 4,73 ★ · 15,2 % autenticidad
tapeArte · Bailén-Miraflores
4,61 ★
Esquina Padilla · Bailén-Miraflores
4,76 ★
La Caja Blanca · Teatinos
4,65 ★
Dólmenes de Antequera · Antequera
4,54 ★
Bastiones Locales · 176 consolidados 4,46 ★ · 0 % sobreprecio
Venta El Túnel · Puerto de la Torre
4,50 ★
Mercado de Huelin · Carretera de Cádiz
4,40 ★
Antigua Casa de Guardia · Centro (1840)
4,59 ★
Teatro Cervantes · Centro
4,62 ★
BiznagaFest
28 / 34
ETAPAS 06 Y 07 · ACCIÓN Y APRENDIZAJE

Del diagnóstico en el cajón
a decidir y medir en la calle

4 / 5 ★
01REALIDAD02INGESTA03DATOS04CONOCIMIENTO05COMPRENSIÓN06ACCIÓN07APRENDIZAJE
BiznagaFest
29 / 34
ETAPA 06 DE 07 · ACCIÓN

Agentes MCP
con cero alucinaciones

1 · ACCESO MCP→2 · FLUJOS Y GEMELOS→3 · EVOLUCIÓN REAL
01 · PUERTA DE ACCESO

Consultar en lenguaje natural sin inventar

Cualquier usuario o agente pregunta en español sin escribir SQL libre ni inventar fórmulas o decimales

02 · @MCP.TOOL

El LLM traduce; el catálogo calcula

Solo invoca funciones tipadas (get_metric_definition y get_metric_value) con guardrails e InfoHint ⓘ

03 · CASO REAL HOY

Esta presentación se ha auditado vía MCP

Las cifras de estas 34 diapositivas se han consultado y verificado contra los 18 Parquets Gold usando este MCP

Flujo real · Servidor MCP semantic-catalog 0 % alucinación
1 · USUARIO PREGUNTA EN LENGUAJE NATURAL Sin escribir SQL
«¿Qué saturación tiene el Centro (D01) frente a Bailén-Miraflores (D04) y cómo se interpreta?»
2A · get_metric_definition YAML v2.5
code = "REP_SAT_001"
Cómo se interpreta (ⓘ): % de reseñas con texto que citan colas o masificación. Equilibrio local: < 0,20 %.
2B · get_metric_value Guardrail I5 ✓
code = "REP_SAT_001" (D01, D04)
Valores oficiales:
• D01 Centro: 0,89 % (1,05 M res.)
• D04 Bailén: 0,14 % (6.865 res.)
3 · RESPUESTA CERTIFICADA (DATO + INTERPRETACIÓN) Dato + Sentido ⓘ
«El Centro sufre 6,4 veces más saturación (0,89 %) que Bailén-Miraflores (0,14 %). Según la definición oficial de REP_SAT_001, Bailén está en equilibrio local (< 0,20 %), mientras el Centro supera el umbral crítico por colas en hora punta.»
Caso real: Esta presentación se ha auditado contra los 18 Parquets Gold vía MCP. 18/18 Parquets ✓
BiznagaFest
30 / 34
ETAPA 06 DE 07 · ACCIÓN

Ningún barrio es una isla:
flujos reales entre la costa y el Centro

1 · ACCESO MCP→2 · FLUJOS Y GEMELOS→3 · EVOLUCIÓN REAL
01 · RESEÑAS

Identificar saturación y Joyas

Señalan la zona en rojo con quejas de colas y aparcamiento (D01 Centro, -0,55) y los POIs de Joyas Ocultas (★ 4,8 sin esperas)

02 · MITMA

Conocer los flujos hacia la zona saturada

Las flechas azules (➤) muestran que el 36 % de esa saturación viene de desplazamientos desde la costa en horas punta

03 · VALHALLA

Alternativas dentro de un tiempo máximo

La isócrona verde (≤ 15 min reales) muestra qué Joyas Ocultas recomendar para comer o visitar sin sufrir la saturación

Capas del mapa:
1 · RESEÑAS (ROJO + ★)
Zona saturada (D01) y Joyas (★ 4,8).
2 · MITMA (FLUJO 36 %)
36 % del flujo sube desde la costa.
3 · VALHALLA (≤ 15 MIN)
Isócrona ≤ 15 min con Joyas sin colas.
BiznagaFest
31 / 34
ETAPA 06 DE 07 · ACCIÓN

Gemelos territoriales con
distancia de Gower

1 · ACCESO MCP→2 · FLUJOS Y GEMELOS→3 · EVOLUCIÓN REAL
01 · UTILIDAD REAL

Compararte con tu misma especie (no con la costa)

Comparar Ronda con Marbella no sirve: buscamos en España otro casco histórico encajonado que viva exactamente la misma presión

02 · MÉTODO GOWER

Cruzar nuestras 4 fuentes en escala 0–1

Normaliza las fuentes de la charla: reseñas (★ y «PERO»), movilidad MITMA, planta hotelera/VUT y clima AEMET

03 · ESPEJO RONDA ↔ ALBARRACÍN

95 % de similitud estructural (S = 0,95)

Permite compartir diagnóstico entre ciudades hermanas y comprobar qué medidas reducen de verdad las quejas frente a su gemelo

Espejo · Ronda ↔ Albarracín Similitud Gower: 95 %
Ronda · Puente Nuevo y Tajo
RONDA · 4,53 ★ (202.360 res.)
Ronda · Puente Nuevo y Tajo
Casco histórico sobre el cañón
Albarracín · Casco histórico y muralla
ALBARRACÍN · GEMELO AL 95 %
Albarracín · Muralla y Turia
Misma morfología sin ensanche
Radiografía compartida al 95 % S = 0,95
1 · RESEÑAS (ENCANTO Y «PERO»)
4,53 ★ (15,8 % encanto), pero parking (-0,52) y colas (-0,48).
2 · MOVILIDAD MITMA (EXCURSIÓN)
+128,7 % población flotante en 6 h centrales.
3 · ALOJAMIENTO (HOTEL Y RURAL)
Menor presencia de pisos turísticos que en la costa.
4 · CLIMA AEMET (VERANO)
Veranos de 37,8 °C que impactan en la nota por cuestas al sol.
Utilidad: evaluar aparcamientos previos al cañón e impulso de pernocta frente a su gemelo.
BiznagaFest
32 / 34
ETAPA 07 DE 07 · APRENDIZAJE

De la foto fija a la película (2019–2026):
cuando suben las ★ pero cambian los barrios

1 · ACCESO MCP→2 · FLUJOS Y GEMELOS→3 · EVOLUCIÓN REAL
01 · ETAPA 05 VS ETAPA 07

De la radiografía hoy a la película por sector

La Etapa 05 fotografiaba dónde duele hoy; la Etapa 07 sigue la evolución (2019–2026) por sector para que la media provincial no diluya las alertas

02 · EN ATRACTIVOS Y BARES

Más oferta (+53 % zonas) y -30 % colas por local

Al abrirse locales en nuevas zonas (246 → 377), sube la nota media (4,38 → 4,62 ★) y se reparte mejor la espera por establecimiento

03 · POR SECTOR (2019–2026)

Clásicos en declive, precios y ruido

Entre los 1.538 locales consolidados afloran 115 clásicos en declive (≤ -0,25 ★ en 24m y 19,4 % disonancia), +127 % en sobreprecio (47 en trampa a 3,51 ★) y ×6 en ruido del Centro (61/100)

Evolución 2019 → 2026 · Por Sector Sin diluir en la media
✓ OFERTA GENERAL -30 % colas · +53 % zonas
2019: 246 zonas (4,38 ★) 2026: 377 zonas (4,62 ★)
⚠ Qué vigilamos en cada sector (2019 → 2026)
1 · CLÁSICOS EN DECLIVE (24M) 115 locales · ≤ -0,25 ★
Nota: 4,29 → 4,16 ★ 19,4 % queja tras «PERO»
2 · HOSTELERÍA Y MERCADOS +127 % queja sobreprecio
Vecino: -1,26 ★ mercados Hoy: 9,9 % · 47 trampa (3,51 ★)
3 · HOTELES Y VUT CENTRO ×6 ruido · 61/100 en D01
Este (D02): 14/100 Centro (4.380 VUT): 61/100
BiznagaFest
33 / 34
CAPÍTULO 07 · APERTURA DE BLOQUEConclusiones en 2 diapositivas

Respuestas a las
cuatro preguntas iniciales

5 / 5 ★
1 · ¿Qué esconden las estrellas tras el «PERO»?: El trato (+0,76) y la comida (+0,71) sostienen el 4,46 ★, pero tapan parking (-0,52), colas (-0,48; 25,65 % en iconos) y precios (-0,41)
2 · ¿Dónde se concentra la presión y quién sufre más la fricción?: La costa concentra el 87,7 % y el Centro el 80,8 % de la capital (4.380 VUT); el idioma extranjero sufre +24,5 % más colas y el vecino da -1,26 ★ en mercados
3 · ¿Qué barrios y negocios permiten desconcentrar los flujos?: Puerto de la Torre (+4,75 pp) y Bailén-Miraflores (+4,64 pp) lideran en identidad, con 135 Joyas (4,73 ★) y 176 Bastiones consolidados a ≤ 15 min para desviar el 36 % del flujo costa→Centro
4 · ¿Cómo ha evolucionado la situación con los años?: De 2019 a 2026 sube la oferta general (4,38 → 4,62 ★ y -30 % colas/local), pero por sector afloran 115 clásicos en declive (-0,25 ★), +127 % queja de precio y ×6 ruido VUT en el Centro (61/100)
BiznagaFest · Q&A

¡Muchas gracias,
BiznagaFest!

Turno de preguntas · Turismo, territorio, Google Cloud e IA en Málaga

5 / 5 ★
Laura Morillo-Velarde
Laura Morillo-Velarde
GDE Google Cloud laura.morillovelarde@gmail.com
ⓘ Explorador en vivo