Skip to main content
The percentage difference between the winning bid and the second-lowest valid bid is a high outlier.
See also: R024 - Low bids (if available)

Methodology

For each contracting process, the difference is calculated as: secondLowestValidBidAmountwinningBidAmountwinningBidAmount\frac{\text{secondLowestValidBidAmount} - \text{winningBidAmount}}{\text{winningBidAmount}} A contracting process is flagged if the difference 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 differences. The winner is also flagged.
ExampleIn 25% (Q1Q_1) of contracting processes in Atlantis, the second-lowest valid bid is at most 5% greater than the winning bid. In 75% (Q3Q_3) of contracting processes, it is at most 7% greater. This yields an upper fence of 10% (0.1).In a contracting process, Lemon Industries won with a bid of 100,000,andFairDealEnterpriseslostwiththesecondlowestbidof100,000, and FairDeal Enterprises lost with the second-lowest bid of 115,000. The difference is 15% (0.15). This is greater than the upper fence of 10%. Therefore, the process is flagged.
Why is this a red flag?An unethical bidder can offer defective goods (“lemons”) if the buyer has inadequate quality criteria.
Based on “The price offered by the winning bidder is significantly lower than the price offered by the rest of the bidders” in Fraud in Public Procurement: A collection of Red Flags and Best Practices, “Difference between lowest and second lowest bid prices” in Assessing the potential for detecting collusion in Swedish public procurement, and The Market for “Lemons”: Quality Uncertainty and the Market Mechanism.

Output

The indicator’s value for the contracting process is the difference, as a decimal (e.g., 0.15 represents 15%). The indicator’s value for the tenderer is always 0.0. If the --map command-line flag is set, the Maps key contains:
ocid_tenderer_r058
map
The flagged tenderers (winners) for each flagged ocid.

Configuration

All configuration is optional.
R058.threshold
float
Override the calculated upper fence with a fixed threshold (as a decimal, e.g., 0.50 for 50%).
[R058]
threshold = 0.50  # optional: flag if difference is >= 50%
See global settings for no_price_comparison_procurement_methods and price_comparison_procurement_methods to control when price comparison indicators are applied.

Implementation Details

The indicator (from src/indicators/r058.rs):
  • Depends on the SecondLowestBidRatio calculation (calculated by another module)
  • Uses statistical outlier detection on the set of all second-lowest bid ratios
  • Calculates Q1, Q3, and IQR from the distribution
  • Only flags if the upper fence is greater than 0 (skips if 75% have no difference)
  • Identifies the winning tenderer from the winner_and_lowest_non_winner map
  • Stores metadata about quartiles and upper fence
This indicator depends on data calculated by the SecondLowestBidRatio indicator, which must run first.

Exclusions

A contracting process is excluded if:
  • An award’s status is pending or invalid.
  • The winning bid is not the lowest bid.
  • There are multiple active awards (a.k.a. winning bids). #14
  • A bid is submitted by multiple tenderers. #17
  • An award is made to multiple suppliers. #17
Want to eliminate an exclusion? Please contribute to the linked GitHub issue.

Assumptions

This indicator assumes that the tenderer of the winning bid didn’t submit another valid bid.

Demonstration

Input
// Example OCDS release with heavily discounted winning bid
Output
ocdscardinal indicators --settings docs/examples/settings.ini --no-meta docs/examples/R/058.jsonl
{"OCID":{"F":{"R058":99.0}},"Tenderer":{"W":{"R058":0.0}}}