  <?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>paologironi blog</title>
	<atom:link href="https://www.gironi.it/blog/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.gironi.it/blog</link>
	<description>Appunti sparsi di (retro) informatica, analisi dei dati, statistica, seo, e cose che cambiano</description>
	<lastBuildDate>Sun, 21 Jun 2026 09:19:51 +0000</lastBuildDate>
	<language>it-IT</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	
	<item>
		<title>Correlazione: Pearson, Spearman e Kendall (e perché non è causazione)</title>
		<link>https://www.gironi.it/blog/correlazione/</link>
					<comments>https://www.gironi.it/blog/correlazione/#respond</comments>
		
		<dc:creator><![CDATA[Paolo Gironi]]></dc:creator>
		<pubDate>Fri, 19 Jun 2026 07:10:54 +0000</pubDate>
				<category><![CDATA[statistica]]></category>
		<guid isPermaLink="false">https://www.gironi.it/blog/?p=3820</guid>

					<description><![CDATA[Chi guarda i dati di un sito lo fa di continuo, spesso senza nemmeno accorgersene, e talvolta nota che due cose sembrano muoversi insieme. Le pagine che stanno più in alto in SERP prendono più clic; quelle dove gli utenti restano più a lungo convertono di più; gli articoli più lunghi paiono posizionarsi meglio. Sono &#8230; <a href="https://www.gironi.it/blog/correlazione/" class="more-link">Leggi tutto<span class="screen-reader-text"> "Correlazione: Pearson, Spearman e Kendall (e perché non è causazione)"</span></a>]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Chi guarda i dati di un sito lo fa di continuo, spesso senza nemmeno accorgersene, e talvolta nota che due cose sembrano muoversi insieme. <br>Le pagine che stanno più in alto in SERP prendono più clic; quelle dove gli utenti restano più a lungo convertono di più; gli articoli più lunghi paiono posizionarsi meglio. <br>Sono intuizioni preziose, ma restano vaghe finché non rispondiamo a una domanda precisa: <em>quanto</em> si muovono insieme, queste coppie di numeri? E in che senso? <br>Serve un indice che trasformi l&#8217;impressione &#8220;vanno di pari passo&#8221; in una misura confrontabile. Quell&#8217;indice è la <strong>correlazione</strong>, ed è uno degli strumenti più usati — e più fraintesi — di tutta la statistica applicata.</p>



<span id="more-3820"></span>



<p class="wp-block-paragraph">Diciamo subito cosa la correlazione <em>non</em> è, perché è qui che nascono i guai. <br><strong>La correlazione misura se e quanto due variabili si associano; non dice che una causa l&#8217;altra, e non costruisce un modello per prevedere l&#8217;una dall&#8217;altra</strong>. <br>Quel secondo passo — la previsione — è il mestiere della <a href="https://www.gironi.it/blog/regressione-lineare-semplice/" data-type="post" data-id="1807">regressione</a>, di cui ci occuperemo a parte. <br>Qui restiamo al passo precedente: capire, con un solo numero, se due metriche viaggiano insieme.</p>



<h2 class="wp-block-heading">Dalla covarianza alla correlazione</h2>



<p class="wp-block-paragraph">L&#8217;idea di partenza è semplice. Se due variabili si muovono insieme, quando una sta sopra la propria media anche l&#8217;altra tende a stare sopra la sua; quando una scende sotto, l&#8217;altra la segue. <br>Possiamo misurare questa tendenza moltiplicando, per ogni osservazione, lo scarto di <em>x</em> dalla sua media per lo scarto di <em>y</em> dalla sua, e facendone la media. <br>È la <strong>covarianza</strong>:</p>



\( \text{cov}(x, y) = \frac{1}{n} \sum_{i=1}^{n} (x_i &#8211; \bar{x})(y_i &#8211; \bar{y}) \\ \)



<p class="wp-block-paragraph">dove <em>x̄</em> e <em>ȳ</em> sono le medie delle due variabili e <em>n</em> il numero di osservazioni. <br>Quando gli scarti hanno lo stesso segno (entrambi sopra o entrambi sotto la media) il prodotto è positivo; quando hanno segni opposti è negativo. <br><strong>Una covarianza positiva segnala dunque che le due variabili tendono a crescere insieme, una negativa che quando l&#8217;una sale l&#8217;altra scende.</strong></p>



<p class="wp-block-paragraph">La covarianza, però, ha un difetto che la rende inutilizzabile come metro di confronto: <strong>dipende dalle unità di misura</strong>. <br>La covarianza tra sessioni e secondi di permanenza è un numero, quella tra sessioni e tasso di conversione un altro, e i due non si possono paragonare perché parlano lingue diverse. <br><strong>Per ottenere una misura pulita la dividiamo per le due deviazioni standard, in modo da spogliarla delle unità e costringerla in un intervallo fisso. </strong><br>Otteniamo così il <strong>coefficiente di correlazione di Pearson</strong>:</p>



\( r = \frac{\sum_{i=1}^{n} (x_i &#8211; \bar{x})(y_i &#8211; \bar{y})}{\sqrt{\sum_{i=1}^{n} (x_i &#8211; \bar{x})^2} \; \sqrt{\sum_{i=1}^{n} (y_i &#8211; \bar{y})^2}} \\ \)



<p class="wp-block-paragraph">Il numeratore non è altro che la covarianza (a meno del fattore <em>n</em>); il denominatore è il prodotto delle due variabilità, e serve appunto a normalizzare. <br>Il risultato è un numero puro compreso tra <strong>−1 e +1</strong>: vale +1 quando i punti stanno esattamente su una retta crescente, −1 quando stanno su una retta decrescente, 0 quando non c&#8217;è alcuna associazione lineare. <br>Quanto più <em>r</em> si avvicina agli estremi, tanto più stretta è la relazione lineare.</p>



<h2 class="wp-block-heading">Pearson: l&#8217;associazione lineare (e la sua trappola)</h2>



<p class="wp-block-paragraph">Mettiamolo subito al lavoro su un caso che chi fa SEO conosce a memoria: il legame tra la <strong>posizione in SERP</strong> e il <strong>CTR</strong>, la percentuale di clic. Sappiamo tutti che più si scende nella pagina dei risultati, meno si viene cliccati. Prendiamo dieci posizioni con i rispettivi CTR osservati e calcoliamo in R il coefficiente di Pearson:</p>



<pre class="wp-block-code"><code>pos &lt;- 1:10
ctr &lt;- c(28.5, 15.7, 11.0, 7.2, 8.0, 5.1, 4.0, 3.2, 2.8, 2.6)  # CTR % per posizione

cor(pos, ctr)
# &#091;1] -0.852</code></pre>



<p class="wp-block-paragraph">Il coefficiente è <strong>−0,852</strong>: forte, negativo, esattamente come ci aspettavamo. Eppure c&#8217;è qualcosa che non torna. Il legame tra posizione e CTR è ferreo — non capita quasi mai che una posizione più bassa renda più clic — e ci aspetteremmo un valore ancora più vicino a −1. Perché Pearson si ferma a −0,85?</p>



<p class="wp-block-paragraph">La risposta è il punto più importante di tutto l&#8217;articolo. <strong>Pearson misura solo l&#8217;associazione lineare</strong>, cioè quanto bene i punti si dispongono lungo una <em>retta</em>. Ma la curva del CTR non è una retta: crolla a precipizio dalla prima alla terza posizione e poi si appiattisce. La relazione è fortissima, solo che è <em>curva</em>. Pearson, che cerca rette, vede quella curvatura come &#8220;imperfezione&#8221; e abbassa il voto. Non sta sbagliando: sta rispondendo a una domanda — &#8220;quanto è lineare?&#8221; — che in questo caso non è quella giusta.</p>



<h2 class="wp-block-heading">Spearman e Kendall: l&#8217;associazione monotòna</h2>



<p class="wp-block-paragraph">Per molte relazioni del mondo SEO ci interessa una cosa più debole della linearità: ci basta sapere se, quando una variabile cresce, l&#8217;altra cresce <em>sistematicamente</em> (o cala sistematicamente), senza pretendere che lo faccia a passo costante. Una relazione del genere si dice <strong>monotòna</strong>, e per misurarla esiste il coefficiente di correlazione per ranghi di <strong>Spearman</strong>, indicato con ρ (<em>rho</em>).</p>



<p class="wp-block-paragraph">Il trucco di Spearman è elegante: invece di lavorare sui valori, lavora sui loro <strong>ranghi</strong>. <br>Sostituisce a ogni numero la sua posizione in classifica (il più piccolo diventa 1, il successivo 2, e così via) e poi calcola un normale Pearson su questi ranghi. In questo modo la forma esatta della curva sparisce — conta solo l&#8217;ordine — e ciò che resta è quanto fedelmente l&#8217;ordine di <em>x</em> riproduce quello di <em>y</em>. </p>



<p class="wp-block-paragraph">Lo calcoliamo sugli stessi dati di prima:</p>



<pre class="wp-block-code"><code>cor(pos, ctr, method = "spearman")
# &#091;1] -0.988</code></pre>



<p class="wp-block-paragraph">Adesso il coefficiente è <strong>−0,988</strong>, schiacciato contro −1. È la fotografia corretta della situazione: man mano che la posizione peggiora, il CTR cala quasi senza eccezioni. (Quel &#8220;quasi&#8221; non è un caso: nei dati ho lasciato una piccola inversione realistica, la posizione 5 che rende più della 4, come capita quando un <em>rich snippet </em>gonfia il CTR di un risultato; è esattamente il genere di increspatura che impedisce a ρ di toccare il −1 esatto.). Dove Pearson vedeva un&#8217;associazione &#8220;buona ma non ottima&#8221;, Spearman riconosce la relazione monotòna quasi perfetta che effettivamente c&#8217;è.</p>



<p class="wp-block-paragraph">Esiste una terza misura che vale la pena conoscere, il <strong>tau di Kendall</strong> (τ). Anch&#8217;essa lavora sull&#8217;ordine, ma con una logica diversa: conta, su tutte le coppie di osservazioni, quante sono <em>concordi</em> (se <em>x</em> cresce, cresce anche <em>y</em>) e quante <em>discordi</em>, e ne fa il bilancio. La calcolo in R sempre sugli stessi dati:</p>



<pre class="wp-block-code"><code>cor(pos, ctr, method = "kendall")
# &#091;1] -0.956</code></pre>



<p class="wp-block-paragraph">Kendall restituisce <strong>−0,956</strong>, anch&#8217;esso vicino agli estremi ma tipicamente un po&#8217; più prudente di Spearman. </p>



<p class="wp-block-paragraph">Nella pratica quotidiana la scelta è meno complicata di quanto sembri: <strong>Pearson</strong> quando ci interessa una relazione lineare e i dati non hanno code o valori anomali violenti; <strong>Spearman</strong> quando la relazione è monotòna ma curva, o quando i dati sono già ranghi (posizioni, classifiche), o quando un paio di outlier rischiano di sballare Pearson; <strong>Kendall</strong> quando le osservazioni sono poche o ci sono molti valori a pari merito, situazione in cui le sue proprietà statistiche reggono meglio.</p>



<h2 class="wp-block-heading">La matrice di correlazione</h2>



<p class="wp-block-paragraph">Raramente abbiamo solo due metriche da confrontare. Più spesso ne abbiamo una manciata — sessioni, durata media, conversioni, frequenza di rimbalzo — e vorremmo vedere <em>tutte</em> le associazioni a colpo d&#8217;occhio. La funzione <code>cor()</code> di R, applicata a un intero data frame, restituisce la <strong>matrice di correlazione</strong>: il coefficiente di ogni variabile con ogni altra. <br>La costruisco su dodici pagine di esempio:</p>



<pre class="wp-block-code"><code>ga4 &lt;- data.frame(
  sessioni      = c(120, 340, 210, 560, 430, 780, 650, 290, 510, 880, 360, 720),
  durata_media  = c(31,  55,  48,  44,  58,  63,  71,  52,  46,  68,  60,  64),
  conversioni   = c(3,   8,   4,   21,  11,  24,  19,  9,   17,  29,  7,   22),
  freq_rimbalzo = c(70,  61,  66,  44,  57,  41,  46,  59,  52,  38,  63,  45)
)

round(cor(ga4), 2)
#               sessioni durata_media conversioni freq_rimbalzo
# sessioni          1.00         0.73        0.98         -0.97
# durata_media      0.73         1.00        0.58         -0.62
# conversioni       0.98         0.58        1.00         -0.99
# freq_rimbalzo    -0.97        -0.62       -0.99          1.00</code></pre>



<p class="wp-block-paragraph">Si legge come una tabella a doppia entrata: sulla diagonale ci sono tutti 1 (ogni variabile è perfettamente correlata con sé stessa), e la matrice è simmetrica perché la correlazione di <em>x</em> con <em>y</em> è la stessa di <em>y</em> con <em>x</em>. Come si vede, sessioni e conversioni viaggiano quasi all&#8217;unisono (0,98: più traffico, più conversioni — niente di sorprendente), la frequenza di rimbalzo è correlata negativamente con tutto il resto, mentre la durata media si associa alle conversioni molto meno di quanto l&#8217;intuizione suggerirebbe (0,58). <br>Una matrice del genere è una mappa di partenza preziosa per decidere dove guardare. È utile visualizzarla come <strong>heatmap</strong> (con pacchetti come <code>corrplot</code>), dove l&#8217;intensità del colore rende immediato cogliere i legami forti.</p>



<p class="has-light-gray-background-color has-background wp-block-paragraph">Un avvertimento: <strong>una matrice di correlazione non è una mappa causale</strong>. <br>Ci dice quali numeri si muovono insieme, non quale muove quale, né se a muoverli sia un terzo fattore che non abbiamo nemmeno in tabella.</p>



<h2 class="wp-block-heading">Correlazione non è causazione</h2>



<p class="wp-block-paragraph"><strong>È la frase più ripetuta della statistica, e la più disattesa nei fatti. </strong><br>Vale la pena vedere dove inciampa, perché in SEO l&#8217;inciampo è quotidiano. Prendiamo l&#8217;osservazione classica: gli articoli più lunghi si posizionano meglio. Misuriamo l&#8217;associazione tra lunghezza del contenuto e un punteggio di ranking (più alto = meglio piazzato):</p>



<pre class="wp-block-code"><code>lung       &lt;- c(620, 850, 1100, 1300, 1500, 1800, 2100, 2400, 2800, 3200)
rank_score &lt;- c(3,   8,   6,    11,   9,    7,    14,   10,   16,   15)

cor(lung, rank_score)
# &#091;1] 0.842</code></pre>



<p class="wp-block-paragraph">Un bel <strong>0,842</strong>: la correlazione c&#8217;è, ed è robusta. <br>La tentazione di concludere &#8220;allungo gli articoli e salgo in classifica&#8221; è fortissima — e quasi sempre sbagliata. Davanti a una correlazione, prima di parlare di causa, dobbiamo metterci sul tavolo almeno tre spiegazioni alternative. <br>Potrebbe essere una <strong>causa diretta</strong> (la lunghezza aiuta davvero il ranking). Potrebbe essere una <strong>causa inversa</strong> (le pagine che già rankano bene ricevono più cure e vengono ampliate nel tempo). <br>Oppure — il caso più frequente e più insidioso — potrebbe esserci un <strong>fattore confondente</strong> che muove entrambe: l&#8217;autorevolezza del sito. Un dominio autorevole tende sia a produrre contenuti più approfonditi (quindi più lunghi) sia a posizionarsi meglio (per ragioni che con la lunghezza non c&#8217;entrano). La lunghezza e il ranking salgono insieme non perché l&#8217;una causi l&#8217;altro, ma perché un terzo elemento li traina entrambi.</p>



<p class="wp-block-paragraph">Questo terzo elemento nascosto è la radice di alcuni degli errori più spettacolari nell&#8217;analisi dei dati: arriva persino a invertire il segno di una relazione quando i dati vengono aggregati nel modo sbagliato, il fenomeno che va sotto il nome di <a href="https://www.gironi.it/blog/il-paradosso-di-simpson-nella-seo-quando-i-dati-aggregati-possono-mentire/">paradosso di Simpson</a>. <br>Stabilire un nesso causale è un mestiere a sé, che richiede esperimenti controllati o tecniche dedicate; la correlazione, da sola, non ci arriverà mai. Il suo compito è un altro, ed è prezioso: segnalarci le coppie di metriche che vale la pena indagare più a fondo.</p>



<h2 class="wp-block-heading">Prova tu</h2>



<p class="wp-block-paragraph">Per fissare il meccanismo, ecco un esercizio con dati verosimili. Abbiamo, per dieci pagine, il numero di domini referral che le linkano e il loro traffico organico mensile, e vogliamo capire quanto i due si associno:</p>



<pre class="wp-block-code"><code>bl  &lt;- c(5, 12, 8, 25, 18, 40, 33, 60, 52, 95)        # domini referral
org &lt;- c(180, 240, 420, 510, 760, 690, 1250, 1100, 1900, 1650)  # sessioni organiche/mese</code></pre>



<p class="wp-block-paragraph">Il compito: calcolare sia il coefficiente di Pearson con <code>cor(bl, org)</code>, sia quello di Spearman con <code>cor(bl, org, method = "spearman")</code>, e ragionare sul perché differiscono.</p>



<p class="wp-block-paragraph">Per controllare i conti: Pearson vale <strong>0,815</strong> e Spearman <strong>0,855</strong>. Sono entrambi alti e raccontano la stessa storia di fondo — più domini referral, più traffico — ma il fatto che Spearman sia un po&#8217; più alto di Pearson ci dice qualcosa: la relazione è più <em>monotòna</em> che <em>lineare</em>, segno che oltre una certa soglia ogni link aggiuntivo porta meno traffico marginale di quanto la retta vorrebbe. E, naturalmente, nessuno dei due numeri ci autorizza a dire che comprare backlink <em>farà</em> salire il traffico: anche qui l&#8217;autorevolezza del sito potrebbe star muovendo le due cose insieme.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph">Con la correlazione abbiamo imparato a rispondere alla domanda <em>se, e quanto, due metriche si associano</em> — scegliendo di volta in volta Pearson, Spearman o Kendall a seconda della forma del legame. <strong>È il gradino indispensabile prima della domanda successiva, quella che chiunque analizzi dei dati finisce per porsi: data un&#8217;associazione, posso usare una variabile per <em>prevedere</em> l&#8217;altra, e tracciare la retta che le lega?</strong> Da qui in poi non misuriamo più soltanto la forza di un legame, ma lo modelliamo: è il territorio della <a href="https://www.gironi.it/blog/regressione-lineare-semplice/">regressione lineare</a>, dove quel coefficiente <em>r</em> che abbiamo appena conosciuto torna protagonista, questa volta al servizio della previsione.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">Per approfondire</h3>



<p class="wp-block-paragraph">Per i fondamenti di correlazione e regressione spiegati con rigore ma senza inutili tecnicismi, il manuale italiano che tengo più volentieri a portata di mano è <a href="https://www.amazon.it/dp/8891910651?tag=consulenzeinf-21" rel="nofollow sponsored noopener" target="_blank"><em>Statistica</em></a> di Newbold, Carlson e Thorne: i capitoli sull&#8217;associazione tra variabili coprono Pearson, Spearman e le insidie dell&#8217;interpretazione causale con la chiarezza che serve a chi parte dalle applicazioni.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.gironi.it/blog/correlazione/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Effect size e power analysis: quanto è grande l&#8217;effetto (e quanti dati servono)</title>
		<link>https://www.gironi.it/blog/effect-size-e-power-analysis/</link>
					<comments>https://www.gironi.it/blog/effect-size-e-power-analysis/#respond</comments>
		
		<dc:creator><![CDATA[Paolo Gironi]]></dc:creator>
		<pubDate>Wed, 17 Jun 2026 07:33:32 +0000</pubDate>
				<category><![CDATA[statistica]]></category>
		<guid isPermaLink="false">https://www.gironi.it/blog/?p=3691</guid>

					<description><![CDATA[Abbiamo chiuso l&#8217;articolo sul calcolatore di significatività con una promessa. Dicevamo che il p-value risponde a una sola domanda — l&#8217;effetto esiste? — e che a quella domanda, da solo, non ne aggiunge nessun&#8217;altra. Non ci dice quanto è grande l&#8217;effetto, né se vale lo sforzo di portarlo in produzione. È il momento di mantenere &#8230; <a href="https://www.gironi.it/blog/effect-size-e-power-analysis/" class="more-link">Leggi tutto<span class="screen-reader-text"> "Effect size e power analysis: quanto è grande l&#8217;effetto (e quanti dati servono)"</span></a>]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Abbiamo chiuso l&#8217;articolo sul <a href="https://www.gironi.it/blog/calcolatore-significativita-ab-test/">calcolatore di significatività</a> con una promessa. Dicevamo che il p-value risponde a una sola domanda — <em>l&#8217;effetto esiste?</em> — e che a quella domanda, da solo, non ne aggiunge nessun&#8217;altra. Non ci dice quanto è grande l&#8217;effetto, né se vale lo sforzo di portarlo in produzione. È il momento di mantenere quella promessa, perché sono proprio le due domande che il p-value lascia in sospeso a separare chi legge i dati con metodo da chi si ferma alla prima soglia che luccica.</p>



<p class="wp-block-paragraph">Le due domande hanno un nome preciso. La prima — <em>quanto è grande?</em> — è l&#8217;<strong>effect size</strong>. La seconda — <em>con i dati che ho, avrei potuto vederlo, un effetto del genere?</em> — è la <strong>potenza</strong> del test, e il ragionamento che ci porta a rispondere si chiama <strong>power analysis</strong>. Le esaminiamo una alla volta, come sempre con un esempio sotto mano.</p>



<span id="more-3691"></span>



<h2 class="wp-block-heading">Significativo non vuol dire grande</h2>



<p class="wp-block-paragraph">Partiamo da una situazione che a chi gestisce test online capita più spesso di quanto vorrebbe. Mettiamo di aver provato due title tag su una pagina ad altissimo traffico, e di aver raccolto un milione di sessioni per variante. Il CTR della versione A è il 3,00%, quello della versione B il 3,05%: cinque centesimi di punto di differenza. Verifichiamo in R se lo scarto è statisticamente significativo:</p>



<pre class="wp-block-code"><code># un milione di sessioni per variante, CTR 3,00% contro 3,05%
prop.test(c(30000, 30500), c(1000000, 1000000), correct = FALSE)$p.value
# [1] 0.03899</code></pre>



<p class="wp-block-paragraph">Il p-value è 0,039, sotto la soglia dello 0,05. Da manuale, dovremmo brindare: la differenza è &#8220;significativa&#8221;. Ma fermiamoci un attimo. Stiamo davvero per riscrivere i title di tutto il sito per guadagnare cinque centesimi di punto di CTR? Quel risultato significativo nasconde un effetto di dimensioni ridicole, reso rilevabile soltanto dalla mole spropositata di dati.</p>



<p class="wp-block-paragraph"><strong>Questo è il punto da cui non si torna indietro</strong>: con un campione abbastanza grande, <em>qualsiasi</em> differenza diventa statisticamente significativa, anche la più trascurabile. Il p-value misura quanto siamo sicuri che l&#8217;effetto non sia zero; non misura quanto l&#8217;effetto sia grande. Sono due cose diverse, e confonderle è l&#8217;errore che porta a inseguire vittorie che sul fatturato non lasciano traccia. L&#8217;effect size esiste proprio per rimettere la grandezza al centro.</p>



<h2 class="wp-block-heading">L&#8217;effect size: misurare il &#8220;quanto&#8221;</h2>



<p class="wp-block-paragraph">L&#8217;idea dell&#8217;effect size è semplice e, vista una volta, difficile da dimenticare: invece di chiederci solo <em>se</em> due gruppi differiscono, misuriamo <em>di quanto</em> differiscono, in una scala che non dipende dalla dimensione del campione. È la differenza tra dire &#8220;B è meglio di A&#8221; e dire &#8220;B è meglio di A di mezza deviazione standard&#8221;. La prima è una notizia; la seconda è un&#8217;informazione su cui si può decidere.</p>



<p class="wp-block-paragraph">Di misure di effect size ne esistono diverse, ciascuna tagliata su un tipo di confronto. Ne vediamo a fondo due — una per le medie, una per le proporzioni — perché coprono il grosso del lavoro quotidiano; delle altre daremo un cenno alla fine, con i rimandi giusti.</p>



<h2 class="wp-block-heading">Cohen&#8217;s d: l&#8217;effetto fra due medie</h2>



<p class="wp-block-paragraph">Quando confrontiamo due medie — il tempo medio sulla pagina di due varianti, la durata media di sessione di due segmenti — la misura di riferimento è il <strong>Cohen&#8217;s d</strong>. L&#8217;intuizione è questa: prendiamo la differenza tra le due medie e la esprimiamo in &#8220;unità di deviazione standard&#8221;, così da renderla confrontabile tra contesti diversi. Una differenza di tre secondi pesa molto se le sessioni durano tutte attorno a quel valore, pochissimo se variano di minuti.</p>



<p class="wp-block-paragraph">In formula, il Cohen&#8217;s d è il rapporto tra la differenza delle medie e la deviazione standard combinata dei due gruppi:</p>



\( d = \frac{\bar{x}_B &#8211; \bar{x}_A}{s_p} \\ \)



<p class="wp-block-paragraph">dove <em>x̄</em><sub>A</sub> e <em>x̄</em><sub>B</sub> sono le medie dei due gruppi e <em>s</em><sub>p</sub> è la <strong>deviazione standard pooled</strong>, cioè una media ponderata delle due deviazioni standard, che mette insieme la variabilità interna di entrambi i gruppi:</p>



\( s_p = \sqrt{\frac{(n_A &#8211; 1)\,s_A^2 + (n_B &#8211; 1)\,s_B^2}{n_A + n_B &#8211; 2}} \\ \)



<p class="wp-block-paragraph">con <em>n</em><sub>A</sub>, <em>n</em><sub>B</sub> le numerosità e <em>s</em><sub>A</sub>, <em>s</em><sub>B</sub> le deviazioni standard dei due gruppi. Il denominatore non è altro che il modo corretto di fondere due variabilità in una sola misura di riferimento.</p>



<p class="wp-block-paragraph">Facciamo un esempio. Abbiamo misurato la durata di sessione (in secondi) su due versioni di una pagina, dodici sessioni per versione. Calcolo il Cohen&#8217;s d in R appoggiandomi al pacchetto <code>effsize</code>, che fa il conto e ci restituisce anche l&#8217;etichetta qualitativa:</p>



<pre class="wp-block-code"><code>A &lt;- c(48, 55, 52, 60, 46, 58, 51, 57, 49, 54, 53, 50)  # versione A
B &lt;- c(50, 58, 52, 62, 49, 57, 60, 53, 61, 51, 59, 54)  # versione B

library(effsize)
cohen.d(B, A)

# Cohen's d
#
# d estimate: 0.6254922 (medium)
# 95 percent confidence interval:
#      lower      upper
# -0.2416187  1.4926030</code></pre>



<p class="wp-block-paragraph">Il d stimato è <strong>0,63</strong>, che <code>effsize</code> classifica come effetto <strong>medio</strong>. Le soglie convenzionali, proposte da Jacob Cohen, sono 0,2 per un effetto piccolo, 0,5 per uno medio, 0,8 per uno grande — ma vanno prese per quello che sono: convenzioni utili a orientarsi, non leggi di natura. Lo stesso Cohen raccomandava di interpretarle alla luce del proprio campo, non di applicarle a scatola chiusa. <em>Nella pratica quotidiana</em> della SEO, un d di 0,63 sul tempo di sessione è un cambiamento che ha senso prendere sul serio.</p>



<p class="wp-block-paragraph">C&#8217;è però un dettaglio che vale tutto il resto dell&#8217;articolo, ed è già visibile qui sopra: l&#8217;intervallo di confidenza del d va da −0,24 a 1,49. Attraversa lo zero. In altri termini, con dodici sole sessioni per gruppo, l&#8217;effetto <em>stimato</em> è medio, ma i dati non bastano a escludere che quello <em>vero</em> sia nullo. E infatti, se sottoponiamo gli stessi numeri a un t-test, troviamo un p-value tutt&#8217;altro che rassicurante:</p>



<pre class="wp-block-code"><code>t.test(B, A)
#
# 	Welch Two Sample t-test
# t = 1.5321, df = 21.9, p-value = 0.1398</code></pre>



<p class="wp-block-paragraph">Un effetto medio che il test dichiara <em>non</em> significativo. Non è una contraddizione: è esattamente il fenomeno che la potenza di un test serve a spiegare. Teniamolo a mente, ci torniamo tra poco.</p>



<h2 class="wp-block-heading">L&#8217;effect size per le proporzioni (CTR e conversioni)</h2>



<p class="wp-block-paragraph">Il tempo sulla pagina è una media, ma il pane quotidiano di chi fa SEO sono le proporzioni: CTR, tasso di conversione, percentuale di rimbalzo. Qui il Cohen&#8217;s d non si applica direttamente, e la misura naturale di effect size è il <strong>Cohen&#8217;s h</strong>, costruito apposta per la differenza tra due proporzioni.</p>



<p class="wp-block-paragraph">Il dettaglio tecnico che lo rende affidabile è una trasformazione — l&#8217;arcoseno della radice della proporzione — che serve a stabilizzare la variabilità (in una proporzione, la variabilità dipende dal valore stesso, ed è massima attorno al 50%). La formula è:</p>



\( h = 2\arcsin\sqrt{p_2} &#8211; 2\arcsin\sqrt{p_1} \\ \)



<p class="wp-block-paragraph">dove <em>p</em><sub>1</sub> e <em>p</em><sub>2</sub> sono le due proporzioni a confronto. Non serve calcolarla a mano: ce la fornisce la funzione <code>ES.h</code> del pacchetto <code>pwr</code>. Ma prima di vederla all&#8217;opera conviene introdurre l&#8217;altra metà del discorso, perché è lì che il Cohen&#8217;s h dà il meglio di sé.</p>



<p class="wp-block-paragraph">Prima però chiudiamo il capitolo effect size con un cenno onesto alle altre misure. Quando i gruppi a confronto sono più di due — il classico scenario dell&#8217;ANOVA — la misura tipica è l&#8217;<strong>eta quadro</strong> (η²), che dice quale frazione della variabilità totale è spiegata dal fattore che stiamo studiando; ne abbiamo gettato le basi parlando di <a href="https://www.gironi.it/blog/lanalisi-della-varianza-anova-spiegata-semplice/">analisi della varianza</a>. Quando invece il risultato è binario — converte / non converte — l&#8217;effect size si esprime spesso come <strong>odds ratio</strong>, il rapporto tra le quote di successo, lo stesso oggetto che governa la <a href="https://www.gironi.it/blog/la-regressione-logistica/">regressione logistica</a>. Strumenti diversi per domande diverse, ma l&#8217;idea di fondo non cambia: mettere un numero sulla grandezza, non solo sull&#8217;esistenza.</p>



<h2 class="wp-block-heading">La potenza di un test: avremmo potuto vederlo?</h2>



<p class="wp-block-paragraph">Torniamo al nostro effetto medio dichiarato non significativo. Come è possibile che un d di 0,63 produca un p-value di 0,14? La risposta sta in un concetto che chiude il cerchio dell&#8217;inferenza: la <strong>potenza</strong> di un test.</p>



<p class="wp-block-paragraph">Quando facciamo un test delle ipotesi rischiamo due tipi di errore. Il primo, l&#8217;errore di tipo I, è gridare a un effetto che non c&#8217;è: lo teniamo sotto controllo con la soglia α (di solito 0,05). Il secondo, l&#8217;errore di tipo II, è il suo opposto ed è molto più subdolo: <em>non vedere</em> un effetto che invece c&#8217;è. La probabilità di commetterlo si indica con β, e la <strong>potenza</strong> è il suo complemento:</p>



\( \text{potenza} = 1 &#8211; \beta \\ \)



<p class="wp-block-paragraph">Detto in termini più chiari e diretti, la potenza è la probabilità di accorgersi di un effetto reale quando c&#8217;è davvero. Una potenza di 0,80 — lo standard a cui si punta — significa che, se l&#8217;effetto esiste delle dimensioni ipotizzate, il nostro test lo individua quattro volte su cinque.</p>



<p class="wp-block-paragraph">Il punto cruciale è che potenza, soglia α, effect size e dimensione del campione non sono quattro manopole indipendenti: sono <strong>legate da un vincolo</strong>. Fissati tre di questi valori, il quarto è determinato. Questa è l&#8217;intera idea della power analysis, ed è ciò che la rende così utile: a seconda di quale incognita lasciamo libera, risponde a due domande operative diverse.</p>



<p class="wp-block-paragraph">Ed ecco perché il nostro effetto medio è rimasto invisibile. Con dodici sessioni per gruppo la potenza del test era bassissima: il test era, semplicemente, <em>cieco</em>. Un risultato non significativo, in queste condizioni, non dice &#8220;l&#8217;effetto non c&#8217;è&#8221;; dice &#8220;non avevo occhi abbastanza buoni per vederlo&#8221;. Confondere le due cose è uno degli errori più costosi che si possano fare leggendo un A/B test.</p>



<h2 class="wp-block-heading">Power analysis in R: quanti dati servono</h2>



<p class="wp-block-paragraph">La prima domanda che la power analysis sa risolvere è quella che ogni test dovrebbe affrontare <em>prima</em> di partire: quanti dati mi servono? Riprendiamo il nostro effetto medio. Se volessimo progettare un test capace di rilevare un d di 0,63 con potenza 0,80 e soglia 0,05, calcolo in R con il pacchetto <code>pwr</code>:</p>



<pre class="wp-block-code"><code>library(pwr)
pwr.t.test(d = 0.63, sig.level = 0.05, power = 0.80, type = "two.sample")
#
#      Two-sample t test power calculation
#               n = 40.53396
#               d = 0.63
#       sig.level = 0.05
#           power = 0.8
#     alternative = two.sided
# NOTE: n is number in *each* group</code></pre>



<p class="wp-block-paragraph">Servirebbero circa <strong>41 sessioni per gruppo</strong>, non dodici. Ecco perché il nostro test era muto: stava cercando un effetto medio con un terzo dei dati necessari. La power analysis, fatta <em>a monte</em>, ci avrebbe risparmiato un test inconcludente — ed è esattamente il ragionamento che alimenta il <a href="https://www.gironi.it/blog/calcolatore-sample-size-ab-test/">calcolatore di sample size</a>: dimensione del campione e potenza sono le due facce della stessa medaglia.</p>



<p class="wp-block-paragraph">La seconda domanda è speculare e si pone <em>a posteriori</em>, quando il test l&#8217;abbiamo già fatto: con i dati che avevo, quanta potenza avevo davvero? Lo vediamo meglio su un caso concreto.</p>



<h2 class="wp-block-heading">Un caso pratico: l&#8217;A/B test che &#8220;non ha funzionato&#8221;</h2>



<p class="wp-block-paragraph">Mettiamo di aver testato due landing page. La A ha convertito 60 visitatori su 1.500 (4,0%), la B ne ha convertiti 78 su 1.500 (5,2%). A occhio la B sembra nettamente migliore — un punto e due decimi di conversione in più non è poco. Verifichiamo in R se la differenza regge:</p>



<pre class="wp-block-code"><code>prop.test(c(60, 78), c(1500, 1500), correct = FALSE)
#
# 	2-sample test for equality of proportions
# X-squared = 2.461, df = 1, p-value = 0.1167</code></pre>



<p class="wp-block-paragraph">Il p-value è 0,117: sopra lo 0,05. Verdetto da manuale: differenza non significativa, test fallito, si archivia. Ma noi adesso sappiamo di non fermarci qui. Calcoliamo la potenza che quel test aveva davvero, partendo dall&#8217;effect size osservato:</p>



<pre class="wp-block-code"><code>library(pwr)
h &lt;- ES.h(0.052, 0.040)   # Cohen's h tra le due proporzioni
h
# [1] 0.0574024

pwr.2p.test(h = h, n = 1500, sig.level = 0.05)
#               power = 0.3492384</code></pre>



<p class="wp-block-paragraph">La potenza era <strong>0,35</strong>. In altri termini: anche se la B fosse stata davvero migliore di quel tanto, avevamo poco più di una probabilità su tre di accorgercene. Il test non ha &#8220;dimostrato che le due pagine sono uguali&#8221;: era semplicemente troppo debole per pronunciarsi. E quanti dati sarebbero serviti per arrivare a una potenza decente?</p>



<pre class="wp-block-code"><code>pwr.2p.test(h = h, power = 0.80, sig.level = 0.05)
#               n = 4764.053</code></pre>



<p class="wp-block-paragraph">Quasi <strong>4.800 visitatori per variante</strong>, contro i 1.500 che avevamo. La differenza tra un test che &#8220;non ha funzionato&#8221; e un test mai realmente in condizione di funzionare è tutta qui — e si vede solo se all&#8217;effect size affianchiamo la potenza. <strong>Attenzione</strong> dunque a derubricare un risultato non significativo a &#8220;nessun effetto&#8221;: quasi sempre stiamo solo guardando un test sottodimensionato.</p>



<h2 class="wp-block-heading">Prova tu</h2>



<p class="wp-block-paragraph">Per fissare il meccanismo, ecco un esercizio con dati verosimili. Stiamo progettando un A/B test su un modulo di contatto. Il tasso di conversione attuale (baseline) è il <strong>2,5%</strong>, e considereremmo un successo portarlo al <strong>3,0%</strong>: mezzo punto di miglioramento. Vogliamo un test con potenza 0,80 e soglia 0,05.</p>



<p class="wp-block-paragraph">Il compito: calcolare l&#8217;effect size con <code>ES.h(0.030, 0.025)</code>, passarlo a <code>pwr.2p.test</code> fissando <code>power = 0.80</code>, e leggere quanti visitatori per variante servono. Poi, come controprova, calcolare la potenza che avremmo se ci fermassimo a 3.000 visitatori per variante con <code>pwr.2p.test(h = ..., n = 3000, ...)</code>.</p>



<p class="wp-block-paragraph">Per controllare i conti: l&#8217;effect size è <em>h</em> = 0,031, servono circa <strong>16.759 visitatori per variante</strong> per avere una potenza dello 0,80, e con soli 3.000 la potenza crollerebbe a <strong>0,22</strong>. La morale è quella che ormai conosciamo: più l&#8217;effetto che cerchiamo è piccolo, più dati servono per vederlo: dimezzare la differenza minima rilevabile non raddoppia il campione necessario, lo quadruplica.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph">Effect size e potenza completano la triade che il p-value, da solo, lasciava monca: non più soltanto <em>l&#8217;effetto esiste?</em>, ma anche <em>quanto è grande?</em> e <em>avrei potuto vederlo?</em>. Sono le tre domande che trasformano un test da rito propiziatorio in uno strumento di decisione. E tutte e tre, a ben guardare, dipendono da una scelta che viene <em>prima</em> del test: quanti dati raccogliere, e come. È il terreno del disegno sperimentale e del <a href="https://www.gironi.it/blog/campionamento-e-dimensione-campionaria-quanti-dati-servono/">campionamento</a> — il punto in cui la statistica smette di limitarsi a giudicare i numeri che le mettiamo davanti e comincia a dirci quali numeri andare a cercare.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">Per approfondire</h3>



<p class="wp-block-paragraph">Sull&#8217;uso rigoroso di effect size, potenza e dimensionamento nel contesto degli esperimenti online, il riferimento più completo resta <a href="https://www.amazon.it/dp/1108724264?tag=consulenzeinf-21&#038;ascsubtag=effect-size-e-power-analysis" rel="nofollow sponsored noopener" target="_blank"><em>Trustworthy Online Controlled Experiments</em></a> di Ron Kohavi, Diane Tang e Ya Xu: i capitoli su come dimensionare un test e interpretarne i risultati valgono da soli l&#8217;acquisto. Per i fondamenti statistici alle spalle di questi concetti — errori di tipo I e II, potenza, inferenza — un buon manuale italiano di riferimento è <a href="https://www.amazon.it/dp/8891910651?tag=consulenzeinf-21&#038;ascsubtag=effect-size-e-power-analysis" rel="nofollow sponsored noopener" target="_blank"><em>Statistica</em></a> di Newbold, Carlson e Thorne.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.gironi.it/blog/effect-size-e-power-analysis/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Calcolatore di Significatività per A/B Test</title>
		<link>https://www.gironi.it/blog/calcolatore-significativita-ab-test/</link>
					<comments>https://www.gironi.it/blog/calcolatore-significativita-ab-test/#respond</comments>
		
		<dc:creator><![CDATA[Paolo Gironi]]></dc:creator>
		<pubDate>Fri, 12 Jun 2026 19:48:12 +0000</pubDate>
				<category><![CDATA[statistica]]></category>
		<guid isPermaLink="false">https://www.gironi.it/blog/?p=3678</guid>

					<description><![CDATA[Il nostro A/B test è arrivato alla fine: la variante B mostra un tasso di conversione più alto della variante A. La tentazione di dichiarare il vincitore e implementare la modifica è forte. Ma prima c&#8217;è una domanda a cui rispondere, ed è la stessa che attraversa tutto il nostro percorso: la differenza che osserviamo &#8230; <a href="https://www.gironi.it/blog/calcolatore-significativita-ab-test/" class="more-link">Leggi tutto<span class="screen-reader-text"> "Calcolatore di Significatività per A/B Test"</span></a>]]></description>
										<content:encoded><![CDATA[<p>Il nostro A/B test è arrivato alla fine: la variante B mostra un tasso di conversione più alto della variante A. La tentazione di dichiarare il vincitore e implementare la modifica è forte. Ma prima c&#8217;è una domanda a cui rispondere, ed è la stessa che attraversa tutto il nostro percorso: <strong>la differenza che osserviamo è un segnale reale o solo rumore statistico?</strong></p>
<p>Questo calcolatore è il complemento naturale del <a href="https://www.gironi.it/blog/calcolatore-sample-size-ab-test/">calcolatore di sample size</a>: quello lavora <em>prima</em> del test e ci dice quanti utenti servono; questo lavora <em>dopo</em> e ci dice se il risultato ottenuto è statisticamente significativo. Chi ha letto l&#8217;articolo sul <a href="https://www.gironi.it/blog/il-test-delle-ipotesi/">test delle ipotesi</a> riconoscerà subito il meccanismo: dietro le quinte c&#8217;è un test z per il confronto tra due proporzioni.</p>
<p><span id="more-3678"></span></p>
<p>L&#8217;uso è immediato: inseriamo visitatori e conversioni delle due varianti, scegliamo il livello di significatività, e il calcolatore restituisce p-value, verdetto e intervallo di confidenza della differenza.</p>
<div style="border: 1px solid #ccc;padding: 1.2em 1.5em;margin: 1.5em 0;border-radius: 6px">
<h3 style="margin-top: 0">Indice</h3>
<ul>
<li><a href="#calcolatore">Il calcolatore</a></li>
<li><a href="#formula">La formula: come funziona il calcolo</a></li>
<li><a href="#verifica-r">Verifichiamo in R</a></li>
<li><a href="#interpretare">Come interpretare il risultato (senza farsi ingannare)</a></li>
<li><a href="#approfondimenti">Approfondimenti</a></li>
</ul>
</div>
<hr />
<h2 id="calcolatore">Il calcolatore</h2>
<p>I valori precaricati sono quelli dell&#8217;esempio che svolgeremo passo passo più sotto: possiamo sostituirli con i numeri del nostro test.</p>
<style>
.sg-calc{max-width:620px;margin:2em auto;padding:1.5em 2em;background:#f8f8f8;border:1px solid #ddd;border-radius:8px;font-family:inherit}
.sg-calc h3{margin:0 0 1em;color:#333;font-size:1.2em}
.sg-calc fieldset{border:1px solid #ddd;border-radius:6px;margin:0 0 1em;padding:0.6em 1em 1em;background:#fff}
.sg-calc legend{font-weight:700;font-size:0.95em;color:#333;padding:0 0.4em}
.sg-calc label{display:block;margin:0.6em 0 0.3em;font-weight:600;color:#333;font-size:0.9em}
.sg-calc input[type=number],.sg-calc select{width:100%;padding:8px 10px;border:1px solid #ccc;border-radius:4px;font-size:1em;box-sizing:border-box;background:#fff}
.sg-calc input[type=number]:focus,.sg-calc select:focus{outline:none;border-color:#0073aa;box-shadow:0 0 0 2px rgba(0,115,170,0.15)}
.sg-calc .sg-row{display:flex;gap:1.2em}
.sg-calc .sg-col{flex:1}
.sg-calc .sg-result{margin-top:1.5em;padding:1.2em;background:#fff;border:2px solid #ccc;border-radius:6px;text-align:center}
.sg-calc .sg-result.sg-si{border-color:#2ecc71}
.sg-calc .sg-result.sg-no{border-color:#e67e22}
.sg-calc .sg-verdict{font-size:1.25em;font-weight:700;display:block;margin:0.2em 0;color:#333}
.sg-calc .sg-si .sg-verdict{color:#2ecc71}
.sg-calc .sg-no .sg-verdict{color:#e67e22}
.sg-calc .sg-pvalue{font-size:1.05em;color:#333;margin-top:0.4em}
.sg-calc .sg-detail{font-size:0.9em;color:#666;margin-top:0.6em;line-height:1.6}
.sg-calc .sg-warn{color:#e74c3c;font-size:0.85em;margin-top:0.5em;display:none}
@media(max-width:520px){.sg-calc .sg-row{flex-direction:column;gap:0}.sg-calc{padding:1em 1.2em}}
</style>
<div class="sg-calc" id="sgCalc">
<h3>Calcolatore di significatività</h3>
<div class="sg-row">
<div class="sg-col">
<fieldset>
<legend>Variante A (controllo)</legend>
<p><label for="sgNA">Visitatori</label><br />
<input type="number" id="sgNA" value="8500" min="1" step="1"><br />
<label for="sgCA">Conversioni</label><br />
<input type="number" id="sgCA" value="204" min="0" step="1"><br />
</fieldset>
</div>
<div class="sg-col">
<fieldset>
<legend>Variante B</legend>
<p><label for="sgNB">Visitatori</label><br />
<input type="number" id="sgNB" value="8300" min="1" step="1"><br />
<label for="sgCB">Conversioni</label><br />
<input type="number" id="sgCB" value="251" min="0" step="1"><br />
</fieldset>
</div>
</div>
<p><label for="sgAlpha">Significatività (α)</label><br />
<select id="sgAlpha"><option value="0.01">0.01 (99%)</option><option value="0.05" selected>0.05 (95%)</option><option value="0.10">0.10 (90%)</option></select></p>
<div class="sg-result" id="sgResult">
<span class="sg-verdict" id="sgVerdict">—</span></p>
<div class="sg-pvalue" id="sgPvalue"></div>
<div class="sg-detail" id="sgDetail"></div>
</div>
<div class="sg-warn" id="sgWarn"></div>
</div>
<p><script>
(function(){
function normCdf(z) {
	const x = Math.abs(z) / Math.SQRT2;
	const t = 1 / (1 + 0.3275911 * x);
	const erf = 1 - (((((1.061405429 * t - 1.453152027) * t) + 1.421413741) * t - 0.284496736) * t + 0.254829592) * t * Math.exp(-x * x);
	const phi = 0.5 * (1 + erf);
	return z >= 0 ? phi : 1 - phi;
}
const Z975 = 1.959964; // qnorm(0.975), per l'IC al 95% come prop.test
function testSignificativita(nA, cA, nB, cB) {
	const interi = [nA, cA, nB, cB];
	if (interi.some(v => !Number.isFinite(v) || v < 0) || nA === 0 || nB === 0 || cA > nA || cB > nB) {
		return { valido: false, avvisi: [] };
	}
	const pA = cA / nA;
	const pB = cB / nB;
	const diff = pB - pA;
	const pooled = (cA + cB) / (nA + nB);
	const sePooled = Math.sqrt(pooled * (1 - pooled) * (1 / nA + 1 / nB));
	const z = sePooled > 0 ? diff / sePooled : 0;
	const pValue = sePooled > 0 ? 2 * (1 - normCdf(Math.abs(z))) : 1;
	const seDiff = Math.sqrt(pA * (1 - pA) / nA + pB * (1 - pB) / nB);
	const avvisi = [];
	for (const [c, n, nome] of [[cA, nA, 'A'], [cB, nB, 'B']]) {
		if (c < 5 || n - c < 5) {
			avvisi.push(`La variante ${nome} ha meno di 5 conversioni (o non-conversioni): l'approssimazione normale è poco affidabile con numeri così piccoli.`);
		}
	}
	return {
		valido: true,
		pA, pB, diff,
		lift: pA > 0 ? diff / pA : null,
		z, pValue,
		ciLow: diff - Z975 * seDiff,
		ciHigh: diff + Z975 * seDiff,
		significativo: (alpha) => pValue < alpha,
		avvisi,
	};
}
  var SG_LABELS = {
    sigYes: 'Differenza statisticamente significativa al %CONF%',
    sigNo: 'Differenza non significativa al %CONF%',
    lift: 'lift relativo',
    ci: 'IC 95% della differenza:',
    pp: 'punti percentuali',
    invalid: 'Controlliamo i dati: le conversioni non possono superare i visitatori.',
    warnSmall: 'Attenzione: una variante ha meno di 5 conversioni (o non-conversioni): con numeri cos\u00ec piccoli l\u2019approssimazione normale \u00e8 poco affidabile.'
  };
  var L = SG_LABELS;
  function fmtP(p){ return p < 0.0001 ? '&lt; 0.0001' : p.toFixed(4); }
  function calc(){
    var nA=parseInt(document.getElementById('sgNA').value,10);
    var cA=parseInt(document.getElementById('sgCA').value,10);
    var nB=parseInt(document.getElementById('sgNB').value,10);
    var cB=parseInt(document.getElementById('sgCB').value,10);
    var alpha=parseFloat(document.getElementById('sgAlpha').value);
    var conf=Math.round((1-alpha)*100)+'%';
    var box=document.getElementById('sgResult');
    var warn=document.getElementById('sgWarn');
    warn.style.display='none'; warn.textContent='';
    var r=testSignificativita(nA,cA,nB,cB);
    if(!r.valido){
      box.className='sg-result';
      document.getElementById('sgVerdict').innerHTML='&mdash;';
      document.getElementById('sgPvalue').textContent='';
      document.getElementById('sgDetail').innerHTML=L.invalid;
      return;
    }
    var sig=r.significativo(alpha);
    box.className='sg-result '+(sig?'sg-si':'sg-no');
    document.getElementById('sgVerdict').textContent=(sig?L.sigYes:L.sigNo).replace('%CONF%',conf);
    document.getElementById('sgPvalue').innerHTML='p-value: <strong>'+fmtP(r.pValue)+'</strong> &nbsp;&middot;&nbsp; z = '+r.z.toFixed(3);
    var liftTxt=r.lift===null?'&mdash;':(r.lift>=0?'+':'')+(r.lift*100).toFixed(1)+'%';
    document.getElementById('sgDetail').innerHTML=
      'CR A: <strong>'+(r.pA*100).toFixed(2)+'%</strong> &nbsp;&middot;&nbsp; CR B: <strong>'+(r.pB*100).toFixed(2)+'%</strong> &nbsp;&middot;&nbsp; '+L.lift+': <strong>'+liftTxt+'</strong><br />'+
      L.ci+' [' + (r.ciLow*100).toFixed(2) + '; ' + (r.ciHigh*100).toFixed(2) + '] ' + L.pp;
    if(r.avvisi.length){
      warn.textContent=L.warnSmall;
      warn.style.display='block';
    }
  }
  ['sgNA','sgCA','sgNB','sgCB','sgAlpha'].forEach(function(id){
    document.getElementById(id).addEventListener('input',calc);
    document.getElementById(id).addEventListener('change',calc);
  });
  calc();
})();
</script></p>
<hr />
<h2 id="formula">La formula: come funziona il calcolo</h2>
<p>Il ragionamento è quello classico del test delle ipotesi. Partiamo dall&#8217;<strong>ipotesi nulla</strong>: le due varianti convertono allo stesso modo, e la differenza osservata è frutto del caso. Poi misuriamo quanto questa differenza è &#8220;sorprendente&#8221; se l&#8217;ipotesi nulla fosse vera: se è troppo sorprendente, l&#8217;ipotesi nulla non regge.</p>
<p>I protagonisti sono tre:</p>
<ul>
<li><strong>p&#770;<sub>A</sub></strong> e <strong>p&#770;<sub>B</sub></strong>: i tassi di conversione osservati delle due varianti (conversioni diviso visitatori).</li>
<li><strong>p&#770;</strong>: la proporzione <em>pooled</em>, cioè il tasso di conversione complessivo calcolato mettendo insieme i dati delle due varianti. Perché? Sotto l&#8217;ipotesi nulla le due proporzioni coincidono, e la stima migliore di quell&#8217;unica proporzione usa tutti i dati disponibili.</li>
<li><strong>n<sub>A</sub></strong> e <strong>n<sub>B</sub></strong>: i visitatori delle due varianti.</li>
</ul>
<p>La statistica del test misura la differenza osservata in unità di errore standard:</p>
<p>\( z = \frac{\hat{p}_B &#8211; \hat{p}_A}{\sqrt{\hat{p}(1-\hat{p})\left(\frac{1}{n_A} + \frac{1}{n_B}\right)}} \)</p>
<p>Il denominatore è l&#8217;<strong>errore standard della differenza</strong>: ci dice di quanto oscillerebbe la differenza tra i due tassi se ripetessimo il test molte volte, in un mondo dove le varianti sono identiche. Lo z risultante si legge sulla distribuzione normale: il <strong>p-value</strong> è la probabilità di osservare una differenza almeno così estrema, in un verso o nell&#8217;altro, per puro caso. &#8220;In un verso o nell&#8217;altro&#8221; non è un dettaglio: il test è <strong>a due code</strong>, perché prima di guardare i dati non sappiamo se B farà meglio o peggio di A.</p>
<p>Per orientarsi, i valori di riferimento sono sempre gli stessi:</p>
<ul>
<li>|z| &gt; 1.645 &rarr; significativo al 90%</li>
<li>|z| &gt; 1.96 &rarr; significativo al 95%</li>
<li>|z| &gt; 2.576 &rarr; significativo al 99%</li>
</ul>
<p><strong>Facciamo un esempio</strong>, con i numeri precaricati nel calcolatore. La variante A ha ricevuto 8.500 visitatori e 204 conversioni; la variante B 8.300 visitatori e 251 conversioni:</p>
<ul>
<li>p&#770;<sub>A</sub> = 204 / 8.500 = 0.0240 (2.40%)</li>
<li>p&#770;<sub>B</sub> = 251 / 8.300 = 0.0302 (3.02%) &mdash; un lift relativo del +26%</li>
<li>p&#770; pooled = (204 + 251) / (8.500 + 8.300) = 455 / 16.800 = 0.0271</li>
<li>errore standard = &radic;[0.0271 &times; 0.9729 &times; (1/8.500 + 1/8.300)] = 0.00250</li>
<li>z = (0.0302 &minus; 0.0240) / 0.00250 = <strong>2.49</strong></li>
</ul>
<p>Dunque: z = 2.49 supera la soglia 1.96 e il p-value vale 0.0127. La differenza è <strong>significativa al 95%</strong> &mdash; ma, come si vede, non al 99% (0.0127 &gt; 0.01). Lo stesso risultato, due verdetti diversi a seconda del rigore che abbiamo scelto: il livello di significatività va deciso <em>prima</em> di guardare i dati, non dopo.</p>
<hr />
<h2 id="verifica-r">Verifichiamo in R</h2>
<p>Verifico il calcolo in R con <code>prop.test</code>, disattivando la correzione di continuità per restare allineati al calcolo manuale:</p>
<pre>prop.test(c(251, 204), c(8300, 8500), correct = FALSE)

	2-sample test for equality of proportions
	without continuity correction

data:  c(251, 204) out of c(8300, 8500)
X-squared = 6.2075, df = 1, p-value = 0.01272
alternative hypothesis: two.sided
95 percent confidence interval:
 0.001325762 0.011156166
sample estimates:
    prop 1     prop 2
0.03024096 0.02400000</pre>
<p>I conti tornano: il p-value è lo stesso del calcolo manuale, e la statistica X-squared non è altro che il nostro z al quadrato (2.49&sup2; &asymp; 6.21 &mdash; il test chi quadrato su una tabella 2&times;2 e il test z su due proporzioni sono lo stesso test, come avevamo visto nell&#8217;articolo sul <a href="https://www.gironi.it/blog/il-test-del-chi-quadrato/">chi quadrato</a>). In più, R ci regala l&#8217;<strong>intervallo di confidenza della differenza</strong>: tra 0.13 e 1.12 punti percentuali. È l&#8217;informazione più preziosa di tutte, e vediamo subito perché.</p>
<hr />
<h2 id="interpretare">Come interpretare il risultato (senza farsi ingannare)</h2>
<p><strong>Significativo non vuol dire importante.</strong> Va sempre tenuto bene a mente: con campioni molto grandi, anche differenze irrisorie e commercialmente irrilevanti diventano statisticamente significative. La significatività ci dice che la differenza non è frutto del caso, non che sia <em>grande</em>. Per capire quanto è grande, guardiamo l&#8217;intervallo di confidenza della differenza: nel nostro esempio va da +0.13 a +1.12 punti percentuali. Se anche il limite inferiore giustifica lo sforzo di implementare la modifica, possiamo procedere con fiducia; se l&#8217;intervallo include valori trascurabili, il verdetto &#8220;significativo&#8221; da solo non basta.</p>
<p><strong>Il p-value vale se il test si ferma quando deciso.</strong> Il calcolo presuppone che la dimensione campionaria sia stata fissata in anticipo (con il <a href="https://www.gironi.it/blog/calcolatore-sample-size-ab-test/">calcolatore di sample size</a>) e che il test si fermi lì. Controllare i risultati ogni giorno e fermarsi al primo p-value sotto 0.05 &mdash; il famigerato <em>peeking</em>, come dicono gli anglosassoni &mdash; gonfia drasticamente i falsi positivi: è come lanciare una moneta finché non escono tre teste di fila e dichiarare la moneta truccata. Ne abbiamo parlato nella <a href="https://www.gironi.it/blog/guida-ai-test-statistici-per-analisi-a-b/">guida ai test statistici per le analisi A/B</a>.</p>
<p><strong>n.b.</strong>: il calcolatore usa un test a due code, la scelta prudente e standard. Esistono versioni a una coda che &#8220;premiano&#8221; l&#8217;ipotesi direzionale con p-value dimezzati, ma vanno usate solo quando la direzione dell&#8217;effetto è davvero nota a priori &mdash; nella pratica quotidiana degli A/B test, quasi mai.</p>
<hr />
<h3 id="approfondimenti">Potrebbe interessarti anche</h3>
<ul>
<li><a href="https://www.gironi.it/blog/calcolatore-sample-size-ab-test/">Calcolatore Sample Size per A/B Test</a></li>
<li><a href="https://www.gironi.it/blog/guida-ai-test-statistici-per-analisi-a-b/">Guida ai test statistici per analisi A/B</a></li>
<li><a href="https://www.gironi.it/blog/il-test-delle-ipotesi/">Il test delle ipotesi</a></li>
</ul>
<hr />
<p>Il p-value risponde a una sola domanda: <em>l&#8217;effetto esiste?</em> Non ci dice quanto è grande, né se vale lo sforzo di implementarlo. Per quello servono altri due strumenti &mdash; l&#8217;<strong>effect size</strong> e la <strong>power analysis</strong> &mdash; ed è esattamente lì che il nostro percorso andrà <a href="https://www.gironi.it/blog/effect-size-e-power-analysis/">nel prossimo articolo</a>.</p>
<hr />
<h3>Per approfondire</h3>
<p>Il riferimento più completo sulla conduzione rigorosa di esperimenti online resta <a href="https://www.amazon.it/dp/1108724264?tag=consulenzeinf-21&#038;ascsubtag=calcolatore-significativita-ab-test" rel="nofollow sponsored noopener" target="_blank"><em>Trustworthy Online Controlled Experiments</em></a> di Ron Kohavi, Diane Tang e Ya Xu: il capitolo sulle insidie dell&#8217;interpretazione dei risultati (peeking incluso) vale da solo il prezzo del libro.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.gironi.it/blog/calcolatore-significativita-ab-test/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>La biblioteca di Statistica e SEO: i libri che consiglio (e perché)</title>
		<link>https://www.gironi.it/blog/biblioteca-statistica-seo/</link>
					<comments>https://www.gironi.it/blog/biblioteca-statistica-seo/#respond</comments>
		
		<dc:creator><![CDATA[Paolo Gironi]]></dc:creator>
		<pubDate>Thu, 11 Jun 2026 08:11:44 +0000</pubDate>
				<category><![CDATA[statistica]]></category>
		<category><![CDATA[seo]]></category>
		<guid isPermaLink="false">https://www.gironi.it/blog/?p=3638</guid>

					<description><![CDATA[C&#8217;è una domanda che torna, puntuale, ogni volta che pubblico un articolo di questo percorso: «ma per studiare queste cose, che libro consigli?». Finora ho risposto un pezzo alla volta, nella sezione &#8220;Per approfondire&#8221; che chiude ogni articolo. Qui faccio l&#8217;operazione inversa: raccolgo tutta la biblioteca in una pagina sola, con il motivo per cui &#8230; <a href="https://www.gironi.it/blog/biblioteca-statistica-seo/" class="more-link">Leggi tutto<span class="screen-reader-text"> "La biblioteca di Statistica e SEO: i libri che consiglio (e perché)"</span></a>]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">C&#8217;è una domanda che torna, puntuale, ogni volta che pubblico un articolo di questo percorso: <em>«ma per studiare queste cose, che libro consigli?»</em>. Finora ho risposto un pezzo alla volta, nella sezione &#8220;Per approfondire&#8221; che chiude ogni articolo. Qui faccio l&#8217;operazione inversa: raccolgo tutta la biblioteca in una pagina sola, con il motivo per cui ogni titolo si è guadagnato il posto.</p>



<p class="wp-block-paragraph">Non è una classifica e non è un catalogo: sono <strong>i libri che uso davvero</strong>, quelli da cui provengono molti degli esempi e delle spiegazioni che trovate negli articoli. Pochi, scelti con un criterio semplice: ogni libro deve far fare un passo avanti concreto a chi lavora con i dati nella SEO e nel marketing, senza richiedere una laurea in matematica.</p>





<span id="more-3638"></span>



<p class="wp-block-paragraph">Una nota di trasparenza, prima di cominciare: i link che seguono sono affiliati Amazon. Se acquistate un libro passando da qui, il blog riceve una piccola commissione, senza alcun costo aggiuntivo per voi: è il modo più indolore che ho trovato per coprire le spese del server.</p>



<h2 class="wp-block-heading">Da dove cominciare</h2>



<h3 class="wp-block-heading">L&#8217;arte della statistica — David Spiegelhalter</h3>



<p class="wp-block-paragraph">Se dovessi salvarne uno solo, sarebbe questo. <a href="https://www.amazon.it/dp/8806246623?tag=consulenzeinf-21&#038;ascsubtag=biblioteca-statistica-seo" rel="nofollow sponsored noopener" target="_blank"><em>L&#8217;arte della statistica</em></a> non insegna le formule: insegna <strong>a ragionare sui dati prima di fidarsene</strong>, che è esattamente la competenza che manca a chi legge un report di Search Console e trae conclusioni affrettate. Spiegelhalter — professore a Cambridge e divulgatore di rara chiarezza — costruisce ogni capitolo attorno a un caso reale: sondaggi sbagliati, statistiche mediche fraintese, il celebre caso delle ammissioni a Berkeley (lo stesso caso che ho raccontato parlando del <a href="https://www.gironi.it/blog/il-paradosso-di-simpson-nella-seo-quando-i-dati-aggregati-possono-mentire/">Paradosso di Simpson</a>).</p>



<p class="wp-block-paragraph">Lo cito praticamente ovunque nel blog: dal <a href="https://www.gironi.it/blog/campionamento-e-dimensione-campionaria-quanti-dati-servono/">campionamento</a> agli <a href="https://www.gironi.it/blog/intervalli-di-confidenza/">intervalli di confidenza</a>, passando per il <a href="https://www.gironi.it/blog/teorema-del-limite-centrale/">Teorema del Limite Centrale</a>. Si legge senza carta e penna, e si rilegge con profitto. (Per chi preferisce l&#8217;originale inglese: <a href="https://www.amazon.it/dp/0241258766?tag=consulenzeinf-21&#038;ascsubtag=biblioteca-statistica-seo" rel="nofollow sponsored noopener" target="_blank"><em>The Art of Statistics</em></a>.)</p>



<h3 class="wp-block-heading">Finalmente ho capito la statistica — Maurizio De Pra</h3>



<p class="wp-block-paragraph">Il titolo dice tutto. <a href="https://www.amazon.it/dp/8867319396?tag=consulenzeinf-21&#038;ascsubtag=biblioteca-statistica-seo" rel="nofollow sponsored noopener" target="_blank"><em>Finalmente ho capito la statistica</em></a> è il libro per chi parte da zero e vuole un percorso graduale, con tanti esempi e un prezzo contenuto. Copre bene il territorio delle <strong>distribuzioni di probabilità</strong> — quelle che nel percorso del blog vanno dalla <a href="https://www.gironi.it/blog/la-distribuzione-di-poisson/">Poisson</a> alla <a href="https://www.gironi.it/blog/la-distribuzione-beta-spiegata-semplice/">Beta</a> — e i fondamenti del <a href="https://www.gironi.it/blog/probabilita-permutazioni-e-combinazioni/">ragionamento probabilistico</a>. Non sostituisce un manuale, ma fa quello che un manuale non sa fare: togliere la paura.</p>



<h2 class="wp-block-heading">Quando i dati mentono</h2>



<h3 class="wp-block-heading">Mentire con le statistiche — Darrell Huff</h3>



<p class="wp-block-paragraph">Scritto nel 1954 e mai invecchiato. <a href="https://www.amazon.it/dp/8889479094?tag=consulenzeinf-21&#038;ascsubtag=biblioteca-statistica-seo" rel="nofollow sponsored noopener" target="_blank"><em>Mentire con le statistiche</em></a> è il catalogo, breve e velenoso, dei trucchi con cui i numeri possono essere usati per ingannare: campioni distorti, medie scelte ad arte, grafici con gli assi tagliati, percentuali senza contesto. Huff scriveva per i lettori dei giornali; io lo consiglio a chi legge i report dei tool SEO e le slide dei fornitori, dove quegli stessi trucchi prosperano ancora oggi. Chi è passato per il <a href="https://www.gironi.it/blog/il-paradosso-di-simpson-nella-seo-quando-i-dati-aggregati-possono-mentire/">Paradosso di Simpson</a> sa già che i dati aggregati possono mentire: Huff completa il quadro con tutti gli altri modi.</p>



<p class="wp-block-paragraph">Si legge in un pomeriggio, e da quel pomeriggio in poi i grafici non si guardano più con gli stessi occhi. (Originale inglese: <a href="https://www.amazon.it/dp/0140213007?tag=consulenzeinf-21&#038;ascsubtag=biblioteca-statistica-seo" rel="nofollow sponsored noopener" target="_blank"><em>How to Lie with Statistics</em></a>.)</p>



<h2 class="wp-block-heading">Il manuale per fare sul serio: l&#8217;inferenza</h2>



<h3 class="wp-block-heading">Statistica — Newbold, Carlson, Thorne</h3>



<p class="wp-block-paragraph">Prima o poi arriva il momento in cui la divulgazione non basta più: servono le condizioni di applicabilità di un test, le formule complete, gli esercizi per verificare di aver capito. <a href="https://www.amazon.it/dp/8891910651?tag=consulenzeinf-21&#038;ascsubtag=biblioteca-statistica-seo" rel="nofollow sponsored noopener" target="_blank"><em>Statistica</em></a> di Newbold, Carlson e Thorne è il manuale universitario di riferimento in italiano per tutta l&#8217;inferenza: <a href="https://www.gironi.it/blog/il-test-delle-ipotesi/">test delle ipotesi</a>, intervalli di confidenza, chi quadrato, ANOVA — in pratica, la spina dorsale teorica della mia <a href="https://www.gironi.it/blog/guida-ai-test-statistici-per-analisi-a-b/">guida ai test statistici per le analisi A/B</a>.</p>



<p class="wp-block-paragraph">Va detto con franchezza: è un manuale universitario, e costa come un manuale universitario. Ma è uno di quei libri che si comprano una volta e si consultano per anni.</p>



<h2 class="wp-block-heading">Regressione, serie storiche, modelli</h2>



<h3 class="wp-block-heading">Introduzione all&#8217;econometria — Stock, Watson</h3>



<p class="wp-block-paragraph">Il nome può intimidire (econometria?), ma il contenuto è esattamente ciò che serve a chi vuole andare oltre la <a href="https://www.gironi.it/blog/regressione-lineare-semplice/">regressione lineare</a> di base: regressione multipla, variabili omesse, diagnostica, <a href="https://www.gironi.it/blog/analisi-delle-serie-storiche0-e-previsioni-di-serie-temporali-in-r-con-il-metodo-holt-winters/">serie storiche</a>. <a href="https://www.amazon.it/dp/8891906190?tag=consulenzeinf-21&#038;ascsubtag=biblioteca-statistica-seo" rel="nofollow sponsored noopener" target="_blank"><em>Introduzione all&#8217;econometria</em></a> di Stock e Watson ha una qualità che nei manuali è rara: l&#8217;attenzione costante all&#8217;<strong>interpretazione</strong> dei risultati, non solo al loro calcolo. Che poi è il punto in cui si gioca la differenza tra un&#8217;analisi utile e un esercizio di stile.</p>



<h2 class="wp-block-heading">L&#8217;arte (fallibile) della previsione</h2>



<h3 class="wp-block-heading">Il segnale e il rumore — Nate Silver</h3>



<p class="wp-block-paragraph">Chi lavora con i dati prima o poi deve fare una previsione — e una stima del traffico organico del prossimo trimestre è una previsione a tutti gli effetti. <a href="https://www.amazon.it/dp/8860443865?tag=consulenzeinf-21&#038;ascsubtag=biblioteca-statistica-seo" rel="nofollow sponsored noopener" target="_blank"><em>Il segnale e il rumore</em></a> racconta perché le previsioni falliscono così spesso: troppa fiducia nei modelli, la tentazione di scambiare il rumore per il segnale, l&#8217;incapacità di ragionare in termini di probabilità. Silver — l&#8217;uomo che azzeccò l&#8217;esito delle presidenziali USA del 2012 in tutti e cinquanta gli stati — attraversa poker, terremoti, meteorologia e finanza, e strada facendo offre la migliore introduzione narrativa al <a href="https://www.gironi.it/blog/statistica-bayesiana/">ragionamento bayesiano</a> che io conosca. È il complemento divulgativo del capitolo sulle <a href="https://www.gironi.it/blog/analisi-delle-serie-storiche0-e-previsioni-di-serie-temporali-in-r-con-il-metodo-holt-winters/">serie storiche</a>: prima si impara a costruire una previsione, poi si impara a diffidarne. (Originale inglese: <a href="https://www.amazon.it/dp/0141975652?tag=consulenzeinf-21&#038;ascsubtag=biblioteca-statistica-seo" rel="nofollow sponsored noopener" target="_blank"><em>The Signal and the Noise</em></a>.)</p>



<h2 class="wp-block-heading">La sperimentazione online</h2>



<h3 class="wp-block-heading">Trustworthy Online Controlled Experiments — Kohavi, Tang, Xu</h3>



<p class="wp-block-paragraph">Sull&#8217;<a href="https://www.gironi.it/blog/ab-testing/">A/B testing</a> non esiste un equivalente italiano, e francamente nemmeno un equivalente inglese: <a href="https://www.amazon.it/dp/1108724264?tag=consulenzeinf-21&#038;ascsubtag=biblioteca-statistica-seo" rel="nofollow sponsored noopener" target="_blank"><em>Trustworthy Online Controlled Experiments</em></a> è <strong>il</strong> libro sull&#8217;argomento, scritto da chi ha guidato la sperimentazione in Microsoft, Google e LinkedIn. Dentro c&#8217;è tutto quello che ho toccato negli articoli — sample size, potenza del test, errori da evitare — più dieci anni di casi reali su cosa va storto negli esperimenti veri. L&#8217;ho usato anche per costruire il mio <a href="https://www.gironi.it/blog/calcolatore-sample-size-ab-test/">calcolatore di sample size</a>. In inglese, ma di lettura scorrevole.</p>



<h2 class="wp-block-heading">Il percorso bayesiano</h2>



<h3 class="wp-block-heading">Bayesian Statistics the Fun Way — Will Kurt</h3>



<p class="wp-block-paragraph">La <a href="https://www.gironi.it/blog/statistica-bayesiana/">statistica bayesiana</a> ha fama di essere ostica, e i suoi manuali fanno di tutto per confermarla. <a href="https://www.amazon.it/dp/1593279566?tag=consulenzeinf-21&#038;ascsubtag=biblioteca-statistica-seo" rel="nofollow sponsored noopener" target="_blank"><em>Bayesian Statistics the Fun Way</em></a> fa il contrario: Will Kurt spiega prior, posterior e aggiornamento bayesiano con esempi presi da Star Wars e dai Lego, e — cosa che apprezzo particolarmente — usa R per la parte computazionale, esattamente come faccio qui. È il libro giusto per capire la logica bayesiana (e il perché della <a href="https://www.gironi.it/blog/la-distribuzione-beta-spiegata-semplice/">distribuzione Beta</a>) prima di affrontare la teoria formale.</p>



<h2 class="wp-block-heading">Verso il machine learning</h2>



<h3 class="wp-block-heading">An Introduction to Statistical Learning — James, Witten, Hastie, Tibshirani</h3>



<p class="wp-block-paragraph">Il classico contemporaneo dell&#8217;apprendimento statistico, noto a tutti come &#8220;ISL&#8221;. <a href="https://www.amazon.it/dp/1461471370?tag=consulenzeinf-21&#038;ascsubtag=biblioteca-statistica-seo" rel="nofollow sponsored noopener" target="_blank"><em>An Introduction to Statistical Learning</em></a> copre con il giusto equilibrio tra intuizione e formalismo gli argomenti della parte più avanzata del percorso: regressione logistica, <a href="https://www.gironi.it/blog/come-usare-gli-alberi-decisionali-per-classificare-i-dati/">alberi decisionali</a>, <a href="https://www.gironi.it/blog/una-introduzione-allanalisi-delle-componenti-principali-pca/">PCA</a>, con laboratori pratici in R. N.b.: gli autori distribuiscono gratuitamente il PDF dal loro sito — la versione cartacea resta per chi, come me, sui libri di studio preferisce scrivere a matita.</p>



<h3 class="wp-block-heading">Introduction to Machine Learning — Ethem Alpaydın</h3>



<p class="wp-block-paragraph">Per chi vuole le fondamenta teoriche del machine learning — quelle che in un corso universitario starebbero prima dei laboratori — <a href="https://www.amazon.it/dp/0262028182?tag=consulenzeinf-21&#038;ascsubtag=biblioteca-statistica-seo" rel="nofollow sponsored noopener" target="_blank"><em>Introduction to Machine Learning</em></a> di Alpaydın è il riferimento che ho citato nella mia <a href="https://www.gironi.it/blog/machine-learning-una-guida-per-i-principianti/">guida introduttiva al ML</a>. Più formale di ISL: da prendere dopo, non al posto di.</p>



<h2 class="wp-block-heading">Il linguaggio di lavoro: R</h2>



<h3 class="wp-block-heading">R for Data Science — Wickham, Çetinkaya-Rundel, Grolemund</h3>



<p class="wp-block-paragraph">C&#8217;era un buco evidente in questo scaffale: il codice R compare in quasi ogni articolo del blog — dal <a href="https://www.gironi.it/blog/il-test-del-chi-quadrato/">test del chi quadrato</a> alle <a href="https://www.gironi.it/blog/analisi-delle-serie-storiche0-e-previsioni-di-serie-temporali-in-r-con-il-metodo-holt-winters/">serie storiche</a> — ma mancava il libro per impararlo. <a href="https://www.amazon.it/dp/1492097403?tag=consulenzeinf-21&#038;ascsubtag=biblioteca-statistica-seo" rel="nofollow sponsored noopener" target="_blank"><em>R for Data Science</em></a> (seconda edizione) colma il buco: Hadley Wickham è l&#8217;autore del tidyverse, l&#8217;ecosistema di pacchetti che ha reso R moderno, e il libro insegna l&#8217;intero flusso di lavoro — importare, pulire, trasformare, visualizzare, comunicare — su dati veri, senza teoria superflua. Anche questo, come ISL, si legge gratuitamente online sul sito degli autori: un motivo in più per non avere scuse.</p>



<h2 class="wp-block-heading">Comunicare i dati</h2>



<h3 class="wp-block-heading">Storytelling with Data — Cole Nussbaumer Knaflic</h3>



<p class="wp-block-paragraph">L&#8217;analisi più rigorosa del mondo vale poco se chi la riceve non la capisce — e nel marketing un&#8217;analisi va quasi sempre raccontata a qualcuno: un cliente, un responsabile, una riunione. <a href="https://www.amazon.it/dp/1119002257?tag=consulenzeinf-21&#038;ascsubtag=biblioteca-statistica-seo" rel="nofollow sponsored noopener" target="_blank"><em>Storytelling with Data</em></a> insegna a trasformare i grafici di default di Excel e Looker Studio in messaggi chiari: scegliere il grafico giusto, eliminare l&#8217;inchiostro che non informa, guidare l&#8217;attenzione dove serve, costruire una narrazione attorno al numero. Di tutto lo scaffale è probabilmente il libro che si ripaga più in fretta: si applica già al prossimo report. (Per chi preferisce l&#8217;italiano: <a href="https://www.amazon.it/dp/8850333846?tag=consulenzeinf-21&#038;ascsubtag=biblioteca-statistica-seo" rel="nofollow sponsored noopener" target="_blank"><em>Data storytelling</em></a>, edizioni Apogeo.)</p>



<h2 class="wp-block-heading">Una lettura di nicchia</h2>



<h3 class="wp-block-heading">Monte Carlo Methods in Financial Engineering — Paul Glasserman</h3>



<p class="wp-block-paragraph">Questo è il libro più specialistico dello scaffale, e lo segnalo per onestà verso chi è arrivato al <a href="https://www.gironi.it/blog/il-metodo-montecarlo/">metodo Monte Carlo</a> e vuole andare fino in fondo: <a href="https://www.amazon.it/dp/1441915753?tag=consulenzeinf-21&#038;ascsubtag=biblioteca-statistica-seo" rel="nofollow sponsored noopener" target="_blank"><em>Monte Carlo Methods in Financial Engineering</em></a> di Glasserman è il riferimento completo sulla simulazione applicata alla finanza. Non è una lettura da ombrellone: è il testo a cui si arriva quando gli altri non bastano più.</p>



<h2 class="wp-block-heading">La biblioteca in uno sguardo</h2>



<p class="wp-block-paragraph">Per orientarsi al volo, ecco lo scaffale completo in forma di tabella:</p>



<figure class="wp-block-table"><table><thead><tr><th>Libro</th><th>Per chi</th><th>Lingua</th></tr></thead><tbody><tr><td><em>L&#8217;arte della statistica</em> — Spiegelhalter</td><td>Tutti: il punto di partenza</td><td>IT (anche EN)</td></tr><tr><td><em>Finalmente ho capito la statistica</em> — De Pra</td><td>Chi parte da zero, distribuzioni</td><td>IT</td></tr><tr><td><em>Mentire con le statistiche</em> — Huff</td><td>Difendersi dai numeri truccati</td><td>IT (anche EN)</td></tr><tr><td><em>Statistica</em> — Newbold, Carlson, Thorne</td><td>Chi vuole il rigore: inferenza e test</td><td>IT</td></tr><tr><td><em>Introduzione all&#8217;econometria</em> — Stock, Watson</td><td>Regressione e serie storiche</td><td>IT</td></tr><tr><td><em>Il segnale e il rumore</em> — Silver</td><td>Capire perché le previsioni falliscono</td><td>IT (anche EN)</td></tr><tr><td><em>Trustworthy Online Controlled Experiments</em> — Kohavi et al.</td><td>A/B testing e sperimentazione</td><td>EN</td></tr><tr><td><em>Bayesian Statistics the Fun Way</em> — Kurt</td><td>Approccio bayesiano, con R</td><td>EN</td></tr><tr><td><em>An Introduction to Statistical Learning</em> — James et al.</td><td>Machine learning pratico, con R</td><td>EN</td></tr><tr><td><em>Introduction to Machine Learning</em> — Alpaydın</td><td>Fondamenta teoriche del ML</td><td>EN</td></tr><tr><td><em>R for Data Science</em> — Wickham et al.</td><td>Imparare R, dal dato grezzo al grafico</td><td>EN</td></tr><tr><td><em>Storytelling with Data</em> — Knaflic</td><td>Comunicare dati e report</td><td>EN (anche IT)</td></tr><tr><td><em>Monte Carlo Methods in Financial Engineering</em> — Glasserman</td><td>Simulazione avanzata</td><td>EN</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">Questo scaffale non è chiuso. Man mano che il percorso del blog si allarga — i paradossi statistici di cui ho cominciato a parlare, il bootstrap, l&#8217;analisi dei testi — si allargherà anche la biblioteca, e questa pagina verrà aggiornata di conseguenza. Nel frattempo, se un solo consiglio dovesse bastare: si parta da Spiegelhalter, e gli articoli di questo blog facciano da palestra.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.gironi.it/blog/biblioteca-statistica-seo/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Il Paradosso di Simpson nella SEO: quando i dati aggregati possono mentire</title>
		<link>https://www.gironi.it/blog/il-paradosso-di-simpson-nella-seo-quando-i-dati-aggregati-possono-mentire/</link>
					<comments>https://www.gironi.it/blog/il-paradosso-di-simpson-nella-seo-quando-i-dati-aggregati-possono-mentire/#respond</comments>
		
		<dc:creator><![CDATA[Paolo Gironi]]></dc:creator>
		<pubDate>Wed, 27 May 2026 12:38:52 +0000</pubDate>
				<category><![CDATA[seo]]></category>
		<category><![CDATA[statistica]]></category>
		<guid isPermaLink="false">https://www.gironi.it/blog/?p=3569</guid>

					<description><![CDATA[È l&#8217;ultimo giorno del mese. Stiamo preparando il report SEO per il cliente principale. Apriamo Google Search Console, impostiamo il confronto mese su mese e un brivido ci corre lungo la schiena: il CTR organico globale del sito è crollato dal 4,5% al 3,5%. Prima di scrivere l&#8217;email con le cattive notizie e prepararci a &#8230; <a href="https://www.gironi.it/blog/il-paradosso-di-simpson-nella-seo-quando-i-dati-aggregati-possono-mentire/" class="more-link">Leggi tutto<span class="screen-reader-text"> "Il Paradosso di Simpson nella SEO: quando i dati aggregati possono mentire"</span></a>]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">È l&#8217;ultimo giorno del mese. Stiamo preparando il report SEO per il cliente principale. Apriamo Google Search Console, impostiamo il confronto mese su mese e un brivido ci corre lungo la schiena: <strong>il CTR organico globale del sito è crollato dal 4,5% al 3,5%</strong>.</p>



<p class="wp-block-paragraph">Prima di scrivere l&#8217;email con le cattive notizie e prepararci a giustificare il calo, facciamo la cosa giusta: disaggreghiamo i dati per capire <strong>dove</strong> stiamo perdendo colpi. Guardiamo le performance per dispositivo e scopriamo una cosa apparentemente impossibile:</p>



<ul class="wp-block-list">
<li>Il CTR su <strong>Desktop</strong> è salito dal 5,0% al 5,5%.</li>



<li>Il CTR su <strong>Mobile</strong> è salito dal 2,0% al 2,5%.</li>
</ul>



<p class="wp-block-paragraph">Fissiamo lo schermo. Com&#8217;è matematicamente possibile che le performance siano migliorate ovunque, ma il totale generale sia crollato di un punto percentuale netto?</p>



<span id="more-3569"></span>



<p class="wp-block-paragraph">Non abbiamo rotto Google Search Console e non abbiamo dimenticato la matematica delle elementari. Siamo semplicemente appena diventati vittime del <strong>Paradosso di Simpson</strong>.</p>



<h2 class="wp-block-heading">Cos&#8217;è il Paradosso di Simpson</h2>



<p class="wp-block-paragraph">Il Paradosso di Simpson è un fenomeno statistico in cui un trend che appare evidente all&#8217;interno di diversi gruppi di dati scompare — o addirittura si inverte — quando i gruppi vengono combinati in un unico totale.</p>



<p class="wp-block-paragraph">Nella pratica quotidiana della SEO e del marketing questo accade quasi sempre per colpa di una <strong>variabile confondente</strong> nascosta (come dicono gli anglosassoni, una <em>confounding variable</em>): nel nostro caso, <strong>il peso relativo dei segmenti che stiamo analizzando</strong>. È lo stesso ragionamento che incontriamo parlando di <a href="https://www.gironi.it/blog/tabelle-di-contingenza-e-probabilita-condizionata/">probabilità condizionata</a>, dove ciò che conta non è il dato marginale ma quello condizionato a un sottogruppo.</p>



<p class="wp-block-paragraph">Quando lavoriamo con tassi e percentuali (il CTR, il Conversion Rate, il Bounce Rate), guardare il dato aggregato senza considerare i volumi sottostanti è una delle trappole più insidiose per chi analizza i dati.</p>



<h2 class="wp-block-heading">La dimostrazione: anatomia di un finto crollo</h2>



<p class="wp-block-paragraph">Torniamo al nostro report mensile e mettiamo i numeri assoluti dietro a quelle percentuali. Solo così capiamo cosa è successo davvero tra il Mese 1 e il Mese 2.</p>



<figure class="wp-block-table"><table><thead><tr><th>Segmento</th><th>Mese 1 (impr. · clic · CTR)</th><th>Mese 2 (impr. · clic · CTR)</th><th>Andamento</th></tr></thead><tbody><tr><td><strong>Desktop</strong></td><td>10.000 · 500 · 5,0%</td><td>10.000 · 550 · 5,5%</td><td>in crescita</td></tr><tr><td><strong>Mobile</strong></td><td>2.000 · 40 · 2,0%</td><td>20.000 · 500 · 2,5%</td><td>in crescita</td></tr><tr><td><em>Totale aggregato</em></td><td>12.000 · 540 · 4,5%</td><td>30.000 · 1.050 · 3,5%</td><td>in calo</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">Ecco il punto: non abbiamo un problema di SEO, al contrario abbiamo avuto un successo notevole. I posizionamenti su Mobile sono esplosi, portando 18.000 impression in più rispetto al mese precedente.</p>



<p class="wp-block-paragraph">Il traffico Mobile, però, ha storicamente un CTR strutturalmente più basso del Desktop (più rumore in SERP, scrolling veloce, distrazioni). Quell&#8217;enorme afflusso di impression a basso CTR ha &#8220;annacquato&#8221; la media globale, trascinandola verso il basso. Il dato aggregato ci diceva <em>&#8220;stiamo peggiorando&#8221;</em>; il dato disaggregato ci dice <em>&#8220;stiamo migliorando su tutta la linea, ma è cambiato il mix di traffico&#8221;</em>.</p>



<p class="wp-block-paragraph">La ragione matematica è semplice e va sempre tenuta bene a mente: <strong>il CTR aggregato non è la media dei CTR dei segmenti, ma una loro media <em>pesata</em></strong>, dove i pesi sono le quote di impression di ciascun segmento. In formula:</p>



\(
\text{CTR}_{\text{agg}} = \frac{\sum_i \text{clic}_i}{\sum_i \text{impression}_i} = \sum_i w_i \cdot \text{CTR}_i, \qquad w_i = \frac{\text{impression}_i}{\sum_j \text{impression}_j} \\
\)



<p class="wp-block-paragraph">dove \(\text{CTR}_i\) è il CTR del segmento <em>i</em> e \(w_i\) è il suo peso, cioè la frazione di impression che gli appartiene. Nel Mese 2 il peso del Mobile è passato da 1/6 a 2/3 del totale: anche se ogni singolo CTR è salito, la media si è spostata verso il valore (basso) del segmento diventato dominante. Non è la matematica a essere impazzita: è il <em>mix</em> a essere cambiato.</p>



<p class="wp-block-paragraph">Ricostruiamo il tutto in R, così vediamo il meccanismo all&#8217;opera invece di prenderlo sulla fiducia:</p>



<pre class="wp-block-code"><code># Ricostruisco i dati dei due mesi
dati &lt;- data.frame(
  segmento   = c("Desktop", "Mobile", "Desktop", "Mobile"),
  mese       = c("Mese 1",  "Mese 1", "Mese 2",  "Mese 2"),
  impression = c(10000,     2000,     10000,     20000),
  clic       = c(500,       40,       550,       500)
)

# CTR di ciascun segmento
dati$ctr &lt;- dati$clic / dati$impression

# CTR aggregato per mese: media PESATA sulle impression,
# NON la media aritmetica dei CTR
agg &lt;- aggregate(cbind(clic, impression) ~ mese, data = dati, FUN = sum)
agg$ctr_aggregato &lt;- agg$clic / agg$impression
print(agg)</code></pre>



<p class="wp-block-paragraph">Come si vede dall&#8217;output, l&#8217;aggregato scende da 4,5% a 3,5% mentre entrambi i segmenti salgono. n.b.: la media aritmetica dei due CTR del Mese 2 sarebbe il 4% (la semplice media tra 5,5% e 2,5%), ben diversa dal 3,5% reale. Tutta la differenza è nei pesi.</p>



<h2 class="wp-block-heading">Altri due scenari SEO dove il paradosso colpisce</h2>



<p class="wp-block-paragraph">Il CTR per dispositivo è l&#8217;esempio da manuale, ma il Paradosso di Simpson si annida un po&#8217; ovunque nelle nostre dashboard.</p>



<h3 class="wp-block-heading">1. Il crollo del Conversion Rate (intento informazionale vs transazionale)</h3>



<p class="wp-block-paragraph">Lavoriamo su un e-commerce e il Conversion Rate organico passa dal 3% all&#8217;1,5%. Un disastro? Non necessariamente. Se abbiamo appena lanciato un blog aziendale che ha iniziato a posizionarsi bene per centinaia di keyword informazionali top-of-the-funnel, abbiamo portato sul sito migliaia di utenti lontani dall&#8217;acquisto (con un CR fisiologico vicino allo 0,1%). Il CR delle pagine prodotto può essere stabile o in crescita, ma la mole di traffico del blog ha distorto la media aggregata.</p>



<h3 class="wp-block-heading">2. Cannibalizzazione o espansione del ranking?</h3>



<p class="wp-block-paragraph">Una nostra pagina prodotto storica rankava solo per 5 keyword transazionali esatte: 100 impression, 10 clic, CTR 10%. Decidiamo di ottimizzarne i contenuti e il mese dopo Google ne premia la semantica, posizionandola per 80 nuove keyword long-tail e correlate. Ora la pagina fa 5.000 impression e 100 clic: CTR 2%. Se guardiamo solo il CTR medio su Search Console sembra che l&#8217;ottimizzazione l&#8217;abbia distrutta; se guardiamo i clic assoluti, li abbiamo decuplicati.</p>



<h2 class="wp-block-heading">Come difendersi (i takeaway per chi analizza)</h2>



<p class="wp-block-paragraph">Come sopravviviamo al Paradosso di Simpson quando presentiamo i dati a un cliente o a uno stakeholder? Quattro accortezze.</p>



<ol class="wp-block-list">

<li><strong>Non fidiamoci mai del solo dato aggregato.</strong> Quando analizziamo metriche relative (tassi di conversione, di clic, medie), il totale globale è spesso il numero meno utile di tutti.</li>


<li><strong>Segmentiamo fino a trovare l&#8217;omogeneità.</strong> Dividiamo i dati per dimensioni logiche prima di trarre conclusioni: per dispositivo (Desktop/Mobile), per tipo di query (brand/non-brand), per tipo di pagina (blog/prodotto).</li>


<li><strong>Cerchiamo il cambiamento dei pesi.</strong> Se un tasso globale crolla ma i sottogruppi tengono, chiediamoci: <em>&#8220;è cambiato il mix del traffico?&#8221;</em>. Quasi sempre un segmento a bassa performance ha aumentato di colpo i propri volumi.</li>


<li><strong>Educhiamo il cliente.</strong> In un report non limitiamoci a mostrare il calo del CTR: mostriamo la tabella disaggregata. Spiegare il meccanismo non salva soltanto il report del mese, ci posiziona come analisti che ragionano sui dati invece di subirli.</li>

</ol>



<p class="wp-block-paragraph">I dati non mentono, ma i dati aggregati sono ottimi prestigiatori. La difesa più solida, però, non è statistica ma sperimentale: quando possiamo decidere noi <em>come</em> assegnare il traffico — randomizzando gli utenti tra due versioni di una pagina — il mix smette di essere una variabile fuori controllo. È esattamente ciò che facciamo con un <a href="https://www.gironi.it/blog/ab-testing/">A/B test condotto in modo rigoroso</a>, il prossimo passo del nostro percorso: vedere come un esperimento controllato neutralizza alla radice le variabili confondenti che qui ci siamo limitati a smascherare.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading" id="per-approfondire">Per approfondire</h3>



<p class="wp-block-paragraph">Se vogliamo approfondire il Paradosso di Simpson e l&#8217;arte di leggere i dati senza farci ingannare, <a href="https://www.amazon.it/dp/8806246623?tag=consulenzeinf-21&#038;ascsubtag=il-paradosso-di-simpson-nella-seo-quando-i-dati-aggregati-possono-mentire" rel="nofollow sponsored noopener" target="_blank"><em>L&#8217;arte della statistica</em></a> di David Spiegelhalter è la lettura giusta: dedica pagine limpide proprio a questo paradosso — incluso il celebre caso delle ammissioni a Berkeley — mostrando come un numero aggregato possa raccontare l&#8217;esatto contrario di ciò che è successo nei dati.</p>



<p class="wp-block-paragraph">E per scoprire quanti altri modi esistono di farsi ingannare dai numeri — campioni distorti, medie scelte ad arte, grafici truccati — <a href="https://www.amazon.it/dp/8889479094?tag=consulenzeinf-21&#038;ascsubtag=il-paradosso-di-simpson-nella-seo-quando-i-dati-aggregati-possono-mentire" rel="nofollow sponsored noopener" target="_blank"><em>Mentire con le statistiche</em></a> di Darrell Huff è il piccolo classico del genere: scritto nel 1954, si legge in un pomeriggio e vale da vaccino permanente.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.gironi.it/blog/il-paradosso-di-simpson-nella-seo-quando-i-dati-aggregati-possono-mentire/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Campionamento e Dimensione Campionaria: Quanti Dati Servono?</title>
		<link>https://www.gironi.it/blog/campionamento-e-dimensione-campionaria-quanti-dati-servono/</link>
					<comments>https://www.gironi.it/blog/campionamento-e-dimensione-campionaria-quanti-dati-servono/#respond</comments>
		
		<dc:creator><![CDATA[Paolo Gironi]]></dc:creator>
		<pubDate>Wed, 06 May 2026 14:45:50 +0000</pubDate>
				<category><![CDATA[seo]]></category>
		<category><![CDATA[statistica]]></category>
		<guid isPermaLink="false">https://www.gironi.it/blog/?p=3558</guid>

					<description><![CDATA[In questo articolo: Come scegliere chi misurare: i tipi di campionamento La dimensione campionaria: la matematica dietro la stima Calcoliamolo in R e Python Dalla stima all&#8217;A/B Testing Errore campionario vs Bias Prova tu Nella vita di tutti i giorni, come nella web analytics, dobbiamo spesso prendere decisioni basate su informazioni incomplete. Quanti dati mi &#8230; <a href="https://www.gironi.it/blog/campionamento-e-dimensione-campionaria-quanti-dati-servono/" class="more-link">Leggi tutto<span class="screen-reader-text"> "Campionamento e Dimensione Campionaria: Quanti Dati Servono?"</span></a>]]></description>
										<content:encoded><![CDATA[
<div style="background-color: #f8f9fa;padding: 20px;border-radius: 8px;margin-bottom: 30px;border-left: 4px solid #4a90e2">
<h3 style="margin-top: 0">In questo articolo:</h3>
<ul style="margin-bottom: 0">
<li><a href="#tipi-campionamento">Come scegliere chi misurare: i tipi di campionamento</a></li>
<li><a href="#formula-dimensione">La dimensione campionaria: la matematica dietro la stima</a></li>
<li><a href="#esempio-codice">Calcoliamolo in R e Python</a></li>
<li><a href="#collegamento-ab-test">Dalla stima all&#8217;A/B Testing</a></li>
<li><a href="#bias-errore">Errore campionario vs Bias</a></li>
<li><a href="#prova-tu">Prova tu</a></li>
</ul>
</div>



<p class="wp-block-paragraph">Nella vita di tutti i giorni, come nella web analytics, dobbiamo spesso prendere decisioni basate su informazioni incomplete. Quanti dati mi servono per capire se questa modifica alla landing page ha funzionato? Mille visite bastano? Diecimila sono troppe?</p>



<span id="more-3558"></span>



<p class="wp-block-paragraph">Non possiamo quasi mai misurare l&#8217;intera popolazione (ad esempio, tutti i futuri visitatori di un sito). Dobbiamo lavorare su un <strong>campione</strong>. E qui sta l&#8217;equilibrio delicato: un campione troppo piccolo porta a conclusioni sbagliate, uno inutilmente grande fa sprecare tempo e risorse. La domanda diventa allora: <strong>quanti dati ci servono davvero?</strong></p>



<h2 class="wp-block-heading" id="tipi-campionamento">Come scegliere chi misurare: i tipi di campionamento</h2>



<p class="wp-block-paragraph">Prima di capire <em>quanti</em> dati ci servono, dobbiamo capire <em>come</em> raccoglierli. I tre metodi principali sono:</p>



<ul class="wp-block-list">
<li><strong>Campionamento casuale semplice:</strong> Ogni utente ha esattamente la stessa probabilità di essere scelto. È il gold standard, quello che cerchiamo di ottenere quando randomizziamo gli utenti in un A/B test.</li>
<li><strong>Campionamento stratificato:</strong> Dividiamo gli utenti in gruppi (es. traffico Mobile e Desktop) e campioniamo casualmente all&#8217;interno di ogni gruppo, rispettando le proporzioni originali. Assicura che nessuna minoranza importante venga ignorata.</li>
<li><strong>Campionamento sistematico:</strong> Scegliamo un utente ogni <em>k</em> (es. un utente ogni 10). Facile da implementare, ma insidioso quando nei dati si nasconde una ciclicità (immaginiamo di campionare un utente ogni 7: se prendiamo solo i lunedì, la stima sarà deformata in partenza).</li>
</ul>



<h2 class="wp-block-heading" id="formula-dimensione">La dimensione campionaria: la matematica dietro la stima</h2>



<p class="wp-block-paragraph">L&#8217;intuizione è semplice: più è piccolo l&#8217;effetto che cerchiamo (o più i dati sono variabili), più dati ci servono per distinguerlo dal rumore di fondo. Sembra difficile da formalizzare? È più lineare di quanto sembri.</p>



<p class="wp-block-paragraph">Per calcolare il numero esatto, ci servono tre ingredienti:</p>



<ul class="wp-block-list">
<li><strong>Livello di confidenza:</strong> Quanto vogliamo essere sicuri? Di solito si usa il 95% (che corrisponde a uno Z-score di 1.96).</li>
<li><strong>Margine di errore (E):</strong> L&#8217;errore massimo che siamo disposti ad accettare (es. 1% o 0.01).</li>
<li><strong>Proporzione attesa (p):</strong> La stima del tasso di conversione. Se non ne abbiamo idea, usiamo 0.5 (50%): è il caso di massima incertezza e darà il campione più grande possibile, quindi la scelta più conservativa.</li>
</ul>



<p class="wp-block-paragraph">La formula per stimare una proporzione (come il Conversion Rate) è:</p>



<p class="wp-block-paragraph" style="text-align: center;font-size: 1.2em"><strong>n = (Z&sup2; &times; p(1 &#8211; p)) / E&sup2;</strong></p>



<h2 class="wp-block-heading" id="esempio-codice">Calcoliamolo in R e Python</h2>



<p class="wp-block-paragraph">Facciamo un esempio al volo. Vogliamo stimare il Conversion Rate di una nuova pagina con un margine di errore dell&#8217;1% (0.01) e un livello di confidenza del 95% (Z = 1.96). Per cautela, impostiamo p = 0.5.</p>



<p class="wp-block-paragraph">Gli esempi seguono sia in R sia in Python: ognuno scelga il linguaggio con cui ha più familiarità.</p>



<p class="wp-block-paragraph">Calcoliamo in R:</p>



<pre><code class="language-r"># Calcolo della dimensione campionaria per una proporzione
Z &lt;- 1.96
p &lt;- 0.5
E &lt;- 0.01

n &lt;- (Z^2 * p * (1-p)) / E^2
print(paste("Dimensione necessaria:", round(n)))
# Output: Dimensione necessaria: 9604</code></pre>



<p class="wp-block-paragraph">Verifichiamo in Python:</p>



<pre><code class="language-python"># Calcolo della dimensione campionaria per una proporzione
Z = 1.96
p = 0.5
E = 0.01

n = (Z**2 * p * (1-p)) / E**2
print(f"Dimensione necessaria: {round(n)}")
# Output: Dimensione necessaria: 9604</code></pre>



<p class="wp-block-paragraph">Come si vede, servono circa 9.604 utenti per avere quella precisione. n.b.: se accettassimo un margine di errore del 2% (E=0.02), il numero crollerebbe a circa 2.401. È l&#8217;effetto dell&#8217;<em>E</em> al quadrato a denominatore: dimezzare la pretesa di precisione significa dividere per quattro il campione richiesto. Va sempre tenuto bene a mente quando si decide quale margine accettare.</p>



<h2 class="wp-block-heading" id="collegamento-ab-test">Dalla stima all&#8217;A/B Testing</h2>



<p class="wp-block-paragraph">La formula vista finora serve a stimare una singola proporzione. Ma nella pratica quotidiana della CRO (Conversion Rate Optimization) il problema è quasi sempre un altro: <em>confrontare</em> due proporzioni, come in un A/B test.</p>



<p class="wp-block-paragraph">In quel caso la logica è la stessa, ma la formula si complica perché entrano in gioco due concetti nuovi: l&#8217;<strong>Effect Size</strong> (la minima differenza che vogliamo rilevare) e la <strong>Potenza Statistica</strong> (come dicono gli anglosassoni, <em>power</em>).</p>



<p class="wp-block-paragraph">Per evitare di calcolarlo a mano ho preparato un <a href="/blog/calcolatore-sample-size-ab-test/">calcolatore interattivo del sample size per A/B test</a>: fa il lavoro sporco al posto nostro e indica anche per quanti giorni far girare il test, dato il traffico medio della pagina.</p>



<h2 class="wp-block-heading" id="bias-errore">Errore campionario vs Bias</h2>



<p class="wp-block-paragraph">Va sempre tenuto bene a mente un punto, prima di chiudere. L&#8217;errore di campionamento (quello che la formula gestisce) è inevitabile e si riduce aumentando i dati. Ma c&#8217;è un nemico molto più insidioso, e nessuna formula lo cattura: il <strong>bias</strong>.</p>



<p class="wp-block-paragraph">Se testiamo una pagina solo durante il weekend, possiamo anche raccogliere un milione di visite (errore campionario praticamente nullo), ma il campione non sarà rappresentativo degli utenti infrasettimanali. Dunque: nessuna formula può salvare un campione distorto all&#8217;origine. Meglio mille osservazioni ben raccolte di un milione raccolte male.</p>



<h2 class="wp-block-heading" id="prova-tu">Prova tu</h2>



<p class="wp-block-paragraph">Una pagina prodotto riceve circa 10.000 impressioni al mese su Google, con un CTR osservato del 3,5%. Vogliamo stimare il vero CTR con un margine di errore di 1 punto percentuale (E = 0,01) e una confidenza del 95%.</p>



<ol class="wp-block-list">
<li>Calcola la dimensione campionaria necessaria con la formula vista, prima usando p = 0,5 (caso conservativo) e poi p = 0,035 (CTR osservato).</li>
<li>Confronta i due risultati: di quanto cambia il fabbisogno di dati quando abbiamo una stima ragionevole di p?</li>
<li>Considerando le 10.000 impressioni al mese, in quanti mesi raccogliamo abbastanza dati per soddisfare la stima conservativa?</li>
<li>Se accettassimo un margine del 2% (E = 0,02), come cambierebbe il tempo di raccolta?</li>
</ol>



<p class="wp-block-paragraph">Suggerimento: in R basta una funzione minima — <code>sample_size &lt;- function(Z, p, E) ceiling((Z^2 * p * (1-p)) / E^2)</code> — da chiamare due volte con i due valori di <em>p</em>.</p>



<hr class="wp-block-separator has-alpha-channel-opacity" />



<p class="wp-block-paragraph">Adesso sappiamo come raccogliere un campione adeguato e quanti dati ci servono. Resta una domanda: come usiamo quel campione per confrontare in modo rigoroso due versioni della stessa pagina? È qui che entra in gioco l&#8217;<a href="/blog/guida-ai-test-statistici-per-analisi-a-b/">A/B testing vero e proprio</a>, ed è il prossimo tassello del percorso.</p>



<hr class="wp-block-separator has-alpha-channel-opacity" />



<h3 class="wp-block-heading" id="per-approfondire">Per approfondire</h3>



<p class="wp-block-paragraph">Se vuoi approfondire il tema del campionamento, dei bias che possono distorcerlo e della logica dell&#8217;inferenza statistica, <a href="https://www.amazon.it/dp/8806246623?tag=consulenzeinf-21&#038;ascsubtag=campionamento-e-dimensione-campionaria-quanti-dati-servono" rel="nofollow sponsored noopener" target="_blank"><em>L&#8217;arte della statistica</em></a> di David Spiegelhalter è il compagno di viaggio più adatto. Spiegelhalter dedica pagine illuminanti a casi reali — sondaggi sbagliati, campioni di convenienza, statistiche che ingannano — e mostra come la matematica del campionamento valga poco senza una riflessione attenta su <em>come</em> i dati vengono raccolti.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.gironi.it/blog/campionamento-e-dimensione-campionaria-quanti-dati-servono/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Calcolatore Sample Size per A/B Test</title>
		<link>https://www.gironi.it/blog/calcolatore-sample-size-ab-test/</link>
					<comments>https://www.gironi.it/blog/calcolatore-sample-size-ab-test/#comments</comments>
		
		<dc:creator><![CDATA[Paolo Gironi]]></dc:creator>
		<pubDate>Thu, 05 Mar 2026 11:35:19 +0000</pubDate>
				<category><![CDATA[statistica]]></category>
		<guid isPermaLink="false">https://www.gironi.it/blog/?p=3492</guid>

					<description><![CDATA[Una delle domande più ricorrenti quando si progetta un A/B test è: quanti utenti mi servono per ottenere un risultato affidabile? La risposta non è un numero magico: dipende da quanto è grande l&#8217;effetto che vogliamo rilevare, dal tasso di conversione di partenza e dal livello di certezza statistica che desideriamo raggiungere. Calcolare in anticipo &#8230; <a href="https://www.gironi.it/blog/calcolatore-sample-size-ab-test/" class="more-link">Leggi tutto<span class="screen-reader-text"> "Calcolatore Sample Size per A/B Test"</span></a>]]></description>
										<content:encoded><![CDATA[<p>Una delle domande più ricorrenti quando si progetta un <strong>A/B test</strong> è: <em>quanti utenti mi servono per ottenere un risultato affidabile?</em> La risposta non è un numero magico: dipende da quanto è grande l&#8217;effetto che vogliamo rilevare, dal tasso di conversione di partenza e dal livello di certezza statistica che desideriamo raggiungere.</p>
<p>Calcolare in anticipo la <strong>dimensione campionaria</strong> (sample size) è un passaggio fondamentale per evitare due errori classici: fermare il test troppo presto, dichiarando un vincitore che non c&#8217;è, oppure lasciarlo correre troppo a lungo, sprecando traffico e tempo. In altri termini, si tratta di trovare il punto di equilibrio tra risorse e rigore.</p>
<p>Chi ha letto l&#8217;articolo sul <a href="https://www.gironi.it/blog/ab-testing/">A/B Testing</a> ricorderà che la <strong>power analysis</strong> è il metodo statistico che ci permette di determinare questa soglia. E chi ha approfondito gli <a href="https://www.gironi.it/blog/intervalli-di-confidenza/">intervalli di confidenza</a> sa già che livello di significatività e potenza del test non sono concetti astratti, ma leve operative che influenzano direttamente la dimensione del campione.</p>
<p><span id="more-3492"></span></p>
<p>Il calcolatore qui sotto automatizza questo processo: basta inserire i parametri del proprio test per ottenere immediatamente il numero di osservazioni necessarie per variante e, se si conosce il traffico giornaliero, una stima della durata in giorni.</p>
<div style="border: 1px solid #ccc;padding: 1.2em 1.5em;margin: 1.5em 0;border-radius: 6px">
<h3 style="margin-top: 0">Indice</h3>
<ul>
<li><a href="#calcolatore">Il calcolatore</a></li>
<li><a href="#formula">La formula: come funziona il calcolo</a></li>
<li><a href="#come-usare">Come usare il calcolatore</a></li>
<li><a href="#approfondimenti">Approfondimenti</a></li>
</ul>
</div>
<hr />
<h2 id="calcolatore">Il calcolatore</h2>
<p>Inseriamo i parametri del nostro A/B test e il calcolatore restituisce istantaneamente la dimensione campionaria necessaria.</p>
<style>
.ss-calc{max-width:620px;margin:2em auto;padding:1.5em 2em;background:#f8f8f8;border:1px solid #ddd;border-radius:8px;font-family:inherit}
.ss-calc h3{margin:0 0 1em;color:#333;font-size:1.2em}
.ss-calc label{display:block;margin:0.8em 0 0.3em;font-weight:600;color:#333;font-size:0.95em}
.ss-calc .ss-hint{font-size:0.82em;color:#777;margin:0.15em 0 0}
.ss-calc input[type=number],.ss-calc select{width:100%;padding:8px 10px;border:1px solid #ccc;border-radius:4px;font-size:1em;box-sizing:border-box;background:#fff}
.ss-calc input[type=number]:focus,.ss-calc select:focus{outline:none;border-color:#0073aa;box-shadow:0 0 0 2px rgba(0,115,170,0.15)}
.ss-calc .ss-row{display:flex;gap:1.2em}
.ss-calc .ss-col{flex:1}
.ss-calc .ss-result{margin-top:1.5em;padding:1.2em;background:#fff;border:2px solid #2ecc71;border-radius:6px;text-align:center}
.ss-calc .ss-result .ss-big{font-size:2em;font-weight:700;color:#2ecc71;display:block;margin:0.2em 0}
.ss-calc .ss-result .ss-label{font-size:0.85em;color:#666}
.ss-calc .ss-result .ss-total{font-size:1.1em;color:#333;margin-top:0.5em}
.ss-calc .ss-result .ss-days{font-size:1em;color:#0073aa;margin-top:0.4em;font-weight:600}
.ss-calc .ss-warn{color:#e74c3c;font-size:0.85em;margin-top:0.5em;display:none}
@media(max-width:520px){.ss-calc .ss-row{flex-direction:column;gap:0}.ss-calc{padding:1em 1.2em}}
</style>
<div class="ss-calc" id="ssCalc">
<h3>Calcolatore Sample Size</h3>
<p><label for="ssBase">Tasso di conversione base (%)</label><br />
<input type="number" id="ssBase" value="5" min="0.1" max="100" step="0.1"></p>
<p class="ss-hint">Il conversion rate attuale della variante di controllo</p>
<p><label for="ssMde">Effetto minimo rilevabile &mdash; MDE (% relativo)</label><br />
<input type="number" id="ssMde" value="20" min="1" max="100" step="1"></p>
<p class="ss-hint">L&#8217;incremento relativo minimo che consideriamo significativo (es. 20% = da 5% a 6%)</p>
<div class="ss-row">
<div class="ss-col">
<label for="ssAlpha">Significativit&agrave; (&alpha;)</label><br />
<select id="ssAlpha"><option value="0.01">0.01 (99%)</option><option value="0.05" selected>0.05 (95%)</option><option value="0.10">0.10 (90%)</option></select>
</div>
<div class="ss-col">
<label for="ssPower">Potenza (1&minus;&beta;)</label><br />
<select id="ssPower"><option value="0.80" selected>0.80</option><option value="0.85">0.85</option><option value="0.90">0.90</option><option value="0.95">0.95</option></select>
</div>
</div>
<p><label for="ssTraffic">Traffico giornaliero <span style="font-weight:400;color:#999">(opzionale)</span></label><br />
<input type="number" id="ssTraffic" value="" min="1" step="1" placeholder="es. 1000"></p>
<p class="ss-hint">Visitatori giornalieri totali per stimare la durata del test</p>
<div class="ss-result" id="ssResult">
<span class="ss-label">Sample size per variante</span><br />
<span class="ss-big" id="ssN">&mdash;</span></p>
<div class="ss-total" id="ssTotal"></div>
<div class="ss-days" id="ssDays"></div>
</div>
<div class="ss-warn" id="ssWarn"></div>
</div>
<p><script>
(function(){
  function qnorm(p){
    if(p<=0||p>=1)return NaN;
    if(p<0.5)return -qnorm(1-p);
    var t=Math.sqrt(-2*Math.log(1-p));
    var c0=2.515517,c1=0.802853,c2=0.010328;
    var d1=1.432788,d2=0.189269,d3=0.001308;
    return t-(c0+c1*t+c2*t*t)/(1+d1*t+d2*t*t+d3*t*t*t);
  }
  function calcSS(){
    var base=parseFloat(document.getElementById('ssBase').value);
    var mde=parseFloat(document.getElementById('ssMde').value);
    var alpha=parseFloat(document.getElementById('ssAlpha').value);
    var power=parseFloat(document.getElementById('ssPower').value);
    var traffic=document.getElementById('ssTraffic').value;
    var warn=document.getElementById('ssWarn');
    warn.style.display='none';
    if(isNaN(base)||isNaN(mde)||base<=0||base>100||mde<=0||mde>100){
      document.getElementById('ssN').innerHTML='&mdash;';
      document.getElementById('ssTotal').textContent='';
      document.getElementById('ssDays').textContent='';
      return;
    }
    var p1=base/100;
    var p2=p1*(1+mde/100);
    if(p2>1){
      warn.textContent='Attenzione: con questi valori il tasso di conversione della variante supererebbe il 100%.';
      warn.style.display='block';
      document.getElementById('ssN').innerHTML='&mdash;';
      document.getElementById('ssTotal').textContent='';
      document.getElementById('ssDays').textContent='';
      return;
    }
    var za=qnorm(1-alpha/2);
    var zb=qnorm(power);
    var diff=p1-p2;
    var n=Math.ceil((Math.pow(za+zb,2)*(p1*(1-p1)+p2*(1-p2)))/(diff*diff));
    document.getElementById('ssN').textContent=n.toLocaleString('it-IT');
    document.getElementById('ssTotal').textContent='Totale (2 varianti): '+(n*2).toLocaleString('it-IT')+' osservazioni';
    if(traffic && parseInt(traffic)>0){
      var days=Math.ceil((n*2)/parseInt(traffic));
      document.getElementById('ssDays').textContent='Durata stimata: circa '+days+' giorni';
    }else{
      document.getElementById('ssDays').textContent='';
    }
  }
  ['ssBase','ssMde','ssAlpha','ssPower','ssTraffic'].forEach(function(id){
    document.getElementById(id).addEventListener('input',calcSS);
    document.getElementById(id).addEventListener('change',calcSS);
  });
  calcSS();
})();
</script></p>
<hr />
<h2 id="formula">La formula: come funziona il calcolo</h2>
<p>Il calcolatore utilizza la formula classica per il confronto tra due proporzioni con un <strong>test a due code</strong> (two-tailed z-test). Vediamo passo dopo passo come si arriva al risultato.</p>
<p>Partiamo dai parametri che inseriamo:</p>
<ul>
<li><strong>p<sub>1</sub></strong>: il tasso di conversione di base (controllo), espresso come proporzione. Se il nostro CR è del 5%, allora p<sub>1</sub> = 0.05.</li>
<li><strong>p<sub>2</sub></strong>: il tasso di conversione atteso per la variante. Se l&#8217;effetto minimo rilevabile (MDE) è del 20% relativo, allora p<sub>2</sub> = p<sub>1</sub> &times; (1 + MDE/100) = 0.05 &times; 1.20 = 0.06.</li>
<li><strong>&alpha;</strong>: il livello di significatività, cioè la probabilità di dichiarare un effetto quando non c&#8217;è (errore di tipo I). Con &alpha; = 0.05 lavoriamo al 95% di confidenza.</li>
<li><strong>1 &minus; &beta;</strong>: la potenza del test, cioè la probabilità di rilevare un effetto quando effettivamente esiste. Con potenza 0.80, abbiamo l&#8217;80% di probabilità di cogliere l&#8217;effetto.</li>
</ul>
<p>La formula è:</p>
<p>\( n = \frac{\left[z_{\alpha/2} + z_{\beta}\right]^2 \cdot \left[p_1(1-p_1) + p_2(1-p_2)\right]}{(p_1 &#8211; p_2)^2} \)</p>
<p>Dove z<sub>&alpha;/2</sub> e z<sub>&beta;</sub> sono i <strong>quantili della distribuzione normale standard</strong>. Per i valori più comuni:</p>
<ul>
<li>&alpha; = 0.05 &rarr; z<sub>&alpha;/2</sub> = 1.96</li>
<li>&alpha; = 0.01 &rarr; z<sub>&alpha;/2</sub> = 2.576</li>
<li>&beta; = 0.20 (potenza 0.80) &rarr; z<sub>&beta;</sub> = 0.842</li>
<li>&beta; = 0.10 (potenza 0.90) &rarr; z<sub>&beta;</sub> = 1.282</li>
</ul>
<p><strong>Esempio numerico.</strong> Supponiamo di avere un tasso di conversione base del 3% e di voler rilevare un incremento relativo del 20% (cioè passare dal 3% al 3.6%), con &alpha; = 0.05 e potenza = 0.80:</p>
<ul>
<li>p<sub>1</sub> = 0.03, p<sub>2</sub> = 0.036</li>
<li>z<sub>&alpha;/2</sub> = 1.96, z<sub>&beta;</sub> = 0.842</li>
<li>Numeratore: (1.96 + 0.842)<sup>2</sup> &times; [0.03 &times; 0.97 + 0.036 &times; 0.964] = 7.849 &times; 0.0638 = 0.5008</li>
<li>Denominatore: (0.03 &minus; 0.036)<sup>2</sup> = 0.000036</li>
<li>n = 0.5008 / 0.000036 &asymp; <strong>13.911 per variante</strong></li>
</ul>
<p>Dunque: per rilevare un effetto del 20% relativo su un CR del 3%, servono circa <strong>13.900 osservazioni per variante</strong> (quasi 28.000 in totale). Numeri che fanno riflettere: se il nostro sito ha 500 visitatori al giorno, il test durerà circa 56 giorni. È uno dei motivi per cui, nella pratica, molti A/B test su siti a traffico medio richiedono settimane, non giorni.</p>
<hr />
<h2 id="come-usare">Come usare il calcolatore</h2>
<p><strong>Come scegliere l&#8217;MDE.</strong> L&#8217;effetto minimo rilevabile è il parametro più delicato. Non chiediamoci &#8220;quanto vorremmo che migliorasse&#8221; ma piuttosto: <em>qual è il miglioramento minimo che giustificherebbe lo sforzo di implementare la modifica?</em> Un MDE del 5% relativo richiede campioni enormi; un MDE del 50% è facile da rilevare ma raramente realistico. La fascia 10-30% è un buon punto di partenza per la maggior parte dei test su conversion rate.</p>
<p>Un dettaglio importante: l&#8217;MDE nel calcolatore è <strong>relativo</strong>, non assoluto. Un MDE del 20% su un CR base del 5% significa che stiamo cercando di rilevare un passaggio dal 5% al 6% (cioè un punto percentuale assoluto, ma il 20% relativo del valore iniziale).</p>
<p><strong>Come stimare il traffico giornaliero.</strong> Il traffico da inserire è quello delle pagine coinvolte nel test, non il traffico totale del sito. Se il test riguarda la pagina di checkout e questa riceve 300 visite al giorno, il valore corretto è 300. Possiamo ricavare questo dato dal nostro strumento di analytics (GA4, Matomo o simili) facendo una media degli ultimi 30 giorni per attenuare le oscillazioni giornaliere.</p>
<hr />
<h3 id="approfondimenti">Potrebbe interessarti anche</h3>
<ul>
<li><a href="https://www.gironi.it/blog/calcolatore-significativita-ab-test/">Calcolatore di Significatività per A/B Test (il complemento: da usare a test concluso)</a></li>
<li><a href="https://www.gironi.it/blog/ab-testing/">A/B Testing: guida ai test statistici per l&#8217;analisi A/B</a></li>
<li><a href="https://www.gironi.it/blog/intervalli-di-confidenza/">Intervalli di confidenza</a></li>
<li><a href="https://www.gironi.it/blog/il-test-delle-ipotesi/">Il test delle ipotesi</a></li>
</ul>
<hr />
<h3>Per approfondire</h3>
<p>Il riferimento più completo sulla progettazione rigorosa di esperimenti online è: <a href="https://www.amazon.it/dp/1108724264?tag=consulenzeinf-21&#038;ascsubtag=calcolatore-sample-size-ab-test" rel="nofollow sponsored noopener" target="_blank"><em>Trustworthy Online Controlled Experiments</em></a> di Ron Kohavi, Diane Tang e Ya Xu. Copre sample size, power analysis e molto altro, con decenni di esperienza pratica in Microsoft e Google.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.gironi.it/blog/calcolatore-sample-size-ab-test/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Anomaly detection: come identificare valori anomali nei dati</title>
		<link>https://www.gironi.it/blog/anomaly-detection/</link>
					<comments>https://www.gironi.it/blog/anomaly-detection/#respond</comments>
		
		<dc:creator><![CDATA[paolo]]></dc:creator>
		<pubDate>Sun, 22 Feb 2026 17:44:31 +0000</pubDate>
				<category><![CDATA[statistica]]></category>
		<guid isPermaLink="false">https://www.gironi.it/blog/?p=3414</guid>

					<description><![CDATA[Tre metodi statistici per identificare valori anomali nei dati: z-score, IQR di Tukey e test di Grubbs. Come distinguere il rumore dai segnali importanti, con esempi pratici in R su dati di traffico web.]]></description>
										<content:encoded><![CDATA[<p>Abbiamo avuto modo di esaminare, nel corso di questo percorso, strumenti per descrivere i dati, per testare ipotesi, per costruire modelli. Ma c&#8217;è una domanda che precede tutte le altre, e che troppo spesso viene ignorata: <strong>questi dati sono affidabili?</strong></p>
<p>In qualsiasi dataset — sessioni giornaliere, click organici, tassi di conversione — possono nascondersi valori che non si comportano come gli altri. Valori che si discostano in modo anomalo dal resto della distribuzione. In statistica li chiamiamo <strong>outlier</strong>, o <strong>valori anomali</strong>.</p>
<p>Un punto va chiarito subito: un valore anomalo non è necessariamente un errore. Può essere un errore di misurazione, certo (un tag di tracciamento rotto, un bot che gonfia le sessioni). Ma può anche essere il segnale più importante dell&#8217;intero dataset: un aggiornamento dell&#8217;algoritmo di Google, un contenuto che diventa virale, un problema tecnico che abbatte il traffico. <strong>La questione non è eliminare le anomalie, ma riconoscerle</strong> — e poi decidere cosa farne.</p>
<p>In questo articolo esaminiamo tre metodi statistici per identificare i valori anomali, dal più intuitivo al più formale. Per ciascuno vedremo la logica, i limiti e l&#8217;applicazione pratica con R.</p>
<p><span id="more-3414"></span></p>
<div style="border: 1px solid #ccc;padding: 1.2em 1.5em;margin: 1.5em 0;border-radius: 6px">
<h3 style="margin-top: 0">Di cosa parleremo</h3>
<ul>
<li><a href="#dataset-di-lavoro">Il dataset di lavoro: sessioni simulate con anomalie iniettate</a></li>
<li><a href="#metodo-1-z-score">Metodo 1: lo z-score</a></li>
<li><a href="#metodo-2-iqr-tukey">Metodo 2: IQR e il metodo di Tukey</a></li>
<li><a href="#metodo-3-grubbs">Metodo 3: il test di Grubbs</a></li>
<li><a href="#confronto-tre-metodi">Confronto tra i tre metodi</a></li>
<li><a href="#prova-tu">Prova tu</a></li>
<li><a href="#per-approfondire">Per approfondire</a></li>
</ul>
</div>
<hr />
<h2 id="dataset-di-lavoro">Il dataset di lavoro</h2>
<p>Per rendere le cose concrete, costruiamo un dataset simulato ma realistico: le sessioni giornaliere di un sito web nell&#8217;arco di un anno. I dati seguono approssimativamente una distribuzione normale con media 250 e deviazione standard 50, ma con cinque anomalie inserite intenzionalmente — tre cali drastici e due picchi.</p>
<p>Generiamo i dati in R:</p>
<pre><code class="language-r">set.seed(42)
n &lt;- 365
sessioni &lt;- round(rnorm(n, mean = 250, sd = 50))
sessioni[sessioni &lt; 0] &lt;- 0

# Inietto 5 anomalie realistiche
sessioni[45]  &lt;- 38   # giorno 45: problema tecnico
sessioni[120] &lt;- 580  # giorno 120: articolo virale
sessioni[200] &lt;- 22   # giorno 200: update Google
sessioni[300] &lt;- 510  # giorno 300: menzione su social
sessioni[350] &lt;- 15   # giorno 350: server down</code></pre>
<p>Visualizziamo l&#8217;andamento con un semplice grafico temporale:</p>
<pre><code class="language-r">plot(1:n, sessioni, type = "l", col = "steelblue",
     xlab = "Giorno", ylab = "Sessioni",
     main = "Sessioni giornaliere - un anno di traffico")
abline(h = mean(sessioni), col = "red", lty = 2)</code></pre>
<p>A occhio, qualche picco e qualche calo si nota. Ma dove tracciamo il confine tra variazione naturale e anomalia? Servono criteri oggettivi.</p>
<h2 id="metodo-1-z-score">Metodo 1: lo z-score</h2>
<p>Abbiamo incontrato lo z-score <a href="https://www.gironi.it/blog/la-distribuzione-normale/">parlando della distribuzione normale</a>. Lo z-score ci dice quante deviazioni standard un valore dista dalla media:</p>
<p>\(<br />
z = \frac{x &#8211; \mu}{\sigma} \\<br />
\)</p>
<p>dove \(x\) è il valore osservato, \(\mu\) è la media e \(\sigma\) la deviazione standard. Un valore con z-score pari a 2 si trova a due deviazioni standard dalla media; uno con z-score pari a -3 si trova a tre deviazioni standard sotto la media.</p>
<p>Ricordiamo la <strong>regola empirica</strong>: in una distribuzione normale, circa il 99.7% dei dati cade entro tre deviazioni standard dalla media. Un valore con |z| &gt; 3 è dunque estremamente raro — meno dello 0.3% di probabilità sotto ipotesi di normalità.</p>
<p>Calcoliamo gli z-score per il nostro dataset e identifichiamo le anomalie:</p>
<pre><code class="language-r">z &lt;- (sessioni - mean(sessioni)) / sd(sessioni)

# Soglia conservativa: |z| &gt; 3
anomalie_z3 &lt;- which(abs(z) &gt; 3)
cat("Giorni anomali (|z| &gt; 3):", anomalie_z3, "\n")
cat("Sessioni:", sessioni[anomalie_z3], "\n")
cat("Z-score:", round(z[anomalie_z3], 2), "\n")</code></pre>
<p>Il risultato:</p>
<pre><code>Giorni anomali (|z| &gt; 3): 45 120 200 300 350
Sessioni: 38 580 22 510 15
Z-score: -3.75 5.92 -4.03 4.67 -4.16</code></pre>
<p>Con la soglia |z| &gt; 3, lo z-score identifica esattamente le cinque anomalie che avevamo inserito. Nessun falso positivo, nessun falso negativo — un risultato quasi perfetto.</p>
<p>Ma attenzione: se abbassiamo la soglia a |z| &gt; 2, le anomalie salgono a 14. Molti di quei valori sono semplicemente dati nella coda della distribuzione, non anomalie reali. <strong>La scelta della soglia non è un dettaglio tecnico: è una decisione analitica</strong> che dipende da quanto siamo disposti a tollerare falsi allarmi.</p>
<p>C&#8217;è un limite importante in questo metodo. Lo z-score assume che i dati seguano (almeno approssimativamente) una <strong>distribuzione normale</strong>. Se la distribuzione è fortemente asimmetrica — e i dati di traffico web spesso lo sono, con lunghe code a destra — la media e la deviazione standard possono essere distorte proprio dagli outlier che stiamo cercando di individuare. È un circolo vizioso: le anomalie influenzano le statistiche che usiamo per trovarle.</p>
<h2 id="metodo-2-iqr-tukey">Metodo 2: IQR e il metodo di Tukey</h2>
<p>Le <a href="https://www.gironi.it/blog/statistica-descrittiva-misure-di-posizione/">misure di posizione</a> — quartili e mediana — ci offrono un approccio che non richiede ipotesi sulla forma della distribuzione. Il metodo di Tukey, dal nome del grande statistico John Tukey, usa l&#8217;<strong>intervallo interquartile</strong> (IQR) come metro di misura.</p>
<p>L&#8217;IQR, come abbiamo visto parlando delle <a href="https://www.gironi.it/blog/misure-di-variabilita-o-dispersione/">misure di variabilità</a>, è la differenza tra il terzo quartile (\(Q_3\), il 75-esimo percentile) e il primo quartile (\(Q_1\), il 25-esimo percentile). Rappresenta la dispersione del 50% centrale dei dati — la parte &#8220;solida&#8221; della distribuzione, immune alle code.</p>
<p>La regola di Tukey è semplice: un valore è considerato anomalo se cade al di fuori dei cosiddetti <strong>cardini</strong> (in inglese <em>fences</em>):</p>
<p>\(<br />
\text{anomalia se } x &lt; Q_1 &#8211; 1.5 \cdot IQR \quad \text{oppure} \quad x &gt; Q_3 + 1.5 \cdot IQR \\<br />
\)</p>
<p>Perché 1.5? Tukey non scelse questo valore a caso. Per una distribuzione normale, i cardini a 1.5 IQR corrispondono approssimativamente a 2.7 deviazioni standard dalla media — una soglia ragionevolmente conservativa che cattura circa lo 0.7% delle osservazioni nelle code. Abbastanza severa da non segnalare troppi falsi positivi, abbastanza sensibile da non lasciarsi sfuggire le anomalie importanti.</p>
<p>Applichiamo il metodo al nostro dataset:</p>
<pre><code class="language-r">Q1 &lt;- quantile(sessioni, 0.25)
Q3 &lt;- quantile(sessioni, 0.75)
IQR_val &lt;- Q3 - Q1

limite_inf &lt;- Q1 - 1.5 * IQR_val
limite_sup &lt;- Q3 + 1.5 * IQR_val

cat("Q1:", Q1, " Q3:", Q3, " IQR:", IQR_val, "\n")
cat("Limite inferiore:", limite_inf, "\n")
cat("Limite superiore:", limite_sup, "\n")

anomalie_iqr &lt;- which(sessioni &lt; limite_inf | sessioni &gt; limite_sup)
cat("Giorni anomali:", anomalie_iqr, "\n")
cat("Sessioni:", sessioni[anomalie_iqr], "\n")</code></pre>
<p>Il risultato:</p>
<pre><code>Q1: 215  Q3: 282  IQR: 67
Limite inferiore: 114.5
Limite superiore: 382.5
Giorni anomali: 45 59 118 120 200 300 350
Sessioni: 38 100 385 580 22 510 15</code></pre>
<p>Il metodo di Tukey trova 7 anomalie: le nostre 5 iniettate più due valori al confine (il giorno 59 con 100 sessioni e il giorno 118 con 385). Sono davvero anomali? 100 sessioni è effettivamente un valore basso per un sito con media 250, e 385 è alto rispetto ai quartili. La decisione, ancora una volta, spetta all&#8217;analista.</p>
<p>R offre un modo elegante per visualizzare le anomalie con il metodo di Tukey — il boxplot:</p>
<pre><code class="language-r">boxplot(sessioni, main = "Sessioni giornaliere",
        ylab = "Sessioni", col = "lightblue", outline = TRUE)
# I punti oltre i baffi sono le anomalie secondo Tukey</code></pre>
<p>Il <strong>grande vantaggio</strong> di questo metodo rispetto allo z-score è la robustezza: mediana e quartili non vengono influenzati dagli outlier. Non abbiamo bisogno di assumere che i dati siano normali. Il metodo di Tukey funziona anche con distribuzioni asimmetriche — e per chi lavora con dati web, questa non è una caratteristica da poco.</p>
<p>Il <strong>limite</strong>: il metodo non distingue tra anomalie &#8220;grandi&#8221; e &#8220;enormi&#8221;. Un valore appena fuori dal cardine e uno completamente fuori scala ricevono lo stesso trattamento — sono entrambi &#8220;anomali&#8221;, punto.</p>
<h2 id="metodo-3-grubbs">Metodo 3: il test di Grubbs</h2>
<p>I primi due metodi si basano su regole empiriche: soglie sullo z-score, soglie sull&#8217;IQR. Ma se vogliamo un approccio formale — con un <a href="https://www.gironi.it/blog/il-test-delle-ipotesi/">test di ipotesi</a> vero e proprio — possiamo ricorrere al <strong>test di Grubbs</strong>.</p>
<p>L&#8217;idea è questa: prendiamo il valore più estremo del dataset (quello più lontano dalla media) e ci chiediamo se è compatibile con il resto dei dati, oppure se è &#8220;troppo&#8221; estremo per essere frutto del caso.</p>
<p>Le ipotesi sono:</p>
<ul>
<li>\(H_0\): non ci sono outlier nel dataset</li>
<li>\(H_1\): il valore più estremo è un outlier</li>
</ul>
<p>La statistica del test è:</p>
<p>\(<br />
G = \frac{\max |x_i &#8211; \bar{x}|}{s} \\<br />
\)</p>
<p>dove \(\bar{x}\) è la media e \(s\) la deviazione standard. In altri termini, \(G\) è il massimo z-score in valore assoluto. Il valore critico si ricava dalla <a href="https://www.gironi.it/blog/la-distribuzione-t-e-il-test-delle-ipotesi/">distribuzione t di Student</a> con \(n-2\) gradi di libertà.</p>
<p>Applichiamo il test in R usando il pacchetto <code>outliers</code>:</p>
<pre><code class="language-r">library(outliers)

risultato &lt;- grubbs.test(sessioni)
print(risultato)</code></pre>
<p>Il risultato:</p>
<pre><code>Grubbs test for one outlier
data:  sessioni
G = 5.9228, U = 0.9037, p-value = 2.339e-07
alternative hypothesis: highest value 580 is an outlier</code></pre>
<p>Il test identifica 580 (il picco del giorno 120, il nostro &#8220;articolo virale&#8221;) come outlier, con un p-value praticamente nullo. L&#8217;evidenza è schiacciante: quel valore non è compatibile con il resto della distribuzione.</p>
<p>Ma va tenuto bene a mente un <strong>limite fondamentale</strong> del test di Grubbs: <strong>testa un solo outlier alla volta</strong> — il più estremo. Se sospettiamo la presenza di anomalie multiple (come nel nostro caso), dobbiamo applicare il test in modo iterativo: rimuovere l&#8217;outlier identificato, ricalcolare, testare di nuovo.</p>
<p>Facciamolo:</p>
<pre><code class="language-r">dati &lt;- sessioni
outlier_trovati &lt;- c()

for(i in 1:5) {
  g &lt;- grubbs.test(dati)
  if(g$p.value &lt; 0.05) {
    # Estraggo il valore outlier dal risultato
    outlier_val &lt;- as.numeric(gsub("[^0-9.]", "",
                     regmatches(g$alternative,
                     regexpr("[0-9.]+", g$alternative))))
    outlier_trovati &lt;- c(outlier_trovati, outlier_val)
    dati &lt;- dati[dati != outlier_val]
    cat("Iterazione", i, "- Outlier:", outlier_val,
        "- p-value:", format(g$p.value, digits = 3), "\n")
  } else {
    cat("Iterazione", i, "- Nessun outlier (p =",
        round(g$p.value, 3), ")\n")
    break
  }
}</code></pre>
<p>Questo approccio iterativo è efficace, ma <strong>insidioso</strong>: ogni volta che rimuoviamo un valore, cambiamo la distribuzione. La media e la deviazione standard si spostano, e ciò che prima non era anomalo potrebbe diventarlo. È un procedimento da usare con cautela e consapevolezza.</p>
<h2 id="confronto-tre-metodi">Confronto tra i tre metodi</h2>
<p>Abbiamo applicato tre metodi allo stesso dataset. Vediamo cosa ha trovato ciascuno:</p>
<table>
<thead>
<tr>
<th>Giorno</th>
<th>Sessioni</th>
<th>Evento simulato</th>
<th>Z-score (|z|&gt;3)</th>
<th>IQR/Tukey</th>
<th>Grubbs</th>
</tr>
</thead>
<tbody>
<tr>
<td>45</td>
<td>38</td>
<td>Problema tecnico</td>
<td>Si</td>
<td>Si</td>
<td>Si (iter.)</td>
</tr>
<tr>
<td>120</td>
<td>580</td>
<td>Articolo virale</td>
<td>Si</td>
<td>Si</td>
<td>Si (1a iter.)</td>
</tr>
<tr>
<td>200</td>
<td>22</td>
<td>Update Google</td>
<td>Si</td>
<td>Si</td>
<td>Si (iter.)</td>
</tr>
<tr>
<td>300</td>
<td>510</td>
<td>Menzione social</td>
<td>Si</td>
<td>Si</td>
<td>Si (iter.)</td>
</tr>
<tr>
<td>350</td>
<td>15</td>
<td>Server down</td>
<td>Si</td>
<td>Si</td>
<td>Si (iter.)</td>
</tr>
<tr>
<td>59</td>
<td>100</td>
<td>(nessuno)</td>
<td>No</td>
<td>Si</td>
<td>No</td>
</tr>
<tr>
<td>118</td>
<td>385</td>
<td>(nessuno)</td>
<td>No</td>
<td>Si</td>
<td>No</td>
</tr>
</tbody>
</table>
<p>Le cinque anomalie iniettate vengono trovate da tutti e tre i metodi. Il metodo di Tukey è il più sensibile: segnala anche due valori al confine che gli altri metodi lasciano passare. Lo z-score con soglia 3 è preciso ma dipende dall&#8217;ipotesi di normalità. Grubbs è il più formale ma richiede l&#8217;approccio iterativo per anomalie multiple.</p>
<p>La lezione importante è: <strong>non esiste il metodo giusto in assoluto</strong>. Esiste il metodo giusto per quei dati e per quella domanda. Nella pratica quotidiana, un approccio sensato è applicare più di un metodo e concentrarsi sui valori che vengono segnalati in modo concorde.</p>
<p>Riassumiamo in R i tre metodi a confronto:</p>
<pre><code class="language-r"># Creo un riepilogo per ogni giorno
riepilogo &lt;- data.frame(
  giorno = 1:n,
  sessioni = sessioni,
  z_score = round(z, 2),
  anomalia_z = abs(z) &gt; 3,
  anomalia_iqr = sessioni &lt; limite_inf | sessioni &gt; limite_sup
)

# Mostro solo le righe anomale per almeno un metodo
anomale &lt;- riepilogo[riepilogo$anomalia_z | riepilogo$anomalia_iqr, ]
print(anomale)</code></pre>
<h2 id="prova-tu">Prova tu</h2>
<p>Un e-commerce ha monitorato il CTR delle proprie pagine prodotto per 30 giorni. Ecco i dati:</p>
<pre><code class="language-r">ctr &lt;- c(3.2, 2.8, 3.1, 2.9, 3.0, 3.3, 2.7, 3.1, 2.8, 3.0,
         0.4, 3.2, 2.9, 3.1, 2.8, 3.0, 2.9, 7.8, 3.1, 2.7,
         3.0, 3.2, 2.8, 3.1, 2.9, 3.0, 2.8, 3.1, 3.0, 2.9)</code></pre>
<p>Il giorno 11 e il giorno 18 sembrano sospetti. Applica i tre metodi: lo z-score con soglia |z| &gt; 3, il metodo di Tukey e il test di Grubbs. Tutti e tre concordano? Quale dei due valori è più chiaramente anomalo, e perché?</p>
<hr />
<p>Fin qui abbiamo trattato ogni osservazione come indipendente dalle altre. Abbiamo chiesto: &#8220;questo valore è compatibile con la distribuzione complessiva?&#8221; Ma i dati di traffico web hanno una struttura temporale: trend, stagionalità, cicli settimanali. Un calo del 30% a dicembre potrebbe essere perfettamente normale per un sito B2B, mentre lo stesso calo a settembre sarebbe allarmante.</p>
<p>Per distinguere un&#8217;anomalia reale dalla semplice stagionalità servono strumenti diversi — la decomposizione delle serie storiche in trend, componente stagionale e residuo. Sarà l&#8217;argomento di un prossimo articolo.</p>
<hr />
<h3 id="per-approfondire">Per approfondire</h3>
<p>Per chi volesse approfondire il tema dei valori anomali e del ragionamento statistico sui dati inattesi, <em>L&#8217;arte della statistica</em> di David Spiegelhalter è una lettura che affronta il problema con chiarezza e numerosi esempi dal mondo reale. <a href="https://www.amazon.it/dp/8806246623?tag=consulenzeinf-21&#038;ascsubtag=anomaly-detection" rel="nofollow sponsored noopener" target="_blank">Si trova qui</a>.</p>
<p>Per una trattazione più formale dei test per outlier (Grubbs, Rosner, Dixon), il manuale <em>Statistica</em> di Newbold, Carlson e Thorne offre la copertura completa con esercizi. <a href="https://www.amazon.it/dp/8891910651?tag=consulenzeinf-21&#038;ascsubtag=anomaly-detection" rel="nofollow sponsored noopener" target="_blank">Si trova qui</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.gironi.it/blog/anomaly-detection/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Statistica bayesiana: come imparare dai dati, un passo alla volta</title>
		<link>https://www.gironi.it/blog/statistica-bayesiana/</link>
					<comments>https://www.gironi.it/blog/statistica-bayesiana/#respond</comments>
		
		<dc:creator><![CDATA[paolo]]></dc:creator>
		<pubDate>Sat, 21 Feb 2026 14:38:18 +0000</pubDate>
				<category><![CDATA[statistica]]></category>
		<guid isPermaLink="false">https://www.gironi.it/blog/?p=3407</guid>

					<description><![CDATA[Abbiamo avuto modo di esaminare, nel corso dei precedenti articoli, l&#8217;inferenza statistica da una prospettiva precisa e coerente: formulare un&#8217;ipotesi, raccogliere dati, calcolare un p-value, costruire un intervallo di confidenza. Abbiamo condotto test delle ipotesi, confrontato varianti con l&#8217;A/B testing, e visto con il Teorema del Limite Centrale perché tutto questo funziona anche quando i &#8230; <a href="https://www.gironi.it/blog/statistica-bayesiana/" class="more-link">Leggi tutto<span class="screen-reader-text"> "Statistica bayesiana: come imparare dai dati, un passo alla volta"</span></a>]]></description>
										<content:encoded><![CDATA[<p>Abbiamo avuto modo di esaminare, nel corso dei precedenti articoli, l&#8217;inferenza statistica da una prospettiva precisa e coerente: formulare un&#8217;ipotesi, raccogliere dati, calcolare un p-value, costruire un <a href="https://www.gironi.it/blog/intervalli-di-confidenza/">intervallo di confidenza</a>. Abbiamo condotto <a href="https://www.gironi.it/blog/il-test-delle-ipotesi/">test delle ipotesi</a>, confrontato varianti con l&#8217;<a href="https://www.gironi.it/blog/ab-testing/">A/B testing</a>, e visto con il <a href="https://www.gironi.it/blog/teorema-del-limite-centrale/">Teorema del Limite Centrale</a> perché tutto questo funziona anche quando i dati non sono normali.</p>
<p>Questo approccio &mdash; che si chiama <strong>frequentista</strong> &mdash; ha una logica chiara: il parametro che vogliamo stimare è un valore fisso (anche se sconosciuto), e noi lo &#8220;inseguiamo&#8221; con i dati. Ma esiste un altro modo di pensare l&#8217;incertezza, un modo che permette di <strong>aggiornare le nostre convinzioni</strong> man mano che arrivano nuovi dati. Si chiama <strong>approccio bayesiano</strong>, e in questo articolo ne costruiamo le fondamenta.</p>
<p>Partiamo da un esempio concreto. Immaginiamo di aver appena lanciato una campagna di advertising e di non conoscere il vero tasso di click. Abbiamo un&#8217;opinione iniziale, basata sull&#8217;esperienza (&#8220;di solito i tassi di click stanno tra lo 0% e il 20%&#8221;), e poi arrivano i dati. L&#8217;approccio bayesiano ci permette di combinare la nostra opinione iniziale con i dati osservati per ottenere una stima aggiornata &mdash; e di ripetere questo processo ogni volta che arrivano nuove informazioni.</p>
<p><span id="more-3407"></span></p>
<div style="border: 1px solid #ccc; padding: 1.2em 1.5em; margin: 1.5em 0; border-radius: 6px;">
<h3 style="margin-top: 0;">Di cosa parleremo</h3>
<ul>
<li><a href="#frequentisti-e-bayesiani">Due modi di pensare l&#8217;incertezza: frequentisti e bayesiani</a></li>
<li><a href="#teorema-di-bayes">Il Teorema di Bayes</a></li>
<li><a href="#esempio-numerico">Esempio numerico: il tasso di click di una campagna ads</a></li>
<li><a href="#aggiornamento-sequenziale">L&#8217;aggiornamento sequenziale: il posterior di oggi è il prior di domani</a></li>
<li><a href="#prior-informativi">Prior informativi e non informativi</a></li>
<li><a href="#credible-vs-confidence">Credible interval vs confidence interval</a></li>
<li><a href="#quando-usare-bayesiano">Quando usare l&#8217;approccio bayesiano</a></li>
<li><a href="#prova-tu">Prova tu</a></li>
<li><a href="#per-approfondire">Per approfondire</a></li>
</ul>
</div>
<hr />
<h2 id="frequentisti-e-bayesiani">Due modi di pensare l&#8217;incertezza: frequentisti e bayesiani</h2>
<p>Prima di entrare nella meccanica, chiariamo la differenza concettuale tra i due approcci. Non si tratta di una guerra: sono due modi diversi di rispondere alle stesse domande.</p>
<table>
<thead>
<tr>
<th></th>
<th><strong>Frequentista</strong></th>
<th><strong>Bayesiano</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Il parametro</strong></td>
<td>È un valore fisso (sconosciuto)</td>
<td>È una variabile casuale con una distribuzione</td>
</tr>
<tr>
<td><strong>La probabilità</strong></td>
<td>Frequenza relativa di un evento su ripetizioni infinite</td>
<td>Grado di credenza (belief) su un evento</td>
</tr>
<tr>
<td><strong>L&#8217;incertezza</strong></td>
<td>Espressa tramite intervalli di confidenza</td>
<td>Espressa tramite credible intervals</td>
</tr>
<tr>
<td><strong>I dati precedenti</strong></td>
<td>Non entrano nel modello</td>
<td>Si incorporano tramite il prior</td>
</tr>
<tr>
<td><strong>Interpretazione dell&#8217;IC/CI</strong></td>
<td>&#8220;Se ripetessi 100 volte, 95 intervalli conterrebbero il parametro&#8221;</td>
<td>&#8220;C&#8217;è il 95% di probabilità che il parametro sia in questo intervallo&#8221;</td>
</tr>
</tbody>
</table>
<p>L&#8217;approccio frequentista, quello che abbiamo usato finora, tratta il parametro come un numero fisso e ragiona sulla distribuzione dei dati. L&#8217;approccio bayesiano capovolge la prospettiva: tratta i dati come fissi (li abbiamo osservati, non cambiano) e ragiona sulla <strong>distribuzione del parametro</strong>, cioè su quanto crediamo plausibili i vari valori che il parametro potrebbe assumere.</p>
<p>Il vantaggio pratico del bayesiano è che può <strong>incorporare conoscenza pregressa</strong>. Se sappiamo qualcosa sul parametro prima di raccogliere i dati (per esperienza, per studi precedenti, per buon senso), possiamo usare quella conoscenza. E poi aggiornarla.</p>
<hr />
<h2 id="teorema-di-bayes">Il Teorema di Bayes</h2>
<p>Il cuore dell&#8217;approccio bayesiano è una formula che risale al 1763, al reverendo Thomas Bayes. Partiamo dalla probabilità condizionata: la probabilità di A dato B.</p>
<p>Sappiamo dalla teoria della probabilità che:</p>
<p>\(<br />
P(A|B) = \frac{P(A \cap B)}{P(B)} \\<br />
\)</p>
<p>e simmetricamente:</p>
<p>\(<br />
P(B|A) = \frac{P(A \cap B)}{P(A)} \\<br />
\)</p>
<p>Da queste due relazioni, ricavando \(P(A \cap B)\) dalla seconda e sostituendo nella prima, otteniamo il <strong>Teorema di Bayes</strong>:</p>
<p>\(<br />
P(A|B) = \frac{P(B|A) \cdot P(A)}{P(B)} \\<br />
\)</p>
<p>Fin qui è algebra. La magia avviene quando applichiamo questa formula al nostro problema: stimare un parametro \(\theta\) (ad esempio, il tasso di click) a partire dai dati osservati. Il teorema diventa:</p>
<p>\(<br />
P(\theta | \text{dati}) = \frac{P(\text{dati} | \theta) \cdot P(\theta)}{P(\text{dati})} \\<br />
\)</p>
<p>Ogni pezzo di questa formula ha un nome e un ruolo preciso:</p>
<ul>
<li><strong>Prior</strong> \(P(\theta)\): ciò che crediamo sul parametro <em>prima</em> di vedere i dati. È la nostra conoscenza pregressa, il nostro punto di partenza.</li>
<li><strong>Likelihood</strong> \(P(\text{dati} | \theta)\): quanto i dati osservati sono compatibili con ciascun valore possibile di \(\theta\). È la stessa funzione di verosimiglianza che compare anche nell&#8217;approccio frequentista.</li>
<li><strong>Posterior</strong> \(P(\theta | \text{dati})\): ciò che crediamo sul parametro <em>dopo</em> aver visto i dati. È il risultato finale, la nostra conoscenza aggiornata.</li>
<li><strong>Evidence</strong> \(P(\text{dati})\): la probabilità marginale dei dati. In pratica, è una costante di normalizzazione che fa sì che il posterior sia una distribuzione di probabilità valida.</li>
</ul>
<p>Poiché l&#8217;evidence è costante (non dipende da \(\theta\)), possiamo scrivere la relazione fondamentale:</p>
<p>\(<br />
P(\theta | \text{dati}) \propto P(\text{dati} | \theta) \cdot P(\theta) \\<br />
\)</p>
<p>In parole: <strong>il posterior è proporzionale al likelihood moltiplicato per il prior</strong>. Più dati raccogliamo, più il likelihood &#8220;domina&#8221; e il posterior si concentra attorno ai valori supportati dai dati. Ma con pochi dati, il prior conta &mdash; e conta molto.</p>
<hr />
<h2 id="esempio-numerico">Esempio numerico: il tasso di click di una campagna ads</h2>
<p>Passiamo alla pratica. Abbiamo lanciato una campagna pubblicitaria: l&#8217;annuncio è stato mostrato 100 volte e ha ricevuto 13 click. Qual è il vero tasso di click?</p>
<p><strong>Il prior</strong>: non sappiamo quasi nulla, ma per esperienza riteniamo che i tassi di click stiano tipicamente tra lo 0% e il 20%. Modelliamo questa incertezza con una distribuzione uniforme su [0, 0.20].</p>
<p><strong>L&#8217;approccio</strong>: usiamo una simulazione. Generiamo molti valori plausibili dal prior, simuliamo i dati che ciascun valore produrrebbe, e teniamo solo quelli compatibili con ciò che abbiamo effettivamente osservato (13 click su 100). Ciò che rimane è il posterior.</p>
<pre><code class="language-r">set.seed(42)

n_samples <- 100000
n_ads_shown <- 100
n_clicks_observed <- 13

# 1. Generiamo campioni dal prior: uniforme tra 0 e 0.20
proportion_clicks <- runif(n_samples, min = 0.0, max = 0.20)

# 2. Per ogni valore di proporzione, simuliamo quanti click otterremmo
n_visitors <- rbinom(n_samples, size = n_ads_shown, prob = proportion_clicks)

# 3. Costruiamo il data frame con prior e dati simulati
prior <- data.frame(proportion_clicks, n_visitors)

# 4. Conditioning: teniamo solo i campioni compatibili con 13 click
posterior <- prior[prior$n_visitors == n_clicks_observed, ]

cat("Campioni nel prior:", nrow(prior), "\n")
cat("Campioni nel posterior:", nrow(posterior), "\n")
cat("Media del posterior:", round(mean(posterior$proportion_clicks) * 100, 1), "%\n")
cat("Mediana del posterior:", round(median(posterior$proportion_clicks) * 100, 1), "%\n")</code></pre>
<p>Risultato: dei 100.000 campioni iniziali, circa 4.700 sopravvivono al conditioning (il numero esatto varia per via della simulazione). La media e la mediana del posterior sono circa il 13.4%: un valore molto vicino ai 13 click su 100 che abbiamo osservato.</p>
<p>Visualizziamo la trasformazione dal prior al posterior:</p>
<pre><code class="language-r">par(mfrow = c(1, 2))

# Prior
hist(prior$proportion_clicks, breaks = 30, probability = TRUE,
     main = "Prior\n(uniforme 0-20%)",
     col = "lightyellow", xlab = "Tasso di click",
     ylab = "Densità", xlim = c(0, 0.25))

# Posterior
hist(posterior$proportion_clicks, breaks = 30, probability = TRUE,
     main = "Posterior\n(dopo 13/100 click)",
     col = "lightblue", xlab = "Tasso di click",
     ylab = "Densità", xlim = c(0, 0.25))</code></pre>
<p>La differenza è evidente. Il prior è una distribuzione piatta (uniforme): tutti i valori tra 0% e 20% sono considerati ugualmente plausibili. Il posterior, invece, si concentra attorno al 13%, con una forma a campana. I dati hanno "informato" la nostra incertezza.</p>
<p><strong>Il credible interval al 95%:</strong></p>
<pre><code class="language-r">ci_95 <- quantile(posterior$proportion_clicks, probs = c(0.025, 0.975))
cat("Credible interval al 95%:", round(ci_95[1] * 100, 1), "% -",
    round(ci_95[2] * 100, 1), "%\n")</code></pre>
<p>Il credible interval al 95% è circa 7.7% - 19.1%. Questo significa esattamente ciò che sembra: c'è il 95% di probabilità che il vero tasso di click sia compreso tra il 7.7% e il 19.1%.</p>
<p><strong>Confronto con l'IC frequentista:</strong></p>
<pre><code class="language-r">prop_test <- prop.test(13, 100, correct = FALSE)
cat("IC frequentista al 95%:", round(prop_test$conf.int[1] * 100, 1), "% -",
    round(prop_test$conf.int[2] * 100, 1), "%\n")</code></pre>
<p>L'IC frequentista al 95% è circa 7.8% - 21.0%. I numeri sono simili, ma l'interpretazione è diversa: l'IC frequentista ci dice che "se ripetessimo il campionamento 100 volte, 95 intervalli conterrebbero il vero parametro". Il credible interval bayesiano ci dice direttamente la probabilità che il parametro sia nell'intervallo. Quest'ultima è l'interpretazione che la maggior parte delle persone <em>crede</em> di dare all'intervallo di confidenza &mdash; ma che, nell'approccio frequentista, è tecnicamente scorretta.</p>
<hr />
<h2 id="aggiornamento-sequenziale">L'aggiornamento sequenziale: il posterior di oggi è il prior di domani</h2>
<p>Ecco il punto in cui l'approccio bayesiano rivela la sua eleganza. Supponiamo che la campagna continui: dopo altri giorni, abbiamo 150 nuove impression e 20 nuovi click. Come aggiorniamo la nostra stima?</p>
<p>Il principio è semplice: <strong>il posterior che abbiamo appena calcolato diventa il nuovo prior</strong>. Non dobbiamo ricominciare da zero; partiamo da dove eravamo rimasti.</p>
<pre><code class="language-r"># Il posterior precedente diventa il nuovo prior
prior_aggiornato <- posterior

# Nuovi dati: 150 impression, 20 click
n_ads_nuovi <- 150
n_clicks_nuovi <- 20

# Simuliamo i dati con le proporzioni del prior aggiornato
n_samples_aggiornato <- nrow(prior_aggiornato)
prior_aggiornato$n_visitors <- rbinom(n_samples_aggiornato,
                                       size = n_ads_nuovi,
                                       prob = prior_aggiornato$proportion_clicks)

# Conditioning: teniamo solo i campioni compatibili con 20 click
posterior_aggiornato <- prior_aggiornato[prior_aggiornato$n_visitors == n_clicks_nuovi, ]

cat("Campioni nel posterior aggiornato:", nrow(posterior_aggiornato), "\n")
cat("Media:", round(mean(posterior_aggiornato$proportion_clicks) * 100, 1), "%\n")

# Nuovo credible interval
ci_aggiornato <- quantile(posterior_aggiornato$proportion_clicks, probs = c(0.025, 0.975))
cat("Credible interval al 95%:", round(ci_aggiornato[1] * 100, 1), "% -",
    round(ci_aggiornato[2] * 100, 1), "%\n")</code></pre>
<p>In totale ora abbiamo osservato 33 click su 250 impression (13.2%). La media del posterior aggiornato è circa il 13.5%, e il credible interval al 95% si è ristretto a circa 9.6% - 17.9% (rispetto al 7.7% - 19.1% precedente). La distribuzione si è "stretta": abbiamo più dati, quindi siamo più sicuri.</p>
<p>Visualizziamo l'evoluzione:</p>
<pre><code class="language-r">par(mfrow = c(1, 3))

# Prior originale
hist(runif(10000, 0, 0.20), breaks = 30, probability = TRUE,
     main = "1. Prior originale\n(uniforme 0-20%)",
     col = "lightyellow", xlab = "Tasso di click",
     ylab = "Densità", xlim = c(0, 0.25))

# Posterior dopo primi dati (13/100)
hist(posterior$proportion_clicks, breaks = 30, probability = TRUE,
     main = "2. Dopo 13/100 click",
     col = "lightblue", xlab = "Tasso di click",
     ylab = "Densità", xlim = c(0, 0.25))

# Posterior dopo secondi dati (33/250 totali)
hist(posterior_aggiornato$proportion_clicks, breaks = 30, probability = TRUE,
     main = "3. Dopo 33/250 click",
     col = "lightgreen", xlab = "Tasso di click",
     ylab = "Densità", xlim = c(0, 0.25))</code></pre>
<p>Il messaggio visivo è immediato: la distribuzione si sposta e si stringe. Da un'incertezza totale (tutto tra 0% e 20%), passando per una stima ragionevole (centrata sul 13%), arriviamo a una stima più precisa attorno al 13.2%. Più dati raccogliamo, più il posterior si concentra attorno al valore vero.</p>
<p>Questo è l'<strong>aggiornamento bayesiano</strong>: un processo iterativo in cui l'informazione si accumula. Non buttiamo via niente di ciò che sapevamo prima; lo integriamo con le nuove evidenze.</p>
<hr />
<h2 id="prior-informativi">Prior informativi e non informativi</h2>
<p>Negli esempi precedenti abbiamo usato un prior uniforme: "tutti i valori tra 0% e 20% sono ugualmente plausibili". Questo si chiama <strong>prior non informativo</strong> (o debolmente informativo): non esprime una preferenza forte per nessun valore.</p>
<p>Ma nella pratica spesso <em>sappiamo</em> qualcosa. Se abbiamo già gestito molte campagne pubblicitarie, sappiamo che i tassi di click stanno tipicamente tra il 5% e il 15%, con una concentrazione attorno al 10%. Possiamo esprimere questa conoscenza con un <strong>prior informativo</strong>, ad esempio una distribuzione centrata su 0.10 con dispersione ridotta.</p>
<p>Confrontiamo i due approcci sugli stessi dati (13 click su 100 impression):</p>
<pre><code class="language-r">set.seed(42)

n_samples <- 100000
n_ads_shown <- 100
n_clicks_observed <- 13

# --- Prior non informativo: uniforme (0, 0.20) ---
prior_flat <- runif(n_samples, min = 0.0, max = 0.20)
sim_flat <- rbinom(n_samples, size = n_ads_shown, prob = prior_flat)
posterior_flat <- prior_flat[sim_flat == n_clicks_observed]

# --- Prior informativo: centrato su 10%, concentrato tra 5% e 15% ---
# Usiamo una distribuzione beta(20, 180) che ha media ~10% e varianza ridotta
prior_info <- rbeta(n_samples, shape1 = 20, shape2 = 180)
sim_info <- rbinom(n_samples, size = n_ads_shown, prob = prior_info)
posterior_info <- prior_info[sim_info == n_clicks_observed]

# Confronto
cat("=== Prior non informativo (uniforme) ===\n")
cat("Media posterior:", round(mean(posterior_flat) * 100, 1), "%\n")
cat("Credible interval 95%:", round(quantile(posterior_flat, 0.025) * 100, 1), "% -",
    round(quantile(posterior_flat, 0.975) * 100, 1), "%\n\n")

cat("=== Prior informativo (centrato su 10%) ===\n")
cat("Media posterior:", round(mean(posterior_info) * 100, 1), "%\n")
cat("Credible interval 95%:", round(quantile(posterior_info, 0.025) * 100, 1), "% -",
    round(quantile(posterior_info, 0.975) * 100, 1), "%\n")</code></pre>
<p>Il posterior con prior informativo è leggermente "tirato" verso il 10% (la nostra esperienza pregressa), mentre quello con prior uniforme segue più fedelmente i dati. Con 13 click su 100, la differenza è modesta; ma con 5 click su 20, sarebbe molto più marcata.</p>
<p>Visualizziamo:</p>
<pre><code class="language-r">par(mfrow = c(1, 2))

hist(posterior_flat, breaks = 30, probability = TRUE,
     main = "Posterior con prior\nnon informativo",
     col = "lightyellow", xlab = "Tasso di click",
     ylab = "Densità", xlim = c(0, 0.25))

hist(posterior_info, breaks = 30, probability = TRUE,
     main = "Posterior con prior\ninformativo (10%)",
     col = "lightcoral", xlab = "Tasso di click",
     ylab = "Densità", xlim = c(0, 0.25))</code></pre>
<p>Questa è una proprietà fondamentale dell'inferenza bayesiana: <strong>con pochi dati, il prior conta molto; con molti dati, il prior viene "sommerso" dai dati</strong>. Se avessimo 10.000 impression e 1.300 click, i due posterior sarebbero praticamente identici, indipendentemente dal prior scelto. I dati, alla lunga, vincono sempre.</p>
<hr />
<h2 id="credible-vs-confidence">Credible interval vs confidence interval</h2>
<p>Questo è il punto in cui le strade si separano in modo chiaro. Nell'articolo sugli <a href="https://www.gironi.it/blog/intervalli-di-confidenza/">intervalli di confidenza</a> abbiamo visto un punto fondamentale: l'intervallo di confidenza al 95% <strong>non</strong> significa che c'è il 95% di probabilità che il parametro sia nell'intervallo. È una proprietà della procedura, non del singolo intervallo.</p>
<p>Il <strong>credible interval</strong> bayesiano al 95%, invece, significa <strong>esattamente</strong> quello che sembra: c'è il 95% di probabilità che il parametro si trovi in quell'intervallo. È un'affermazione diretta su ciò che non conosciamo, non un'affermazione sulla procedura.</p>
<p>Rivediamo i numeri del nostro esempio (13 click su 100 impression):</p>
<table>
<thead>
<tr>
<th></th>
<th><strong>Frequentista (IC)</strong></th>
<th><strong>Bayesiano (credible interval)</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Intervallo</strong></td>
<td>~7.8% - 21.0%</td>
<td>~7.7% - 19.1%</td>
</tr>
<tr>
<td><strong>Interpretazione</strong></td>
<td>"Se ripetessimo l'esperimento 100 volte, 95 intervalli conterrebbero il vero parametro"</td>
<td>"C'è il 95% di probabilità che il vero parametro sia in questo intervallo"</td>
</tr>
<tr>
<td><strong>Il parametro</strong></td>
<td>È un valore fisso; l'intervallo è casuale</td>
<td>La nostra credenza sul parametro è descritta da una distribuzione</td>
</tr>
<tr>
<td><strong>Dipende dal prior?</strong></td>
<td>No</td>
<td>Sì</td>
</tr>
</tbody>
</table>
<p>I numeri sono simili &mdash; e questo non è un caso. Con campioni grandi e prior non informativi, i due approcci convergono. Ma l'interpretazione è profondamente diversa, e il credible interval è molto più intuitivo: "c'è il 95% di probabilità che il tasso di click sia tra il 7.7% e il 19.1%" è una frase che chiunque può comprendere e usare per prendere decisioni.</p>
<hr />
<h2 id="quando-usare-bayesiano">Quando usare l'approccio bayesiano</h2>
<p>Non c'è un vincitore assoluto. La scelta dipende dal contesto:</p>
<p><strong>L'approccio bayesiano funziona particolarmente bene quando:</strong></p>
<ul>
<li>Abbiamo <strong>pochi dati</strong> ma una conoscenza pregressa ragionevole. Il prior ci permette di ottenere stime sensate anche con campioni piccoli.</li>
<li>Ci serve un <strong>aggiornamento continuo</strong>: i dati arrivano nel tempo e vogliamo aggiornare la nostra stima progressivamente, senza ricominciare ogni volta da zero.</li>
<li>Vogliamo <strong>comunicare l'incertezza</strong> in modo diretto. Il credible interval è molto più intuitivo dell'intervallo di confidenza: dire "c'è il 90% di probabilità che il tasso di conversione sia tra il 3% e il 7%" è chiaro anche per chi non ha formazione statistica.</li>
</ul>
<p><strong>L'approccio frequentista resta preferibile quando:</strong></p>
<ul>
<li>Servono <strong>risultati standardizzati e ripetibili</strong>. I test frequentisti non dipendono da scelte soggettive (come il prior), e questo li rende più facili da confrontare e replicare.</li>
<li>Lavoriamo in contesti dove le <strong>convenzioni</strong> sono stabilite (pubblicazioni scientifiche, report regolamentari).</li>
<li>Abbiamo <strong>grandi campioni</strong>: con molti dati, i due approcci danno risultati praticamente identici, e il frequentista è spesso più semplice da implementare.</li>
</ul>
<p>Nella pratica, molti professionisti usano entrambi gli approcci a seconda del contesto. L'A/B testing, ad esempio, può essere condotto in modo frequentista (come abbiamo visto nell'<a href="https://www.gironi.it/blog/ab-testing/">articolo dedicato</a>) o in modo bayesiano &mdash; e alcune piattaforme di testing usano proprio l'approccio bayesiano per poter aggiornare i risultati in tempo reale.</p>
<hr />
<h2 id="verso-distribuzione-beta">Verso la distribuzione Beta</h2>
<p>Abbiamo visto come l'aggiornamento bayesiano funzioni con la simulazione: generare campioni, simulare dati, filtrare. È un metodo potente e intuitivo, ma ha un limite pratico: ad ogni passaggio perdiamo campioni. Dopo due aggiornamenti, dei 100.000 campioni iniziali ne rimangono pochi.</p>
<p>La buona notizia è che, per il caso delle proporzioni (tassi di click, tassi di conversione, percentuali di successo), esiste una soluzione analitica elegante. La <a href="https://www.gironi.it/blog/la-distribuzione-beta-spiegata-semplice/">distribuzione Beta</a>, che abbiamo già incontrato, è la distribuzione naturale per descrivere la nostra incertezza su una proporzione. E quando il prior è una distribuzione Beta e i dati sono binomiali (successo/insuccesso), il posterior è <em>ancora</em> una distribuzione Beta &mdash; con parametri aggiornati.</p>
<p>Questo significa che l'intero aggiornamento bayesiano si riduce a una semplice operazione sui parametri, senza bisogno di simulazioni. Ma questa è una storia per il prossimo articolo.</p>
<hr />
<h2 id="prova-tu">Prova tu</h2>
<p>Un e-commerce ha un tasso di conversione storico intorno al 3%. Dopo un redesign della pagina prodotto, su 200 visite si osservano 10 conversioni (5%).</p>
<ol>
<li>Costruisci un modello bayesiano con <strong>prior uniforme tra 0% e 10%</strong> (incertezza iniziale: il tasso potrebbe essere qualsiasi valore in quel range).</li>
<li>Usa la simulazione (come nell'esempio dell'articolo) per ottenere il posterior.</li>
<li>Calcola il <strong>credible interval al 95%</strong>.</li>
<li>Calcola la <strong>probabilità che il vero tasso di conversione sia superiore al 3%</strong>.</li>
</ol>
<p>Suggerimento: il codice è quasi identico a quello dell'esempio sulla campagna ads. Cambia il prior (<code>runif(n, 0, 0.10)</code>), il numero di visite (200) e il numero di conversioni osservate (10). Per la domanda 4, conta quanti campioni del posterior sono superiori a 0.03 e dividi per il totale.</p>
<hr />
<h3 id="per-approfondire">Per approfondire</h3>
<p>Se vuoi esplorare la statistica bayesiana con un approccio accessibile e sorprendentemente divertente, <a href="https://www.amazon.it/dp/1593279566?tag=consulenzeinf-21&#038;ascsubtag=statistica-bayesiana" target="_blank" rel="noopener"><em>Bayesian Statistics the Fun Way</em></a> di Will Kurt è una lettura che consiglio. Kurt riesce a spiegare prior, posterior e aggiornamento bayesiano con esempi concreti che non richiedono una laurea in matematica &mdash; e usa R per la parte computazionale, esattamente come facciamo qui. È il libro ideale per chi vuole capire la logica bayesiana prima di affrontare la teoria formale.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.gironi.it/blog/statistica-bayesiana/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>A/B Testing: come condurre esperimenti statisticamente validi (e gli errori da evitare)</title>
		<link>https://www.gironi.it/blog/ab-testing/</link>
					<comments>https://www.gironi.it/blog/ab-testing/#respond</comments>
		
		<dc:creator><![CDATA[paolo]]></dc:creator>
		<pubDate>Fri, 20 Feb 2026 08:48:38 +0000</pubDate>
				<category><![CDATA[statistica]]></category>
		<guid isPermaLink="false">https://www.gironi.it/blog/?p=3385</guid>

					<description><![CDATA[Abbiamo avuto modo di esaminare, nel corso dei precedenti articoli, come funziona il test delle ipotesi e come il t-test per due campioni ci permetta di confrontare due gruppi in modo rigoroso. Abbiamo anche costruito intervalli di confidenza, imparato a quantificare l&#8217;incertezza delle nostre stime, e visto con il Teorema del Limite Centrale perché tutto &#8230; <a href="https://www.gironi.it/blog/ab-testing/" class="more-link">Leggi tutto<span class="screen-reader-text"> "A/B Testing: come condurre esperimenti statisticamente validi (e gli errori da evitare)"</span></a>]]></description>
										<content:encoded><![CDATA[<p>Abbiamo avuto modo di esaminare, nel corso dei precedenti articoli, come funziona il <a href="https://www.gironi.it/blog/il-test-delle-ipotesi/">test delle ipotesi</a> e come il <a href="https://www.gironi.it/blog/il-t-test-per-due-campioni-testare-una-ipotesi-per-campioni-dipendenti-o-indipendenti/">t-test per due campioni</a> ci permetta di confrontare due gruppi in modo rigoroso. Abbiamo anche costruito <a href="https://www.gironi.it/blog/intervalli-di-confidenza/">intervalli di confidenza</a>, imparato a quantificare l&#8217;incertezza delle nostre stime, e visto con il <a href="https://www.gironi.it/blog/teorema-del-limite-centrale/">Teorema del Limite Centrale</a> perché tutto questo funziona anche quando i dati non sono normali.</p>
<p>Ma c&#8217;è una domanda che, nella realtà operativa di chi fa SEO e marketing, si presenta con una frequenza quasi quotidiana: <strong>quale variante funziona meglio?</strong> Quale title tag porta più click? Quale landing page converte di più? Quale meta description attira l&#8217;attenzione? Non è una domanda accademica: è la domanda che separa le decisioni basate sui dati dalle opinioni travestite da strategie.</p>
<p>La buona notizia è che per rispondere abbiamo già tutti gli strumenti. L&#8217;<strong>A/B testing</strong> non è altro che l&#8217;applicazione diretta dei concetti di inferenza statistica che abbiamo costruito passo dopo passo: test delle ipotesi, confronto tra gruppi, significatività. In questo articolo mettiamo tutto insieme.</p>
<p><span id="more-3385"></span></p>
<div style="border: 1px solid #ccc; padding: 1.2em 1.5em; margin: 1.5em 0; border-radius: 6px;">
<h3 style="margin-top: 0;">Di cosa parleremo</h3>
<ul>
<li><a href="#cose-ab-test">Cos&#8217;è un A/B test</a></li>
<li><a href="#formulare-test">Formulare correttamente un A/B test</a></li>
<li><a href="#esempio-landing">Esempio pratico: conversion rate di due landing page</a></li>
<li><a href="#errori-comuni">Gli errori più comuni</a></li>
<li><a href="#frequentista-bayesiano">Approccio frequentista vs bayesiano</a></li>
<li><a href="#esempio-seo">Esempio pratico SEO: meta description A/B test</a></li>
<li><a href="#prova-tu">Prova tu</a></li>
</ul>
</div>
<h2 id="cose-ab-test">Cos&#8217;è un A/B test</h2>
<p>Un A/B test è, nella sua essenza, un <strong>esperimento controllato</strong>: prendiamo due varianti di qualcosa (una pagina, un titolo, una call-to-action), assegniamo casualmente gli utenti a una delle due varianti, e misuriamo quale produce risultati migliori.</p>
<p>La variante <strong>A</strong> è il <strong>controllo</strong> (la versione attuale, quella che stiamo già usando). La variante <strong>B</strong> è il <strong>trattamento</strong> (la nuova versione che vogliamo testare). La logica è la stessa di un esperimento scientifico: cambiamo una sola variabile alla volta, manteniamo tutto il resto costante, e osserviamo se il cambiamento produce un effetto misurabile.</p>
<p>Tre elementi rendono un A/B test affidabile. La <strong>randomizzazione</strong>: gli utenti vengono assegnati a A o B in modo casuale. Questo è fondamentale, perché se mostrassimo A di mattina e B di pomeriggio, ogni differenza osservata potrebbe dipendere dall&#8217;orario, non dalla variante. Il <strong>gruppo di controllo</strong>: senza A come riferimento, non sapremmo se i risultati di B sono buoni o cattivi. E infine una <strong>metrica di successo</strong> definita in anticipo: CTR, tasso di conversione, tempo sulla pagina. La metrica va scelta <em>prima</em> di raccogliere i dati, non dopo (torneremo su questo punto tra poco).</p>
<p>Ma perché serve la statistica? Perché i dati sono rumorosi. Se la variante A ha un CTR del 5.0% e la variante B del 5.3%, quella differenza è reale o è solo fluttuazione casuale? L&#8217;occhio nudo non può distinguere: ci serve un test formale. Ed è esattamente il <strong>test per due campioni</strong> che abbiamo già visto — applicato a proporzioni anziché a medie.</p>
<h2 id="formulare-test">Formulare correttamente un A/B test</h2>
<p>Prima di raccogliere dati, dobbiamo impostare il test in modo rigoroso. Vediamo come.</p>
<p><strong>Scegliere la metrica.</strong> La metrica deve essere chiara, misurabile e direttamente collegata all&#8217;obiettivo. Per un title tag, la metrica naturale è il <strong>CTR</strong> (Click-Through Rate). Per una landing page, il <strong>tasso di conversione</strong>. Per un articolo del blog, magari il <strong>tempo medio sulla pagina</strong>. Va sempre tenuto bene a mente: una metrica vaga (&#8220;la pagina piace di più&#8221;) non è una metrica.</p>
<p><strong>Definire le ipotesi.</strong> Come in ogni test statistico, partiamo da un&#8217;ipotesi nulla e un&#8217;ipotesi alternativa:</p>
<ul>
<li>\(H_0\): le due varianti hanno lo stesso effetto (nessuna differenza tra A e B)</li>
<li>\(H_1\): le due varianti hanno un effetto diverso (esiste una differenza)</li>
</ul>
<p><strong>Il test statistico.</strong> Quando confrontiamo due proporzioni (come due CTR o due tassi di conversione), il test appropriato è lo <strong>z-test per due proporzioni</strong>. La logica è la stessa del t-test per due campioni, ma adattata a dati binari (click/non-click, conversione/non-conversione).</p>
<p>La statistica test si calcola così. Prima, calcoliamo la <strong>proporzione pooled</strong> (combinata), che è la nostra migliore stima della proporzione comune sotto l&#8217;ipotesi nulla:</p>
<p>\(<br />
\hat{p} = \frac{x_1 + x_2}{n_1 + n_2} \\<br />
\)</p>
<p>dove \(x_1\) e \(x_2\) sono i successi (click, conversioni) nei due gruppi, e \(n_1\) e \(n_2\) le dimensioni dei campioni.</p>
<p>Poi calcoliamo la statistica z:</p>
<p>\(<br />
z = \frac{\hat{p}_1 &#8211; \hat{p}_2}{\sqrt{\hat{p}(1-\hat{p})\left(\frac{1}{n_1} + \frac{1}{n_2}\right)}} \\<br />
\)</p>
<p>Al numeratore c&#8217;è la differenza osservata tra le due proporzioni; al denominatore, l&#8217;errore standard sotto l&#8217;ipotesi nulla. Il rapporto ci dice quante &#8220;unità di errore standard&#8221; separano le due proporzioni: più è alto, più la differenza è difficile da attribuire al caso.</p>
<h3>Esempio: CTR di due title tag</h3>
<p>Facciamo un esempio concreto. Abbiamo testato due varianti di title tag per una pagina importante del sito:</p>
<ul>
<li><strong>Title A</strong> (controllo): 1500 impressioni, 75 click → CTR = 5.0%</li>
<li><strong>Title B</strong> (trattamento): 1500 impressioni, 105 click → CTR = 7.0%</li>
</ul>
<p>Il title B sembra migliore, ma la differenza è statisticamente significativa? Calcoliamo passo dopo passo.</p>
<p><strong>Passo 1</strong>: la proporzione pooled:</p>
<p>\(<br />
\hat{p} = \frac{75 + 105}{1500 + 1500} = \frac{180}{3000} = 0.06 \\<br />
\)</p>
<p><strong>Passo 2</strong>: l&#8217;errore standard:</p>
<p>\(<br />
SE = \sqrt{0.06 \times 0.94 \times \left(\frac{1}{1500} + \frac{1}{1500}\right)} = \sqrt{0.0564 \times 0.00133} \approx 0.00867 \\<br />
\)</p>
<p><strong>Passo 3</strong>: la statistica z:</p>
<p>\(<br />
z = \frac{0.07 &#8211; 0.05}{0.00867} \approx 2.31 \\<br />
\)</p>
<p><strong>Passo 4</strong>: il p-value. Per un test a due code, \(p \approx 0.021\).</p>
<p>Dunque: il p-value è inferiore a 0.05. Possiamo rifiutare l&#8217;ipotesi nulla e concludere che la differenza tra i due title tag è statisticamente significativa. Il title B ha un CTR significativamente più alto.</p>
<p>Calcoliamo lo stesso test in R:</p>
<pre><code class="language-r"># Dati
n1 &lt;- 1500; x1 &lt;- 75    # Title A
n2 &lt;- 1500; x2 &lt;- 105   # Title B
p1 &lt;- x1 / n1  # 0.05
p2 &lt;- x2 / n2  # 0.07

# Proporzione pooled e z-test
p_pool &lt;- (x1 + x2) / (n1 + n2)
se &lt;- sqrt(p_pool * (1 - p_pool) * (1/n1 + 1/n2))
z &lt;- (p2 - p1) / se
p_value &lt;- 2 * (1 - pnorm(abs(z)))

cat("z =", round(z, 3), "\n")
cat("p-value =", round(p_value, 4), "\n")</code></pre>
<p>Risultato: z = 2.306, p-value = 0.0211.</p>
<h2 id="esempio-landing">Esempio pratico: conversion rate di due landing page</h2>
<p>Passiamo a un esempio più articolato. Un e-commerce sta testando due varianti della propria landing page:</p>
<ul>
<li><strong>Pagina A</strong> (design attuale): 1000 visitatori, 35 conversioni → tasso di conversione = 3.5%</li>
<li><strong>Pagina B</strong> (nuovo design): 1000 visitatori, 58 conversioni → tasso di conversione = 5.8%</li>
</ul>
<p>La differenza appare sostanziosa (2.3 punti percentuali), ma con questi numeri è sufficiente per escludere il caso?</p>
<p>Verifichiamo in R con <code>prop.test()</code>, che esegue il test per due proporzioni:</p>
<pre><code class="language-r">risultato &lt;- prop.test(
  x = c(35, 58),
  n = c(1000, 1000)
)

print(risultato)</code></pre>
<p>La funzione restituisce il p-value del test e, cosa molto utile, l&#8217;<strong>intervallo di confidenza della differenza</strong> tra le due proporzioni. In questo caso il p-value è circa 0.019 — inferiore a 0.05, quindi la differenza è statisticamente significativa.</p>
<p>Ma è l&#8217;intervallo di confidenza della differenza che ci dà l&#8217;informazione più preziosa: non solo <em>se</em> B è meglio di A, ma <em>di quanto</em>, con quale margine di incertezza. Se l&#8217;IC della differenza va da circa 0.4 a 4.2 punti percentuali, sappiamo che B è quasi certamente migliore, e il miglioramento si colloca in quell&#8217;intervallo. È un&#8217;informazione molto più ricca di un semplice &#8220;sì, è significativo&#8221;.</p>
<p>n.b.: <code>prop.test()</code> applica una <strong>correzione di continuità</strong> (correzione di Yates) che rende il test leggermente più conservativo. Per campioni grandi la differenza è trascurabile; per campioni piccoli, è una cautela benvenuta.</p>
<h2 id="errori-comuni">Gli errori più comuni</h2>
<p>L&#8217;A/B testing è uno strumento potente, ma insidioso. La facilità con cui si può impostare un test nasconde insidie metodologiche serie. Vediamo le più frequenti.</p>
<h3>Fermare il test troppo presto</h3>
<p>È la tentazione più forte: dopo pochi giorni, B sembra nettamente migliore di A. Perché aspettare ancora? Perché quei risultati preliminari sono <strong>rumore</strong>, non segnale.</p>
<p>Il problema ha un nome tecnico: <strong>peeking</strong> (come dicono gli anglosassoni, &#8220;sbirciare&#8221;). Ogni volta che guardiamo i dati intermedi e decidiamo se fermarci, aumentiamo la probabilità di un falso positivo. È come lanciare una moneta: se ci fermiamo ogni volta che esce testa tre volte di fila, concluderemo che la moneta è truccata. Ma non lo è — semplicemente, non le abbiamo dato abbastanza lanci.</p>
<p><strong>Come evitarlo</strong>: definire <em>prima</em> la dimensione campionaria necessaria e attendere di raggiungere quel numero prima di trarre conclusioni. Nel frattempo, puoi usare il nostro <a href="https://www.gironi.it/blog/calcolatore-sample-size-ab-test/">calcolatore di sample size</a> per determinare quanti utenti ti servono prima di avviare il test.</p>
<h3>Testare troppe varianti senza correzione</h3>
<p>Un altro errore frequente: testare tre, quattro, cinque varianti contemporaneamente (A/B/C/D&#8230;) e poi confrontarle tutte a coppie. Il problema è quello delle <strong>comparazioni multiple</strong>: più confronti facciamo, più è probabile trovare almeno un risultato significativo per puro caso.</p>
<p>Con 5 varianti e 10 confronti a coppie, la probabilità di trovare almeno un falso positivo sale dal 5% a quasi il 40%. Non è un dettaglio: è un errore che invalida l&#8217;intero test.</p>
<p><strong>Come evitarlo</strong>: se servono confronti multipli, applicare una <strong>correzione di Bonferroni</strong> (dividere la soglia \(\alpha\) per il numero di confronti) o, meglio ancora, limitarsi a testare una variante alla volta.</p>
<h3>Ignorare la potenza del test</h3>
<p>Il rischio di falso positivo (errore di tipo I, \(\alpha\)) lo conosciamo bene. Ma c&#8217;è un rischio speculare che viene spesso ignorato: il <strong>falso negativo</strong> (errore di tipo II, \(\beta\)). Succede quando B è davvero meglio di A, ma il nostro test non riesce a rilevarlo.</p>
<p>La causa più comune? Un <strong>campione troppo piccolo</strong>. Se abbiamo solo 100 visitatori per variante, il test non ha abbastanza &#8220;potenza&#8221; per rilevare differenze piccole ma reali. Concluderemo &#8220;nessuna differenza significativa&#8221; non perché la differenza non esiste, ma perché non avevamo abbastanza dati per vederla.</p>
<p><strong>Come evitarlo</strong>: calcolare la dimensione campionaria necessaria <em>prima</em> di avviare il test, in base all&#8217;effetto minimo che vogliamo rilevare. È il tema della <strong>power analysis</strong>: usa il <a href="https://www.gironi.it/blog/calcolatore-sample-size-ab-test/">calcolatore di dimensione campionaria</a> per verificare se il tuo test ha abbastanza potenza.</p>
<h3>Confondere significatività statistica con significatività pratica</h3>
<p>Un p-value basso non significa automaticamente che il risultato sia <em>importante</em>. Con campioni molto grandi, anche differenze microscopiche diventano statisticamente significative. Se testiamo due varianti su 500.000 visitatori, una differenza di CTR dello 0.01% (dal 5.00% al 5.01%) potrebbe risultare significativa. Ma è una differenza operativamente irrilevante.</p>
<p><strong>Attenzione</strong>: il p-value risponde alla domanda &#8220;la differenza è reale?&#8221;, non alla domanda &#8220;la differenza è grande abbastanza da interessarci?&#8221;. Per quest&#8217;ultima serve una misura diversa — l&#8217;<strong>effect size</strong> — che tratteremo in un articolo dedicato.</p>
<h2 id="frequentista-bayesiano">Approccio frequentista vs bayesiano</h2>
<p>Tutto ciò che abbiamo visto finora segue l&#8217;approccio <strong>frequentista</strong>: calcoliamo una statistica test, la confrontiamo con una distribuzione di riferimento, otteniamo un p-value e prendiamo una decisione binaria (rifiutare o non rifiutare \(H_0\)).</p>
<p>Funziona, e funziona bene. Ma ha dei limiti che nella pratica quotidiana si avvertono. Il p-value non ci dice &#8220;di quanto è meglio B rispetto ad A&#8221;. Non ci dice &#8220;qual è la probabilità che B sia davvero superiore&#8221;. E se raccogliamo nuovi dati, non possiamo semplicemente aggiornare il risultato: dobbiamo ricalcolare tutto da capo.</p>
<p>Esiste un approccio alternativo che risponde direttamente alla domanda che in fondo ci interessa di più: <strong>qual è la probabilità che B sia meglio di A?</strong> È l&#8217;approccio <strong>bayesiano</strong>.</p>
<p>L&#8217;idea è questa. Invece di partire da un&#8217;ipotesi nulla e cercare di rifiutarla, partiamo da una <strong>distribuzione a priori</strong> (come dicono gli anglosassoni, <em>prior</em>) che rappresenta la nostra conoscenza iniziale sulla conversione di ciascuna variante. Poi, man mano che raccogliamo dati, aggiorniamo quella distribuzione. Il risultato è una <strong>distribuzione a posteriori</strong> (<em>posterior</em>) che incorpora sia le nostre conoscenze pregresse sia i dati osservati.</p>
<p>Per tassi di conversione, la distribuzione naturale è la <strong>Beta</strong>: è definita tra 0 e 1 (come una proporzione) e si aggiorna in modo molto elegante. Se partiamo da un prior \(\text{Beta}(\alpha, \beta)\) e osserviamo \(s\) successi su \(n\) tentativi, il posterior è:</p>
<p>\(<br />
\text{Beta}(\alpha + s, \, \beta + n &#8211; s) \\<br />
\)</p>
<p>Sembra difficile? È facilissimo. Usiamo i dati delle due landing page dell&#8217;esempio precedente. Partiamo da un <strong>prior non informativo</strong> \(\text{Beta}(1, 1)\) — che equivale a dire &#8220;non sappiamo nulla, qualsiasi valore tra 0 e 1 è ugualmente plausibile&#8221;:</p>
<ul>
<li><strong>Pagina A</strong>: 35 conversioni su 1000 → posterior \(\text{Beta}(36, \, 966)\)</li>
<li><strong>Pagina B</strong>: 58 conversioni su 1000 → posterior \(\text{Beta}(59, \, 943)\)</li>
</ul>
<p>Calcoliamo in R la probabilità che B sia migliore di A:</p>
<pre><code class="language-r">set.seed(42)
n_sim &lt;- 100000

# Posterior delle due varianti
post_A &lt;- rbeta(n_sim, shape1 = 36, shape2 = 966)
post_B &lt;- rbeta(n_sim, shape1 = 59, shape2 = 943)

# Probabilita' che B &gt; A
prob_B_meglio &lt;- mean(post_B &gt; post_A)
cat("P(B &gt; A) =", round(prob_B_meglio, 4), "\n")

# Distribuzione della differenza
diff &lt;- post_B - post_A
cat("Differenza mediana:", round(median(diff) * 100, 2), "punti %\n")
cat("IC 95% della differenza:",
    round(quantile(diff, 0.025) * 100, 2), "-",
    round(quantile(diff, 0.975) * 100, 2), "punti %\n")</code></pre>
<p>Il risultato è notevole: la probabilità che B sia meglio di A è superiore al 99%. Ma il vero vantaggio dell&#8217;approccio bayesiano è che otteniamo direttamente la <strong>distribuzione della differenza</strong>: non solo sappiamo <em>se</em> B è meglio, ma <em>di quanto</em>, con un intervallo di credibilità che quantifica la nostra incertezza.</p>
<p>Questa è una differenza sostanziale rispetto all&#8217;approccio frequentista. Il p-value ci dice &#8220;la differenza è improbabile sotto \(H_0\)&#8220;; il risultato bayesiano ci dice &#8220;la probabilità che B sia migliore è del 99%, e il miglioramento si colloca tra circa 0.5 e 4.2 punti percentuali&#8221;. Per una decisione operativa, la seconda informazione è spesso più utile.</p>
<p>Una nota importante: l&#8217;approccio bayesiano completo merita un articolo dedicato. Qui abbiamo appena scalfito la superficie — il tema dei prior informativi, dei modelli gerarchici e della loro applicazione sistematica è un percorso a sé che affronteremo nella sezione dedicata alla statistica bayesiana.</p>
<h2 id="esempio-seo">Esempio pratico SEO: meta description A/B test</h2>
<p>Vediamo un ultimo scenario, molto comune nella pratica quotidiana. Abbiamo due varianti di meta description per una pagina chiave del sito. Alternando le due versioni (due settimane ciascuna, per minimizzare effetti stagionali) e consultando i dati di Search Console, otteniamo:</p>
<ul>
<li><strong>Meta A</strong>: 3200 impressioni, 128 click → CTR = 4.0%</li>
<li><strong>Meta B</strong>: 3100 impressioni, 155 click → CTR = 5.0%</li>
</ul>
<p>Verifichiamo in R:</p>
<pre><code class="language-r">prop.test(c(128, 155), c(3200, 3100))</code></pre>
<p>il p-value è circa 0.064 — superiore alla soglia di 0.05, quindi non possiamo rifiutare l&#8217;ipotesi nulla. Anche l&#8217;intervallo di confidenza della differenza include lo zero, confermando la non significatività. Un risultato al limite, che ci dice: con questi dati non abbiamo abbastanza evidenza per concludere che la meta B sia davvero migliore.Quale approccio usare? Per un test semplice come questo, l&#8217;approccio frequentista con <code>prop.test()</code> è più che sufficiente: abbiamo campioni grandi, la domanda è chiara. L&#8217;approccio bayesiano diventa più prezioso quando i campioni sono piccoli, quando vogliamo aggiornare il risultato man mano che arrivano nuovi dati, o quando abbiamo conoscenze pregresse da incorporare (ad esempio, sappiamo che per quel tipo di pagina il CTR è tipicamente tra il 3% e il 7%).</p>
<p>Ma la decisione operativa non deve basarsi solo sul p-value. Dobbiamo chiederci: la differenza (un punto percentuale di CTR in più) è abbastanza grande da giustificare il cambiamento? Con 3000 e più impressioni al mese, un punto percentuale in più significa circa 30 click aggiuntivi. È significativo <em>per il nostro business</em>? Questa è una domanda che la statistica non può risolvere da sola — è una valutazione che spetta a noi.</p>
<h2 id="prova-tu">Prova tu</h2>
<p>Un e-commerce sta testando due varianti di call-to-action su una pagina prodotto:</p>
<ul>
<li><strong>Variante A</strong> (&#8220;Aggiungi al carrello&#8221;): 450 visite, 23 conversioni</li>
<li><strong>Variante B</strong> (&#8220;Compralo ora&#8221;): 430 visite, 31 conversioni</li>
</ul>
<ol>
<li>Calcola il tasso di conversione di ciascuna variante</li>
<li>Esegui il test con <code>prop.test(c(23, 31), c(450, 430))</code> e interpreta il p-value</li>
<li>L&#8217;intervallo di confidenza della differenza include lo zero?</li>
<li>Al livello di significatività del 5%, la differenza è statisticamente significativa?</li>
</ol>
<p>Suggerimento: se il p-value è superiore a 0.05, non possiamo concludere che una variante sia meglio dell&#8217;altra — ma questo non significa che siano uguali. Potrebbe semplicemente significare che non abbiamo abbastanza dati. È esattamente il problema della potenza del test di cui abbiamo parlato.</p>
<p>L&#8217;A/B testing ci offre un framework rigoroso per prendere decisioni basate sui dati, non sulle intuizioni. Ma come abbiamo visto, un test ben condotto ci dice <em>se</em> c&#8217;è una differenza significativa — non ci dice quanto sia <em>grande</em> quell&#8217;effetto, né quanti dati ci servano per rilevarlo con sicurezza. Sono le domande dell&#8217;<strong>effect size</strong> e della <strong>power analysis</strong>, i prossimi strumenti nel nostro percorso. Per la dimensione campionaria, il <a href="https://www.gironi.it/blog/calcolatore-sample-size-ab-test/">calcolatore interattivo</a> ti permette di ottenere il numero esatto in tempo reale.</p>
<hr>
<h3>Per approfondire</h3>
<p>Se vuoi approfondire la metodologia degli esperimenti online, <a href="https://www.amazon.it/dp/1108724264?tag=consulenzeinf-21&#038;ascsubtag=ab-testing" target="_blank" rel="nofollow sponsored noopener"><em>Trustworthy Online Controlled Experiments</em></a> di Ron Kohavi, Diane Tang e Ya Xu è il riferimento mondiale sull&#8217;A/B testing. Gli autori hanno guidato le piattaforme di sperimentazione di Microsoft, Amazon e LinkedIn — e il libro copre tutto, dal design del test alle insidie che abbiamo visto in questo articolo, fino agli aspetti organizzativi che fanno la differenza tra un test ben condotto e un esercizio sterile.</p>
<p>Per chi vuole esplorare l&#8217;approccio bayesiano all&#8217;A/B testing (che abbiamo appena introdotto), <a href="https://www.amazon.it/dp/1593279566?tag=consulenzeinf-21&#038;ascsubtag=ab-testing" target="_blank" rel="nofollow sponsored noopener"><em>Bayesian Statistics the Fun Way</em></a> di Will Kurt è un&#8217;introduzione accessibile e sorprendentemente divertente. Spiega prior, posterior e aggiornamento bayesiano con esempi che non richiedono una laurea in matematica — e usa R per la parte computazionale.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.gironi.it/blog/ab-testing/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
