Simpson's Paradox in A/B Test Segments

Simpson's paradox is when a trend that shows up in every segment of your data disappears or flips once you add the segments together.

In A/B testing it usually happens when the share of traffic going to each variant changes partway through a test, or differs between segments, so the pooled numbers compare different mixes of visitors.

A variant can win on Friday and win on Saturday and still look like a loser on the combined report.

The fix is rarely fancy statistics. Keep the traffic split fixed for the whole test, check that each segment got the split you planned, and when the split did change, analyze each stable period on its own or combine them with weights.

What Simpson's paradox is

The effect is named after Edward Simpson, whose 1951 paper "The Interpretation of Interaction in Contingency Tables" in the Journal of the Royal Statistical Society described it.

Simpson wasn't the first to notice it. Judea Pearl's history of the paradox points to Karl Pearson and colleagues in 1899 and Udny Yule in 1903, and notes that Blyth was the one who called it a "paradox" in 1972.

Nothing about the math is broken. A pooled conversion rate is a weighted average of the segment rates, and the weights are each segment's share of that arm's visitors.

If control and variant have different weights, the pooled comparison mixes up "which variant" with "which visitors."

Pearl's argument is that the paradox goes away once you ask what caused the difference in mix.

When a third variable drives both who gets a treatment and the outcome, you should look at the segments.

When it doesn't, the pooled number is the honest one.

In a properly randomized A/B test with a fixed split, segments like device or traffic source can't drive which variant someone sees.

That's why the paradox in A/B tests almost always comes from something the team did to the split.

Simpson's paradox examples

Berkeley graduate admissions

The best-known example comes from fall 1973 applications to the University of California, Berkeley.

Bickel, Hammel and O'Connell (Science, 1975) found that about 44% of 8,442 male applicants and 35% of 4,321 female applicants were admitted. That looked like bias against women.

Each department ran its own admissions, though. Department by department, the authors found no general bias against women.

Women had applied more often to departments that were harder for everyone to get into, so the pooled rate punished them for where they applied, not for being women.

Kidney stone treatment

The second classic is a 1986 study comparing kidney stone treatments.

Overall, Charig and colleagues reported success in 273 of 350 patients (78%) after open surgery and 289 of 350 (83%) after percutaneous nephrolithotomy (PCNL). So PCNL looks better.

Split by stone size, as Julious and Mullee showed in the BMJ in 1994, open surgery wins in both groups:

Stone sizeOpen surgeryPCNL
Small81 / 87 = 93%234 / 270 = 87%
Large192 / 263 = 73%55 / 80 = 69%
All273 / 350 = 78%289 / 350 = 83%

Doctors gave open surgery to more of the hard cases (large stones).

Stone size drove both the treatment choice and the outcome, so the pooled comparison is the misleading one.

This is the same kind of imbalance a broken traffic split creates in an A/B test.

How it shows up in A/B tests: the ramp-up trap

Microsoft's experimentation team listed this as a pitfall in "Seven Pitfalls to Avoid when Running Controlled Experiments on the Web" (Crook, Frasca, Kohavi and Longbotham, KDD 2009).

Their example: a site with 1 million visitors a day starts a test at 1% treatment on Friday, then ramps to 50% on Saturday.

Saturday happens to be a weaker day for everyone.

Friday (99% / 1%)Saturday (50% / 50%)Pooled
Control20,000 / 990,000 = 2.02%5,000 / 500,000 = 1.00%25,000 / 1,490,000 = 1.68%
Treatment230 / 10,000 = 2.30%6,000 / 500,000 = 1.20%6,230 / 510,000 = 1.22%

(The paper rounds the pooled treatment rate to 1.20%; the counts give 1.22%.)

Treatment wins both days, yet the pooled report says it loses, 1.22% vs 1.68%.

Why: about 98% of treatment visitors came on the weak Saturday, against about 34% of control visitors.

The paper lists other ways the same trap appears in online tests:

  • Some browsers are sampled into the test at higher rates than others.
  • Countries run different splits (say, 1% treatment in the US and 50% in Canada) and the results are pooled.
  • Top customers are held to 1% exposure while everyone else runs 50/50.

The paper's authors say they have "seen them happen multiple times in real life."

Testing tools warn about this too. Optimizely's documentation separates traffic distribution (the share sent to each variation) from traffic allocation (the share of all visitors in the test).

Changing distribution mid-test "invites Simpson's paradox," it says.

Changing allocation doesn't, because both arms change together.

Multi-armed bandits shift traffic between arms on purpose, so they face the same problem.

Any tool that does this has to correct for changing weights over time.

See multi-armed bandits for when that trade-off is worth it.

Segment results that disagree are usually not Simpson's paradox

Many CRO teams use "Simpson's paradox" for any test where mobile and desktop go different ways.

That is a different thing: a real difference in effect by segment, which statisticians call heterogeneity or an interaction effect.

In a randomized test with a fixed split, the overall result is roughly a weighted average of the segment results.

It can't point the opposite way from every segment.

Our database has several clean examples of segments disagreeing:

None of these is a reversal caused by uneven mixing.

Each one is a variant that works for one audience and hurts another.

When the split is stable, the overall number still tells you the average effect.

The segment numbers tell you where it came from.

Be careful when you act on a segment win.

Every extra segment you check is another chance at a false positive (see multiple comparisons).

Segment estimates from smaller samples also tend to shrink when retested (the winner's curse).

Optimizely's guidance is to ship on the overall effect and use segments to find ideas for the next test.

If you think a segment really behaves differently, the safe move is a new test aimed at that segment.

Segment-only reporting: the quiet cousin

A related problem is a result reported for one segment with no overall number.

The aggregate might tell a different story, and you can't check.

Our database flags these cases. Blend Commerce's exposed mobile search bar for PerTronix reports +45% AOV and +46% revenue for returning visitors, and our caveat notes the overall result isn't given.

VWO's Showpo product info test reports +1.33% purchases among new visitors only.

These may be real effects, but read them as segment findings, not site-wide wins.

The clean alternative is to target the segment before the test starts.

Shirtinator ran its tablet test on Android tablet visitors only, as a 50/50 split URL test.

It found +71.81% revenue and +32% orders, and there's no aggregate to argue with because the whole test was one segment.

Split URL tests like this one send each arm to a different page.

How to check a test for Simpson's paradox

  1. Check that the split never changed. Look at the test's change log. Any change to variant weights mid-test splits the data into separate periods.
  2. Run a sample ratio check per period and per key segment. If you planned 50/50 but mobile ran 60/40, the segments are mixed unevenly. A sample ratio mismatch test (chi-square) flags this. An uneven split is fine as long as it's constant. Anatta's tabbed buy box test ran 85/15 (34,730 control and 6,144 variant visitors) and passed its SRM check.
  3. Compare pooled and per-segment directions. If the pooled result points one way and every segment points the other, the weights are uneven. Don't trust the pooled number until you know why.
  4. Look at segment shares by arm. In each arm, what share is mobile, new visitors, or paid traffic? In a healthy test these shares match between arms within noise.

How to fix it: worked example

The Microsoft team gives three fixes. Their simplest, which they use themselves, is to throw away the ramp-up data.

In the example above, that means using Saturday only:

lift = 1.20% / 1.00% - 1 = +20%

To keep both days, combine the per-period rates with fixed weights.

Weight each period by its share of total visitors, the same weights for both arms.

Each day had 1 million visitors, so each weight is 0.5:

stratified control = 0.5 × 2.02% + 0.5 × 1.00% = 1.51%
stratified treatment = 0.5 × 2.30% + 0.5 × 1.20% = 1.75%
lift = 1.75% / 1.51% - 1 ≈ +15.9%

The general formula, for periods or segments s with weight w(s) summing to 1:

stratified rate = Σ w(s) × conversions(s) / visitors(s)

The third fix is a paired comparison across periods where the split was stable.

Whichever you pick, decide before you look at the results.

Choosing the method that gives the nicest number is its own bias.

SituationUseWrong choice when
Fixed split for the whole testPooled resultNever wrong for the average effect; still check SRM
Short ramp-up, then a stable splitDrop the ramp-up periodThe ramp-up is a large share of the data or covers a different season
Split changed for a long stretchStratified (weighted) estimateSome periods have so few treatment visitors that their rates are mostly noise
Segments run at different splits by designStratify by segmentYou use the per-segment numbers to pick winners without correcting for multiple comparisons
Segments disagree under a fixed splitPooled result to ship; new targeted test for the segmentYou call it Simpson's paradox and throw out the overall result

Prevention is cheaper than any of these fixes.

Ramp by changing allocation rather than distribution, restart the test after any change to the split, and check sample ratios before reading results.

For the full checklist, see how to analyze A/B test results.

Want to see how often segment-specific wins show up?

Browse all tests in the database or start at the A/B testing hub.

Questions

What is Simpson's paradox in simple terms?

It's when every subgroup of your data shows one trend, but the combined data shows the opposite.

It happens because the combined number is a weighted average, and the groups being compared have different mixes of subgroups.

What is a simple example of Simpson's paradox?

In a 1986 kidney stone study, open surgery worked better than PCNL for both small stones (93% vs 87%) and large stones (73% vs 69%).

Overall, though, PCNL looked better (83% vs 78%), because open surgery got more of the hard, large-stone cases.

Can Simpson's paradox happen in an A/B test?

Yes, mostly when the traffic split changes mid-test or differs by segment.

Microsoft's 2009 example shows a treatment that won on both Friday and Saturday but looked worse pooled, because it got 1% of traffic on Friday and 50% on Saturday.

Is mobile winning and desktop losing a case of Simpson's paradox?

Usually not. With a fixed, randomized split, that's an interaction effect: the variant really works differently by device.

The overall result can't point the opposite way from every segment unless the segments were mixed unevenly between arms.

How do you fix Simpson's paradox in test results?

Drop data from periods with a different split, or combine per-period (or per-segment) rates with the same weights for both arms.

To prevent it, keep the variant split fixed and run a sample ratio check before reading results.