  {"id":3841,"date":"2026-06-22T09:51:37","date_gmt":"2026-06-22T08:51:37","guid":{"rendered":"https:\/\/www.gironi.it\/blog\/?p=3841"},"modified":"2026-06-22T09:51:37","modified_gmt":"2026-06-22T08:51:37","slug":"regression-to-the-mean","status":"publish","type":"post","link":"https:\/\/www.gironi.it\/blog\/en\/regression-to-the-mean\/","title":{"rendered":"Regression to the Mean: the SEO Fix That Worked\u2026 by Accident"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">In the Israeli Air Force, <strong>Daniel Kahneman recounts<\/strong>, the flight instructors were sure of one thing: praising a cadet after an excellent manoeuvre made him worse, scolding him after a terrible one made him better. <br>They had seen it happen a thousand times in the field, so it had to be true: with pilots, severity works and compliments backfire. <br>Except it wasn&#8217;t true. An exceptional manoeuvre \u2014 in either direction \u2014 is part skill and part luck; and luck, on the next attempt, doesn&#8217;t repeat. After a brilliant flight you tend to drift back toward your own average (and it looks as if the praise hurt), after a disastrous one you drift back toward the average (and it looks as if the scolding helped). The instructors were crediting themselves with an effect that was just <strong>regression to the mean<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The very same illusion waits for us every time we look at a site&#8217;s data and decide whether one of our changes &#8220;worked&#8221;.<\/p>\n\n\n\n<!--more-->\n\n\n\n<p class=\"wp-block-paragraph\">It&#8217;s worth clearing up the name straight away, because it misleads: regression to the mean <strong>has nothing to do with <a href=\"https:\/\/www.gironi.it\/blog\/en\/correlation-and-regression-analysis-linear-regression\/\">linear regression<\/a><\/strong>, the model that fits a line between two variables. Here &#8220;regression&#8221; means <em>going back<\/em>, <em>reverting<\/em>: extreme values sliding back toward their average. They are two different things that happen to share a word.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What regression to the mean is<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The mechanism is simple, and once you see it you can&#8217;t unsee it. <br>Almost every number we measure is the sum of two parts: a &#8220;true&#8221;, stable value and a dose of <strong>noise<\/strong> \u2014 random fluctuation of the moment. A page&#8217;s average SERP position in a given month depends on its real relevance, but also on chance: the algorithm wobbling, a competitor who pushed hard that month, the query&#8217;s seasonality, a handful of clicks more or fewer.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Now, when we single out the <strong>extreme<\/strong> cases \u2014 the worst-performing pages, the worst month \u2014 we are almost always picking situations where the noise pushed <em>everything in the same unfavourable direction<\/em>. <br><strong>At the next measurement that noise won&#8217;t repeat identically, and the value will tend to climb back toward its true mean \u2014 without anyone having done anything.<\/strong> It&#8217;s a purely statistical fact, not an SEO phenomenon: the more extreme a measurement, the more likely the next one is less extreme.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The optimization that worked by accident<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Let&#8217;s see what this mechanism does in everyday work. Suppose we track the average SERP position of 300 pages over two consecutive months. I simulate the scenario in R, giving each page a stable &#8220;true&#8221; position and adding a random fluctuation each month:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>set.seed(48)\n\n# 300 pages, each with its \"true\" SERP position (stable over time)\npos_vera &lt;- runif(300, 3, 40)\n\n# two consecutive months: same true position, different random noise\nmese1 &lt;- pos_vera + rnorm(300, 0, 8)\nmese2 &lt;- pos_vera + rnorm(300, 0, 8)\n\n# the 60 worst pages in month 1 (in the SERP \"worse\" = higher number)\npeggiori &lt;- order(mese1, decreasing = TRUE)[1:60]\n\nround(mean(mese1[peggiori]), 1)   # starting average position\n# [1] 39.1<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Our 60 worst pages start from an average position of <strong>39.1<\/strong>: bottom-of-the-third-page territory. We decide to act \u2014 rewrite the titles, update the content, fix internal links \u2014 and we check again a month later. <br>Here&#8217;s the result, <strong>with no algorithm change in the meantime and, above all, with no real intervention at all in the simulation<\/strong>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>round(mean(mese2[peggiori]), 1)   # one month later\n# [1] 33<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">From <strong>39.1<\/strong> to <strong>33<\/strong>: about <strong>six positions gained<\/strong>. A jump that would look great in a report, and that anyone would be tempted to credit to the optimization just carried out. <br>Too bad there is <em>no<\/em> optimization in the code: the pages improved on their own, because they had been chosen precisely for being extreme and the noise that had sunk them in month 1 didn&#8217;t repeat. For scale: the average position of <em>all<\/em> 300 pages is about 22, and it&#8217;s toward that value that the worst ones are reverting.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">How not to be fooled: the control group<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">If the improvement comes anyway, how can we tell whether our optimization had any <em>real<\/em> effect? <br>The answer is the same one we&#8217;d use for a drug: we need a <strong>control group<\/strong>. We split the 60 worst pages into two random halves: one we &#8220;optimize&#8221;, the other we deliberately leave alone. Then we compare how much they improve:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># split the 60 worst pages into two random groups\ngruppo &lt;- sample(rep(c(\"optimized\", \"control\"), each = 30))\n\n# average improvement (month1 - month2) in the two groups\nround(tapply(mese1[peggiori] - mese2[peggiori], gruppo, mean), 1)\n# control optimized\n#     6.0       6.1<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The &#8220;optimized&#8221; group gains <strong>6.1<\/strong> positions, the control group \u2014 left untouched \u2014 gains <strong>6.0<\/strong>. <br>Practically the very same improvement. Our optimization, in the simulation, added nothing: all of the gain was regression to the mean, and the control exposes it by showing it would have happened anyway.<\/p>\n\n\n\n<p class=\"has-light-gray-background-color has-background wp-block-paragraph\">The lesson is this: <strong>an improvement, on its own, proves nothing.<\/strong> <br>When you act precisely on the pages (or campaigns) that were doing worst, part of their rebound is guaranteed regardless of you. Without a comparison against what you did <em>not<\/em> touch, you can&#8217;t know how much of the result is your doing and how much is just reversion toward the mean.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It&#8217;s the same reasoning, it should be said, behind a properly run <a href=\"https:\/\/www.gironi.it\/blog\/en\/ab-testing-statistically-valid-experiments\/\">A\/B test<\/a>: you compare the variant against a concurrent control, not against the &#8220;before&#8221;. And it&#8217;s a close cousin of the trap we met discussing <a href=\"https:\/\/www.gironi.it\/blog\/en\/correlation\/\">correlation and causation<\/a>: here too we mistake a sequence in time (&#8220;I acted, then it improved&#8221;) for a causal link.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Try it yourself<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">To lock in the mechanism, try rebuilding the scenario changing a single detail: instead of the 60 <em>worst<\/em> pages, select the 60 <em>best<\/em> of month 1 (<code>order(mese1)[1:60]<\/code>, without <code>decreasing<\/code>) and watch how they behave in month 2.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">What to expect: the champions revert toward the mean too, but by <em>getting worse<\/em> \u2014 top positions contain luck that doesn&#8217;t repeat. It&#8217;s the mirror image of the same phenomenon, and it explains why &#8220;that golden month&#8221; or &#8220;that page that was flying&#8221; so often can&#8217;t be reproduced: you hadn&#8217;t lost your magic touch, you were just drifting back toward your average.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\">There&#8217;s an even more insidious variant of this trap, because it hides inside the very tools we use <em>to<\/em> decide with rigour. If we look at a test while it&#8217;s still running and stop as soon as the numbers please us, we are picking an extreme instant exactly as we picked the worst pages \u2014 and we&#8217;ll be fooled in the same way. It&#8217;s the <em>peeking problem<\/em>, and it&#8217;s the next stop on our tour of marketing-data pitfalls.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Further Reading<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The flight-instructor story we opened with comes from <a href=\"https:\/\/www.amazon.it\/dp\/0141033576?tag=consulenzeinf-21\" rel=\"nofollow sponsored noopener\" target=\"_blank\"><em>Thinking, Fast and Slow<\/em><\/a> by Daniel Kahneman, Nobel laureate in economics: it&#8217;s the book that made regression to the mean \u2014 and dozens of other biases in our reasoning \u2014 widely known, told through examples that stick. If you keep one thing from this article, keep this one: it&#8217;s a vaccine against the illusion of having understood why the numbers move.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In the Israeli Air Force, Daniel Kahneman recounts, the flight instructors were sure of one thing: praising a cadet after an excellent manoeuvre made him worse, scolding him after a terrible one made him better. They had seen it happen a thousand times in the field, so it had to be true: with pilots, severity &hellip; <a href=\"https:\/\/www.gironi.it\/blog\/en\/regression-to-the-mean\/\" class=\"more-link\">Leggi tutto<span class=\"screen-reader-text\"> &#8220;Regression to the Mean: the SEO Fix That Worked\u2026 by Accident&#8221;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_uag_custom_page_level_css":"","footnotes":""},"categories":[161],"tags":[],"class_list":["post-3841","post","type-post","status-publish","format-standard","hentry","category-statistics"],"lang":"en","translations":{"en":3841,"it":3840},"uagb_featured_image_src":{"full":false,"thumbnail":false,"medium":false,"medium_large":false,"large":false,"1536x1536":false,"2048x2048":false,"post-thumbnail":false},"uagb_author_info":{"display_name":"Paolo Gironi","author_link":"https:\/\/www.gironi.it\/blog\/author\/autore-articoli\/"},"uagb_comment_info":0,"uagb_excerpt":"In the Israeli Air Force, Daniel Kahneman recounts, the flight instructors were sure of one thing: praising a cadet after an excellent manoeuvre made him worse, scolding him after a terrible one made him better. They had seen it happen a thousand times in the field, so it had to be true: with pilots, severity&hellip;","_links":{"self":[{"href":"https:\/\/www.gironi.it\/blog\/wp-json\/wp\/v2\/posts\/3841","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gironi.it\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gironi.it\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gironi.it\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gironi.it\/blog\/wp-json\/wp\/v2\/comments?post=3841"}],"version-history":[{"count":1,"href":"https:\/\/www.gironi.it\/blog\/wp-json\/wp\/v2\/posts\/3841\/revisions"}],"predecessor-version":[{"id":3845,"href":"https:\/\/www.gironi.it\/blog\/wp-json\/wp\/v2\/posts\/3841\/revisions\/3845"}],"wp:attachment":[{"href":"https:\/\/www.gironi.it\/blog\/wp-json\/wp\/v2\/media?parent=3841"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gironi.it\/blog\/wp-json\/wp\/v2\/categories?post=3841"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gironi.it\/blog\/wp-json\/wp\/v2\/tags?post=3841"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}