Every dot is one individual with a true label (positive/negative, colored) and a risk score in [0,1]. Crucially, scores are drawn from the same conditional distribution P(score | label) for both groups — the underlying risk model is equally accurate for A and B. Only the groups' base rates (the true fraction of positives) differ, exactly as they do for most real outcomes across demographic groups.
Because P(score | label) is shared, a common threshold automatically gives equal FPR and TPR (equalized odds) — that's structural, not a coincidence. But PPV (precision — the fraction of "predicted positive" who are actually positive, i.e. calibration) is governed by Chouldechova's identity:
FPR = [ p/(1-p) ] · [ (1-PPV)/PPV ] · (1 - FNR)
With FPR and FNR (=1-TPR) forced equal across groups, a difference in base rate p necessarily forces a difference in PPV — the model reads as "less trustworthy" for whichever group has the lower base rate. This is the core content of the fairness impossibility theorem (Chouldechova 2017; Kleinberg, Mullainathan & Raghavan 2016): except in the trivial case pA = pB or a perfect classifier, no single threshold can satisfy equalized odds and calibration simultaneously.
- Base rate sliders — set how common the true positive outcome actually is in each group.
- Decision threshold — the score cutoff above which the classifier predicts "positive"; spheres jump between the lower (predicted-negative) and upper (predicted-positive) shelf as it moves.
- Independent thresholds — lets you hand-tune Group B's cutoff to try to close the ΔPPV gap; watch ΔFPR/ΔTPR open up instead, since you cannot close both at once when base rates differ.
Real-world relevance: this identity is why COMPAS-style recidivism scores, credit models and hiring algorithms cannot be simultaneously "equally accurate" and "equally calibrated" across groups whenever the groups' true outcome rates differ — a genuine mathematical constraint, not a bug to be engineered away.