Field note · November 20, 2023

mrr_usd by industry: a 49% spread

Real group means for one column across 8 segments, and what the pooled average conceals.

1 min read ·Analytics practice ·statistics practice

Breaking mrr_usd down by industry on saas-subscriptions, because the headline average is 447 and no segment is actually there.

  • finance — mean 538, median 66 (293 rows)
  • public sector — mean 486, median 79 (334 rows)
  • healthcare — mean 451, median 122 (334 rows)
  • software — mean 449, median 97 (326 rows)
  • retail — mean 444, median 108 (314 rows)
  • media — mean 442, median 81 (296 rows)

Top to bottom that is 538 against 360, a spread of 49.4%. The pooled average is 447.

sql
select industry,
  count(*)                                             as rows,
  round(avg(mrr_usd)::numeric, 2)                      as mean,
  percentile_cont(0.5) within group (order by mrr_usd) as median
from saas_subscriptions
group by 1
order by mean desc;

A spread that wide means the pooled number is not a summary, it is an artefact of the mix. Change the proportion of finance rows and the overall average moves without any individual group changing at all — which is how a metric goes up while every segment goes down.

Notice the mean and median columns disagree most in finance, where the mean sits well above the median. Always compute both in the group-by. The comparison between them per segment is free and tells you whether you are looking at a level difference or a tail difference.

This is the setup for Simpson's paradox — the case where every segment moves one way and the total moves the other.