Case study 06 · Experimentation · statistics

No liftis an answer

Two real experiments, analysed end to end: a landing page redesign that didn't move conversion, and a mobile game change that measurably hurt retention. Both end in a clear decision, with the reasoning shown.

Analysis projectPython · SciPy · statsmodels

Two datasetsA public e-commerce landing page test, and the Cookie Cats mobile game experiment.

290,584Users, landing page test
p = 0.19New page: no detectable lift
90,189Players, Cookie Cats
−0.82pt7-day retention, gate at 40
Data flow · how a record moves

Exposures to a decision

Crossed-out dots are users dropped for mismatched exposure or duplication. The same clean data then goes through three independent tests. Click a stage to read what happens there.

01 · Check the split first

Is the experiment even valid?

3,893 rows (1.3%) had users seeing the wrong page for their group. I dropped them rather than guess, then removed one duplicate user. A sample ratio mismatch test then asks: did randomisation split traffic the way it was meant to?

294,478 raw exposures → 290,585 clean → 290,584 unique users

Why firstIf the split is broken, every number after it is suspect. Here it's clean: p = 0.95.

02 · Landing page result

The interval crosses zero

Control converted at 12.04%, the new page at 11.88%. The difference is −0.16 points with a 95% interval from −0.39 to +0.08. A z-test, a bootstrap and a Bayesian model all agree: the probability the new page is better is about 9.5%.

Decision: don't ship. The redesign costs effort and shows no gain. The country splits (US −0.22, UK +0.11, CA −0.69) are point estimates, and none survives a Holm correction.

Red dashed lineThe +0.5pt lift the business would have cared about. The whole interval sits below it.

03 · Power

How many users would you need?

Drag the lift you want to detect. At a 12% baseline, 5% significance and 80% power, the sample per group grows with the inverse square of the effect. This test had about 145,000 per group, enough to see a lift of roughly 0.34 points.

0Users per group
0Total
—This test could see it?

CheckAt +0.5pt the formula gives about 67,500 per group, matching the repo's statsmodels calculation.

04 · Cookie Cats

Moving the gate cost players

The game moved its first progress gate from level 30 to level 40. One day later, the difference is within noise. After seven days, players with the later gate were measurably less likely to still be playing: −0.82 points, a 4.3% relative drop, interval −1.33 to −0.31.

Decision: keep the gate at 30. The probability that gate 40 is better for 7-day retention is about 0.1%.

Flagged, not hiddenThis split is uneven (44,700 vs 45,489, SRM p = 0.009). I report it next to the result instead of quietly ignoring it.

05 · Method

Same answer, three ways

01CleanDrop mismatched exposures, dedupe users, SRM check.
02FrequentistTwo-proportion z-test with a 95% interval on the difference.
03BootstrapResampled interval as a check that doesn't lean on normality.
04BayesianBeta posteriors and P(B > A), easier to explain to a product team.
05SegmentsCountry splits with Holm correction for multiple tests.
06TestsResults checked against statsmodels, plus a simulation that the 95% intervals really cover 95% of the time.
PythonSciPystatsmodelsBootstrapBayesian A/BPower analysispytest

TakeawayA test that finds nothing still saves money, if it was powered to find something.