From 80943787012655204855ab6321f575805e472101 Mon Sep 17 00:00:00 2001 From: propcgamer20-png Date: Wed, 9 Sep 2026 21:40:52 +0530 Subject: [PATCH] docs: add four fairness explainers (Simpson's paradox, conditional DP, subgroup fairness, differential privacy) New explainers (explainers/*.md + generated pages, data.js, sitemap, llms-full.txt, package mirror, OG images, explainer-count bumps): - simpsons-paradox: an aggregate fairness metric is a weighted average of within-stratum rates, so pooling can manufacture or reverse a gap. Real example: Benefits Denial (Adult Census) sex income gap +19.6 pp aggregate, ~+3 pp within marital-status strata, -0.9 pp inside the largest one. - conditional-demographic-parity: parity checked within strata of a chosen legitimate factor, and how that choice decides the answer. Same audit: conditioning on education leaves the gap at +18.4 pp, conditioning on marital status removes ~84% of it. - subgroup-fairness: passing a check on each attribute is not passing it on every combination (fairness gerrymandering). Real example: Healthcare Readmission gender gap 0.19 pp overall, -5.15 pp inside the Asian subgroup. Contrasts a brute-force subgroup scan with the fixed-pair --cross. - differential-privacy: DP-SGD's clipping and noise degrade minority accuracy hardest. Illustrative numbers from Bagdasaryan, Poursaeed, Shmatikov (NeurIPS 2019) - this repo trains no DP model - plus a runnable DP-SGD noise toy. Also folds in the explainers/unsupervised-learning.html regeneration that was already stale on main (the "Audit 04" -> "Audit 05" heading from an earlier commit); if that lands separately first this rebases to nothing. Closes #483, #484, #485, #486 --- CONTRIBUTORS.md | 2 +- METRICS.md | 2 +- README.md | 6 +- ROADMAP.md | 2 +- assets/explainers-data.js | 41 + assets/explainers-data.json | 28 + .../conditional-demographic-parity.png | Bin 0 -> 64337 bytes assets/og-light/differential-privacy.png | Bin 0 -> 65121 bytes assets/og-light/simpsons-paradox.png | Bin 0 -> 65055 bytes assets/og-light/subgroup-fairness.png | Bin 0 -> 68105 bytes assets/og/conditional-demographic-parity.png | Bin 0 -> 64949 bytes assets/og/differential-privacy.png | Bin 0 -> 65654 bytes assets/og/simpsons-paradox.png | Bin 0 -> 65632 bytes assets/og/subgroup-fairness.png | Bin 0 -> 68655 bytes .../conditional-demographic-parity.html | 383 ++++++++ explainers/conditional-demographic-parity.md | 251 +++++ explainers/differential-privacy.html | 328 +++++++ explainers/differential-privacy.md | 167 ++++ explainers/simpsons-paradox.html | 382 ++++++++ explainers/simpsons-paradox.md | 239 +++++ explainers/subgroup-fairness.html | 348 +++++++ explainers/subgroup-fairness.md | 199 ++++ explainers/unsupervised-learning.html | 4 +- .../conditional-demographic-parity.md | 251 +++++ faircode/_explainers/data.json | 28 + faircode/_explainers/differential-privacy.md | 167 ++++ faircode/_explainers/simpsons-paradox.md | 239 +++++ faircode/_explainers/subgroup-fairness.md | 199 ++++ faircode/_explainers/unsupervised-learning.md | 2 +- llms-full.txt | 886 +++++++++++++++++- sitemap.xml | 16 +- 31 files changed, 4158 insertions(+), 12 deletions(-) create mode 100644 assets/og-light/conditional-demographic-parity.png create mode 100644 assets/og-light/differential-privacy.png create mode 100644 assets/og-light/simpsons-paradox.png create mode 100644 assets/og-light/subgroup-fairness.png create mode 100644 assets/og/conditional-demographic-parity.png create mode 100644 assets/og/differential-privacy.png create mode 100644 assets/og/simpsons-paradox.png create mode 100644 assets/og/subgroup-fairness.png create mode 100644 explainers/conditional-demographic-parity.html create mode 100644 explainers/conditional-demographic-parity.md create mode 100644 explainers/differential-privacy.html create mode 100644 explainers/differential-privacy.md create mode 100644 explainers/simpsons-paradox.html create mode 100644 explainers/simpsons-paradox.md create mode 100644 explainers/subgroup-fairness.html create mode 100644 explainers/subgroup-fairness.md create mode 100644 faircode/_explainers/conditional-demographic-parity.md create mode 100644 faircode/_explainers/differential-privacy.md create mode 100644 faircode/_explainers/simpsons-paradox.md create mode 100644 faircode/_explainers/subgroup-fairness.md diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 2bc0287..7ac35a8 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -55,7 +55,7 @@ the [Git identity map](#git-identity-map) so `git shortlog -sne` can be reconcil | | Who | Role | |:--|-----|------| -| yakew7 | **Yash Kewlani** - [@yakew7](https://github.com/yakew7) | Creator and maintainer. Author of the seven audits, the `faircode` library and benchmark harness, the Open Dataset Profiler, the website, and the bulk of the 56 explainers. Code owner for `faircode/`, `paper/`, every `audit.yaml`, and project policy (`CLAUDE.md`, `CONTRIBUTING.md`); co-owner of `explainers/`. | +| yakew7 | **Yash Kewlani** - [@yakew7](https://github.com/yakew7) | Creator and maintainer. Author of the seven audits, the `faircode` library and benchmark harness, the Open Dataset Profiler, the website, and the bulk of the 60 explainers. Code owner for `faircode/`, `paper/`, every `audit.yaml`, and project policy (`CLAUDE.md`, `CONTRIBUTING.md`); co-owner of `explainers/`. | Contact: [yashkewlani2020@gmail.com](mailto:yashkewlani2020@gmail.com) ยท [@thefaircodeproject](https://instagram.com/thefaircodeproject) diff --git a/METRICS.md b/METRICS.md index 2789f89..e135893 100644 --- a/METRICS.md +++ b/METRICS.md @@ -6,7 +6,7 @@ ![Contributors](https://img.shields.io/badge/Contributors-29-blue?style=flat-square) ![Forks](https://img.shields.io/badge/Forks-33-orange?style=flat-square) ![Watching](https://img.shields.io/badge/Watching-8-yellow?style=flat-square) -![Explainers](https://img.shields.io/badge/Explainers-56-blueviolet?style=flat-square) +![Explainers](https://img.shields.io/badge/Explainers-60-blueviolet?style=flat-square) ![Countries](https://img.shields.io/badge/Countries-20-informational?style=flat-square) ![Updated](https://img.shields.io/badge/Updated-Weekly-lightgrey?style=flat-square) diff --git a/README.md b/README.md index 074bc71..dc5a409 100644 --- a/README.md +++ b/README.md @@ -780,10 +780,10 @@ features = [ ## Explainers -56 short, plain-language write-ups of individual fairness concepts, each with runnable detection code. The healthcare-focused ones are called out above in [Healthcare AI Bias Focus](#healthcare-ai-bias-focus). +60 short, plain-language write-ups of individual fairness concepts, each with runnable detection code. The healthcare-focused ones are called out above in [Healthcare AI Bias Focus](#healthcare-ai-bias-focus).
-Show all 56 explainers โ†’ +Show all 60 explainers โ†’ | Explainer | What it covers | |-----------|----------------| @@ -1204,7 +1204,7 @@ The full public roadmap - with phases, completion status, and content schedule - | Combined Social Reach (Instagram + LinkedIn) | 30K+ | | Countries Reached (Website Visitors) | 20 | | Code Audits Published | 7 | -| Explainers Published | 56 | +| Explainers Published | 60 | Tracked weekly in [METRICS.md](METRICS.md). diff --git a/ROADMAP.md b/ROADMAP.md index d4cb287..e792520 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -44,7 +44,7 @@ Fair Code is an open-source responsible AI platform explaining algorithmic bias, ## Phase 1 - Bias Glossary and Beginner Explainers โœ… -**Status: Foundational library complete - 56 explainers published, expanding toward a 60+ library** +**Status: Foundational library complete - 60 explainers published, expanding toward a 60+ library** Build the foundational vocabulary and explain core fairness concepts clearly enough for a non-technical reader. diff --git a/assets/explainers-data.js b/assets/explainers-data.js index 535b94e..987f97d 100644 --- a/assets/explainers-data.js +++ b/assets/explainers-data.js @@ -567,5 +567,46 @@ window.FAIR_CODE_EXPLAINERS = [ "tags": [ "metrics" ] + }, + { + "slug": "simpsons-paradox", + "title": "What Is Simpson's Paradox in Fairness Audits?", + "subtitle": "A gap that shows up in the aggregate can shrink, vanish, or reverse once you disaggregate.", + "summary": "Learn why an aggregate fairness metric is a weighted average of within-stratum rates, so pooling groups of different sizes can manufacture or flip a disparity. Uses the Benefits Denial (Adult Census) audit: the aggregate sex income gap of +19.6 pp collapses to roughly +3 pp within marital-status strata and reverses to -0.9 pp inside the largest one.", + "tags": [ + "metrics", + "data", + "detection" + ] + }, + { + "slug": "conditional-demographic-parity", + "title": "What Is Conditional Demographic Parity?", + "subtitle": "Checking parity within strata of a chosen legitimate factor, not across the whole population.", + "summary": "Learn how conditional demographic parity refines plain demographic parity by stratifying on an explicitly chosen legitimate factor, and why the choice of that factor decides the answer. Uses the Benefits Denial (Adult Census) audit: conditioning the +19.6 pp sex income gap on education leaves it at +18.4 pp, while conditioning on marital status removes about 84% of it.", + "tags": [ + "metrics", + "detection" + ] + }, + { + "slug": "subgroup-fairness", + "title": "What Is Subgroup Fairness (and Fairness Gerrymandering)?", + "subtitle": "Passing a fairness check on every attribute separately is not the same as passing it on every combination.", + "summary": "Learn how a model can satisfy a fairness metric on each protected attribute individually yet fail on an algorithmically-discoverable subgroup, and how a brute-force subgroup scan differs from this repo's fixed-pair --cross. Uses the Healthcare Readmission audit: the gender readmission gap is 0.19 pp overall but -5.15 pp inside the Asian patient subgroup.", + "tags": [ + "metrics", + "detection" + ] + }, + { + "slug": "differential-privacy", + "title": "What Is Differential Privacy (and Its Tension With Fairness)?", + "subtitle": "The accuracy cost of a privacy guarantee falls hardest on underrepresented groups.", + "summary": "Learn how DP-SGD's gradient clipping and noise addition disproportionately degrade accuracy for minority subgroups, so adding a privacy guarantee to a bias-mitigation pipeline is not free. Illustrative example from Bagdasaryan, Poursaeed and Shmatikov (NeurIPS 2019), plus a runnable DP-SGD noise-injection toy; this repo trains no DP model, so no frozen numbers are quoted.", + "tags": [ + "data", + "metrics" + ] } ]; diff --git a/assets/explainers-data.json b/assets/explainers-data.json index e9fdaaa..fab4ce2 100644 --- a/assets/explainers-data.json +++ b/assets/explainers-data.json @@ -390,6 +390,34 @@ "subtitle": "Equal error rates across groups can still hide opposite-skewed error types within each group.", "summary": "Learn why Treatment Equality checks the ratio of false negatives to false positives within each group, not the individual rates Equalized Odds already compares. Uses COMPAS's real (freshly computed, not frozen) confusion matrix: a 0.13 FN:FP ratio for African-American defendants against a 31.0 ratio for Caucasian defendants on the same baseline model.", "tags": ["metrics"] + }, + { + "slug": "simpsons-paradox", + "title": "What Is Simpson's Paradox in Fairness Audits?", + "subtitle": "A gap that shows up in the aggregate can shrink, vanish, or reverse once you disaggregate.", + "summary": "Learn why an aggregate fairness metric is a weighted average of within-stratum rates, so pooling groups of different sizes can manufacture or flip a disparity. Uses the Benefits Denial (Adult Census) audit: the aggregate sex income gap of +19.6 pp collapses to roughly +3 pp within marital-status strata and reverses to -0.9 pp inside the largest one.", + "tags": ["metrics", "data", "detection"] + }, + { + "slug": "conditional-demographic-parity", + "title": "What Is Conditional Demographic Parity?", + "subtitle": "Checking parity within strata of a chosen legitimate factor, not across the whole population.", + "summary": "Learn how conditional demographic parity refines plain demographic parity by stratifying on an explicitly chosen legitimate factor, and why the choice of that factor decides the answer. Uses the Benefits Denial (Adult Census) audit: conditioning the +19.6 pp sex income gap on education leaves it at +18.4 pp, while conditioning on marital status removes about 84% of it.", + "tags": ["metrics", "detection"] + }, + { + "slug": "subgroup-fairness", + "title": "What Is Subgroup Fairness (and Fairness Gerrymandering)?", + "subtitle": "Passing a fairness check on every attribute separately is not the same as passing it on every combination.", + "summary": "Learn how a model can satisfy a fairness metric on each protected attribute individually yet fail on an algorithmically-discoverable subgroup, and how a brute-force subgroup scan differs from this repo's fixed-pair --cross. Uses the Healthcare Readmission audit: the gender readmission gap is 0.19 pp overall but -5.15 pp inside the Asian patient subgroup.", + "tags": ["metrics", "detection"] + }, + { + "slug": "differential-privacy", + "title": "What Is Differential Privacy (and Its Tension With Fairness)?", + "subtitle": "The accuracy cost of a privacy guarantee falls hardest on underrepresented groups.", + "summary": "Learn how DP-SGD's gradient clipping and noise addition disproportionately degrade accuracy for minority subgroups, so adding a privacy guarantee to a bias-mitigation pipeline is not free. Illustrative example from Bagdasaryan, Poursaeed and Shmatikov (NeurIPS 2019), plus a runnable DP-SGD noise-injection toy; this repo trains no DP model, so no frozen numbers are quoted.", + "tags": ["data", "metrics"] } ] diff --git a/assets/og-light/conditional-demographic-parity.png b/assets/og-light/conditional-demographic-parity.png new file mode 100644 index 0000000000000000000000000000000000000000..5db3704af6739e6ccc9e5e5d4266bd16bf82ca50 GIT binary patch literal 64337 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 MT@#%G?VI=i0U8nPp#T5? literal 0 HcmV?d00001 diff --git a/assets/og-light/differential-privacy.png b/assets/og-light/differential-privacy.png new file mode 100644 index 0000000000000000000000000000000000000000..b974f7f43d3b126908d653a4c4db4167e7bc963f GIT binary patch literal 65121 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 literal 0 HcmV?d00001 diff --git a/assets/og-light/simpsons-paradox.png b/assets/og-light/simpsons-paradox.png new file mode 100644 index 0000000000000000000000000000000000000000..e7fdb96fbde1a788d6a5f49003a4311242ff08dc GIT binary patch literal 65055 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

!1Kh9{G+YlS34|!huG074&3~%&iXRQ;FX5` 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 T39#AZ;5esq@pO^)l?VR=$nesF literal 0 HcmV?d00001 diff --git a/assets/og-light/subgroup-fairness.png b/assets/og-light/subgroup-fairness.png new file mode 100644 index 0000000000000000000000000000000000000000..f32c9f5a620d90512a4c758487bff84571e2c3a5 GIT binary patch literal 68105 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 F{{`d1a|r+d literal 0 HcmV?d00001 diff --git a/assets/og/conditional-demographic-parity.png b/assets/og/conditional-demographic-parity.png new file mode 100644 index 0000000000000000000000000000000000000000..66baf37139166ac34d4bcf61489902a00fc4ba64 GIT binary patch literal 64949 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 He*3=wYh5re literal 0 HcmV?d00001 diff --git a/assets/og/differential-privacy.png b/assets/og/differential-privacy.png new file mode 100644 index 0000000000000000000000000000000000000000..6c8e60f4daaaccbafc224000e550d7700f90aa22 GIT binary patch literal 65654 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 literal 0 HcmV?d00001 diff --git a/assets/og/simpsons-paradox.png b/assets/og/simpsons-paradox.png new file mode 100644 index 0000000000000000000000000000000000000000..8ccd758d93cf6e10529e5d2102e841a3011eaed7 GIT binary patch literal 65632 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

mcFo2_xDb>vpxs*jIt3h(_{WA## z6XQ5^)!2F>>p16_ENAKf>nElj66|V+?=}Lqq(_Io< z5fy_|re1P7UfX36YhW=2Xf%GVOq_75*8-*Nq=697PJ%KdFDIvRLr004iB*&J%CaDc z;gv%5Q)Ohy?fpRH_5LA{2e`QnPsXnSP+Fo*vJsM0u=U1>Pi{DSGB_T_X}ypQf1oVy zw3Zlu3D}O@x(V}M)Te8zF?(=^#5Er8XJ?FC9s1J|o`4x46=gCkt5JINeNplr^ofMs|-{0R(jpBcmTpbJm~Jqz-NWMKF76l^0}gtU&D4qzHH zY4Y3b2pJhE0}O4wxDN0~fl@3F1O-*uRND^RW9^VAYHAHUzj`kgCfG10-nMy6y<>Fg znARus(prdPRMK0XFC>jLnJp1Hd2DNMUkw^_j8&N;ug~whS(MF{8DoZ2Rcp<%cj%db z4!q>2!@Sp>8Wz$--exEHsAgMQRzft zAf7&@*MrRa`Pt;u*qqy+H+Co3>BCMAWwds&SXat3IL}-zMyIBXEx&cIG9!vXgd%PA zjHcJAunz-f#7ZRs3Mm62UaG|3Lh70oz!Zw7(4Ci;H<(Zby?Z9PpEMznCoYP9X+i9= zbsZQKqM%N= zsj^H*LcYRUU~u7_8a1C_m-ijWj;HZRjI#FSOl>y%m_|z{SG{)Fac(p|){4WP{6IjD z`WDjrYE6}ah!6|GPwRTt^8vW=K={=~5p##nH_3E39uSo#RqtI~1*(kPk*?j>)X(42 z1SrS~u^frD#nG_o| zXYWiQg&`;0KJE}5NXuQ*rDX7Q*qd1$;G`raJvo`saKYc*qDyVCGBNpbbVTDDs5)<6 z&myMp2mHKIQGM%hi@6OY(KgXb0H36BJBget?DhBOB#D2NyhFbTv=gL`rr(tQ_SC1O zgpZaHpT3knC!Xx$V*N>9RllUSzmE?z)L2xj+P>6X0#3BR^FBB&vadH0-~>`qQUYJD zUhfV)J*`BHZGQ13d^E}cYBb`Q1tCB(1Jm-!<*J+gzFd>hIWQ`u@O!aO-7@XRrLfvX zwYJ{r?ACfJu?gq3S{S;7DKuZXLw4(3JGpy(?C~?93p@u;ot){lxx8mi+Z8HE=- zZz4>YHqBze;teLVTg)}OfU;@5m@_hJM$To+OO*>nmV=bH3P5i-@R~m2bc$m6Vi`cXq0L z?}c%4uP&6ih2pQa1q$UHbq;HC%s{L8Mwkg&|5_0W;u|z=e@6xa&JqOh z)w#~}KI>!LNNaQMWUkNve#UL-zRv#1^;!Szm6cz}J6v&6l@%3ws58Jq=!T0gDv~NM zniM8$`>kE_d3Q`i1od^zq{U?h6nK&WqrYyfIF!zx$WHVrbCMw$*kaQ8y<%e_Ih30f zF$~F^wUyOeZg*ywZZDDH#i1duj6V{@r>3@;Y^xt2+RDTRYfF=_;m-*L96sm@izC7U zKtGkNFSw#w@x2$e>p&_gC57g4nO3iSCmy>mL9HR^F9vw)gkg_cNMgzBd10*+1tW;_fHI7C> z5`X6v9``!%35cAB&X!0#CLkydj<+svrB-D)xb1TS2nndFn=T2Zl@g&vCjTtaU+Xmd z;meir=({X#y4u@A&b{;V^LgF6o{*|nxJFmv>OJ+5O?Oc^P-@uof3+hVV){z6 ztVMMdKAs?`s_>oZTHhp~8-T6*DO*ff0K_X0 z*c&+L{L|v%Cc7M@65>aY9S&#H0>a)3Byaw>n!*`ck4qRy59kWRw=mW9`~!~fVfzZ0Bu4bF) z&0@24-rC(APGwJQfVSqw=n|rVQ+zUMK<1A|tu%T7yuFtP0vjh!Pj+gE&9w_eUr%gP z-lzWA`J~kOR!dmeyD(aec)m#@N&BQ>s+f`ApYPID$!DnmbnAa?lK^N6JYOodwn019 zoFa(ejL4}z2YSJWsjdT@+4PB;Q5NjMT62@trW0&jkj3?4^6z~ve1KCsW~E_5lr;-luKm0{{4x7Q=tk^c1Nq*{`U60>E2UKBb3(@Oy5Pd z>857dpW5u)y2<{W2@J^T6<0#Ti{-mr+m@=IeDswx(^o5^n@EVEv#HD}d}v?>f1v$C z4)xE*zzTVH_x3;q+*7W}k?!HqcK5S@Zy-H&>LkbV_h;AgR!Ok}2?tHx_kJy&8pB1) z7TbNtC;mC#0SCnFziE@w{sEb_ubCz%gvImjLtl_IhP(>H;HUwV21IK&hp}QUNPM%YUnGJ)87Ws8zJxC z{}uoq-y1$9Q47kddk{#$$DQO;txCLoJVSq2Oy+#h`(&%B$(KIN$-$x*HWZ;K!SAv$ z3Jgw4?%!U|a+>vTgaSwCuvSlQCq)OckI-_YzVXDYi0}2^{#Omo10a74W_?FTqBt&0jgFL%t(lOMh?y{z1Y{o+S)eDemBpuA66SLK zCHVO9ZSmA$LBaCSj#lrv9^fjail`)*JRJ8n*eWtT=5WZ9htgKX#zsbru(6#LUP+Eh zy*JOsifm|@DOwM5TLXHd77ur&*Ro>)0OAE&h?tr$KT`w-1_xi4!Af(_;nF`S8e&9B z=93|?+gRz5k&%h>mq@MDP8IDu_#WDbSQ>>Qh+c@RusT z7N?MmD>vL2l$Dj;Owb#joJ>+HmnX+8WIr98|ClHBo}EE@)nBaR8BvK9wPEa1OtUc7 zB+^rd?%0JsCxNjJF!ntBU!PWQbvuZ`tzNlkWY zY#BJ!1@nn+lb>-Pb(OmH*-litB2lO%VMa&Uls5xC2T zHwN1+u->)4YtCmr&u1c>N(QV-b__n7o0$>wxd$kFzW7bh3N02o)41MDlJ)NN9n||t zS~YsSEfP6exJ{g^i5FsE0&Hg;;?FZadZTxVyzpEOnE0*PH07RQIp!bQ?D)NbTk#p4 z5t$oNuq}Mqx=M!IdSol}kT={997N`$^_&*-canO-h}|;y_0_z{dF<9L?W|KdWBhw# z_=EiYB}z?X2m1T#oaUGq1O?h;KkG$`w|94Y9<-|-pa+E#hd_)DkIAMGR4(HZetH3$ z^IesA2jx$LXhF%^Yx1np9 zUWe{|mWhTpibNQi6iW7zA?pb;+<-nq)aIfat=8IO5k;jkJ*^|o%Us#7>7*7j>v9y+ zVN&Avdv>F}M#V2nXEL@#z2Rm*yV8Y&%Yd!3QRfUqDy!YDu%jx68*Dg-9yls|!B-F^ z973#ZOFRcO4FlLk~4^Y>)h7h^IP}oin2~3_%78oK)@8xOu++{;xL_~xrO&VtQXn+0cuYCBFBv`dlwoAB` zR#E9+7Y8yy_3wvD3~=R)7-d&YnCLo>3LA$NJbZJ%$??17&D_>6Ruj0wL8>15(MC!c zzVcGfsS-d>90~d4zuaBt8!9oMm-4amn!=O6QlTH?`8-&em_F=s_AX3;Frpyz&3#MK zn!tXtrp!d3)_nn=p`k(;Y)qhCw`x5gCeAIY<+5$1-D~D7ddt@Sb{)S1Y_uFU+_}6> zjr9{LC;b82(ORX}L~HHk1~rkL2%Q|KsyOyN*H*#5`PIs|wBi%W<`o#Aw8`l<>Zv}? zNMesA$;x8XY3oglxx)e$RoY|XmhY9JsV@`V(9|8#{FcFG(?voO^vLy_bVT4j!IaH_ zIm+3tk^RO`xK1!6t86!|1sjI(w3L>Xa3dZXV`#sO-l{PM{l81Zgc|??{p)}C7Q?Vz zs*n5X0zJ$^jd|0NjSaq}p6h5_;LqDfrT?%zahFqjxni%)9>hY7A40V}yu5Bb^#&8u z?;|7e*-sJ&z|yBA7{YNS>4+i>LuZu|c2*|sy0)F$jBB46j(TOlYFkuXp?~=tME>Mx z!*DXu&+j*C?tjyoDg3&ji8si4Lc!#TR3ZJJCGeJ$9k|5}284^h_7L<(k17CvZ|35;Lr zZJUC0D?gQb4S_eMP^UR>{KU=v>C;3~9~Y$94z-Ed+qqY}K{+YENd*rSqD#uTYP~S( zhb*SA4gT~;KN$ecAkO=h%EsUueX;Q!imXkRi!JrvCY80NBSis|El6u=QI;IA^*Hvlu1HHYQ zgQ++cGYs9SacYyF>MuW_Jj3Y$pozmus7oT((NRU+ZXIeML3a@d9XUUDw|o2Z@;o-i z%VR-+mmfZf-M9u3kU#8(4UKKptmD$8SIp2Weu4BRW6 z?0fXuj}Dv*%G1;c%BKp?mB7GawCTCKj}kQ%J;h(6)|R2AXn!NwV#Y9B&oS`#rQcbK zdm1^N_*2SQHY+lV@ItuE;IrO6X$GOn7jvVhT9nM1kW0;fF(HSGjs00@=-uvhqIq*C zf$ev-kL*4PLWv?}&+=IEqHKl!<^-tudu)YZlVf67pNkP?)`JS?ewtGcRkmG(%x4zOfL9OztHdaPWCzTzSEk#Sl!W#X{OsZs79?hh0A za*ltX-j!^7^7=()TzgJ*>^jNQ9OUWi31*m04jc573ybZ4WmjuvViQq$9(E>JvOAlk zkS@2CtCai6k$;!21w(nUytZ=3C#9is<2Ck+-D5s-^N}Av2S+8I;%|+3d>g0_>#DEu zTAVN%?EmA!rvqZqFPAD+(46vS7qwgsTpiY)NEEiulRoS$R)`0eJHvaI4NbM{dWlSz zV06)_wB@y!`I0>sjVCmq{Ie^@Pg+K1Z(D0iwLY(%s^a-jn(S~)C3SOPa|?}DgNtgu z!&eap@JSD;!vHX2qWpp8)#!O(np@EeInD?|qi2Lz_-&jy0r)-Th`?>+ z#Ss=3%wpoyfa_BWZDt$uvk(mIf2XgQ@F*#}ghC8JLQeNr$q_n+llq27Si2`8&ph|B z$gAzQLaNP9k%J@YGVzHLUm!3UUjAB)O$<>^;3i{T0qjV-)p7^C+UBF|NhjxLXDQ#L zSzhdO*S?qRTU%LCi3sA;T{xJvffE$(aO%^2_kMVxPSszCCO+rJCCY^TN)q-^kF%3o4fWAzeEU&H&o%$;E}(ATH2yCmIKL!QzeVfet)+q<^s zAP9qaAQMhkK(-(*&*Ner_QdhO5+L*D^$pzzxslJs&_qD<&tN*e{cL>znKYyYhM7nr zNL7A)!7}bvkEI-EZegv*DNL?Ud}jrb&fHU;Sq3WflH7)3bhv{0(oaO- zFm2`TbY5E!ye4dvNep1Jm^brlS9<~wc4{m~nC*@?l6mSHfkR@V?4-A;Cqqm!HpXT~ zsc$ehVD2!)v5-omlM|-2K-S;~Mo5d1eD@bq2!l0lcIw5YUr*=zWqvyg3+sm(TQuUq zomGPGg>(w&1^Jv`?wxDwb}Yy_4O!srW{cTTVRdy%FW_X-t&u&0PS@U@b4?1MP1p5a z8xcmV?DY2!+XLV+T~Sk_UjF1dOF(uCRgB0j+qTaNFjzpb99-b_P=b5 zKi`_pjCp8}r#U%wg!Bw*?L~Ncru<$bDV@F9BBBstcHZ1w1s6dZoAIBEJ4WO6-<}7q^??bA1-vvu-!ve zST!U~o7!W{foxBIGsWhIgoKG)9zsvBpfnec^16ILmXwy}*g-9_ufl{* zW$`fC9Wy!I2jS)z1trk@o<`8wttQE@hazc(g_*9O#N^_QnrWbtwU^nFkW{FZzx;fU z)mZ@B2Z0BPn(q%z)qeKAewmPYwELjd2}zcDn%kc^57}!**h&p50T=elg|p! zU#V2%p@RsyItgKxmJ?*hKSny-Hl^Yo5^<~K{m=prX67Bl zxQN9dQX-sLV!BrSr9hIGT$klaxaMsqJOZ!K?f|W`HOLz@rm}HNs7YXRg)R=Tc3UW1 zXD{_C?KLzs^gKO(74(Iz(0ze9QTj`e(tOgJ$wVxF5rV>b9l`31^-Hha^;ZQbCH5HN zu^d(}0@!#4LhJB$FMo=u(BuSEn6@l$0q#+wd~xdr4NQFVsk}1fb~Qq#FFo>`!0M_^nOa&=aR~CEkMQfz^>KNpmw&p_>9OlD&%8TW zkfX_U5L$qcRJp{9mm;UPT@luYn{{IJY?vXj{NB%pRCbL{t7zL=OON&u zmFEJK3;d3|!*Vyzj>uC$bG2Ppby>Oi%n>Tz7?B=9WlI3Uwp-25bwdiM%>u-Mbh$d_#i zViuNf{oTpRdN^d!2B!7{jl#hB0g6!#E^r%kw6$?NE{2}Vd->R-L8eekJ07IR@o$(_ z_mEy5rF*Mb^l00%@%7&=pCissg&MbZ4|6+D&3f9~7fTYVNj7ubR3XVIB@)Fn9j-IQ zy2pU^x@1>2Vw9a40E94P;dY(Pb2oB1dF>Z^4=XsywXLN(t>mwFLVl2#l`~XPuV1sK zA&T|%NCg?z^z)bHg&sVJj$6>VH7j+jYAic&%W*N~PeYvoUOEAfOO{Mwe*VVny2u1u z2N5Bmij%_|5-GUJB%D5f0SGIge>+oRDdVC;ID8ht068#uC7jGMY^y@zIFUXm;J*w{ zqe^f}U}>0#PstGpUt|({n`G0k;u53rp|0qK-vwGV9*5_HA9?v8>Dly@C^a*;V?pK- zAt4MO25ii|5*+)B(F1Rn+euy26_f~ zwT`l`kZwnEYy|CUdlzjtypAZZI+qF4Ke*i6)_`;huM;V~o=FEiFPWFG)UF05sTGAMt4s!U@RAY?`Cwq~wfVJ~2tjZRSVI!*e(m#GB)* z!J7K?>irv)d_Snwv3eURGL`0)-e^}(B97!IFSZVL9Sc*cWX5X=<|EX(H?t@OJSkp#SspB`q#%#}BaH*pL1NH*gGv_Yn!#<{E)G zBE9hq$Ef!G>&cqdXAQd3)*=o9mFp!rc)M^eMeiT>Zolg#KM_?PnS~@ER1m*UE^^N_ zV7Ncn4E87B6^b8P(=pf<&zB>4Y&YZ3HwPdn%f`;}I#R~9v$YXM8c^@1na<}lku(9c zELYhY6*+OodrK_r^xk>>7h*YD?d$b<2vlkDDB#{_vvss3k1@2x& z!Xc$FvYT$`w?0zPbhFyLE%E$>ry`W4fS8SqK=(IYO8gnxO{L=cLoTUF{Wl|c|CkBe zX$6Bjl0Ql>mc1Bd^M}DEJhxJkvNLQVD)xj%o=)GD^A-H7CdE`MMG`wN!-?@m%WORy zD_IQXx4dk4)_Jn3AAS$CywzR(J$rL;qQqrRF6k%CnObb+Zlg3Pa`{G%XgjfKBb_6y z2XuK%UpYO6@+bomcq{ymPd6F`9p56>DuggRAEJ>YCh7}RI40F{n%^&Uqd}} zgq4w*xiw)QeTLN!qS3+z4FaibSw9RB|3y`Im%%_&sjTx|M_;<+z2#|kAWrWS#`GOR zZZ&rV4LgES(fn#N2rm2O^~Si$%cpg%kJch6-GXKp6_gdqSAJ!qQx1n2n411LH!UtP zxIy!k$lBQ44szY@PAD)_FJ&vrtvU`{+_EiDi8(n8*G`nQClg1V&LP0MjC~>Az_y&F z9P|gFfhVDlNxti{;q|og)^eV@OXsdDs0j>_on$HHL{3>;D(V;XT6UwQw~K&Q%#;v7 zWr!)La*y3(RSkTE7pQWr4a!6De(QFI#MEOz>a8B@>V?^ko*+DZLDCkIlCqd?#5w7_&}_|&%h~cC zj>SYnKOs^!^L5wh|AD`FW>TjDHr{p}2Jl~j2_@7AAB5_=;^Mk%tvjVC9;*l*UPc|R zm!T&W(9c+?G8%UIC9*ndIXNBbu2s^VwRY0gJP4!t3ewdjfSk{snj&MBO40Ucm?Yf! zJPbG48O%gP3=_|)M%rdS3fpyciHkIs+!?$q=z`Os)f-#b2|ba_ZuiUtNrm#wolxNEG$I3 z<8FgK2@ld}`4O5~8N(AMCZSh)w^uf-K!Aja(!!%)iRP2zQ&fJB&4jDIK>&Z>&jW6m)O+$mnq#ZKic`=m%_Do{OW})wA)l*D^}^rrT^;U>;D!f=@5;zy6@iDw zISMNlp#OR7kK}%rtGj;TRxw?Yv?li*kyyNU^the}toXapG_Hk#qxKS$BYYaC2f;HA>b>Q9;3^N3&pd1&L~}SEGG70Fd?_;*>1eym?u7yH_`3(eYkWG^DYXRdG#N15yLt?n z{4iCCO!z3kH&igq)Me9~>)YpN`pu*e%#4x^UZP*)64wTVd}JbFu8I4&$?S@zefP@Jf-bC>T%77 z@g&CXx{;;jFLy?A4Vb>MXKE-(-?MmQf()n>mb*?433DCHH^8)u*u=m>Xpo_v zs=GqI)RjoSQ3a!DojUi+)rGwn`yG=`_1)tY^umDCd(BxSV{Ex)@6(l^ZbziL zbp=oQB_t)ye+}Efu;7VkYzt^&5~KpI>yAp+S;5tS-Q+E^5Sqx5HM6il0^j+l?CneW zd517a`IYt5eV{mzoZ4ujvZ(s?>aNvf@pM=DBYT?YheU9j8tr?>(39gp4B9JS?Fr!( zAu%zp`~JWis)KBGwQMc(;hf9$8N5>tL+7!)-#NSqYLzs#9`1;H-cC^+0lyaVKi8i9 zc>Gd%FuPCCxtl#Kn|{5`!7-aYNu(ZPUc0Ze(tS>J83@FA$u}q5xa_<8C=uT2C?40 z^2#h=A@_N`(lb9KRTZ2L;rt9>Bk%N%0gWLtcumQ$0!S1ItS0^?SIVpyi`u3m^JaT{ z>`Kir*MMY_*nP|55JnfR2J3w6m;89t5Bvh9)XJUE_fSW&OXddme0||0C1z_`+Ow#x z*&HvQ0SFEBH6LH)?yuaf7j}fU8_kpVCvV$fVus5kf?LarNj=QM#}rNvqr=f^I((UWVi>7 z61a+5FBv^t9U=8={F`x_j=<+Ch<xuM1xeqos%%7gt>YTb?K1g0y4<>PA zR4=Z7D+}(CsjQKppJFn~?+O8hEd_~y_C)Ya)wi5TjorHT1N$GF^#fN>Exq$z`yKMJ z<0I=8IlsGsi*iJN8caYoOvRtv)e_1ASNGbbhR7EYFaFbeOUGJprvVg(t=|jhHN5Xj zB8YEdvK-Ckp*M9q@VWUitM&f3_6U0V&RIsB=PkbkTu$vSQg4FE@QpLn1Wt~XeY zOSo-j`}+Fx^Pf`PWd8JVno;eXpe4i&!N$S5*_UkveV+NCgMrfqET!=FPWzQciGyQc z&#t)Q1@HJe_~ii&k?SVpesWH>=+1)7lY!q&Pr^I=$z9bvrWOl1M$#0An%c^G#0cmM@Sq;a4Voz7m9OuCUOk)1h zqaUn3cV0=H@O6IV;u|YBt9R&q+V-Xad}3fhhhWu;-z*?WE;T9{hyAoEWT?yE&D?{U zR~;Rhj&NB$cOSY2vTe|r^NkC7I^?1SfDBh|@ra*npfC>DD4pPMjag&`6yN^6dSPK< zu{B+uTp%W+FK2Yl=hd4NC21@?Ke_JII zzn4|;(q-SWr#_W_GqbPoi#e2I8<21sWlIlJR5-u+u_v*?b?@-zV1grjv^XvIZKm>) z%Oi~3-GyKL8E0QAcuS~6jfDn15{(OD|I59kVNXcL%|@fWR;S$@Ekw=Te$NK*hMI#% z87y+aFMc@N=P&9^4i5fqLk7U%W5=0$oV-0=xeWUwR12qFj*nf0IuAHmpW7AAXu#qg zm=Pg$xQdczY;5y;E_B&u#l?aUbANY1{dXt<6|xMw6&C=&>5hF~pC~2+uE^k|rozc8 zx8>GsE#4N-+p9;+lBmOV?g!2G+s9hIU#cO6%~P$&_Jy6D-D2}29zkJN2x*DMk`vUG zDmiLGPpJj3zC&V32jL_(YQ41cZmP#RmTi@{C%$Ii=P2&bDz?&eC<_)s;4d1}(PdAk zqi|#zL2*Y(4euf7x=0emIilNlZkvR#sL9=I`|} zH_D{Blz)?~aG+JeTo(1Vtz?^gy;cl<7ZEX!-6QZ}+!X^zm@4yQy+gLaoZ-&~dC0Xm zz`wbfLoDF>`K%olQEYWF;?P|)#j-e55?@9Y`GlnJd8e^m+t$1Vo@=#I=OQ`emjHA9 z!zMYB_dm4VE$?gFXT{~^Ov-)t|HH(=*S}BKx@|+FS}ZtQr1?Mpn`_O1{}vy>zdkO! z?VSg5>wmy(z|Os&eh+3ADlydke`~$|edVjz#-kgJ4b#S8fCDy(-apzv4M4G>P`|G_m`{P%q%u#q!o(c2`#ytoczaw3a!$yI`4@zrVj9s;J<3?iYOg=;U}M5LV83p`Cdf0Dshz z^nYE_1dc3Kx2_x?5azjEPG@a)LvsJGaJ{!jQ$Ib!FsITD;*0`KR@T;X)s`ZHr=hd0 z-`)9{4dh#I65(Uwvj2mL_h?i@MFk>^OR(|fJu&(f0YvosUX{WR6c2!X8&q#N-3q#u z*IWiHTJK)rhI9U?-`d9~u#no|tG2R4E)^=kq$Nt;Kvd z+mG;}+z|ejT$srTwmw;64WdVnZuxo_j91O2AH`iAVg7FGWD@#bLDcn7676 zN@|K14=@N>Pas?6^|ycLS$6OG|EIn=X?)t-%Hq@Si|cE>emxPLKO1V z=}O)`eLp|=e72J>E{T$4VUFE^kx=s%=pA<%9)VPH2n+wFk8g{o3XunV^`9)gG98z_ z5cKviwpyL6!Gs^J;ZL5~O^IjXSCb^dpn68dc1`kYl&_3HvKawM;m)fdKfn107?-HB z3?JU>)?^T|KYGk!_|Y9g*HDt(2LROW(fkg@+t`1f>#@I!g?f&60^>#IqT(HZV8uw? zf6QZhbV*^f<`o=3!sQ_B?ta5wPy98icf(7m529a)xz$c9BP0I`o=b#~h zTrs9Yx9;#vMm868PVkFUdO@U=19oS@-)Y3q;5o;9lIoPd8i~Kir3eQGi!YX6>;Ght z1z+` zB2IIbHmBgL`$^RqH5OB@XnS572Wyj#Q|oknzVJKw5MsHW-$irY;169}W6KoP)JX9K z2rJr4(U~P9Z+TjMCKoXNdp(t_gE7M5OHylsK*$CHuBx{%J{@AergXH6Im-F4jtkY^ z|Ip^oOH=5J3oOl6khB2#?n;|oFAV_L#GU*ZZ;86=ctg(-xvuDB%L+jd#$w{&OD~-X ze0SLK=ZuSW>@<-!x+UliD!ad*-$bqB*0+!_;BKunjJs`*aekY_fuS)IH4d6rSma0d zM-1cq;vzTluRJl6;r-F+3&0~_1^!$z=~goF>OSIrmZO%9||p3G$Y~BUD+wYA`Q_*-KOBT|~g~Y5wso@2eB|HYJ7f6)^H$ zxA{5!rqwiIY%@G_C*?#iKR$;`(jNQ}@K)wB<{b2c*sA~XX_uQ0GY~ySo0{@qCt{!P z&Ye44M)3OqNE$F)OaZ}i#}6(e=Imj~5v%}0zj)7o=l29a(T?2@E2p=XG%f-w0rOh36LRQ4!orv_jPiMewK?H|r2avfR+TqV zs)@QX4G7Qlw6xhgIHGTPZ^!LpRWDf8(qe-iAW={x=;i+-(R z%&HHDII?fOswt)1md{u=x#_RnP4e+k-%3pIUrs+Fg2`8d^5~tzcfG@&K5Dr2p({O5 zH2VmAkk8*LhT$1oRJ?#2iV3{EpFHuN7RKN-`S8Byp)B?8fhxt5@U%d*##_R)Q;Cqa&5R!{qeof8#wmHnYA4V{!D#8U zGSd7zJ?HD!LqI!b!fGe?^?Pd%BA=;$kT<@ew|rJq_Kf3mSbBOUx=)J5@RpsH?*9jy z>Xc*Hq9t+=o-q&9FLa@i)$dLgVaAMG5uRJBc;z_>FGa}bNz2N5T+R;0VvPU9Tlh<- zlCPVSrVUUHqUTwP$?ob<$cGP<`T4b)=oEf^%)7_2>sBB$1eMX}1O5rETn%*%@HkLY zrHi!uIz2@Za5>zC>7bpRT~(ReC8zMo@)hBq1{!RX+dh1*>j0)@BEnis_k|&J4)C_h z&8tVp)LMT1N^Ed2=s5I%4V4}CanEv&jy^BIOdwQ~1;PW!jJ&77leMzhz2g~dT^rbQ z<9x+h|6aGPR{)dW+l4D1vJL$Ile@*hrJDQT_>^=pw5rNG@j{fgLtmN8w~I7P6vz>w z4_6FT@}|D%zJP+JXHH%7kpc6!T^DB15)!$rALg$87-lYlyIPA$DBNlWo;(3!=nlyV`XADtB<~BQS~>q)_P!uo#!8E5|`_&Vxod zhOyowu#fXklvV;5W$zImh{4Lr5AVGek4eBL106BgEDFAB!alViB7PB1bWZEZBo-s4 z+@^#7I79jox!|d`nl^d?qQH)&2W0Wo`)M33hb5o<4g5U|jqS~wH^X#|u0dEUv-^Ax zu6;Ov-Tyt$DS;1OEdTMGsPMLgD2S5XsR)Q^S8`%mjHUp;1X&Xu0R+>npidQg^l`OUrO7%6V`kOC74om=b8Ss@Hb3{a7uAu3> zF6gzRp0rC{bfL6w@laOl{&0FQbe9`5DrU@y|WyS>!^ys`^W({W?3Jp5wyn zZ4v9TJ_9H{>-v84l7|a==$m$$-?Tmi5pvK%n|+ayfD!9h&|fr}+M?6x2wnwUEYgb5 z)SK)8o`uH$?(j2qj?r4{(WJf1g&AeAgT6idrPF4#7G}ac?zri--AdPH#DG0n2bJE} zn<9qR)=n$yLQvp|Kr-ZRb^2xWGfDMlt&gO69d}KQUbPZUV5N*j)YbsHy@YFz(>E~Ee z8(~7ThmT>$m#+q?lGv+$$@YnfFDKib2nMZ`#wKn{fHgW)RKk9aNzWu^ux+((i6rUi^Ak_ClbGa z0Dn+kE6i`&6GM-c^%q^1l9~#Zr=`4=0fFI5P!NdqIcEQ!0>kjuH!YLEp1Aintg>$(m86#1>%p>!2;gha-hK51$4$9xYt2z#L)`O%p3`YqQp;)4_ulW2 zn9mbxpOdJnw=1IV=M8$W>hd(Ws_Nqi+Cn9!7K@#!7kR)rzT?hrkB-o5ov`+M|G{E_ zasa123C4Kk#(?07>NV=uC286PM0&r&K)>AEM(jFiV21>^e_?|vDcW4g*;pW45Dkys z`)5W*&D!r$RH{Pqh|o|ThXGPuF7G@jWYEyAN}-ujWlE3|$sMv(FLC#fUJr(Z;^xJk z$YP3+kt~Xb$00tlVn6%KYEL|bH~+u0U;J4IeGLO%E)xh#xPsr@=R^vop{TBhl;k!X zdpO+*+-6N9dixeCQ-GepGoJMG^D{KkJUOO|=Vp-GV@%Jiv>W9k39f|m;CII`on>}f znjtwbY}Bhwsj)#R9gf*kot?vR+Td>*i#4n@Vm0%C(XvO)^JkWSg+%_*NMv6}GqXa> zTRrrHI?<2jX7gY2auRZ5NcK*BfIKbW3^Y$!p3sWW;ubG5EqYO$3}?Sw1BvVb;CaLd z6^9LVUIl87`h&J1K~3HrTWL8rT>}=ehO6zJm|+Hm(lotEo|5Y`MCCV|;E;xIN&n!+ z(p8zh&nVMie01eI_lp|{X&1&nKSiJXl}lvV9ckQ1H+*>nRXDam29hni^#oZlo#(@y z^M69T=(Mm5pB!5JNeE@U7e0MsZ8gj#Ul(QvFn~+X$iN^zX{p>|)2x7UHKthFAEp20 za=THj>2UW3R7HNv5y8wyL2^hI%{R}`2C(~sgrB!wE%OvVvm+z@HNVcYD@G2xDihGS z;N2M3eGz7p{r|vUS#nbFn3ih{v z0lx~{OJ9$)^b`w*AJ*0CX-%JMl;ti`s7&ua&K6Lh4np6uFd0PUqPMaT3~jv*sQ`7sshkA}*3p6S>s z$uBU83=C51csZpXbAC}b_4R|f^ARD-m}UYqQWkH+JOK`Dgq+`E+Cz94ISOTlI;o_9&slA^S za&9mlE24MJ{gd-*PGU~%Poby(9j{Ks1b?L@+l?&O$J&>g?E}Bw9e=xoj~}Kjxhd%% zKfdgemVr01w49u7tvhk)C;i3v^iUUFsO_6&689*W>Z8jp0gjQj!VvtJ*M4q@AFp35 z26OJA!S+99%$@JEeNXpa5cP^qIQf)*-uWGjp z@K1OwIfyE9O{cg0v~E9so~7#>gGEKh{i^-|eY?z6@qH#HjNE!%QgipU-0JfZa@ImbZu<~NfPGf_32rv;ZZdz$k3PWebS?IdU~42 zxc!a~ng`>)kA8*IlwQo5&-%d!3t?Dr;(VVlmpC&!)rgs|MvVws0cAoHtjGS#fEvL& zT9>H!I0|;5bZ+*j{IM*a7;hh+n2L($E$>;b7#BtheUp+8j!-v?w$WvWGKIs92(Ikd^Lg(@MH>LxzvXDJglGc_!vpFPeyV`r%SrHy6IVz@4W1oD_Y)^fbI zy|wk5XO|S8{bs;w=13HCOS@I-+p#!N4ap~1_m+n#z+?w-c6yD~h~T7{Y=4vKO|Xug z84gp59?9;Qd4Okquwzjo)kiR@Kt@hZwZd*KQYMCqDN(>}XUi$?Y1);MjjrqyEZQ2a z$SGoRadE>})Q?8R1qS!B78W&v{JxS1w(t}!_{!Y9<&L-a2MROZ3L8R#sJDk7rC;F_ zEaimG?)E*2k9g@fe|!JA&Day0xmO@zazR&+f zVO0=80xYC}$kwSNrsqzHBjWHwRTY=*`tvp~DGrN1ct@-PKrN3@CNFZ=bAk7}mmI{< zC(piSEJli_a+O`q`mm>|Uy=%VUiPG#(5r01B8I&g2~jf}<5#zU3j$RE!??Jxa0;bg z=vGQE+;e6C{SK|G-1=jSxWera6QO@TnC-y;f3%dKprqO4x%m_J%k7Grx$u2#W_`EXwM4n6l3<6x>LDwF2%KDT>UyAN=9!9PFe zevYfY#%ZOct3eI)j;nHOhU}+|@`%0$95lEv-SH126B8S?Tz;|iz;_M{ji&-+2$GmX zp#g7$^S6#pq3g{co3{0chHc%$&60jLR&At64s7>FZ8B&|3{NbFE4W*jYCdx1D|y>P zy`nae+mXS1h^Y|LnSpgbZmit%Ya^^}(WyEv>_<2jKuryEd@lx2hylX8bATRBnxU3U zo$K48sva8JjKS}I@o9eVCCi!Le|BS-wu;@`V1D4QQaG8i&N!G$gY$rIukSozeYIdv zji3=88CXC|d8MYf=(h~(KR`_Kdnp*C&zWY~Ny?UpAtbg(NPmU)2U8qpKf zxY{+2IADhTItDa7rG4V~KZgj=ZUK%qT%Z=>OJ&QoO?6#b+>nEYDOD#PIYk3|;UpBn zg9S47Mw(KxlGLvhA0sc%Lw0i(?1lOH^-<^Weqy$T>&Y;g(Z)Q2Ijg#d77#`_CgNjy zC!vd14wl*)sK;wFeyG5jr#c5M$XlkXOgy?}bjP-rqA?$NEpuvA!p>RUF7N)EC842> zYLr{1q^DB}lC^XXWq?e}uA`t*RtHL&hK9ycx2_Rm<-dRl?nPWM86|Whecsq08UTe0 z-6gZ^iP}Xqn?ZUazt=02_}A31r}}mmPvzP=-3iS}oI1sa4%1?$gfTW=DljG!Hbv~)l4-D!R`ehNO3w?)j%9>C%y!(#xL zuyp7;{Qb89f+DM=LK6=M-ZE`RDA4FOr$2wKjd06f2yP6D7)U&qT6iKZip{i6S#1K#>cs z)k5s+MT|`BEfnXGDlS#B6zD~mwGsYFeE+Hl%P|d&!s%OD)vkdf&MlK_sy6M^8_Ub9 zrzp2{!)pfKplCyF4RqSI!8!w1(dOm`=a5~kkDV)=Fzmekp;74v4%!y~yYQHp-&zk& z1uV}BKJ9P4dp)hi@HdE*J^Z0TwbQyl=R!i6&G^SE$GG{1bSU4zlGLMHom`zxX+3@6 zt4vb#u%iCO4^no!Z~J<0kdpsmVn1-ZARKHn4>*Rp z)8KHq${!w=oj{VVIU=DJtdRFapKG}{2+JCr&g0LcrHvF@b!y%7$*=TC;*xp_H&ucV z^XZiz-}NN1%C(K3$rKP99pbe=Ffi5t;gRWgW18ch-3IbF-Wc^NGg~8p$1$h!iEZ@D zqc-XhqdmTc>EgcB*F{nXaF}>E48*b+4%v2)VI!C!psWX1ywHnpD9(Z z2XpNUTFjRz>}ViQAeemVMb;d{5bm5XQ(EZp^KNAZ*oHvv3Q#i7Ew~=A_8}2f*{-K3 z(-Iv?P^hVZ$ibA`->LwU!Kegb6|C%SdhRhI_RnG9N=>kBYkSy}nexTR!cKj8PF z(>JrnE;g$lRw~14bjKPQXw@lIi$S-3_U;^4e$DN0L-y)x1)ffWqwZ)Ncdb`onfDL4 z2WaFpzdz0N(pO+BwO7-JstHD~l!*1G?X${3mXw%KgNA>ZpQx7_{G+ZyC;TBYvRcpN z#O_MPQchOZWiB@dClAK?eYo}ex$7TFX7W&MHEc1LU^-BISN82=W{tPLL8bP1NOl;V zUotEc`L8R)z<|_kYbV+)!FQcLbbfyAp(===ErAy%LBN@thg#)TT^=kW!gmlQJX&49 z>wVW|#>8YvT+BVYU~>I+%Vfms5B!kY1SYc9l*Cp2q?%L}%`9_OBzX#?&lgNE31pFX zn`VuQqbRqKjnBqNoyFNFx93vy8>Uv8dP!1zDsOcs5nD8w+_C4~+3DSWue_sNQ?mK-m? zC^3%4b_+7E6imU;Mdo*@nqn&`@dP6Hw}#fgM zZ4d#YU!?2#00Z@**uUROz#?%Z%;ahj_8hPik2JKj>LJIoRAh~t9%9I@U6MHMW1;Tf zLv2**FT|oHgfd8P2(Xs)ti36qzq@|n>GbP@)l3O!Q+S*FfWXL6y0d9SBi@TU;ab9Y zAa3-6%k=$6y0-!d;;ct}`8sE}v&Ok2m-=&H$^)sVPPP5XGtAZJ>9;Y7UcS89_IHW~ zq3nO_-^30@fHBDLJ~4Oxsrq{8O`TX~E3M+UbG=>|O-(4(%B z6PMmSK%Wf_C{hiUwVPW$4}2*FV_fah7CE7^`hXLY@0j!=U&FeDW4RW+dXF8v zjq2*9(3r!?e&{k66&cyh-*^F!p&H#|yw%Clz=-r$0)<-WDd~{70T4iZ62BH#eowU_ z0ow5}Gch{{Yvg?%jQe-^VKEN`6~mN=S`>w7ab;pEw);jufl&Y~l7R%B4|#1>;CJPc z9(&A|g^3MQEue91cGrou3zQcZ_kzWGP83rweIcz@_KDIYKbQIOHIm>KjpZ%UJlFe~ z#&QgfHC=niXVkgN9v)IIOG+HHUVi9XUqrvmiUgmX6e4P?UuMve0F)z3)(X#sbG(z2P94; zTj>AB8!74PCK2wT`3U1txQPWl{0;_5aGFAn;~S5*6Fhv7?QbP$d-}a!Qdh1gJAlIC zRKJ(R4fsz$;K}U4M!IvJJn3vfsS6Ia5h$&|>W#5iwd=xajfGbu9+I)0+pbd#)-!5B zB11gn0|$0K`e92#1F`$$2k<&fM&5uV0$801A%z>UAKF_*jf16~X8 zv7n*Zw-u>^$7?V1kgk(5W{HmqYGv3zBVmM54RNcU7})zk+6A%ty)jNIDvtR{)b`{Rm07 z`OEu|XlG93ezLJ*XX{k$v}0<9n276qXbj4dM9CZrue15joU)LsAo)aN%daG?@^%)V z&L%O2-1#=uMTv@<0|k_MbR2-?3I>O$!pY0?gg=0Js2tVPk@>OtH!rWksq zEK}XYlWi;Og>E28wFHrn;|2i5TR-B(H#x1|2AiYgPp4Hps*Gik)gDJl?j(Xf{Xi9{ z&f}vs?{a%Q(jW#X?(|82$d+c!n{KJ~>ikxOwLhHJQ|bC&az&qqqJo@YTf{84>VWy+ zwd_|G8-8z$wNkcr+W*1ZTZcv2er=;Z7^HwAA&r!@v^1iEw19L;cXt~g4U$76-5{L< z(hX9BL)XwSmWi`N$732S3A*P>s%zx@6pR8kk4O~vai4%|*T=~X}Ql7Id9 ze(LUw_s_H*wr8rhA_e5L0>!j<_+=@pMYcCOfavuQ&X1EnVv>)R{!aBC-wII7Fo|7k z8yfm{w$~o0SU8!^XA%Z75`eSy9@=Nnn8o=FMH_z0>dn}M}_|!|#HdPdKAl=7%uY+Z{I_?0{wip%kFCSl5gDwjbgc!3r zg=(cM_J=T^joHMeRJFWey#|LvQ6~>T)qpmy0j^rAZvFIGVgH_F|4#M|(S!kT699M^ zY$b8OK7|F0IwvQeauluq1UBOnED%)1dA)nj0U>n;?R)4lL5a+$)jpaPCp4Nzn%ez1 z!lCK{CixA?PQ$wtzy`!;1J`Xdb(vUxyJKy0YdQngUQJH7@Y)aJ3)A4RN=g;i5HI0) zj1`v<<6I1(`bKF>5)pbXVLD&d+0~n;O4Lfo`2#1nB@2Zdz)zM1)on6u?2= zY2bGwc(CL{W3VQCP|5~TBK(taj}_E9rxG_X0Wdz7~nZtdGt(?vLBKyHg&eqPy?5DP z-%VtxH%6S{fbxo=a%FBPif(zSGyvK7mwQXH4S(x9`#wBEPx9AK>g1* z6$iDpt2x+yN&q@#pg#y87jaN){#5N<8%$^CUy)65e?%Gdp6vH~JlSUP_aSE6 zOWv2?_DAV8a5jLGJ;7N85QFdZW>a3jJEOm3IfP2bWZg~_N2e0C$t;FPHuE0e2`P)H z@UiO1cZv(FuvqX>TeA~`)l*=|PN)Q>-w^ge;-0*_bV)(~IcGUPr+a*S1o%-#pkW4% zF$)U1cJIChi&4{raiv|L*W!4ud{vPJwtn~Q3jsL!DXV9p`e(pG`(*K73rG5RfkpIY zK6RN2KP8S{h3(^I0?iv|Am=J;p~Hh+INczx-z|U?PM3!bzCMkQMgXXI=alvIQ0()2 zR-#JwVwJd#A{#AUiWRu*^Cv?WP5_WrfRYRh0-%=9NBZ94jor-;a85=>Dfrx&yDU8& z-D*oq)eG$#=ynsATfG)>c0L1eSbV)T{*#L`>1q@h-tVOX)y{N8jkY6S_ELdVJ=rXo zaO*d^0ID%$f+TJA(s{KL5Nl?Udt&Uc#G2r$TpkJN_>P-^Tubh}aN^L;!y6qorb5k7 z5&GfCI9=C{-`Bu617i1{LyNa>Ku;-9o5+Z$_Pf86oyk}XSX`iUsR`{c0D1!IMVW$G zVP>GlyXZ|Df-Fe{_0Q5`sPEAm0|jm?O5;J{>dOtM)8pimm#8*ihVhOJ89H{+oRw*= zhzbS@PGAiiC{f%q?5=cnl55Dr;8rZFNjD?vSas05bj3_**qU;;kyfT>WUVlHFN9*2Iyub&b#U5eDOrXdbd<#(nR+Pn;SFxFUY*bhO`l>1X}3MJapuj_`Ddk`ymV(9Z>wpP`W}X9kgmz zVyBn2U*|nz>x-TFlyNxD+F~bP4ZMh5+QIA(POg>7#|eV^*u-&9Sd=} zW4=bvX$6%>$5fH~h%=G4fh`OBC6|-E$V+8m5Ga!B218RLdV*;F& zc|$s*AJ-;8@n=kC6=KIDnr(tZ1E?Ucv?~UpH%kaG(F8HkjPlylJ7phr{iZ=H)Vs+O zEUSm^O@N6+KBuxP*pK&IykfW^9L26YzVSE;Q~hYu_6OA9tDGp%U7iVs#*y!UrbM9I z@lZn&1O)?agiki-f*r}6nK$hAkMTVFNTv#-!tK>dED<2fg5Z`n1m?}dp8@0sxJ5V2 zlX(eANiV2;W5VIUYQk?i{sV+5m@2DW*wz(>0vkF?0GZk(tAoyhcJOA!YdPaoHPGZ) z#a#=~iXh$t4mBA!QKsHItRf}1&WZftsI{>WUY<|GYttGxUdq7I@bS-rFQ^*>w6c-Y z^6u=C5~%A$dNHmlICP6CKm-RcL!9Ak&hBV=ILMU&qM@7ZSrN#N0vu}P8k_pQGy27W zX;@KLZ0rYEov6uU0+WWGt}s%awjmg3T>)ka3uK5s(}ab8Wv5NO(6xk=jyq*LMiTYM z366%DcIA1r4r>Laq;=qgQCo;C)WM4iv85|?Jpahtt&0zP21bs!F~fqI|i`NfzGK`-m;5y$kvc+sW~uW&Q=Ce_;|>IB)YW#A#r1X;amOVqWe6 zz7M}7@mZC7$C)W}N+T!8A}W*T0(?QARkicq6Yz}@sGpRqUW23TZ1FiOP?mrn|GmSj z6tmjhOK#AY+2ZCC@Lz(QSO8`e!_W-5S6L0{*YSMGlH%e9w^cPj*Sw0imDza6SwHXN z^Hd3ICjD^Yl;{31pjo-s4(*U{_Y-8L&4GGak`JlG9ck%^S@nEC_ejUqxOffLc!fbO ze*Wo7qgl{mJS)oxp>KPckYS_EPn#Ja3%kc@8f0NiOOAQ(k{;WvPEe>IK?ia%nI5n9 zv}@1eS)q0wL;A3~Nbu3uZIM_}XoIlVu8plNpJRd=m$Lmb-6SpQsIKY zy92;*@!ng_yxReMX}8(tp^~@-5`g?C7FW0WheE0xH*|VM?gxVmC1EuIJb~dn)qiq) z2b8M8hl=5;>Hx8|lu2MAQHOyM!*nPMKz5(>Z(R!@mxcJiq;Y*RtPxZ@?yY{_G*eYI zNv^NnY5yD4)I20E={sZu=2A=0wk_(ewzaXWE-0CQ26_a6H!jlYeWkB2Harb_L^-Vd zd1`W#oRq|8+BN{h<$irpy~YflIqbhPRHY4SVnZsdJ<`NAFiO%>Q$-B7odbw}%Kijh4wNfF4V>pmR zZ7FqM0qB81f!xUs;9#_u#&?K6BNTEtR>|=BH{OZhmau@F#Qu6Dtmg_g4z{oC}9~U zxO^LN@73c0CAtJ|dZowGO1%|y+R-Mx8RUgJBPt>js>_wBmP4q4#GlhDl|p%qo<&}! zh2(v&YD^l7Kbpv@(b0!I=}d8A_;m;WO~eIyAI}>!>b<=?%A+Svmw|8ZAZOhUkpUNy z-8XBPCD*_P{L zKTVXg&QICRo=`EZddZ*`SmBXMG{MdM4T=h)o37)yBe`>Pl|1hmOn^ayxnC}J-g=TI zR3*lxe7@H}edzg>MvDm16!WvP=tS&t?WSAB|8>7)P$1)joAZ*E=j=l#9}?GARegNE zwp`6l>&;~!9Hw7=lsc|Ct^4DDs=*-}hVwA;dRgpdZfvQ_Z-14{?-(`=xhl^^&6V9; zQwg&%CZ|KL5W#NoB0NGbULF+PEZ=NzQ0&bWU!Mm0IX0U+!0m3X#jbK&+iA4*^! zlT|u*FId@Kww3WeZE`=(a~|+2ss>e1Y065cS^M_|lZJZl2g`o|2?CKEay?TGe%~ zL0Bp@29`1}E21+q+h*j>z6D`e)X@!CR?5pWC2LO&>o<88<=Rdh{jP{I@jcI)yhfE> zmz)GVV8uPmf^gB2Tfatxv?AqeU$)#gs zHP@OF6g%7gFlfo~75+i(vZ&<}wCuo*=_My81qHX3i1pKWNy3|XiujvvMn~4tq~+zg zp30}r`j`#r2|A$;Dj?F|2|096`&&-;SLNxWf4<0Z%q?AP%}Y;3iJ;+SYnE#ir(f<7 znu&dUK}y9_?ThMEZ%+A z<>nL-PlI?3HxJkG{LPul_@C+}yMNyDUK-hFH(Hvl*B|A(f{q37-&^5UjjK8fiQ5O@ zFO+wHwebO>YQt8gVbglio0JE?GFIrpmj42`CZg%EtjuT@nfl8hpBYD(c^0Fv!$_wt z5-$F!0qdSR#$UhK7-H((*18hbgDwU|n2!y=-+rtvxQ|8*i~rtB7oYscidu`A7ihp8 zpU-2br{pVXDydxehHl|7OtMn4Xp4fxZinReMwqSNW15F7>^<)k!h$h~58ZVnf_jb9 zR4l$p<&kN7hD&lgcogsF&^G#>prrpwul4e>FqGhl?5}sc@->o0j!Frpa5UOs+$A0nL=yluS zuGk12KI3+Q`BO(UpKNO)_?Z11*XD=vZ6YW>vg?leX&{~;Q@BL{8bp)lx3st_87PLsECXs8$ zraz)0Vw>NCMi1+ z<{9qNZ}TG~g1%gsXlGc+>E+5-Q$&qlY<&P}_&>IWZM&IWN9$?TouXMER> zg{09d;^Glt-qVTc<;qF0v)$SvOZo9adas<^O)YN4H0K&A=8Ld@DIB12gJK+>m_;_t zkH21A_kKz%@uGBOqKM;B=)JdRPc@%P8yHB4Mi%jtOkhuy&W)f-X)57MNO5r^Y#D_x zR~uZ>-C2kw(gG*b;oDsdjL)ZDewR+@%*55-BGMKUHLC%COMq>nwAgw7DI!O}j2(s> zslag|?W-_Vsc4s)lD4%;k(fN0FhE2U)4S|wT(Otg6gHYUu$->1#9^-M_be_*U%0}_ zTEb($Ph>FD7M>@>9Ks)G>UJD44y)#{Jl0`nlwf9O>FXO-@VXh3?Qd>UR=m-$P%=%> zsLP*dycS^*32yyp+#92Ya??CmX^kq#*+2{J6|QP|CYv@s!R@%Eu=U!aNBZ_Z4+*^A zfuhozt_Qx2pJqfc)iN=$_x#?(`P#11ydoT6jU!z490_e=HFI-;FYFmRd9}zu&1*EC z`tP01@^Qd{1{URGItqc(HUv}q4&bw@@B>{gJAkqBc+0d{&3tQjiS>DT7X}tet6LnqSEr#xoA-AP(QBpNwI@xV@AA5``J8vL zT!;!gc)+vX_)=^aBG#c#bm$qo$VK0`8gmIX22xcWZ5~PTfo64VgZ)CwIf5-KHo|M*VIJq-TU2WUZ%}M{xC+LvzK~_D~>K$hmSK@%gUt*lEYWx(>Y8-Wq zoXYf%TTdLVt#{ct`Um^oZEjFGH5SYiKfw*0o#G_v8S${7r6HL#-=2U-WVNF+AA72J zP5v;HG~v0f|H<5s%?B|BH8ZA<>BbAI=}FjnPM{ZhJ0clYw{xmhZ1M5P$m@xRcnwy_ zY7U_sx4dQ_uvtst+4><*-&RX*c`A6`q#bzr`$NK6R^`W~Ef3o(Zd>*OE%KFM0f`Z^Lzuc*a0 zWYQZW)%65y><;BoV<8@sd1zc?F{QJfKaU_+UNso^o7}{XzJCi@Dr29e@gEo{^t$L~ zu6Au4Y(3#eH);e>-}Z6N}?Lb+es0xT0)GABzdZya&unVd!+j;use5)${Aue zFbjo#D1o`2gr5uDPKm1V-d~NkQv%^T0Hy?q&%3%e&fD)@%!Yd=Cy~=TsGOFQhY^#r zNMYA}Pvnq%^CWsppMz2na)WGECw`fUdPXN{Y)bU!cyWGQL>}McFAm{zdb1uPhi7KB zZq9i6^$zotR?ro48X4wI}s4l1~}yeaeM5kpTk zV>@I?S2luW{R&F#6lH=Gq(d|l!@?e78b16F=vxJkl>nTlpeaQCjHLh{PeRQ%V zB{bC-m}R0&8A;Hi*aQ&A7IXEz_bkMu)5N@0bjhWXn@Arr2$>cS z>%gs34R)yDCbojiMwnE>r-cGX#~yb)`<$mZro8k;t3ywwRn_Hfxq{v4reTQ{PhEC% zd6C^m@2yo~OMdjx=w4^uoIBtSVFx*itzINZcu^_qDhZd}I?!5qNu9Y!2N{Rw7{aJg zY{&Am(wHL-oKY+-DY5tzWCV+(@$XqE6m974EtBrZH+yQ2q{uj(X??ZgIbCbxN>ofQ zTRf~M3#~+ZN`aP6ea8OFQgIRo9U#*ElTN9`4QY8BAHDM^RB1+WSfF5NqQEg2=cbu~ z64?45Ygon8*P&}KHf&$#jjUWtKaR7E>POhulUJO}Kg#M29vLD~mt9QkG^9v=k3vPV zZ6PZVy|hMHld0!v4+4}Y#CVj-b3P*Y`$H-kE+mg1#Bd}kvXNQzvS4|ot5|Hidg)ka z=OGyx-z3WsP1Z97q`Ma|KiT{*10F9avzWi88tVUjX8Xg5e52iw{=C4>Oe1n$NA>FK zZXEXui6Ey9432ciKilHCuBvRJDN2Ur2?s|V=p{aC!z@&&hYB5?Zz?o=@uHkfxWeUw z9Zx9T|5DoRHs2^>%AVKc*P22Xp3OIWk<{QR`DLPF8JirN#i5L3&vI<~(jE5vIL&DQMAB{>!i)!l)lbb|abrsTftk5d)$0xeT$W(g1CgS7g?btOYWf~fQ-?sQuO(cGC#G}2-XkEit{809&mi-(Rb5#^y{=RJS5J`>*TLSoh6)&S471( zW&U(a9dbuVE??*MvD7{R*L~oj!w>@w4SzH}N5g^7P;EX4g0*q$Tbp9j2SO~DI4!jN zIPCD9P*SaEd0E;V`|(gMAF$Cyge*bQ=T!kxVvFG-!I_NNm5ppZy&hDRXIc#k?8hkb zCGBY~?UQA~ha|(?b%s`sQXt49R3ydCWe7)Y8OLjNhOs}f&)txpiSZG>Ve!pL66dKd z?Z>#k;u!MGzE0Kh2(J$f$^fj=&upV6soef`_m|hZf95b$UR3AVYN?vWSl<~*BG0eC zp8dj%Mxqs?nr~(_m051uJJJ@OO8gL~TOp8`^Ira4IKScuFO4Lw)Bthj8xK#zDmhY0 zh9&zyL$yopi-_#hxsN!P8epgS_1idJxV|1bpV)R(<-Rt%366)sOm^8cVeJ-ijNr&n zECOs#^lqj+0~t|TU=Br?g!WLGHpg|G*Tsg`C}dRPY^d;Y z#wWAtDbqEg+_*#NT_X^?xL&v^g(K&WhAs?onpr3Cv!9_%=tZL5i(`yfLVd=}xh^Is z>N8nlHY{ag8{M?9g0%Q0WcB4~u7(;i#>k)%w7EY}Y$8`iTB#YuFG1!nEJw_ibx8TS zYN<=KQIkqWgU5qz$ecC7}!fYzvGbU7B78!!rP7Es7qC% zhuF;4JzWD|0*8HB>O=O*dh2HXyWT2CUqir`#5>4A1y8Y>z zweX!*(Ui325r7mtgd=*5;onIWF*LQ#bMpLHwbQn}H>tJLg!wqLCeg=jCdR9MZV-9P zhR^ci4u^KDpNlQSQipdO@*p&{m z^W4k9ulvQFIL98L^{<@(W^><(y_{^kxpUE;hwsD|9t)64yN5b=U^_c=Po3kHD4Wz8 zSpTLv*qUY6>k8i`79y$iJIE>V@khHnk_JEWTwHfCKlr*o!>x+*zyo<2U}9C~=Qb)^ z#mB)$L7rA2w0-a}m}0g)@u~FP*DMm>t2yWaohrtVe7Cd94D{D?pzy))R!1$aM3kU(i5Fher}dp~iTABUJX#=fa*Z0M-!E4Jqaw#3 ztG%``dXSJTQ$ecj2`TZEu{*>Ztdq1$BIePGfiIb;l9`PcX49Tx?%%@%j`OSz)5?>F zVGyD|=#dWneaFjY+)ZUE{O^gqg^cuCB>UR-^Sh7#uo3k$8;cYA%CQj&k9*FIRX%?9R$6nw}gJx3rNHvE}jQp16Jg zdRES=?R2D`*xt1vS_^qxvyb*)pl()gJ+2q_Rw~x&z0SMz+-(DAch_?Y?CAZ+=d8qB>!ud%!xV=G zhS*N8+p7n`;M7jEBjI4IZ<2%Xscd+au$ZKu1aSr}CdYGCnh z+*(U1ciA5#Y|sNB57qfIg_+r)x3UcASqjQqb9b%3R-G8>>8XpWQ#oFM>(>|hnb)wL ztc@2>FU|UxT(?d@WNPBB3pJjeNDU3Z9XkH!6@Uagi%xJPoxoXb>N#5FI9K+9$)2Io#NAm?Hq9F~nrcE7uJD{y&B{~j zGLGzIV`_G9y~roGA2o z2GKYyqH?x8nYOV`sa8Pj;z|3p73^J6qd&jQJk()dtBjevJU4x=#A2vO`0e!2d>&$E zM=ARLY?TZhgwfr3rpKPN$(x`LFwyW_LHY1P{Qu z<^~Nfd%w3bj@Dk2-yJ1Qs;Aya_=11E8v3^1n^*}!HXR=le;Kc>i#K|$a?(GHWa!x6 z-N)tuf)DwmIdTFJF)C|TxK#P?q(dx_q)BRpatxK?zhq^C*azfmHA?i;poFKS<3|eL z(U8r6GXB;B-s9k412AT0d8HgzPR4TkLsDy@2cz8F(FabW{%C2PhT0nA;bHP12JeR- z=z>usNlyUe$DbMjeb&b>66H#Ue!L%=9Itjcj?gIKBMKD|EdA5yH1-}sYG9@Ytaq&y^EIV6lRCu2acEnT2f2sL6X)5q!g^%!S|W(JM@@w_SZ^} z-NYK+e{ZDWre$JeQGLE35cE20Br<|!NVfshQ_gjL2_SuS?vt?HR7Wx#WwBL@Xn7;5 zQK1*tbNkp}y|&FfG(en@^J(YtD=@9H>l8SpG3;GYu8Q|L7|U@A<-s<>_2P4KzzRdv z5oPQ7*t;LhMzTL4HU_*Cf86R`9r@RhY-Nr)===ywz?@4HHhnKRei!?bYuI}JixsqD zOrlUQl>)(Mw?tNpbpSNhA%@ z_@O<#Ls?mhH;aKqdYZ!+7HTLM_p z=fNFk+UGh?*zdHmW!;(U?3AoX7dzDrNXTrE%2V zQuudtN5_`*1uM4P?9#_K!dPxFBcag}9*B6fsP{j{$gYo5$7qU_^iZ;1(Ucda*gt(e zfhP(s%o1}(HCc?p>5EGL zSwGmau~H=EOMZ({K4raS)?yV$cjW(x@{Y~DJL(t?h>(SBVqB^(;l0MYv-O+|f=j+m zkuuP_(wYaK((u8H7NULyMPR*V{~l;Z!qPV!6dC>`G=QA1->|%pxC#Uw;cQS@w^x_v zCF<(ed;Bd|{&m8s91Dl8b{z6@L8}e|z$<5Gy`g(<>d#YLM@=ih$?!~PVA%nah9Sm7 zA;)32)0~IHXADB&q4nTbzah?s1!hjbLBcvl`MV$dBp^oG+;wA)WnLqUp4lD;i%}_R z@fpqhN1j{$XU-};QRSlg<*T1~^Cou|2oYw+rgQ;jMQs(@}O&D&1$$v{ELNs}j*0_2@ArB#WO!)zU^C`3`K@orW$K+E|!- zSB!IzI}TT7I&#Jq4yF=1AKVjyT0gQ{9>2~SbK4TC5^S%4c6Ysbver+qY!dx~2GVcv zB53YolG?!V5C=fzp>HnFyGn(QDR2WpwcE35Uj0pO#K3;eAm|I*z+8_ET$NQh_S8%N zKXCbfzLT!yNP56IpwK`L-p_3?Z)=Rt#$_CF1}1~fjZ#Q2{UXqPZFv=uZPFhD@Lbe) zBsFfhq!?d@wdIb=K>o~i#|dYU7Npv8E7uAGckc7)wC0)eTOUO>(3ZH%I5@sb!A@~Y zcIpmBDgJ}f|8IJlo@V7rk>ioX<7E>sH{0{=ahISdg<+xLq&*MqD$P-xcQ=_2WMsd%ey7@l zE5<8;s=pf-s`XlGcyFM1%CP)fa6m==-qM$_gV7W~u?0%yF~!=w*c?!{^F0;M(X+Ee zl71M-2m06hUy5?yRpW`R*#|-Wv6{%w{4{TVt;x_YK_YhzUyuMq>bCfcR$X%#q*6?y13y>rdd}JC^?Y$DL z68B^_W8oti1RvrSTpq1a?98h)m*`CX*|y1CHfgCkp`5cq3n)38!+&nZf#_S9$(nAy z`h6X;T666(O33(s!T;-^2wJ+Rv2@jXzAaRX;LmG6LyVuR)>SFSo7-(y9aR*gb*E(&QyX_KmkWgsggoJD&sPrT&eof@Eb>a{ zqNt#*KN>Q@0!xrHtxdNrdwzaUq}@C$Az^>|U&Mh%LFfNf9I(4x_b-PdMQ^rI5xa{l z{JYcEs2n>K;Hi0?DFrlKw(XA_yE)t&DrzrNGBr*|4~4*v!>(`jvq5+dCiYTk^0&v) zZ>*fA(C{fYG@x2moi}?o?2$QkFbVvF+8x)vh(7dM2E^%6CEEB8DsyGD)>A_Bt zi%^jaP=CRncpKx7<`s*tP7a6FD5h$60I?lp$FiU_os@S@9yWmaGj^kJ<(iTdk;bg^ zOwcvIq0($+YwKhO73k*Na`-1>6DUU>XZ4V)(P=ODGR*OsRj=1S;-Q~EJXoVtcU=fX zsfLBg>qFsnlnqPv!RrC-LXusCYc0)ITt57!4x%~6-jRit zOo|wUSHj`+KPdYq_1~tI`scZNSrc|_!`PB%%G0LDHJJi&s|VE&CVl67&AHM=_1o8+ z_=(KU>a5rUZK|i(^-5|>HLg3rj|BB;A0Nnua_inGfbcXI&csc-5BMFHZrRYzsRR4_ zK_Rg(5(iL2G)ulE-cnvC_EmCy%MSm2#A#kui6Qed-St3a?0=YUil_fDJ6>XOG<5Fo?Ucy|*gZEm%e3e~jFQ)IRh9QQ4Q<1d=mQ_`BS=@^ zcG@IhEc5VK5ic1jhqL;%Kc1fuTi1gl@g-7Z&E3yp+fAM7$*E2re`z->Pxyy)Piy{I z3&e(R6j`5lIa`L+Av#5$`{kXYF*6RQ#4Y+rY zcF_NOI#j}yZdM=sS3`Vz69ifoDf##=k1yxP2Do=!CCI&cvDJB1wEkpPruz>RLt zv?;%?hHr;zK_iou0rAaihvbK7m#9f#gbvc>{vcnDH5?jaYETtJ*lUQEdV*ns_y@ZS z4>idwBZQbIGT;AN27K-`n>njKmJ0)*haClM?K-r$N>Vs_W*4L^6o$Q80vW{^!@b?I zLgz6tB$F^{K%ko@%B9U($}6A8tye!%cT;cx7);LTV8n}r!eesreJsT2YhV7>0G`CBO1!i4_mE#seSkPtH-e*dPjV& zo?cptDy$$8ud1NHitMRMEKwhzKrrqL7ftX9)xIc6K~j*AQKr^R`|Nl&rC=HXE#qM@ zAQj9Ld4LUL@n>q;F6Kj|q89o!xoZ!u{(ok{Tect@%wT}J5chczilleXHC&`T?_RBSuI17>)R#5ksl5p3 z>N1?q&%DN2kCd!bLm1vxr(JejrSW7A{jbwAneptXGplYgGNl?;X%5P=Ei z7RnMw*nw`W=FWcSo2z{$WV00>b)78C%8o}LT|Q(RYYB*P3QRY@$ett%X9(>ytcLHn zCX3MM-9|f+o|NAf_MYNApt+s9O_5KBrZ)lc_;LKH4Ec(K-^S&CP{|1MO86jAsDhod zm!0a1n$-f)z>wvUg72^L@4j*m`tFEatO56Uik36e=3V%FZQiA%P36`o>sAd5gQ)Pk zOLv^sNZ4oL5O{MM*@YIKG)T0^to$*;X723sb$RH~7Glkf%G+}qosk`#3)^Ei5zxX- zZkJ#3)L#a@@jf5=f(@HqN$YBNOQYc?8N^E07r@^>IBu3-(-a3$$3Ys)WP7caO|!n^ zBMkSXw@^rBWT|%6_fH?Q;T%Bn1E}ok5YjaNp^`xxTXMC|rqVZ#i!Dyr7_mDO^}gq@ zg0@@(Kilc%^ATn1^i%`sh@tW5T6)RmI;Gax!8cxHh>Pc4nm4QmYO)@}3jRED0$GlF zjyU`Hm-#rkt!W?Mzq262@U5}M%hNe?G%t0Q9 z9UNOFW0RKjTJKk626G!KopTS+bxC>o-EG{0J*T54u|So18FFFJ@D=$`*oI52zPGAu zhH&ZLUS9K$k)*-+IubjfkjU^%sNUJMm%pRcmf0I@0_z2G*ZwDaF)+hN^8yPV=Mu*L#{FG7>BAp3QpFrDESzI` z_UNhB-y#KNBHb+k87=((AU=IJ+pgP5LAT1^I3M|CP%5mLSWd?M(u^JraWFU;Sg!5%<=JI zlaoU(5=dC?)?fx)uHk+FJW(vPvXD-M?HZP<2HJWUa<+H0sVa(`Yn$25+JuLE-=2ng zAgH_793q9aO?Z;1s!)&oU|lcw#^d9(mmLKFO_?wdZvv+LovE>H;>KCuW65P;>Pf#@ z-z%H00KfZs;{tQd~%F%0vyYN<68UIe41bvD+2>6zK63Y^MA=g_PloEHOHg@GQ6Od z6gh5pAs)m3Kf=}5)wb0mx_2z1bj}=@G|s)G+-hBL*)1QsHj3yx>x*VI%cj?9h5^oF z2KC7*0M)K;RRt^qg5Ez4%f?C!s^rdbc^ zwZxh(5{=C#t4t0Pil<1@;_|+!)u=CkpF}>rPI9Ld8U@B5a z22EIkGd^oM1Vjqp6k$~GUDlCn8;dwcXB0g>I#{hpp@^dg`;v9JCDF0ba-W;1V42?U z+`P`RTJqeJJxm%P8iMcL(hZ4GvFR}kPxe@errR=YjjhiC@jq1l+41bWqAsgtnw&h% z`y>k+IQjrHDW4-C%-;Qxr(itP4e3_pf_r}Y#bxP0xV^D^c+CWqn92h#qD9A-l3CKw zAJBQwqE&POb-x4LPrD=^uzvA`Reg8VRGhrT_RpV*ibgh?7?qyjN6eKd4c*?#GG$a_ z^q8A@>@jXwi`ylz_BOq6d#&Li8aN0@SCx=@Z1v3)f@bPjiw$+;qoop$B%yQOrT3*c zKp&In+1=zqPTvgLiD4?KZ^PH?{$^!YYMTR%(O#w@AKQ{ctMNTa#uZmoSkrq#6EKD}$ok$o?fghTr{ znMs<{G92c0DT##LTDCE4pWb)Z*(qi|_BEpM|McIf*m>&zM8y*HmE1bNf!*8Pnpb#T zZ+tTf&uX_w)~&FHD4x)4H=otD@gNUwov1wEcaEqYad;b43+l<=0lUt>oZ|Sxum7h_ zce?u2WVzzPkR3Onv-2j%~aKpXQ<0Vfa^X z(Gw*BqH30WmUYbH&#WVyJY_|XnB9& zv((A@Om0f2;q@R#%SmIc;-+&Kewa1~1srkFe0gwVRfk(+Mqv;?HT`$nM^L1zG8^;PBul7-aOtqpVi?AvT> zV;CbHB`4tA2Lof;fCIVGPL*j(XU7h${A2|&Eb4@zW ze_6aeFIm&M`kQlG*-*hvW_w5sRARr=&Ff(WU8<)l!kMX~S`)6d@P0!s4`EyX4=MPJ zLO;#=$AtK28^)$)=5G9*^}$(JrS*D#p$>w4K@t{naM@b`_jlI>#&8v@c_Ub9qMRfm zzU`obyb><>lFI|>o2OvMLn3d@7uvu0E@uhsf4|azn^qfGXaUp2_;b2x^3ScR(HFuE ze5O&|w$b9UYhU+Cfs)$SDWHdpIzKD!W^#_?f(Eb0}HbRD6gdAq}`Gy0mA11j}670KP0rF zr{|vSF)*7cYm~N|7I55GyWncFs^MUfl>K$PW`9+)t}ts>YNwF{*|VJU(U1l{2g@oV{`|5t3KYmQFaNa0Rqym4p7-4DPEIi9 zh%ozF-|+hqwBU(-XOtuEX>xB`T7OQh zknXdG#A~KG-VUp|CuIoZoHuV}O6RQU{6RFC_ryuN|4>T^ecM&){e{hZ%fiLpnrnaJ zMlguUG)qR#53YJQ>LYeDBE6(h=d)}oVp81}wvp@JcGRNy&o6&C0 zgMF_FxQ+_h0)RP0F|Co8zii*<>zRPXuqf2U(X+J3&Dd7Yh)Y{Tjv=x?s<$olfD6bK zk$%2!p+D$F(Mg6W@_GK9AvPw$It|9Gxbo_&joTtk_UdKM`-Kf`eab@VcQFCYh4Ggkk9#@GE3-({rs@O)>)=|GM z;>N*MjH<3*Sg^9?h}+JD{T|^K<}RwyC^j(6U}bKqqt0sLSsUn_0=~pPvOJiahTJMx z4VnkprD;)M%@J37vO@@H2qAt1IHoQ1;LD_4p!MlA@FY(N36`XsTrp-X_q8=S6NPRx)G7RA zk=)bztgpShOEIgdSwX`)bV3l(TJ)>xLyb7|@G^e|ICQ;NuZ=#_D6mk-OR~Aycm6omcz(fs_G$=x>jX>~#2T>tPr%wj)px6l6B=ji zc0D$FhQPg@zuqH9c>i$ysj7{=Mb?NMuT^>eJ5kfc?nVQsn6-b=fLM&_yI0FTllx`g z4&aE_Gd91W&sLvIL2^(EJ{Qfi$&r*ZK=2Ng&D*)UU5pie!$cXMPId!{bvTG|!oSxH zW!&aQ08c0IygQVn_)?%{*d@k;Y>i|$t@!FESiuEY$jJSch|u@kJKU;fV2I;G>>7wj zJU7kIwrgMWT>^m>sGv^z^T$?h0IJE(j|Wy9-!CIPZ8SOl;tGN?5w=!PNjsk~A--=l z=O8SM=~k@ugfi`sp1unM1lcgY=pyhbPFOa&SI_ZcIdUZp{Yc4SdDL%QSHi(qb|HOJ{)j0GS zD@EU8Npf>GA}iVMPr@Q2$C1~R5}!zLBz<QHX9MJ5TrEQ{bVuzSd=<35 zpYQy3(F8pw`K(-BTg&tqEI?v_H(zv^;+nZ$Z-?cwOj$EjDtaQGQtoiBN?Ie%iz z(bYvHk`<8Fi$a4tS7}28WH`B{%~9kY6_LqFi7M$YJqCBiq!cW}BL+>+xID`>CH&+6Q{0(HQ{BINU)>R@xJ@Y`w<&WdGDi^!30r2F=Xu^6H@3`F<~f-Xwh%%{ z$h<{{OdHiElzH0NoJ;rb{yo3-oaa1eJ!_rkod2q2t@!xv&vjkz>-BzruX=7q`;5MS zYxjiuX?o_u)+gXO1O4Y-_gfTXPz|1~=6v<1T8=jCf3zKV9uPG3G!foYFL0*%@%rD8 zPQWboY~&S)#dRmc4EPHwx9Cz->79I}uEC^P#87K^c6(e`RO|W)ll?X8+kwR4VyDBs z`oQfjll`6A$stQB{k_Iof~lTr4!prd&iDc!{m%_Q+W5|Iq#3_8TD#q=*Q(gBi%e-V z^9xM3gd(WKRa!q)TXJ&gJIet70&f?kVXozcy`PUkKf|v3bG+JSC95|(QAU67bA_7{ z^LaK3BI=TIJo@8&-W3C`w= z+h$h9Ya zUS#nm8MQe>7#b!f7M5-zPuKKw6nT(V(K&;$lWT7GlOv^0MCi4AH7a(Ci#(mJYn${u z^IB)nv}Ylf_J$#*{o!jj)gYXyoh|Fi#)j@qEe%gaO?9g~z)M`&b)<=`p8y*3CIh{! zRMYf`0)J7bYo<&Kww?SY;^^Ml9}`J#*Lx|q=qURti*KC0|I=|Os{<4#qn{v+>%W_%*5*WticRLqmZ`?zs$ZcbeA6)EzW0b`!DE5?k zO*fE0qh~pkx^H=m?I&?-AoS9hUTJkXh2@7w=%q%@sX$H*4V2%=EH-PV>Lp{)>*LE3 z^W90LC=Bc)&?wnyF=F!z2YdU>jn^b6qPnD0X};z*pe``c=4_NYNB$Fjrr-rYU6u+7 zU@^@(+IhSb6oA(CT;?NO`C@h9ld{HgK3T!Y7AvjplYUf5!DC3r(bUfS5h>L76S8sr z*DTIXlhG6p4THZXC3&ekS;E09c0Y&jw*Y*#m8P|b0Z4TXLN=?vgm=SRIhR9vr*1w= zZnOKf3w_LKr55Xbrn>=v9>YKEy!6J{HYBJAS*+x9VMW(3!n3-+G0iGhyVD-mK=fWz zR|WNZZzjL`^2Ru#cyhGZXSZ?Nf$El)y@|1xzII;gc6J^|8?TkNYH>7NwL3$n_PbQ< ze)4finyKeg+$Y_t;W}|$j3X|XR#_8+vd-*ihfSgV!6Pk`nrT}%Np;qn%$1+y*TkJ#`>4HMe-8qIz0Vy*H1Bq zK0hrMNEKvU(cx0rW+$Sj0QE)!SH-*C>N5&_2XebU!~P0J=j@59u<~(c@S>ovi@W2Y zd!|^eNUIYIy`P`5x@9s+6x=0B)K>uWhB6ekU;=%nQL(&U`tBLBvvuW9l@+IaSPhKz_>3-%>aT zDy-%=a=A1mQ`IAZdiLI;dWX@W2WtG>H%@A7Z>pJ@OsC382{A1MYitEot8*72{_**Jau1Yg*=FD_g^nDy$N z6w7&hI1zLQ2A%D{IPR&sPj_lz2+?6Bc#>bGIpt&7mO9yx%cg$!m3MiC;dcS=FXP7< z4aD*O%b%AHnj_NrvO3PVMx3kKmP=VLer=_IGU08Rc{ji!P^WZ!PWrr{AYUh{8uxC zU&E@G(IVz&K0F3NIT55WSgXpYwqW$<7e9LF#L_)i7i2>EGZLR9q-I?$&B)F)SP4k7 zH_j(4nEh-f((`ndgUZ!)K5@v7mVy9(Bb8wKzzty(jqAgGCN6shQEh%pYm;+XMfdJ0#eU%Hsxtmg%IQZ;rQsG4>MhrZ)8*0Sq z6%PFK(;T|~ld*DP)48w>l>gycL~<l&NOxZfVk<@E7RZoqIzV$bFXy*p4g7^B~>u+yhr2aH# zk3z9}-`-wHQmdsmIAxe!llRftq@myE$Gy$%*d?dMi-v<2z*6|;7Wja%%BpWrrSgU1 zZ_d!z*p4X06L!w&Ry*^J)zqW*s-FYex!QR?6KiuNEd?g=_9u5*p_rU!qA5X)CoXQM zkMG^o6W(_uZJgr>-AYVPw7Zf*cDo>0oOJ~*GZB>)W8Zz|8zbvSG9Pt#Tuo^cavuek zp=N*|;loA2F!QTv0L;N%1buoy!|IlkfBR1BU03-J)x89>Cx3QY*m;tLx-}MHj)Wt- zDwve|UE6S(>5w)-%iXkE5gw%l1q#_Nlt9--=`M~=oOA!|kcqpVp90}3Sl{0YlOI<& zyX;f3X7C9-wYKC?$v0z3Rt*RFp|9v_Df4e?rNnL=Vb)o82lAX3gowBx=#8# ziR0d<&z@F;-J^`Zxrff9*{y@d=2f^zptyrd@<$GQa}ONFN{63i=)l>29+mpCbt0&# zRz{@22Q0~ozVo1(ft;amtk0}mfPX>hLxDzC1OB2RkF)eU!_6lqVbf7y9K_?bDn~`i zj2&zi8m9&;*L*d{XlaAL8dVwE@Ox{F+ErT zA^wH-4~fet595YsY8p{gcJ4|A+7wbK>vXnWdU+FOv_gaVu2`+Hc zyC-9Y!DWf`Yrc7p?~zIAyRwW8`|i_Zxvwv;<3a@M`zS57QmF2|pa{B4V{?&i7=GU? zKIXS>hq9eJo{+_`ysXIat!1~_Oc?sqd$0id+2EyZMY5u5f&NxF6}SZ!v5ZtLcJX)h zuw{~w5<4i{#!hc~{}S-u?P^w4J#NQ?+w2cMl0SD2|7e5}c5*1cj%d!G$iA@@Su z#nSy9MFqsAHUSK7Lhj|MTi>FGWJ_`~!7$hvTm~iT^0bhR2cS!5)MU9+mlZ?$gad+2WL0QpP-czx^i!~r%cXxVa5JYi2le>)LKB%1_ zZt8qm8H|kq;WGJv(1eo$!l(35g4?Q;oSc=_mdCYrw5W+_5(tviG14S-P!B{l`TP)O zj6N6lvSAMH){A2%Yz!2bNhgI_>F1GaqDjZ!gGxCPw=`HYRpiW#{x+A# zJZ7@G6*f0JdrdVPmQ}B{mzSGCr(c{I)Z*ONU8s=kKI~dB0KFOli=^LRE9JR6pL=D zULihQf*U^G8fhKjS1gW_K}+}~))FA@Wl`rDF32^k<%xiX(yVkOo#@MmBE7lL=I8s- zTT5(}oxu*rg89()%8hKRp>tmR#P!YOEkWX8%-C$*BkZ!74Vn2eMvX9Pi%2gGbol}c zb?`y@1qR}W-$RzjlY6gT3{5#N)j}=Um@mIM1Vu#k5Va^|d}%6+Q{V5=6)^fi7o)BH zre)?H_Jz}wBUAc4LEKQ>8a z)FEk+`6ZKT#T`mf_PmEym6jHU&{M=)t=2QO6HrdTr}Fz&{MiQ_`rljhS_$1fv>m(%7k!H{HyO$_lKPd4F z;Q{-PC)avsHYSO|s-Tebie7ZND?X7ahIjLMTyCX%DVj>d5ZgC7ZJTuyAy+O~1kRhM zbnJ91rxVnZeI*DcqxB3DYaS0!=YZfv@S4y_>yGr$Q5dytB)}^qN?As0FI$B4Ovq8fnhq7!MSG3Fk z&I3es%#>4PRD|@J1ASPFm(nFPHCH@gt$z{{IeJ3JQfot@#r+Lg!_nFaKDfpG_dtO> zabBhi+?p@t%VxW)8ZmyTO&A$j+TMtRhQ={{%{U-n1TeThl!3RWWUgo?`mwHwkDcY3 zpmD7?gaRpa2nG0YNE;faWCv`mF(>LT?tUa>EmXYy@j7a1f{9r-620$VFWv+jMLCoU z)~SY8;rhibNX&s!uYvM)l+TTdiTHe|4M|O{^Xu2XjeB|&u%9kbZaoFS%ox5kDVnUiM#kj`IVcM*_D)5vz$c}$Wu5n zo(ATtGn{X9?weg^o+O4*VI|KUUv>4^66w>U&u;f8wiQC`mYnozmAdm|bOfxM(w?2f%B@7)<71erWV7E{FZLL-mWn zC`f+FI;_KvdQh-|wdYFtN>6CoD1j7A+p-ewO9PV`Jqh`_pDTEDi$yc)QMwJ!sveX; z?h><63uf<(G%GpVxkij=YERgf?yJ!fK*VCBc@4`xLDq^yctSU^~^s)VVjX6f}?;*7+4%{dez(;RJ@b+em4lmTL8a*@}$Mf3Ch zr!`CBJuIt|d28%q^gYiNWA%?6W2486Y-leia>cU|w!RsH=5us4hOYIy=1(puYpAaH z?_p}Zs1-K+*zxo>AGi`Q+rCeo%hE*|;RBt&NKhQ9zYki3^&D(ohBf%+N)h7&nvlW) zGO-~$Uny?7j#7WE*`hi_)+C-$Xm8d2qz?*PQGYXr%U!q6MkQy0pm8=VGdX^EVr*Tg$RODk+z%JxYDUgzp{CWGykd^rx1LUAtmCRMgE2!-UXe-T{S1+QXA~x)g9yV8; z@+K^vJ&AFh`+`Q5?v#EZwh&(Ar~j7YD8Y@K4I{++z%%yuVBfO>m2`#Bsc(um?c=ar zG+k|D12|_fgF3(4ENzl1x(H;ETk-G<9q;mm5_*?zn`aljPO_m_9d$3$tbP6ZJOFh2 z?nXe3P-i}-_AEp`FNx+*NeL(ZlxPyB5-+1+MTF`TZU_B&o4j0BI)GpGXV<$D<@ao1kEv4b7C>l3XU z;R_T0dw^f!1T(Sk=7d<4NKs2ABfpQ@l}9wnl-_;lVJz0ihQ7-;Yn0t_iBCN(aAzJb zknZNKlc=Pm{NwE2;D({Ux%c5mbewxMb&vb^w0!Ecq@-G};!cNh*+@?jM!klTU)SVh z+sjJCjT_3M5Hu%=+5e`Y%j5j;wxug16M_#s_v;;N@on%9&#UG2gHHTvl>f_&9YkM# zag*pi=y+JU`AF{YMxi(?rk>4)d;)F}Y;T|)4pqO0Da&$MHS>Ot8sA*hx+qtnRTQNN z95#Y12AIIEZns8hr2QS?uw8iW;{@^1k|OulK7Q@+2F&bnzXi}G6Vn`W|gS`NImXkk+^hWz^( zuZgacxh7961aMTi|2{4<3+qkcstFh<)}TDO4(S)?Y+)!*u5u@uOK`c))1R>{&_;pb z{L+|7JA~+rmH-{G_H&XM^h%5dU3lnmzx8Iq%MUmA_!d|_0wEy{VefM=`jel*9j^$L zKLJMkRv$gB@wJ1iqU`gqifC#KXbN;WzIlO!gvEA}m@6z|Ytia0{1Bl;6Vm*Bo|T=- zh;c@U*u-&{j)e;XOs>L@y!s~N`{nt8b$Dl`qoWa1NOO3SihqVVKmP(b+klI(tKN%8 zIA3-0wHb=vgG-F7luGNOeigfq#E27JO^!bqGcpaXd%ckq7O5D#7E>!1@RKBN z&R&%}i@$XwIes2Zr>T8eVGb&)?LCh>7>D!SJOJTmhV=jDW11c#OWRPaPqv*;IP_ zZoZW!$f;37c2fR1T)cNG3hNw3M4l)A=?Vzn3 z+}wzXQM*jV`XW5`DWs}`90G*R1r`q>kR)w6WM|G-#NBj@z9<%aTjoyhjlhRU6Hw>2) zMm6;^(o=b|I3c(+g^|v6vj_SU|5_*d4yKOqjkvUBJ-> z!EKG2<3Dz{GZQ(XTRei4e220>8D?a=LRcRKNPq|<1gmvG0 zybXz1Ns_;lzzs~E+=4UKOh`{$K!uoS83aObQGP!mXPeqd*;F_cq8`DfCKQub9E)v) zvXq#`V1mdcb8`>+P#YLH9GAU}27ki?Oq7)(ZYLr=BRw{F6I$-S%!szejGt=w9UbuYdj* zHgQ7a)L#?r-=p<^JQe@_75`%qxc?6$?|<+2I-Z2hgi~Zvxh1dte+UsKe|pH;DR__O TVcBEOqr+BFRKJB$Fb)1UDv&Xs literal 0 HcmV?d00001 diff --git a/assets/og/subgroup-fairness.png b/assets/og/subgroup-fairness.png new file mode 100644 index 0000000000000000000000000000000000000000..6e1dec1b0e0bd5eea81da7bc67187b6a41dffb9e GIT binary patch literal 68655 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 asv(>pl}d#n}OvBn`4T0EH0 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 z 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 Vc>IGGW*lQ+$Vn?p6-gSu{9pDW-*o^0 literal 0 HcmV?d00001 diff --git a/explainers/conditional-demographic-parity.html b/explainers/conditional-demographic-parity.html new file mode 100644 index 0000000..3102959 --- /dev/null +++ b/explainers/conditional-demographic-parity.html @@ -0,0 +1,383 @@ + + + + + +What Is Conditional Demographic Parity? ยท Fair Code + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ + +
+
Explainer
+

What Is Conditional Demographic Parity?

+

Checking parity within strata of a chosen legitimate factor, not across the whole population.

+

Learn how conditional demographic parity refines plain demographic parity by stratifying on an explicitly chosen legitimate factor, and why the choice of that factor decides the answer. Uses the Benefits Denial (Adult Census) audit: conditioning the +19.6 pp sex income gap on education leaves it at +18.4 pp, while conditioning on marital status removes about 84% of it.

+
+ +

What Is Conditional Demographic Parity?

+

Plain demographic parity asks whether two groups get positive outcomes at the same rate. Conditional demographic parity asks whether they get them at the same rate once you hold a chosen "legitimate" factor fixed - and the choice of that factor decides the answer.

+

The One-Sentence Definition

+

Conditional demographic parity (CDP) requires equal positive-outcome rates across protected groups within each stratum of one or more explicitly chosen legitimate factors, rather than across the whole population at once.

+

Why It Matters

+

Plain demographic parity requires P(Y_hat = 1 | G = A) = P(Y_hat = 1 | G = B) unconditionally. Two things go wrong with that in practice:

+
  • It is satisfied by a model that is equally useless for everyone (predict the base rate, ignore the features), so passing it is not evidence of a good model.
  • It is violated by a model that legitimately uses a lawful, non-proxy factor - years of experience in a hiring model, loan amount in a credit model - that happens to correlate with a protected group. The violation may be entirely explained by that factor, not by the protected attribute.
+

Conditional demographic parity is the standard refinement for the second problem. You pick one or more conditioning factors L that you are willing to treat as a legitimate basis for outcome differences, stratify the population by L, and check demographic parity within each stratum:

+
P(Y_hat = 1 | G = A, L = l) = P(Y_hat = 1 | G = B, L = l)   for every level l
+

If the groups reach parity within every stratum of L, the aggregate gap was "explained by L". If a gap persists within strata, L does not account for it.

+

This is a real, commonly used construction - it is the fairness analogue of adding a control variable to a regression, and it is close to what US disparate-impact analysis does when it asks whether a challenged practice is "job related and consistent with business necessity". It is not a synonym for plain demographic parity, and it is not the same as intersectional or subgroup fairness, which stratify by other protected attributes to find hidden gaps rather than by a legitimate factor to explain one.

+

How It Works

+

Start from the identity that makes the aggregate gap decomposable. For each group g:

+
P(Y_hat = 1 | G = g) = sum over l of  P(L = l | G = g) * P(Y_hat = 1 | G = g, L = l)
+

The aggregate rate is a weighted average of within-stratum rates, weighted by how group g is distributed across the strata of L. Subtracting the two groups' aggregate rates gives a gap with two sources: different within-stratum rates (P(Y_hat = 1 | G = g, L = l) differs by g), and different stratum weights (P(L = l | G = g) differs by g).

+

Conditional demographic parity zeroes out the second source by construction: it only compares groups at the same value of L. What is left is the within-stratum gap. A sample-size-weighted average of the within-stratum gaps is the part of the aggregate gap that stratifying on L does not remove.

+

The catch is entirely in the choice of L. If L is a genuine exogenous factor, the within-stratum gap is the disparity net of a real confounder. If L is a proxy for the protected attribute, conditioning on it absorbs the discrimination into the "legitimate" term and the within-stratum gap understates the real harm. CDP gives you a knob; it does not tell you where to set it.

+

Concrete Example: Benefits Denial - Audit 04

+

Benefits Denial/ audits the Adult Census Income dataset (adult.csv, 32,561 rows). The target is income == '>50K' and sex is a declared protected attribute. Using the dataset's own outcome rates (the base rate a label-level demographic parity check compares):

+

Unconditional:

+
GroupnP(income > 50K)
Male21,79030.6%
Female10,77111.0%
Gap (M - F)+19.6 pp
+

Now apply CDP with two different choices of legitimate factor L.

+

L = education level (education.num, 15 levels)

+
education.numnGap (M - F)
9 (HS grad)10,501+13.7 pp
10 (some college)7,291+19.5 pp
13 (Bachelors)5,355+29.4 pp
14 (Masters)1,723+32.3 pp
15 (Prof-school)576+33.1 pp
16 (Doctorate)413+20.2 pp
+

Sample-weighted within-stratum gap: +18.4 pp. Conditioning on education removes almost none of the aggregate gap - within every education level men are markedly more likely to be high earners, and at the top three levels the gap is larger than the unconditional +19.6. CDP conditioned on education says: the disparity is not an artifact of women being less educated in this dataset.

+

L = marital status (marital.status)

+
marital.statusnGap (M - F)
Married-civ-spouse14,976-0.9 pp
Never-married10,683+2.0 pp
Divorced4,443+9.3 pp
Widowed993+17.6 pp
+

Sample-weighted within-stratum gap: roughly +3 pp, and inside the single largest stratum the sign reverses (women 0.9 points ahead). Conditioning on marital status makes most of the aggregate gap disappear.

+

The two answers disagree, and that is the point

+

Same protected attribute, same dataset, same +19.6 pp aggregate. Condition on education and the gap stands. Condition on marital status and it nearly vanishes. CDP did not resolve the fairness question - it moved it to a new one: is marital status a legitimate basis for a 20-point income difference between men and women, or is it a proxy for a sex-role division of unpaid labor that the outcome variable should not be conditioned on? That is a normative and legal question, not a statistical one, and CDP's output is only as defensible as the answer to it. (This is the same aggregate-vs-stratified divergence covered from the other direction in Simpson's Paradox.)

+
import pandas as pd
+import numpy as np
+
+df = pd.read_csv("Benefits Denial/adult.csv")
+df["high_income"] = (df["income"] == ">50K").astype(int)
+
+
+def within_stratum_gap(frame, condition_col):
+    rows = []
+    for level, sub in frame.groupby(condition_col):
+        m = sub.loc[sub["sex"] == "Male", "high_income"]
+        f = sub.loc[sub["sex"] == "Female", "high_income"]
+        if len(m) < 30 or len(f) < 30:
+            continue
+        rows.append((level, len(sub), m.mean() - f.mean()))
+    tbl = pd.DataFrame(rows, columns=["level", "n", "gap"])
+    weighted = np.average(tbl["gap"], weights=tbl["n"])
+    return tbl, weighted
+
+
+for col in ("education.num", "marital.status"):
+    _, w = within_stratum_gap(df, col)
+    print(f"condition on {col:16s}: weighted within-stratum gap = {w:+.4f}")
+# condition on education.num   : weighted within-stratum gap = +0.1844
+# condition on marital.status  : weighted within-stratum gap = +0.0305
+

Detection Code

+

The following module computes the unconditional demographic parity gap, the conditional (within-stratum) gap for a chosen legitimate factor, and the fraction of the unconditional gap that conditioning explains away.

+
import numpy as np
+import pandas as pd
+
+
+def conditional_demographic_parity(
+    df: pd.DataFrame,
+    outcome_col: str,
+    group_col: str,
+    advantaged: str,
+    disadvantaged: str,
+    condition_cols: list[str],
+    min_group_in_stratum: int = 30,
+) -> dict:
+    """
+    Compare the unconditional demographic parity gap for (advantaged -
+    disadvantaged) against the gap computed within each stratum defined by
+    cross-tabulating condition_cols.
+
+    outcome_col must be 0/1. Returns a dict with:
+      unconditional_gap        aggregate P(Y=1|adv) - P(Y=1|dis)
+      conditional_gap          sample-size-weighted mean of within-stratum gaps
+      explained_fraction       1 - conditional_gap / unconditional_gap, i.e.
+                               how much of the aggregate gap stratifying removed
+      strata                   per-stratum table (level, n, gap)
+
+    A strata row is skipped if either group has fewer than
+    min_group_in_stratum members in it (its within-stratum rate would be too
+    noisy to compare).
+    """
+    d = df[[outcome_col, group_col, *condition_cols]].dropna()
+    d = d[d[group_col].isin([advantaged, disadvantaged])]
+
+    def gap(frame):
+        a = frame.loc[frame[group_col] == advantaged, outcome_col]
+        b = frame.loc[frame[group_col] == disadvantaged, outcome_col]
+        if len(a) == 0 or len(b) == 0:
+            return np.nan, len(a), len(b)
+        return a.mean() - b.mean(), len(a), len(b)
+
+    uncond_gap, _, _ = gap(d)
+
+    rows = []
+    for level, sub in d.groupby(condition_cols if len(condition_cols) > 1
+                                else condition_cols[0]):
+        g, na, nb = gap(sub)
+        if np.isnan(g) or min(na, nb) < min_group_in_stratum:
+            continue
+        rows.append({"level": level, "n": len(sub), "gap": g})
+
+    strata = pd.DataFrame(rows).sort_values("n", ascending=False)
+    if strata.empty:
+        return {"unconditional_gap": float(uncond_gap),
+                "conditional_gap": np.nan, "explained_fraction": np.nan,
+                "strata": strata}
+
+    cond_gap = float(np.average(strata["gap"], weights=strata["n"]))
+    explained = (1.0 - cond_gap / uncond_gap) if uncond_gap != 0 else np.nan
+
+    return {
+        "unconditional_gap": float(uncond_gap),
+        "conditional_gap": cond_gap,
+        "explained_fraction": float(explained),
+        "strata": strata.reset_index(drop=True),
+    }
+
+
+def print_cdp_report(result: dict, condition_label: str) -> None:
+    print(f"Conditioning factor: {condition_label}")
+    print(f"  unconditional DP gap:        {result['unconditional_gap']:+.4f}")
+    print(f"  conditional (within) DP gap: {result['conditional_gap']:+.4f}")
+    if not np.isnan(result["explained_fraction"]):
+        print(f"  fraction of gap explained:   "
+              f"{result['explained_fraction']:.1%}")
+    print("  per-stratum gaps (largest first):")
+    for _, row in result["strata"].iterrows():
+        print(f"    {str(row['level'])[:28]:28s} n={int(row['n']):6d}  "
+              f"gap={row['gap']:+.4f}")
+
+
+# Usage on the Benefits Denial audit:
+# import pandas as pd
+# df = pd.read_csv("Benefits Denial/adult.csv")
+# df["high_income"] = (df["income"] == ">50K").astype(int)
+# print_cdp_report(conditional_demographic_parity(
+#     df, "high_income", "sex", "Male", "Female", ["education.num"]),
+#     "education.num")
+# print_cdp_report(conditional_demographic_parity(
+#     df, "high_income", "sex", "Male", "Female", ["marital.status"]),
+#     "marital.status")
+

Against Benefits Denial/adult.csv this reports an explained_fraction near 0.06 for education.num (conditioning removes almost nothing) and near 0.84 for marital.status (conditioning removes most of the gap) - the same +19.6 pp aggregate, two incompatible readings.

+

Limitations and Trade-offs

+

1. The conditioning set is a value judgment, not a statistical choice

+

Everything CDP reports is downstream of which factors you declared "legitimate". There is no test that tells you whether marital status, or occupation, or prior loan history, is a fair thing to condition on. Pick a factor that is genuinely a proxy for the protected attribute and CDP will confidently report that the disparity is "explained", which is exactly the proxy-variable trap.

+

2. Conditioning can only ever shrink or hold the gap you can attribute, never validate the factor

+

A small within-stratum gap means the aggregate gap co-varies with L. It does not mean L causes the outcome difference, and it does not mean using L is lawful or ethical. Those require an argument outside the data.

+

3. Strata multiply fast and thin out

+

Conditioning on one categorical factor is usually fine; conditioning on two or three cross-tabulated factors produces many strata with tiny per-group counts, unstable within-stratum rates, and a weighted gap dominated by a few large cells. Keep the conditioning set minimal and report per-stratum sample sizes.

+

4. Continuous conditioning factors require binning

+

education.num above is discrete. A continuous factor (age, income, tenure) has to be binned, and the bin edges change the answer. Coarse bins can leave residual confounding inside each bin; fine bins run into the small-strata problem in point 3.

+

5. It does not fix the "equally useless model" hole

+

Like plain demographic parity, CDP is a rate comparison. A model that is equally bad within every stratum still passes. CDP tightens demographic parity against one specific failure (a legitimate confounder); it does not turn it into a sufficiency or calibration guarantee.

+ + + +
  • Benefits Denial/ - the Adult Census Income audit above; conditioning the sex income gap on education preserves it, conditioning on marital status removes it.
  • German Credit Lending/ - a credit audit where loan amount and credit history are candidate "business necessity" factors to condition an age gap on.
+

Further Reading

+ +
+

Part of The Fair Code Project - exposing and fixing algorithmic bias with real data and open code.

+
+ + + + diff --git a/explainers/conditional-demographic-parity.md b/explainers/conditional-demographic-parity.md new file mode 100644 index 0000000..0a57fba --- /dev/null +++ b/explainers/conditional-demographic-parity.md @@ -0,0 +1,251 @@ +# What Is Conditional Demographic Parity? + +> *Plain demographic parity asks whether two groups get positive outcomes at the same rate. Conditional demographic parity asks whether they get them at the same rate once you hold a chosen "legitimate" factor fixed - and the choice of that factor decides the answer.* + +## The One-Sentence Definition + +**Conditional demographic parity** (CDP) requires equal positive-outcome rates across protected groups *within* each stratum of one or more explicitly chosen legitimate factors, rather than across the whole population at once. + +## Why It Matters + +Plain [demographic parity](demographic-parity.md) requires `P(Y_hat = 1 | G = A) = P(Y_hat = 1 | G = B)` unconditionally. Two things go wrong with that in practice: + +- It is satisfied by a model that is equally useless for everyone (predict the base rate, ignore the features), so passing it is not evidence of a good model. +- It is violated by a model that legitimately uses a lawful, non-proxy factor - years of experience in a hiring model, loan amount in a credit model - that happens to correlate with a protected group. The violation may be entirely explained by that factor, not by the protected attribute. + +Conditional demographic parity is the standard refinement for the second problem. You pick one or more conditioning factors `L` that you are willing to treat as a legitimate basis for outcome differences, stratify the population by `L`, and check demographic parity *within* each stratum: + +``` +P(Y_hat = 1 | G = A, L = l) = P(Y_hat = 1 | G = B, L = l) for every level l +``` + +If the groups reach parity within every stratum of `L`, the aggregate gap was "explained by `L`". If a gap persists within strata, `L` does not account for it. + +This is a real, commonly used construction - it is the fairness analogue of adding a control variable to a regression, and it is close to what US disparate-impact analysis does when it asks whether a challenged practice is "job related and consistent with business necessity". It is not a synonym for plain demographic parity, and it is not the same as [intersectional](intersectional-bias.md) or [subgroup](subgroup-fairness.md) fairness, which stratify by *other protected attributes* to find hidden gaps rather than by a legitimate factor to explain one. + +## How It Works + +Start from the identity that makes the aggregate gap decomposable. For each group `g`: + +``` +P(Y_hat = 1 | G = g) = sum over l of P(L = l | G = g) * P(Y_hat = 1 | G = g, L = l) +``` + +The aggregate rate is a weighted average of within-stratum rates, weighted by how group `g` is distributed across the strata of `L`. Subtracting the two groups' aggregate rates gives a gap with two sources: different within-stratum rates (`P(Y_hat = 1 | G = g, L = l)` differs by `g`), and different stratum weights (`P(L = l | G = g)` differs by `g`). + +Conditional demographic parity zeroes out the second source by construction: it only compares groups at the same value of `L`. What is left is the within-stratum gap. A sample-size-weighted average of the within-stratum gaps is the part of the aggregate gap that stratifying on `L` does *not* remove. + +The catch is entirely in the choice of `L`. If `L` is a genuine exogenous factor, the within-stratum gap is the disparity net of a real confounder. If `L` is a [proxy](proxy-variables.md) for the protected attribute, conditioning on it absorbs the discrimination into the "legitimate" term and the within-stratum gap understates the real harm. CDP gives you a knob; it does not tell you where to set it. + +## Concrete Example: Benefits Denial - Audit 04 + +`Benefits Denial/` audits the Adult Census Income dataset (`adult.csv`, 32,561 rows). The target is `income == '>50K'` and `sex` is a declared protected attribute. Using the dataset's own outcome rates (the base rate a label-level demographic parity check compares): + +**Unconditional:** + +| Group | n | P(income > 50K) | +|---|---:|---:| +| Male | 21,790 | 30.6% | +| Female | 10,771 | 11.0% | +| Gap (M - F) | | **+19.6 pp** | + +Now apply CDP with two different choices of legitimate factor `L`. + +### L = education level (`education.num`, 15 levels) + +| education.num | n | Gap (M - F) | +|---:|---:|---:| +| 9 (HS grad) | 10,501 | +13.7 pp | +| 10 (some college) | 7,291 | +19.5 pp | +| 13 (Bachelors) | 5,355 | +29.4 pp | +| 14 (Masters) | 1,723 | +32.3 pp | +| 15 (Prof-school) | 576 | +33.1 pp | +| 16 (Doctorate) | 413 | +20.2 pp | + +Sample-weighted within-stratum gap: **+18.4 pp**. Conditioning on education removes almost none of the aggregate gap - within every education level men are markedly more likely to be high earners, and at the top three levels the gap is *larger* than the unconditional +19.6. CDP conditioned on education says: the disparity is not an artifact of women being less educated in this dataset. + +### L = marital status (`marital.status`) + +| marital.status | n | Gap (M - F) | +|---|---:|---:| +| Married-civ-spouse | 14,976 | -0.9 pp | +| Never-married | 10,683 | +2.0 pp | +| Divorced | 4,443 | +9.3 pp | +| Widowed | 993 | +17.6 pp | + +Sample-weighted within-stratum gap: roughly **+3 pp**, and inside the single largest stratum the sign reverses (women 0.9 points ahead). Conditioning on marital status makes most of the aggregate gap disappear. + +### The two answers disagree, and that is the point + +Same protected attribute, same dataset, same +19.6 pp aggregate. Condition on education and the gap stands. Condition on marital status and it nearly vanishes. CDP did not resolve the fairness question - it moved it to a new one: *is marital status a legitimate basis for a 20-point income difference between men and women, or is it a proxy for a sex-role division of unpaid labor that the outcome variable should not be conditioned on?* That is a normative and legal question, not a statistical one, and CDP's output is only as defensible as the answer to it. (This is the same aggregate-vs-stratified divergence covered from the other direction in [Simpson's Paradox](simpsons-paradox.md).) + +```python +import pandas as pd +import numpy as np + +df = pd.read_csv("Benefits Denial/adult.csv") +df["high_income"] = (df["income"] == ">50K").astype(int) + + +def within_stratum_gap(frame, condition_col): + rows = [] + for level, sub in frame.groupby(condition_col): + m = sub.loc[sub["sex"] == "Male", "high_income"] + f = sub.loc[sub["sex"] == "Female", "high_income"] + if len(m) < 30 or len(f) < 30: + continue + rows.append((level, len(sub), m.mean() - f.mean())) + tbl = pd.DataFrame(rows, columns=["level", "n", "gap"]) + weighted = np.average(tbl["gap"], weights=tbl["n"]) + return tbl, weighted + + +for col in ("education.num", "marital.status"): + _, w = within_stratum_gap(df, col) + print(f"condition on {col:16s}: weighted within-stratum gap = {w:+.4f}") +# condition on education.num : weighted within-stratum gap = +0.1844 +# condition on marital.status : weighted within-stratum gap = +0.0305 +``` + +## Detection Code + +The following module computes the unconditional demographic parity gap, the conditional (within-stratum) gap for a chosen legitimate factor, and the fraction of the unconditional gap that conditioning explains away. + +```python +import numpy as np +import pandas as pd + + +def conditional_demographic_parity( + df: pd.DataFrame, + outcome_col: str, + group_col: str, + advantaged: str, + disadvantaged: str, + condition_cols: list[str], + min_group_in_stratum: int = 30, +) -> dict: + """ + Compare the unconditional demographic parity gap for (advantaged - + disadvantaged) against the gap computed within each stratum defined by + cross-tabulating condition_cols. + + outcome_col must be 0/1. Returns a dict with: + unconditional_gap aggregate P(Y=1|adv) - P(Y=1|dis) + conditional_gap sample-size-weighted mean of within-stratum gaps + explained_fraction 1 - conditional_gap / unconditional_gap, i.e. + how much of the aggregate gap stratifying removed + strata per-stratum table (level, n, gap) + + A strata row is skipped if either group has fewer than + min_group_in_stratum members in it (its within-stratum rate would be too + noisy to compare). + """ + d = df[[outcome_col, group_col, *condition_cols]].dropna() + d = d[d[group_col].isin([advantaged, disadvantaged])] + + def gap(frame): + a = frame.loc[frame[group_col] == advantaged, outcome_col] + b = frame.loc[frame[group_col] == disadvantaged, outcome_col] + if len(a) == 0 or len(b) == 0: + return np.nan, len(a), len(b) + return a.mean() - b.mean(), len(a), len(b) + + uncond_gap, _, _ = gap(d) + + rows = [] + for level, sub in d.groupby(condition_cols if len(condition_cols) > 1 + else condition_cols[0]): + g, na, nb = gap(sub) + if np.isnan(g) or min(na, nb) < min_group_in_stratum: + continue + rows.append({"level": level, "n": len(sub), "gap": g}) + + strata = pd.DataFrame(rows).sort_values("n", ascending=False) + if strata.empty: + return {"unconditional_gap": float(uncond_gap), + "conditional_gap": np.nan, "explained_fraction": np.nan, + "strata": strata} + + cond_gap = float(np.average(strata["gap"], weights=strata["n"])) + explained = (1.0 - cond_gap / uncond_gap) if uncond_gap != 0 else np.nan + + return { + "unconditional_gap": float(uncond_gap), + "conditional_gap": cond_gap, + "explained_fraction": float(explained), + "strata": strata.reset_index(drop=True), + } + + +def print_cdp_report(result: dict, condition_label: str) -> None: + print(f"Conditioning factor: {condition_label}") + print(f" unconditional DP gap: {result['unconditional_gap']:+.4f}") + print(f" conditional (within) DP gap: {result['conditional_gap']:+.4f}") + if not np.isnan(result["explained_fraction"]): + print(f" fraction of gap explained: " + f"{result['explained_fraction']:.1%}") + print(" per-stratum gaps (largest first):") + for _, row in result["strata"].iterrows(): + print(f" {str(row['level'])[:28]:28s} n={int(row['n']):6d} " + f"gap={row['gap']:+.4f}") + + +# Usage on the Benefits Denial audit: +# import pandas as pd +# df = pd.read_csv("Benefits Denial/adult.csv") +# df["high_income"] = (df["income"] == ">50K").astype(int) +# print_cdp_report(conditional_demographic_parity( +# df, "high_income", "sex", "Male", "Female", ["education.num"]), +# "education.num") +# print_cdp_report(conditional_demographic_parity( +# df, "high_income", "sex", "Male", "Female", ["marital.status"]), +# "marital.status") +``` + +Against `Benefits Denial/adult.csv` this reports an `explained_fraction` near `0.06` for `education.num` (conditioning removes almost nothing) and near `0.84` for `marital.status` (conditioning removes most of the gap) - the same +19.6 pp aggregate, two incompatible readings. + +## Limitations and Trade-offs + +### 1. The conditioning set is a value judgment, not a statistical choice + +Everything CDP reports is downstream of which factors you declared "legitimate". There is no test that tells you whether marital status, or occupation, or prior loan history, is a fair thing to condition on. Pick a factor that is genuinely a proxy for the protected attribute and CDP will confidently report that the disparity is "explained", which is exactly the [proxy-variable](proxy-variables.md) trap. + +### 2. Conditioning can only ever shrink or hold the gap you can attribute, never validate the factor + +A small within-stratum gap means the aggregate gap co-varies with `L`. It does not mean `L` *causes* the outcome difference, and it does not mean using `L` is lawful or ethical. Those require an argument outside the data. + +### 3. Strata multiply fast and thin out + +Conditioning on one categorical factor is usually fine; conditioning on two or three cross-tabulated factors produces many strata with tiny per-group counts, unstable within-stratum rates, and a weighted gap dominated by a few large cells. Keep the conditioning set minimal and report per-stratum sample sizes. + +### 4. Continuous conditioning factors require binning + +`education.num` above is discrete. A continuous factor (age, income, tenure) has to be binned, and the bin edges change the answer. Coarse bins can leave residual confounding inside each bin; fine bins run into the small-strata problem in point 3. + +### 5. It does not fix the "equally useless model" hole + +Like plain demographic parity, CDP is a rate comparison. A model that is equally bad within every stratum still passes. CDP tightens demographic parity against one specific failure (a legitimate confounder); it does not turn it into a sufficiency or calibration guarantee. + +## Related Concepts + +* [What Is Demographic Parity?](demographic-parity.md) - the unconditional metric CDP refines. +* [What Is a Proxy Variable?](proxy-variables.md) - why conditioning on the wrong factor launders discrimination instead of explaining it. +* [What Is Simpson's Paradox in Fairness Audits?](simpsons-paradox.md) - the same aggregate-vs-stratified divergence, framed as a reversal rather than a refinement. +* [What Is Subgroup Fairness (and Fairness Gerrymandering)?](subgroup-fairness.md) - stratifying by other protected attributes to find hidden gaps, the opposite motivation from CDP. +* [Why Fairness Metrics Conflict](fairness-metric-conflicts.md) - where conditional and unconditional parity sit among the impossibility results. + +## Related Projects in This Repo + +* [`Benefits Denial/`](../Benefits%20Denial/) - the Adult Census Income audit above; conditioning the `sex` income gap on education preserves it, conditioning on marital status removes it. +* [`German Credit Lending/`](../German%20Credit%20Lending/) - a credit audit where loan amount and credit history are candidate "business necessity" factors to condition an age gap on. + +## Further Reading + +* [Corbett-Davies, S., Pierson, E., Feller, A., Goel, S., Huq, A. (2017): Algorithmic Decision Making and the Cost of Fairness, *KDD 2017*](https://arxiv.org/abs/1701.08230) - introduces conditional statistical parity and shows how the choice of conditioning variables trades off against error rates. +* [Wachter, S., Mittelstadt, B., Russell, C. (2021): Why Fairness Cannot Be Automated, *Computer Law and Security Review*, 41](https://arxiv.org/abs/2005.05906) - argues that the "legitimate factor" choice at the heart of conditional parity mirrors, and cannot be separated from, EU non-discrimination law's contextual reasoning. +* [Kilbertus, N., Rojas-Carulla, M., Parascandolo, G., Hardt, M., Janzing, D., Scholkopf, B. (2017): Avoiding Discrimination through Causal Reasoning, *NeurIPS 2017*](https://arxiv.org/abs/1706.02744) - frames "which variables may we condition on" as a causal-graph question rather than a statistical one. + +--- + +*Part of [The Fair Code Project](https://instagram.com/thefaircodeproject) - exposing and fixing algorithmic bias with real data and open code.* diff --git a/explainers/differential-privacy.html b/explainers/differential-privacy.html new file mode 100644 index 0000000..fd55b87 --- /dev/null +++ b/explainers/differential-privacy.html @@ -0,0 +1,328 @@ + + + + + +What Is Differential Privacy (and Its Tension With Fairness)? ยท Fair Code + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
Explainer
+

What Is Differential Privacy (and Its Tension With Fairness)?

+

The accuracy cost of a privacy guarantee falls hardest on underrepresented groups.

+

Learn how DP-SGD's gradient clipping and noise addition disproportionately degrade accuracy for minority subgroups, so adding a privacy guarantee to a bias-mitigation pipeline is not free. Illustrative example from Bagdasaryan, Poursaeed and Shmatikov (NeurIPS 2019), plus a runnable DP-SGD noise-injection toy; this repo trains no DP model, so no frozen numbers are quoted.

+
+ +

What Is Differential Privacy (and Its Tension With Fairness)?

+

Differential privacy adds calibrated noise during training so no single person's data changes the model much. That protection is not free, and it is not evenly distributed: the accuracy it costs falls hardest on exactly the underrepresented groups a fairness audit is trying to protect.

+

The One-Sentence Definition

+

Differential privacy (DP) is a formal guarantee that the output of an analysis (here, a trained model) is almost unchanged whether or not any one individual's record was included, achieved during training by clipping each example's gradient contribution and adding random noise, with the strength of the guarantee set by a privacy budget epsilon (smaller epsilon = more noise = stronger privacy).

+

Why It Matters

+

A bias-mitigation pipeline and a privacy requirement are often imposed on the same model by different stakeholders - a fairness team and a data-protection officer - who assume the two goals compose for free. They do not.

+

The standard training algorithm for a DP model, DP-SGD, does two things to every gradient step: it clips each per-example gradient to a fixed norm, and it adds Gaussian noise proportional to that norm. Both operations interact badly with class imbalance:

+
  • Underrepresented groups tend to be the ones a model has not yet fit well, so their examples produce large gradients - the ones clipping cuts down the most. The majority's already-small gradients pass through nearly untouched.
  • The noise is added to the batch-averaged gradient regardless of composition. A signal that is a small fraction of the batch (the minority's contribution) is drowned by the noise at a lower epsilon than the majority's signal is.
+

The result, documented by Bagdasaryan, Poursaeed and Shmatikov (2019), is that the accuracy drop from adding DP is "not borne equally": it is substantially larger for underrepresented classes and subgroups, and if the original model was already unfair, DP makes it more unfair. This is the same shape as the fairness-accuracy trade-off - closing one gap opens another - except the axis being traded against fairness is privacy, not overall accuracy.

+

How It Works

+

DP-SGD replaces the plain gradient step with:

+
1. compute per-example gradients g_i for the minibatch
+2. clip:   g_i  <-  g_i / max(1, ||g_i|| / C)          # cap the L2 norm at C
+3. sum, then add noise:   g  <-  (sum_i g_i  +  N(0, sigma^2 C^2 I)) / B
+4. step:   w  <-  w - lr * g
+

C is the clipping norm and sigma the noise multiplier; together with the number of steps and the sampling rate they determine epsilon (via a privacy accountant). Smaller epsilon needs a larger sigma.

+

Why this is disparate:

+
  • Clipping is a per-example ceiling. An example the model already predicts well has a small gradient and is unaffected. An example the model gets wrong - disproportionately from a group with little training data - has a large gradient that gets scaled down, so its correction is weakened. Over many steps the majority keeps learning at full strength while the minority's updates are throttled.
  • Noise has a fixed scale but the useful signal does not. In a batch that is 90% majority, the minority's contribution to the summed gradient is roughly a tenth of the total before noise. The noise term N(0, sigma^2 C^2) is the same size either way, so it overwhelms the minority direction while the majority direction still stands out. As sigma rises (epsilon falls), the minority signal disappears first.
+

A minimal way to see the mechanism: train a logistic model with DP-SGD on data where 10% of rows follow a different feature-to-label rule than the other 90%, and read out accuracy per group as sigma increases. The majority accuracy holds; the minority accuracy falls faster and further. The Detection Code section gives a runnable version.

+

Concrete Illustration (from the literature, not a Fair Code run)

+

This repo's benchmark harness does not train any DP model - there is no epsilon in faircode/strategies.py and no DP row in results/. Every number in this section is from the published study below, quoted so the pattern is concrete, not reproduced here.

+

Bagdasaryan et al. (2019), Differential Privacy Has Disparate Impact on Model Accuracy (NeurIPS 2019), trained the same models with and without DP-SGD across several tasks:

+
  • A gender-classification model on facial images: adding DP reduced accuracy far more for darker-skinned faces (an underrepresented group in the training set) than for lighter-skinned faces, widening an accuracy gap that already existed in the non-private model.
  • A sentiment-analysis model on tweets: DP reduced accuracy more on text written in African-American English than on the majority dialect.
  • Across tasks, the finding held: "the reduction in accuracy incurred by deep learning models with differential privacy disproportionately impacts underrepresented subgroups," and the effect grows as epsilon shrinks. Their summary of the mechanism is that the gradient clipping and noise addition of DP-SGD "disproportionately affect" the subgroups whose gradients are largest and whose share of the data is smallest - i.e. "the poor get poorer."
+

The relevance to this repo: every audit here is built around a protected group that is, in its dataset, the smaller or worse-served one (younger applicants, minority defendants, one insurance tier). Those are precisely the groups DP-SGD costs the most accuracy. "We added a privacy guarantee" is therefore not evidence of "we did not make the fairness gap worse" - it needs its own per-group check.

+

Detection Code

+

A self-contained, dependency-light DP-SGD toy: per-example gradient clipping plus Gaussian noise on a logistic model, with a per-group accuracy readout, run across a sweep of noise multipliers. It is illustrative - it shows the mechanism, not a calibrated epsilon.

+
import numpy as np
+
+
+def make_imbalanced_data(n=6000, minority_frac=0.10, seed=0):
+    """90% majority + 10% minority, where the minority's label depends on a
+    different set of features - so the minority needs its own signal to be
+    learned, and that signal is what clipping + noise erode first."""
+    rng = np.random.default_rng(seed)
+    n_min = int(n * minority_frac)
+    group = np.array([1] * n_min + [0] * (n - n_min))   # 1 = minority
+    rng.shuffle(group)
+    x = rng.normal(size=(n, 6))
+    w_majority = np.array([1.5, -1.0, 0.7, 0.0, 0.0, 0.0])
+    w_minority = np.array([0.0, 0.0, 0.0, 1.5, -1.0, 0.7])
+    logits = np.where(group == 1, x @ w_minority, x @ w_majority)
+    y = (rng.random(n) < 1.0 / (1.0 + np.exp(-logits))).astype(int)
+    return x, y, group
+
+
+def dp_sgd_logreg(x, y, steps=4000, batch=64, lr=0.5,
+                  clip_norm=1.0, noise_multiplier=0.0, seed=1):
+    """DP-SGD for logistic regression. noise_multiplier is 'sigma': 0 means
+    clip-only (no privacy), larger means smaller epsilon."""
+    rng = np.random.default_rng(seed)
+    n, d = x.shape
+    w = np.zeros(d)
+    for _ in range(steps):
+        idx = rng.integers(0, n, batch)
+        xb, yb = x[idx], y[idx]
+        p = 1.0 / (1.0 + np.exp(-(xb @ w)))
+        per_example = (p - yb)[:, None] * xb                     # B x d
+        norms = np.linalg.norm(per_example, axis=1, keepdims=True)
+        per_example = per_example / np.maximum(1.0, norms / clip_norm)   # clip
+        grad = per_example.sum(axis=0)
+        if noise_multiplier > 0:
+            grad = grad + rng.normal(scale=noise_multiplier * clip_norm, size=d)
+        w -= lr * grad / batch
+    return w
+
+
+def accuracy_by_group(w, x, y, group):
+    pred = (x @ w > 0).astype(int)
+    maj = ((pred == y) & (group == 0)).sum() / (group == 0).sum()
+    minority = ((pred == y) & (group == 1)).sum() / (group == 1).sum()
+    return maj, minority
+
+
+def sweep(seeds=range(6)):
+    x_tr, y_tr, g_tr = make_imbalanced_data(seed=0)
+    x_te, y_te, g_te = make_imbalanced_data(n=4000, seed=99)
+
+    def mean_acc(**kw):
+        rows = [accuracy_by_group(dp_sgd_logreg(x_tr, y_tr, seed=s, **kw),
+                                  x_te, y_te, g_te) for s in seeds]
+        return np.mean(rows, axis=0)
+
+    print(f"{'setting':<28}{'majority':>10}{'minority':>10}{'gap':>8}")
+    maj, minr = mean_acc(noise_multiplier=0.0)
+    print(f"{'clip only (no privacy)':<28}{maj:>10.3f}{minr:>10.3f}{maj - minr:>+8.3f}")
+    for sigma in (1.0, 2.0, 4.0, 8.0):
+        maj, minr = mean_acc(noise_multiplier=sigma)
+        print(f"{f'DP-SGD sigma={sigma}':<28}{maj:>10.3f}{minr:>10.3f}{maj - minr:>+8.3f}")
+
+
+# sweep()
+# The majority column stays roughly flat as sigma grows; the minority column
+# and the gap move against the minority. Swap in a real dataset + a privacy
+# accountant (e.g. Opacus, tensorflow-privacy) to attach an epsilon to each row.
+

Limitations and Trade-offs

+

1. Epsilon has no universally correct value

+

There is no threshold at which a model is "private enough". Deployed systems have used epsilon from below 1 (strong) to over 10 (weak); the choice trades re-identification risk against utility and against the fairness cost described here, and it is a policy decision, not a statistical one - the same shape as choosing a fairness metric.

+

2. DP protects against a specific threat, not against bias

+

The DP guarantee is about membership inference and individual re-identification: an attacker cannot tell whether a particular person was in the training set. It says nothing about whether the labels are biased, whether the sampling was biased, or whether the model discriminates. A perfectly private model can be perfectly unfair. DP and fairness are orthogonal guarantees that happen to interfere.

+

3. The disparate impact can sometimes be mitigated, at a cost

+

Per-group clipping norms, adaptive clipping, or fair-DP training objectives can reduce the gap DP-SGD opens, but they add hyperparameters, can weaken the privacy accounting, and are not standard in off-the-shelf DP training libraries. Assume the vanilla DP-SGD behavior unless a mitigation is explicitly in place and measured.

+

4. The toy here is a mechanism demo, not a calibrated result

+

The Detection Code has no privacy accountant, so its sigma values do not map to a real epsilon, and its synthetic data exaggerates the minority's distinctness for clarity. Treat it as an illustration of why the effect happens; for a real number, run DP-SGD with an accountant on a real dataset and measure per-group accuracy directly.

+ +
  • What Is the Fairness-Accuracy Trade-off? - the same "closing one gap opens another" structure, with accuracy rather than privacy on the other axis.
  • What Is Class Imbalance? - why an underrepresented group's signal is a small share of each batch, the property DP-SGD's noise exploits.
  • Mitigation Strategies - this repo's five bias-mitigation strategies, none of which is DP; adding DP on top would need its own per-group evaluation.
  • Membership inference - the attack DP is designed to prevent: given a trained model, deciding whether a specific record was in its training set. DP bounds how well any such attack can do.
  • What Is Underdiagnosis Bias? - another case where a technique aimed at one problem quietly worsens per-group outcomes.
+ +
  • Healthcare Readmission/ - a clinical model where a real deployment would plausibly face a patient-privacy requirement; the smallest race and age subgroups are the ones DP-SGD would cost the most.
  • German Credit Lending/ - younger applicants are the protected, smaller group; a DP-trained credit model would degrade for them fastest as epsilon tightens.
+

Further Reading

+ +
+

Part of The Fair Code Project - exposing and fixing algorithmic bias with real data and open code.

+
+ + + + diff --git a/explainers/differential-privacy.md b/explainers/differential-privacy.md new file mode 100644 index 0000000..989286a --- /dev/null +++ b/explainers/differential-privacy.md @@ -0,0 +1,167 @@ +# What Is Differential Privacy (and Its Tension With Fairness)? + +> *Differential privacy adds calibrated noise during training so no single person's data changes the model much. That protection is not free, and it is not evenly distributed: the accuracy it costs falls hardest on exactly the underrepresented groups a fairness audit is trying to protect.* + +## The One-Sentence Definition + +**Differential privacy (DP)** is a formal guarantee that the output of an analysis (here, a trained model) is almost unchanged whether or not any one individual's record was included, achieved during training by clipping each example's gradient contribution and adding random noise, with the strength of the guarantee set by a privacy budget **epsilon** (smaller epsilon = more noise = stronger privacy). + +## Why It Matters + +A bias-mitigation pipeline and a privacy requirement are often imposed on the same model by different stakeholders - a fairness team and a data-protection officer - who assume the two goals compose for free. They do not. + +The standard training algorithm for a DP model, **DP-SGD**, does two things to every gradient step: it **clips** each per-example gradient to a fixed norm, and it **adds Gaussian noise** proportional to that norm. Both operations interact badly with class imbalance: + +- Underrepresented groups tend to be the ones a model has not yet fit well, so their examples produce **large gradients** - the ones clipping cuts down the most. The majority's already-small gradients pass through nearly untouched. +- The noise is added to the batch-averaged gradient regardless of composition. A signal that is a small fraction of the batch (the minority's contribution) is **drowned by the noise** at a lower epsilon than the majority's signal is. + +The result, documented by Bagdasaryan, Poursaeed and Shmatikov (2019), is that the accuracy drop from adding DP is "not borne equally": it is substantially larger for underrepresented classes and subgroups, and **if the original model was already unfair, DP makes it more unfair**. This is the same shape as [the fairness-accuracy trade-off](fairness-accuracy-tradeoff.md) - closing one gap opens another - except the axis being traded against fairness is privacy, not overall accuracy. + +## How It Works + +DP-SGD replaces the plain gradient step with: + +``` +1. compute per-example gradients g_i for the minibatch +2. clip: g_i <- g_i / max(1, ||g_i|| / C) # cap the L2 norm at C +3. sum, then add noise: g <- (sum_i g_i + N(0, sigma^2 C^2 I)) / B +4. step: w <- w - lr * g +``` + +`C` is the clipping norm and `sigma` the noise multiplier; together with the number of steps and the sampling rate they determine epsilon (via a privacy accountant). Smaller epsilon needs a larger `sigma`. + +Why this is disparate: + +- **Clipping is a per-example ceiling.** An example the model already predicts well has a small gradient and is unaffected. An example the model gets wrong - disproportionately from a group with little training data - has a large gradient that gets scaled down, so its correction is weakened. Over many steps the majority keeps learning at full strength while the minority's updates are throttled. +- **Noise has a fixed scale but the useful signal does not.** In a batch that is 90% majority, the minority's contribution to the summed gradient is roughly a tenth of the total before noise. The noise term `N(0, sigma^2 C^2)` is the same size either way, so it overwhelms the minority direction while the majority direction still stands out. As `sigma` rises (epsilon falls), the minority signal disappears first. + +A minimal way to see the mechanism: train a logistic model with DP-SGD on data where 10% of rows follow a different feature-to-label rule than the other 90%, and read out accuracy per group as `sigma` increases. The majority accuracy holds; the minority accuracy falls faster and further. The Detection Code section gives a runnable version. + +## Concrete Illustration (from the literature, not a Fair Code run) + +**This repo's benchmark harness does not train any DP model** - there is no `epsilon` in `faircode/strategies.py` and no DP row in `results/`. Every number in this section is from the published study below, quoted so the pattern is concrete, not reproduced here. + +Bagdasaryan et al. (2019), *Differential Privacy Has Disparate Impact on Model Accuracy* (NeurIPS 2019), trained the same models with and without DP-SGD across several tasks: + +- A **gender-classification model** on facial images: adding DP reduced accuracy far more for darker-skinned faces (an underrepresented group in the training set) than for lighter-skinned faces, widening an accuracy gap that already existed in the non-private model. +- A **sentiment-analysis model** on tweets: DP reduced accuracy more on text written in African-American English than on the majority dialect. +- Across tasks, the finding held: "the reduction in accuracy incurred by deep learning models with differential privacy disproportionately impacts underrepresented subgroups," and the effect grows as epsilon shrinks. Their summary of the mechanism is that **the gradient clipping and noise addition of DP-SGD "disproportionately affect" the subgroups whose gradients are largest and whose share of the data is smallest** - i.e. "the poor get poorer." + +The relevance to this repo: every audit here is built around a protected group that is, in its dataset, the smaller or worse-served one (younger applicants, minority defendants, one insurance tier). Those are precisely the groups DP-SGD costs the most accuracy. "We added a privacy guarantee" is therefore not evidence of "we did not make the fairness gap worse" - it needs its own per-group check. + +## Detection Code + +A self-contained, dependency-light DP-SGD toy: per-example gradient clipping plus Gaussian noise on a logistic model, with a per-group accuracy readout, run across a sweep of noise multipliers. It is illustrative - it shows the *mechanism*, not a calibrated epsilon. + +```python +import numpy as np + + +def make_imbalanced_data(n=6000, minority_frac=0.10, seed=0): + """90% majority + 10% minority, where the minority's label depends on a + different set of features - so the minority needs its own signal to be + learned, and that signal is what clipping + noise erode first.""" + rng = np.random.default_rng(seed) + n_min = int(n * minority_frac) + group = np.array([1] * n_min + [0] * (n - n_min)) # 1 = minority + rng.shuffle(group) + x = rng.normal(size=(n, 6)) + w_majority = np.array([1.5, -1.0, 0.7, 0.0, 0.0, 0.0]) + w_minority = np.array([0.0, 0.0, 0.0, 1.5, -1.0, 0.7]) + logits = np.where(group == 1, x @ w_minority, x @ w_majority) + y = (rng.random(n) < 1.0 / (1.0 + np.exp(-logits))).astype(int) + return x, y, group + + +def dp_sgd_logreg(x, y, steps=4000, batch=64, lr=0.5, + clip_norm=1.0, noise_multiplier=0.0, seed=1): + """DP-SGD for logistic regression. noise_multiplier is 'sigma': 0 means + clip-only (no privacy), larger means smaller epsilon.""" + rng = np.random.default_rng(seed) + n, d = x.shape + w = np.zeros(d) + for _ in range(steps): + idx = rng.integers(0, n, batch) + xb, yb = x[idx], y[idx] + p = 1.0 / (1.0 + np.exp(-(xb @ w))) + per_example = (p - yb)[:, None] * xb # B x d + norms = np.linalg.norm(per_example, axis=1, keepdims=True) + per_example = per_example / np.maximum(1.0, norms / clip_norm) # clip + grad = per_example.sum(axis=0) + if noise_multiplier > 0: + grad = grad + rng.normal(scale=noise_multiplier * clip_norm, size=d) + w -= lr * grad / batch + return w + + +def accuracy_by_group(w, x, y, group): + pred = (x @ w > 0).astype(int) + maj = ((pred == y) & (group == 0)).sum() / (group == 0).sum() + minority = ((pred == y) & (group == 1)).sum() / (group == 1).sum() + return maj, minority + + +def sweep(seeds=range(6)): + x_tr, y_tr, g_tr = make_imbalanced_data(seed=0) + x_te, y_te, g_te = make_imbalanced_data(n=4000, seed=99) + + def mean_acc(**kw): + rows = [accuracy_by_group(dp_sgd_logreg(x_tr, y_tr, seed=s, **kw), + x_te, y_te, g_te) for s in seeds] + return np.mean(rows, axis=0) + + print(f"{'setting':<28}{'majority':>10}{'minority':>10}{'gap':>8}") + maj, minr = mean_acc(noise_multiplier=0.0) + print(f"{'clip only (no privacy)':<28}{maj:>10.3f}{minr:>10.3f}{maj - minr:>+8.3f}") + for sigma in (1.0, 2.0, 4.0, 8.0): + maj, minr = mean_acc(noise_multiplier=sigma) + print(f"{f'DP-SGD sigma={sigma}':<28}{maj:>10.3f}{minr:>10.3f}{maj - minr:>+8.3f}") + + +# sweep() +# The majority column stays roughly flat as sigma grows; the minority column +# and the gap move against the minority. Swap in a real dataset + a privacy +# accountant (e.g. Opacus, tensorflow-privacy) to attach an epsilon to each row. +``` + +## Limitations and Trade-offs + +### 1. Epsilon has no universally correct value + +There is no threshold at which a model is "private enough". Deployed systems have used epsilon from below 1 (strong) to over 10 (weak); the choice trades re-identification risk against utility and against the fairness cost described here, and it is a policy decision, not a statistical one - the same shape as choosing a fairness metric. + +### 2. DP protects against a specific threat, not against bias + +The DP guarantee is about **membership inference and individual re-identification**: an attacker cannot tell whether a particular person was in the training set. It says nothing about whether the labels are biased, whether the sampling was biased, or whether the model discriminates. A perfectly private model can be perfectly unfair. DP and fairness are orthogonal guarantees that happen to interfere. + +### 3. The disparate impact can sometimes be mitigated, at a cost + +Per-group clipping norms, adaptive clipping, or fair-DP training objectives can reduce the gap DP-SGD opens, but they add hyperparameters, can weaken the privacy accounting, and are not standard in off-the-shelf DP training libraries. Assume the vanilla DP-SGD behavior unless a mitigation is explicitly in place and measured. + +### 4. The toy here is a mechanism demo, not a calibrated result + +The Detection Code has no privacy accountant, so its `sigma` values do not map to a real epsilon, and its synthetic data exaggerates the minority's distinctness for clarity. Treat it as an illustration of *why* the effect happens; for a real number, run DP-SGD with an accountant on a real dataset and measure per-group accuracy directly. + +## Related Concepts + +* [What Is the Fairness-Accuracy Trade-off?](fairness-accuracy-tradeoff.md) - the same "closing one gap opens another" structure, with accuracy rather than privacy on the other axis. +* [What Is Class Imbalance?](class-imbalance.md) - why an underrepresented group's signal is a small share of each batch, the property DP-SGD's noise exploits. +* [Mitigation Strategies](mitigation-strategies.md) - this repo's five bias-mitigation strategies, none of which is DP; adding DP on top would need its own per-group evaluation. +* Membership inference - the attack DP is designed to prevent: given a trained model, deciding whether a specific record was in its training set. DP bounds how well any such attack can do. +* [What Is Underdiagnosis Bias?](underdiagnosis-bias.md) - another case where a technique aimed at one problem quietly worsens per-group outcomes. + +## Related Projects in This Repo + +* [`Healthcare Readmission/`](../Healthcare%20Readmission/) - a clinical model where a real deployment would plausibly face a patient-privacy requirement; the smallest race and age subgroups are the ones DP-SGD would cost the most. +* [`German Credit Lending/`](../German%20Credit%20Lending/) - younger applicants are the protected, smaller group; a DP-trained credit model would degrade for them fastest as epsilon tightens. + +## Further Reading + +* [Bagdasaryan, E., Poursaeed, O., Shmatikov, V. (2019): Differential Privacy Has Disparate Impact on Model Accuracy, *Advances in Neural Information Processing Systems 32 (NeurIPS 2019)*](https://arxiv.org/abs/1905.12101) - the paper this explainer's central claim comes from; shows the DP accuracy cost is larger for underrepresented subgroups across image, text, and tabular tasks. +* [Abadi, M. et al. (2016): Deep Learning with Differential Privacy, *ACM CCS 2016*](https://arxiv.org/abs/1607.00133) - the original DP-SGD algorithm (per-example clipping + Gaussian noise + moments accountant). +* [Dwork, C., Roth, A. (2014): The Algorithmic Foundations of Differential Privacy, *Foundations and Trends in Theoretical Computer Science*, 9(3-4)](https://www.cis.upenn.edu/~aaroth/Papers/privacybook.pdf) - the standard reference for the epsilon definition and its properties. +* [Cummings, R., Gupta, V., Kimpara, D., Morgenstern, J. (2019): On the Compatibility of Privacy and Fairness, *FairUMAP 2019*](https://arxiv.org/abs/1907.00212) - a formal look at when the two guarantees can and cannot be satisfied together. + +--- + +*Part of [The Fair Code Project](https://instagram.com/thefaircodeproject) - exposing and fixing algorithmic bias with real data and open code.* diff --git a/explainers/simpsons-paradox.html b/explainers/simpsons-paradox.html new file mode 100644 index 0000000..0beb050 --- /dev/null +++ b/explainers/simpsons-paradox.html @@ -0,0 +1,382 @@ + + + + + +What Is Simpson's Paradox in Fairness Audits? ยท Fair Code + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
Explainer
+

What Is Simpson's Paradox in Fairness Audits?

+

A gap that shows up in the aggregate can shrink, vanish, or reverse once you disaggregate.

+

Learn why an aggregate fairness metric is a weighted average of within-stratum rates, so pooling groups of different sizes can manufacture or flip a disparity. Uses the Benefits Denial (Adult Census) audit: the aggregate sex income gap of +19.6 pp collapses to roughly +3 pp within marital-status strata and reverses to -0.9 pp inside the largest one.

+
+ +

What Is Simpson's Paradox in Fairness Audits?

+

A model can look fair in aggregate while every disaggregated subgroup shows the opposite pattern, or look unfair in aggregate when no subgroup does - because pooling groups of different sizes and base rates lets the mix, not the model, drive the headline number.

+

The One-Sentence Definition

+

Simpson's Paradox is a statistical phenomenon in which a trend or association that holds within every subgroup of the data reverses, disappears, or appears out of nowhere once the subgroups are combined into a single aggregate, because the subgroups differ in size and in their baseline rates.

+

Why It Matters

+

Almost every fairness metric in this repo is a single aggregate number: one demographic_parity_diff, one selection-rate gap, one accuracy-equality figure per audit. That number is computed by pooling every row for a protected group and comparing the pooled rate to another group's pooled rate.

+

Pooling is not neutral. When a protected group is distributed differently across the strata of some other variable - an occupation, a marital status, a loan product, a hospital - than the comparison group is, the aggregate comparison silently reweights those strata. The result is a headline gap that can be several times larger than any gap that actually exists within a stratum, can point the opposite direction from every stratum, or can vanish entirely.

+

This is distinct from intersectional bias, which is about a compounding gap that only appears at the intersection of two attributes and is hidden when you check one attribute at a time. Simpson's Paradox is the reverse direction: a gap that appears (or flips) in the aggregate and is not present, or is present with the opposite sign, once you disaggregate. Both are failures of looking at the data at the wrong level, but they pull in opposite directions, and a serious audit has to check for both.

+

Simpson's Paradox does not tell you which view is correct. It only tells you that the aggregate and the disaggregated pictures disagree, which means the aggregate number alone cannot be trusted as a fairness finding without knowing why they disagree.

+

How It Works

+

Let Y be a binary outcome (1 = the favorable outcome), G a protected group, and S a stratifying variable with levels s. The aggregate rate for a group is a weighted average of its within-stratum rates, where the weights are how that group is distributed across strata:

+
P(Y = 1 | G = g) = sum over s of  P(S = s | G = g) * P(Y = 1 | G = g, S = s)
+

Two things vary between groups in that sum: the within-stratum rates P(Y = 1 | G = g, S = s), and the stratum weights P(S = s | G = g). The aggregate gap between two groups blends both. If the weights differ enough, the weight term can dominate and the aggregate gap stops reflecting the within-stratum rates at all.

+

A minimal reversal

+

Consider a hiring screen with two departments. Within each department the callback rate for Group A is higher than for Group B:

+
DepartmentGroup A callbacksGroup B callbacks
Engineering (easy to pass)70 / 80 = 87.5%18 / 20 = 90.0%
Design (hard to pass)2 / 20 = 10.0%8 / 80 = 10.0%
Pooled72 / 100 = 72.0%26 / 100 = 26.0%
+

Within Engineering, Group B does slightly better (90.0% vs 87.5%); within Design the two are tied (10.0% vs 10.0%). Neither department favors Group A. Yet the pooled rate shows Group A ahead by 46 points, because 80% of Group A's applicants are in the high-callback department and 80% of Group B's are in the low-callback one. The pooled 46-point "gap" is entirely a fact about where each group applied, not about how either group was treated inside a department.

+

Concrete Example: Benefits Denial - Audit 04

+

Benefits Denial/ audits the Adult Census Income dataset (adult.csv, 32,561 rows), where the target is income == '>50K' and sex is a declared protected attribute. These are the dataset's own outcome rates (not a model's predictions), which is the base rate a demographic-parity check on the labels compares.

+

Aggregate:

+
GroupnP(income > 50K)
Male21,79030.6%
Female10,77111.0%
Gap (M - F)+19.6 pp
+

Now stratify by marital.status. The single largest stratum, Married-civ-spouse, holds 14,976 rows - 46% of the entire dataset:

+
StratumMale nMale rateFemale nFemale rateGap (M - F)
Married-civ-spouse13,31944.6%1,65745.5%-0.9 pp
Never-married5,9165.5%4,7673.5%+2.0 pp
Divorced1,77116.0%2,6726.7%+9.3 pp
Widowed16823.2%8255.6%+17.6 pp
Separated39412.4%6312.7%+9.8 pp
+

Collapsed to just married vs not-married, the gap shrinks from +19.6 pp to +3.0 pp (married) and +3.9 pp (not married). And inside Married-civ-spouse - nearly half the data - the sign reverses: women are 0.9 points ahead.

+

The mechanism is the stratum weights. Women are 52% of the "not married" pool, which has an overall high-income rate of 6.5%, but only 12% of the "married" pool, which has an overall rate of 43.7%. The aggregate comparison places most men in the high-earning stratum and splits women toward the low-earning one, so roughly 16 of the 19.6 aggregate points come from where each group sits, not from a within-stratum difference in outcome rates.

+

Whether marital.status is a legitimate thing to condition on here is a separate, normative question - see Conditional Demographic Parity and the Limitations section below. The point Simpson's Paradox makes is narrower: the +19.6 pp aggregate figure, reported on its own, describes the dataset's composition at least as much as it describes any disparity in outcomes.

+
import pandas as pd
+
+df = pd.read_csv("Benefits Denial/adult.csv")
+df["high_income"] = (df["income"] == ">50K").astype(int)
+
+
+def sex_gap(frame):
+    male = frame.loc[frame["sex"] == "Male", "high_income"].mean()
+    female = frame.loc[frame["sex"] == "Female", "high_income"].mean()
+    return male, female, male - female
+
+
+print("aggregate:", sex_gap(df))
+# (0.3057, 0.1095, 0.1962)
+
+married = df[df["marital.status"] == "Married-civ-spouse"]
+print("married-civ-spouse:", sex_gap(married))
+# (0.4458, 0.4550, -0.0092)  <- sign reversed
+

Detection Code

+

The following module compares a rate gap computed in aggregate against the same gap computed within each stratum of a chosen variable, and reports whether the aggregate sign matches the strata, whether it is inflated, or whether it reverses.

+
import numpy as np
+import pandas as pd
+
+
+def simpsons_check(
+    df: pd.DataFrame,
+    outcome_col: str,
+    group_col: str,
+    advantaged: str,
+    disadvantaged: str,
+    stratify_col: str,
+    min_stratum_size: int = 100,
+    min_group_in_stratum: int = 30,
+) -> dict:
+    """
+    Compare the (advantaged - disadvantaged) outcome-rate gap in aggregate
+    against the same gap within each stratum of stratify_col.
+
+    outcome_col must be 0/1. Returns a dict with the aggregate gap, a table
+    of per-stratum gaps (sample-size weighted), the weighted-average
+    within-stratum gap, and a verdict:
+
+      "consistent"        aggregate agrees in sign and rough size with strata
+      "inflated"          same sign, but |aggregate| far exceeds the weighted
+                          within-stratum gap (aggregation is amplifying it)
+      "sign_reversal"     aggregate sign is opposite the weighted within gap,
+                          or opposite the majority of strata by sample size
+    """
+    d = df[[outcome_col, group_col, stratify_col]].dropna()
+    d = d[d[group_col].isin([advantaged, disadvantaged])]
+
+    def gap(frame):
+        a = frame.loc[frame[group_col] == advantaged, outcome_col]
+        b = frame.loc[frame[group_col] == disadvantaged, outcome_col]
+        if len(a) == 0 or len(b) == 0:
+            return np.nan, len(a), len(b)
+        return a.mean() - b.mean(), len(a), len(b)
+
+    agg_gap, n_adv, n_dis = gap(d)
+
+    rows = []
+    for value, sub in d.groupby(stratify_col):
+        if len(sub) < min_stratum_size:
+            continue
+        g, na, nb = gap(sub)
+        if np.isnan(g) or min(na, nb) < min_group_in_stratum:
+            continue
+        rows.append({"stratum": value, "n": len(sub), "gap": g,
+                     "n_advantaged": na, "n_disadvantaged": nb})
+
+    strata = pd.DataFrame(rows).sort_values("n", ascending=False)
+    if strata.empty:
+        return {"verdict": "insufficient_data", "aggregate_gap": agg_gap,
+                "strata": strata}
+
+    weights = strata["n"] / strata["n"].sum()
+    weighted_within_gap = float((strata["gap"] * weights).sum())
+
+    same_sign = np.sign(agg_gap) == np.sign(weighted_within_gap)
+    majority_n_opposite = strata.loc[
+        np.sign(strata["gap"]) != np.sign(agg_gap), "n"
+    ].sum() > strata["n"].sum() / 2
+
+    if not same_sign or majority_n_opposite:
+        verdict = "sign_reversal"
+    elif abs(agg_gap) > 2 * abs(weighted_within_gap) + 0.05:
+        verdict = "inflated"
+    else:
+        verdict = "consistent"
+
+    return {
+        "verdict": verdict,
+        "aggregate_gap": float(agg_gap),
+        "weighted_within_stratum_gap": weighted_within_gap,
+        "n_advantaged": int(n_adv),
+        "n_disadvantaged": int(n_dis),
+        "strata": strata.reset_index(drop=True),
+    }
+
+
+def print_simpsons_report(result: dict) -> None:
+    print(f"Verdict: {result['verdict']}")
+    print(f"  aggregate gap (adv - dis):       {result['aggregate_gap']:+.4f}")
+    if "weighted_within_stratum_gap" in result:
+        print(f"  weighted within-stratum gap:     "
+              f"{result['weighted_within_stratum_gap']:+.4f}")
+        print("\n  per-stratum gaps (largest first):")
+        for _, row in result["strata"].iterrows():
+            flip = "  <- opposite sign" if (
+                np.sign(row["gap"]) != np.sign(result["aggregate_gap"])
+            ) else ""
+            print(f"    {str(row['stratum'])[:24]:24s} "
+                  f"n={int(row['n']):6d}  gap={row['gap']:+.4f}{flip}")
+
+
+# Usage on the Benefits Denial audit:
+# import pandas as pd
+# df = pd.read_csv("Benefits Denial/adult.csv")
+# df["high_income"] = (df["income"] == ">50K").astype(int)
+# print_simpsons_report(simpsons_check(
+#     df, "high_income", "sex", "Male", "Female", "marital.status"))
+

Run against Benefits Denial/adult.csv with stratify_col="marital.status", this reports sign_reversal: the aggregate +0.196 gap is opposite in sign to the Married-civ-spouse stratum, which by itself is a plurality of the sample.

+

Limitations and Trade-offs

+

1. There is no single correct level of aggregation

+

Simpson's Paradox flags a disagreement; it does not adjudicate it. Whether the aggregate or the within-stratum view is the "real" fairness finding depends on whether the stratifying variable is a legitimate explanation for the outcome difference or is itself part of the discrimination. Conditioning on a variable that is a proxy for the protected attribute launders the disparity away (see Proxy Variables); conditioning on a genuinely exogenous factor removes a confound. That judgment is normative and domain-specific, not statistical.

+

2. Choosing the stratifying variable is a modeling decision

+

You will not find a reversal for every variable. The detection code above tests one variable at a time; running it across many candidate strata invites finding a reversal by chance, especially with small strata. A reported reversal is only meaningful for a variable there is an independent reason to care about.

+

3. Small strata produce unstable per-group rates

+

Disaggregation shrinks sample sizes fast. A stratum where one group has 30 members will have a within-stratum rate with a wide confidence interval, and its "gap" can flip sign across dataset splits from noise alone. The min_group_in_stratum guard mitigates but does not eliminate this.

+

4. Continuous confounders need binning, and the bins matter

+

The example used a categorical stratifier. For a continuous confounder (age, income, tenure) you have to choose bin edges, and coarse or misaligned bins can hide a reversal that finer bins would show, or manufacture one. Report the binning alongside the result.

+ + + +
  • Benefits Denial/ - the Adult Census Income audit used above; the aggregate sex income gap is roughly five times any within-marital-status gap and reverses inside the largest stratum.
  • Healthcare Readmission/ - a multi-hospital readmission audit where per-facility case mix is a natural stratifier for an aggregate readmission-rate gap.
+

Further Reading

+ +
+

Part of The Fair Code Project - exposing and fixing algorithmic bias with real data and open code.

+
+ + + + diff --git a/explainers/simpsons-paradox.md b/explainers/simpsons-paradox.md new file mode 100644 index 0000000..117200c --- /dev/null +++ b/explainers/simpsons-paradox.md @@ -0,0 +1,239 @@ +# What Is Simpson's Paradox in Fairness Audits? + +> *A model can look fair in aggregate while every disaggregated subgroup shows the opposite pattern, or look unfair in aggregate when no subgroup does - because pooling groups of different sizes and base rates lets the mix, not the model, drive the headline number.* + +## The One-Sentence Definition + +**Simpson's Paradox** is a statistical phenomenon in which a trend or association that holds within every subgroup of the data reverses, disappears, or appears out of nowhere once the subgroups are combined into a single aggregate, because the subgroups differ in size and in their baseline rates. + +## Why It Matters + +Almost every fairness metric in this repo is a single aggregate number: one `demographic_parity_diff`, one selection-rate gap, one accuracy-equality figure per audit. That number is computed by pooling every row for a protected group and comparing the pooled rate to another group's pooled rate. + +Pooling is not neutral. When a protected group is distributed differently across the strata of some other variable - an occupation, a marital status, a loan product, a hospital - than the comparison group is, the aggregate comparison silently reweights those strata. The result is a headline gap that can be several times larger than any gap that actually exists within a stratum, can point the opposite direction from every stratum, or can vanish entirely. + +This is distinct from [intersectional bias](intersectional-bias.md), which is about a compounding gap that only appears at the *intersection* of two attributes and is hidden when you check one attribute at a time. Simpson's Paradox is the reverse direction: a gap that appears (or flips) in the *aggregate* and is not present, or is present with the opposite sign, once you disaggregate. Both are failures of looking at the data at the wrong level, but they pull in opposite directions, and a serious audit has to check for both. + +Simpson's Paradox does not tell you which view is correct. It only tells you that the aggregate and the disaggregated pictures disagree, which means the aggregate number alone cannot be trusted as a fairness finding without knowing why they disagree. + +## How It Works + +Let `Y` be a binary outcome (1 = the favorable outcome), `G` a protected group, and `S` a stratifying variable with levels `s`. The aggregate rate for a group is a weighted average of its within-stratum rates, where the weights are how that group is distributed across strata: + +``` +P(Y = 1 | G = g) = sum over s of P(S = s | G = g) * P(Y = 1 | G = g, S = s) +``` + +Two things vary between groups in that sum: the within-stratum rates `P(Y = 1 | G = g, S = s)`, and the stratum weights `P(S = s | G = g)`. The aggregate gap between two groups blends both. If the weights differ enough, the weight term can dominate and the aggregate gap stops reflecting the within-stratum rates at all. + +### A minimal reversal + +Consider a hiring screen with two departments. Within each department the callback rate for Group A is higher than for Group B: + +| Department | Group A callbacks | Group B callbacks | +|---|---|---| +| Engineering (easy to pass) | 70 / 80 = **87.5%** | 18 / 20 = **90.0%** | +| Design (hard to pass) | 2 / 20 = **10.0%** | 8 / 80 = **10.0%** | +| **Pooled** | 72 / 100 = **72.0%** | 26 / 100 = **26.0%** | + +Within Engineering, Group B does slightly better (90.0% vs 87.5%); within Design the two are tied (10.0% vs 10.0%). Neither department favors Group A. Yet the pooled rate shows Group A ahead by 46 points, because 80% of Group A's applicants are in the high-callback department and 80% of Group B's are in the low-callback one. The pooled 46-point "gap" is entirely a fact about where each group applied, not about how either group was treated inside a department. + +## Concrete Example: Benefits Denial - Audit 04 + +`Benefits Denial/` audits the Adult Census Income dataset (`adult.csv`, 32,561 rows), where the target is `income == '>50K'` and `sex` is a declared protected attribute. These are the dataset's own outcome rates (not a model's predictions), which is the base rate a demographic-parity check on the labels compares. + +**Aggregate:** + +| Group | n | P(income > 50K) | +|---|---:|---:| +| Male | 21,790 | **30.6%** | +| Female | 10,771 | **11.0%** | +| Gap (M - F) | | **+19.6 pp** | + +Now stratify by `marital.status`. The single largest stratum, `Married-civ-spouse`, holds 14,976 rows - 46% of the entire dataset: + +| Stratum | Male n | Male rate | Female n | Female rate | Gap (M - F) | +|---|---:|---:|---:|---:|---:| +| Married-civ-spouse | 13,319 | 44.6% | 1,657 | 45.5% | **-0.9 pp** | +| Never-married | 5,916 | 5.5% | 4,767 | 3.5% | +2.0 pp | +| Divorced | 1,771 | 16.0% | 2,672 | 6.7% | +9.3 pp | +| Widowed | 168 | 23.2% | 825 | 5.6% | +17.6 pp | +| Separated | 394 | 12.4% | 631 | 2.7% | +9.8 pp | + +Collapsed to just married vs not-married, the gap shrinks from +19.6 pp to **+3.0 pp** (married) and **+3.9 pp** (not married). And inside `Married-civ-spouse` - nearly half the data - the sign **reverses**: women are 0.9 points ahead. + +The mechanism is the stratum weights. Women are 52% of the "not married" pool, which has an overall high-income rate of 6.5%, but only 12% of the "married" pool, which has an overall rate of 43.7%. The aggregate comparison places most men in the high-earning stratum and splits women toward the low-earning one, so roughly 16 of the 19.6 aggregate points come from *where* each group sits, not from a within-stratum difference in outcome rates. + +Whether `marital.status` is a legitimate thing to condition on here is a separate, normative question - see [Conditional Demographic Parity](conditional-demographic-parity.md) and the Limitations section below. The point Simpson's Paradox makes is narrower: the +19.6 pp aggregate figure, reported on its own, describes the dataset's composition at least as much as it describes any disparity in outcomes. + +```python +import pandas as pd + +df = pd.read_csv("Benefits Denial/adult.csv") +df["high_income"] = (df["income"] == ">50K").astype(int) + + +def sex_gap(frame): + male = frame.loc[frame["sex"] == "Male", "high_income"].mean() + female = frame.loc[frame["sex"] == "Female", "high_income"].mean() + return male, female, male - female + + +print("aggregate:", sex_gap(df)) +# (0.3057, 0.1095, 0.1962) + +married = df[df["marital.status"] == "Married-civ-spouse"] +print("married-civ-spouse:", sex_gap(married)) +# (0.4458, 0.4550, -0.0092) <- sign reversed +``` + +## Detection Code + +The following module compares a rate gap computed in aggregate against the same gap computed within each stratum of a chosen variable, and reports whether the aggregate sign matches the strata, whether it is inflated, or whether it reverses. + +```python +import numpy as np +import pandas as pd + + +def simpsons_check( + df: pd.DataFrame, + outcome_col: str, + group_col: str, + advantaged: str, + disadvantaged: str, + stratify_col: str, + min_stratum_size: int = 100, + min_group_in_stratum: int = 30, +) -> dict: + """ + Compare the (advantaged - disadvantaged) outcome-rate gap in aggregate + against the same gap within each stratum of stratify_col. + + outcome_col must be 0/1. Returns a dict with the aggregate gap, a table + of per-stratum gaps (sample-size weighted), the weighted-average + within-stratum gap, and a verdict: + + "consistent" aggregate agrees in sign and rough size with strata + "inflated" same sign, but |aggregate| far exceeds the weighted + within-stratum gap (aggregation is amplifying it) + "sign_reversal" aggregate sign is opposite the weighted within gap, + or opposite the majority of strata by sample size + """ + d = df[[outcome_col, group_col, stratify_col]].dropna() + d = d[d[group_col].isin([advantaged, disadvantaged])] + + def gap(frame): + a = frame.loc[frame[group_col] == advantaged, outcome_col] + b = frame.loc[frame[group_col] == disadvantaged, outcome_col] + if len(a) == 0 or len(b) == 0: + return np.nan, len(a), len(b) + return a.mean() - b.mean(), len(a), len(b) + + agg_gap, n_adv, n_dis = gap(d) + + rows = [] + for value, sub in d.groupby(stratify_col): + if len(sub) < min_stratum_size: + continue + g, na, nb = gap(sub) + if np.isnan(g) or min(na, nb) < min_group_in_stratum: + continue + rows.append({"stratum": value, "n": len(sub), "gap": g, + "n_advantaged": na, "n_disadvantaged": nb}) + + strata = pd.DataFrame(rows).sort_values("n", ascending=False) + if strata.empty: + return {"verdict": "insufficient_data", "aggregate_gap": agg_gap, + "strata": strata} + + weights = strata["n"] / strata["n"].sum() + weighted_within_gap = float((strata["gap"] * weights).sum()) + + same_sign = np.sign(agg_gap) == np.sign(weighted_within_gap) + majority_n_opposite = strata.loc[ + np.sign(strata["gap"]) != np.sign(agg_gap), "n" + ].sum() > strata["n"].sum() / 2 + + if not same_sign or majority_n_opposite: + verdict = "sign_reversal" + elif abs(agg_gap) > 2 * abs(weighted_within_gap) + 0.05: + verdict = "inflated" + else: + verdict = "consistent" + + return { + "verdict": verdict, + "aggregate_gap": float(agg_gap), + "weighted_within_stratum_gap": weighted_within_gap, + "n_advantaged": int(n_adv), + "n_disadvantaged": int(n_dis), + "strata": strata.reset_index(drop=True), + } + + +def print_simpsons_report(result: dict) -> None: + print(f"Verdict: {result['verdict']}") + print(f" aggregate gap (adv - dis): {result['aggregate_gap']:+.4f}") + if "weighted_within_stratum_gap" in result: + print(f" weighted within-stratum gap: " + f"{result['weighted_within_stratum_gap']:+.4f}") + print("\n per-stratum gaps (largest first):") + for _, row in result["strata"].iterrows(): + flip = " <- opposite sign" if ( + np.sign(row["gap"]) != np.sign(result["aggregate_gap"]) + ) else "" + print(f" {str(row['stratum'])[:24]:24s} " + f"n={int(row['n']):6d} gap={row['gap']:+.4f}{flip}") + + +# Usage on the Benefits Denial audit: +# import pandas as pd +# df = pd.read_csv("Benefits Denial/adult.csv") +# df["high_income"] = (df["income"] == ">50K").astype(int) +# print_simpsons_report(simpsons_check( +# df, "high_income", "sex", "Male", "Female", "marital.status")) +``` + +Run against `Benefits Denial/adult.csv` with `stratify_col="marital.status"`, this reports `sign_reversal`: the aggregate `+0.196` gap is opposite in sign to the `Married-civ-spouse` stratum, which by itself is a plurality of the sample. + +## Limitations and Trade-offs + +### 1. There is no single correct level of aggregation + +Simpson's Paradox flags a disagreement; it does not adjudicate it. Whether the aggregate or the within-stratum view is the "real" fairness finding depends on whether the stratifying variable is a legitimate explanation for the outcome difference or is itself part of the discrimination. Conditioning on a variable that is a proxy for the protected attribute launders the disparity away (see [Proxy Variables](proxy-variables.md)); conditioning on a genuinely exogenous factor removes a confound. That judgment is normative and domain-specific, not statistical. + +### 2. Choosing the stratifying variable is a modeling decision + +You will not find a reversal for every variable. The detection code above tests one variable at a time; running it across many candidate strata invites finding a reversal by chance, especially with small strata. A reported reversal is only meaningful for a variable there is an independent reason to care about. + +### 3. Small strata produce unstable per-group rates + +Disaggregation shrinks sample sizes fast. A stratum where one group has 30 members will have a within-stratum rate with a wide confidence interval, and its "gap" can flip sign across dataset splits from noise alone. The `min_group_in_stratum` guard mitigates but does not eliminate this. + +### 4. Continuous confounders need binning, and the bins matter + +The example used a categorical stratifier. For a continuous confounder (age, income, tenure) you have to choose bin edges, and coarse or misaligned bins can hide a reversal that finer bins would show, or manufacture one. Report the binning alongside the result. + +## Related Concepts + +* [What Is Intersectional Bias?](intersectional-bias.md) - the opposite failure: a compounding gap visible only at the intersection of two attributes, hidden when each is checked alone. +* [What Is Conditional Demographic Parity?](conditional-demographic-parity.md) - the fairness metric built specifically around checking parity *within* strata of a chosen legitimate factor. +* [What Is a Confounding Variable?](confounding-variable.md) - the underlying causal structure that makes Simpson's reversals possible. +* [What Is the Base Rate Fallacy?](base-rate-fallacy.md) - a related error about ignoring prior probabilities when reading a conditional rate. +* [What Is a Proxy Variable?](proxy-variables.md) - why conditioning on the wrong variable can hide real discrimination instead of explaining it. + +## Related Projects in This Repo + +* [`Benefits Denial/`](../Benefits%20Denial/) - the Adult Census Income audit used above; the aggregate `sex` income gap is roughly five times any within-marital-status gap and reverses inside the largest stratum. +* [`Healthcare Readmission/`](../Healthcare%20Readmission/) - a multi-hospital readmission audit where per-facility case mix is a natural stratifier for an aggregate readmission-rate gap. + +## Further Reading + +* [Bickel, P. J., Hammel, E. A., O'Connell, J. W. (1975): Sex Bias in Graduate Admissions: Data from Berkeley, *Science*, 187(4175), 398-404](https://www.science.org/doi/10.1126/science.187.4175.398) - the canonical worked example: Berkeley's aggregate admit rate favored men, but department by department it did not. +* [Simpson, E. H. (1951): The Interpretation of Interaction in Contingency Tables, *Journal of the Royal Statistical Society B*, 13(2), 238-241](https://www.jstor.org/stable/2984065) - the paper the effect is named after. +* [Pearl, J. (2014): Comment: Understanding Simpson's Paradox, *The American Statistician*, 68(1), 8-13](https://ftp.cs.ucla.edu/pub/stat_ser/r414.pdf) - why the paradox is a causal question, not a statistical one, and why no purely statistical rule resolves it. + +--- + +*Part of [The Fair Code Project](https://instagram.com/thefaircodeproject) - exposing and fixing algorithmic bias with real data and open code.* diff --git a/explainers/subgroup-fairness.html b/explainers/subgroup-fairness.html new file mode 100644 index 0000000..7779c88 --- /dev/null +++ b/explainers/subgroup-fairness.html @@ -0,0 +1,348 @@ + + + + + +What Is Subgroup Fairness (and Fairness Gerrymandering)? ยท Fair Code + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
Explainer
+

What Is Subgroup Fairness (and Fairness Gerrymandering)?

+

Passing a fairness check on every attribute separately is not the same as passing it on every combination.

+

Learn how a model can satisfy a fairness metric on each protected attribute individually yet fail on an algorithmically-discoverable subgroup, and how a brute-force subgroup scan differs from this repo's fixed-pair --cross. Uses the Healthcare Readmission audit: the gender readmission gap is 0.19 pp overall but -5.15 pp inside the Asian patient subgroup.

+
+ +

What Is Subgroup Fairness (and Fairness Gerrymandering)?

+

A model can pass a fairness check on race, pass it on sex, pass it on age, and still fail badly on some combination like "women over 50 in a particular region" that nobody thought to check by hand. Subgroup fairness is what you get when you stop hand-picking the groups and search for the one where the guarantee breaks.

+

The One-Sentence Definition

+

Subgroup fairness requires a fairness metric to hold not just on each protected attribute checked individually, but across a large, structured class of subgroups defined by combinations of attributes and features - and fairness gerrymandering is the failure mode where a model satisfies every marginal check while hiding a large disparity inside one of those combinations.

+

Why It Matters

+

Checking race, then sex, then age separately gives you three guarantees, one per axis. Adding a hand-chosen pair, the way this repo's --cross flag does for a single intersection (SPEC section 4), gives you a fourth. None of that is the same as a guarantee over every combinatorially definable subgroup.

+

The gap between "fair on each attribute I checked" and "fair on every subgroup" is exploitable, and not only by an adversary. A model trained to minimize a marginal fairness violation - equalize selection rates by race, and by sex - has no incentive to equalize them for race x sex x age-band cells it was never scored on. It can push the disparity into those cells precisely because doing so is invisible to the marginal metrics. Kearns et al. (2018) named this fairness gerrymandering, by analogy to how an oddly shaped electoral district can hide a population imbalance that looks fine at the state level.

+

This is the more general, adversarial version of intersectional bias. Intersectional bias is about checking one specific human-chosen pair (Black women, say) and finding a compounding gap. Subgroup fairness replaces "the pair a human picked" with "an automated search over a whole hypothesis class of subgroups" - for example, every group definable by a linear threshold over the features - looking for the subgroup where a fairness constraint is violated by the most.

+

How It Works

+

Fix a fairness metric - selection rate, false positive rate, whatever the audit uses. For a subgroup g (a subset of the population picked out by some rule over attributes and features), define its violation as how far that metric inside g sits from the population value:

+
violation(g) = | metric(g) - metric(overall) |   weighted by how large g is
+

Marginal fairness only bounds violation(g) for g in a short list: g = {race = A}, g = {sex = F}, and so on. Subgroup fairness bounds it for g in a much larger class G - all subgroups definable by a rule of a chosen form (conjunctions of a few attributes, or a linear threshold over features).

+

You cannot enumerate G when it is large, so the audit is framed as a search: an auditor tries to find the g in G with the biggest violation; if it finds one above a threshold, the model fails. Kearns et al. formalize this as a two-player game between a learner (trying to build a model with no high-violation subgroup) and an auditor (trying to find one). The practical brute-force version, for a small feature set, is just: enumerate every combination of a few columns' values and check the metric in each cell.

+

The reason this is worth doing rather than just checking more pairs by hand: the number of subgroups grows combinatorially, and the worst one is rarely the one an auditor would have guessed.

+

Concrete Example: Healthcare Readmission - Audit 06

+

Healthcare Readmission/ audits the UCI diabetes 130-hospitals dataset (diabetic_data.csv, 101,766 encounters). The target is readmitted == '<30' (readmission within 30 days), and gender, race, and age are declared protected attributes. Using the dataset's own readmission rates (the base rate a label-level demographic parity check compares):

+

Marginal check on gender - passes:

+
GroupnReadmit < 30
Female54,70811.25%
Male47,05511.06%
Gap0.19 pp (ratio 0.984)
+

A 0.19-point gap clears the EEOC four-fifths rule (ratio 0.984, well above 0.80) and any reasonable demographic parity tolerance. On the gender axis alone, this dataset looks clean.

+

Now gender x race - the gender gap inside each race stratum:

+
RaceFemale rateMale rateGender gap (F - M)Subgroup n
Caucasian11.49%11.07%+0.42 pp76,099
AfricanAmerican11.08%11.43%-0.34 pp19,210
Hispanic9.16%11.85%-2.69 pp2,037
Asian7.55%12.69%-5.15 pp641
+

Among Asian patients, women are readmitted at 7.55% and men at 12.69% - a 5.15-point gap and a four-fifths ratio of 0.595, a clear violation, pointing the opposite direction from the (negligible) marginal gender gap. Among Hispanic patients the gender gap is -2.69 pp, also a reversal and also larger than the marginal. The gender guarantee that held at the population level does not hold once you condition on race, and no single-attribute check would have surfaced that.

+

Two honest caveats, both of which the Limitations section expands:

+
  • The Asian subgroup has n = 641. That is above this repo's default min_group_size of 100, but small enough that a 5-point rate is not a precise estimate - exactly the case this repo's small-sample warnings exist for.
  • This is on raw labels, not model predictions. The gerrymandering concern is strongest for a model that was optimized against marginal fairness metrics; a raw-label reversal like this is evidence that the phenomenon is present in the data the models are trained on.
+

This repo's --cross flag (or the MCP profile_dataset cross option) computes exactly one such pairwise combination - the specific pair you name. It does not perform an open-ended search. Subgroup fairness is what you would need on top of it: a scan over many candidate subgroups, not one.

+
import pandas as pd
+
+df = pd.read_csv("Healthcare Readmission/diabetic_data.csv", low_memory=False)
+df["y"] = (df["readmitted"] == "<30").astype(int)
+
+# marginal gender check - looks fine
+by_sex = df.groupby("gender")["y"].mean()
+print(by_sex["Female"] - by_sex["Male"])          # +0.0019
+
+# the same gap inside the Asian stratum - a 5-point violation
+asian = df[df["race"] == "Asian"]
+by_sex_asian = asian.groupby("gender")["y"].mean()
+print(by_sex_asian["Female"] - by_sex_asian["Male"])   # -0.0515
+

Detection Code

+

The following module runs a brute-force subgroup scan: it enumerates every combination of values over a chosen set of columns, computes a rate metric inside each cell, and reports the cells whose deviation from the population rate exceeds a threshold - the manual, small-feature-set version of an auditor. It is contrasted with the single fixed pair --cross checks.

+
import itertools
+
+import numpy as np
+import pandas as pd
+
+
+def subgroup_scan(
+    df: pd.DataFrame,
+    outcome_col: str,
+    subgroup_cols: list[str],
+    max_depth: int = 2,
+    min_subgroup_size: int = 100,
+    deviation_threshold: float = 0.05,
+) -> pd.DataFrame:
+    """
+    Brute-force fairness-gerrymandering audit over subgroups defined by
+    conjunctions of up to max_depth of the subgroup_cols.
+
+    outcome_col must be 0/1. For every conjunction (col_a = v_a AND col_b = v_b
+    AND ...) with at least min_subgroup_size rows, computes:
+      rate            P(outcome = 1) inside the subgroup
+      deviation       rate - overall_rate
+      four_fifths     min(rate, overall) / max(rate, overall)
+    and returns the subgroups whose |deviation| >= deviation_threshold,
+    sorted by a size-weighted deviation so a large, badly-off subgroup ranks
+    above a tiny one.
+
+    This is exhaustive only because subgroup_cols is small. A real subgroup-
+    fairness auditor searches a parameterized hypothesis class (e.g. linear
+    thresholds over features) instead of enumerating cells - see Kearns et
+    al. (2018).
+    """
+    overall = df[outcome_col].mean()
+    n_total = len(df)
+    results = []
+
+    for depth in range(1, max_depth + 1):
+        for cols in itertools.combinations(subgroup_cols, depth):
+            grouped = df.groupby(list(cols))[outcome_col].agg(["mean", "count"])
+            for key, row in grouped.iterrows():
+                if row["count"] < min_subgroup_size:
+                    continue
+                rate = row["mean"]
+                deviation = rate - overall
+                ff = (min(rate, overall) / max(rate, overall)
+                      if max(rate, overall) > 0 else np.nan)
+                results.append({
+                    "subgroup": dict(zip(cols, key if depth > 1 else (key,))),
+                    "n": int(row["count"]),
+                    "rate": float(rate),
+                    "deviation": float(deviation),
+                    "four_fifths_ratio": float(ff),
+                    "weighted_deviation": abs(deviation) * (row["count"] / n_total),
+                })
+
+    out = pd.DataFrame(results)
+    if out.empty:
+        return out
+    flagged = out[out["deviation"].abs() >= deviation_threshold]
+    return flagged.sort_values("weighted_deviation", ascending=False).reset_index(drop=True)
+
+
+def compare_to_fixed_cross(df, outcome_col, pair):
+    """What this repo's --cross gives you: the metric for that ONE pair,
+    every cell, no search, no ranking by violation."""
+    return df.groupby(list(pair))[outcome_col].agg(["mean", "count"]).round(4)
+
+
+# Usage on the Healthcare Readmission audit:
+# import pandas as pd
+# df = pd.read_csv("Healthcare Readmission/diabetic_data.csv", low_memory=False)
+# df["y"] = (df["readmitted"] == "<30").astype(int)
+# print(subgroup_scan(df, "y", ["gender", "race", "age"], max_depth=2))
+# # the gender x race = (Asian, Female) cell surfaces with deviation ~ -0.036
+

Limitations and Trade-offs

+

1. A full combinatorial search is expensive and overfits noise

+

Enumerating every conjunction of k columns is exponential in k, and the search rewards finding the most extreme cell - which, for small subgroups, is often the noisiest one rather than the most unfair one. This repo's min_group_size default (100) and its "small group (metric may be unreliable)" warnings exist for exactly this reason. A flagged subgroup with 60 members and a 15-point deviation may be sampling noise; the same deviation at n = 5,000 is a finding.

+

2. The hypothesis class is a design choice, and it bounds what you can catch

+

An auditor that searches conjunctions of categorical attributes will not find a gerrymandered group defined by a linear threshold over continuous features, and vice versa. "Subgroup fair with respect to class G" is only as strong as G is expressive, and a richer G costs more compute and overfits harder.

+

3. Passing a subgroup audit is not the same as being fair

+

Kearns et al.'s guarantee is that no subgroup in the searched class has a large violation. A disparity that lives in a subgroup outside the class, or that only appears under a different metric, is still invisible. Subgroup fairness widens the net; it does not make it infinite.

+

4. Fixing a flagged subgroup can move the disparity, not remove it

+

Constraining the model to equalize a metric inside a discovered subgroup can push the imbalance into an adjacent, not-yet-searched subgroup - the same whack-a-mole that motivates the learner-auditor game in the first place. Iterating the game to convergence is the intended fix; a one-shot patch of the worst cell is not.

+ + + +
  • Healthcare Readmission/ - the audit above; gender is clean marginally but the gender gap reaches -5 pp inside the Asian stratum.
  • COMPAS/ - --cross race age on this audit is a single fixed intersection; a subgroup scan would search race, sex, age, and custody-status combinations at once.
+

Further Reading

+ +
+

Part of The Fair Code Project - exposing and fixing algorithmic bias with real data and open code.

+
+ + + + diff --git a/explainers/subgroup-fairness.md b/explainers/subgroup-fairness.md new file mode 100644 index 0000000..92f4582 --- /dev/null +++ b/explainers/subgroup-fairness.md @@ -0,0 +1,199 @@ +# What Is Subgroup Fairness (and Fairness Gerrymandering)? + +> *A model can pass a fairness check on race, pass it on sex, pass it on age, and still fail badly on some combination like "women over 50 in a particular region" that nobody thought to check by hand. Subgroup fairness is what you get when you stop hand-picking the groups and search for the one where the guarantee breaks.* + +## The One-Sentence Definition + +**Subgroup fairness** requires a fairness metric to hold not just on each protected attribute checked individually, but across a large, structured class of subgroups defined by combinations of attributes and features - and **fairness gerrymandering** is the failure mode where a model satisfies every marginal check while hiding a large disparity inside one of those combinations. + +## Why It Matters + +Checking `race`, then `sex`, then `age` separately gives you three guarantees, one per axis. Adding a hand-chosen pair, the way this repo's `--cross` flag does for a single intersection (SPEC section 4), gives you a fourth. None of that is the same as a guarantee over *every* combinatorially definable subgroup. + +The gap between "fair on each attribute I checked" and "fair on every subgroup" is exploitable, and not only by an adversary. A model trained to minimize a marginal fairness violation - equalize selection rates by race, and by sex - has no incentive to equalize them for `race x sex x age-band` cells it was never scored on. It can push the disparity into those cells precisely because doing so is invisible to the marginal metrics. Kearns et al. (2018) named this **fairness gerrymandering**, by analogy to how an oddly shaped electoral district can hide a population imbalance that looks fine at the state level. + +This is the more general, adversarial version of [intersectional bias](intersectional-bias.md). Intersectional bias is about checking one specific human-chosen pair (Black women, say) and finding a compounding gap. Subgroup fairness replaces "the pair a human picked" with "an automated search over a whole hypothesis class of subgroups" - for example, every group definable by a linear threshold over the features - looking for the subgroup where a fairness constraint is violated by the most. + +## How It Works + +Fix a fairness metric - selection rate, false positive rate, whatever the audit uses. For a subgroup `g` (a subset of the population picked out by some rule over attributes and features), define its violation as how far that metric inside `g` sits from the population value: + +``` +violation(g) = | metric(g) - metric(overall) | weighted by how large g is +``` + +Marginal fairness only bounds `violation(g)` for `g` in a short list: `g = {race = A}`, `g = {sex = F}`, and so on. Subgroup fairness bounds it for `g` in a much larger class `G` - all subgroups definable by a rule of a chosen form (conjunctions of a few attributes, or a linear threshold over features). + +You cannot enumerate `G` when it is large, so the audit is framed as a search: an **auditor** tries to find the `g` in `G` with the biggest violation; if it finds one above a threshold, the model fails. Kearns et al. formalize this as a two-player game between a learner (trying to build a model with no high-violation subgroup) and an auditor (trying to find one). The practical brute-force version, for a small feature set, is just: enumerate every combination of a few columns' values and check the metric in each cell. + +The reason this is worth doing rather than just checking more pairs by hand: the number of subgroups grows combinatorially, and the worst one is rarely the one an auditor would have guessed. + +## Concrete Example: Healthcare Readmission - Audit 06 + +`Healthcare Readmission/` audits the UCI diabetes 130-hospitals dataset (`diabetic_data.csv`, 101,766 encounters). The target is `readmitted == '<30'` (readmission within 30 days), and `gender`, `race`, and `age` are declared protected attributes. Using the dataset's own readmission rates (the base rate a label-level demographic parity check compares): + +**Marginal check on `gender` - passes:** + +| Group | n | Readmit < 30 | +|---|---:|---:| +| Female | 54,708 | 11.25% | +| Male | 47,055 | 11.06% | +| Gap | | 0.19 pp (ratio 0.984) | + +A 0.19-point gap clears the EEOC four-fifths rule (ratio 0.984, well above 0.80) and any reasonable demographic parity tolerance. On the `gender` axis alone, this dataset looks clean. + +**Now `gender x race` - the gender gap inside each race stratum:** + +| Race | Female rate | Male rate | Gender gap (F - M) | Subgroup n | +|---|---:|---:|---:|---:| +| Caucasian | 11.49% | 11.07% | +0.42 pp | 76,099 | +| AfricanAmerican | 11.08% | 11.43% | -0.34 pp | 19,210 | +| Hispanic | 9.16% | 11.85% | **-2.69 pp** | 2,037 | +| Asian | 7.55% | 12.69% | **-5.15 pp** | 641 | + +Among Asian patients, women are readmitted at 7.55% and men at 12.69% - a 5.15-point gap and a four-fifths ratio of 0.595, a clear violation, pointing the opposite direction from the (negligible) marginal gender gap. Among Hispanic patients the gender gap is -2.69 pp, also a reversal and also larger than the marginal. The `gender` guarantee that held at the population level does not hold once you condition on race, and no single-attribute check would have surfaced that. + +Two honest caveats, both of which the Limitations section expands: + +- The Asian subgroup has n = 641. That is above this repo's default `min_group_size` of 100, but small enough that a 5-point rate is not a precise estimate - exactly the case this repo's small-sample warnings exist for. +- This is on raw labels, not model predictions. The gerrymandering concern is strongest for a *model* that was optimized against marginal fairness metrics; a raw-label reversal like this is evidence that the phenomenon is present in the data the models are trained on. + +This repo's `--cross` flag (or the MCP `profile_dataset` `cross` option) computes exactly one such pairwise combination - the specific pair you name. It does not perform an open-ended search. Subgroup fairness is what you would need on top of it: a scan over many candidate subgroups, not one. + +```python +import pandas as pd + +df = pd.read_csv("Healthcare Readmission/diabetic_data.csv", low_memory=False) +df["y"] = (df["readmitted"] == "<30").astype(int) + +# marginal gender check - looks fine +by_sex = df.groupby("gender")["y"].mean() +print(by_sex["Female"] - by_sex["Male"]) # +0.0019 + +# the same gap inside the Asian stratum - a 5-point violation +asian = df[df["race"] == "Asian"] +by_sex_asian = asian.groupby("gender")["y"].mean() +print(by_sex_asian["Female"] - by_sex_asian["Male"]) # -0.0515 +``` + +## Detection Code + +The following module runs a brute-force subgroup scan: it enumerates every combination of values over a chosen set of columns, computes a rate metric inside each cell, and reports the cells whose deviation from the population rate exceeds a threshold - the manual, small-feature-set version of an auditor. It is contrasted with the single fixed pair `--cross` checks. + +```python +import itertools + +import numpy as np +import pandas as pd + + +def subgroup_scan( + df: pd.DataFrame, + outcome_col: str, + subgroup_cols: list[str], + max_depth: int = 2, + min_subgroup_size: int = 100, + deviation_threshold: float = 0.05, +) -> pd.DataFrame: + """ + Brute-force fairness-gerrymandering audit over subgroups defined by + conjunctions of up to max_depth of the subgroup_cols. + + outcome_col must be 0/1. For every conjunction (col_a = v_a AND col_b = v_b + AND ...) with at least min_subgroup_size rows, computes: + rate P(outcome = 1) inside the subgroup + deviation rate - overall_rate + four_fifths min(rate, overall) / max(rate, overall) + and returns the subgroups whose |deviation| >= deviation_threshold, + sorted by a size-weighted deviation so a large, badly-off subgroup ranks + above a tiny one. + + This is exhaustive only because subgroup_cols is small. A real subgroup- + fairness auditor searches a parameterized hypothesis class (e.g. linear + thresholds over features) instead of enumerating cells - see Kearns et + al. (2018). + """ + overall = df[outcome_col].mean() + n_total = len(df) + results = [] + + for depth in range(1, max_depth + 1): + for cols in itertools.combinations(subgroup_cols, depth): + grouped = df.groupby(list(cols))[outcome_col].agg(["mean", "count"]) + for key, row in grouped.iterrows(): + if row["count"] < min_subgroup_size: + continue + rate = row["mean"] + deviation = rate - overall + ff = (min(rate, overall) / max(rate, overall) + if max(rate, overall) > 0 else np.nan) + results.append({ + "subgroup": dict(zip(cols, key if depth > 1 else (key,))), + "n": int(row["count"]), + "rate": float(rate), + "deviation": float(deviation), + "four_fifths_ratio": float(ff), + "weighted_deviation": abs(deviation) * (row["count"] / n_total), + }) + + out = pd.DataFrame(results) + if out.empty: + return out + flagged = out[out["deviation"].abs() >= deviation_threshold] + return flagged.sort_values("weighted_deviation", ascending=False).reset_index(drop=True) + + +def compare_to_fixed_cross(df, outcome_col, pair): + """What this repo's --cross gives you: the metric for that ONE pair, + every cell, no search, no ranking by violation.""" + return df.groupby(list(pair))[outcome_col].agg(["mean", "count"]).round(4) + + +# Usage on the Healthcare Readmission audit: +# import pandas as pd +# df = pd.read_csv("Healthcare Readmission/diabetic_data.csv", low_memory=False) +# df["y"] = (df["readmitted"] == "<30").astype(int) +# print(subgroup_scan(df, "y", ["gender", "race", "age"], max_depth=2)) +# # the gender x race = (Asian, Female) cell surfaces with deviation ~ -0.036 +``` + +## Limitations and Trade-offs + +### 1. A full combinatorial search is expensive and overfits noise + +Enumerating every conjunction of `k` columns is exponential in `k`, and the search rewards finding the most extreme cell - which, for small subgroups, is often the noisiest one rather than the most unfair one. This repo's `min_group_size` default (100) and its "small group (metric may be unreliable)" warnings exist for exactly this reason. A flagged subgroup with 60 members and a 15-point deviation may be sampling noise; the same deviation at n = 5,000 is a finding. + +### 2. The hypothesis class is a design choice, and it bounds what you can catch + +An auditor that searches conjunctions of categorical attributes will not find a gerrymandered group defined by a linear threshold over continuous features, and vice versa. "Subgroup fair with respect to class G" is only as strong as G is expressive, and a richer G costs more compute and overfits harder. + +### 3. Passing a subgroup audit is not the same as being fair + +Kearns et al.'s guarantee is that no subgroup *in the searched class* has a large violation. A disparity that lives in a subgroup outside the class, or that only appears under a different metric, is still invisible. Subgroup fairness widens the net; it does not make it infinite. + +### 4. Fixing a flagged subgroup can move the disparity, not remove it + +Constraining the model to equalize a metric inside a discovered subgroup can push the imbalance into an adjacent, not-yet-searched subgroup - the same whack-a-mole that motivates the learner-auditor game in the first place. Iterating the game to convergence is the intended fix; a one-shot patch of the worst cell is not. + +## Related Concepts + +* [What Is Intersectional Bias?](intersectional-bias.md) - checking one specific, human-chosen combination of attributes; subgroup fairness is the open-ended search version. +* [What Is Individual Fairness?](individual-fairness.md) - the opposite pole: "similar individuals treated similarly" rather than any group-rate comparison. +* [What Is Simpson's Paradox in Fairness Audits?](simpsons-paradox.md) - why an aggregate rate can disagree with its disaggregated cells. +* [Why Fairness Metrics Conflict](fairness-metric-conflicts.md) - the impossibility results that also constrain what a subgroup audit can promise. +* [What Is the Base Rate Fallacy?](base-rate-fallacy.md) - why small subgroups produce volatile rate estimates. + +## Related Projects in This Repo + +* [`Healthcare Readmission/`](../Healthcare%20Readmission/) - the audit above; `gender` is clean marginally but the gender gap reaches -5 pp inside the Asian stratum. +* [`COMPAS/`](../COMPAS/) - `--cross race age` on this audit is a single fixed intersection; a subgroup scan would search race, sex, age, and custody-status combinations at once. + +## Further Reading + +* [Kearns, M., Neel, S., Roth, A., Wu, Z. S. (2018): Preventing Fairness Gerrymandering: Auditing and Learning for Subgroup Fairness, *ICML 2018* (PMLR 80)](https://arxiv.org/abs/1711.05144) - defines fairness gerrymandering and gives the learner-auditor game for auditing and enforcing subgroup fairness. +* [Kearns, M., Neel, S., Roth, A., Wu, Z. S. (2019): An Empirical Study of Rich Subgroup Fairness for Machine Learning, *FAT\* 2019*](https://arxiv.org/abs/1808.08166) - the follow-up experiments showing the method works on real datasets and what it costs. +* [Hebert-Johnson, U., Kim, M. P., Reingold, O., Rothblum, G. (2018): Multicalibration: Calibration for the (Computationally-Identifiable) Masses, *ICML 2018*](https://arxiv.org/abs/1711.08513) - a closely related guarantee (calibration, not selection rate) over a large class of subgroups. + +--- + +*Part of [The Fair Code Project](https://instagram.com/thefaircodeproject) - exposing and fixing algorithmic bias with real data and open code.* diff --git a/explainers/unsupervised-learning.html b/explainers/unsupervised-learning.html index 8ee5d13..945d73e 100644 --- a/explainers/unsupervised-learning.html +++ b/explainers/unsupervised-learning.html @@ -112,7 +112,7 @@ "url": "https://www.thefaircode.xyz/index.html#explainers" }, "datePublished": "2026-07-14", - "dateModified": "2026-07-14" + "dateModified": "2026-09-09" }, { "@type": "FAQPage", @@ -212,7 +212,7 @@

Walking Through the Clustering Code km = KMeans(n_clusters=2, random_state=42, n_init=10) df['cluster'] = km.fit_predict(Xs)

sex, race, and native.country never appear in feature_cols. The clustering step has no way to "see" them. Whatever split it produces has to come entirely from the other nine columns.

-

Concrete Example: Benefits Denial - Audit 04

+

Concrete Example: Benefits Denial - Audit 05

Running the code above on the UCI Adult Census Income dataset (32,561 records, the same file the Benefits Denial audit trains on) produces two clusters of size 17,680 and 14,881. Neither sex, race, nor native.country was part of the clustering input, so the composition of each cluster along those attributes was checked after the fact, not fed in beforehand:

Cluster 0 (n=17,680)Cluster 1 (n=14,881)
Female51.9%10.7%
Male48.1%89.3%
Black13.0%5.6%
White81.9%89.6%
Foreign-born10.2%10.7%

Cluster 1 is 89.3% male against cluster 0's near-even split, and Black applicants appear at more than double the rate in cluster 0 versus cluster 1. Nobody asked the algorithm to separate applicants by sex or race. It separated them by relationship, marital.status, occupation, and hours.per.week, and a sex and race split came out the other side as a side effect, exactly the mechanism What Is a Proxy Variable? describes for supervised models, now showing up with no label in sight.

diff --git a/faircode/_explainers/conditional-demographic-parity.md b/faircode/_explainers/conditional-demographic-parity.md new file mode 100644 index 0000000..0a57fba --- /dev/null +++ b/faircode/_explainers/conditional-demographic-parity.md @@ -0,0 +1,251 @@ +# What Is Conditional Demographic Parity? + +> *Plain demographic parity asks whether two groups get positive outcomes at the same rate. Conditional demographic parity asks whether they get them at the same rate once you hold a chosen "legitimate" factor fixed - and the choice of that factor decides the answer.* + +## The One-Sentence Definition + +**Conditional demographic parity** (CDP) requires equal positive-outcome rates across protected groups *within* each stratum of one or more explicitly chosen legitimate factors, rather than across the whole population at once. + +## Why It Matters + +Plain [demographic parity](demographic-parity.md) requires `P(Y_hat = 1 | G = A) = P(Y_hat = 1 | G = B)` unconditionally. Two things go wrong with that in practice: + +- It is satisfied by a model that is equally useless for everyone (predict the base rate, ignore the features), so passing it is not evidence of a good model. +- It is violated by a model that legitimately uses a lawful, non-proxy factor - years of experience in a hiring model, loan amount in a credit model - that happens to correlate with a protected group. The violation may be entirely explained by that factor, not by the protected attribute. + +Conditional demographic parity is the standard refinement for the second problem. You pick one or more conditioning factors `L` that you are willing to treat as a legitimate basis for outcome differences, stratify the population by `L`, and check demographic parity *within* each stratum: + +``` +P(Y_hat = 1 | G = A, L = l) = P(Y_hat = 1 | G = B, L = l) for every level l +``` + +If the groups reach parity within every stratum of `L`, the aggregate gap was "explained by `L`". If a gap persists within strata, `L` does not account for it. + +This is a real, commonly used construction - it is the fairness analogue of adding a control variable to a regression, and it is close to what US disparate-impact analysis does when it asks whether a challenged practice is "job related and consistent with business necessity". It is not a synonym for plain demographic parity, and it is not the same as [intersectional](intersectional-bias.md) or [subgroup](subgroup-fairness.md) fairness, which stratify by *other protected attributes* to find hidden gaps rather than by a legitimate factor to explain one. + +## How It Works + +Start from the identity that makes the aggregate gap decomposable. For each group `g`: + +``` +P(Y_hat = 1 | G = g) = sum over l of P(L = l | G = g) * P(Y_hat = 1 | G = g, L = l) +``` + +The aggregate rate is a weighted average of within-stratum rates, weighted by how group `g` is distributed across the strata of `L`. Subtracting the two groups' aggregate rates gives a gap with two sources: different within-stratum rates (`P(Y_hat = 1 | G = g, L = l)` differs by `g`), and different stratum weights (`P(L = l | G = g)` differs by `g`). + +Conditional demographic parity zeroes out the second source by construction: it only compares groups at the same value of `L`. What is left is the within-stratum gap. A sample-size-weighted average of the within-stratum gaps is the part of the aggregate gap that stratifying on `L` does *not* remove. + +The catch is entirely in the choice of `L`. If `L` is a genuine exogenous factor, the within-stratum gap is the disparity net of a real confounder. If `L` is a [proxy](proxy-variables.md) for the protected attribute, conditioning on it absorbs the discrimination into the "legitimate" term and the within-stratum gap understates the real harm. CDP gives you a knob; it does not tell you where to set it. + +## Concrete Example: Benefits Denial - Audit 04 + +`Benefits Denial/` audits the Adult Census Income dataset (`adult.csv`, 32,561 rows). The target is `income == '>50K'` and `sex` is a declared protected attribute. Using the dataset's own outcome rates (the base rate a label-level demographic parity check compares): + +**Unconditional:** + +| Group | n | P(income > 50K) | +|---|---:|---:| +| Male | 21,790 | 30.6% | +| Female | 10,771 | 11.0% | +| Gap (M - F) | | **+19.6 pp** | + +Now apply CDP with two different choices of legitimate factor `L`. + +### L = education level (`education.num`, 15 levels) + +| education.num | n | Gap (M - F) | +|---:|---:|---:| +| 9 (HS grad) | 10,501 | +13.7 pp | +| 10 (some college) | 7,291 | +19.5 pp | +| 13 (Bachelors) | 5,355 | +29.4 pp | +| 14 (Masters) | 1,723 | +32.3 pp | +| 15 (Prof-school) | 576 | +33.1 pp | +| 16 (Doctorate) | 413 | +20.2 pp | + +Sample-weighted within-stratum gap: **+18.4 pp**. Conditioning on education removes almost none of the aggregate gap - within every education level men are markedly more likely to be high earners, and at the top three levels the gap is *larger* than the unconditional +19.6. CDP conditioned on education says: the disparity is not an artifact of women being less educated in this dataset. + +### L = marital status (`marital.status`) + +| marital.status | n | Gap (M - F) | +|---|---:|---:| +| Married-civ-spouse | 14,976 | -0.9 pp | +| Never-married | 10,683 | +2.0 pp | +| Divorced | 4,443 | +9.3 pp | +| Widowed | 993 | +17.6 pp | + +Sample-weighted within-stratum gap: roughly **+3 pp**, and inside the single largest stratum the sign reverses (women 0.9 points ahead). Conditioning on marital status makes most of the aggregate gap disappear. + +### The two answers disagree, and that is the point + +Same protected attribute, same dataset, same +19.6 pp aggregate. Condition on education and the gap stands. Condition on marital status and it nearly vanishes. CDP did not resolve the fairness question - it moved it to a new one: *is marital status a legitimate basis for a 20-point income difference between men and women, or is it a proxy for a sex-role division of unpaid labor that the outcome variable should not be conditioned on?* That is a normative and legal question, not a statistical one, and CDP's output is only as defensible as the answer to it. (This is the same aggregate-vs-stratified divergence covered from the other direction in [Simpson's Paradox](simpsons-paradox.md).) + +```python +import pandas as pd +import numpy as np + +df = pd.read_csv("Benefits Denial/adult.csv") +df["high_income"] = (df["income"] == ">50K").astype(int) + + +def within_stratum_gap(frame, condition_col): + rows = [] + for level, sub in frame.groupby(condition_col): + m = sub.loc[sub["sex"] == "Male", "high_income"] + f = sub.loc[sub["sex"] == "Female", "high_income"] + if len(m) < 30 or len(f) < 30: + continue + rows.append((level, len(sub), m.mean() - f.mean())) + tbl = pd.DataFrame(rows, columns=["level", "n", "gap"]) + weighted = np.average(tbl["gap"], weights=tbl["n"]) + return tbl, weighted + + +for col in ("education.num", "marital.status"): + _, w = within_stratum_gap(df, col) + print(f"condition on {col:16s}: weighted within-stratum gap = {w:+.4f}") +# condition on education.num : weighted within-stratum gap = +0.1844 +# condition on marital.status : weighted within-stratum gap = +0.0305 +``` + +## Detection Code + +The following module computes the unconditional demographic parity gap, the conditional (within-stratum) gap for a chosen legitimate factor, and the fraction of the unconditional gap that conditioning explains away. + +```python +import numpy as np +import pandas as pd + + +def conditional_demographic_parity( + df: pd.DataFrame, + outcome_col: str, + group_col: str, + advantaged: str, + disadvantaged: str, + condition_cols: list[str], + min_group_in_stratum: int = 30, +) -> dict: + """ + Compare the unconditional demographic parity gap for (advantaged - + disadvantaged) against the gap computed within each stratum defined by + cross-tabulating condition_cols. + + outcome_col must be 0/1. Returns a dict with: + unconditional_gap aggregate P(Y=1|adv) - P(Y=1|dis) + conditional_gap sample-size-weighted mean of within-stratum gaps + explained_fraction 1 - conditional_gap / unconditional_gap, i.e. + how much of the aggregate gap stratifying removed + strata per-stratum table (level, n, gap) + + A strata row is skipped if either group has fewer than + min_group_in_stratum members in it (its within-stratum rate would be too + noisy to compare). + """ + d = df[[outcome_col, group_col, *condition_cols]].dropna() + d = d[d[group_col].isin([advantaged, disadvantaged])] + + def gap(frame): + a = frame.loc[frame[group_col] == advantaged, outcome_col] + b = frame.loc[frame[group_col] == disadvantaged, outcome_col] + if len(a) == 0 or len(b) == 0: + return np.nan, len(a), len(b) + return a.mean() - b.mean(), len(a), len(b) + + uncond_gap, _, _ = gap(d) + + rows = [] + for level, sub in d.groupby(condition_cols if len(condition_cols) > 1 + else condition_cols[0]): + g, na, nb = gap(sub) + if np.isnan(g) or min(na, nb) < min_group_in_stratum: + continue + rows.append({"level": level, "n": len(sub), "gap": g}) + + strata = pd.DataFrame(rows).sort_values("n", ascending=False) + if strata.empty: + return {"unconditional_gap": float(uncond_gap), + "conditional_gap": np.nan, "explained_fraction": np.nan, + "strata": strata} + + cond_gap = float(np.average(strata["gap"], weights=strata["n"])) + explained = (1.0 - cond_gap / uncond_gap) if uncond_gap != 0 else np.nan + + return { + "unconditional_gap": float(uncond_gap), + "conditional_gap": cond_gap, + "explained_fraction": float(explained), + "strata": strata.reset_index(drop=True), + } + + +def print_cdp_report(result: dict, condition_label: str) -> None: + print(f"Conditioning factor: {condition_label}") + print(f" unconditional DP gap: {result['unconditional_gap']:+.4f}") + print(f" conditional (within) DP gap: {result['conditional_gap']:+.4f}") + if not np.isnan(result["explained_fraction"]): + print(f" fraction of gap explained: " + f"{result['explained_fraction']:.1%}") + print(" per-stratum gaps (largest first):") + for _, row in result["strata"].iterrows(): + print(f" {str(row['level'])[:28]:28s} n={int(row['n']):6d} " + f"gap={row['gap']:+.4f}") + + +# Usage on the Benefits Denial audit: +# import pandas as pd +# df = pd.read_csv("Benefits Denial/adult.csv") +# df["high_income"] = (df["income"] == ">50K").astype(int) +# print_cdp_report(conditional_demographic_parity( +# df, "high_income", "sex", "Male", "Female", ["education.num"]), +# "education.num") +# print_cdp_report(conditional_demographic_parity( +# df, "high_income", "sex", "Male", "Female", ["marital.status"]), +# "marital.status") +``` + +Against `Benefits Denial/adult.csv` this reports an `explained_fraction` near `0.06` for `education.num` (conditioning removes almost nothing) and near `0.84` for `marital.status` (conditioning removes most of the gap) - the same +19.6 pp aggregate, two incompatible readings. + +## Limitations and Trade-offs + +### 1. The conditioning set is a value judgment, not a statistical choice + +Everything CDP reports is downstream of which factors you declared "legitimate". There is no test that tells you whether marital status, or occupation, or prior loan history, is a fair thing to condition on. Pick a factor that is genuinely a proxy for the protected attribute and CDP will confidently report that the disparity is "explained", which is exactly the [proxy-variable](proxy-variables.md) trap. + +### 2. Conditioning can only ever shrink or hold the gap you can attribute, never validate the factor + +A small within-stratum gap means the aggregate gap co-varies with `L`. It does not mean `L` *causes* the outcome difference, and it does not mean using `L` is lawful or ethical. Those require an argument outside the data. + +### 3. Strata multiply fast and thin out + +Conditioning on one categorical factor is usually fine; conditioning on two or three cross-tabulated factors produces many strata with tiny per-group counts, unstable within-stratum rates, and a weighted gap dominated by a few large cells. Keep the conditioning set minimal and report per-stratum sample sizes. + +### 4. Continuous conditioning factors require binning + +`education.num` above is discrete. A continuous factor (age, income, tenure) has to be binned, and the bin edges change the answer. Coarse bins can leave residual confounding inside each bin; fine bins run into the small-strata problem in point 3. + +### 5. It does not fix the "equally useless model" hole + +Like plain demographic parity, CDP is a rate comparison. A model that is equally bad within every stratum still passes. CDP tightens demographic parity against one specific failure (a legitimate confounder); it does not turn it into a sufficiency or calibration guarantee. + +## Related Concepts + +* [What Is Demographic Parity?](demographic-parity.md) - the unconditional metric CDP refines. +* [What Is a Proxy Variable?](proxy-variables.md) - why conditioning on the wrong factor launders discrimination instead of explaining it. +* [What Is Simpson's Paradox in Fairness Audits?](simpsons-paradox.md) - the same aggregate-vs-stratified divergence, framed as a reversal rather than a refinement. +* [What Is Subgroup Fairness (and Fairness Gerrymandering)?](subgroup-fairness.md) - stratifying by other protected attributes to find hidden gaps, the opposite motivation from CDP. +* [Why Fairness Metrics Conflict](fairness-metric-conflicts.md) - where conditional and unconditional parity sit among the impossibility results. + +## Related Projects in This Repo + +* [`Benefits Denial/`](../Benefits%20Denial/) - the Adult Census Income audit above; conditioning the `sex` income gap on education preserves it, conditioning on marital status removes it. +* [`German Credit Lending/`](../German%20Credit%20Lending/) - a credit audit where loan amount and credit history are candidate "business necessity" factors to condition an age gap on. + +## Further Reading + +* [Corbett-Davies, S., Pierson, E., Feller, A., Goel, S., Huq, A. (2017): Algorithmic Decision Making and the Cost of Fairness, *KDD 2017*](https://arxiv.org/abs/1701.08230) - introduces conditional statistical parity and shows how the choice of conditioning variables trades off against error rates. +* [Wachter, S., Mittelstadt, B., Russell, C. (2021): Why Fairness Cannot Be Automated, *Computer Law and Security Review*, 41](https://arxiv.org/abs/2005.05906) - argues that the "legitimate factor" choice at the heart of conditional parity mirrors, and cannot be separated from, EU non-discrimination law's contextual reasoning. +* [Kilbertus, N., Rojas-Carulla, M., Parascandolo, G., Hardt, M., Janzing, D., Scholkopf, B. (2017): Avoiding Discrimination through Causal Reasoning, *NeurIPS 2017*](https://arxiv.org/abs/1706.02744) - frames "which variables may we condition on" as a causal-graph question rather than a statistical one. + +--- + +*Part of [The Fair Code Project](https://instagram.com/thefaircodeproject) - exposing and fixing algorithmic bias with real data and open code.* diff --git a/faircode/_explainers/data.json b/faircode/_explainers/data.json index e9fdaaa..fab4ce2 100644 --- a/faircode/_explainers/data.json +++ b/faircode/_explainers/data.json @@ -390,6 +390,34 @@ "subtitle": "Equal error rates across groups can still hide opposite-skewed error types within each group.", "summary": "Learn why Treatment Equality checks the ratio of false negatives to false positives within each group, not the individual rates Equalized Odds already compares. Uses COMPAS's real (freshly computed, not frozen) confusion matrix: a 0.13 FN:FP ratio for African-American defendants against a 31.0 ratio for Caucasian defendants on the same baseline model.", "tags": ["metrics"] + }, + { + "slug": "simpsons-paradox", + "title": "What Is Simpson's Paradox in Fairness Audits?", + "subtitle": "A gap that shows up in the aggregate can shrink, vanish, or reverse once you disaggregate.", + "summary": "Learn why an aggregate fairness metric is a weighted average of within-stratum rates, so pooling groups of different sizes can manufacture or flip a disparity. Uses the Benefits Denial (Adult Census) audit: the aggregate sex income gap of +19.6 pp collapses to roughly +3 pp within marital-status strata and reverses to -0.9 pp inside the largest one.", + "tags": ["metrics", "data", "detection"] + }, + { + "slug": "conditional-demographic-parity", + "title": "What Is Conditional Demographic Parity?", + "subtitle": "Checking parity within strata of a chosen legitimate factor, not across the whole population.", + "summary": "Learn how conditional demographic parity refines plain demographic parity by stratifying on an explicitly chosen legitimate factor, and why the choice of that factor decides the answer. Uses the Benefits Denial (Adult Census) audit: conditioning the +19.6 pp sex income gap on education leaves it at +18.4 pp, while conditioning on marital status removes about 84% of it.", + "tags": ["metrics", "detection"] + }, + { + "slug": "subgroup-fairness", + "title": "What Is Subgroup Fairness (and Fairness Gerrymandering)?", + "subtitle": "Passing a fairness check on every attribute separately is not the same as passing it on every combination.", + "summary": "Learn how a model can satisfy a fairness metric on each protected attribute individually yet fail on an algorithmically-discoverable subgroup, and how a brute-force subgroup scan differs from this repo's fixed-pair --cross. Uses the Healthcare Readmission audit: the gender readmission gap is 0.19 pp overall but -5.15 pp inside the Asian patient subgroup.", + "tags": ["metrics", "detection"] + }, + { + "slug": "differential-privacy", + "title": "What Is Differential Privacy (and Its Tension With Fairness)?", + "subtitle": "The accuracy cost of a privacy guarantee falls hardest on underrepresented groups.", + "summary": "Learn how DP-SGD's gradient clipping and noise addition disproportionately degrade accuracy for minority subgroups, so adding a privacy guarantee to a bias-mitigation pipeline is not free. Illustrative example from Bagdasaryan, Poursaeed and Shmatikov (NeurIPS 2019), plus a runnable DP-SGD noise-injection toy; this repo trains no DP model, so no frozen numbers are quoted.", + "tags": ["data", "metrics"] } ] diff --git a/faircode/_explainers/differential-privacy.md b/faircode/_explainers/differential-privacy.md new file mode 100644 index 0000000..989286a --- /dev/null +++ b/faircode/_explainers/differential-privacy.md @@ -0,0 +1,167 @@ +# What Is Differential Privacy (and Its Tension With Fairness)? + +> *Differential privacy adds calibrated noise during training so no single person's data changes the model much. That protection is not free, and it is not evenly distributed: the accuracy it costs falls hardest on exactly the underrepresented groups a fairness audit is trying to protect.* + +## The One-Sentence Definition + +**Differential privacy (DP)** is a formal guarantee that the output of an analysis (here, a trained model) is almost unchanged whether or not any one individual's record was included, achieved during training by clipping each example's gradient contribution and adding random noise, with the strength of the guarantee set by a privacy budget **epsilon** (smaller epsilon = more noise = stronger privacy). + +## Why It Matters + +A bias-mitigation pipeline and a privacy requirement are often imposed on the same model by different stakeholders - a fairness team and a data-protection officer - who assume the two goals compose for free. They do not. + +The standard training algorithm for a DP model, **DP-SGD**, does two things to every gradient step: it **clips** each per-example gradient to a fixed norm, and it **adds Gaussian noise** proportional to that norm. Both operations interact badly with class imbalance: + +- Underrepresented groups tend to be the ones a model has not yet fit well, so their examples produce **large gradients** - the ones clipping cuts down the most. The majority's already-small gradients pass through nearly untouched. +- The noise is added to the batch-averaged gradient regardless of composition. A signal that is a small fraction of the batch (the minority's contribution) is **drowned by the noise** at a lower epsilon than the majority's signal is. + +The result, documented by Bagdasaryan, Poursaeed and Shmatikov (2019), is that the accuracy drop from adding DP is "not borne equally": it is substantially larger for underrepresented classes and subgroups, and **if the original model was already unfair, DP makes it more unfair**. This is the same shape as [the fairness-accuracy trade-off](fairness-accuracy-tradeoff.md) - closing one gap opens another - except the axis being traded against fairness is privacy, not overall accuracy. + +## How It Works + +DP-SGD replaces the plain gradient step with: + +``` +1. compute per-example gradients g_i for the minibatch +2. clip: g_i <- g_i / max(1, ||g_i|| / C) # cap the L2 norm at C +3. sum, then add noise: g <- (sum_i g_i + N(0, sigma^2 C^2 I)) / B +4. step: w <- w - lr * g +``` + +`C` is the clipping norm and `sigma` the noise multiplier; together with the number of steps and the sampling rate they determine epsilon (via a privacy accountant). Smaller epsilon needs a larger `sigma`. + +Why this is disparate: + +- **Clipping is a per-example ceiling.** An example the model already predicts well has a small gradient and is unaffected. An example the model gets wrong - disproportionately from a group with little training data - has a large gradient that gets scaled down, so its correction is weakened. Over many steps the majority keeps learning at full strength while the minority's updates are throttled. +- **Noise has a fixed scale but the useful signal does not.** In a batch that is 90% majority, the minority's contribution to the summed gradient is roughly a tenth of the total before noise. The noise term `N(0, sigma^2 C^2)` is the same size either way, so it overwhelms the minority direction while the majority direction still stands out. As `sigma` rises (epsilon falls), the minority signal disappears first. + +A minimal way to see the mechanism: train a logistic model with DP-SGD on data where 10% of rows follow a different feature-to-label rule than the other 90%, and read out accuracy per group as `sigma` increases. The majority accuracy holds; the minority accuracy falls faster and further. The Detection Code section gives a runnable version. + +## Concrete Illustration (from the literature, not a Fair Code run) + +**This repo's benchmark harness does not train any DP model** - there is no `epsilon` in `faircode/strategies.py` and no DP row in `results/`. Every number in this section is from the published study below, quoted so the pattern is concrete, not reproduced here. + +Bagdasaryan et al. (2019), *Differential Privacy Has Disparate Impact on Model Accuracy* (NeurIPS 2019), trained the same models with and without DP-SGD across several tasks: + +- A **gender-classification model** on facial images: adding DP reduced accuracy far more for darker-skinned faces (an underrepresented group in the training set) than for lighter-skinned faces, widening an accuracy gap that already existed in the non-private model. +- A **sentiment-analysis model** on tweets: DP reduced accuracy more on text written in African-American English than on the majority dialect. +- Across tasks, the finding held: "the reduction in accuracy incurred by deep learning models with differential privacy disproportionately impacts underrepresented subgroups," and the effect grows as epsilon shrinks. Their summary of the mechanism is that **the gradient clipping and noise addition of DP-SGD "disproportionately affect" the subgroups whose gradients are largest and whose share of the data is smallest** - i.e. "the poor get poorer." + +The relevance to this repo: every audit here is built around a protected group that is, in its dataset, the smaller or worse-served one (younger applicants, minority defendants, one insurance tier). Those are precisely the groups DP-SGD costs the most accuracy. "We added a privacy guarantee" is therefore not evidence of "we did not make the fairness gap worse" - it needs its own per-group check. + +## Detection Code + +A self-contained, dependency-light DP-SGD toy: per-example gradient clipping plus Gaussian noise on a logistic model, with a per-group accuracy readout, run across a sweep of noise multipliers. It is illustrative - it shows the *mechanism*, not a calibrated epsilon. + +```python +import numpy as np + + +def make_imbalanced_data(n=6000, minority_frac=0.10, seed=0): + """90% majority + 10% minority, where the minority's label depends on a + different set of features - so the minority needs its own signal to be + learned, and that signal is what clipping + noise erode first.""" + rng = np.random.default_rng(seed) + n_min = int(n * minority_frac) + group = np.array([1] * n_min + [0] * (n - n_min)) # 1 = minority + rng.shuffle(group) + x = rng.normal(size=(n, 6)) + w_majority = np.array([1.5, -1.0, 0.7, 0.0, 0.0, 0.0]) + w_minority = np.array([0.0, 0.0, 0.0, 1.5, -1.0, 0.7]) + logits = np.where(group == 1, x @ w_minority, x @ w_majority) + y = (rng.random(n) < 1.0 / (1.0 + np.exp(-logits))).astype(int) + return x, y, group + + +def dp_sgd_logreg(x, y, steps=4000, batch=64, lr=0.5, + clip_norm=1.0, noise_multiplier=0.0, seed=1): + """DP-SGD for logistic regression. noise_multiplier is 'sigma': 0 means + clip-only (no privacy), larger means smaller epsilon.""" + rng = np.random.default_rng(seed) + n, d = x.shape + w = np.zeros(d) + for _ in range(steps): + idx = rng.integers(0, n, batch) + xb, yb = x[idx], y[idx] + p = 1.0 / (1.0 + np.exp(-(xb @ w))) + per_example = (p - yb)[:, None] * xb # B x d + norms = np.linalg.norm(per_example, axis=1, keepdims=True) + per_example = per_example / np.maximum(1.0, norms / clip_norm) # clip + grad = per_example.sum(axis=0) + if noise_multiplier > 0: + grad = grad + rng.normal(scale=noise_multiplier * clip_norm, size=d) + w -= lr * grad / batch + return w + + +def accuracy_by_group(w, x, y, group): + pred = (x @ w > 0).astype(int) + maj = ((pred == y) & (group == 0)).sum() / (group == 0).sum() + minority = ((pred == y) & (group == 1)).sum() / (group == 1).sum() + return maj, minority + + +def sweep(seeds=range(6)): + x_tr, y_tr, g_tr = make_imbalanced_data(seed=0) + x_te, y_te, g_te = make_imbalanced_data(n=4000, seed=99) + + def mean_acc(**kw): + rows = [accuracy_by_group(dp_sgd_logreg(x_tr, y_tr, seed=s, **kw), + x_te, y_te, g_te) for s in seeds] + return np.mean(rows, axis=0) + + print(f"{'setting':<28}{'majority':>10}{'minority':>10}{'gap':>8}") + maj, minr = mean_acc(noise_multiplier=0.0) + print(f"{'clip only (no privacy)':<28}{maj:>10.3f}{minr:>10.3f}{maj - minr:>+8.3f}") + for sigma in (1.0, 2.0, 4.0, 8.0): + maj, minr = mean_acc(noise_multiplier=sigma) + print(f"{f'DP-SGD sigma={sigma}':<28}{maj:>10.3f}{minr:>10.3f}{maj - minr:>+8.3f}") + + +# sweep() +# The majority column stays roughly flat as sigma grows; the minority column +# and the gap move against the minority. Swap in a real dataset + a privacy +# accountant (e.g. Opacus, tensorflow-privacy) to attach an epsilon to each row. +``` + +## Limitations and Trade-offs + +### 1. Epsilon has no universally correct value + +There is no threshold at which a model is "private enough". Deployed systems have used epsilon from below 1 (strong) to over 10 (weak); the choice trades re-identification risk against utility and against the fairness cost described here, and it is a policy decision, not a statistical one - the same shape as choosing a fairness metric. + +### 2. DP protects against a specific threat, not against bias + +The DP guarantee is about **membership inference and individual re-identification**: an attacker cannot tell whether a particular person was in the training set. It says nothing about whether the labels are biased, whether the sampling was biased, or whether the model discriminates. A perfectly private model can be perfectly unfair. DP and fairness are orthogonal guarantees that happen to interfere. + +### 3. The disparate impact can sometimes be mitigated, at a cost + +Per-group clipping norms, adaptive clipping, or fair-DP training objectives can reduce the gap DP-SGD opens, but they add hyperparameters, can weaken the privacy accounting, and are not standard in off-the-shelf DP training libraries. Assume the vanilla DP-SGD behavior unless a mitigation is explicitly in place and measured. + +### 4. The toy here is a mechanism demo, not a calibrated result + +The Detection Code has no privacy accountant, so its `sigma` values do not map to a real epsilon, and its synthetic data exaggerates the minority's distinctness for clarity. Treat it as an illustration of *why* the effect happens; for a real number, run DP-SGD with an accountant on a real dataset and measure per-group accuracy directly. + +## Related Concepts + +* [What Is the Fairness-Accuracy Trade-off?](fairness-accuracy-tradeoff.md) - the same "closing one gap opens another" structure, with accuracy rather than privacy on the other axis. +* [What Is Class Imbalance?](class-imbalance.md) - why an underrepresented group's signal is a small share of each batch, the property DP-SGD's noise exploits. +* [Mitigation Strategies](mitigation-strategies.md) - this repo's five bias-mitigation strategies, none of which is DP; adding DP on top would need its own per-group evaluation. +* Membership inference - the attack DP is designed to prevent: given a trained model, deciding whether a specific record was in its training set. DP bounds how well any such attack can do. +* [What Is Underdiagnosis Bias?](underdiagnosis-bias.md) - another case where a technique aimed at one problem quietly worsens per-group outcomes. + +## Related Projects in This Repo + +* [`Healthcare Readmission/`](../Healthcare%20Readmission/) - a clinical model where a real deployment would plausibly face a patient-privacy requirement; the smallest race and age subgroups are the ones DP-SGD would cost the most. +* [`German Credit Lending/`](../German%20Credit%20Lending/) - younger applicants are the protected, smaller group; a DP-trained credit model would degrade for them fastest as epsilon tightens. + +## Further Reading + +* [Bagdasaryan, E., Poursaeed, O., Shmatikov, V. (2019): Differential Privacy Has Disparate Impact on Model Accuracy, *Advances in Neural Information Processing Systems 32 (NeurIPS 2019)*](https://arxiv.org/abs/1905.12101) - the paper this explainer's central claim comes from; shows the DP accuracy cost is larger for underrepresented subgroups across image, text, and tabular tasks. +* [Abadi, M. et al. (2016): Deep Learning with Differential Privacy, *ACM CCS 2016*](https://arxiv.org/abs/1607.00133) - the original DP-SGD algorithm (per-example clipping + Gaussian noise + moments accountant). +* [Dwork, C., Roth, A. (2014): The Algorithmic Foundations of Differential Privacy, *Foundations and Trends in Theoretical Computer Science*, 9(3-4)](https://www.cis.upenn.edu/~aaroth/Papers/privacybook.pdf) - the standard reference for the epsilon definition and its properties. +* [Cummings, R., Gupta, V., Kimpara, D., Morgenstern, J. (2019): On the Compatibility of Privacy and Fairness, *FairUMAP 2019*](https://arxiv.org/abs/1907.00212) - a formal look at when the two guarantees can and cannot be satisfied together. + +--- + +*Part of [The Fair Code Project](https://instagram.com/thefaircodeproject) - exposing and fixing algorithmic bias with real data and open code.* diff --git a/faircode/_explainers/simpsons-paradox.md b/faircode/_explainers/simpsons-paradox.md new file mode 100644 index 0000000..117200c --- /dev/null +++ b/faircode/_explainers/simpsons-paradox.md @@ -0,0 +1,239 @@ +# What Is Simpson's Paradox in Fairness Audits? + +> *A model can look fair in aggregate while every disaggregated subgroup shows the opposite pattern, or look unfair in aggregate when no subgroup does - because pooling groups of different sizes and base rates lets the mix, not the model, drive the headline number.* + +## The One-Sentence Definition + +**Simpson's Paradox** is a statistical phenomenon in which a trend or association that holds within every subgroup of the data reverses, disappears, or appears out of nowhere once the subgroups are combined into a single aggregate, because the subgroups differ in size and in their baseline rates. + +## Why It Matters + +Almost every fairness metric in this repo is a single aggregate number: one `demographic_parity_diff`, one selection-rate gap, one accuracy-equality figure per audit. That number is computed by pooling every row for a protected group and comparing the pooled rate to another group's pooled rate. + +Pooling is not neutral. When a protected group is distributed differently across the strata of some other variable - an occupation, a marital status, a loan product, a hospital - than the comparison group is, the aggregate comparison silently reweights those strata. The result is a headline gap that can be several times larger than any gap that actually exists within a stratum, can point the opposite direction from every stratum, or can vanish entirely. + +This is distinct from [intersectional bias](intersectional-bias.md), which is about a compounding gap that only appears at the *intersection* of two attributes and is hidden when you check one attribute at a time. Simpson's Paradox is the reverse direction: a gap that appears (or flips) in the *aggregate* and is not present, or is present with the opposite sign, once you disaggregate. Both are failures of looking at the data at the wrong level, but they pull in opposite directions, and a serious audit has to check for both. + +Simpson's Paradox does not tell you which view is correct. It only tells you that the aggregate and the disaggregated pictures disagree, which means the aggregate number alone cannot be trusted as a fairness finding without knowing why they disagree. + +## How It Works + +Let `Y` be a binary outcome (1 = the favorable outcome), `G` a protected group, and `S` a stratifying variable with levels `s`. The aggregate rate for a group is a weighted average of its within-stratum rates, where the weights are how that group is distributed across strata: + +``` +P(Y = 1 | G = g) = sum over s of P(S = s | G = g) * P(Y = 1 | G = g, S = s) +``` + +Two things vary between groups in that sum: the within-stratum rates `P(Y = 1 | G = g, S = s)`, and the stratum weights `P(S = s | G = g)`. The aggregate gap between two groups blends both. If the weights differ enough, the weight term can dominate and the aggregate gap stops reflecting the within-stratum rates at all. + +### A minimal reversal + +Consider a hiring screen with two departments. Within each department the callback rate for Group A is higher than for Group B: + +| Department | Group A callbacks | Group B callbacks | +|---|---|---| +| Engineering (easy to pass) | 70 / 80 = **87.5%** | 18 / 20 = **90.0%** | +| Design (hard to pass) | 2 / 20 = **10.0%** | 8 / 80 = **10.0%** | +| **Pooled** | 72 / 100 = **72.0%** | 26 / 100 = **26.0%** | + +Within Engineering, Group B does slightly better (90.0% vs 87.5%); within Design the two are tied (10.0% vs 10.0%). Neither department favors Group A. Yet the pooled rate shows Group A ahead by 46 points, because 80% of Group A's applicants are in the high-callback department and 80% of Group B's are in the low-callback one. The pooled 46-point "gap" is entirely a fact about where each group applied, not about how either group was treated inside a department. + +## Concrete Example: Benefits Denial - Audit 04 + +`Benefits Denial/` audits the Adult Census Income dataset (`adult.csv`, 32,561 rows), where the target is `income == '>50K'` and `sex` is a declared protected attribute. These are the dataset's own outcome rates (not a model's predictions), which is the base rate a demographic-parity check on the labels compares. + +**Aggregate:** + +| Group | n | P(income > 50K) | +|---|---:|---:| +| Male | 21,790 | **30.6%** | +| Female | 10,771 | **11.0%** | +| Gap (M - F) | | **+19.6 pp** | + +Now stratify by `marital.status`. The single largest stratum, `Married-civ-spouse`, holds 14,976 rows - 46% of the entire dataset: + +| Stratum | Male n | Male rate | Female n | Female rate | Gap (M - F) | +|---|---:|---:|---:|---:|---:| +| Married-civ-spouse | 13,319 | 44.6% | 1,657 | 45.5% | **-0.9 pp** | +| Never-married | 5,916 | 5.5% | 4,767 | 3.5% | +2.0 pp | +| Divorced | 1,771 | 16.0% | 2,672 | 6.7% | +9.3 pp | +| Widowed | 168 | 23.2% | 825 | 5.6% | +17.6 pp | +| Separated | 394 | 12.4% | 631 | 2.7% | +9.8 pp | + +Collapsed to just married vs not-married, the gap shrinks from +19.6 pp to **+3.0 pp** (married) and **+3.9 pp** (not married). And inside `Married-civ-spouse` - nearly half the data - the sign **reverses**: women are 0.9 points ahead. + +The mechanism is the stratum weights. Women are 52% of the "not married" pool, which has an overall high-income rate of 6.5%, but only 12% of the "married" pool, which has an overall rate of 43.7%. The aggregate comparison places most men in the high-earning stratum and splits women toward the low-earning one, so roughly 16 of the 19.6 aggregate points come from *where* each group sits, not from a within-stratum difference in outcome rates. + +Whether `marital.status` is a legitimate thing to condition on here is a separate, normative question - see [Conditional Demographic Parity](conditional-demographic-parity.md) and the Limitations section below. The point Simpson's Paradox makes is narrower: the +19.6 pp aggregate figure, reported on its own, describes the dataset's composition at least as much as it describes any disparity in outcomes. + +```python +import pandas as pd + +df = pd.read_csv("Benefits Denial/adult.csv") +df["high_income"] = (df["income"] == ">50K").astype(int) + + +def sex_gap(frame): + male = frame.loc[frame["sex"] == "Male", "high_income"].mean() + female = frame.loc[frame["sex"] == "Female", "high_income"].mean() + return male, female, male - female + + +print("aggregate:", sex_gap(df)) +# (0.3057, 0.1095, 0.1962) + +married = df[df["marital.status"] == "Married-civ-spouse"] +print("married-civ-spouse:", sex_gap(married)) +# (0.4458, 0.4550, -0.0092) <- sign reversed +``` + +## Detection Code + +The following module compares a rate gap computed in aggregate against the same gap computed within each stratum of a chosen variable, and reports whether the aggregate sign matches the strata, whether it is inflated, or whether it reverses. + +```python +import numpy as np +import pandas as pd + + +def simpsons_check( + df: pd.DataFrame, + outcome_col: str, + group_col: str, + advantaged: str, + disadvantaged: str, + stratify_col: str, + min_stratum_size: int = 100, + min_group_in_stratum: int = 30, +) -> dict: + """ + Compare the (advantaged - disadvantaged) outcome-rate gap in aggregate + against the same gap within each stratum of stratify_col. + + outcome_col must be 0/1. Returns a dict with the aggregate gap, a table + of per-stratum gaps (sample-size weighted), the weighted-average + within-stratum gap, and a verdict: + + "consistent" aggregate agrees in sign and rough size with strata + "inflated" same sign, but |aggregate| far exceeds the weighted + within-stratum gap (aggregation is amplifying it) + "sign_reversal" aggregate sign is opposite the weighted within gap, + or opposite the majority of strata by sample size + """ + d = df[[outcome_col, group_col, stratify_col]].dropna() + d = d[d[group_col].isin([advantaged, disadvantaged])] + + def gap(frame): + a = frame.loc[frame[group_col] == advantaged, outcome_col] + b = frame.loc[frame[group_col] == disadvantaged, outcome_col] + if len(a) == 0 or len(b) == 0: + return np.nan, len(a), len(b) + return a.mean() - b.mean(), len(a), len(b) + + agg_gap, n_adv, n_dis = gap(d) + + rows = [] + for value, sub in d.groupby(stratify_col): + if len(sub) < min_stratum_size: + continue + g, na, nb = gap(sub) + if np.isnan(g) or min(na, nb) < min_group_in_stratum: + continue + rows.append({"stratum": value, "n": len(sub), "gap": g, + "n_advantaged": na, "n_disadvantaged": nb}) + + strata = pd.DataFrame(rows).sort_values("n", ascending=False) + if strata.empty: + return {"verdict": "insufficient_data", "aggregate_gap": agg_gap, + "strata": strata} + + weights = strata["n"] / strata["n"].sum() + weighted_within_gap = float((strata["gap"] * weights).sum()) + + same_sign = np.sign(agg_gap) == np.sign(weighted_within_gap) + majority_n_opposite = strata.loc[ + np.sign(strata["gap"]) != np.sign(agg_gap), "n" + ].sum() > strata["n"].sum() / 2 + + if not same_sign or majority_n_opposite: + verdict = "sign_reversal" + elif abs(agg_gap) > 2 * abs(weighted_within_gap) + 0.05: + verdict = "inflated" + else: + verdict = "consistent" + + return { + "verdict": verdict, + "aggregate_gap": float(agg_gap), + "weighted_within_stratum_gap": weighted_within_gap, + "n_advantaged": int(n_adv), + "n_disadvantaged": int(n_dis), + "strata": strata.reset_index(drop=True), + } + + +def print_simpsons_report(result: dict) -> None: + print(f"Verdict: {result['verdict']}") + print(f" aggregate gap (adv - dis): {result['aggregate_gap']:+.4f}") + if "weighted_within_stratum_gap" in result: + print(f" weighted within-stratum gap: " + f"{result['weighted_within_stratum_gap']:+.4f}") + print("\n per-stratum gaps (largest first):") + for _, row in result["strata"].iterrows(): + flip = " <- opposite sign" if ( + np.sign(row["gap"]) != np.sign(result["aggregate_gap"]) + ) else "" + print(f" {str(row['stratum'])[:24]:24s} " + f"n={int(row['n']):6d} gap={row['gap']:+.4f}{flip}") + + +# Usage on the Benefits Denial audit: +# import pandas as pd +# df = pd.read_csv("Benefits Denial/adult.csv") +# df["high_income"] = (df["income"] == ">50K").astype(int) +# print_simpsons_report(simpsons_check( +# df, "high_income", "sex", "Male", "Female", "marital.status")) +``` + +Run against `Benefits Denial/adult.csv` with `stratify_col="marital.status"`, this reports `sign_reversal`: the aggregate `+0.196` gap is opposite in sign to the `Married-civ-spouse` stratum, which by itself is a plurality of the sample. + +## Limitations and Trade-offs + +### 1. There is no single correct level of aggregation + +Simpson's Paradox flags a disagreement; it does not adjudicate it. Whether the aggregate or the within-stratum view is the "real" fairness finding depends on whether the stratifying variable is a legitimate explanation for the outcome difference or is itself part of the discrimination. Conditioning on a variable that is a proxy for the protected attribute launders the disparity away (see [Proxy Variables](proxy-variables.md)); conditioning on a genuinely exogenous factor removes a confound. That judgment is normative and domain-specific, not statistical. + +### 2. Choosing the stratifying variable is a modeling decision + +You will not find a reversal for every variable. The detection code above tests one variable at a time; running it across many candidate strata invites finding a reversal by chance, especially with small strata. A reported reversal is only meaningful for a variable there is an independent reason to care about. + +### 3. Small strata produce unstable per-group rates + +Disaggregation shrinks sample sizes fast. A stratum where one group has 30 members will have a within-stratum rate with a wide confidence interval, and its "gap" can flip sign across dataset splits from noise alone. The `min_group_in_stratum` guard mitigates but does not eliminate this. + +### 4. Continuous confounders need binning, and the bins matter + +The example used a categorical stratifier. For a continuous confounder (age, income, tenure) you have to choose bin edges, and coarse or misaligned bins can hide a reversal that finer bins would show, or manufacture one. Report the binning alongside the result. + +## Related Concepts + +* [What Is Intersectional Bias?](intersectional-bias.md) - the opposite failure: a compounding gap visible only at the intersection of two attributes, hidden when each is checked alone. +* [What Is Conditional Demographic Parity?](conditional-demographic-parity.md) - the fairness metric built specifically around checking parity *within* strata of a chosen legitimate factor. +* [What Is a Confounding Variable?](confounding-variable.md) - the underlying causal structure that makes Simpson's reversals possible. +* [What Is the Base Rate Fallacy?](base-rate-fallacy.md) - a related error about ignoring prior probabilities when reading a conditional rate. +* [What Is a Proxy Variable?](proxy-variables.md) - why conditioning on the wrong variable can hide real discrimination instead of explaining it. + +## Related Projects in This Repo + +* [`Benefits Denial/`](../Benefits%20Denial/) - the Adult Census Income audit used above; the aggregate `sex` income gap is roughly five times any within-marital-status gap and reverses inside the largest stratum. +* [`Healthcare Readmission/`](../Healthcare%20Readmission/) - a multi-hospital readmission audit where per-facility case mix is a natural stratifier for an aggregate readmission-rate gap. + +## Further Reading + +* [Bickel, P. J., Hammel, E. A., O'Connell, J. W. (1975): Sex Bias in Graduate Admissions: Data from Berkeley, *Science*, 187(4175), 398-404](https://www.science.org/doi/10.1126/science.187.4175.398) - the canonical worked example: Berkeley's aggregate admit rate favored men, but department by department it did not. +* [Simpson, E. H. (1951): The Interpretation of Interaction in Contingency Tables, *Journal of the Royal Statistical Society B*, 13(2), 238-241](https://www.jstor.org/stable/2984065) - the paper the effect is named after. +* [Pearl, J. (2014): Comment: Understanding Simpson's Paradox, *The American Statistician*, 68(1), 8-13](https://ftp.cs.ucla.edu/pub/stat_ser/r414.pdf) - why the paradox is a causal question, not a statistical one, and why no purely statistical rule resolves it. + +--- + +*Part of [The Fair Code Project](https://instagram.com/thefaircodeproject) - exposing and fixing algorithmic bias with real data and open code.* diff --git a/faircode/_explainers/subgroup-fairness.md b/faircode/_explainers/subgroup-fairness.md new file mode 100644 index 0000000..92f4582 --- /dev/null +++ b/faircode/_explainers/subgroup-fairness.md @@ -0,0 +1,199 @@ +# What Is Subgroup Fairness (and Fairness Gerrymandering)? + +> *A model can pass a fairness check on race, pass it on sex, pass it on age, and still fail badly on some combination like "women over 50 in a particular region" that nobody thought to check by hand. Subgroup fairness is what you get when you stop hand-picking the groups and search for the one where the guarantee breaks.* + +## The One-Sentence Definition + +**Subgroup fairness** requires a fairness metric to hold not just on each protected attribute checked individually, but across a large, structured class of subgroups defined by combinations of attributes and features - and **fairness gerrymandering** is the failure mode where a model satisfies every marginal check while hiding a large disparity inside one of those combinations. + +## Why It Matters + +Checking `race`, then `sex`, then `age` separately gives you three guarantees, one per axis. Adding a hand-chosen pair, the way this repo's `--cross` flag does for a single intersection (SPEC section 4), gives you a fourth. None of that is the same as a guarantee over *every* combinatorially definable subgroup. + +The gap between "fair on each attribute I checked" and "fair on every subgroup" is exploitable, and not only by an adversary. A model trained to minimize a marginal fairness violation - equalize selection rates by race, and by sex - has no incentive to equalize them for `race x sex x age-band` cells it was never scored on. It can push the disparity into those cells precisely because doing so is invisible to the marginal metrics. Kearns et al. (2018) named this **fairness gerrymandering**, by analogy to how an oddly shaped electoral district can hide a population imbalance that looks fine at the state level. + +This is the more general, adversarial version of [intersectional bias](intersectional-bias.md). Intersectional bias is about checking one specific human-chosen pair (Black women, say) and finding a compounding gap. Subgroup fairness replaces "the pair a human picked" with "an automated search over a whole hypothesis class of subgroups" - for example, every group definable by a linear threshold over the features - looking for the subgroup where a fairness constraint is violated by the most. + +## How It Works + +Fix a fairness metric - selection rate, false positive rate, whatever the audit uses. For a subgroup `g` (a subset of the population picked out by some rule over attributes and features), define its violation as how far that metric inside `g` sits from the population value: + +``` +violation(g) = | metric(g) - metric(overall) | weighted by how large g is +``` + +Marginal fairness only bounds `violation(g)` for `g` in a short list: `g = {race = A}`, `g = {sex = F}`, and so on. Subgroup fairness bounds it for `g` in a much larger class `G` - all subgroups definable by a rule of a chosen form (conjunctions of a few attributes, or a linear threshold over features). + +You cannot enumerate `G` when it is large, so the audit is framed as a search: an **auditor** tries to find the `g` in `G` with the biggest violation; if it finds one above a threshold, the model fails. Kearns et al. formalize this as a two-player game between a learner (trying to build a model with no high-violation subgroup) and an auditor (trying to find one). The practical brute-force version, for a small feature set, is just: enumerate every combination of a few columns' values and check the metric in each cell. + +The reason this is worth doing rather than just checking more pairs by hand: the number of subgroups grows combinatorially, and the worst one is rarely the one an auditor would have guessed. + +## Concrete Example: Healthcare Readmission - Audit 06 + +`Healthcare Readmission/` audits the UCI diabetes 130-hospitals dataset (`diabetic_data.csv`, 101,766 encounters). The target is `readmitted == '<30'` (readmission within 30 days), and `gender`, `race`, and `age` are declared protected attributes. Using the dataset's own readmission rates (the base rate a label-level demographic parity check compares): + +**Marginal check on `gender` - passes:** + +| Group | n | Readmit < 30 | +|---|---:|---:| +| Female | 54,708 | 11.25% | +| Male | 47,055 | 11.06% | +| Gap | | 0.19 pp (ratio 0.984) | + +A 0.19-point gap clears the EEOC four-fifths rule (ratio 0.984, well above 0.80) and any reasonable demographic parity tolerance. On the `gender` axis alone, this dataset looks clean. + +**Now `gender x race` - the gender gap inside each race stratum:** + +| Race | Female rate | Male rate | Gender gap (F - M) | Subgroup n | +|---|---:|---:|---:|---:| +| Caucasian | 11.49% | 11.07% | +0.42 pp | 76,099 | +| AfricanAmerican | 11.08% | 11.43% | -0.34 pp | 19,210 | +| Hispanic | 9.16% | 11.85% | **-2.69 pp** | 2,037 | +| Asian | 7.55% | 12.69% | **-5.15 pp** | 641 | + +Among Asian patients, women are readmitted at 7.55% and men at 12.69% - a 5.15-point gap and a four-fifths ratio of 0.595, a clear violation, pointing the opposite direction from the (negligible) marginal gender gap. Among Hispanic patients the gender gap is -2.69 pp, also a reversal and also larger than the marginal. The `gender` guarantee that held at the population level does not hold once you condition on race, and no single-attribute check would have surfaced that. + +Two honest caveats, both of which the Limitations section expands: + +- The Asian subgroup has n = 641. That is above this repo's default `min_group_size` of 100, but small enough that a 5-point rate is not a precise estimate - exactly the case this repo's small-sample warnings exist for. +- This is on raw labels, not model predictions. The gerrymandering concern is strongest for a *model* that was optimized against marginal fairness metrics; a raw-label reversal like this is evidence that the phenomenon is present in the data the models are trained on. + +This repo's `--cross` flag (or the MCP `profile_dataset` `cross` option) computes exactly one such pairwise combination - the specific pair you name. It does not perform an open-ended search. Subgroup fairness is what you would need on top of it: a scan over many candidate subgroups, not one. + +```python +import pandas as pd + +df = pd.read_csv("Healthcare Readmission/diabetic_data.csv", low_memory=False) +df["y"] = (df["readmitted"] == "<30").astype(int) + +# marginal gender check - looks fine +by_sex = df.groupby("gender")["y"].mean() +print(by_sex["Female"] - by_sex["Male"]) # +0.0019 + +# the same gap inside the Asian stratum - a 5-point violation +asian = df[df["race"] == "Asian"] +by_sex_asian = asian.groupby("gender")["y"].mean() +print(by_sex_asian["Female"] - by_sex_asian["Male"]) # -0.0515 +``` + +## Detection Code + +The following module runs a brute-force subgroup scan: it enumerates every combination of values over a chosen set of columns, computes a rate metric inside each cell, and reports the cells whose deviation from the population rate exceeds a threshold - the manual, small-feature-set version of an auditor. It is contrasted with the single fixed pair `--cross` checks. + +```python +import itertools + +import numpy as np +import pandas as pd + + +def subgroup_scan( + df: pd.DataFrame, + outcome_col: str, + subgroup_cols: list[str], + max_depth: int = 2, + min_subgroup_size: int = 100, + deviation_threshold: float = 0.05, +) -> pd.DataFrame: + """ + Brute-force fairness-gerrymandering audit over subgroups defined by + conjunctions of up to max_depth of the subgroup_cols. + + outcome_col must be 0/1. For every conjunction (col_a = v_a AND col_b = v_b + AND ...) with at least min_subgroup_size rows, computes: + rate P(outcome = 1) inside the subgroup + deviation rate - overall_rate + four_fifths min(rate, overall) / max(rate, overall) + and returns the subgroups whose |deviation| >= deviation_threshold, + sorted by a size-weighted deviation so a large, badly-off subgroup ranks + above a tiny one. + + This is exhaustive only because subgroup_cols is small. A real subgroup- + fairness auditor searches a parameterized hypothesis class (e.g. linear + thresholds over features) instead of enumerating cells - see Kearns et + al. (2018). + """ + overall = df[outcome_col].mean() + n_total = len(df) + results = [] + + for depth in range(1, max_depth + 1): + for cols in itertools.combinations(subgroup_cols, depth): + grouped = df.groupby(list(cols))[outcome_col].agg(["mean", "count"]) + for key, row in grouped.iterrows(): + if row["count"] < min_subgroup_size: + continue + rate = row["mean"] + deviation = rate - overall + ff = (min(rate, overall) / max(rate, overall) + if max(rate, overall) > 0 else np.nan) + results.append({ + "subgroup": dict(zip(cols, key if depth > 1 else (key,))), + "n": int(row["count"]), + "rate": float(rate), + "deviation": float(deviation), + "four_fifths_ratio": float(ff), + "weighted_deviation": abs(deviation) * (row["count"] / n_total), + }) + + out = pd.DataFrame(results) + if out.empty: + return out + flagged = out[out["deviation"].abs() >= deviation_threshold] + return flagged.sort_values("weighted_deviation", ascending=False).reset_index(drop=True) + + +def compare_to_fixed_cross(df, outcome_col, pair): + """What this repo's --cross gives you: the metric for that ONE pair, + every cell, no search, no ranking by violation.""" + return df.groupby(list(pair))[outcome_col].agg(["mean", "count"]).round(4) + + +# Usage on the Healthcare Readmission audit: +# import pandas as pd +# df = pd.read_csv("Healthcare Readmission/diabetic_data.csv", low_memory=False) +# df["y"] = (df["readmitted"] == "<30").astype(int) +# print(subgroup_scan(df, "y", ["gender", "race", "age"], max_depth=2)) +# # the gender x race = (Asian, Female) cell surfaces with deviation ~ -0.036 +``` + +## Limitations and Trade-offs + +### 1. A full combinatorial search is expensive and overfits noise + +Enumerating every conjunction of `k` columns is exponential in `k`, and the search rewards finding the most extreme cell - which, for small subgroups, is often the noisiest one rather than the most unfair one. This repo's `min_group_size` default (100) and its "small group (metric may be unreliable)" warnings exist for exactly this reason. A flagged subgroup with 60 members and a 15-point deviation may be sampling noise; the same deviation at n = 5,000 is a finding. + +### 2. The hypothesis class is a design choice, and it bounds what you can catch + +An auditor that searches conjunctions of categorical attributes will not find a gerrymandered group defined by a linear threshold over continuous features, and vice versa. "Subgroup fair with respect to class G" is only as strong as G is expressive, and a richer G costs more compute and overfits harder. + +### 3. Passing a subgroup audit is not the same as being fair + +Kearns et al.'s guarantee is that no subgroup *in the searched class* has a large violation. A disparity that lives in a subgroup outside the class, or that only appears under a different metric, is still invisible. Subgroup fairness widens the net; it does not make it infinite. + +### 4. Fixing a flagged subgroup can move the disparity, not remove it + +Constraining the model to equalize a metric inside a discovered subgroup can push the imbalance into an adjacent, not-yet-searched subgroup - the same whack-a-mole that motivates the learner-auditor game in the first place. Iterating the game to convergence is the intended fix; a one-shot patch of the worst cell is not. + +## Related Concepts + +* [What Is Intersectional Bias?](intersectional-bias.md) - checking one specific, human-chosen combination of attributes; subgroup fairness is the open-ended search version. +* [What Is Individual Fairness?](individual-fairness.md) - the opposite pole: "similar individuals treated similarly" rather than any group-rate comparison. +* [What Is Simpson's Paradox in Fairness Audits?](simpsons-paradox.md) - why an aggregate rate can disagree with its disaggregated cells. +* [Why Fairness Metrics Conflict](fairness-metric-conflicts.md) - the impossibility results that also constrain what a subgroup audit can promise. +* [What Is the Base Rate Fallacy?](base-rate-fallacy.md) - why small subgroups produce volatile rate estimates. + +## Related Projects in This Repo + +* [`Healthcare Readmission/`](../Healthcare%20Readmission/) - the audit above; `gender` is clean marginally but the gender gap reaches -5 pp inside the Asian stratum. +* [`COMPAS/`](../COMPAS/) - `--cross race age` on this audit is a single fixed intersection; a subgroup scan would search race, sex, age, and custody-status combinations at once. + +## Further Reading + +* [Kearns, M., Neel, S., Roth, A., Wu, Z. S. (2018): Preventing Fairness Gerrymandering: Auditing and Learning for Subgroup Fairness, *ICML 2018* (PMLR 80)](https://arxiv.org/abs/1711.05144) - defines fairness gerrymandering and gives the learner-auditor game for auditing and enforcing subgroup fairness. +* [Kearns, M., Neel, S., Roth, A., Wu, Z. S. (2019): An Empirical Study of Rich Subgroup Fairness for Machine Learning, *FAT\* 2019*](https://arxiv.org/abs/1808.08166) - the follow-up experiments showing the method works on real datasets and what it costs. +* [Hebert-Johnson, U., Kim, M. P., Reingold, O., Rothblum, G. (2018): Multicalibration: Calibration for the (Computationally-Identifiable) Masses, *ICML 2018*](https://arxiv.org/abs/1711.08513) - a closely related guarantee (calibration, not selection rate) over a large class of subgroups. + +--- + +*Part of [The Fair Code Project](https://instagram.com/thefaircodeproject) - exposing and fixing algorithmic bias with real data and open code.* diff --git a/faircode/_explainers/unsupervised-learning.md b/faircode/_explainers/unsupervised-learning.md index e7d27fa..c190095 100644 --- a/faircode/_explainers/unsupervised-learning.md +++ b/faircode/_explainers/unsupervised-learning.md @@ -36,7 +36,7 @@ df['cluster'] = km.fit_predict(Xs) `sex`, `race`, and `native.country` never appear in `feature_cols`. The clustering step has no way to "see" them. Whatever split it produces has to come entirely from the other nine columns. -## Concrete Example: Benefits Denial - Audit 04 +## Concrete Example: Benefits Denial - Audit 05 Running the code above on the UCI Adult Census Income dataset (32,561 records, the same file the Benefits Denial audit trains on) produces two clusters of size 17,680 and 14,881. Neither `sex`, `race`, nor `native.country` was part of the clustering input, so the composition of each cluster along those attributes was checked after the fact, not fed in beforehand: diff --git a/llms-full.txt b/llms-full.txt index 5703bb8..80bc906 100644 --- a/llms-full.txt +++ b/llms-full.txt @@ -6521,7 +6521,7 @@ df['cluster'] = km.fit_predict(Xs) `sex`, `race`, and `native.country` never appear in `feature_cols`. The clustering step has no way to "see" them. Whatever split it produces has to come entirely from the other nine columns. -## Concrete Example: Benefits Denial - Audit 04 +## Concrete Example: Benefits Denial - Audit 05 Running the code above on the UCI Adult Census Income dataset (32,561 records, the same file the Benefits Denial audit trains on) produces two clusters of size 17,680 and 14,881. Neither `sex`, `race`, nor `native.country` was part of the clustering input, so the composition of each cluster along those attributes was checked after the fact, not fed in beforehand: @@ -11370,3 +11370,887 @@ A false negative and a false positive are rarely equally costly (see [False Posi *Part of [The Fair Code Project](https://instagram.com/thefaircodeproject) - exposing and fixing algorithmic bias with real data and open code.* +--- + +# What Is Simpson's Paradox in Fairness Audits? +URL: https://www.thefaircode.xyz/explainers/simpsons-paradox.html +Summary: Learn why an aggregate fairness metric is a weighted average of within-stratum rates, so pooling groups of different sizes can manufacture or flip a disparity. Uses the Benefits Denial (Adult Census) audit: the aggregate sex income gap of +19.6 pp collapses to roughly +3 pp within marital-status strata and reverses to -0.9 pp inside the largest one. + +# What Is Simpson's Paradox in Fairness Audits? + +> *A model can look fair in aggregate while every disaggregated subgroup shows the opposite pattern, or look unfair in aggregate when no subgroup does - because pooling groups of different sizes and base rates lets the mix, not the model, drive the headline number.* + +## The One-Sentence Definition + +**Simpson's Paradox** is a statistical phenomenon in which a trend or association that holds within every subgroup of the data reverses, disappears, or appears out of nowhere once the subgroups are combined into a single aggregate, because the subgroups differ in size and in their baseline rates. + +## Why It Matters + +Almost every fairness metric in this repo is a single aggregate number: one `demographic_parity_diff`, one selection-rate gap, one accuracy-equality figure per audit. That number is computed by pooling every row for a protected group and comparing the pooled rate to another group's pooled rate. + +Pooling is not neutral. When a protected group is distributed differently across the strata of some other variable - an occupation, a marital status, a loan product, a hospital - than the comparison group is, the aggregate comparison silently reweights those strata. The result is a headline gap that can be several times larger than any gap that actually exists within a stratum, can point the opposite direction from every stratum, or can vanish entirely. + +This is distinct from [intersectional bias](intersectional-bias.md), which is about a compounding gap that only appears at the *intersection* of two attributes and is hidden when you check one attribute at a time. Simpson's Paradox is the reverse direction: a gap that appears (or flips) in the *aggregate* and is not present, or is present with the opposite sign, once you disaggregate. Both are failures of looking at the data at the wrong level, but they pull in opposite directions, and a serious audit has to check for both. + +Simpson's Paradox does not tell you which view is correct. It only tells you that the aggregate and the disaggregated pictures disagree, which means the aggregate number alone cannot be trusted as a fairness finding without knowing why they disagree. + +## How It Works + +Let `Y` be a binary outcome (1 = the favorable outcome), `G` a protected group, and `S` a stratifying variable with levels `s`. The aggregate rate for a group is a weighted average of its within-stratum rates, where the weights are how that group is distributed across strata: + +``` +P(Y = 1 | G = g) = sum over s of P(S = s | G = g) * P(Y = 1 | G = g, S = s) +``` + +Two things vary between groups in that sum: the within-stratum rates `P(Y = 1 | G = g, S = s)`, and the stratum weights `P(S = s | G = g)`. The aggregate gap between two groups blends both. If the weights differ enough, the weight term can dominate and the aggregate gap stops reflecting the within-stratum rates at all. + +### A minimal reversal + +Consider a hiring screen with two departments. Within each department the callback rate for Group A is higher than for Group B: + +| Department | Group A callbacks | Group B callbacks | +|---|---|---| +| Engineering (easy to pass) | 70 / 80 = **87.5%** | 18 / 20 = **90.0%** | +| Design (hard to pass) | 2 / 20 = **10.0%** | 8 / 80 = **10.0%** | +| **Pooled** | 72 / 100 = **72.0%** | 26 / 100 = **26.0%** | + +Within Engineering, Group B does slightly better (90.0% vs 87.5%); within Design the two are tied (10.0% vs 10.0%). Neither department favors Group A. Yet the pooled rate shows Group A ahead by 46 points, because 80% of Group A's applicants are in the high-callback department and 80% of Group B's are in the low-callback one. The pooled 46-point "gap" is entirely a fact about where each group applied, not about how either group was treated inside a department. + +## Concrete Example: Benefits Denial - Audit 04 + +`Benefits Denial/` audits the Adult Census Income dataset (`adult.csv`, 32,561 rows), where the target is `income == '>50K'` and `sex` is a declared protected attribute. These are the dataset's own outcome rates (not a model's predictions), which is the base rate a demographic-parity check on the labels compares. + +**Aggregate:** + +| Group | n | P(income > 50K) | +|---|---:|---:| +| Male | 21,790 | **30.6%** | +| Female | 10,771 | **11.0%** | +| Gap (M - F) | | **+19.6 pp** | + +Now stratify by `marital.status`. The single largest stratum, `Married-civ-spouse`, holds 14,976 rows - 46% of the entire dataset: + +| Stratum | Male n | Male rate | Female n | Female rate | Gap (M - F) | +|---|---:|---:|---:|---:|---:| +| Married-civ-spouse | 13,319 | 44.6% | 1,657 | 45.5% | **-0.9 pp** | +| Never-married | 5,916 | 5.5% | 4,767 | 3.5% | +2.0 pp | +| Divorced | 1,771 | 16.0% | 2,672 | 6.7% | +9.3 pp | +| Widowed | 168 | 23.2% | 825 | 5.6% | +17.6 pp | +| Separated | 394 | 12.4% | 631 | 2.7% | +9.8 pp | + +Collapsed to just married vs not-married, the gap shrinks from +19.6 pp to **+3.0 pp** (married) and **+3.9 pp** (not married). And inside `Married-civ-spouse` - nearly half the data - the sign **reverses**: women are 0.9 points ahead. + +The mechanism is the stratum weights. Women are 52% of the "not married" pool, which has an overall high-income rate of 6.5%, but only 12% of the "married" pool, which has an overall rate of 43.7%. The aggregate comparison places most men in the high-earning stratum and splits women toward the low-earning one, so roughly 16 of the 19.6 aggregate points come from *where* each group sits, not from a within-stratum difference in outcome rates. + +Whether `marital.status` is a legitimate thing to condition on here is a separate, normative question - see [Conditional Demographic Parity](conditional-demographic-parity.md) and the Limitations section below. The point Simpson's Paradox makes is narrower: the +19.6 pp aggregate figure, reported on its own, describes the dataset's composition at least as much as it describes any disparity in outcomes. + +```python +import pandas as pd + +df = pd.read_csv("Benefits Denial/adult.csv") +df["high_income"] = (df["income"] == ">50K").astype(int) + + +def sex_gap(frame): + male = frame.loc[frame["sex"] == "Male", "high_income"].mean() + female = frame.loc[frame["sex"] == "Female", "high_income"].mean() + return male, female, male - female + + +print("aggregate:", sex_gap(df)) +# (0.3057, 0.1095, 0.1962) + +married = df[df["marital.status"] == "Married-civ-spouse"] +print("married-civ-spouse:", sex_gap(married)) +# (0.4458, 0.4550, -0.0092) <- sign reversed +``` + +## Detection Code + +The following module compares a rate gap computed in aggregate against the same gap computed within each stratum of a chosen variable, and reports whether the aggregate sign matches the strata, whether it is inflated, or whether it reverses. + +```python +import numpy as np +import pandas as pd + + +def simpsons_check( + df: pd.DataFrame, + outcome_col: str, + group_col: str, + advantaged: str, + disadvantaged: str, + stratify_col: str, + min_stratum_size: int = 100, + min_group_in_stratum: int = 30, +) -> dict: + """ + Compare the (advantaged - disadvantaged) outcome-rate gap in aggregate + against the same gap within each stratum of stratify_col. + + outcome_col must be 0/1. Returns a dict with the aggregate gap, a table + of per-stratum gaps (sample-size weighted), the weighted-average + within-stratum gap, and a verdict: + + "consistent" aggregate agrees in sign and rough size with strata + "inflated" same sign, but |aggregate| far exceeds the weighted + within-stratum gap (aggregation is amplifying it) + "sign_reversal" aggregate sign is opposite the weighted within gap, + or opposite the majority of strata by sample size + """ + d = df[[outcome_col, group_col, stratify_col]].dropna() + d = d[d[group_col].isin([advantaged, disadvantaged])] + + def gap(frame): + a = frame.loc[frame[group_col] == advantaged, outcome_col] + b = frame.loc[frame[group_col] == disadvantaged, outcome_col] + if len(a) == 0 or len(b) == 0: + return np.nan, len(a), len(b) + return a.mean() - b.mean(), len(a), len(b) + + agg_gap, n_adv, n_dis = gap(d) + + rows = [] + for value, sub in d.groupby(stratify_col): + if len(sub) < min_stratum_size: + continue + g, na, nb = gap(sub) + if np.isnan(g) or min(na, nb) < min_group_in_stratum: + continue + rows.append({"stratum": value, "n": len(sub), "gap": g, + "n_advantaged": na, "n_disadvantaged": nb}) + + strata = pd.DataFrame(rows).sort_values("n", ascending=False) + if strata.empty: + return {"verdict": "insufficient_data", "aggregate_gap": agg_gap, + "strata": strata} + + weights = strata["n"] / strata["n"].sum() + weighted_within_gap = float((strata["gap"] * weights).sum()) + + same_sign = np.sign(agg_gap) == np.sign(weighted_within_gap) + majority_n_opposite = strata.loc[ + np.sign(strata["gap"]) != np.sign(agg_gap), "n" + ].sum() > strata["n"].sum() / 2 + + if not same_sign or majority_n_opposite: + verdict = "sign_reversal" + elif abs(agg_gap) > 2 * abs(weighted_within_gap) + 0.05: + verdict = "inflated" + else: + verdict = "consistent" + + return { + "verdict": verdict, + "aggregate_gap": float(agg_gap), + "weighted_within_stratum_gap": weighted_within_gap, + "n_advantaged": int(n_adv), + "n_disadvantaged": int(n_dis), + "strata": strata.reset_index(drop=True), + } + + +def print_simpsons_report(result: dict) -> None: + print(f"Verdict: {result['verdict']}") + print(f" aggregate gap (adv - dis): {result['aggregate_gap']:+.4f}") + if "weighted_within_stratum_gap" in result: + print(f" weighted within-stratum gap: " + f"{result['weighted_within_stratum_gap']:+.4f}") + print("\n per-stratum gaps (largest first):") + for _, row in result["strata"].iterrows(): + flip = " <- opposite sign" if ( + np.sign(row["gap"]) != np.sign(result["aggregate_gap"]) + ) else "" + print(f" {str(row['stratum'])[:24]:24s} " + f"n={int(row['n']):6d} gap={row['gap']:+.4f}{flip}") + + +# Usage on the Benefits Denial audit: +# import pandas as pd +# df = pd.read_csv("Benefits Denial/adult.csv") +# df["high_income"] = (df["income"] == ">50K").astype(int) +# print_simpsons_report(simpsons_check( +# df, "high_income", "sex", "Male", "Female", "marital.status")) +``` + +Run against `Benefits Denial/adult.csv` with `stratify_col="marital.status"`, this reports `sign_reversal`: the aggregate `+0.196` gap is opposite in sign to the `Married-civ-spouse` stratum, which by itself is a plurality of the sample. + +## Limitations and Trade-offs + +### 1. There is no single correct level of aggregation + +Simpson's Paradox flags a disagreement; it does not adjudicate it. Whether the aggregate or the within-stratum view is the "real" fairness finding depends on whether the stratifying variable is a legitimate explanation for the outcome difference or is itself part of the discrimination. Conditioning on a variable that is a proxy for the protected attribute launders the disparity away (see [Proxy Variables](proxy-variables.md)); conditioning on a genuinely exogenous factor removes a confound. That judgment is normative and domain-specific, not statistical. + +### 2. Choosing the stratifying variable is a modeling decision + +You will not find a reversal for every variable. The detection code above tests one variable at a time; running it across many candidate strata invites finding a reversal by chance, especially with small strata. A reported reversal is only meaningful for a variable there is an independent reason to care about. + +### 3. Small strata produce unstable per-group rates + +Disaggregation shrinks sample sizes fast. A stratum where one group has 30 members will have a within-stratum rate with a wide confidence interval, and its "gap" can flip sign across dataset splits from noise alone. The `min_group_in_stratum` guard mitigates but does not eliminate this. + +### 4. Continuous confounders need binning, and the bins matter + +The example used a categorical stratifier. For a continuous confounder (age, income, tenure) you have to choose bin edges, and coarse or misaligned bins can hide a reversal that finer bins would show, or manufacture one. Report the binning alongside the result. + +## Related Concepts + +* [What Is Intersectional Bias?](intersectional-bias.md) - the opposite failure: a compounding gap visible only at the intersection of two attributes, hidden when each is checked alone. +* [What Is Conditional Demographic Parity?](conditional-demographic-parity.md) - the fairness metric built specifically around checking parity *within* strata of a chosen legitimate factor. +* [What Is a Confounding Variable?](confounding-variable.md) - the underlying causal structure that makes Simpson's reversals possible. +* [What Is the Base Rate Fallacy?](base-rate-fallacy.md) - a related error about ignoring prior probabilities when reading a conditional rate. +* [What Is a Proxy Variable?](proxy-variables.md) - why conditioning on the wrong variable can hide real discrimination instead of explaining it. + +## Related Projects in This Repo + +* [`Benefits Denial/`](../Benefits%20Denial/) - the Adult Census Income audit used above; the aggregate `sex` income gap is roughly five times any within-marital-status gap and reverses inside the largest stratum. +* [`Healthcare Readmission/`](../Healthcare%20Readmission/) - a multi-hospital readmission audit where per-facility case mix is a natural stratifier for an aggregate readmission-rate gap. + +## Further Reading + +* [Bickel, P. J., Hammel, E. A., O'Connell, J. W. (1975): Sex Bias in Graduate Admissions: Data from Berkeley, *Science*, 187(4175), 398-404](https://www.science.org/doi/10.1126/science.187.4175.398) - the canonical worked example: Berkeley's aggregate admit rate favored men, but department by department it did not. +* [Simpson, E. H. (1951): The Interpretation of Interaction in Contingency Tables, *Journal of the Royal Statistical Society B*, 13(2), 238-241](https://www.jstor.org/stable/2984065) - the paper the effect is named after. +* [Pearl, J. (2014): Comment: Understanding Simpson's Paradox, *The American Statistician*, 68(1), 8-13](https://ftp.cs.ucla.edu/pub/stat_ser/r414.pdf) - why the paradox is a causal question, not a statistical one, and why no purely statistical rule resolves it. + +--- + +*Part of [The Fair Code Project](https://instagram.com/thefaircodeproject) - exposing and fixing algorithmic bias with real data and open code.* + +--- + +# What Is Conditional Demographic Parity? +URL: https://www.thefaircode.xyz/explainers/conditional-demographic-parity.html +Summary: Learn how conditional demographic parity refines plain demographic parity by stratifying on an explicitly chosen legitimate factor, and why the choice of that factor decides the answer. Uses the Benefits Denial (Adult Census) audit: conditioning the +19.6 pp sex income gap on education leaves it at +18.4 pp, while conditioning on marital status removes about 84% of it. + +# What Is Conditional Demographic Parity? + +> *Plain demographic parity asks whether two groups get positive outcomes at the same rate. Conditional demographic parity asks whether they get them at the same rate once you hold a chosen "legitimate" factor fixed - and the choice of that factor decides the answer.* + +## The One-Sentence Definition + +**Conditional demographic parity** (CDP) requires equal positive-outcome rates across protected groups *within* each stratum of one or more explicitly chosen legitimate factors, rather than across the whole population at once. + +## Why It Matters + +Plain [demographic parity](demographic-parity.md) requires `P(Y_hat = 1 | G = A) = P(Y_hat = 1 | G = B)` unconditionally. Two things go wrong with that in practice: + +- It is satisfied by a model that is equally useless for everyone (predict the base rate, ignore the features), so passing it is not evidence of a good model. +- It is violated by a model that legitimately uses a lawful, non-proxy factor - years of experience in a hiring model, loan amount in a credit model - that happens to correlate with a protected group. The violation may be entirely explained by that factor, not by the protected attribute. + +Conditional demographic parity is the standard refinement for the second problem. You pick one or more conditioning factors `L` that you are willing to treat as a legitimate basis for outcome differences, stratify the population by `L`, and check demographic parity *within* each stratum: + +``` +P(Y_hat = 1 | G = A, L = l) = P(Y_hat = 1 | G = B, L = l) for every level l +``` + +If the groups reach parity within every stratum of `L`, the aggregate gap was "explained by `L`". If a gap persists within strata, `L` does not account for it. + +This is a real, commonly used construction - it is the fairness analogue of adding a control variable to a regression, and it is close to what US disparate-impact analysis does when it asks whether a challenged practice is "job related and consistent with business necessity". It is not a synonym for plain demographic parity, and it is not the same as [intersectional](intersectional-bias.md) or [subgroup](subgroup-fairness.md) fairness, which stratify by *other protected attributes* to find hidden gaps rather than by a legitimate factor to explain one. + +## How It Works + +Start from the identity that makes the aggregate gap decomposable. For each group `g`: + +``` +P(Y_hat = 1 | G = g) = sum over l of P(L = l | G = g) * P(Y_hat = 1 | G = g, L = l) +``` + +The aggregate rate is a weighted average of within-stratum rates, weighted by how group `g` is distributed across the strata of `L`. Subtracting the two groups' aggregate rates gives a gap with two sources: different within-stratum rates (`P(Y_hat = 1 | G = g, L = l)` differs by `g`), and different stratum weights (`P(L = l | G = g)` differs by `g`). + +Conditional demographic parity zeroes out the second source by construction: it only compares groups at the same value of `L`. What is left is the within-stratum gap. A sample-size-weighted average of the within-stratum gaps is the part of the aggregate gap that stratifying on `L` does *not* remove. + +The catch is entirely in the choice of `L`. If `L` is a genuine exogenous factor, the within-stratum gap is the disparity net of a real confounder. If `L` is a [proxy](proxy-variables.md) for the protected attribute, conditioning on it absorbs the discrimination into the "legitimate" term and the within-stratum gap understates the real harm. CDP gives you a knob; it does not tell you where to set it. + +## Concrete Example: Benefits Denial - Audit 04 + +`Benefits Denial/` audits the Adult Census Income dataset (`adult.csv`, 32,561 rows). The target is `income == '>50K'` and `sex` is a declared protected attribute. Using the dataset's own outcome rates (the base rate a label-level demographic parity check compares): + +**Unconditional:** + +| Group | n | P(income > 50K) | +|---|---:|---:| +| Male | 21,790 | 30.6% | +| Female | 10,771 | 11.0% | +| Gap (M - F) | | **+19.6 pp** | + +Now apply CDP with two different choices of legitimate factor `L`. + +### L = education level (`education.num`, 15 levels) + +| education.num | n | Gap (M - F) | +|---:|---:|---:| +| 9 (HS grad) | 10,501 | +13.7 pp | +| 10 (some college) | 7,291 | +19.5 pp | +| 13 (Bachelors) | 5,355 | +29.4 pp | +| 14 (Masters) | 1,723 | +32.3 pp | +| 15 (Prof-school) | 576 | +33.1 pp | +| 16 (Doctorate) | 413 | +20.2 pp | + +Sample-weighted within-stratum gap: **+18.4 pp**. Conditioning on education removes almost none of the aggregate gap - within every education level men are markedly more likely to be high earners, and at the top three levels the gap is *larger* than the unconditional +19.6. CDP conditioned on education says: the disparity is not an artifact of women being less educated in this dataset. + +### L = marital status (`marital.status`) + +| marital.status | n | Gap (M - F) | +|---|---:|---:| +| Married-civ-spouse | 14,976 | -0.9 pp | +| Never-married | 10,683 | +2.0 pp | +| Divorced | 4,443 | +9.3 pp | +| Widowed | 993 | +17.6 pp | + +Sample-weighted within-stratum gap: roughly **+3 pp**, and inside the single largest stratum the sign reverses (women 0.9 points ahead). Conditioning on marital status makes most of the aggregate gap disappear. + +### The two answers disagree, and that is the point + +Same protected attribute, same dataset, same +19.6 pp aggregate. Condition on education and the gap stands. Condition on marital status and it nearly vanishes. CDP did not resolve the fairness question - it moved it to a new one: *is marital status a legitimate basis for a 20-point income difference between men and women, or is it a proxy for a sex-role division of unpaid labor that the outcome variable should not be conditioned on?* That is a normative and legal question, not a statistical one, and CDP's output is only as defensible as the answer to it. (This is the same aggregate-vs-stratified divergence covered from the other direction in [Simpson's Paradox](simpsons-paradox.md).) + +```python +import pandas as pd +import numpy as np + +df = pd.read_csv("Benefits Denial/adult.csv") +df["high_income"] = (df["income"] == ">50K").astype(int) + + +def within_stratum_gap(frame, condition_col): + rows = [] + for level, sub in frame.groupby(condition_col): + m = sub.loc[sub["sex"] == "Male", "high_income"] + f = sub.loc[sub["sex"] == "Female", "high_income"] + if len(m) < 30 or len(f) < 30: + continue + rows.append((level, len(sub), m.mean() - f.mean())) + tbl = pd.DataFrame(rows, columns=["level", "n", "gap"]) + weighted = np.average(tbl["gap"], weights=tbl["n"]) + return tbl, weighted + + +for col in ("education.num", "marital.status"): + _, w = within_stratum_gap(df, col) + print(f"condition on {col:16s}: weighted within-stratum gap = {w:+.4f}") +# condition on education.num : weighted within-stratum gap = +0.1844 +# condition on marital.status : weighted within-stratum gap = +0.0305 +``` + +## Detection Code + +The following module computes the unconditional demographic parity gap, the conditional (within-stratum) gap for a chosen legitimate factor, and the fraction of the unconditional gap that conditioning explains away. + +```python +import numpy as np +import pandas as pd + + +def conditional_demographic_parity( + df: pd.DataFrame, + outcome_col: str, + group_col: str, + advantaged: str, + disadvantaged: str, + condition_cols: list[str], + min_group_in_stratum: int = 30, +) -> dict: + """ + Compare the unconditional demographic parity gap for (advantaged - + disadvantaged) against the gap computed within each stratum defined by + cross-tabulating condition_cols. + + outcome_col must be 0/1. Returns a dict with: + unconditional_gap aggregate P(Y=1|adv) - P(Y=1|dis) + conditional_gap sample-size-weighted mean of within-stratum gaps + explained_fraction 1 - conditional_gap / unconditional_gap, i.e. + how much of the aggregate gap stratifying removed + strata per-stratum table (level, n, gap) + + A strata row is skipped if either group has fewer than + min_group_in_stratum members in it (its within-stratum rate would be too + noisy to compare). + """ + d = df[[outcome_col, group_col, *condition_cols]].dropna() + d = d[d[group_col].isin([advantaged, disadvantaged])] + + def gap(frame): + a = frame.loc[frame[group_col] == advantaged, outcome_col] + b = frame.loc[frame[group_col] == disadvantaged, outcome_col] + if len(a) == 0 or len(b) == 0: + return np.nan, len(a), len(b) + return a.mean() - b.mean(), len(a), len(b) + + uncond_gap, _, _ = gap(d) + + rows = [] + for level, sub in d.groupby(condition_cols if len(condition_cols) > 1 + else condition_cols[0]): + g, na, nb = gap(sub) + if np.isnan(g) or min(na, nb) < min_group_in_stratum: + continue + rows.append({"level": level, "n": len(sub), "gap": g}) + + strata = pd.DataFrame(rows).sort_values("n", ascending=False) + if strata.empty: + return {"unconditional_gap": float(uncond_gap), + "conditional_gap": np.nan, "explained_fraction": np.nan, + "strata": strata} + + cond_gap = float(np.average(strata["gap"], weights=strata["n"])) + explained = (1.0 - cond_gap / uncond_gap) if uncond_gap != 0 else np.nan + + return { + "unconditional_gap": float(uncond_gap), + "conditional_gap": cond_gap, + "explained_fraction": float(explained), + "strata": strata.reset_index(drop=True), + } + + +def print_cdp_report(result: dict, condition_label: str) -> None: + print(f"Conditioning factor: {condition_label}") + print(f" unconditional DP gap: {result['unconditional_gap']:+.4f}") + print(f" conditional (within) DP gap: {result['conditional_gap']:+.4f}") + if not np.isnan(result["explained_fraction"]): + print(f" fraction of gap explained: " + f"{result['explained_fraction']:.1%}") + print(" per-stratum gaps (largest first):") + for _, row in result["strata"].iterrows(): + print(f" {str(row['level'])[:28]:28s} n={int(row['n']):6d} " + f"gap={row['gap']:+.4f}") + + +# Usage on the Benefits Denial audit: +# import pandas as pd +# df = pd.read_csv("Benefits Denial/adult.csv") +# df["high_income"] = (df["income"] == ">50K").astype(int) +# print_cdp_report(conditional_demographic_parity( +# df, "high_income", "sex", "Male", "Female", ["education.num"]), +# "education.num") +# print_cdp_report(conditional_demographic_parity( +# df, "high_income", "sex", "Male", "Female", ["marital.status"]), +# "marital.status") +``` + +Against `Benefits Denial/adult.csv` this reports an `explained_fraction` near `0.06` for `education.num` (conditioning removes almost nothing) and near `0.84` for `marital.status` (conditioning removes most of the gap) - the same +19.6 pp aggregate, two incompatible readings. + +## Limitations and Trade-offs + +### 1. The conditioning set is a value judgment, not a statistical choice + +Everything CDP reports is downstream of which factors you declared "legitimate". There is no test that tells you whether marital status, or occupation, or prior loan history, is a fair thing to condition on. Pick a factor that is genuinely a proxy for the protected attribute and CDP will confidently report that the disparity is "explained", which is exactly the [proxy-variable](proxy-variables.md) trap. + +### 2. Conditioning can only ever shrink or hold the gap you can attribute, never validate the factor + +A small within-stratum gap means the aggregate gap co-varies with `L`. It does not mean `L` *causes* the outcome difference, and it does not mean using `L` is lawful or ethical. Those require an argument outside the data. + +### 3. Strata multiply fast and thin out + +Conditioning on one categorical factor is usually fine; conditioning on two or three cross-tabulated factors produces many strata with tiny per-group counts, unstable within-stratum rates, and a weighted gap dominated by a few large cells. Keep the conditioning set minimal and report per-stratum sample sizes. + +### 4. Continuous conditioning factors require binning + +`education.num` above is discrete. A continuous factor (age, income, tenure) has to be binned, and the bin edges change the answer. Coarse bins can leave residual confounding inside each bin; fine bins run into the small-strata problem in point 3. + +### 5. It does not fix the "equally useless model" hole + +Like plain demographic parity, CDP is a rate comparison. A model that is equally bad within every stratum still passes. CDP tightens demographic parity against one specific failure (a legitimate confounder); it does not turn it into a sufficiency or calibration guarantee. + +## Related Concepts + +* [What Is Demographic Parity?](demographic-parity.md) - the unconditional metric CDP refines. +* [What Is a Proxy Variable?](proxy-variables.md) - why conditioning on the wrong factor launders discrimination instead of explaining it. +* [What Is Simpson's Paradox in Fairness Audits?](simpsons-paradox.md) - the same aggregate-vs-stratified divergence, framed as a reversal rather than a refinement. +* [What Is Subgroup Fairness (and Fairness Gerrymandering)?](subgroup-fairness.md) - stratifying by other protected attributes to find hidden gaps, the opposite motivation from CDP. +* [Why Fairness Metrics Conflict](fairness-metric-conflicts.md) - where conditional and unconditional parity sit among the impossibility results. + +## Related Projects in This Repo + +* [`Benefits Denial/`](../Benefits%20Denial/) - the Adult Census Income audit above; conditioning the `sex` income gap on education preserves it, conditioning on marital status removes it. +* [`German Credit Lending/`](../German%20Credit%20Lending/) - a credit audit where loan amount and credit history are candidate "business necessity" factors to condition an age gap on. + +## Further Reading + +* [Corbett-Davies, S., Pierson, E., Feller, A., Goel, S., Huq, A. (2017): Algorithmic Decision Making and the Cost of Fairness, *KDD 2017*](https://arxiv.org/abs/1701.08230) - introduces conditional statistical parity and shows how the choice of conditioning variables trades off against error rates. +* [Wachter, S., Mittelstadt, B., Russell, C. (2021): Why Fairness Cannot Be Automated, *Computer Law and Security Review*, 41](https://arxiv.org/abs/2005.05906) - argues that the "legitimate factor" choice at the heart of conditional parity mirrors, and cannot be separated from, EU non-discrimination law's contextual reasoning. +* [Kilbertus, N., Rojas-Carulla, M., Parascandolo, G., Hardt, M., Janzing, D., Scholkopf, B. (2017): Avoiding Discrimination through Causal Reasoning, *NeurIPS 2017*](https://arxiv.org/abs/1706.02744) - frames "which variables may we condition on" as a causal-graph question rather than a statistical one. + +--- + +*Part of [The Fair Code Project](https://instagram.com/thefaircodeproject) - exposing and fixing algorithmic bias with real data and open code.* + +--- + +# What Is Subgroup Fairness (and Fairness Gerrymandering)? +URL: https://www.thefaircode.xyz/explainers/subgroup-fairness.html +Summary: Learn how a model can satisfy a fairness metric on each protected attribute individually yet fail on an algorithmically-discoverable subgroup, and how a brute-force subgroup scan differs from this repo's fixed-pair --cross. Uses the Healthcare Readmission audit: the gender readmission gap is 0.19 pp overall but -5.15 pp inside the Asian patient subgroup. + +# What Is Subgroup Fairness (and Fairness Gerrymandering)? + +> *A model can pass a fairness check on race, pass it on sex, pass it on age, and still fail badly on some combination like "women over 50 in a particular region" that nobody thought to check by hand. Subgroup fairness is what you get when you stop hand-picking the groups and search for the one where the guarantee breaks.* + +## The One-Sentence Definition + +**Subgroup fairness** requires a fairness metric to hold not just on each protected attribute checked individually, but across a large, structured class of subgroups defined by combinations of attributes and features - and **fairness gerrymandering** is the failure mode where a model satisfies every marginal check while hiding a large disparity inside one of those combinations. + +## Why It Matters + +Checking `race`, then `sex`, then `age` separately gives you three guarantees, one per axis. Adding a hand-chosen pair, the way this repo's `--cross` flag does for a single intersection (SPEC section 4), gives you a fourth. None of that is the same as a guarantee over *every* combinatorially definable subgroup. + +The gap between "fair on each attribute I checked" and "fair on every subgroup" is exploitable, and not only by an adversary. A model trained to minimize a marginal fairness violation - equalize selection rates by race, and by sex - has no incentive to equalize them for `race x sex x age-band` cells it was never scored on. It can push the disparity into those cells precisely because doing so is invisible to the marginal metrics. Kearns et al. (2018) named this **fairness gerrymandering**, by analogy to how an oddly shaped electoral district can hide a population imbalance that looks fine at the state level. + +This is the more general, adversarial version of [intersectional bias](intersectional-bias.md). Intersectional bias is about checking one specific human-chosen pair (Black women, say) and finding a compounding gap. Subgroup fairness replaces "the pair a human picked" with "an automated search over a whole hypothesis class of subgroups" - for example, every group definable by a linear threshold over the features - looking for the subgroup where a fairness constraint is violated by the most. + +## How It Works + +Fix a fairness metric - selection rate, false positive rate, whatever the audit uses. For a subgroup `g` (a subset of the population picked out by some rule over attributes and features), define its violation as how far that metric inside `g` sits from the population value: + +``` +violation(g) = | metric(g) - metric(overall) | weighted by how large g is +``` + +Marginal fairness only bounds `violation(g)` for `g` in a short list: `g = {race = A}`, `g = {sex = F}`, and so on. Subgroup fairness bounds it for `g` in a much larger class `G` - all subgroups definable by a rule of a chosen form (conjunctions of a few attributes, or a linear threshold over features). + +You cannot enumerate `G` when it is large, so the audit is framed as a search: an **auditor** tries to find the `g` in `G` with the biggest violation; if it finds one above a threshold, the model fails. Kearns et al. formalize this as a two-player game between a learner (trying to build a model with no high-violation subgroup) and an auditor (trying to find one). The practical brute-force version, for a small feature set, is just: enumerate every combination of a few columns' values and check the metric in each cell. + +The reason this is worth doing rather than just checking more pairs by hand: the number of subgroups grows combinatorially, and the worst one is rarely the one an auditor would have guessed. + +## Concrete Example: Healthcare Readmission - Audit 06 + +`Healthcare Readmission/` audits the UCI diabetes 130-hospitals dataset (`diabetic_data.csv`, 101,766 encounters). The target is `readmitted == '<30'` (readmission within 30 days), and `gender`, `race`, and `age` are declared protected attributes. Using the dataset's own readmission rates (the base rate a label-level demographic parity check compares): + +**Marginal check on `gender` - passes:** + +| Group | n | Readmit < 30 | +|---|---:|---:| +| Female | 54,708 | 11.25% | +| Male | 47,055 | 11.06% | +| Gap | | 0.19 pp (ratio 0.984) | + +A 0.19-point gap clears the EEOC four-fifths rule (ratio 0.984, well above 0.80) and any reasonable demographic parity tolerance. On the `gender` axis alone, this dataset looks clean. + +**Now `gender x race` - the gender gap inside each race stratum:** + +| Race | Female rate | Male rate | Gender gap (F - M) | Subgroup n | +|---|---:|---:|---:|---:| +| Caucasian | 11.49% | 11.07% | +0.42 pp | 76,099 | +| AfricanAmerican | 11.08% | 11.43% | -0.34 pp | 19,210 | +| Hispanic | 9.16% | 11.85% | **-2.69 pp** | 2,037 | +| Asian | 7.55% | 12.69% | **-5.15 pp** | 641 | + +Among Asian patients, women are readmitted at 7.55% and men at 12.69% - a 5.15-point gap and a four-fifths ratio of 0.595, a clear violation, pointing the opposite direction from the (negligible) marginal gender gap. Among Hispanic patients the gender gap is -2.69 pp, also a reversal and also larger than the marginal. The `gender` guarantee that held at the population level does not hold once you condition on race, and no single-attribute check would have surfaced that. + +Two honest caveats, both of which the Limitations section expands: + +- The Asian subgroup has n = 641. That is above this repo's default `min_group_size` of 100, but small enough that a 5-point rate is not a precise estimate - exactly the case this repo's small-sample warnings exist for. +- This is on raw labels, not model predictions. The gerrymandering concern is strongest for a *model* that was optimized against marginal fairness metrics; a raw-label reversal like this is evidence that the phenomenon is present in the data the models are trained on. + +This repo's `--cross` flag (or the MCP `profile_dataset` `cross` option) computes exactly one such pairwise combination - the specific pair you name. It does not perform an open-ended search. Subgroup fairness is what you would need on top of it: a scan over many candidate subgroups, not one. + +```python +import pandas as pd + +df = pd.read_csv("Healthcare Readmission/diabetic_data.csv", low_memory=False) +df["y"] = (df["readmitted"] == "<30").astype(int) + +# marginal gender check - looks fine +by_sex = df.groupby("gender")["y"].mean() +print(by_sex["Female"] - by_sex["Male"]) # +0.0019 + +# the same gap inside the Asian stratum - a 5-point violation +asian = df[df["race"] == "Asian"] +by_sex_asian = asian.groupby("gender")["y"].mean() +print(by_sex_asian["Female"] - by_sex_asian["Male"]) # -0.0515 +``` + +## Detection Code + +The following module runs a brute-force subgroup scan: it enumerates every combination of values over a chosen set of columns, computes a rate metric inside each cell, and reports the cells whose deviation from the population rate exceeds a threshold - the manual, small-feature-set version of an auditor. It is contrasted with the single fixed pair `--cross` checks. + +```python +import itertools + +import numpy as np +import pandas as pd + + +def subgroup_scan( + df: pd.DataFrame, + outcome_col: str, + subgroup_cols: list[str], + max_depth: int = 2, + min_subgroup_size: int = 100, + deviation_threshold: float = 0.05, +) -> pd.DataFrame: + """ + Brute-force fairness-gerrymandering audit over subgroups defined by + conjunctions of up to max_depth of the subgroup_cols. + + outcome_col must be 0/1. For every conjunction (col_a = v_a AND col_b = v_b + AND ...) with at least min_subgroup_size rows, computes: + rate P(outcome = 1) inside the subgroup + deviation rate - overall_rate + four_fifths min(rate, overall) / max(rate, overall) + and returns the subgroups whose |deviation| >= deviation_threshold, + sorted by a size-weighted deviation so a large, badly-off subgroup ranks + above a tiny one. + + This is exhaustive only because subgroup_cols is small. A real subgroup- + fairness auditor searches a parameterized hypothesis class (e.g. linear + thresholds over features) instead of enumerating cells - see Kearns et + al. (2018). + """ + overall = df[outcome_col].mean() + n_total = len(df) + results = [] + + for depth in range(1, max_depth + 1): + for cols in itertools.combinations(subgroup_cols, depth): + grouped = df.groupby(list(cols))[outcome_col].agg(["mean", "count"]) + for key, row in grouped.iterrows(): + if row["count"] < min_subgroup_size: + continue + rate = row["mean"] + deviation = rate - overall + ff = (min(rate, overall) / max(rate, overall) + if max(rate, overall) > 0 else np.nan) + results.append({ + "subgroup": dict(zip(cols, key if depth > 1 else (key,))), + "n": int(row["count"]), + "rate": float(rate), + "deviation": float(deviation), + "four_fifths_ratio": float(ff), + "weighted_deviation": abs(deviation) * (row["count"] / n_total), + }) + + out = pd.DataFrame(results) + if out.empty: + return out + flagged = out[out["deviation"].abs() >= deviation_threshold] + return flagged.sort_values("weighted_deviation", ascending=False).reset_index(drop=True) + + +def compare_to_fixed_cross(df, outcome_col, pair): + """What this repo's --cross gives you: the metric for that ONE pair, + every cell, no search, no ranking by violation.""" + return df.groupby(list(pair))[outcome_col].agg(["mean", "count"]).round(4) + + +# Usage on the Healthcare Readmission audit: +# import pandas as pd +# df = pd.read_csv("Healthcare Readmission/diabetic_data.csv", low_memory=False) +# df["y"] = (df["readmitted"] == "<30").astype(int) +# print(subgroup_scan(df, "y", ["gender", "race", "age"], max_depth=2)) +# # the gender x race = (Asian, Female) cell surfaces with deviation ~ -0.036 +``` + +## Limitations and Trade-offs + +### 1. A full combinatorial search is expensive and overfits noise + +Enumerating every conjunction of `k` columns is exponential in `k`, and the search rewards finding the most extreme cell - which, for small subgroups, is often the noisiest one rather than the most unfair one. This repo's `min_group_size` default (100) and its "small group (metric may be unreliable)" warnings exist for exactly this reason. A flagged subgroup with 60 members and a 15-point deviation may be sampling noise; the same deviation at n = 5,000 is a finding. + +### 2. The hypothesis class is a design choice, and it bounds what you can catch + +An auditor that searches conjunctions of categorical attributes will not find a gerrymandered group defined by a linear threshold over continuous features, and vice versa. "Subgroup fair with respect to class G" is only as strong as G is expressive, and a richer G costs more compute and overfits harder. + +### 3. Passing a subgroup audit is not the same as being fair + +Kearns et al.'s guarantee is that no subgroup *in the searched class* has a large violation. A disparity that lives in a subgroup outside the class, or that only appears under a different metric, is still invisible. Subgroup fairness widens the net; it does not make it infinite. + +### 4. Fixing a flagged subgroup can move the disparity, not remove it + +Constraining the model to equalize a metric inside a discovered subgroup can push the imbalance into an adjacent, not-yet-searched subgroup - the same whack-a-mole that motivates the learner-auditor game in the first place. Iterating the game to convergence is the intended fix; a one-shot patch of the worst cell is not. + +## Related Concepts + +* [What Is Intersectional Bias?](intersectional-bias.md) - checking one specific, human-chosen combination of attributes; subgroup fairness is the open-ended search version. +* [What Is Individual Fairness?](individual-fairness.md) - the opposite pole: "similar individuals treated similarly" rather than any group-rate comparison. +* [What Is Simpson's Paradox in Fairness Audits?](simpsons-paradox.md) - why an aggregate rate can disagree with its disaggregated cells. +* [Why Fairness Metrics Conflict](fairness-metric-conflicts.md) - the impossibility results that also constrain what a subgroup audit can promise. +* [What Is the Base Rate Fallacy?](base-rate-fallacy.md) - why small subgroups produce volatile rate estimates. + +## Related Projects in This Repo + +* [`Healthcare Readmission/`](../Healthcare%20Readmission/) - the audit above; `gender` is clean marginally but the gender gap reaches -5 pp inside the Asian stratum. +* [`COMPAS/`](../COMPAS/) - `--cross race age` on this audit is a single fixed intersection; a subgroup scan would search race, sex, age, and custody-status combinations at once. + +## Further Reading + +* [Kearns, M., Neel, S., Roth, A., Wu, Z. S. (2018): Preventing Fairness Gerrymandering: Auditing and Learning for Subgroup Fairness, *ICML 2018* (PMLR 80)](https://arxiv.org/abs/1711.05144) - defines fairness gerrymandering and gives the learner-auditor game for auditing and enforcing subgroup fairness. +* [Kearns, M., Neel, S., Roth, A., Wu, Z. S. (2019): An Empirical Study of Rich Subgroup Fairness for Machine Learning, *FAT\* 2019*](https://arxiv.org/abs/1808.08166) - the follow-up experiments showing the method works on real datasets and what it costs. +* [Hebert-Johnson, U., Kim, M. P., Reingold, O., Rothblum, G. (2018): Multicalibration: Calibration for the (Computationally-Identifiable) Masses, *ICML 2018*](https://arxiv.org/abs/1711.08513) - a closely related guarantee (calibration, not selection rate) over a large class of subgroups. + +--- + +*Part of [The Fair Code Project](https://instagram.com/thefaircodeproject) - exposing and fixing algorithmic bias with real data and open code.* + +--- + +# What Is Differential Privacy (and Its Tension With Fairness)? +URL: https://www.thefaircode.xyz/explainers/differential-privacy.html +Summary: Learn how DP-SGD's gradient clipping and noise addition disproportionately degrade accuracy for minority subgroups, so adding a privacy guarantee to a bias-mitigation pipeline is not free. Illustrative example from Bagdasaryan, Poursaeed and Shmatikov (NeurIPS 2019), plus a runnable DP-SGD noise-injection toy; this repo trains no DP model, so no frozen numbers are quoted. + +# What Is Differential Privacy (and Its Tension With Fairness)? + +> *Differential privacy adds calibrated noise during training so no single person's data changes the model much. That protection is not free, and it is not evenly distributed: the accuracy it costs falls hardest on exactly the underrepresented groups a fairness audit is trying to protect.* + +## The One-Sentence Definition + +**Differential privacy (DP)** is a formal guarantee that the output of an analysis (here, a trained model) is almost unchanged whether or not any one individual's record was included, achieved during training by clipping each example's gradient contribution and adding random noise, with the strength of the guarantee set by a privacy budget **epsilon** (smaller epsilon = more noise = stronger privacy). + +## Why It Matters + +A bias-mitigation pipeline and a privacy requirement are often imposed on the same model by different stakeholders - a fairness team and a data-protection officer - who assume the two goals compose for free. They do not. + +The standard training algorithm for a DP model, **DP-SGD**, does two things to every gradient step: it **clips** each per-example gradient to a fixed norm, and it **adds Gaussian noise** proportional to that norm. Both operations interact badly with class imbalance: + +- Underrepresented groups tend to be the ones a model has not yet fit well, so their examples produce **large gradients** - the ones clipping cuts down the most. The majority's already-small gradients pass through nearly untouched. +- The noise is added to the batch-averaged gradient regardless of composition. A signal that is a small fraction of the batch (the minority's contribution) is **drowned by the noise** at a lower epsilon than the majority's signal is. + +The result, documented by Bagdasaryan, Poursaeed and Shmatikov (2019), is that the accuracy drop from adding DP is "not borne equally": it is substantially larger for underrepresented classes and subgroups, and **if the original model was already unfair, DP makes it more unfair**. This is the same shape as [the fairness-accuracy trade-off](fairness-accuracy-tradeoff.md) - closing one gap opens another - except the axis being traded against fairness is privacy, not overall accuracy. + +## How It Works + +DP-SGD replaces the plain gradient step with: + +``` +1. compute per-example gradients g_i for the minibatch +2. clip: g_i <- g_i / max(1, ||g_i|| / C) # cap the L2 norm at C +3. sum, then add noise: g <- (sum_i g_i + N(0, sigma^2 C^2 I)) / B +4. step: w <- w - lr * g +``` + +`C` is the clipping norm and `sigma` the noise multiplier; together with the number of steps and the sampling rate they determine epsilon (via a privacy accountant). Smaller epsilon needs a larger `sigma`. + +Why this is disparate: + +- **Clipping is a per-example ceiling.** An example the model already predicts well has a small gradient and is unaffected. An example the model gets wrong - disproportionately from a group with little training data - has a large gradient that gets scaled down, so its correction is weakened. Over many steps the majority keeps learning at full strength while the minority's updates are throttled. +- **Noise has a fixed scale but the useful signal does not.** In a batch that is 90% majority, the minority's contribution to the summed gradient is roughly a tenth of the total before noise. The noise term `N(0, sigma^2 C^2)` is the same size either way, so it overwhelms the minority direction while the majority direction still stands out. As `sigma` rises (epsilon falls), the minority signal disappears first. + +A minimal way to see the mechanism: train a logistic model with DP-SGD on data where 10% of rows follow a different feature-to-label rule than the other 90%, and read out accuracy per group as `sigma` increases. The majority accuracy holds; the minority accuracy falls faster and further. The Detection Code section gives a runnable version. + +## Concrete Illustration (from the literature, not a Fair Code run) + +**This repo's benchmark harness does not train any DP model** - there is no `epsilon` in `faircode/strategies.py` and no DP row in `results/`. Every number in this section is from the published study below, quoted so the pattern is concrete, not reproduced here. + +Bagdasaryan et al. (2019), *Differential Privacy Has Disparate Impact on Model Accuracy* (NeurIPS 2019), trained the same models with and without DP-SGD across several tasks: + +- A **gender-classification model** on facial images: adding DP reduced accuracy far more for darker-skinned faces (an underrepresented group in the training set) than for lighter-skinned faces, widening an accuracy gap that already existed in the non-private model. +- A **sentiment-analysis model** on tweets: DP reduced accuracy more on text written in African-American English than on the majority dialect. +- Across tasks, the finding held: "the reduction in accuracy incurred by deep learning models with differential privacy disproportionately impacts underrepresented subgroups," and the effect grows as epsilon shrinks. Their summary of the mechanism is that **the gradient clipping and noise addition of DP-SGD "disproportionately affect" the subgroups whose gradients are largest and whose share of the data is smallest** - i.e. "the poor get poorer." + +The relevance to this repo: every audit here is built around a protected group that is, in its dataset, the smaller or worse-served one (younger applicants, minority defendants, one insurance tier). Those are precisely the groups DP-SGD costs the most accuracy. "We added a privacy guarantee" is therefore not evidence of "we did not make the fairness gap worse" - it needs its own per-group check. + +## Detection Code + +A self-contained, dependency-light DP-SGD toy: per-example gradient clipping plus Gaussian noise on a logistic model, with a per-group accuracy readout, run across a sweep of noise multipliers. It is illustrative - it shows the *mechanism*, not a calibrated epsilon. + +```python +import numpy as np + + +def make_imbalanced_data(n=6000, minority_frac=0.10, seed=0): + """90% majority + 10% minority, where the minority's label depends on a + different set of features - so the minority needs its own signal to be + learned, and that signal is what clipping + noise erode first.""" + rng = np.random.default_rng(seed) + n_min = int(n * minority_frac) + group = np.array([1] * n_min + [0] * (n - n_min)) # 1 = minority + rng.shuffle(group) + x = rng.normal(size=(n, 6)) + w_majority = np.array([1.5, -1.0, 0.7, 0.0, 0.0, 0.0]) + w_minority = np.array([0.0, 0.0, 0.0, 1.5, -1.0, 0.7]) + logits = np.where(group == 1, x @ w_minority, x @ w_majority) + y = (rng.random(n) < 1.0 / (1.0 + np.exp(-logits))).astype(int) + return x, y, group + + +def dp_sgd_logreg(x, y, steps=4000, batch=64, lr=0.5, + clip_norm=1.0, noise_multiplier=0.0, seed=1): + """DP-SGD for logistic regression. noise_multiplier is 'sigma': 0 means + clip-only (no privacy), larger means smaller epsilon.""" + rng = np.random.default_rng(seed) + n, d = x.shape + w = np.zeros(d) + for _ in range(steps): + idx = rng.integers(0, n, batch) + xb, yb = x[idx], y[idx] + p = 1.0 / (1.0 + np.exp(-(xb @ w))) + per_example = (p - yb)[:, None] * xb # B x d + norms = np.linalg.norm(per_example, axis=1, keepdims=True) + per_example = per_example / np.maximum(1.0, norms / clip_norm) # clip + grad = per_example.sum(axis=0) + if noise_multiplier > 0: + grad = grad + rng.normal(scale=noise_multiplier * clip_norm, size=d) + w -= lr * grad / batch + return w + + +def accuracy_by_group(w, x, y, group): + pred = (x @ w > 0).astype(int) + maj = ((pred == y) & (group == 0)).sum() / (group == 0).sum() + minority = ((pred == y) & (group == 1)).sum() / (group == 1).sum() + return maj, minority + + +def sweep(seeds=range(6)): + x_tr, y_tr, g_tr = make_imbalanced_data(seed=0) + x_te, y_te, g_te = make_imbalanced_data(n=4000, seed=99) + + def mean_acc(**kw): + rows = [accuracy_by_group(dp_sgd_logreg(x_tr, y_tr, seed=s, **kw), + x_te, y_te, g_te) for s in seeds] + return np.mean(rows, axis=0) + + print(f"{'setting':<28}{'majority':>10}{'minority':>10}{'gap':>8}") + maj, minr = mean_acc(noise_multiplier=0.0) + print(f"{'clip only (no privacy)':<28}{maj:>10.3f}{minr:>10.3f}{maj - minr:>+8.3f}") + for sigma in (1.0, 2.0, 4.0, 8.0): + maj, minr = mean_acc(noise_multiplier=sigma) + print(f"{f'DP-SGD sigma={sigma}':<28}{maj:>10.3f}{minr:>10.3f}{maj - minr:>+8.3f}") + + +# sweep() +# The majority column stays roughly flat as sigma grows; the minority column +# and the gap move against the minority. Swap in a real dataset + a privacy +# accountant (e.g. Opacus, tensorflow-privacy) to attach an epsilon to each row. +``` + +## Limitations and Trade-offs + +### 1. Epsilon has no universally correct value + +There is no threshold at which a model is "private enough". Deployed systems have used epsilon from below 1 (strong) to over 10 (weak); the choice trades re-identification risk against utility and against the fairness cost described here, and it is a policy decision, not a statistical one - the same shape as choosing a fairness metric. + +### 2. DP protects against a specific threat, not against bias + +The DP guarantee is about **membership inference and individual re-identification**: an attacker cannot tell whether a particular person was in the training set. It says nothing about whether the labels are biased, whether the sampling was biased, or whether the model discriminates. A perfectly private model can be perfectly unfair. DP and fairness are orthogonal guarantees that happen to interfere. + +### 3. The disparate impact can sometimes be mitigated, at a cost + +Per-group clipping norms, adaptive clipping, or fair-DP training objectives can reduce the gap DP-SGD opens, but they add hyperparameters, can weaken the privacy accounting, and are not standard in off-the-shelf DP training libraries. Assume the vanilla DP-SGD behavior unless a mitigation is explicitly in place and measured. + +### 4. The toy here is a mechanism demo, not a calibrated result + +The Detection Code has no privacy accountant, so its `sigma` values do not map to a real epsilon, and its synthetic data exaggerates the minority's distinctness for clarity. Treat it as an illustration of *why* the effect happens; for a real number, run DP-SGD with an accountant on a real dataset and measure per-group accuracy directly. + +## Related Concepts + +* [What Is the Fairness-Accuracy Trade-off?](fairness-accuracy-tradeoff.md) - the same "closing one gap opens another" structure, with accuracy rather than privacy on the other axis. +* [What Is Class Imbalance?](class-imbalance.md) - why an underrepresented group's signal is a small share of each batch, the property DP-SGD's noise exploits. +* [Mitigation Strategies](mitigation-strategies.md) - this repo's five bias-mitigation strategies, none of which is DP; adding DP on top would need its own per-group evaluation. +* Membership inference - the attack DP is designed to prevent: given a trained model, deciding whether a specific record was in its training set. DP bounds how well any such attack can do. +* [What Is Underdiagnosis Bias?](underdiagnosis-bias.md) - another case where a technique aimed at one problem quietly worsens per-group outcomes. + +## Related Projects in This Repo + +* [`Healthcare Readmission/`](../Healthcare%20Readmission/) - a clinical model where a real deployment would plausibly face a patient-privacy requirement; the smallest race and age subgroups are the ones DP-SGD would cost the most. +* [`German Credit Lending/`](../German%20Credit%20Lending/) - younger applicants are the protected, smaller group; a DP-trained credit model would degrade for them fastest as epsilon tightens. + +## Further Reading + +* [Bagdasaryan, E., Poursaeed, O., Shmatikov, V. (2019): Differential Privacy Has Disparate Impact on Model Accuracy, *Advances in Neural Information Processing Systems 32 (NeurIPS 2019)*](https://arxiv.org/abs/1905.12101) - the paper this explainer's central claim comes from; shows the DP accuracy cost is larger for underrepresented subgroups across image, text, and tabular tasks. +* [Abadi, M. et al. (2016): Deep Learning with Differential Privacy, *ACM CCS 2016*](https://arxiv.org/abs/1607.00133) - the original DP-SGD algorithm (per-example clipping + Gaussian noise + moments accountant). +* [Dwork, C., Roth, A. (2014): The Algorithmic Foundations of Differential Privacy, *Foundations and Trends in Theoretical Computer Science*, 9(3-4)](https://www.cis.upenn.edu/~aaroth/Papers/privacybook.pdf) - the standard reference for the epsilon definition and its properties. +* [Cummings, R., Gupta, V., Kimpara, D., Morgenstern, J. (2019): On the Compatibility of Privacy and Fairness, *FairUMAP 2019*](https://arxiv.org/abs/1907.00212) - a formal look at when the two guarantees can and cannot be satisfied together. + +--- + +*Part of [The Fair Code Project](https://instagram.com/thefaircodeproject) - exposing and fixing algorithmic bias with real data and open code.* + diff --git a/sitemap.xml b/sitemap.xml index c9eecba..8d944b3 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -2,7 +2,7 @@ https://www.thefaircode.xyz/ - 2026-09-08 + 2026-09-09 https://www.thefaircode.xyz/profiler.html @@ -114,7 +114,7 @@ https://www.thefaircode.xyz/explainers/unsupervised-learning.html - 2026-07-14 + 2026-09-09 https://www.thefaircode.xyz/explainers/model-drift.html @@ -232,4 +232,16 @@ https://www.thefaircode.xyz/explainers/treatment-equality.html 2026-09-08 + + https://www.thefaircode.xyz/explainers/simpsons-paradox.html + + + https://www.thefaircode.xyz/explainers/conditional-demographic-parity.html + + + https://www.thefaircode.xyz/explainers/subgroup-fairness.html + + + https://www.thefaircode.xyz/explainers/differential-privacy.html +