Employment AI Bias Audit with AIGovernance

Subir Hait, Michigan State University

2026-05-19

Disclaimer: AIGovernance provides statistical auditing and documentation support tools only. It does not provide legal advice and does not certify compliance with any law or regulation. Users should seek qualified legal counsel for all compliance determinations.

Overview

AIGovernance helps organisations document, audit, and report on the fairness and governance properties of employment AI systems — specifically Automated Employment Decision Tools (AEDTs). Version 0.1.0 covers three frameworks:

Framework Jurisdiction Nature
EEOC Uniform Guidelines (4/5ths rule) US Federal Regulatory
NYC Local Law 144 New York City Mandatory (employers using AEDTs)
NIST AI RMF 1.0 US Federal Voluntary / best practice
EU AI Act (risk classification only) European Union Regulatory

1. Load Package and Data

library(AIGovernance)

data(hiring_sim)
head(hiring_sim)
#>   applicant_id race_ethnicity gender years_experience score selected
#> 1            1       Hispanic   Male              8.5 100.0        0
#> 2            2          Black Female              6.0  83.8        1
#> 3            3          White Female              4.1  85.4        0
#> 4            4          White   Male              9.0  84.8        0
#> 5            5          Black   Male              4.9  81.3        0
#> 6            6          White   Male              4.4  63.2        1

The built-in hiring_sim dataset contains 500 synthetic job applicants processed by a hypothetical resume-screening tool.

table(hiring_sim$race_ethnicity, hiring_sim$selected)
#>           
#>              0   1
#>   Asian     39  21
#>   Black     75  29
#>   Hispanic  63  23
#>   Other     15   5
#>   White    121 109

2. Build the Governance Object

aigov_build() is the entry point. Specify the data, binary outcome, protected-class column, and reference group.

gov <- aigov_build(
  data        = hiring_sim,
  outcome     = selected,
  group       = race_ethnicity,
  ref_group   = "White",
  frameworks  = c("EEOC", "NYC_LL144", "NIST_RMF"),
  org_name    = "Acme Corporation",
  system_name = "ResumeAI v1.0"
)
#> ✔ AIGovernance object built: 500 records,
#> ℹ Disclaimer: AIGovernance is a statistical support tool.

print(gov)
#> 
#> ── AIGovernance Audit Object ───────────────────────────────────────────────────
#> • Organisation : Acme Corporation
#> • AI system : ResumeAI v1.0
#> • Audit date : 2026-05-19
#> • Records : 500
#> • Outcome col : selected
#> • Group col : race_ethnicity (5 levels)
#> • Ref group : White
#> • Frameworks : EEOC, NYC_LL144, NIST_RMF
#> ℹ No audit modules run yet. Call aigov_adverse_impact(), aigov_audit_nyc(), etc.

3. Check Which Laws Apply

aigov_scope(gov, domain = "employment", us_state = "NY")
#> 
#> ── Governance Scope — Applicable Frameworks ──
#> 
#>   ✔ APPLIES | EEOC Uniform Guidelines (4/5ths rule)
#>   ✔ APPLIES | NYC Local Law 144 (LL144)
#>   ✔ APPLIES | NIST AI RMF 1.0
#>   ✔ APPLIES | EU AI Act — High Risk (Annex III)
#>   ✔ APPLIES | GDPR Article 22
#>   ✘ NOT APPLICABLE | Colorado AI Act (SB 205)
#>   ✘ NOT APPLICABLE | Illinois AI Video Interview Act
#>   ✘ NOT APPLICABLE | ECOA / Regulation B

4. EEOC Adverse Impact Analysis (4/5ths Rule)

gov <- aigov_adverse_impact(gov)
#> 
#> ── EEOC Adverse Impact (4/5ths Rule) ──
#> 
#> # A tibble: 5 × 8
#>   group        n n_selected selection_rate   AIR fourfifths_flag   p_value
#>   <chr>    <int>      <int>          <dbl> <dbl> <lgl>               <dbl>
#> 1 Asian       60         21          0.35  0.739 TRUE             0.0857  
#> 2 Black      104         29          0.279 0.588 TRUE             0.000801
#> 3 Hispanic    86         23          0.267 0.564 TRUE             0.000926
#> 4 Other       20          5          0.25  0.528 TRUE             0.0538  
#> 5 White      230        109          0.474 1     FALSE           NA       
#> # ℹ 1 more variable: small_n_flag <lgl>
#> ✖ Result: FAIL — 4 group(s) flagged (AIR < 0.80).
#> ! Small sample warning: groups "Other" have n < 30.
#> ℹ Disclaimer: The 4/5ths rule is a statistical rule of thumb.
gov$results$adverse_impact$table
#> # A tibble: 5 × 10
#>   group        n n_selected selection_rate   AIR fourfifths_flag small_n_flag
#>   <chr>    <int>      <int>          <dbl> <dbl> <lgl>           <lgl>       
#> 1 Asian       60         21          0.35  0.739 TRUE            FALSE       
#> 2 Black      104         29          0.279 0.588 TRUE            FALSE       
#> 3 Hispanic    86         23          0.267 0.564 TRUE            FALSE       
#> 4 Other       20          5          0.25  0.528 TRUE            TRUE        
#> 5 White      230        109          0.474 1     FALSE           FALSE       
#> # ℹ 3 more variables: z_stat <dbl>, p_value <dbl>, fisher_p <dbl>

The Adverse Impact Ratio (AIR) compares each group’s selection rate to the reference group (White). Groups with AIR < 0.80 are flagged under the EEOC 4/5ths rule.


5. NYC Local Law 144 Bias Audit

NYC LL144 uses a slightly different denominator — the most-selected category — rather than a user-defined reference group.

gov <- aigov_audit_nyc(gov)
#> 
#> ── NYC Local Law 144 — Bias Audit Results ──
#> 
#> • Reference category (most selected): "White"
#> • Reference selection rate: 0.4739
#> # A tibble: 5 × 6
#>   Category `Total Assessed` `Number Selected` `Selection Rate` `Impact Ratio`
#>   <chr>               <int>             <int>            <dbl>          <dbl>
#> 1 Asian                  60                21            0.35           0.738
#> 2 Black                 104                29            0.279          0.588
#> 3 Hispanic               86                23            0.267          0.564
#> 4 Other                  20                 5            0.25           0.528
#> 5 White                 230               109            0.474          1    
#> # ℹ 1 more variable: `Flagged (IR < 0.80)` <lgl>
#> ✖ Statistical result: REVIEW — 4 category(ies) with IR < 0.80.
#> 
#> ── Procedural Checklist (NA = requires employer confirmation)
#>   ✔ Annual bias audit conducted
#>   ? Audit performed prior to AEDT use or within 1 year
#>   ✔ Impact ratios computed for all categories
#>   ? Audit results published on employer website
#>   ? Publication includes audit date
#>   ? Publication includes distribution date of AEDT
#>   ? Candidate/employee notice provided (10 days prior)
#>   ? Notice includes AEDT purpose and data collected
#>   ? Accommodation process documented for candidates
#>   ? Audit conducted by independent auditor
#> ℹ Disclaimer: This output is a statistical support tool.
gov$results$nyc_ll144$disclosure_table
#> # A tibble: 5 × 6
#>   Category `Total Assessed` `Number Selected` `Selection Rate` `Impact Ratio`
#>   <chr>               <int>             <int>            <dbl>          <dbl>
#> 1 Asian                  60                21            0.35           0.738
#> 2 Black                 104                29            0.279          0.588
#> 3 Hispanic               86                23            0.267          0.564
#> 4 Other                  20                 5            0.25           0.528
#> 5 White                 230               109            0.474          1    
#> # ℹ 1 more variable: `Flagged (IR < 0.80)` <lgl>

The disclosure table is formatted to match the public posting requirements under NYC LL144.


6. NIST AI RMF Checklist

Supply your organisation’s confirmed governance practices as a named list:

gov <- aigov_audit_nist(gov, responses = list(
  GOVERN_1_1 = TRUE,   # Risk policy documented
  GOVERN_1_2 = TRUE,   # Roles defined
  GOVERN_1_3 = FALSE,  # Leadership oversight not yet formalised
  MAP_1_1    = TRUE,   # System purpose documented
  MAP_1_2    = TRUE,   # Affected populations identified
  MAP_1_3    = TRUE,   # Regulatory requirements identified
  MAP_2_1    = TRUE,   # Harms identified
  MEASURE_1_1 = TRUE,  # Fairness metrics defined
  MANAGE_2_1  = FALSE  # Human review not yet in place
))
#> 
#> ── NIST AI RMF 1.0 — Employment AI Audit ──
#> 
#> # A tibble: 4 × 3
#>   Function Score Status
#>   <chr>    <dbl> <chr> 
#> 1 GOVERN    0.29 RED   
#> 2 MAP       0.57 AMBER 
#> 3 MEASURE   0.25 RED   
#> 4 MANAGE    0    RED
#> • Overall score: 0.28 — RED
#> ✖ NIST RMF: RED — Significant governance gaps identified.
#> ℹ Supply `responses` list to `aigov_audit_nist()` to record

gov$results$nist_rmf$scores
#>    GOVERN       MAP   MEASURE    MANAGE 
#> 0.2857143 0.5714286 0.2500000 0.0000000
gov$results$nist_rmf$verdict
#> [1] "RED"

Use aigov_checklist(gov, "NIST_RMF") to see all item names.


7. Risk Classification

gov <- aigov_classify(
  gov,
  domain               = "employment",
  makes_final_decision = TRUE,
  human_oversight      = FALSE
)
#> 
#> ── AI System Risk Classification ──
#> 
#> • Domain : employment
#> • Makes final decision : TRUE
#> 
#> ── EU AI Act
#> • Risk tier : HIGH RISK
#> • Annex basis : Annex III, Point 4 — Employment, workers management, and access
#>   to self-employment
#> ℹ Key obligations:
#>   Art. 9 — Risk management system (documented, ongoing)
#>   Art. 10 — Data governance and training data requirements
#>   Art. 11 — Technical documentation (before market placement)
#>   Art. 13 — Transparency and provision of information to deployers
#>   Art. 14 — Human oversight measures
#>   Art. 15 — Accuracy, robustness, and cybersecurity
#>   Art. 43 — Conformity assessment
#>   Art. 49 — Registration in EU AI database
#> 
#> ── NIST AI RMF
#> • Tier 3 — Significant impact on individuals' rights and opportunities
#> ✖ Human oversight: NOT IN PLACE — HIGH PRIORITY gap for EU Art. 14 and EEOC.

Employment AI that makes or substantially influences hiring decisions falls under Annex III (High Risk) of the EU AI Act.


8. Generate an Audit Report

# Produces a self-contained HTML report
aigov_report(gov, format = "html", open = TRUE)

The report includes:


9. Checklist Reference

aigov_checklist(gov, "NYC_LL144")
#> 
#> ── Checklist: NYC_LL144 ──
#> 
#> # A tibble: 10 × 4
#>    item_id  function_area     description                                 status
#>    <chr>    <chr>             <chr>                                       <chr> 
#>  1 LL144_1  NYC Local Law 144 Annual bias audit has been conducted        Compl…
#>  2 LL144_2  NYC Local Law 144 Audit was performed before AEDT use or wit… Pendi…
#>  3 LL144_3  NYC Local Law 144 Impact ratios computed for each race/ethni… Compl…
#>  4 LL144_4  NYC Local Law 144 Impact ratios computed for each sex catego… Pendi…
#>  5 LL144_5  NYC Local Law 144 Audit results published on employer website Pendi…
#>  6 LL144_6  NYC Local Law 144 Publication includes the date of the audit  Pendi…
#>  7 LL144_7  NYC Local Law 144 Publication includes the distribution date… Pendi…
#>  8 LL144_8  NYC Local Law 144 Candidates/employees notified at least 10 … Pendi…
#>  9 LL144_9  NYC Local Law 144 Notice describes AEDT type and data/criter… Pendi…
#> 10 LL144_10 NYC Local Law 144 Audit was conducted by an independent audi… Pendi…

References