Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/open-contracting/cardinal-rs/llms.txt

Use this file to discover all available pages before exploring further.

The variety of items supplied by a tenderer is a high outlier.

Methodology

This indicator requires awarded items to be classified using a hierarchy of numeric codes. For example, UNSPSC and CPV have four primary levels.

UNSPSC Classification

DigitsLevel
XX000000Segment
XXXX0000Family
XXXXXX00Class
XXXXXXXXCommodity

CPV Classification

DigitsLevel
XX000000Division
XXX00000Group
XXXX0000Class
XXXXX000Category
For each tenderer, the variety is calculated as the number of distinct first-level classifications across all items awarded to the tenderer, across all contracting processes. A tenderer is flagged if its variety is greater than or equal to the upper fence of: Q3+1.5(IQR)Q_3 + 1.5(IQR) where Q3Q_3 is the third quartile and IQRIQR is the interquartile range for the set of varieties among tenderers awarded in at least 20 contracting processes.
Example25% (Q1Q_1) of bidders in Atlantis supply items in 1 product category. 75% (Q3Q_3) of bidders supply items in at most 4 product categories. This yields an upper fence of 8.5 (9 in effect).RentSeekers Inc. supplies items in 20 product categories. This is higher than the upper fence of 8.5. Therefore, RentSeekers Inc. is flagged.
Why is this a red flag?A heterogeneous supplier is more likely to be unsuitable, increasing the risk of low value for money, low quality of delivery, and/or rent extraction.
Based on “Component C1B” in Design and measurement of a corruption risk index from a supplier perspective in the context of COVID-19 emergency.

Output

The indicator’s value is the variety, as a decimal (the count of distinct classification codes).

Configuration

All configuration is optional.
R048.threshold
integer
Override the calculated upper fence with a fixed threshold for the number of distinct product categories.
R048.digits
integer
default:2
Number of digits to use from the classification code for grouping. Use 2 for first-level classification (e.g., XX000000). Increase if the first level is too broad.
R048.minimum_contracting_processes
integer
default:20
Minimum number of contracting processes a tenderer must be awarded in to be included when calculating the upper fence. This minimizes correlation between award count and variety.
[R048]
threshold = 10  # optional: override calculated upper fence
digits = 2  # default: use first-level classification
minimum_contracting_processes = 20  # default

Implementation Details

The indicator (from src/indicators/r048.rs):
  • Collects classification codes from awarded items for each supplier
  • Takes only the first N digits of each classification code (configurable)
  • Counts distinct classification codes per supplier
  • Tracks the number of contracting processes each supplier participates in
  • Uses statistical outlier detection (quartiles and IQR) to identify heterogeneous suppliers
  • Only includes suppliers meeting the minimum contracting process threshold in the calculation
The indicator only processes awards with exactly one supplier. Awards to multiple suppliers are excluded to avoid overcounting.

Exclusions

An active award is excluded if it is made to multiple suppliers.

Demonstration

Input
// Example OCDS releases showing supplier winning awards across many diverse product categories
Output
ocdscardinal indicators --settings docs/examples/R/048.ini --no-meta docs/examples/R/048.jsonl
{"Tenderer":{"F":{"R048":2.0}}}

Build docs developers (and LLMs) love