# DEFINICIONES PREVIAS · D1 + D2 · Competencia medida, capa 1 (sin actas) y predicción sellada de Cantabria Ejecutor: Opus 5.5 · 21-oct-2026 · Encargo D1+D2 de `asesor/FRONTERA_D_COLUSION.md` (§1, §4, §5). Sin modelos de lenguaje, sin red, sin API. Datos: `unified_20261018` (+ `.identidad`, `.vinculos`), solo lectura. Etiqueta: lotes de cártel de P8 (`p8/salidas/c06_lotes_cartel.parquet`, V2 y V3; mismos `id_canonical` en la construcción del 18-oct: 7.132 de 7.132). **Qué se ha mirado antes de escribir esto** (todo en `salidas/00_*`, `01_base`, `02_poblacion`, `03_n_controles`, `04_potencia`): cobertura y coherencia de `num_ofertas`, `oferta_min_eur`, `oferta_max_eur`, PBL (sin etiqueta), el embudo de la población y **cuántas** positivas y controles hay por cártel y año. **No se ha calculado ningún screen** (ni RANGO, ni SEP, ni bajas, ni percentiles) sobre ningún lote, ni con etiqueta ni sin ella. Lo que sigue se sella con md5 y hora en `DEFINICIONES_PREVIAS.md5` y copia 444 en `DEFINICIONES_PREVIAS.original.md`. No se cambia después. Lo que no esté aquí se rotula «exploratorio, no pre-registrado». El resultado nulo es un resultado y se publica. Vocabulario de lo publicable: «competencia medida», «screen» (término técnico), «descriptor». Nunca «cártel probable», nunca nombres de empresas, nunca listas por lote. Las tablas por empresa o por lote viven solo en `interno/` (700). --- ## 1. Población **P (población de screens)** = lote (fila `unidad = 'adjudicacion'`) de la **PLACSP**, no menor, `anio_ref` 2018-2025, en este orden de exclusión (cada motivo se cuenta; medido: 176.743 lotes en P): | Motivo | Regla | |---|---| | `al_alza_tipo` | `tipo_contrato` ∉ {Obras, Servicios, Suministros} (patrimoniales, concesiones, privados, administrativos especiales: la oferta más baja no tiene por qué ganar; vocabulario `al_alza` de PREREG_SCREENS) | | `persona_fisica` | adjudicatario persona física (identidad) | | `menos_de_3` | `num_ofertas` < 3 o nulo | | `sin_min_max` | falta `oferta_min_eur` o `oferta_max_eur`, o alguno ≤ 0 | | `incoherente` | mín > máx, o importe adjudicado nulo o ≤ 0, o adjudicado < mín × 0,995, o adjudicado > máx × 1,005 | | `sobre_pbl` | PBL del lote fiable y mín > PBL × 1,001 (todas las ofertas por encima del presupuesto: al alza de hecho o unidades mezcladas) | **PBL del lote fiable** (`pbl_lote`) = `imp_lic_eur` > 0 con `imp_lic_reparto = 'por_lote'` o licitación con una sola adjudicación (regla de P8). Si no, el PBL no se usa. **PC (población del compuesto)** = P menos: - `sin_dispersion`: mín = máx; - `precio_no_competido`: PBL del lote fiable y |mín − PBL| ≤ 0,001 × PBL. (Como en PREREG_SCREENS §1.3: sin dispersión no hay información y al precio de licitación el precio no compite.) **Mercado** = división CPV (`cpv_division`, `??` si falta) × tipo de órgano (`organos_tipo.tipo`, v3.2) × `anio_ref`, como el percentil de P8. Mercados con < 20 lotes en PC: sus lotes no reciben percentil y salen del contraste (se cuentan). ## 2. Screens de capa 1 (fórmulas exactas y sentido) Notación del lote: mín, máx (`oferta_min_eur`, `oferta_max_eur`), adj (`imp_adj_eur`), n (`num_ofertas`), PBL (`pbl_lote`). | Screen | Fórmula | Población | Sentido «más parecido a colusión» (orientación) | |---|---|---|---| | **RANGO** | (máx − mín) / mín | PC | **↓** (−1): ofertas agrupadas (SPD de PREREG_SCREENS, que es esta misma fórmula con todas las ofertas) | | **SEP** | (máx − adj) / adj | PC | **↓** (−1): coberturas colocadas justo por encima del adjudicatario y bajas limitadas (P8: baja ↓ en carreteras y militar) dejan poco recorrido entre la ganadora y la más cara. *Se fija ↓ ahora; el sentido contrario («ganadora separada» con coberturas lejanas) queda como lectura del resultado, no como segunda prueba* | | **BAJA_COND** | baja − mediana(baja) del mismo **mercado × tramo de nº de ofertas** (3 · 4-5 · 6-9 · ≥ 10); baja = 1 − adj/PBL solo si adj/PBL ≤ 1,25; la mediana sobre los lotes de PC con baja de esa celda, y solo si la celda tiene ≥ 10; si no, nulo | PC con PBL | **↓** (−1): baja menor que la de su mercado con la misma competencia (señal post hoc de P8, aquí pre-registrada) | | **PRECIO_NO_COMPETIDO** (PNC) | 1 si \|mín − PBL\| ≤ 0,001 × PBL, si no 0 | **P** con PBL (es la regla que saca a esos lotes de PC) | **↑** (+1) | | **REP_IGUAL** (reparto) | licitaciones con ≥ 3 lotes adjudicados (todas las adjudicaciones no menores O/S/S de la PLACSP 2018-2025 de la licitación, sin exigir ofertas ni personas físicas fuera): cuota de cada ganador distinto = Σ adj de sus lotes / Σ adj de la licitación; con ≥ 2 ganadores distintos, REP_IGUAL = 1 − Gini de las cuotas (Gini = Σ_i Σ_j \|s_i − s_j\| / (2 K Σ s), K ganadores). Ganador = `empresa_clave` de la identidad o, si falta, el nombre publicado | lotes de PC de esas licitaciones | **↑** (+1): cuotas casi iguales | | **ESTAB** (estabilidad del conjunto de ganadores) | celda órgano (`organo_clave`) × división CPV: W_t = ganadores distintos en el año t (adjudicaciones no menores O/S/S de la PLACSP, sin personas físicas, 2017-2025); si la celda tiene ≥ 3 lotes en t y en t − 1, ESTAB = \|W_t ∩ W_{t−1}\| / \|W_t ∪ W_{t−1}\| | lotes de PC por (órgano, CPV, año) | **↑** (+1) | | **UTE_RIVALES** | 1 si el adjudicatario es una UTE con ≥ 2 socios no personas físicas en `ute_socios` y al menos 2 de esos socios ganan solos (como `empresa_clave`) algún lote no menor de la PLACSP 2014-2025 en la misma división CPV × tipo de órgano; si no, 0 | PC | **↑** (+1) | **Percentil orientado** de un screen continuo: dentro del mercado, sobre todos los lotes de PC con ese screen definido (sin usar la etiqueta), pct = (rango medio de orientación × valor − 0,5) / N, empates con rango medio. **Compuestos** (sin pesos: con ~111 positivas ajustar pesos sería entrenar sobre la etiqueta): - **S3 (principal)** = media de los percentiles orientados disponibles de RANGO, SEP y BAJA_COND (RANGO y SEP siempre existen en PC; BAJA_COND cuando hay PBL fiable). - **S5 (secundario)** = media de los disponibles de RANGO, SEP, BAJA_COND, REP_IGUAL y ESTAB. PNC y UTE_RIVALES son binarios: se contrastan como screens propios, no entran en los compuestos. ## 3. Etiqueta, controles y estratos - **Positiva de un cártel** = lote de PC que está en V2 ∪ V3 de su expediente en P8 (V2 = ganado por un miembro dentro del mercado afectado y del periodo acreditado; V3 = todos los lotes de las licitaciones citadas en la resolución): S/0016/21 alimentos, S/0008/21 material militar, S/0013/19 carreteras. S/0004/25 (Cantabria) no tiene resolución: no es etiqueta en D1. - **Control de un cártel** = lote de PC que cumple la regla de mercado afectado de P8 (`c06` MERCADO: alimentos CPV 15/03; militar órganos AGE de Defensa por nombre; carreteras órganos AGE con «carreteras» en el nombre) en un año en que ese cártel tiene alguna positiva, y que **no** está en la exclusión: ningún lote (de cualquier fecha) ganado por una empresa de cualquiera de los cuatro expedientes (NIF, UTE por `ute_socios` o por nombre, como `c06`) ni ningún lote de una licitación citada. Una positiva nunca es control de otro cártel. - **Estrato** = cártel × año. Los estratos sin los dos grupos no aportan pares. - **Recuentos medidos antes de sellar** (lotes de PC; `03_n_controles`): alimentos 87 positivas (33 licitaciones, 15 órganos) / 1.318 controles; militar 20 (15; 10) / 708 (los 420 controles de 2021 no cuentan: ninguna positiva de 2021 queda en PC); **carreteras 4 lotes de 4 licitaciones de un solo órgano, frente a 10 controles** (el cártel acaba en 2018 y la PLACSP no publica mín/máx antes de 2018: 0 lotes con mín/máx en 2014-2017). Algunas de estas positivas pueden caer en mercados con < 20 lotes y salir. ## 4. Contraste y criterio de aceptación - **AUC estratificada** de cada candidato = proporción de pares (positiva, control) del mismo estrato en que la positiva tiene el valor orientado mayor (½ en empate) = Σ_s AUC_s n1_s n0_s / Σ_s n1_s n0_s. Lotes sin el screen: fuera de ese candidato. Se calcula por cártel y en **conjunto** (los estratos de los tres). - **IC95**: bootstrap en dos etapas (órganos con reemplazo; dentro de cada órgano elegido, licitaciones con reemplazo; todos los lotes de la licitación elegida), positivas y controles juntos, 2.000 réplicas, percentiles 2,5 y 97,5, **semilla 20261021**. En conjunto la unidad es el par (cártel, lote) y se remuestrean los órganos de la unión. - **p unilateral por permutación** de la etiqueta dentro de cada estrato (2.000; semilla 20261021), en conjunto. - **Candidatos** (9): S3, S5, RANGO, SEP, BAJA_COND, PNC, REP_IGUAL, ESTAB, UTE_RIVALES. **Criterio (fijado ahora):** 1. **(a)** el candidato tiene AUC ≥ 0,65 en **≥ 2 de 3** cárteles (el umbral del encargo); 2. **(b)** su AUC en conjunto tiene límite inferior del IC95 bootstrap > 0,50; 3. para **S3** (principal), «funciona» = (a) y (b); 4. para cualquier otro candidato, «funciona» exige además **(c)** que su p de permutación en conjunto sobreviva a **Holm** sobre los 9 candidatos (α = 0,05) y **(d) leave-one-cartel-out**: para cada cártel dejado fuera, se elige entre los 9 el candidato con mayor AUC en conjunto de los otros dos; ese elegido debe dar AUC ≥ 0,65 en el cártel dejado fuera en ≥ 2 de los 3 pliegues. (Los screens no tienen parámetros: lo único que se puede sobreajustar es **elegir** el screen; el leave-one-out mide eso.) 5. Si ningún candidato «funciona»: **los screens se publican solo como descriptores de competencia medida, sin etiqueta**. Si el AUC en conjunto de S3 tiene el IC95 entero por debajo de 0,50: «sentido contrario», se publica como tal. **Potencia declarada** (`salidas/04_potencia.md`, Hanley-McNeil; deff = efecto de diseño por agrupación en órganos): alimentos ±0,064 (deff 1) a ±0,129 (deff 4) con A = 0,65; militar ±0,13 a ±0,26; **carreteras ±0,34 a ±0,68: con 4 lotes de un órgano el AUC de carreteras es casi ruido** (P(AUC^ ≥ 0,65 | A = 0,50) = 0,20-0,34). En la práctica la regla «2 de 3» la deciden alimentos y militar, y el falso «funciona» por azar de un candidato es ≈ 1,5 % (deff 2). Un efecto moderado (A ≈ 0,60) dará casi siempre «no funciona» aunque exista; no se reinterpretará. ## 5. Calibración y sensibilidades (declaradas; no deciden) - **Calibración**: deciles del percentil de S3 dentro del mercado; en el conjunto positivas + controles de cada cártel, proporción de positivas por decil y razón del quintil superior frente a la base. - **Sensibilidades**: (i) solo V2 como positivas; (ii) sin basados, NSP ni emergencias; (iii) percentiles dentro de mercado × tramo de nº de ofertas; (iv) solo lotes con los tres screens de S3; (v) unidad licitación (S3 medio por licitación). - **Segunda implementación** independiente (otro script, pandas/numpy, escrito desde este texto): screens, percentiles, S3, S5, AUC y bootstrap. Tolerancias: screens y percentiles |Δ| ≤ 1e−9; AUC |Δ| ≤ 1e−9; extremos del IC |Δ| ≤ 0,02 (otro generador). Si discrepan, manda la lectura más conservadora. Cotejo en `salidas/07_cotejo_impl2.md`. ## 6. D2 · Predicción sellada de Cantabria (S/0004/25, en instrucción) - **Ámbito** (el de `p8/cnmc/`: obra civil, edificación y otros servicios de construcción en Cantabria, órganos estatales, autonómicos y locales; P8 `c06` MERCADO): lotes de PC de **obras** (`tipo_contrato = 'Obras'` o CPV 45) con NUTS ES13 o provincia Cantabria, con fecha de referencia (adjudicación, si no formalización, si no publicación) del **1-1-2019 al 31-3-2025** (ventana supuesta de P8: el expediente no acredita periodo; inspecciones del 25 al 27-3-2025). - **Lotes de las 12 empresas** = V2 de S/0004/25 en `c06` (NIF de la identidad y UTE con ellas como socias) dentro de ese ámbito y ventana. - **Señalado** = lote cuyo S3 está en el **percentil ≥ 80 dentro de su mercado** (S3 re-rangueado dentro de CPV × tipo de órgano × año, sobre todos los lotes de PC del mercado con S3; misma fórmula de percentil). Licitación señalada = con algún lote señalado. - **Controles** = lotes de PC de obras (misma regla) **fuera de Cantabria**, misma ventana, fuera de la exclusión de §3. - **El sobre** (`interno/CANTABRIA_SOBRE_CERRADO.md`, md5 + hora, copia 444) lista todos los lotes y licitaciones señalados del ámbito (sean o no de las 12 empresas, con esa marca) y las cifras agregadas. Lo publicable (`salidas/08_cantabria_publicable.md`) es solo el hash, la fecha, este criterio y las cifras agregadas. - **Criterio de acierto (escrito ahora)**. Cuando la CNMC resuelva, R = lotes de PC del ámbito que la resolución identifica como afectados: los de las licitaciones que cite; si no publica la lista, los ganados por las empresas sancionadas dentro del periodo y el mercado acreditados (regla V2). - **Acierto**: ≥ 60 % de R está entre los señalados **y** la tasa de señalados en los controles es ≤ 25 %. - **Acierto débil**: no se cumple lo anterior, pero el AUC de S3 de R frente a los controles (estratificado por año, bootstrap de §4) es ≥ 0,65 con límite inferior > 0,50. - **Fallo**: en otro caso. Si la resolución archiva sin infracción, el sobre se abre y se informa la tasa de señalados entre los lotes de las 12 empresas como tasa de falsos positivos de la capa 1 en este mercado. - El resultado se publica sea cual sea. El sobre solo vale para esta construcción y este código (los md5 de `sql/` y `py/` se anotan en el sobre).