An educational framework for studying fairness in machine-learning systems using statistical fairness metrics, causal analysis, model evaluation, and mitigation techniques.
Machine-learning models deployed in high-stakes domains—such as credit scoring, hiring, and logistics dispatch—can inadvertently learn and amplify societal disparities. Evaluating and mitigating these disparities requires more than calculating isolated statistical ratios; it requires methodological rigor around feature timing, evaluation integrity, sample uncertainty, causal assumptions, and baseline comparisons.
Algorithmic Fairness Analysis (afa) is an educational open-source framework designed to illustrate how fairness and utility interact across classification models. It demonstrates:
- Fairness Metric Mathematics: Hands-on implementations of Demographic Parity, Equal Opportunity, Equalized Odds, Predictive Parity, and Disparate Impact Ratio.
- Evaluation Integrity: Enforcing prediction-time feature contracts, preventing target leakage, and write-protecting holdout test data with an architectural firewall (
LockedTestData). - Mitigation Tradeoffs: Comparing pre-processing sample reweighting (Inverse Probability Weighting) and post-processing validation threshold adjustments against unmitigated and negative control baselines.
- Causal Reasoning: Formulating Structural Causal Models (SCMs) and Directed Acyclic Graphs (DAGs) to identify direct, indirect, and mediator pathways before intervening.
- Statistical Rigor: Quantifying uncertainty via cluster-aware bootstrap resampling, gating sparse subgroups in intersectional analyses, and evaluating multi-seed paired deltas.
Note
Educational Scope: This repository is an educational and research-engineering framework intended for students, researchers, and engineers. It is not a commercial compliance product, certification tool, or regulatory decision engine.
The evaluation pipeline enforces separation between data ingestion, prediction timing, model evaluation, uncertainty estimation, and threshold mitigation:
flowchart TD
A["1. Data Ingestion & Schema<br/>(afa ingest / Data Provenance)"] --> B["2. Feature & Timing Firewall<br/>(LockedTestData & Pre-Dispatch Contracts)"]
B --> C["3. Group-Aware Partitioning<br/>(GroupAwareSplitter / Unit Alignment)"]
C --> D["4. Baseline Model Training<br/>(B0 Majority to B4 XGBoost)"]
D --> E["5. Fairness Evaluation<br/>(DPD, EOD, EODiff, PPD, DIR)"]
E --> F["6. Uncertainty & Intersectional Audit<br/>(Cluster Bootstrap & Sparse Cell Gating)"]
F --> G["7. Fairness Mitigation<br/>(Reweighting & Validation Threshold Optimization)"]
G --> H["8. Metric Invariant & Reporting<br/>(Pure Mathematical Cross-Checks)"]
The plot below illustrates the Pareto tradeoff between predictive utility (Balanced Accuracy) and fairness disparity (Equalized Odds Difference) across standardized baselines (
Observations: The trivial majority predictor ($B_0$) achieves zero disparity solely by predicting the majority class (diagnosed as DEGENERATE). The unmitigated model ($B_1$) and reweighted model ($B_2$) achieve high accuracy but substantial disparity. Validation threshold post-processing ($B_3$) establishes an optimal Pareto point by cutting Equalized Odds Difference by 54% with zero utility degradation.
The plot below displays the accuracy versus Equalized Odds tradeoff across 7 model configurations evaluated on the public U.S. Census survey dataset:
Observations: The empirical tradeoff curve demonstrates the non-linear relationship between classification accuracy and Equalized Odds gap on real demographic attributes.
The framework implements and independently verifies five core fairness criteria:
| Metric Name | Mathematical Definition | Target Condition | Educational & Diagnostic Context |
|---|---|---|---|
| Demographic Parity Difference (DPD) | Evaluates equality of selection rates across sensitive groups |
||
| Equal Opportunity Difference (EOD) | Measures disparity in True Positive Rates ($P(\hat{Y}=1 \mid Y=1, A=g)$) among qualified individuals. | ||
| Equalized Odds Difference (EODiff) | Strict criterion requiring equal True Positive and False Positive Rates across groups. | ||
| Predictive Parity Difference (PPD) | Measures disparity in Positive Predictive Value ($P(Y=1 \mid \hat{Y}=1, A=g)$). | ||
| Disparate Impact Ratio (DIR) | Ratio of selection rates. Evaluated using the 80% rule as an educational screening heuristic. |
Important
Heuristic Disclaimer: The "80% rule" (DIR
To prevent misleading claims of fairness, the framework benchmarks mitigation techniques against an explicit baseline hierarchy:
| Baseline ID | Architecture | Mitigation Strategy | Role & Purpose |
|---|---|---|---|
| B0 | Majority Class Classifier | None (Negative Control) | Trivial mode predictor. Verifies anti-degeneracy detection and prevents false claims of zero disparity. |
| B1 | Logistic Regression | None (Clean Feature Contract) | Standardized clean baseline. Serves as reference for all tradeoff and paired delta comparisons. |
| B2 | Reweighted Logistic | Pre-Processing (Sample Weights) | Inverse probability weighting ( |
| B3 | Validation Threshold Mitigated | Post-Processing (Validation-Tuned) | Group-specific decision thresholds tuned strictly on the Validation Set to equalize error rates. |
| B4 | Tuned XGBoost | In-Processing (Cost-Sensitive) | Depth-constrained, feature-subsampled gradient boosting with class-imbalance reweighting. |
Evaluated under group holdout (GROUP_HOLDOUT) on Scenario C (Moderate Signal, [42, 43, 44, 45, 46]):
| Baseline ID | Accuracy (Mean ± Std) | Balanced Acc (Mean ± Std) | Equalized Odds Diff (Mean ± Std) | Dem. Parity Diff (Mean ± Std) | Degeneracy Status |
|---|---|---|---|---|---|
| B0 (Majority Baseline) | DEGENERATE |
||||
| B1 (Clean Linear) | NORMAL |
||||
| B2 (Fairness Reweighted) | NORMAL |
||||
| B3 (Validation Threshold) | NORMAL |
||||
| B4 (Tuned XGBoost) | NORMAL |
Isolating algorithmic effects from split variance (
-
Equalized Odds Difference: Paired
$\Delta = \mathbf{-0.0907 \pm 0.0249}$ ($p = 0.0011$ ). Statistically significant 54% disparity reduction. -
Balanced Accuracy: Paired
$\Delta = \mathbf{+0.0014 \pm 0.0062}$ ($p = 0.6385$ ). Disparity reduction achieved with zero utility loss.
To maintain scientific integrity, the repository explicitly distinguishes between synthetic fixtures, public benchmarks, and historical operational studies:
| Dataset / Scenario | Classification | Data Location | Lineage & Methodological Notes |
|---|---|---|---|
| Synthetic Logistics Fixtures (Scenarios A–E) | SYNTHETIC_DGP |
Generated in code (src/dataset_provenance.py) |
Controlled synthetic data generating processes with ground truth parameters for testing pipeline mechanics and anti-degeneracy controls. |
| Adult Census Income | PUBLIC_BENCHMARK |
Publicly obtainable (UCI ML Repository) | Standard demographic benchmark ( |
| Historical Delhivery Study | HISTORICAL_CASE_STUDY |
External / Gitignored | Historical logistics dataset used for case study analysis. Driver attributes were synthetically constructed proxies. Early iterations suffered from post-outcome leakage (actual_time), fully disclosed in docs/TECHNICAL_APPENDIX.md. |
| Amazon Last-Mile Study | HISTORICAL_CASE_STUDY |
External / Gitignored | Operational route data where sensitive attributes were synthetically constructed proxies. Disparities reflect proxy sensitivity rather than direct human bias. |
Caution
No Raw Tabular Data Tracked: In accordance with open-source hygiene best practices, raw operational datasets (*.csv, *.parquet) are excluded via .gitignore and are not committed to version control.
Detailed methodological and technical specifications are organized in the docs/ directory:
docs/BENCHMARK_VALIDITY.md: Controlled synthetic DGPs, anti-degeneracy proofs, Brier score / ECE calibration analysis, and multi-seed paired delta methodology.docs/CAUSAL_ASSUMPTIONS.md: Complete causal DAG, node taxonomy, identifying assumptions (positivity, exchangeability, consistency), and mediator caveats.docs/INTERSECTIONAL_FAIRNESS.md: Multi-attribute intersectional evaluation, sparse-group gating, and cluster-aware bootstrap resampling.docs/TECHNICAL_APPENDIX.md: Full mathematical metric formulations, firewall architecture, and comprehensive historical legacy results disclosure.docs/CANONICAL_BENCHMARK.md: Standardized benchmark protocol, baseline specifications, and reproduction commands.
- Python 3.10, 3.11, or 3.12
- Recommended: Virtual environment (
venvorconda)
git clone https://github.com/VaradaGovind/algorithmic-fairness-analysis.git
cd algorithmic-fairness-analysis
# Create and activate a virtual environment
python -m venv .venv
# On Windows:
.\.venv\Scripts\activate
# On Linux/macOS:
source .venv/bin/activate
# Install the framework in editable mode
pip install -e .
# Optional: Install development dependencies (pytest, ruff)
pip install -e ".[dev]"The framework installs an educational command-line tool (afa):
Run a self-contained demonstration of model training, fairness evaluation, and threshold mitigation:
afa demo(Or directly: python src/main.py --demo)
Execute the multi-seed benchmark across B0–B4 baselines:
afa benchmark --quickOr specify deterministic random seeds:
python src/canonical_benchmark.py --demo --seeds 42,43,44,45,46Validate schemas, feature contracts, and evaluation units on local data or synthetic fixtures:
afa ingest --synthetic --samples 500Run a comprehensive fairness and metric invariant evaluation:
afa audit --syntheticThe repository includes automated test suites covering fairness metric oracles, causal estimands, cluster uncertainty, independent library cross-checks, and repository hygiene.
# Run the complete test suite
pytest tests/ -q
# Run clean-environment reproducibility verification
python scripts/verify_clean_reproducibility.py-
Screening Heuristics vs. Legal Compliance: Technical metrics (e.g., disparate impact ratio
$\ge 0.80$ , demographic parity gap$\le 0.05$ ) demonstrate mathematical properties under specified assumptions. They do not constitute legal certification under Title VII, ECOA, FHA, the EU AI Act, or GDPR. - Proxy Attributes: Sensitive attributes derived synthetically or via demographic proxies (e.g. route complexity or geocoded estimates) cannot replace authentic self-reported demographic data. Interventions on proxies can introduce unintended distortion.
- Causal Identifying Assumptions: Causal effects estimated via observational methods rely on exchangeability and no unmeasured confounding—assumptions that cannot be verified empirically from observational data alone.
- Utility-Fairness Tensions: In real-world systems with base-rate disparities across groups, satisfying certain fairness criteria (e.g., equalized odds) can require trade-offs against overall predictive accuracy or positive predictive value (Kleinberg et al., 2016).
This project is licensed under the terms of the MIT License.
MIT License
Copyright (c) 2026 Varada Govind Aakula

