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:
| 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
| 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
| 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
- Nombres de tablas:
snake_case en plural (pharmacies, financial_data, user_profiles)
- Timestamps: Siempre
created_at, updated_at (UTC)
- Soft delete: Campo
deleted_at nullable (sin DELETE físico)
- Enums: Tipos definidos en esquema PostgreSQL nativo
- Migraciones: Versionadas con timestamps (Flyway-style o Prisma Migrate)
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:
| 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:
| 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:
| 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:
| 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 |
| 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
| 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
| 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)
El verdadero data moat no son los datos abiertos (disponibles para todos), sino los datos generados por la propia plataforma:
| 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
| 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
| 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
| 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
| 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
| 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
| 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
| 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)
| 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)
| 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)
| 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)
| 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
| 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
| 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 |