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 ratio of disqualified bids to submitted bids is a high outlier per buyer, procuring entity, or tenderer.

Methodology

This indicator calculates ratios and uses statistical outlier detection to flag suspicious patterns.

For Buyers and Procuring Entities

For each buyer, the ratio is calculated as: numberOfBidsDisqualifiedByBuyernumberOfBidsSubmittedToBuyer\frac{\text{numberOfBidsDisqualifiedByBuyer}}{\text{numberOfBidsSubmittedToBuyer}} A buyer is flagged if its ratio 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 ratios. The same methodology applies to procuring entities.

For Tenderers

For each tenderer, the ratio is calculated as: numberOfBidsDisqualifiedForTenderernumberOfBidsSubmittedByTenderer\frac{\text{numberOfBidsDisqualifiedForTenderer}}{\text{numberOfBidsSubmittedByTenderer}} A tenderer is flagged using the same upper fence calculation.
Example for a buyer or procuring entity25% (Q1Q_1) of buyers in Atlantis disqualify at most 2% of bids received. 75% (Q3Q_3) of buyers disqualify at most 22% of bids received. This yields an upper fence of 52%.The State Water Corporation disqualified 59% of bids received. This is more than the upper fence of 52%. Therefore, the State Water Corporation is flagged.
Example for a tenderer25% (Q1Q_1) of bidders in Atlantis have no disqualified bids. 75% (Q3Q_3) of bidders have at most 24% disqualified bids. This yields an upper fence of 60%.73% of the bids submitted by MisconductCorp were disqualified. This is higher than the upper fence of 60%. Therefore, MisconductCorp is flagged.
Why is this a red flag?A corrupt buyer or procuring entity can award pre-determined bidders by disqualifying other bidders’ bids.A colluding bidder can mimic competition by submitting deliberately unqualified bids.
Based on “Excluding qualified bidders” in Guide to Combating Corruption & Fraud in Infrastructure Development Projects and Behind the Scenes of ProZorro: Does Ukrainian business trust public procurement?.

Output

The indicator’s value is the ratio, as a decimal (between 0.0 and 1.0). If the --map command-line flag is set, the Maps key contains:
ocid_buyer_r038
map
The buyer for each ocid in which at least one bid is disqualified.
ocid_procuringentity_r038
map
The procuring entity for each ocid in which at least one bid is disqualified.

Configuration

All configuration is optional.
R038.threshold
float
Override the calculated upper fence with a fixed threshold. If not set, the upper fence is calculated using Q3+1.5(IQR)Q_3 + 1.5(IQR).
R038.minimum_submitted_bids
integer
default:2
Minimum number of submitted bids for a tenderer to be included in the analysis. Tenderers with fewer bids are excluded.
R038.minimum_contracting_processes
integer
default:2
Minimum number of contracting processes for a buyer or procuring entity to be included in the analysis.
[R038]
threshold = 0.5  # optional: override calculated upper fence
minimum_submitted_bids = 2  # default
minimum_contracting_processes = 2  # default
Put all properties under one [R038] section in your settings file.

Implementation Details

The indicator (from src/indicators/r038.rs):
  • Tracks disqualified and submitted bid counts for buyers, procuring entities, and tenderers
  • Calculates ratios as fractions (numerator/denominator)
  • Uses statistical analysis (quartiles and IQR) to determine outliers
  • Only flags entities meeting minimum threshold requirements
  • Skips flagging if 75% of cases have no disqualified bids (upper fence = 0)
  • Stores metadata about Q1, Q3, and upper fence calculations

Assumptions

This indicator assumes that /buyer/id, /tender/procuringEntity/id and /bids/details[]/tenderers[]/id are stable across contracting processes.
Is this assumption not true for your data? Please contribute to GitHub issue #32.

Demonstration

Input
// Example OCDS releases showing excessive disqualification pattern
Output
ocdscardinal indicators --settings docs/examples/settings.ini --no-meta docs/examples/R/038.jsonl
{"Buyer":{"B":{"R038":0.5}}}

Build docs developers (and LLMs) love