Estrategia CDO - FarmaMatch 2026-2027

Analisis de Estado de Datos

Estado Actual

FarmaMatch se encuentra en fase pre-seed. No existen activos de datos propios. Toda la estrategia de datos se construye desde cero:

Dimension Estado Notas
Activos de datos propios Ninguno Greenfield completo
Calidad de datos N/A Sin datos propios
Capacidades analytics N/A Por construir
Gobernanza de datos Por definir GDPR by design requerido
Infraestructura de datos Por construir Stack definido por CTO

Datos Existentes en el Sector

El mercado de intermediación de farmacias en España carece de plataformas con datos estructurados. Los competidores tradicionales operan con datos en silos (Excel, CRM básico, papel): - FarmaConsulting: Base de datos de 22.000 compradores, 3.800 operaciones históricas (no accesible públicamente) - FarmaQuatrium: 1.500+ operaciones, datos internos no estructurados - Datos abiertos: INE, SEDIFRAME, Colegios Oficiales — infrautilizados por el sector

Oportunidad: No existe un dataset estructurado de mercado de farmacias en España. FarmaMatch puede construir el primer data moat del sector.

Vision y Objetivos de Datos

Objetivo General

Construir el primer data platform del mercado de intermediación farmacéutica en España, donde cada interacción, valoración y operación alimente un dataset propietario que genere ventaja competitiva acumulativa.

Objetivos Específicos

Area Objetivo KPI Timeline
Valoración Algoritmo de valoración con precisión +/-10% vs tasación real MAE <10% Mes 8
Matchmaking Sistema de matching con precision >75% en recomendaciones aceptadas Tasa de clic en matches sugeridos >30% Mes 7
Mercado Dashboard de mercado con datos de todas las CCAA en tiempo real Cobertura 100% CCAA Mes 10
Datos abiertos Integración de 5+ fuentes públicas en pipelines automatizados Fuentes integradas Mes 4
GDPR 100% compliance desde el día 1 0 infracciones Continuo
Data moat 500+ farmacias con datos financieros estructurados al año 1 Registros completos Mes 12

Pilares de la Estrategia de Datos

1. Arquitectura de Datos

1.1 Fuentes de Datos

[Fuentes Externas]                              [Fuentes Internas]
     │                                                  │
     ├── Datos Públicos                                ├── Datos de Usuario
     │   ├── INE (demografía, renta)                   │   ├── Perfil comprador
     │   ├── SEDIFRAME (censo farmacias)               │   ├── Perfil vendedor
     │   ├── Catastro (valor suelo)                    │   ├── Preferencias
     │   ├── Google Maps (geolocalización)             │   └── Historial navegación
     │   └── BOE/CCAA (normativa)                      │
     │                                                 ├── Datos de Farmacia
     ├── Datos Comprados                               │   ├── Financieros (facturación, EBITDA)
     │   ├── IQVIA/CloseUp (mercado farmacéutico)      │   ├── Operativos (personal, metros)
     │   └── Colegios Farmacéuticos (censo)            │   ├── Documentos (subidos por vendedor)
     │                                                 │   └── Valoraciones (generadas)
     ├── Datos de Interacción                          │
     │   ├── Búsquedas y filtros                       ├── Datos de Operación
     │   ├── Clics en farmacias                        │   ├── Deals (precio real cerrado)
     │   ├── Expresiones de interés                    │   ├── Timeline del deal
     │   └── Tiempo en página                          │   └── Due diligence docs
     │                                                 │
     └── Datos de Mercado                             └── Datos de Market Intelligence
         ├── Multiplos por CCAA                             ├── Histórico de precios
         ├── Precios de operaciones                         ├── Tendencias por zona
         └── Oferta/demanda                                 └── Indicadores compuestos

1.2 Pipelines de Datos

CAPA DE INGESTIÓN
─────────────────
[Web Scraper (Python)] → Datos públicos periódicos (INE, SEDIFRAME)
[API Connectors]       → IQVIA, Google Maps, Stripe, Auth0
[User Input Forms]     → Perfiles, datos financieros, documentos
[Platform Events]      → Búsquedas, clics, interacciones (event streaming)

         │
         ▼

CAPA DE PROCESAMIENTO
─────────────────────
[ETL/ELT Pipeline — Python/Pandas + Airflow/BullMQ]
    ├── Limpieza y normalización
    ├── Deduplicación de farmacias
    ├── Geocodificación (lat/lng)
    ├── Cálculo de indicadores derivados
    └── Alimentación de feature store

         │
         ▼

CAPA DE ALMACENAMIENTO
───────────────────────
┌─────────────────────────────────────────────────────────┐
│ PostgreSQL (relacional):                                │
│   - Farmacias, usuarios, deals, valoraciones            │
│   - Datos maestros (catálogos, tablas de referencia)    │
├─────────────────────────────────────────────────────────┤
│ ElasticSearch (búsqueda):                               │
│   - Índice de farmacias para búsqueda facetada          │
│   - Datos de mercado para dashboard                     │
├─────────────────────────────────────────────────────────┤
│ S3 / Cloudflare R2 (objetos):                           │
│   - Documentos (NDA, informes, contratos)               │
│   - Imágenes de farmacia                                │
│   - Informes de valoración (PDF generados)              │
├─────────────────────────────────────────────────────────┤
│ Redis (cache + colas):                                  │
│   - Sesiones de usuario                                 │
│   - Resultados de valoración cacheados                  │
│   - Colas BullMQ para procesamiento async               │
├─────────────────────────────────────────────────────────┤
│ Feast (feature store):                                  │
│   - Features para modelo de valoración                  │
│   - Features para modelo de matchmaking                 │
└─────────────────────────────────────────────────────────┘

         │
         ▼

CAPA DE CONSUMO
───────────────
[API REST (NestJS)]      → Datos para frontend, matchmaking, valoraciones
[Python ML Service]      → Predicciones, scoring, clustering
[BI Tool / Grafana]      → Dashboards internos de negocio
[PDF Generator]          → Informes de valoración descargables
[Market Dashboard]       → Datos de mercado en tiempo real (frontend público)
[Alerts Engine]          → Notificaciones basadas en eventos de datos

1.3 Stack de Datos

Componente Tecnologia Justificacion
Base relacional PostgreSQL 16 Referencia del CTO, madurez, JSONB para flexibilidad
Búsqueda ElasticSearch Búsqueda facetada, geo-filtros, agregaciones en tiempo real
ETL/Orquestación Python (pandas) + BullMQ (Redis) Coexistencia con stack Node.js; BullMQ para tareas async
ML Training Python + scikit-learn + XGBoost Ecosistema maduro para modelos tabulares
Feature Store Feast Versionado de features, consistencia train/serve
ML Serving FastAPI (microservicio Python independiente) API ligera separada del backend NestJS
Experiment Tracking MLflow Seguimiento de experimentos, registro de modelos
BI / Dashboards Metabase / Grafana Open source, SQL-native, auto-hosted
Object Storage S3 / R2 Documentos, informes, imagenes
Geocoding Google Maps API + Nominatim (fallback OSM) Localización de farmacias, áreas de influencia
Monitorización datos Great Expectations Test de calidad de datos automatizados

2. Modelo de Datos

2.1 Diagrama Entidad-Relación (Alto Nivel)

User (comprador / vendedor / admin / inversor)
  ├── id (PK)
  ├── tipo (enum: buyer/seller/admin/investor)
  ├── email, nombre, teléfono (GDPR-sensitive)
  ├── email_verified_at
  ├── created_at
  ├── consent_gdpr (JSON — tracking de consentimientos)
  └── last_login_at
       │
       ├── BuyerProfile (1:1 si tipo=buyer)
       │     ├── presupuesto_min, presupuesto_max
       │     ├── ubicaciones_deseadas (JSON array de CCAA/provincias)
       │     ├── facturacion_min, facturacion_max objetivo
       │     ├── tipo_adquisicion (enum: primera/segunda/inversion)
       │     ├── plazos_deseados (meses)
       │     ├── requiere_financiacion (bool)
       │     ├── verified_investor (bool — verificado por FarmaMatch)
       │     └── alertas_activas (bool)
       │
       ├── SellerProfile (1:1 si tipo=seller)
       │     ├── farmacia_id (FK → Pharmacy)
       │     ├── motivo_venta (enum: jubilacion/traspaso/inversion)
       │     ├── precio_esperado (decimal)
       │     ├── disponibilidad_inmediata (bool)
       │     └── fecha_estimada_venta
       │
       ├── SavedSearch (1:N)
       │     ├── criterios (JSON — filtros guardados)
       │     ├── alerta_activa (bool)
       │     └── frecuencia_alerta (enum: diaria/semanal/tiempo_real)
       │
       └── Deal (1:N)
             ├── id (PK)
             ├── pharmacy_id (FK → Pharmacy)
             ├── buyer_id (FK → User)
             ├── seller_id (FK → User)
             ├── estado (enum: interes/negociacion/dd/notaria/cerrado/caido)
             ├── precio_acordado (decimal, nullable hasta cierre)
             ├── comision_farmamatch (decimal)
             ├── created_at
             └── cerrado_at
                  │
                  ├── Message (1:N)
                  │     ├── sender_id (FK → User)
                  │     ├── contenido (texto cifrado)
                  │     └── leido_at
                  │
                  ├── Document (1:N)
                  │     ├── tipo (enum: NDA/informe/dd/contrato/otro)
                  │     ├── s3_key
                  │     ├── subido_por (FK → User)
                  │     └── cifrado (bool)
                  │
                  └── DealTimeline (1:N)
                        ├── evento (enum: interes/NDA_firmado/visita/oferta/dd/notaria/cierre)
                        └── fecha

Pharmacy (oficina de farmacia)
  ├── id (PK)
  ├── nombre (o titular)
  ├── direccion (GDPR-sensitive para farmacia en venta)
  ├── latitud, longitud
  ├── codigo_postal, provincia, CCAA
  ├── tipo_zona (enum: urbana/rural/semiurbana)
  ├── poblacion_entorno (int — habitantes en radio 1km)
  ├── metros_utiles (decimal)
  ├── numero_empleados (int)
  ├── tiene_venta_online (bool)
  ├── cumple_DISTAFARMA (bool)
  ├── servicios (JSON array: SPD, dermocosmética, ortopedia, etc.)
  ├── estado (enum: disponible/en_negociacion/vendida/retirada)
  ├── fecha_alta_plataforma
  ├── fecha_baja (si se vende o retira)
  └── created_at, updated_at
       │
       ├── FinancialData (1:1 por año fiscal)
       │     ├── año (int)
       │     ├── facturacion (decimal)
       │     ├── ebitda (decimal)
       │     ├── margen_bruto (decimal)
       │     ├── gastos_personal (decimal)
       │     ├── gastos_alquiler (decimal)
       │     ├── valor_stock (decimal)
       │     ├── deuda_financiera (decimal)
       │     ├── fuente_datos (enum: vendedor/asesoria/auditoria)
       │     └── verified (bool — si ha sido verificada por FarmaMatch)
       │
       ├── Valuation (1:N)
       │     ├── version (int)
       │     ├── metodo (enum: formula/multiple/ml_phase2/experto)
       │     ├── valor_estimado (decimal)
       │     ├── rango_min (decimal)
       │     ├── rango_max (decimal)
       │     ├── intervalo_confianza (decimal — %)
       │     ├── multiplo_aplicado (decimal)
       │     ├── variables_entrada (JSON — snapshot de inputs)
       │     ├── generated_by (enum: algoritmo/experto_humano)
       │     └── created_at
       │
       ├── MarketDataSnapshot (1:N — datos de mercado en momento de valoración)
       │     ├── multiplo_medio_ccaa (decimal)
       │     ├── multiplo_medio_provincia (decimal)
       │     ├── transacciones_ultimo_ano_zona (int)
       │     └── tendencia_precios (enum: alza/estable/baja)
       │
       └── PharmacyMedia (1:N)
             ├── tipo (enum: foto/plano/documento)
             ├── s3_key
             └── es_publica (bool)

MarketData (datos agregados de mercado)
  ├── id (PK)
  ├── tipo (enum: precio_ccaa/multiplo_ccaa/volumen_ccaa/demanda_zona)
  ├── ambito (enum: nacional/ccaa/provincia/zona)
  ├── codigo_ambito (ej: "CCAA-13" para Madrid)
  ├── valor (decimal — el dato agregado)
  ├── metrica (enum: media/mediana/p25/p75/max/min/volumen)
  ├── periodo (date — mes/año de referencia)
  ├── num_muestras (int — para ponderar confianza)
  └── created_at

Match (recomendaciones generadas)
  ├── id (PK)
  ├── buyer_id (FK → User)
  ├── pharmacy_id (FK → Pharmacy)
  ├── score (decimal 0-1)
  ├── factores (JSON — desglose de puntuación: presupuesto, ubicación, facturación...)
  ├── generado_en (timestamp)
  ├── visto_por_comprador (bool)
  └── click_en_match (bool)

FeatureStore (Feast)
  ├── entity: pharmacy_id
  │   ├── features: facturacion_media_3y, crecimiento_anual, ratio_stock_facturacion,
  │   │             densidad_competencia_1km, renta_media_zona, poblacion_entorno,
  │   │             num_servicios, antiguedad_datos
  │   └── serving: [modelo_valoracion_v1, modelo_valoracion_v2]
  │
  └── entity: buyer_id
      ├── features: presupuesto_medio, zonas_interes_vector, antiguedad_perfil,
      │             num_busquedas, num_clics, num_expresiones_interes
      └── serving: [modelo_matchmaking_v1]

2.2 Política de Naming y Versionado de Datos

3. Algoritmo de Valoración

3.1 Enfoque General

La valoración algorítmica es el core IP de FarmaMatch. Se desarrolla en 3 fases incrementales, cada una mejorando precisión y confianza:

Fase Metodo Precision Esperada Datos Necesarios Timeline
F1 Fórmula basada en reglas (multiplicadores públicos + ajustes) +/-15-20% Facturación, EBITDA, ubicación, mercado público Mes 3-5
F2 Regresión ML (XGBoost entrenado con datos propios + IQVIA) +/-10-12% 50+ transacciones reales, 200+ valoraciones Mes 6-9
F3 Ensemble + modelos por segmentos + intervalo de confianza bayesiano +/-5-8% 200+ transacciones, 1000+ valoraciones, datos IQVIA Mes 10-12

3.2 Variables del Modelo (Fase 1 — Fórmula)

ValorEstimado = (FacturacionAnual × MultiploBase × Ajustes)

Donde:
  MultiploBase = 0.8 - 1.2 (según CCAA y tipo de zona)
  
  Ajustes:
    ├── +0.05  Si crecimiento facturación >5% YoY
    ├── +0.10  Si margen EBITDA >25%
    ├── +0.05  Si población entorno >10.000 hab.
    ├── -0.05  Si competencia >3 farmacias en 1km
    ├── +0.03  Si tiene SPD
    ├── +0.05  Si venta online activa y cumple DISTAFARMA
    ├── +0.03  Si metros útiles >150m²
    ├── -0.10  Si deuda >30% facturación
    ├── -0.05  Si alquiler >15% facturación
    ├── +0.05  Si datos financieros auditados/verificados
    └── +/-0.xx  Ajuste por tendencia de mercado local

Fuentes de datos para cada variable:

Variable Fuente Tipo Confianza
Facturación anual Vendedor (formulario + docs) Interno Media (verificación en F2+)
EBITDA Vendedor (formulario + docs) Interno Media
Multiplo base por CCAA Datos de mercado (IQVIA + transacciones históricas) Externo+Propio Media
Crecimiento YoY Datos financieros históricos (3 años) Interno Alta (si docs)
Población entorno INE + Google Maps Geocoding Público Alta
Competencia 1km Datos SEDIFRAME + Google Maps Público Alta
SPD / Servicios Vendedor (catálogo) Interno Media
Venta online Vendedor + verificación web Interno Media
Deuda / Alquiler Vendedor (formulario) Interno Baja
Tendencia mercado local Datos de mercado agregados Propio Baja (creciente)

3.3 Modelo ML (Fase 2 — XGBoost)

Target: Precio real de venta (€)
Features (~30):
  [Financieras] facturacion_3y, ebitda_3y, margen_bruto, gastos_personal_ratio,
                gastos_alquiler_ratio, ratio_stock_facturacion, deuda_ratio
  [Ubicación]   poblacion_1km, poblacion_5km, densidad_farmacias_1km, renta_media_zona,
                indice_saturacion, tipo_zona (one-hot)
  [Operativas]  metros_utiles, num_empleados, num_servicios, tiene_online
  [Mercado]     multiplo_ccaa_trimestre, volumen_transacciones_zona, tendencia_precios
  [Temporales]  trimestre_publicacion, antiguedad_datos

Algoritmo: XGBoost Regressor
  - n_estimators: 300 (early stopping)
  - max_depth: 6
  - learning_rate: 0.05
  - subsample: 0.8
  - validation: 80/20 split con temporal split (time-based)

Precisión esperada: MAE <10% del precio real en validación cruzada

Estrategia de feedback loop: Cada vez que una farmacia se vende, el precio real cerrado se usa como ground truth para reentrenar:

[Transacción cerrada] → [Precio real conocido]
                              ↓
                    [Comparar con valoración estimada]
                              ↓
                    [Calcular error → almacenar]
                              ↓
                    [Reentrenamiento trimestral del modelo]
                              ↓
                    [Mejora continua de precisión]

3.4 Intervalo de Confianza y Transparencia

Cada valoración muestra no solo un valor estimado, sino: - Rango (min-max) con percentil 25-75 - Nivel de confianza (Alto/Medio/Bajo) basado en: - Cantidad y calidad de datos de entrada - Número de transacciones comparables en la zona - Actualidad de los datos de mercado - Metodología usada (Fórmula F1 / ML F2+) - Factores clave que más impactan el valor (top 3 drivers alcistas y bajistas)

Principio de transparencia: El usuario sabe exactamente qué datos se usaron y cómo se calculó el valor. Esto genera confianza y permite al vendedor identificar qué mejorar para aumentar el valor.

4. Motor de Matchmaking

4.1 Lógica de Matching (Fase 1 — Basada en Reglas)

MatchScore = sum(peso_i × similitud_i) / sum(peso_i)

Factores ponderados:
  1. Presupuesto Comprador vs Precio Farmacia               peso: 40%
     → Score = 1 - |presupuesto_comp - precio_farm| / presupuesto_comp
     → Penalización severa si precio > presupuesto_max (score 0)
  
  2. Ubicación deseada vs Ubicación real                    peso: 30%
     → Si CCAA coincide: score 0.8 + bonus provincia 0.2
     → Si misma provincia: score 1.0
     → Si CCAA no coincide pero radio 200km: score 0.5
     → Fuera de rango: score 0
  
  3. Rango de facturación objetivo vs Facturación real       peso: 20%
     → Score = 1 - |fact_obj_medio - fact_real| / fact_obj_medio
     → Bonus si facturación dentro del rango exacto: +0.15
  
  4. Tipo de adquisición vs Tipo de farmacia                 peso: 10%
     → Primera botica: farmacias pequeñas-medianas (<1M) mejor score
     → Inversión: farmacias grandes con potencial de crecimiento

Output: Score 0-1 para cada par (comprador, farmacia). Umbral mínimo configurable (default: 0.5).

4.2 Algoritmo ML de Matching (Fase 2+)

Enfoque: Matrix Factorization + Content-Based Filtering

Entrada:
  - Matriz de interacciones (user_id × pharmacy_id): clics, vistas, expresiones de interés
  - Features de usuario (presupuesto, ubicaciones vectorizadas)
  - Features de farmacia (precio, ubicación vectorizada, tipo)

Modelo:
  - Representación vectorial (embeddings) de farmacias y compradores
  - Dot product → score de compatibilidad
  - Fine-tuning con feedback positivo (clic en match, expresión de interés)

Técnicas a evaluar:
  - Alternating Least Squares (ALS) para collaborative filtering
  - LightFM para hybrid recommender (content + collaborative)
  - Two-tower neural network (Fase 3, si datos suficientes)

4.3 Sistema de Alertas

Los compradores pueden guardar búsquedas (SavedSearch) y recibir alertas:

Tipo de Alerta Trigger Canal Frecuencia
Nuevo listing Nueva farmacia que supera umbral de match Email + In-app Tiempo real
Bajada de precio Farmacia en watchlist reduce precio Email + Push (F2) Tiempo real
Match semanal Nuevos matches de la semana Email digest Semanal
Oferta similar Farmacia similar a una vista recientemente Email Cada 3 días
Mercado caliente Incremento de oferta en zona de interés Email Mensual

5. Análisis de Mercado

5.1 Dashboard de Mercado (Público — Lead Magnet)

Métricas para posicionar a FarmaMatch como autoridad en datos del sector:

Metrica Desglose Fuente de Datos Actualización
Precio medio farmacia Nacional, CCAA, provincia Transacciones + valoraciones propias Trimestral
Múltiplo EBITDA medio Nacional, CCAA, por tramo facturación Transacciones cerradas Trimestral
Múltiplo facturación medio Nacional, CCAA Transacciones + mercado público Trimestral
Oferta disponible Nº farmacias en venta, total y por CCAA Listings activos Tiempo real
Demanda compradores Nº compradores activos, ratio oferta/demanda Usuarios registrados con perfil Mensual
Tiempo medio en mercado Días desde publicación hasta acuerdo Timeline de deals Mensual
Tendencia precios % variación interanual por CCAA Histórico transacciones Trimestral
Hot zones Zonas con mayor actividad compradora Clics, búsquedas, intereses Mensual
Perfil comprador Edad media, presupuesto medio, zonas preferidas Onboarding compradores Trimestral
Rotación por CCAA % de farmacias vendidas sobre el total Transacciones / censo SEDIFRAME Anual

5.2 Informes Comerciales (Valor Añadido)

Informe Cliente Objetivo Precio Estimado Contenido
Valoración de Farmacia Vendedor (lead magnet) Incluido en listing premium Estimación valor + rango + factores clave
Estudio de Mercado Local Comprador (zonas) 500-1.500€ Análisis demográfico, competencia, tendencias en zona concreta
Due Diligence Data Pack Comprador (en proceso) 1.000-3.000€ Datos financieros históricos, benchmark, alertas
Informe de Tendencias Inversores/Despachos 2.000-5.000€/anual Análisis completo del mercado, previsiones
Valoración de Cartera Fondos/Grupos 5.000-15.000€ Valoración de múltiples farmacias, optimización

5.3 KPIs Internos de Negocio

KPI de Datos Definición Target Frecuencia
Farmacias con datos completos % farmacias listing con FinancialData completo >70% Mensual
Tasa de conversión de match a deal % matches con score >0.7 que generan Deal >15% Mensual
Precisión de valoración MAE % vs precio real cerrado <10% (F2+) Por transacción
Cobertura de datos de mercado % CCAA con datos representativos 100% Mensual
Usuarios con perfil completo % registrados que completan BuyerProfile >60% Semanal
Transacciones con precio conocido % deals cerrados con precio registrado >90% Mensual
Data freshness Días desde última actualización de datos de mercado <7 días Diario

6. Estrategia de Datos Abiertos

6.1 Catálogo de Fuentes Públicas Explotables

Fuente Datos Disponibles Formato Acceso Frecuencia Actualización Utilidad en FarmaMatch
INE (ine.es) Población por municipio, renta media, densidad, pirámide poblacional, proyecciones CSV, API Gratuito, API INEBase Anual Valoración (población entorno, nivel socioeconómico)
SEDIFRAME (sediframe.com) Censo oficial de farmacias, titularidad, estado, comunidad autónoma Web, CSV (descarga) Gratuito Continuo Dataset base de farmacias existentes (competencia)
Colegios Oficiales Farmacéuticos Colegiados por provincia, censo, estadísticas Web, boletines Gratuito / Semi-público Anual Verificación de compradores (colegiados)
Catastro (catastro.minhap.es) Valor catastral de inmuebles, superficie, uso CSV, API (CAT) Gratuito Anual Referencia de valor de local
Google Places / Maps Geolocalización, tipos de negocio, reviews, horarios API Gratuito (con límites) / Pago Continuo Área de influencia, competencia, servicios cercanos
BOE / BOCM / Diarios CCAA Normativa farmacéutica, aperturas, cierres, autorizaciones PDF, HTML Gratuito Diario Alertas regulatorias, tendencias
OpenStreetMap Datos geoespaciales, calles, equipamientos API Overpass Gratuito Continuo Cálculo de áreas de influencia
Registro Mercantil Datos de sociedades, titulares, cargas API (registradores.org) Semi-gratuito (coste bajo) Continuo Verificación titularidad farmacia
INE Censales Sección censal, renta por sección API INEBase Gratuito Anual Microsegmentación de zonas
Ministerio de Sanidad Estadísticas de prestación farmacéutica, gasto farmacéutico CSV, PDF Gratuito Anual Tendencias de gasto por CCAA

6.2 Pipeline de Datos Abiertos

[Mensual] INE → Web scraping script → CSV → Pipeline normalización → PostgreSQL (population_data)
[Mensual] SEDIFRAME → Web scraping → JSON → Pipeline dedup → PostgreSQL (pharmacy_census)
[Diario]  Google Maps API → Geocoding batch → Lat/Lng → PostgreSQL (pharmacies.geo)
[Trimestral] Catastro → Descarga CSV → Pipeline → PostgreSQL (cadastre_reference)
[Continuo] OpenStreetMap → Overpass API → GeoJSON → PostgreSQL (competition_density)
[Anual] Ministerio Sanidad → PDF scraping → CSV → PostgreSQL (market_trends)

6.3 Datos Propietarios Generados por la Plataforma

El verdadero data moat no son los datos abiertos (disponibles para todos), sino los datos generados por la propia plataforma:

Dato Propietario Cómo se Genera Barrera de Entrada Explotación
Precios reales de transacción Deals cerrados en la plataforma Muy alta (requiere red de usuarios activos) Alimenta modelo de valoración, informes, dashboard
Perfiles de comprador detallados Onboarding + comportamiento Alta (requiere tráfico cualificado) Matchmaking, insights de demanda
Preferencias y patrones de búsqueda Interacciones en plataforma Alta (requiere uso activo) Mejora algoritmo de matching
Indicadores de intención de compra Frecuencia de visitas, descarga de informes Alta (requiere engagement) Scoring de leads para comerciales
Histórico de valoraciones vs precio real Feedback loop al cerrar deal Muy alta (requiere transacciones reales) Validación y mejora del algoritmo
Mapa de demanda por zona Búsquedas, alertas guardadas, visualizaciones Alta (requiere masa crítica) Advisory para compradores y vendedores

7. GDPR y Gobernanza

7.1 Clasificación de Datos por Sensibilidad

Nivel Categoría Ejemplos Almacenamiento Cifrado Acceso
Público Datos de mercado agregados Precio medio CCAA, múltiplos, tendencias PostgreSQL (sin PII) TLS tránsito Público (dashboard)
Interno Datos anonimizados de plataforma Métricas de uso, KPIs internos PostgreSQL, Grafana TLS tránsito Equipo FarmaMatch
Confidencial Datos de farmacia en venta FinancialData, documentos, dirección PostgreSQL (cifrado), S3 (cifrado) AES-256 reposo + TLS Usuario vendedor + admins con acceso granular
Restringido Datos personales usuarios Nombre, email, teléfono, perfil PostgreSQL (cifrado columnas) AES-256 reposo + TLS Solo usuario propio + admins con justificación
Muy Restringido Datos de deals + due diligence Contratos, NDA, ofertas, datos bancarios PostgreSQL (cifrado columnas) + S3 (cifrado) AES-256 reposo + TLS Solo partes del deal + admins con auditoría

7.2 Políticas de Consentimiento

Onboarding Comprador/Vendedor:
  [✓] Acepto la política de privacidad (obligatorio)
  [✓] Acepto el tratamiento de mis datos para matchmaking (obligatorio)
  [✓] Acepto recibir comunicaciones comerciales (opcional)
  [✓] Acepto compartir mi perfil con vendedores de farmacias (obligatorio para match)
  [✓] Acepto el almacenamiento de mi historial de navegación para mejorar recomendaciones (opcional)
  
Vendedor (datos de farmacia):
  [✓] Confirmo que los datos financieros son veraces (obligatorio)
  [✓] Autorizo la valoración algorítmica de mi farmacia (obligatorio)
  [✓] Acepto mostrar datos no sensibles a compradores potenciales (obligatorio)
  [✓] Acepto compartir datos agregados anonimizados para estadísticas de mercado (obligatorio)

Base legal: Interés legítimo (Art. 6.1.f GDPR) para matchmaking + Consentimiento explícito (Art. 6.1.a) para comunicaciones y datos de salud indirectos.

Consent management: Tabla user_consents con timestamp, versión política, base legal, y consentimiento granular por finalidad.

7.3 Política de Retención de Datos

Tipo de Dato Período de Retención Justificación Acción al Vencer
Datos personales de usuario 5 años tras última actividad Relación comercial + obligaciones fiscales (Ley 10/2010) Anonimización irreversible
Datos financieros de farmacia 10 años Obligación fiscal (IRPF/IS) Anonimización agregada
Datos de navegación y preferencias 2 años Mejora de servicio Eliminación
Datos de transacción (deals) 10 años Obligación fiscal + posible litigio Conservación cifrada con acceso restringido
Datos de valoración Indefinido (anonimizado) Mejora de algoritmo, data moat Anonimizado (sin PII)
Documentos (NDA, contratos) 10 años post-cierre Legal Archivo cifrado
Logs de acceso 1 año Auditoría de seguridad Eliminación
Datos de mercado agregados Indefinido Core del producto Sin PII, sin límite

7.4 Anonimización y Seudonimización

Técnica Aplicación Detalle
Seudonimización Datos de usuario en producción Reemplazar email por hash (SHA-256 con salt) en logs de actividad
Agregación geográfica Datos de mercado públicos Mostrar datos a nivel CCAA/provincia, nunca dirección exacta
Ofuscación Mapas de calor de demanda Añadir ruido laplaciano (differential privacy) a datos agregados
Redacción Documentos de due diligence Ocultar automáticamente datos personales en documentos subidos
k-anonymity Informes de mercado Solo publicar datos con k≥5 farmacias por celda
Expiración Datos de ubicación Eliminar coordenadas exactas tras 30 días, mantener solo a nivel municipio

7.5 Gobernanza de Datos

Rol Responsabilidades Asignado
Data Owner (negocio) Define calidad, prioridades, uso de datos por dominio CEO / Director de Operaciones
Data Steward (técnico) Calidad, linaje, catálogo, métricas Data Engineer
DPO (legal) GDPR compliance, DPIAs, breaches CLO / External DPO part-time
Data Scientist Modelos, features, experimentos Data Scientist
CISO Seguridad de datos, cifrado, accesos CISO (part-time fase 1-2)

7.6 Data Quality Framework

Dimensiones de Calidad:
  - Completitud: % campos obligatorios rellenados (target: >95% en datos core)
  - Precisión: % datos verificados vs fuente original (target: >90%)
  - Consistencia: % valores dentro de rangos esperados (target: >98%)
  - Actualidad: días desde última actualización (target: <7 días datos mercado)
  - Unicidad: % registros sin duplicados (target: 100% farmacias sin duplicados)

Tests automatizados (Great Expectations):
  [Cada ingesta]
  - expectation_column_values_to_not_be_null(["facturacion", "ccaa", "latitud"])
  - expectation_column_value_lengths_to_be_between("codigo_postal", min=5, max=5)
  - expectation_column_values_to_be_between("facturacion", min_value=100000, max_value=5000000)
  - expectation_column_distinct_values_to_be_in_set("ccaa", CCAA_LIST)
  
  [Diario]
  - expectation_table_row_count_to_be_between(min_value=...)
  - expectation_column_values_to_be_unique("pharmacy_id")
  
  [Semanal]
  - expectation_table_row_count_to_equal(...)  # vs semana anterior, detectar caídas

8. Equipo de Datos Necesario

8.1 Perfiles y Costes por Fase

Fase 1: MVP (Meses 1-4) — Mínimo viable de datos

Rol Dedicacion Coste Mensual Funciones Clave
Data Engineer (Part-time, compartido con backend) 50% 2.500-3.000€ Pipelines básicos, scraping SEDIFRAME/INE, modelo de datos inicial
Data Analyst (Part-time) 50% 2.000-2.500€ Dashboard básico, informes manuales, QA de datos
Total Fase 1 1 FTE 4.500-5.500€/mes

Nota: En Fase 1, el Data Scientist no existe aún. La valoración F1 es fórmula, no ML. El Data Engineer puede implementar la fórmula como función PostgreSQL o backend NestJS.

Fase 2: Growth (Meses 5-8) — Capacidades ML

Rol Dedicacion Coste Mensual Funciones Clave
Data Engineer 100% 4.000-5.000€ Pipeline IQVIA, feature store (Feast), automatización calidad datos
Data Scientist / ML Engineer 100% 5.000-6.000€ Modelo ML valoración (XGBoost), matchmaking F2, experiment tracking
Data Analyst 100% 3.000-3.500€ Dashboard mercado público, informes comerciales, análisis de producto
Total Fase 2 3 FTE 12.000-14.500€/mes

Fase 3: Scale (Meses 9-12) — Inteligencia predictiva

Rol Dedicacion Coste Mensual Funciones Clave
Data Engineer (existente) 100% 4.000-5.000€ Pipelines en producción, data infra escalable
Data Scientist Senior 100% 6.000-7.000€ Modelos predictivos avanzados, ensemble, deep learning
Data Analyst (existente) 100% 3.000-3.500€ BI avanzado, informes premium, análisis de mercado externo
Data Governance Officer (Part-time) 25% 1.000-1.500€ GDPR compliance, políticas, DPO support
Total Fase 3 3.25 FTE 14.000-17.000€/mes

8.2 Estimación Costes Totales Anuales (Datos)

Concepto Coste Estimado (12 meses)
Equipo de datos (salarios + SS) 100.000 - 140.000€
Licencias IQVIA / CloseUp 6.000 - 15.000€
APIs de datos (Google Maps, Geocoding) 1.000 - 3.000€
Herramientas (MLflow, Feast infra, Great Expectations) 500 - 1.500€
Infraestructura adicional (instancias GPU/CPU para entrenamiento) 2.000 - 5.000€
BI (Metabase Cloud o self-hosted) 0 - 600€
Total Datos 109.500 - 165.100€

% sobre presupuesto total CTO: ~25-30% del presupuesto tecnológico total (align con desglose del CTO).

9. Roadmap de Capacidades de Datos

9.1 Fase 1: Básico — “Data Foundation” (Meses 1-4)

Mes Hito Capacidades Entregables
M1 Fundación de datos Modelo de datos definido, esquemas PostgreSQL Diagrama ER, migrations iniciales, diccionario de datos v1
M1 Scrapers datos abiertos INE, SEDIFRAME, Google Maps Scripts de scraping, pipeline básico, primera carga de datos
M2 Valoración F1 (fórmula) Cálculo de valor estimado por reglas Función en backend, integración en perfil de farmacia
M2 Perfiles de usuario Buyers pueden rellenar perfil completo BuyerProfile con campos de preferencias, almacenamiento PostgreSQL
M3 Matchmaking F1 (reglas) Score básico presupuesto+ubicación Algoritmo de matching en backend, endpoint API
M3 Dashboard interno básico Métricas clave operativas Grafana con usuarios, farmacias, matches, deals
M4 Informe de valoración PDF Descarga de informe con metodología clara Generación PDF con datos de entrada, valor, factores, rango

Dependencias: Infraestructura cloud operativa (CTO F1 M1-2)

9.2 Fase 2: ML — “Data Intelligence” (Meses 5-8)

Mes Hito Capacidades Entregables
M5 Feature Store (Feast) Features consistentes para modelo ML Feast deployment, features definitions, pipeline de features
M5 IQVIA data ingestion Datos de mercado farmacéutico externos Pipeline IQVIA (API/file), integración con feature store
M6 Modelo ML valoración v1 (XGBoost) Precisión MAE <12% Modelo entrenado, API FastAPI para serving, endpoint en plataforma
M6 Feedback loop Comparación valoración vs precio real Registro de errores, trigger de reentrenamiento
M7 Matchmaking ML v2 Hybrid recommender (content + collaborative) ALS/LightFM modelo, endpoint scoring, mejora de matches
M7 Dashboard de mercado público Métricas de mercado visibles sin login Dashboard público con precios, tendencias, heatmap por CCAA
M8 Informes comerciales automatizados Informes de mercado local configurables Generador de informes PDF, plantillas parametrizables
M8 Automated data quality tests Great Expectations pipeline Suites de tests por fuente, alertas de calidad

Dependencias: 50+ transacciones con precio real para ground truth del modelo

9.3 Fase 3: Predictivo — “Data Moat” (Meses 9-12)

Mes Hito Capacidades Entregables
M9 Modelo valoración v2 (Ensemble) Ensemble XGBoost + LightGBM + regresión lineal segmentada API v2, intervalo de confianza bayesiano, precision MAE <8%
M9 Predicción de precio de venta Estimación de precio futuro basado en tendencias Feature: tendencia_precio_12m, alertas a vendedores
M10 Buyer propensity model Probabilidad de compra por comprador Score de intención por buyer, priorización de leads para comerciales
M10 Segmentación de farmacias Clustering de farmacias por perfil (rentabilidad, tamaño, ubicación) Segmentos (ej: “rural bajo margen”, “urbana premium”), recomendaciones por segmento
M11 API de datos de mercado pública (B2B) Monetización de datos via API API REST con autenticación, planes de suscripción, rate limiting
M11 Anomaly detection en datos financieros Detección de inconsistencias en datos subidos Alertas automáticas si facturación/EBITDA fuera de rango esperado
M12 Modelo de recomendación de compra cross-sell Recomendar servicios complementarios Financiación, asesoría fiscal, seguro de transmisión

Dependencias: 200+ transacciones, 1000+ valoraciones, masa crítica de usuarios

9.4 Resumen Visual del Roadmap

                      F1: Foundation          F2: Intelligence        F3: Predictive
                      ─────────────           ──────────────          ──────────────
Modelo Datos          ████████                
Scrapers DDAA         ████████                
Valoración F1         ████████                
Matchmaking F1        ████████                
Dashboard Interno     ████████                
Informe PDF           ████████                
│                                             
Feature Store                   ████████      
IQVIA Data                      ████████      
ML Valoración                   ████████      
ML Matchmaking                  ████████      
Dashboard Mercado               ████████      
Data Quality Tests              ████████      
│                                                           
Ensemble v2                                 ████████
Predicción Precio                            ████████
Buyer Propensity                             ████████
Segmentación                                 ████████
API Mercado B2B                              ████████
Anomaly Detection                            ████████

Mes:          1  2  3  4    5  6  7  8    9 10 11 12

Riesgos de Datos

Riesgo Impacto Probabilidad Mitigacion
Datos insuficientes para ML (no alcanzar 50 transacciones en F2) Alto (retraso ML) Alta Plan de contingencia: mantener valoración F1 (fórmula) y mejorar con datos IQVIA. No prometer ML hasta tener datos.
Calidad de datos de vendedores (datos financieros inflados o incorrectos) Alto (valoraciones erróneas) Alta Verificación de datos con documentación, cruce con IQVIA, detección de anomalías, disclaimer en informe de valoración
Fuga de datos sensibles (deals, datos financieros) Extremo (legal + reputacional) Media Cifrado AES-256 en reposo y tránsito, logs de acceso, RBAC estricto, GDPR by design
Baja adopción de perfil completo (compradores no rellenan preferencias) Alto (matchmaking pobre) Alta Gamificación, wizard guiado, match inmediato como recompensa, opción de asistencia telefónica
Scrapers de datos abiertos bloqueados (cambios en webs fuente) Medio (datos desactualizados) Media Monitoreo de cambios, fallback a descarga manual, acuerdos formales con Colegios
Modelo de valoración sesgado (sesgo geográfico o por tamaño) Medio (confianza) Media Validación cruzada por segmentos, fairness metrics, transparencia en metodología
Coste IQVIA prohibitivo en fase pre-seed Medio Alta Negociar licencia startup/descuento, empezar con datos abiertos y propios, IQVIA en F2

Fuentes de Datos

Dato Valor Origen Fecha Confianza
Operaciones FarmaConsulting 3.800+ farmaconsulting.es 2026 Alto
Compradores registrados FarmaConsulting 22.000 farmaconsulting.es 2026 Alto
% compradores <40 años 60% SomPharma (via estudio mercado FarmaMatch) 2025 Medio
Operaciones por jubilación 45% SomPharma 2025 Medio
Crecimiento mercado 2026 ~7% PyP Asociados / SomPharma 2026 Medio
Población por municipio Variable INE (ine.es) 2025 Alto
Censo farmacias España ~22.000 SEDIFRAME 2026 Alto
Renta media por CCAA Variable INE INEBase API 2025 Alto
Costes licencia IQVIA 6.000-15.000€/año Estimación propia (sin fuente pública) 2026 Bajo
Precisión valoración F1 target +/-15-20% Estimación propia (basada en literatura de valoración de negocios) 2026 Medio
Precisión valoración F2 target +/-10-12% Estimación propia (basada en rendimiento XGBoost en problemas similares) 2026 Bajo
Precisión valoración F3 target +/-5-8% Estimación propia 2026 Bajo
Múltiplos valoración farmacias 0.8-1.2x facturación Estudio de mercado FarmaMatch 2025 Medio
Costes equipo datos F1 4.500-5.500€/mes Glassdoor / LinkedIn Salary 2026 Medio
Costes equipo datos F2 12.000-14.500€/mes Estimación propia (salarios mercado data) 2026 Medio
Costes equipo datos F3 14.000-17.000€/mes Estimación propia 2026 Medio
Precios valoración algorítmica +/-5-8% target Artículos académicos sobre valoración automática de negocios 2025-26 Bajo
Farmacias con venta online Por determinar SEDIFRAME + verificación web 2026 Medio
Coste Great Expectations 0€ (open source) great_expectations.io 2026 Alto
Coste Feast 0€ (open source) feast.dev 2026 Alto
Coste Metabase Cloud (starter) 0-600€/año metabase.com/pricing 2026 Alto