{"id":4503,"date":"2026-10-07T09:04:26","date_gmt":"2026-10-07T08:04:26","guid":{"rendered":"https:\/\/www.gironi.it\/blog\/?p=4503"},"modified":"2026-10-09T09:35:16","modified_gmt":"2026-10-09T08:35:16","slug":"confronti-multipli","status":"publish","type":"post","link":"https:\/\/www.gironi.it\/blog\/confronti-multipli\/","title":{"rendered":"Confronti multipli: perch\u00e9 su 200 query qualcuna \u00abmigliora\u00bb sempre per caso"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Nel 2009 un gruppo di neuroscienziati mise un salmone in uno scanner per la risonanza magnetica funzionale, gli mostr\u00f2 una serie di fotografie di persone in situazioni sociali e gli &#8220;chiese&#8221; quali emozioni provassero. L&#8217;analisi trov\u00f2 una piccola area del cervello con un&#8217;attivit\u00e0 statisticamente significativa. Il dettaglio \u00e8 che il salmone era morto. <br>Lo studio era uno scherzo serissimo (vinse un Ig Nobel nel 2012), e il suo bersaglio non era la risonanza magnetica: era un errore di metodo diffusissimo. <strong>Con abbastanza test, qualcosa di &#8220;significativo&#8221; salta fuori comunque.<\/strong> Lo scanner aveva confrontato decine di migliaia di piccoli volumi del cervello, uno per uno, ciascuno con la soglia del 5%.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nel nostro lavoro il salmone morto ha un nome familiare: Search Console. Confrontiamo il CTR di questo mese con quello del mese scorso su 200 query, troviamo una dozzina di variazioni &#8220;significative&#8221; e scriviamo nel report quali query sono migliorate. Ma quante di quelle dodici sono cambiate davvero? \u00c8 il problema dei <strong>confronti multipli<\/strong>, e abbiamo gi\u00e0 visto spuntarne il profilo parlando di <a href=\"https:\/\/www.gironi.it\/blog\/split-test-seo\/\">split test SEO<\/a> e di <a href=\"https:\/\/www.gironi.it\/blog\/peeking-problem\/\">peeking<\/a>.<\/p>\n\n\n\n<!--more-->\n\n\n\n<p class=\"wp-block-paragraph\"><strong>In sintesi:<\/strong> quando si eseguono molti test statistici insieme, la soglia del 5% non vale pi\u00f9 per l&#8217;insieme: con 10 test indipendenti la probabilit\u00e0 di almeno un falso positivo sale al 40%, con 100 al 99%. I <strong>confronti multipli<\/strong> si correggono in due modi. La <strong>correzione di Bonferroni<\/strong> (o la sua versione migliorata, il metodo di <strong>Holm<\/strong>) controlla la probabilit\u00e0 di commettere anche un solo falso positivo, dividendo la soglia per il numero di test: \u00e8 prudente, ma perde molti effetti veri. Il metodo di <strong>Benjamini-Hochberg<\/strong> controlla invece la <strong>quota di falsi positivi fra le scoperte<\/strong> (<em>false discovery rate<\/em>): \u00e8 meno severo e pi\u00f9 adatto quando si scandagliano molte pagine o query. In R si usa <code>p.adjust()<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Di cosa parleremo<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"#perche\">Perch\u00e9 pi\u00f9 test fanno pi\u00f9 falsi allarmi?<\/a><\/li><li><a href=\"#esempio\">Un esempio: 200 query in Search Console<\/a><\/li><li><a href=\"#bonferroni\">La correzione di Bonferroni (e quella di Holm)<\/a><\/li><li><a href=\"#fwer-fdr\">Errore sulla famiglia o quota di scoperte false?<\/a><\/li><li><a href=\"#benjamini-hochberg\">Il metodo di Benjamini-Hochberg<\/a><\/li><li><a href=\"#quale\">Quale correzione scegliere?<\/a><\/li><li><a href=\"#dove\">Dove si nascondono i confronti multipli nella SEO<\/a><\/li><li><a href=\"#domande-frequenti\">Domande frequenti<\/a><\/li><li><a href=\"#prova-tu\">Prova tu<\/a><\/li><li><a href=\"#per-approfondire\">Per approfondire<\/a><\/li><\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"perche\">Perch\u00e9 pi\u00f9 test fanno pi\u00f9 falsi allarmi?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ricordiamo cosa promette la soglia del 5% in un <a href=\"https:\/\/www.gironi.it\/blog\/il-test-delle-ipotesi\/\">test delle ipotesi<\/a>: se non c&#8217;\u00e8 nessun effetto, il test ci dar\u00e0 un falso allarme in 5 casi su 100. \u00c8 una promessa che vale <strong>per un test<\/strong>. Il guaio comincia quando di test ne facciamo molti, e ci basta che <em>uno qualsiasi<\/em> risulti significativo per alzare la mano.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Facciamo un esempio al volo. Lanciando un dado una volta, la probabilit\u00e0 di fare 6 \u00e8 un sesto; lanciandolo dieci volte, la probabilit\u00e0 di fare <em>almeno un<\/em> 6 sale all&#8217;84%. Con i test funziona allo stesso modo. Se un test da solo ha il 95% di probabilit\u00e0 di non dare un falso allarme, due test indipendenti ne hanno il 95% del 95%, e cos\u00ec via. La probabilit\u00e0 di <strong>almeno un falso positivo<\/strong> su m test indipendenti, che gli statistici chiamano <em>family-wise error rate<\/em> (FWER), \u00e8 dunque:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\\(FWER = 1 &#8211; (1 &#8211; \\alpha)^m\\)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">dove \u03b1 \u00e8 la soglia del singolo test (0,05) e m il numero di test. Con 10 test vale 1 \u2212 0,95\u00b9\u2070 = <strong>40%<\/strong>; con 14 supera il 50%; con 100 arriva al 99,4%.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/www.gironi.it\/blog\/wp-content\/uploads\/2026\/10\/confronti-multipli-fwer.png\" alt=\"La probabilit\u00e0 di almeno un falso positivo al crescere del numero di test, ciascuno con la soglia del 5%. Gi\u00e0 con 14 test un falso allarme \u00e8 pi\u00f9 probabile del contrario; con 100 \u00e8 praticamente certo.\"\/><figcaption class=\"wp-element-caption\">La probabilit\u00e0 di almeno un falso positivo al crescere del numero di test, ciascuno con la soglia del 5%. Gi\u00e0 con 14 test un falso allarme \u00e8 pi\u00f9 probabile del contrario; con 100 \u00e8 praticamente certo.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">C&#8217;\u00e8 un altro modo di vederla, ancora pi\u00f9 diretto: su m test senza alcun effetto reale, <strong>il numero atteso di falsi positivi \u00e8 m \u00d7 \u03b1<\/strong>. Su 200 query che non sono cambiate affatto, dobbiamo aspettarci una decina di variazioni &#8220;significative&#8221; (200 \u00d7 0,05 = 10). Non sono un&#8217;anomalia: sono esattamente ci\u00f2 che la soglia del 5% promette.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"esempio\">Un esempio: 200 query in Search Console<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Costruiamo l&#8217;esempio per simulazione, cos\u00ec conosciamo la verit\u00e0. Prendiamo 200 query, con qualche migliaio di impressioni al mese ciascuna e un CTR fra l&#8217;1% e il 6%. Per 180 di esse <strong>non cambia niente<\/strong> fra un mese e l&#8217;altro; per le prime 20 il CTR sale davvero, del 50%. Per ogni query confrontiamo i due mesi con un test sulle proporzioni, come faremmo in un report.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Genero i dati in R:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>set.seed(7)\nn_query &lt;- 200\nimpressioni &lt;- round(300 + rlnorm(n_query, log(5000), 0.8))   # impressioni al mese\nctr &lt;- runif(n_query, 0.01, 0.06)                              # CTR fra l'1% e il 6%\nvera &lt;- seq_len(n_query) &lt;= 20                                 # le 20 che cambiano davvero\nclic_prima &lt;- rbinom(n_query, impressioni, ctr)\nclic_dopo  &lt;- rbinom(n_query, impressioni, ifelse(vera, ctr * 1.5, ctr))\n\n# un test per query: il CTR del mese scorso contro quello di questo mese\np &lt;- mapply(function(a, b, n) prop.test(c(a, b), c(n, n))$p.value,\n            clic_prima, clic_dopo, impressioni)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Ora facciamo quello che si fa di solito: segniamo come &#8220;cambiate&#8221; le query con p-value sotto 0,05, e confrontiamo con la verit\u00e0.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>table(scoperta = p &lt; 0.05, vera)\n\n#         vera\n# scoperta FALSE TRUE\n#    FALSE   171    2\n#    TRUE      9   18<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Il test ha segnalato <strong>27 query<\/strong>. Diciotto sono cambiate davvero, ma <strong>nove no<\/strong>: sono falsi allarmi, esattamente il 5% delle 180 query immobili. In termini pi\u00f9 chiari e diretti: <strong>un terzo delle &#8220;scoperte&#8221; del nostro report \u00e8 rumore<\/strong>, e niente nei numeri ci dice quale terzo. Se a ciascuna di quelle nove query dedicassimo un&#8217;analisi, un intervento, una riga di commento al cliente, staremmo lavorando su un fantasma.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"bonferroni\">La correzione di Bonferroni (e quella di Holm)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">La soluzione pi\u00f9 antica, e la pi\u00f9 intuitiva, \u00e8 rendere ogni singolo test pi\u00f9 severo. Se vogliamo che la probabilit\u00e0 di <em>almeno un<\/em> falso positivo sull&#8217;intera famiglia di test resti al 5%, basta dividere la soglia per il numero di test. \u00c8 la <strong>correzione di Bonferroni<\/strong>:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\\(\\alpha_{Bonferroni} = \\frac{\\alpha}{m} = \\frac{0{,}05}{200} = 0{,}00025\\)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Una query \u00e8 &#8220;cambiata&#8221; solo se il suo p-value scende sotto 0,00025. In R non serve fare la divisione a mano: <code>p.adjust()<\/code> restituisce i p-value <strong>corretti<\/strong>, da confrontare con la soglia abituale. Lo verifico in R:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>table(scoperta = p.adjust(p, method = \"bonferroni\") &lt; 0.05, vera)\n\n#         vera\n# scoperta FALSE TRUE\n#    FALSE   180    6\n#    TRUE      0   14<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Nessun falso allarme: le 14 query segnalate sono tutte vere. Il prezzo, per\u00f2, si vede nell&#8217;angolo in alto a destra. <strong>Sei query cambiate davvero sono sparite dal radar<\/strong>, perch\u00e9 un aumento del 50% su poche centinaia di clic non basta a scendere sotto una soglia cos\u00ec bassa. Bonferroni compra la certezza di non sbagliare con la cecit\u00e0 su una parte degli effetti reali.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">C&#8217;\u00e8 un perfezionamento che non costa nulla, il <strong>metodo di Holm<\/strong>. Si ordinano i p-value dal pi\u00f9 piccolo al pi\u00f9 grande; il primo si confronta con \u03b1\/m, il secondo con \u03b1\/(m \u2212 1), il terzo con \u03b1\/(m \u2212 2), e ci si ferma al primo che non supera la sua soglia. Garantisce lo stesso controllo di Bonferroni ed \u00e8 <strong>sempre almeno altrettanto potente<\/strong>, spesso di pi\u00f9. Nel nostro esempio d\u00e0 lo stesso risultato (14 scoperte, nessuna falsa); con <code>p.adjust(p, method = \"holm\")<\/code> non c&#8217;\u00e8 motivo di preferirgli Bonferroni.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"fwer-fdr\">Errore sulla famiglia o quota di scoperte false?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Prima di andare oltre, conviene fermarsi su una domanda che sembra filosofica ed \u00e8 invece pratica: <em>che cosa<\/em> vogliamo controllare?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Bonferroni e Holm controllano la probabilit\u00e0 di commettere <strong>anche un solo<\/strong> falso positivo. \u00c8 la richiesta giusta quando ogni errore costa caro: decidiamo di rifare il template di tutte le schede prodotto sulla base di un test, e un falso positivo vuol dire settimane di lavoro buttate.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ma in molte analisi SEO la situazione \u00e8 diversa. Scandagliamo 200 query o 500 pagine per capire <strong>quali meritano un approfondimento<\/strong>. Qui un falso positivo non \u00e8 una catastrofe: \u00e8 un&#8217;occhiata in pi\u00f9 a una pagina che non ne aveva bisogno. Quello che non vogliamo \u00e8 che le scoperte siano <em>per lo pi\u00f9<\/em> falsi allarmi. La grandezza da controllare diventa allora la <strong>quota di falsi positivi fra le scoperte<\/strong>, che gli statistici chiamano <em>false discovery rate<\/em> (FDR). Un FDR del 5% vuol dire: delle query che segnaliamo, in media il 5% sar\u00e0 rumore.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Sono due promesse diverse, e la seconda \u00e8 molto meno esigente della prima<\/strong>: per questo, a parit\u00e0 di dati, lascia passare pi\u00f9 effetti veri.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"benjamini-hochberg\">Il metodo di Benjamini-Hochberg<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Il metodo che controlla il FDR, proposto da Yoav Benjamini e Yosef Hochberg nel 1995, \u00e8 sorprendentemente semplice. A parole: ordiniamo i p-value dal pi\u00f9 piccolo al pi\u00f9 grande, e invece di una soglia fissa usiamo una soglia che <strong>cresce con la posizione in classifica<\/strong>. Il p-value al primo posto deve stare sotto 1\/m \u00d7 0,05, quello al secondo sotto 2\/m \u00d7 0,05, e cos\u00ec via:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\\(p_{(i)} \\le \\frac{i}{m} \\cdot q\\)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">dove p\u208d\u1d62\u208e \u00e8 il p-value in posizione i, m il numero di test e q il FDR che accettiamo (qui 0,05). Si cerca la posizione <strong>pi\u00f9 bassa in classifica<\/strong> (il p-value pi\u00f9 grande) che rispetta la disuguaglianza: quella query e tutte quelle che la precedono sono le scoperte.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Vediamo i p-value del nostro esempio dalla posizione 14 alla 20, con la soglia di ciascuno:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Rango<\/th><th>p-value<\/th><th>Soglia BH (rango\/200 \u00d7 0,05)<\/th><th>CTR cambiato davvero?<\/th><\/tr><\/thead><tbody><tr><td>14<\/td><td>0,000018<\/td><td>0,00350<\/td><td>s\u00ec<\/td><\/tr><tr><td>15<\/td><td>0,00070<\/td><td>0,00375<\/td><td>s\u00ec<\/td><\/tr><tr><td>16<\/td><td>0,00124<\/td><td>0,00400<\/td><td>s\u00ec<\/td><\/tr><tr><td><strong>17<\/strong><\/td><td><strong>0,00356<\/strong><\/td><td><strong>0,00425<\/strong><\/td><td><strong>no<\/strong><\/td><\/tr><tr><td>18<\/td><td>0,00531<\/td><td>0,00450<\/td><td>s\u00ec<\/td><\/tr><tr><td>19<\/td><td>0,00683<\/td><td>0,00475<\/td><td>no<\/td><\/tr><tr><td>20<\/td><td>0,00720<\/td><td>0,00500<\/td><td>s\u00ec<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">L&#8217;ultima posizione che sta sotto la sua soglia \u00e8 la 17: le prime 17 query sono le scoperte. Bonferroni, con la sua soglia fissa di 0,00025, si sarebbe fermato alla 14. Lo verifico in R:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>table(scoperta = p.adjust(p, method = \"BH\") &lt; 0.05, vera)\n\n#         vera\n# scoperta FALSE TRUE\n#    FALSE   179    4\n#    TRUE      1   16<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Diciassette scoperte, <strong>sedici vere e una falsa<\/strong>: un falso allarme su diciassette, il 5,9%, in linea con il 5% promesso. Rispetto a Bonferroni abbiamo recuperato due query cambiate davvero, al prezzo di un solo errore. E rispetto al report senza correzioni siamo passati da nove falsi allarmi su 27 a uno su 17.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/www.gironi.it\/blog\/wp-content\/uploads\/2026\/10\/confronti-multipli-pvalue.png\" alt=\"I 40 p-value pi\u00f9 piccoli delle 200 query, in ordine, colorati secondo la verit\u00e0. La soglia piatta del 5% cattura anche molte query che non sono cambiate. La soglia di Bonferroni \u00e8 cos\u00ec bassa da lasciarne fuori diverse vere. La retta di Benjamini-Hochberg sale con il rango e taglia dopo la diciassettesima.\"\/><figcaption class=\"wp-element-caption\">I 40 p-value pi\u00f9 piccoli delle 200 query, in ordine, colorati secondo la verit\u00e0. La soglia piatta del 5% cattura anche molte query che non sono cambiate. La soglia di Bonferroni \u00e8 cos\u00ec bassa da lasciarne fuori diverse vere. La retta di Benjamini-Hochberg sale con il rango e taglia dopo la diciassettesima.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Il grafico mostra bene la logica. In cima alla classifica ci sono gli effetti grandi, con p-value minuscoli: li trova qualunque metodo. Il problema \u00e8 la zona di mezzo, dove effetti veri ma modesti si mescolano al rumore. Bonferroni la scarta in blocco; la soglia piatta la accoglie in blocco; Benjamini-Hochberg la attraversa con una soglia che si allarga quanto basta.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">(n.b. il metodo garantisce un FDR <em>medio<\/em> del 5%: in un singolo report la quota effettiva pu\u00f2 essere pi\u00f9 alta o pi\u00f9 bassa. Ripetendo la simulazione 300 volte, Benjamini-Hochberg produce in media 0,6 scoperte false per report, una quota del 3,7%: sotto il 5% promesso.)<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"quale\">Quale correzione scegliere?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Non esiste una correzione giusta in assoluto: esiste quella adatta alla domanda. In sintesi:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Situazione<\/th><th>Correzione<\/th><th>Perch\u00e9<\/th><\/tr><\/thead><tbody><tr><td>Un solo test, deciso prima di guardare i dati<\/td><td>nessuna<\/td><td>non c&#8217;\u00e8 molteplicit\u00e0<\/td><\/tr><tr><td>Poche decisioni costose (un template, una migrazione, la variante vincente di un A\/B\/n)<\/td><td>Holm<\/td><td>anche un solo errore costa caro<\/td><\/tr><tr><td>Molte query, pagine o segmenti da cui scegliere cosa approfondire<\/td><td>Benjamini-Hochberg<\/td><td>conta la quota di scoperte false, non l&#8217;errore singolo<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Il caso pi\u00f9 comune nella pratica quotidiana, per\u00f2, \u00e8 un altro: <strong>non avevamo deciso niente prima<\/strong>. Abbiamo aperto Search Console, filtrato, segmentato, confrontato, e ci siamo fermati sui numeri che ci sembravano interessanti. In questo scenario nessuna correzione \u00e8 possibile, perch\u00e9 non sappiamo nemmeno quanti test abbiamo fatto davvero.<\/p>\n\n\n\n<div class=\"wp-block-group has-background\" style=\"background-color:#f5f7f9;margin-top:2.5rem;margin-bottom:2.5rem;padding-top:1.5rem;padding-right:1.5rem;padding-bottom:1.5rem;padding-left:1.5rem\"><div class=\"wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow\">\n<p>Un avvertimento: <strong>una correzione per confronti multipli vale solo se conta tutti i test che abbiamo fatto, non solo quelli che mostriamo.<\/strong> <br>Se abbiamo guardato 30 segmenti e ne riportiamo 5, la correzione va fatta su 30. Se abbiamo provato tre modi diversi di calcolare la metrica e teniamo quello che &#8220;funziona&#8221;, i test sono tre volte tanti. Il modo pi\u00f9 semplice per non perdersi \u00e8 decidere prima, e mettere per iscritto, quali confronti faremo.<\/p>\n<\/div><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"dove\">Dove si nascondono i confronti multipli nella SEO<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Il report mese su mese delle query \u00e8 il caso pi\u00f9 evidente, ma la molteplicit\u00e0 ha molti travestimenti.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>I segmenti.<\/strong> &#8220;Il CTR non \u00e8 cambiato, ma da mobile in Lombardia s\u00ec&#8221;: a forza di affettare i dati per dispositivo, paese, categoria e tipo di pagina, qualche fetta significativa salta fuori sempre. \u00c8 la stessa trappola del <a href=\"https:\/\/www.gironi.it\/blog\/il-paradosso-di-simpson-nella-seo-quando-i-dati-aggregati-possono-mentire\/\">paradosso di Simpson<\/a>, vista dal lato opposto.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Le metriche.<\/strong> In uno <a href=\"https:\/\/www.gironi.it\/blog\/split-test-seo\/\">split test SEO<\/a> guardare clic, impressioni, CTR, posizione e conversioni vuol dire fare cinque test. Per questo la metrica principale si sceglie in anticipo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Le varianti.<\/strong> Un <a href=\"https:\/\/www.gironi.it\/blog\/ab-testing\/\">A\/B test<\/a> con cinque varianti contro il controllo sono cinque confronti; se poi confrontiamo anche le varianti fra loro diventano quindici. Per i confronti fra tutte le coppie di medie l&#8217;<a href=\"https:\/\/www.gironi.it\/blog\/lanalisi-della-varianza-anova-spiegata-semplice\/\">ANOVA<\/a> ha un suo strumento dedicato, il test di Tukey.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Il tempo.<\/strong> Guardare un test ogni giorno riservandosi di fermarlo \u00e8 una molteplicit\u00e0 nascosta nel calendario: \u00e8 il <a href=\"https:\/\/www.gironi.it\/blog\/peeking-problem\/\">peeking problem<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Le correlazioni.<\/strong> Una matrice di <a href=\"https:\/\/www.gironi.it\/blog\/correlazione\/\">correlazione<\/a> fra 20 metriche contiene 190 coppie: una decina risulter\u00e0 &#8220;significativa&#8221; anche se le metriche fossero tutte indipendenti.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">(n.b. nella realt\u00e0 le cose vanno anche peggio che nella nostra simulazione. Il CTR di una query non oscilla solo per il caso binomiale dei clic: cambia con la posizione, con le funzioni della SERP, con il mix di dispositivi. <code>prop.test()<\/code> ignora queste fonti di variabilit\u00e0 e sottostima l&#8217;incertezza, quindi sui dati veri i falsi allarmi sono pi\u00f9 del 5%. Le correzioni per confronti multipli non rimediano a un modello sbagliato: lo presuppongono giusto.)<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"domande-frequenti\">Domande frequenti<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Cosa sono i confronti multipli in statistica?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Sono le situazioni in cui si eseguono molti test statistici sugli stessi dati o sulla stessa domanda: confrontare molte query, molti segmenti, molte metriche o molte varianti. Ogni test ha la sua probabilit\u00e0 di falso positivo, e insieme le probabilit\u00e0 si accumulano: con abbastanza test, qualche risultato &#8220;significativo&#8221; arriva per puro caso.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Come si applica la correzione di Bonferroni?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Si divide la soglia di significativit\u00e0 per il numero di test: con 20 test e una soglia del 5%, ogni test deve avere un p-value sotto 0,05 \/ 20 = 0,0025. In modo equivalente si moltiplica ogni p-value per il numero di test e lo si confronta con 0,05. In R lo fa <code>p.adjust(p, method = \"bonferroni\")<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Che differenza c&#8217;\u00e8 tra FWER e FDR?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Il FWER (family-wise error rate) \u00e8 la probabilit\u00e0 di commettere almeno un falso positivo nell&#8217;insieme dei test; il FDR (false discovery rate) \u00e8 la quota media di falsi positivi fra i risultati dichiarati significativi. Controllare il FWER \u00e8 pi\u00f9 severo e adatto a poche decisioni costose; controllare il FDR \u00e8 adatto all&#8217;esplorazione di molte ipotesi.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Quando usare Benjamini-Hochberg invece di Bonferroni?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Quando i test sono molti e lo scopo \u00e8 selezionare cosa approfondire, accettando che una piccola quota delle scoperte sia falsa: analisi di centinaia di query o pagine, screening di segmenti, ricerca di anomalie. Bonferroni, in questi casi, \u00e8 cos\u00ec severo da perdere buona parte degli effetti veri.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">La correzione serve anche con pochi test?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Con due o tre test il rischio complessivo cresce di poco (dal 5% a circa il 10-14%), ma cresce. Se i confronti sono stati decisi in anticipo e sono pochi, il metodo di Holm costa pochissimo in potenza e mette al riparo. Se invece \u00e8 stato deciso in anticipo un solo confronto principale, la correzione non serve.<\/p>\n\n\n\n<script type=\"application\/ld+json\">{\"@context\": \"https:\/\/schema.org\", \"@type\": \"FAQPage\", \"mainEntity\": [{\"@type\": \"Question\", \"name\": \"Cosa sono i confronti multipli in statistica?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"Sono le situazioni in cui si eseguono molti test statistici sugli stessi dati o sulla stessa domanda: confrontare molte query, molti segmenti, molte metriche o molte varianti. Ogni test ha la sua probabilit\u00e0 di falso positivo, e insieme le probabilit\u00e0 si accumulano: con abbastanza test, qualche risultato \\\"significativo\\\" arriva per puro caso.\"}}, {\"@type\": \"Question\", \"name\": \"Come si applica la correzione di Bonferroni?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"Si divide la soglia di significativit\u00e0 per il numero di test: con 20 test e una soglia del 5%, ogni test deve avere un p-value sotto 0,05 \/ 20 = 0,0025. In modo equivalente si moltiplica ogni p-value per il numero di test e lo si confronta con 0,05. In R lo fa p.adjust(p, method = \\\"bonferroni\\\").\"}}, {\"@type\": \"Question\", \"name\": \"Che differenza c'\u00e8 tra FWER e FDR?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"Il FWER (family-wise error rate) \u00e8 la probabilit\u00e0 di commettere almeno un falso positivo nell'insieme dei test; il FDR (false discovery rate) \u00e8 la quota media di falsi positivi fra i risultati dichiarati significativi. Controllare il FWER \u00e8 pi\u00f9 severo e adatto a poche decisioni costose; controllare il FDR \u00e8 adatto all'esplorazione di molte ipotesi.\"}}, {\"@type\": \"Question\", \"name\": \"Quando usare Benjamini-Hochberg invece di Bonferroni?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"Quando i test sono molti e lo scopo \u00e8 selezionare cosa approfondire, accettando che una piccola quota delle scoperte sia falsa: analisi di centinaia di query o pagine, screening di segmenti, ricerca di anomalie. Bonferroni, in questi casi, \u00e8 cos\u00ec severo da perdere buona parte degli effetti veri.\"}}, {\"@type\": \"Question\", \"name\": \"La correzione serve anche con pochi test?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"Con due o tre test il rischio complessivo cresce di poco (dal 5% a circa il 10-14%), ma cresce. Se i confronti sono stati decisi in anticipo e sono pochi, il metodo di Holm costa pochissimo in potenza e mette al riparo. Se invece \u00e8 stato deciso in anticipo un solo confronto principale, la correzione non serve.\"}}]}<\/script>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"prova-tu\">Prova tu<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Il codice dell&#8217;esempio \u00e8 completo, e si presta a qualche esperimento.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Si mette a 0 il numero di query che cambiano davvero (<code>vera &lt;- rep(FALSE, n_query)<\/code>) e si contano le scoperte con e senza correzione. Senza correzione dovrebbero essere una decina; con Bonferroni e con Benjamini-Hochberg quasi sempre zero. \u00c8 il caso del salmone morto.<\/li><li>Si porta l&#8217;aumento del CTR da 1,5 a 1,2: un effetto pi\u00f9 piccolo, pi\u00f9 realistico per un title riscritto. Quante delle 20 query vere ritrova ciascun metodo?<\/li><li>Si ripete la simulazione con 2.000 query invece di 200, sempre con 20 vere. Cosa succede alla soglia di Bonferroni, e quante query vere sopravvivono?<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">L&#8217;ultimo esercizio, in particolare, mostra perch\u00e9 i grandi siti hanno bisogno del FDR: pi\u00f9 test facciamo, pi\u00f9 Bonferroni ci rende ciechi.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\">Abbiamo parlato di p-value per tutto l&#8217;articolo: da correggere, da ordinare, da confrontare con soglie diverse. Ma che cosa <em>dice<\/em>, esattamente, un p-value di 0,03? Che c&#8217;\u00e8 il 97% di probabilit\u00e0 che l&#8217;effetto sia reale? Che l&#8217;ipotesi nulla ha il 3% di probabilit\u00e0 di essere vera? Nessuna delle due, ed \u00e8 forse il numero pi\u00f9 frainteso di tutta la statistica applicata. Sar\u00e0 il tema del prossimo passo: <strong><a href=\"https:\/\/www.gironi.it\/blog\/p-value\/\">il p-value e i suoi malintesi<\/a><\/strong>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"per-approfondire\">Per approfondire<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Per capire perch\u00e9 tanti risultati \u00absignificativi\u00bb non reggono alla prova dei fatti, e quanto conti il numero di domande che abbiamo posto ai dati, consiglio <a href=\"https:\/\/www.amazon.it\/dp\/8806246623?tag=consulenzeinf-21&amp;ascsubtag=confronti-multipli\" rel=\"nofollow sponsored noopener\" target=\"_blank\"><em>L&#8217;arte della statistica<\/em><\/a> di David Spiegelhalter: un libro che spiega l&#8217;incertezza senza formule inutili e senza scorciatoie. Per i confronti multipli negli esperimenti online, dalle metriche alle varianti, il riferimento in inglese resta <a href=\"https:\/\/www.amazon.it\/dp\/1108724264?tag=consulenzeinf-21&amp;ascsubtag=confronti-multipli\" rel=\"nofollow sponsored noopener\" target=\"_blank\"><em>Trustworthy Online Controlled Experiments<\/em><\/a> di Ron Kohavi, Diane Tang e Ya Xu.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Nel 2009 un gruppo di neuroscienziati mise un salmone in uno scanner per la risonanza magnetica funzionale, gli mostr\u00f2 una serie di fotografie di persone in situazioni sociali e gli &#8220;chiese&#8221; quali emozioni provassero. L&#8217;analisi trov\u00f2 una piccola area del cervello con un&#8217;attivit\u00e0 statisticamente significativa. Il dettaglio \u00e8 che il salmone era morto. Lo studio &hellip; <a href=\"https:\/\/www.gironi.it\/blog\/confronti-multipli\/\" class=\"more-link\">Leggi tutto<span class=\"screen-reader-text\"> &#8220;Confronti multipli: perch\u00e9 su 200 query qualcuna \u00abmigliora\u00bb sempre per caso&#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":[629],"tags":[],"class_list":["post-4503","post","type-post","status-publish","format-standard","hentry","category-statistica-it"],"lang":"it","translations":{"it":4503,"en":4507},"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":"Nel 2009 un gruppo di neuroscienziati mise un salmone in uno scanner per la risonanza magnetica funzionale, gli mostr\u00f2 una serie di fotografie di persone in situazioni sociali e gli &#8220;chiese&#8221; quali emozioni provassero. L&#8217;analisi trov\u00f2 una piccola area del cervello con un&#8217;attivit\u00e0 statisticamente significativa. Il dettaglio \u00e8 che il salmone era morto. Lo studio&hellip;","_links":{"self":[{"href":"https:\/\/www.gironi.it\/blog\/wp-json\/wp\/v2\/posts\/4503","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=4503"}],"version-history":[{"count":2,"href":"https:\/\/www.gironi.it\/blog\/wp-json\/wp\/v2\/posts\/4503\/revisions"}],"predecessor-version":[{"id":4525,"href":"https:\/\/www.gironi.it\/blog\/wp-json\/wp\/v2\/posts\/4503\/revisions\/4525"}],"wp:attachment":[{"href":"https:\/\/www.gironi.it\/blog\/wp-json\/wp\/v2\/media?parent=4503"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gironi.it\/blog\/wp-json\/wp\/v2\/categories?post=4503"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gironi.it\/blog\/wp-json\/wp\/v2\/tags?post=4503"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}