Methodology
For each contracting process, the difference is calculated as:Q1is the first quartile (25th percentile) of all differencesIQRis the interquartile range (Q3 - Q1)- This is a standard statistical method for detecting outliers
Example:In 25% (Q₁) of contracting processes in Atlantis, the second-lowest valid bid is at most 5% greater than the winning bid. In 75% (Q₃) of contracting processes, it is at most 7% greater. This yields a lower fence of 2% (
0.02).In a contracting process, CollusionCorp won with a bid of 101,000. The difference is 1% (0.01). This is less than the lower fence of 2%, so the process is flagged.Output
The indicator returns different values depending on the entity: For contracting processes: The difference value as a decimal (e.g.,0.01 for 1%)
For tenderers: Always 0.0 (to indicate they are flagged)
If the --map command-line flag is set, the Maps key contains:
ocid_tenderer_r024: The flagged tenderers for each flagged OCID
Configuration
All configuration is optional.Override the calculated lower fence with a fixed threshold. When set, the statistical calculation is bypassed.This would flag any contracting process where the difference is ≤ 5%.
See also:
no_price_comparison_procurement_methods and price_comparison_procurement_methods in global configuration for excluding certain procurement types from price-based indicators.Exclusions
A contracting process is excluded if:- An award’s status is pending or invalid
- The winning bid is not the lowest bid (this indicator requires price-only award criteria)
- There are multiple active awards (multiple winners) - see issue #14
- A bid is submitted by multiple tenderers (joint ventures) - see issue #17
- An award is made to multiple suppliers - see issue #17
Want to eliminate an exclusion? Please contribute to the linked GitHub issues.
Assumptions
This indicator assumes that the tenderer of the winning bid didn’t submit another valid bid.Example Output
Input (OCDS JSONL with bids):Implementation Details
Fromsrc/indicators/r024.rs:19-48:
The indicator:
- During processing: Calculates the ratio for each contracting process and stores in
second_lowest_bid_ratios - During finalization:
- Computes quartiles (Q1, Q3) and IQR from all ratios
- Calculates lower fence using Tukey’s method
- Flags processes where ratio ≤ lower fence
- Also flags both the winner and second-lowest bidder
- Optimization: Skips flagging if Q1 ≤ 0 (would flag 75% of processes)
