Saltar al contenido
Tordo

Dividíamos el precio unitario dos veces

Nota de datos del .

Estado
Arreglado
Datos
Órdenes de compra de ChileCompra de octubre de 2025 a marzo de 2026: 2.387.370 líneas en pesos. Medido el 16 de octubre de 2026.

En corto

  • En el 99,98 % de las líneas en pesos, precio por cantidad da el total de la línea: el precio ya viene por unidad.
  • Lo dividíamos otra vez por la cantidad. El papel higiénico jumbo salía entre $843 y $2.106, y el paquete se paga a $16.850.
  • Con el precio corregido, el 82 % de las bandas nacionales por producto tiene predictibilidad alta. Antes, el 33 %.

Qué vimos

Cada línea de una orden de compra de ChileCompra trae el precio neto, la cantidad y el total de la línea. Las bandas de precio de Tordo tomaban el precio neto y lo dividían por la cantidad, como si fuera el total. Estaba así desde el primer cálculo de bandas.

Cada banda publicaba entonces el precio de una unidad repartido entre las unidades de la orden. Mientras más unidades compraba un organismo, más barato parecía pagar. Un caso: el papel higiénico jumbo se compra a $16.850 el paquete, y su ficha decía que la mitad se pagó entre $843 y $2.106.

Cómo lo medimos

Tomamos las órdenes de compra de octubre de 2025 a marzo de 2026, 2.387.370 líneas en pesos, y comparamos el precio por la cantidad con el total de cada línea, con una tolerancia de 1 % o $1:

|precioNeto × cantidad − totalLineaNeto| ≤ máx($1, 1 % del total)

Cuadra en el 99,98 %. Si el precio neto fuera el total de la línea, cuadraría sólo en las líneas de una unidad.

De paso apareció otra cosa: el 0,56 % de las líneas viene en UF, dólares, UTM o euros, y su precio está en esa moneda. Leído como pesos, daba bandas de $1.

Qué cambió

Antes
33 %
Después
82 %
Bandas nacionales por producto con predictibilidad alta
  • El precio unitario es el precio neto, tal cual.
  • Entra sólo la línea en pesos que cuadra con su total. Queda fuera el 0,018 %: líneas con un descuento o un cargo propio, donde no se sabe cuál es el precio pagado.
  • Con el precio corregido, el QCD mediano, que compara P25 con P75, es 0,012 en la banda nacional por producto y 0,27 en la de categoría por comprador. La guía de bandas explica cómo leerlo.
  • Parte de ese 82 % lo pone el comprador único: una banda de un solo organismo repite su precio de contrato y sale estable. Entre las bandas de mercado, con tres compradores o más y ninguno sobre la mitad, el 70 % es «alta», el 18 % «media» y el 12 % «baja».
  • Los cortes de predictibilidad (QCD 0,25 para «alta» y 0,45 para «media») se quedan. Son absolutos, así que el error no los movió.
  • El arreglo llega al sitio con el análisis del domingo 18 de octubre. Ese día las fichas de producto, la búsqueda y la API toman las bandas nuevas.

Lo que todavía no sabemos

Si conviene ajustar por inflación los precios de años atrás. Lo medimos con el error, y repetirlo pide más historia que los seis meses de la copia local.

Reprodúcelo

El test arma filas con la forma del archivo real de ChileCompra: todo es texto, con coma decimal, y cada línea trae su moneda. Fallaba con el cálculo anterior.

cd etl && uv run --project .. pytest tests/test_precio_unitario.py

Fuentes

Cada cifra de la nota sale de uno de estos fragmentos del repositorio.

  • etl/analytics/product_price_bands.py: «medido en los seis meses locales (2025-10 a 2026-03), la igualdad se cumple (±1 % o ±$1) en el 99,98 % de 2.387.370»
  • CLAUDE.md: «precioNeto × cantidad = totalLineaNeto (±1 %) en el 99,98 % de las líneas en pesos»
  • CLAUDE.md: ««papel higiénico jumbo», a $16.850 el paquete, salía «entre $843 y $2.106»»
  • etl/analytics/product_price_bands.py: «el 0,56 % viene en UF, dólares, UTM o euros, y leído como pesos daba bandas de «$1»»
  • etl/analytics/product_price_bands.py: «Las que no cuadran (441, el 0,018 %) traen un descuento o un cargo en la línea»
  • CLAUDE.md: «QCD mediano 0,00 en L0, 0,012 en L0N y 0,27 en L1»
  • CLAUDE.md: ««alta» el 82 % de las bandas L0N (antes el 33 %)»
  • CLAUDE.md: «El 82 % lo infla el comprador único (89 % «alta» entre esas bandas); entre las de mercado: 70 % alta, 18 % media, 12 % baja»
  • CLAUDE.md: «≥ 3 organismos compradores y ninguno con más del 50 % de las compras»
  • CLAUDE.md: «Los cortes (QCD_ALTA 0,25, QCD_MEDIA 0,45) son absolutos y se quedan»
  • CLAUDE.md: «Deflactar por inflación: medido con el error de precio unitario, pendiente de re-medir.»
  • docs/DESPLIEGUE.md: «0 6 * * 0 (domingo 06:00 UTC»
← Todas las notas