  <?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>Wed, 06 May 2026 14:57:09 +0000</lastBuildDate>
	<language>it-IT</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	
	<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[autore-articoli]]></dc:creator>
		<pubDate>Wed, 06 May 2026 14:45:50 +0000</pubDate>
				<category><![CDATA[Senza categoria]]></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>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>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>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>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>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>La formula per stimare una proporzione (come il Conversion Rate) è:</p>



<p 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>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>Gli esempi seguono sia in R sia in Python: ognuno scelga il linguaggio con cui ha più familiarità.</p>



<p>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>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>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>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>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>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>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>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>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>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>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>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" 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/#respond</comments>
		
		<dc:creator><![CDATA[autore-articoli]]></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/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" 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>0</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" 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" 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" 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.309, p-value = 0.0209.</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" 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" 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>
		<item>
		<title>Il Teorema del Limite Centrale: perché la statistica funziona (anche quando i dati non sono normali)</title>
		<link>https://www.gironi.it/blog/teorema-del-limite-centrale/</link>
					<comments>https://www.gironi.it/blog/teorema-del-limite-centrale/#respond</comments>
		
		<dc:creator><![CDATA[paolo]]></dc:creator>
		<pubDate>Thu, 19 Feb 2026 14:39:19 +0000</pubDate>
				<category><![CDATA[statistica]]></category>
		<guid isPermaLink="false">https://www.gironi.it/blog/?p=3377</guid>

					<description><![CDATA[Abbiamo avuto modo di esaminare, nel corso dei precedenti articoli, la distribuzione normale e le sue proprietà. E poi siamo andati avanti: abbiamo costruito intervalli di confidenza, condotto test delle ipotesi, calcolato margini di errore. In tutti questi passaggi, la distribuzione normale era lì, sempre presente, come un filo conduttore silenzioso. Ma c&#8217;è una domanda &#8230; <a href="https://www.gironi.it/blog/teorema-del-limite-centrale/" class="more-link">Leggi tutto<span class="screen-reader-text"> "Il Teorema del Limite Centrale: perché la statistica funziona (anche quando i dati non sono normali)"</span></a>]]></description>
										<content:encoded><![CDATA[<p>Abbiamo avuto modo di esaminare, nel corso dei precedenti articoli, la <a href="https://www.gironi.it/blog/la-distribuzione-normale/">distribuzione normale</a> e le sue proprietà. E poi siamo andati avanti: abbiamo costruito <a href="https://www.gironi.it/blog/intervalli-di-confidenza/">intervalli di confidenza</a>, condotto <a href="https://www.gironi.it/blog/il-test-delle-ipotesi/">test delle ipotesi</a>, calcolato margini di errore. In tutti questi passaggi, la distribuzione normale era lì, sempre presente, come un filo conduttore silenzioso.</p>
<p>Ma c&#8217;è una domanda che forse ci siamo posti senza trovare ancora una risposta soddisfacente: <strong>perché la distribuzione normale funziona così bene, anche quando i nostri dati non sono affatto normali?</strong> Chi ha detto che il traffico organico, i tassi di conversione o le durate delle sessioni seguano una distribuzione a campana? Nella maggior parte dei casi, non la seguono affatto.</p>
<p>La risposta sta in uno dei risultati più eleganti e potenti di tutta la matematica: il <strong>Teorema del Limite Centrale</strong> (in inglese <em>Central Limit Theorem</em>, spesso abbreviato in TLC o CLT). È il teorema che, in un certo senso, <em>giustifica</em> l&#8217;intera statistica inferenziale.</p>
<p><span id="more-3377"></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-il-teorema">Cos&#8217;è il Teorema del Limite Centrale</a></li>
<li><a href="#perche-importante">Perché è così importante</a></li>
<li><a href="#simulazione-r">Vediamolo con i nostri occhi: una simulazione in R</a></li>
<li><a href="#regola-pratica">La regola pratica: quanto deve essere grande n?</a></li>
<li><a href="#tlc-errore-standard">Il TLC e l&#8217;errore standard</a></li>
<li><a href="#esempio-traffico">Un esempio pratico: il traffico organico giornaliero</a></li>
<li><a href="#quando-non-basta">Quando il TLC non basta</a></li>
<li><a href="#prova-tu">Prova tu</a></li>
</ul>
</div>
<h2 id="cose-il-teorema">Cos&#8217;è il Teorema del Limite Centrale</h2>
<p>Partiamo dall&#8217;enunciato, e poi lo tradurremo in parole semplici.</p>
<p>Il Teorema del Limite Centrale afferma che: <strong>se preleviamo campioni sufficientemente grandi da una qualsiasi popolazione con media \(\mu\) e <a href="https://www.gironi.it/blog/statistica-descrittiva-misure-di-dispersione-o-variabilita/">deviazione standard</a> \(\sigma\) finite, la distribuzione delle medie campionarie sarà approssimativamente normale</strong>, indipendentemente dalla forma della distribuzione originale.</p>
<p>Più precisamente, la distribuzione delle medie campionarie \(\bar{X}\) tende a:</p>
<p>\(<br />
\bar{X} \sim N\left(\mu, \, \frac{\sigma}{\sqrt{n}}\right) \\<br />
\)</p>
<p>dove:</p>
<ul>
<li>\(\mu\) è la media della popolazione</li>
<li>\(\sigma\) è la deviazione standard della popolazione</li>
<li>\(n\) è la dimensione di ciascun campione</li>
<li>\(\frac{\sigma}{\sqrt{n}}\) è l&#8217;<strong>errore standard</strong> della media</li>
</ul>
<p>In termini più chiari e diretti: non importa quanto strana, asimmetrica o bizzarra sia la distribuzione dei nostri dati originali. Se prendiamo tanti campioni e calcoliamo la media di ciascuno, quelle medie si disporranno a formare una campana. Sempre.</p>
<h2 id="perche-importante">Perché è così importante</h2>
<p>Va sempre tenuto bene a mente questo punto, perché è la chiave di volta di tutto ciò che abbiamo fatto finora.</p>
<p>Quando calcoliamo un intervallo di confidenza o conduciamo un test delle ipotesi, non lavoriamo con i singoli dati: lavoriamo con le <strong>medie campionarie</strong>. E il TLC ci garantisce che quelle medie, purché il campione sia abbastanza grande, seguono una distribuzione normale (o approssimativamente tale).</p>
<p>Ecco perché possiamo usare la distribuzione normale e la <a href="https://www.gironi.it/blog/la-distribuzione-t-e-il-test-delle-ipotesi/">distribuzione t</a> anche quando i dati originali non sono normali. Non stiamo facendo un&#8217;assunzione azzardata: stiamo sfruttando un risultato matematico solido.</p>
<p>In pratica, il TLC è il motivo per cui:</p>
<ul>
<li>gli intervalli di confidenza funzionano</li>
<li>i test delle ipotesi sono affidabili</li>
<li>possiamo fare inferenza statistica su praticamente qualsiasi tipo di dato</li>
</ul>
<h2 id="simulazione-r">Vediamolo con i nostri occhi: una simulazione in R</h2>
<p>La teoria è bella, ma <em>vedere</em> il TLC in azione è un&#8217;altra cosa. Costruiamo una simulazione in R che mostra il teorema al lavoro.</p>
<p>Partiamo da una distribuzione decisamente non normale: una distribuzione esponenziale, che è fortemente asimmetrica a destra (pensate alla distribuzione dei tempi di permanenza su un sito: molte visite brevissime, poche molto lunghe).</p>
<p>Simuliamo in R il processo di campionamento ripetuto:</p>
<pre><code class="language-r">set.seed(42)

# Popolazione: distribuzione esponenziale (media = 1/lambda)
lambda &lt;- 0.5
pop_mean &lt;- 1 / lambda  # media vera = 2

# Simuliamo 10000 campioni di dimensione n
n_campioni &lt;- 10000

# Funzione per calcolare le medie campionarie
simula_medie &lt;- function(n) {
  replicate(n_campioni, mean(rexp(n, rate = lambda)))
}

# Proviamo con tre dimensioni campionarie diverse
medie_n5  &lt;- simula_medie(5)
medie_n30 &lt;- simula_medie(30)
medie_n100 &lt;- simula_medie(100)

# Visualizziamo
par(mfrow = c(2, 2))

# La distribuzione originale (esponenziale)
hist(rexp(10000, rate = lambda), breaks = 50, probability = TRUE,
     main = "Popolazione originale\n(esponenziale)",
     col = "lightcoral", xlab = "Valore", ylab = "Densit\u00e0")

# Medie con n = 5
hist(medie_n5, breaks = 50, probability = TRUE,
     main = "Medie campionarie (n = 5)",
     col = "lightyellow", xlab = "Media", ylab = "Densit\u00e0")
curve(dnorm(x, mean = pop_mean, sd = pop_mean / sqrt(5)),
      add = TRUE, col = "red", lwd = 2)

# Medie con n = 30
hist(medie_n30, breaks = 50, probability = TRUE,
     main = "Medie campionarie (n = 30)",
     col = "lightgreen", xlab = "Media", ylab = "Densit\u00e0")
curve(dnorm(x, mean = pop_mean, sd = pop_mean / sqrt(30)),
      add = TRUE, col = "red", lwd = 2)

# Medie con n = 100
hist(medie_n100, breaks = 50, probability = TRUE,
     main = "Medie campionarie (n = 100)",
     col = "lightblue", xlab = "Media", ylab = "Densit\u00e0")
curve(dnorm(x, mean = pop_mean, sd = pop_mean / sqrt(100)),
      add = TRUE, col = "red", lwd = 2)</code></pre>
<p>Come si vede, il risultato è spettacolare. La popolazione di partenza è completamente asimmetrica (l&#8217;esponenziale non assomiglia neanche lontanamente a una campana), eppure:</p>
<ul>
<li>Con <strong>n = 5</strong>, le medie cominciano già a somigliare a una normale, anche se resta un po&#8217; di asimmetria</li>
<li>Con <strong>n = 30</strong>, la distribuzione delle medie è praticamente indistinguibile da una normale</li>
<li>Con <strong>n = 100</strong>, la sovrapposizione con la curva teorica è quasi perfetta</li>
</ul>
<p>Basta aumentare la dimensione del campione e la normalità emerge da sola.</p>
<h2 id="regola-pratica">La regola pratica: quanto deve essere grande n?</h2>
<p>Una domanda legittima: &#8220;sufficientemente grande&#8221; è un termine piuttosto vago. In pratica, quanto deve essere grande il campione perché il TLC faccia il suo lavoro?</p>
<p>La regola pratica più diffusa è <strong>n ≥ 30</strong>. Con 30 o più osservazioni, la distribuzione delle medie campionarie è generalmente ben approssimata dalla normale, anche se la distribuzione originale è moderatamente asimmetrica.</p>
<p>Ma attenzione: questa regola ha delle eccezioni.</p>
<ul>
<li>Se la distribuzione originale è <strong>già simmetrica</strong> (anche se non normale), bastano campioni più piccoli (anche n = 10-15 può essere sufficiente)</li>
<li>Se la distribuzione originale è <strong>fortemente asimmetrica</strong> (come nel caso di dati con molti outlier, o distribuzioni esponenziali con parametri estremi), possono servire campioni più grandi (n = 50 o anche di più)</li>
</ul>
<p>Nella pratica quotidiana della SEO e del marketing digitale, di solito lavoriamo con campioni ben superiori a 30 (centinaia o migliaia di sessioni, click, conversioni), quindi il TLC è quasi sempre dalla nostra parte.</p>
<h2 id="tlc-errore-standard">Il TLC e l&#8217;errore standard</h2>
<p>Il teorema ci dice anche qualcosa di prezioso sulla <strong>dispersione</strong> delle medie campionarie. La deviazione standard della distribuzione delle medie (cioè l&#8217;errore standard) è:</p>
<p>\(<br />
SE = \frac{\sigma}{\sqrt{n}} \\<br />
\)</p>
<p>Questo ha due conseguenze pratiche importanti:</p>
<ol>
<li><strong>All&#8217;aumentare di n, l&#8217;errore standard diminuisce</strong>. Più dati raccogliamo, più le nostre medie campionarie si concentrano attorno alla media vera. La relazione è con \(\sqrt{n}\), il che significa (come abbiamo già visto con gli intervalli di confidenza) che per dimezzare l&#8217;errore standard dobbiamo quadruplicare il campione.</li>
<li><strong>La variabilità della popolazione conta</strong>. Se i nostri dati sono molto dispersi (alto \(\sigma\)), servono campioni più grandi per ottenere stime precise. Un sito con traffico molto variabile richiede più giorni di osservazione per una stima affidabile della media giornaliera.</li>
</ol>
<p>Verifichiamo in R che l&#8217;errore standard osservato corrisponda alla formula teorica:</p>
<pre><code class="language-r"># Errore standard teorico per n = 30
se_teorico &lt;- pop_mean / sqrt(30)

# Errore standard osservato dalla simulazione
se_osservato &lt;- sd(medie_n30)

cat("SE teorico:", round(se_teorico, 4), "\n")
cat("SE osservato:", round(se_osservato, 4), "\n")
cat("Differenza:", round(abs(se_teorico - se_osservato), 4), "\n")</code></pre>
<p>La corrispondenza è notevole: i due valori praticamente coincidono. Il TLC funziona esattamente come promesso.</p>
<h2 id="esempio-traffico">Un esempio pratico: il traffico organico giornaliero</h2>
<p>Applichiamo il TLC a un caso concreto. Supponiamo di monitorare il traffico organico giornaliero di un sito per un anno (365 giorni). I dati di traffico non sono mai normali: sono asimmetrici a destra (giorni feriali vs weekend, picchi stagionali, anomalie).</p>
<p>Simuliamo in R una situazione realistica:</p>
<pre><code class="language-r">set.seed(123)

# Simuliamo 365 giorni di traffico (distribuzione log-normale, tipica del web)
traffico &lt;- round(rlnorm(365, meanlog = 6, sdlog = 0.5))

cat("Media traffico giornaliero:", round(mean(traffico)), "visite\n")
cat("Mediana:", round(median(traffico)), "visite\n")
cat("Dev. standard:", round(sd(traffico)), "visite\n")

# Prendiamo campioni di 30 giorni e calcoliamo la media di ciascuno
medie_mensili &lt;- replicate(5000, mean(sample(traffico, 30, replace = TRUE)))

par(mfrow = c(1, 2))

hist(traffico, breaks = 30, probability = TRUE,
     main = "Traffico giornaliero\n(365 giorni)",
     col = "lightcoral", xlab = "Visite", ylab = "Densit\u00e0")

hist(medie_mensili, breaks = 50, probability = TRUE,
     main = "Medie di campioni\nda 30 giorni",
     col = "lightblue", xlab = "Media visite", ylab = "Densit\u00e0")
curve(dnorm(x, mean = mean(traffico), sd = sd(traffico) / sqrt(30)),
      add = TRUE, col = "red", lwd = 2)

# Test di normalit\u00e0 sulle medie
shapiro.test(sample(medie_mensili, 5000))</code></pre>
<p>Il traffico giornaliero è chiaramente asimmetrico (la media è diversa dalla mediana, la distribuzione ha una coda lunga a destra). Ma le medie di campioni da 30 giorni? Perfettamente normali, come il TLC garantisce.</p>
<p>Questo è esattamente il motivo per cui possiamo costruire intervalli di confidenza affidabili per il traffico medio, anche se i singoli giorni hanno una distribuzione tutt&#8217;altro che normale.</p>
<h2 id="quando-non-basta">Quando il TLC non basta</h2>
<p>Sarebbe disonesto non menzionare i casi in cui il TLC ha dei limiti. Il teorema richiede che la popolazione abbia <strong>media e varianza finite</strong>. Ci sono distribuzioni (come la distribuzione di Cauchy) che non hanno una varianza finita, e per queste il TLC non vale.</p>
<p>Nella pratica della SEO e del marketing, questo è raramente un problema: i nostri dati hanno sempre media e varianza finite. Tuttavia, vale la pena ricordare che:</p>
<ul>
<li>Con <strong>distribuzioni fortemente asimmetriche</strong> e <strong>campioni piccoli</strong> (n &lt; 20), l&#8217;approssimazione normale può essere insufficiente. In questi casi, meglio usare <a href="https://www.gironi.it/blog/test-statistici-parametrici-e-non-parametrici/">metodi non parametrici</a> o tecniche di <em>bootstrap</em></li>
<li>Con <strong>proporzioni estreme</strong> (molto vicine a 0 o a 1), il TLC per le proporzioni richiede campioni più grandi perché l&#8217;approssimazione funzioni. Ne abbiamo già parlato nell&#8217;articolo sugli intervalli di confidenza</li>
</ul>
<h2 id="prova-tu">Prova tu</h2>
<p>Un e-commerce registra i seguenti importi degli ordini (in euro) in un mese:</p>
<pre><code class="language-r">ordini &lt;- c(12, 8, 45, 15, 22, 150, 9, 18, 35, 11,
            14, 200, 7, 19, 28, 13, 55, 10, 16, 95,
            8, 21, 42, 12, 17, 310, 9, 14, 25, 11)</code></pre>
<ol>
<li>Calcola media e deviazione standard degli ordini. La distribuzione sembra normale?</li>
<li>Usa <code>replicate()</code> e <code>sample()</code> per generare 5000 medie campionarie con n = 10 (campionando con reinserimento)</li>
<li>Disegna l&#8217;istogramma delle medie campionarie. Assomiglia a una normale?</li>
<li>Calcola l&#8217;errore standard teorico (\(\frac{s}{\sqrt{n}}\)) e confrontalo con la deviazione standard delle medie simulate</li>
</ol>
<p>Suggerimento: <code>replicate(5000, mean(sample(ordini, 10, replace = TRUE)))</code> fa quasi tutto il lavoro.</p>
<p>Abbiamo visto come il Teorema del Limite Centrale sia il fondamento nascosto di tutta la statistica inferenziale: è il motivo per cui possiamo costruire intervalli di confidenza, condurre test delle ipotesi e fare previsioni affidabili, anche quando i nostri dati non sono normali. Ma il TLC ci ha anche insegnato che la dimensione del campione è cruciale. Questo ci apre la strada a una domanda molto pratica: <strong>quanti dati ci servono?</strong> È il problema della <em>dimensione campionaria</em> e del <em>campionamento</em>, temi che affronteremo in un prossimo articolo.</p>
<hr>
<h3>Per approfondire</h3>
<p>Se vuoi approfondire il ruolo della distribuzione normale e del Teorema del Limite Centrale nella pratica statistica, <a href="https://www.amazon.it/dp/8806246623?tag=consulenzeinf-21" target="_blank" rel="nofollow sponsored noopener"><em>L&#8217;arte della statistica</em></a> di David Spiegelhalter è un&#8217;ottima compagna di viaggio. Spiegelhalter riesce a spiegare perché la curva a campana compare ovunque — dalle misurazioni fisiche ai sondaggi elettorali — con una chiarezza che non sacrifica mai il rigore.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.gironi.it/blog/teorema-del-limite-centrale/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Intervalli di confidenza: cosa sono, come calcolarli (e cosa NON significano)</title>
		<link>https://www.gironi.it/blog/intervalli-di-confidenza/</link>
					<comments>https://www.gironi.it/blog/intervalli-di-confidenza/#respond</comments>
		
		<dc:creator><![CDATA[paolo]]></dc:creator>
		<pubDate>Mon, 16 Feb 2026 14:12:10 +0000</pubDate>
				<category><![CDATA[statistica]]></category>
		<guid isPermaLink="false">https://www.gironi.it/blog/?p=3366</guid>

					<description><![CDATA[Abbiamo avuto modo di esaminare, nel corso dei precedenti articoli, come funziona il test delle ipotesi e come la distribuzione t ci permetta di lavorare anche quando non conosciamo la deviazione standard della popolazione. In entrambi i casi, ci siamo concentrati su una domanda precisa: &#8220;posso rifiutare l&#8217;ipotesi nulla, sì o no?&#8221; Ma c&#8217;è un&#8217;altra &#8230; <a href="https://www.gironi.it/blog/intervalli-di-confidenza/" class="more-link">Leggi tutto<span class="screen-reader-text"> "Intervalli di confidenza: cosa sono, come calcolarli (e cosa NON significano)"</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 la <a href="https://www.gironi.it/blog/la-distribuzione-t-e-il-test-delle-ipotesi/">distribuzione t</a> ci permetta di lavorare anche quando non conosciamo la <a href="https://www.gironi.it/blog/statistica-descrittiva-misure-di-dispersione-o-variabilita/">deviazione standard</a> della popolazione. In entrambi i casi, ci siamo concentrati su una domanda precisa: &#8220;posso rifiutare l&#8217;ipotesi nulla, sì o no?&#8221;</p>
<p>Ma c&#8217;è un&#8217;altra domanda, altrettanto importante, che nella pratica quotidiana ci poniamo continuamente: <strong>quanto vale, con ragionevole approssimazione, il parametro che sto stimando?</strong> Non ci basta sapere se la media è diversa da un certo valore; vogliamo sapere <em>dove</em> si trova, con quale margine di incertezza.</p>
<p>Qui entrano in gioco gli <strong>intervalli di confidenza</strong> (in inglese <em>confidence intervals</em>, spesso abbreviati in IC o CI), uno degli strumenti più utili e al contempo più fraintesi di tutta la statistica inferenziale.</p>
<p><span id="more-3366"></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-un-intervallo-di-confidenza">Cos&#8217;è un intervallo di confidenza</a></li>
<li><a href="#il-grande-malinteso">Il grande malinteso: cosa NON è un intervallo di confidenza</a></li>
<li><a href="#costruire-un-ic-per-la-media">Costruire un IC per la media</a></li>
<li><a href="#ic-per-proporzioni">IC per proporzioni</a></li>
<li><a href="#relazione-ic-test-ipotesi">La relazione tra IC e test delle ipotesi</a></li>
<li><a href="#livelli-di-confidenza">Livelli di confidenza: 90%, 95%, 99%</a></li>
<li><a href="#cosa-influenza-larghezza">Cosa influenza la larghezza dell&#8217;IC</a></li>
<li><a href="#esempio-ctr-organico">Un esempio pratico: IC del CTR organico</a></li>
<li><a href="#prova-tu">Prova tu</a></li>
</ul>
</div>
<h2 id="cose-un-intervallo-di-confidenza">Cos&#8217;è un intervallo di confidenza</h2>
<p>Partiamo da un esempio concreto. Supponiamo di voler conoscere la durata media delle sessioni organiche sul nostro sito. Non possiamo osservare <em>tutte</em> le sessioni che ci saranno mai (sarebbe la &#8220;popolazione&#8221;); possiamo però osservarne un campione, diciamo le sessioni dell&#8217;ultimo mese.</p>
<p>Dal campione calcoliamo una media: ad esempio 2 minuti e 45 secondi. Ma sappiamo bene che questa è una <strong>stima puntuale</strong>: se prendessimo un altro campione (il mese successivo, per dire), otterremmo un valore leggermente diverso. La stima puntuale, da sola, non ci dice nulla sulla sua precisione.</p>
<p>L&#8217;intervallo di confidenza risolve esattamente questo problema. È un <strong>intervallo di valori, costruito a partire dai dati campionari, che con un certo livello di fiducia contiene il vero parametro della popolazione</strong>.</p>
<p>In termini più chiari e diretti: anziché dire &#8220;la durata media è 2:45&#8221;, diciamo &#8220;siamo ragionevolmente sicuri che la durata media della popolazione si trovi tra 2:30 e 3:00&#8221;. Abbiamo scambiato la precisione illusoria di un singolo numero con l&#8217;onestà di un intervallo.</p>
<h2 id="il-grande-malinteso">Il grande malinteso: cosa NON è un intervallo di confidenza</h2>
<p>Va sempre tenuto bene a mente un punto fondamentale, perché qui si annida uno degli errori più diffusi in statistica.</p>
<p>Quando diciamo &#8220;intervallo di confidenza al 95%&#8221;, <strong>non</strong> stiamo dicendo che c&#8217;è il 95% di probabilità che il parametro della popolazione cada dentro quell&#8217;intervallo. Il parametro della popolazione è un valore fisso (anche se sconosciuto): non &#8220;cade&#8221; da nessuna parte, non è una variabile casuale.</p>
<p>Quello che il 95% significa è questo: <strong>se ripetessimo il campionamento molte volte, e per ogni campione calcolassimo un intervallo di confidenza, il 95% di quegli intervalli conterrebbe il vero parametro</strong>. È una proprietà della <em>procedura</em>, non del singolo intervallo.</p>
<p>Sembra difficile? Facciamo un esempio al volo. Immaginiamo di lanciare una rete da pesca 100 volte. Se la nostra rete è buona (costruita al 95%), circa 95 volte su 100 catturerà il pesce. Ma una volta che abbiamo lanciato la rete e l&#8217;abbiamo tirata su, il pesce o c&#8217;è dentro o non c&#8217;è: non ha senso dire &#8220;c&#8217;è il 95% di probabilità che il pesce sia nella rete&#8221;. L&#8217;intervallo di confidenza è la rete; il parametro è il pesce.</p>
<h2 id="costruire-un-ic-per-la-media">Costruire un IC per la media</h2>
<p>Vediamo come si costruisce concretamente un intervallo di confidenza per la media di una popolazione. La formula è:</p>
<p>\(<br />
\bar{x} \pm t_{\alpha/2, \, n-1} \cdot \frac{s}{\sqrt{n}} \\<br />
\)</p>
<p>dove:</p>
<ul>
<li>\(\bar{x}\) è la media campionaria</li>
<li>\(t_{\alpha/2, \, n-1}\) è il valore critico della distribuzione t con \(n &#8211; 1\) gradi di libertà</li>
<li>\(s\) è la deviazione standard campionaria</li>
<li>\(n\) è la numerosità del campione</li>
<li>\(\frac{s}{\sqrt{n}}\) è l&#8217;<strong>errore standard</strong> della media</li>
</ul>
<p>Il termine \(t_{\alpha/2, \, n-1} \cdot \frac{s}{\sqrt{n}}\) si chiama <strong>margine di errore</strong> (come dicono gli anglosassoni, <em>margin of error</em>). È la &#8220;larghezza del braccio&#8221; del nostro intervallo: più è grande, più siamo incerti.</p>
<h3>Esempio numerico</h3>
<p>Supponiamo di aver misurato la durata media delle sessioni organiche su un campione di 30 giorni. I dati:</p>
<ul>
<li>Media campionaria: \(\bar{x} = 200\) secondi</li>
<li>Deviazione standard campionaria: \(s = 12\) secondi</li>
<li>Numerosità: \(n = 30\)</li>
<li>Livello di confidenza desiderato: 95%</li>
</ul>
<p>Calcoliamo passo dopo passo.</p>
<p><strong>Passo 1</strong>: Troviamo il valore critico \(t\). Per un livello di confidenza del 95%, cerchiamo \(t_{0.025, \, 29}\) (cioè il valore che lascia il 2.5% nelle code). Con 29 gradi di libertà, \(t \approx 2.045\).</p>
<p><strong>Passo 2</strong>: Calcoliamo l&#8217;errore standard:</p>
<p>\(<br />
SE = \frac{s}{\sqrt{n}} = \frac{12}{\sqrt{30}} \approx 2.19 \\<br />
\)</p>
<p><strong>Passo 3</strong>: Calcoliamo il margine di errore:</p>
<p>\(<br />
ME = t \cdot SE = 2.045 \times 2.19 \approx 4.48 \\<br />
\)</p>
<p><strong>Passo 4</strong>: Costruiamo l&#8217;intervallo:</p>
<p>\(<br />
200 \pm 4.48 = [195.52, \; 204.48] \\<br />
\)</p>
<p>Dunque: siamo ragionevolmente sicuri (al 95%) che la durata media delle sessioni nella popolazione si trovi tra circa 195.5 e 204.5 secondi.</p>
<h3>In R</h3>
<p>Calcoliamo lo stesso intervallo in R:</p>
<pre><code class="language-r">n &lt;- 30
xbar &lt;- 200
s &lt;- 12

margin &lt;- qt(0.975, df = n - 1) * s / sqrt(n)

lower &lt;- xbar - margin
upper &lt;- xbar + margin

cat("IC al 95%:", round(lower, 2), "-", round(upper, 2), "\n")
cat("Margine di errore:", round(margin, 2), "\n")</code></pre>
<p>Risultato: IC al 95%: 195.52 &#8211; 204.48, con un margine di errore di 4.48 secondi.</p>
<h2 id="ic-per-proporzioni">IC per proporzioni</h2>
<p>Nella realtà operativa della SEO e del marketing digitale, spesso lavoriamo non con medie ma con <strong>proporzioni</strong>: tassi di conversione, CTR, bounce rate. Per le proporzioni la formula è leggermente diversa.</p>
<p>L&#8217;intervallo di confidenza per una proporzione è:</p>
<p>\(<br />
\hat{p} \pm z_{\alpha/2} \cdot \sqrt{\frac{\hat{p}(1-\hat{p})}{n}} \\<br />
\)</p>
<p>dove:</p>
<ul>
<li>\(\hat{p}\) è la proporzione campionaria (ad esempio, il tasso di conversione osservato)</li>
<li>\(z_{\alpha/2}\) è il valore critico della <a href="https://www.gironi.it/blog/la-distribuzione-normale/">distribuzione normale</a> standard (qui usiamo la \(z\) perché con proporzioni e campioni sufficientemente grandi la distribuzione è approssimativamente normale)</li>
<li>\(n\) è la numerosità del campione</li>
</ul>
<p>n.b.: questa formula (detta di Wald) funziona bene quando \(n\) è sufficientemente grande e \(\hat{p}\) non è troppo vicino a 0 o a 1. Come regola pratica, servono almeno \(n \cdot \hat{p} \geq 5\) e \(n \cdot (1 &#8211; \hat{p}) \geq 5\).</p>
<h3>Esempio: IC del tasso di conversione</h3>
<p>Una landing page ha ricevuto 500 visite nell&#8217;ultimo mese, con 18 conversioni. Il tasso di conversione osservato è:</p>
<p>\(<br />
\hat{p} = \frac{18}{500} = 0.036 \quad (3.6\%) \\<br />
\)</p>
<p>Calcoliamo l&#8217;IC al 95%. Il valore critico \(z_{0.025} = 1.96\).</p>
<p>\(<br />
SE = \sqrt{\frac{0.036 \times 0.964}{500}} = \sqrt{\frac{0.0347}{500}} \approx 0.0083 \\<br />
\)<br />
\(<br />
ME = 1.96 \times 0.0083 \approx 0.0163 \\<br />
\)<br />
\(<br />
IC = [0.036 &#8211; 0.0163, \; 0.036 + 0.0163] = [0.0197, \; 0.0523] \\<br />
\)</p>
<p>In altri termini: il tasso di conversione reale della pagina si trova, con il 95% di confidenza, tra l&#8217;1.97% e il 5.23%.</p>
<p>Questo è di estrema utilità nella pratica. Se qualcuno ci chiede &#8220;qual è il conversion rate di quella pagina?&#8221;, rispondere &#8220;3.6%&#8221; è una mezza verità. Rispondere &#8220;tra il 2% e il 5.2%&#8221; è onesto e informativo.</p>
<h3>In R</h3>
<p>Costruiamo lo stesso calcolo in R:</p>
<pre><code class="language-r">n &lt;- 500
successi &lt;- 18
p_hat &lt;- successi / n

se &lt;- sqrt(p_hat * (1 - p_hat) / n)
z &lt;- qnorm(0.975)
margin &lt;- z * se

lower &lt;- p_hat - margin
upper &lt;- p_hat + margin

cat("Proporzione:", round(p_hat, 4), "\n")
cat("IC al 95%:", round(lower, 4), "-", round(upper, 4), "\n")

# oppure, con la funzione integrata:
prop.test(successi, n, conf.level = 0.95)</code></pre>
<p>La funzione <code>prop.test()</code> di R restituisce direttamente l&#8217;intervallo di confidenza (usando una correzione di continuità che lo rende leggermente più conservativo).</p>
<h2 id="relazione-ic-test-ipotesi">La relazione tra IC e test delle ipotesi</h2>
<p>C&#8217;è un legame profondo tra intervalli di confidenza e test delle ipotesi, e capirlo chiarisce entrambi i concetti.</p>
<p><strong>Se un valore ipotizzato cade fuori dall&#8217;intervallo di confidenza al 95%, allora il test delle ipotesi a quel valore sarebbe rifiutato con \(\alpha = 0.05\).</strong> E viceversa: se il valore cade dentro l&#8217;IC, non possiamo rifiutare l&#8217;ipotesi nulla.</p>
<p>Facciamo un esempio. Torniamo alla nostra durata media delle sessioni: IC al 95% = [195.52, 204.48]. Se qualcuno ipotizza che la durata media sia 190 secondi, possiamo rispondere: &#8220;190 cade fuori dal nostro IC al 95%, quindi rifiuteremmo l&#8217;ipotesi nulla \(H_0: \mu = 190\) con \(\alpha = 0.05\)&#8220;. Se invece l&#8217;ipotesi fosse \(\mu = 198\), 198 cade dentro l&#8217;intervallo, e non potremmo rifiutare.</p>
<p>In un certo senso, l&#8217;intervallo di confidenza è più informativo del test delle ipotesi: il test ci dice solo &#8220;sì/no&#8221;, mentre l&#8217;IC ci dice <em>dove</em> si trova il parametro. È come la differenza tra chiedere &#8220;sei a Roma?&#8221; (test) e chiedere &#8220;dove sei?&#8221; (IC).</p>
<h2 id="livelli-di-confidenza">Livelli di confidenza: 90%, 95%, 99%</h2>
<p>Il livello di confidenza più usato è il 95%, ma non è l&#8217;unico. Vediamo come cambia l&#8217;intervallo al variare del livello:</p>
<table>
<thead>
<tr>
<th>Livello</th>
<th>Valore critico z</th>
<th>IC per il nostro esempio (media)</th>
</tr>
</thead>
<tbody>
<tr>
<td>90%</td>
<td>1.645</td>
<td>[196.40, 203.60]</td>
</tr>
<tr>
<td>95%</td>
<td>1.960</td>
<td>[195.52, 204.48]</td>
</tr>
<tr>
<td>99%</td>
<td>2.576</td>
<td>[193.36, 206.64]</td>
</tr>
</tbody>
</table>
<p>La regola è semplice: <strong>più alta la confidenza, più largo l&#8217;intervallo</strong>. È il prezzo della sicurezza: se vogliamo essere più certi che l&#8217;intervallo contenga il parametro, dobbiamo allargare la rete.</p>
<p>È una scelta di compromesso. Un IC al 99% è quasi certamente corretto, ma è così largo da essere poco utile (&#8220;la media è tra 193 e 207 secondi&#8221; &#8211; e allora?). Un IC al 90% è più stretto e operativamente utile, ma sbaglia più spesso.</p>
<p>Nella pratica quotidiana della SEO e del marketing, il 95% è la convenzione standard. Non c&#8217;è nulla di magico in quel numero (come per il famoso \(\alpha = 0.05\) nei test delle ipotesi), ma è il compromesso che la comunità scientifica ha adottato, e non ha senso reinventare la ruota.</p>
<h2 id="cosa-influenza-larghezza">Cosa influenza la larghezza dell&#8217;IC</h2>
<p>Tre fattori determinano quanto sarà largo (o stretto) il nostro intervallo:</p>
<ol>
<li><strong>La dimensione del campione (\(n\))</strong>: più dati abbiamo, più stretto sarà l&#8217;IC. Questo è intuitivo: più osservazioni raccogliamo, più precisa diventa la nostra stima. La relazione è con \(\sqrt{n}\), il che significa che per dimezzare la larghezza dell&#8217;IC dobbiamo <em>quadruplicare</em> il campione.</li>
<li><strong>La variabilità dei dati (\(s\))</strong>: più i dati sono dispersi, più largo sarà l&#8217;IC. Se il traffico del sito è molto variabile giorno per giorno, la nostra stima della media sarà meno precisa.</li>
<li><strong>Il livello di confidenza</strong>: come visto, più alta la confidenza, più largo l&#8217;intervallo.</li>
</ol>
<p>Dei tre fattori, l&#8217;unico su cui abbiamo un controllo diretto è la dimensione del campione. Ecco perché la domanda &#8220;quanti dati mi servono?&#8221; è così importante. Il <a href="https://www.gironi.it/blog/calcolatore-sample-size-ab-test/">calcolatore di sample size per A/B test</a> ti aiuta a rispondere in modo preciso.</p>
<h2 id="esempio-ctr-organico">Un esempio pratico: IC del CTR organico</h2>
<p>Applichiamo tutto questo a un caso reale. Supponiamo di avere una pagina che in Search Console mostra questi dati per l&#8217;ultimo mese:</p>
<ul>
<li>Impressioni: 2000</li>
<li>Click: 140</li>
<li>CTR osservato: \(\frac{140}{2000} = 0.07\) (7%)</li>
</ul>
<p>Costruiamo l&#8217;IC al 95% per il CTR:</p>
<pre><code class="language-r">n &lt;- 2000
click &lt;- 140
ctr &lt;- click / n

se &lt;- sqrt(ctr * (1 - ctr) / n)
z &lt;- qnorm(0.975)

lower &lt;- ctr - z * se
upper &lt;- ctr + z * se

cat("CTR osservato:", round(ctr * 100, 2), "%\n")
cat("IC al 95%:", round(lower * 100, 2), "% -", round(upper * 100, 2), "%\n")</code></pre>
<p>Risultato: CTR osservato 7.00%, IC al 95%: 5.88% &#8211; 8.12%.</p>
<p>Questo ci dice qualcosa di importante: quel 7% è una stima ragionevolmente precisa (il margine è di circa un punto percentuale in ogni direzione), grazie alle 2000 impressioni. Se avessimo avuto solo 200 impressioni, l&#8217;intervallo sarebbe stato molto più largo e la stima molto meno affidabile.</p>
<p>È un&#8217;informazione preziosissima quando facciamo confronti. Se un&#8217;altra pagina ha un CTR del 6.5% su un numero simile di impressioni, possiamo già intuire (e con un test formale verificare) che la differenza non è statisticamente significativa: i due intervalli si sovrappongono ampiamente.</p>
<h2 id="prova-tu">Prova tu</h2>
<p>Una campagna di email marketing ha prodotto questi risultati nell&#8217;ultimo trimestre:</p>
<ul>
<li>Email inviate: 1200</li>
<li>Aperture: 312</li>
<li>Click nel corpo dell&#8217;email: 78</li>
</ul>
<ol>
<li>Calcola l&#8217;intervallo di confidenza al 95% per il <strong>tasso di apertura</strong> (open rate)</li>
<li>Calcola l&#8217;intervallo di confidenza al 95% per il <strong>tasso di click</strong> (click rate, sul totale delle email inviate)</li>
<li>Un collega sostiene che &#8220;il nostro open rate è del 30%&#8221;. Sulla base del tuo IC, questa affermazione è compatibile con i dati?</li>
</ol>
<p>Suggerimento: usa la formula dell&#8217;IC per proporzioni. In R, <code>prop.test(successi, totale)</code> fa tutto il lavoro.</p>
<p>Abbiamo visto come l&#8217;intervallo di confidenza trasformi una stima puntuale (un numero solo, illusoriamente preciso) in un&#8217;informazione onesta sulla nostra incertezza. Ma una domanda resta aperta: se la larghezza dell&#8217;IC dipende dalla dimensione del campione, <strong>quanti dati ci servono</strong> per ottenere un intervallo sufficientemente stretto da essere utile? È il problema della <em>dimensione campionaria</em>: il <a href="https://www.gironi.it/blog/calcolatore-sample-size-ab-test/">calcolatore di sample size</a> ti permette di determinare il numero esatto di osservazioni necessarie per il tuo A/B test.</p>
<hr>
<h3>Per approfondire</h3>
<p>Se vuoi approfondire il tema dell&#8217;incertezza nelle stime e la logica degli intervalli di confidenza, <a href="https://www.amazon.it/dp/8806246623?tag=consulenzeinf-21" target="_blank" rel="nofollow sponsored noopener"><em>L&#8217;arte della statistica</em></a> di David Spiegelhalter è una lettura che consiglio. Spiegelhalter — professore a Cambridge e Fellow della Royal Society — ha il dono raro di rendere la statistica accessibile senza banalizzarla, ed è esattamente ciò che serve per capire davvero cosa un intervallo di confidenza ci dice e, soprattutto, cosa non ci dice.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.gironi.it/blog/intervalli-di-confidenza/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Un&#8217;introduzione all&#8217;Analisi delle Componenti Principali (PCA)</title>
		<link>https://www.gironi.it/blog/una-introduzione-allanalisi-delle-componenti-principali-pca/</link>
					<comments>https://www.gironi.it/blog/una-introduzione-allanalisi-delle-componenti-principali-pca/#respond</comments>
		
		<dc:creator><![CDATA[paolo]]></dc:creator>
		<pubDate>Sun, 23 Mar 2025 16:54:08 +0000</pubDate>
				<category><![CDATA[statistica]]></category>
		<category><![CDATA[pca]]></category>
		<guid isPermaLink="false">https://www.gironi.it/blog/?p=3349</guid>

					<description><![CDATA[L&#8217;Analisi delle Componenti Principali (PCA) è una tecnica statistica ampiamente utilizzata per ridurre la complessità di grandi set di dati. Essa mira a diminuire il numero di variabili, trasformando quelle potenzialmente correlate in un insieme più ristretto di variabili non correlate, denominate componenti principali . Questa metodologia risponde all&#8217;esigenza di rappresentare fenomeni complessi, descritti da &#8230; <a href="https://www.gironi.it/blog/una-introduzione-allanalisi-delle-componenti-principali-pca/" class="more-link">Leggi tutto<span class="screen-reader-text"> "Un&#8217;introduzione all&#8217;Analisi delle Componenti Principali (PCA)"</span></a>]]></description>
										<content:encoded><![CDATA[
<p>L&#8217;Analisi delle Componenti Principali (PCA) è una tecnica statistica ampiamente utilizzata per <strong>ridurre la complessità di grandi set di dati</strong>. Essa mira a <strong>diminuire il numero di variabili</strong>, trasformando quelle potenzialmente correlate in un insieme più ristretto di variabili non correlate, denominate <strong>componenti principali</strong> . </p>



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



<p class="has-light-gray-background-color has-background">Questa metodologia risponde all&#8217;esigenza di rappresentare fenomeni complessi, descritti da un elevato numero di variabili, tramite un numero inferiore di variabili che mantengano la maggior parte dell&#8217;informazione originale . L&#8217;obiettivo primario è quello di massimizzare la varianza catturata da queste nuove componenti, assicurando così una perdita minima di informazioni .</p>



<p>In pratica, la PCA si rivela particolarmente utile quando ci si trova di fronte a dataset con molte variabili che presentano correlazioni tra loro . In tali scenari, l&#8217;analisi diretta di tutte le variabili può diventare complessa e difficile da interpretare. La PCA permette di concentrare l&#8217;informazione contenuta nelle variabili originali in un numero ridotto di componenti principali, facilitando l&#8217;identificazione di pattern e tendenze sottostanti .</p>



<p>Per comprendere meglio il concetto di riduzione della dimensionalità, si può immaginare una città con molte strade interconnesse. La PCA agisce in modo simile a un sistema di pianificazione urbana che identifica le principali arterie di traffico. Concentrandosi su queste &#8220;strade principali&#8221;, si ottiene una visione chiara della struttura della città e dei suoi flussi di traffico, senza dover analizzare ogni singola via secondaria .</p>



<p>Nel contesto specifico del web marketing e dell&#8217;analisi dei dati, la PCA si dimostra uno strumento potente per diverse ragioni. Essa è <strong>efficace per visualizzare ed esplorare dataset ad alta dimensionalità</strong>, consentendo di <strong>identificare facilmente tendenze, modelli o valori anomali</strong> . Inoltre, viene comunemente impiegata nella fase di pre-elaborazione dei dati per algoritmi di machine learning, in quanto è in grado di estrarre le caratteristiche più informative da set di dati di grandi dimensioni, preservando le informazioni più rilevanti . Un ulteriore vantaggio è la sua capacità di <strong>minimizzare o eliminare la <em>multicollinearità</em> e l&#8217;<em>overfitting</em></strong>, problemi frequenti in dataset di web marketing caratterizzati da numerose variabili potenzialmente correlate .</p>


				<div class="wp-block-uagb-table-of-contents uagb-toc__align-left uagb-toc__columns-1  uagb-block-f3e7e877      "
					data-scroll= "1"
					data-offset= "30"
					style=""
				>
				<div class="uagb-toc__wrap">
						<div class="uagb-toc__title">
							Di cosa parleremo						</div>
																						<div class="uagb-toc__list-wrap ">
						<ol class="uagb-toc__list"><li class="uagb-toc__list"><a href="#i-fondamenti-matematici-della-pca" class="uagb-toc-link__trigger">I Fondamenti Matematici della PCA</a><li class="uagb-toc__list"><a href="#applicazioni-pratiche-della-pca-in-diversi-settori" class="uagb-toc-link__trigger">Applicazioni Pratiche della PCA in Diversi Settori</a><li class="uagb-toc__list"><a href="#utilizzo-concreto-della-pca-nel-web-marketing-seo-sem-e-analisi-dati" class="uagb-toc-link__trigger">Utilizzo Concreto della PCA nel Web Marketing, SEO, SEM e Analisi Dati</a><li class="uagb-toc__list"><a href="#implementare-la-pca-con-r-esempi-pratici" class="uagb-toc-link__trigger">Implementare la PCA con R: Esempi Pratici</a><ul class="uagb-toc__list"><li class="uagb-toc__list"><a href="#esempio-2-dati-di-performance-di-campagne-pubblicitarie" class="uagb-toc-link__trigger">Esempio 2: Dati di performance di campagne pubblicitarie</a></li></ul></li><li class="uagb-toc__list"><a href="#verifica-e-interpretazione-dei-risultati-della-pca" class="uagb-toc-link__trigger">Verifica e Interpretazione dei Risultati della PCA</a><li class="uagb-toc__list"><a href="#conclusione-sfruttare-la-pca-per-ottimizzare-le-strategie-di-web-marketing" class="uagb-toc-link__trigger">Conclusione: Sfruttare la PCA per Ottimizzare le Strategie di Web Marketing</a></ul></ol>					</div>
									</div>
				</div>
			


<h2 class="wp-block-heading">I Fondamenti Matematici della PCA</h2>



<p>Per comprendere appieno il funzionamento della PCA, è fondamentale familiarizzare con alcuni concetti matematici chiave.</p>



<p>La <strong>varianza</strong> e la <strong>covarianza</strong> sono concetti statistici centrali per la PCA . <br><strong>La varianza misura la dispersione di una singola variabile attorno alla sua media, indicando quanto i suoi valori sono distanti dal valore centrale. <br>La covarianza, invece, quantifica come due variabili cambiano insieme. </strong><br>Una covarianza positiva suggerisce che le variabili tendono ad aumentare o diminuire contemporaneamente, mentre una covarianza negativa indica una relazione inversa . L&#8217;obiettivo della PCA è individuare componenti che presentino la massima varianza possibile, in quanto una maggiore varianza è spesso associata a una maggiore quantità di informazione . La <strong>matrice di covarianza</strong> è uno strumento che riassume le covarianze tra tutte le possibili coppie di variabili in un dataset. Gli elementi diagonali di questa matrice rappresentano le varianze di ciascuna variabile, mentre gli elementi non diagonali indicano le covarianze tra le coppie di variabili . Questa matrice è un input cruciale per l&#8217;algoritmo PCA, in quanto descrive la struttura delle relazioni lineari tra le variabili.</p>



<p>Gli <strong>autovalori</strong> e gli <strong>autovettori</strong> costituiscono il cuore matematico della PCA . In termini semplici, i componenti principali di un dataset sono gli autovettori della sua matrice di covarianza . Un autovettore rappresenta una direzione nello spazio dei dati originali, mentre l&#8217;autovalore associato indica la magnitudine della varianza dei dati lungo quella direzione . In altre parole, gli autovettori identificano le direzioni in cui i dati variano maggiormente, e gli autovalori quantificano l&#8217;importanza di ciascuna di queste direzioni in termini di varianza spiegata .</p>



<p>La <strong>varianza spiegata</strong> è una metrica fondamentale per valutare l&#8217;importanza di ciascuna componente principale . Essa rappresenta la proporzione della varianza totale dei dati originali che viene catturata da una specifica componente principale. Questa proporzione si calcola dividendo l&#8217;autovalore della componente per la somma di tutti gli autovalori . <br>La <strong>varianza spiegata cumulativa</strong> indica la quantità totale di varianza catturata da un certo numero di componenti principali, sommandone le proporzioni individuali . Questa metrica è cruciale per determinare quanti componenti principali è necessario conservare per rappresentare adeguatamente i dati senza perdere una quantità significativa di informazione . </p>



<p>Nota a margine: criteri come la <em>regola (o criterio) di Kaiser</em>, che suggerisce di mantenere solo le componenti con autovalori superiori a 1 , e lo <em>scree plot</em>, un grafico degli autovalori ordinati, che aiuta a identificare il &#8220;gomito&#8221; della curva come punto di taglio , sono utili per guidare la scelta del numero ottimale di componenti principali.</p>



<h2 class="wp-block-heading">Applicazioni Pratiche della PCA in Diversi Settori</h2>



<p>La PCA è una tecnica versatile con un&#8217;<strong>ampia gamma di applicazioni in diversi settori</strong> . In generale, viene impiegata per la riduzione della dimensionalità, la visualizzazione di dati complessi, la rimozione del rumore e l&#8217;estrazione di caratteristiche rilevanti per analisi successive o per l&#8217;addestramento di modelli di machine learning .</p>



<ul class="wp-block-list">
<li>Nel campo dell&#8217;<strong>elaborazione delle immagini</strong>, la PCA è utilizzata per la compressione, riducendo il numero di pixel necessari per rappresentare un&#8217;immagine mantenendo le sue caratteristiche essenziali.</li>



<li>In <strong>genomica e bioinformatica</strong>, aiuta a identificare i geni più critici che determinano variazioni, riducendo la complessità dei dati genomici. </li>



<li>In <strong>finanza</strong>, la PCA può essere applicata per l&#8217;analisi del rischio e l&#8217;ottimizzazione del portafoglio, identificando i fattori economici chiave che influenzano la performance degli asset. </li>



<li>Nel settore <strong>sanitario</strong>, viene utilizzata per l&#8217;analisi di immagini mediche come le risonanze magnetiche, per migliorare la visualizzazione e facilitare la diagnosi .</li>



<li>Anche in <strong>sicurezza</strong>, la PCA trova applicazione nei sistemi biometrici per il riconoscimento delle impronte digitali, estraendo le caratteristiche più rilevanti.</li>



<li>Infine, in <strong>climatologia</strong>, la tecnica è impiegata per analizzare e interpretare grandi set di dati ambientali .</li>
</ul>



<p>Per quanto riguarda specificamente l&#8217;<strong>analisi dei dati e il marketing</strong>, la PCA offre diversi vantaggi . Consente di semplificare dataset complessi, ridurre il rumore presente nei dati, estrarre le caratteristiche più significative per ulteriori analisi e migliorare le prestazioni di modelli predittivi. La sua capacità di visualizzare dati ad alta dimensionalità in uno spazio a due o tre dimensioni facilita l&#8217;identificazione di pattern, tendenze e outlier, rendendo l&#8217;interpretazione dei dati più accessibile .</p>



<h2 class="wp-block-heading">Utilizzo Concreto della PCA nel Web Marketing, SEO, SEM e Analisi Dati</h2>



<p>L&#8217;Analisi delle Componenti Principali può essere applicata in modo efficace in diversi ambiti del web marketing, SEO, SEM e analisi dati per ottenere insight significativi e ottimizzare le strategie.</p>



<p>Nell&#8217;analisi dei dati di <strong>parole chiave</strong>, la PCA può essere utilizzata per ridurre la dimensionalità degli embedding di parole o documenti . Un set di dati di parole chiave può essere caratterizzato da numerose metriche come il volume di ricerca, il livello di concorrenza, il costo per clic (CPC) e varie caratteristiche semantiche. Applicando la PCA, è possibile condensare queste molteplici dimensioni in un numero inferiore di componenti principali che catturano i temi o le caratteristiche sottostanti delle parole chiave. Questo può semplificare l&#8217;analisi, ad esempio, identificando gruppi di parole chiave con profili di performance simili.</p>



<p>Per l&#8217;<strong>analisi delle metriche di traffico web</strong>, la PCA può aiutare a identificare pattern significativi . Le metriche di traffico come le sessioni, la frequenza di rimbalzo, il tempo trascorso sulla pagina e le conversioni da diverse fonti possono essere analizzate con la PCA per scoprire variabili latenti che guidano la performance del sito web. Ad esempio, potrebbe emergere una componente principale correlata all&#8217;engagement degli utenti e una seconda componente legata all&#8217;efficacia delle diverse fonti di traffico. Questa comprensione può informare le decisioni sull&#8217;allocazione del budget di marketing e sull&#8217;ottimizzazione del sito web.</p>



<p>La <strong>segmentazione degli utenti</strong> in base al comportamento online e ai dati demografici è un&#8217;altra area in cui la PCA si rivela preziosa . Analizzando dati utente con molte variabili, come la cronologia degli acquisti, il comportamento di navigazione e le informazioni demografiche, la PCA può identificare raggruppamenti naturali di utenti con caratteristiche simili. Questo consente di creare segmenti di clientela più definiti e di indirizzare le attività di marketing in modo più efficace.</p>



<p>Infine, la PCA può contribuire a migliorare l&#8217;<strong>analisi delle performance delle campagne pubblicitarie</strong> . Le metriche di performance delle campagne, come le impressioni, i clic, le conversioni e il costo per acquisizione, possono essere analizzate per identificare i fattori chiave che determinano il successo delle campagne. Ad esempio, la PCA potrebbe rivelare che una combinazione specifica di creatività dell&#8217;annuncio e parametri di targeting è il principale motore delle conversioni, fornendo indicazioni preziose per ottimizzare le strategie delle campagne e migliorare il ritorno sull&#8217;investimento.</p>



<h2 class="wp-block-heading">Implementare la PCA con R: Esempi Pratici</h2>



<p>Per implementare la PCA in R, è necessario innanzitutto configurare l&#8217;ambiente e caricare le librerie necessarie. Le librerie fondamentali includono <code>stats</code> per le funzioni base di PCA come <code>prcomp()</code> e <code>princomp()</code>, <code>factoextra</code> per la visualizzazione dei risultati, e potenzialmente <code>dplyr</code> e <code>ggplot2</code> per la manipolazione e la visualizzazione dei dati <sup></sup>. &nbsp;</p>



<p>Per illustrare l&#8217;applicazione della PCA nel contesto del web marketing, possiamo creare dei set di dati sintetici che simulano scenari reali.</p>



<p><strong>Esempio 1: Dati di posizionamento di parole chiave</strong></p>



<p>Supponiamo di avere un dataset con informazioni su diverse parole chiave, tra cui il volume di ricerca mensile, un punteggio di concorrenza (da 0 a 1), il costo per clic (CPC) medio e la posizione media nella pagina dei risultati di ricerca di Google e Bing. Possiamo creare un dataframe sintetico in R come segue:</p>



<pre class="wp-block-code"><code># Creazione di dati sintetici per il posizionamento di parole chiave
set.seed(123)
n_keywords &lt;- 100
keywords &lt;- paste0("keyword_", 1:n_keywords)
search_volume &lt;- round(runif(n_keywords, min = 100, max = 10000))
competition &lt;- runif(n_keywords, min = 0.1, max = 0.9)
cpc &lt;- round(rnorm(n_keywords, mean = 2.5, sd = 1), 2)
ranking_google &lt;- round(rnorm(n_keywords, mean = 15, sd = 10), 0)
ranking_bing &lt;- round(rnorm(n_keywords, mean = 12, sd = 8), 0)

keyword_data &lt;- data.frame(
  Keyword = keywords,
  Search_Volume = search_volume,
  Competition = competition,
  CPC = cpc,
  Ranking_Google = ranking_google,
  Ranking_Bing = ranking_bing
)

head(keyword_data)</code></pre>



<pre>
    Keyword Search_Volume Competition  CPC Ranking_Google Ranking_Bing
1 keyword_1          2947   0.5799912 1.79             37            6
2 keyword_2          7904   0.3662588 2.76             28            6
3 keyword_3          4149   0.4908904 2.25             12            4
4 keyword_4          8842   0.8635791 2.15             20            4
5 keyword_5          9411   0.4863219 1.55             11            9
6 keyword_6           551   0.8122802 2.45             10           15
</pre>



<h5 class="wp-block-heading">Esempio 2: Dati di performance di campagne pubblicitarie</h5>



<p>Similmente, possiamo creare dati sintetici per le performance di campagne pubblicitarie, includendo metriche come le impressioni, i clic, le conversioni, il costo totale, il Click-Through Rate (CTR) e il Costo per Acquisizione (CPA).</p>



<pre class="wp-block-code"><code># Creazione di dati sintetici per la performance di campagne pubblicitarie
set.seed(456)
n_campaigns &lt;- 50
campaign_ids &lt;- paste0("campaign_", 1:n_campaigns)
impressions &lt;- round(runif(n_campaigns, min = 1000, max = 100000))
clicks &lt;- round(impressions * runif(n_campaigns, min = 0.01, max = 0.1))
conversions &lt;- round(clicks * runif(n_campaigns, min = 0.005, max = 0.05))
cost &lt;- round(clicks * runif(n_campaigns, min = 0.1, max = 2), 2)
ctr &lt;- round((clicks / impressions) * 100, 2)
cpa &lt;- round(cost / conversions, 2)
cpa&#91;is.nan(cpa)] &lt;- 0 # Gestione dei NaN

campaign_data &lt;- data.frame(
  Campaign_ID = campaign_ids,
  Impressions = impressions,
  Clicks = clicks,
  Conversions = conversions,
  Cost = cost,
  CTR = ctr,
  CPA = cpa
)

head(campaign_data)</code></pre>



<pre>
  Campaign_ID Impressions Clicks Conversions    Cost  CTR    CPA
1  campaign_1        9866    873          14 1093.32 8.85  78.09
2  campaign_2       21841   1788          20 3360.17 8.19 168.01
3  campaign_3       73563   2866          66 2764.48 3.90  41.89
4  campaign_4       85361   4121          73 1422.12 4.83  19.48
5  campaign_5       79051   3432         133 1623.28 4.34  12.21
6  campaign_6       33864   3064         126 6047.70 9.05  48.00
</pre>



<p>Una volta creati i dataset, è possibile eseguire la PCA utilizzando la funzione <code>prcomp()</code>. È fondamentale scalare i dati prima di applicare la PCA per evitare che variabili con scale più ampie dominino l&#8217;analisi .</p>



<pre class="wp-block-code"><code># Applicazione della PCA ai dati di posizionamento di parole chiave
pca_keywords &lt;- prcomp(keyword_data&#91;, 2:6], scale. = TRUE)
summary(pca_keywords)

# Applicazione della PCA ai dati di performance di campagne pubblicitarie
pca_campaigns &lt;- prcomp(campaign_data&#91;, 2:7], scale. = TRUE)
summary(pca_campaigns)</code></pre>



<pre>
Importance of components:
                          PC1    PC2    PC3     PC4    PC5     PC6
Standard deviation     1.7837 1.2229 0.9303 0.49392 0.4250 0.18138
Proportion of Variance 0.5303 0.2492 0.1442 0.04066 0.0301 0.00548
Cumulative Proportion  0.5303 0.7795 0.9238 0.96442 0.9945 1.00000
</pre>



<p>L&#8217;output della funzione <code>summary()</code> fornisce informazioni cruciali come le deviazioni standard delle componenti principali, la proporzione di varianza spiegata da ciascuna componente e la proporzione cumulativa di varianza spiegata. I <strong>loadings</strong> (o matrice di rotazione), accessibili tramite <code>pca_keywords$rotation</code> e <code>pca_campaigns$rotation</code>, mostrano la correlazione tra le variabili originali e le componenti principali, aiutando a interpretare il significato di ciascuna componente. Gli <strong>scores</strong> (o coordinate delle componenti), accessibili tramite <code>pca_keywords$x</code> e <code>pca_campaigns$x</code>, rappresentano la proiezione dei dati originali sul nuovo spazio definito dalle componenti principali.</p>



<p>Per visualizzare i risultati, si possono utilizzare lo <strong>scree plot</strong> e il <strong>biplot</strong>. Lo scree plot (ottenibile con <code>plot(pca_keywords)</code> e <code>plot(pca_campaigns)</code>) mostra gli autovalori in ordine decrescente e aiuta a identificare il numero ottimale di componenti da conservare. Il biplot (ottenibile con <code>biplot(pca_keywords)</code> e <code>biplot(pca_campaigns)</code>) visualizza sia gli scores delle osservazioni che i loadings delle variabili nel piano definito dalle prime due componenti principali, fornendo una rappresentazione visiva delle relazioni tra osservazioni e variabili <sup></sup>. &nbsp;</p>



<h2 class="wp-block-heading">Verifica e Interpretazione dei Risultati della PCA</h2>



<p>Per controllare l&#8217;accuratezza del codice R e delle interpretazioni, è consigliabile consultare la documentazione ufficiale delle funzioni <code>prcomp()</code> e <code>princomp()</code> nel pacchetto <code>stats</code> di R, nonché la documentazione della libreria <code>factoextra</code> per le visualizzazioni . Se necessario, è possibile confrontare i risultati con quelli ottenuti utilizzando altri software statistici o risorse online. È importante tenere presente le assunzioni sottostanti alla PCA, come la linearità delle relazioni tra le variabili  e la sensibilità alla scala dei dati , nonché l&#8217;impatto potenziale degli outlier .</p>



<p>Dare un senso alle componenti principali nel contesto dei dati di web marketing richiede una comprensione del significato delle variabili originali e di come queste contribuiscono a ciascuna componente, come indicato dai loadings . Ad esempio, se nella PCA sui dati di posizionamento delle parole chiave la prima componente principale ha loadings elevati e positivi per il volume di ricerca e il CPC, potrebbe essere interpretata come una misura di &#8220;parole chiave ad alto valore potenziale&#8221;. L&#8217;interpretazione richiede una solida conoscenza del dominio del web marketing.</p>



<p class="has-light-gray-background-color has-background"><strong>È importante considerare le limitazioni della PCA. Essa assume relazioni lineari tra le variabili e può comportare una perdita di informazione quando si riduce la dimensionalità.</strong> </p>



<p>Per dati con relazioni non lineari, tecniche alternative come t-SNE e UMAP potrebbero essere più appropriate .</p>



<h2 class="wp-block-heading">Conclusione: Sfruttare la PCA per Ottimizzare le Strategie di Web Marketing</h2>



<p>L&#8217;Analisi delle Componenti Principali si presenta come uno strumento analitico potente e versatile per l&#8217;ottimizzazione delle strategie di web marketing. I vantaggi derivanti dall&#8217;utilizzo della PCA in questo ambito sono molteplici. Innanzitutto, la sua capacità di <strong>ridurre la dimensionalità</strong> di dataset complessi consente di semplificare l&#8217;analisi e di focalizzarsi sulle informazioni più rilevanti . In secondo luogo, la PCA permette di <strong>identificare pattern sottostanti</strong> nei dati che potrebbero non essere evidenti con un&#8217;analisi superficiale, rivelando relazioni significative tra diverse metriche di web marketing . Inoltre, l&#8217;utilizzo della PCA come fase di pre-elaborazione può <strong>migliorare le performance di modelli predittivi</strong>, riducendo il rumore e la multicollinearità nei dati . Infine, la possibilità di <strong>visualizzare dati ad alta dimensionalità</strong> in uno spazio ridotto facilita la comprensione e la comunicazione degli insight derivanti dall&#8217;analisi .</p>



<p>Per ulteriori esplorazioni e applicazioni avanzate, si potrebbe considerare l&#8217;impiego della PCA come fase preliminare per algoritmi di clustering, al fine di segmentare in modo più efficace parole chiave, utenti o campagne pubblicitarie. L&#8217;integrazione della PCA in pipeline di modellazione predittiva potrebbe portare a modelli più robusti e interpretabili. Infine, l&#8217;approfondimento di tecniche come la <em>sparse PCA</em> potrebbe essere utile per selezionare in modo intrinseco le variabili più importanti nel contesto del web marketing .</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.gironi.it/blog/una-introduzione-allanalisi-delle-componenti-principali-pca/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Guida ai Test Statistici per analisi A/B</title>
		<link>https://www.gironi.it/blog/guida-ai-test-statistici-per-analisi-a-b/</link>
					<comments>https://www.gironi.it/blog/guida-ai-test-statistici-per-analisi-a-b/#respond</comments>
		
		<dc:creator><![CDATA[paolo]]></dc:creator>
		<pubDate>Thu, 14 Mar 2024 09:53:42 +0000</pubDate>
				<category><![CDATA[statistica]]></category>
		<category><![CDATA[test statistici]]></category>
		<guid isPermaLink="false">https://www.gironi.it/blog/?p=3111</guid>

					<description><![CDATA[I&#160;test statistici&#160;sono strumenti fondamentali per l’analisi dei dati e la presa di decisioni informate. Scegliere il test appropriato dipende dalle caratteristiche dei dati, dalle ipotesi da testare e dalle assunzioni sottostanti. In questo blog, ho trattato separatamente, con appositi articoli, ciascuno dei principali test statistici. È infatti decisivo comprendere le condizioni di applicabilità di ciascun &#8230; <a href="https://www.gironi.it/blog/guida-ai-test-statistici-per-analisi-a-b/" class="more-link">Leggi tutto<span class="screen-reader-text"> "Guida ai Test Statistici per analisi A/B"</span></a>]]></description>
										<content:encoded><![CDATA[
<p>I&nbsp;<strong>test statistici&nbsp;</strong>sono strumenti fondamentali per l’analisi dei dati e la presa di decisioni informate. Scegliere il test appropriato dipende dalle caratteristiche dei dati, dalle ipotesi da testare e dalle assunzioni sottostanti.</p>



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



<p>In questo blog, ho trattato separatamente, con appositi articoli, ciascuno dei principali test statistici. È infatti decisivo comprendere le condizioni di applicabilità di ciascun test per ottenere risultati affidabili e interpretazioni corrette.</p>



<p>Ciò che mi ripropongo in questo articolo è una “visione d’insieme”, uno accanto all’altro, dei più comuni test che possono trovare applicabilità quotidiana per una moltitudine di analisi relative al mondo del web marketing e per A/B test efficaci. Si tratta di un primo sguardo comparativo, che idealmente dovrebbe spingere al necessario approfondimento per ogni singolo tema, ma che ho voluto corredare di semplicissimi esempi pratici, al fine di stimolare la curiosità del lettore.</p>


				<div class="wp-block-uagb-table-of-contents uagb-toc__align-left uagb-toc__columns-1  uagb-block-1e8b188e      "
					data-scroll= "1"
					data-offset= "30"
					style=""
				>
				<div class="uagb-toc__wrap">
						<div class="uagb-toc__title">
							I Test di cui tratteremo						</div>
																						<div class="uagb-toc__list-wrap ">
						<ol class="uagb-toc__list"><li class="uagb-toc__list"><a href="#il-test-z" class="uagb-toc-link__trigger">Il Test Z</a><li class="uagb-toc__list"><a href="#il-test-t-di-student" class="uagb-toc-link__trigger">Il Test t di Student</a><li class="uagb-toc__list"><a href="#il-test-t-di-welch" class="uagb-toc-link__trigger">Il Test t di Welch</a><li class="uagb-toc__list"><a href="#il-test-del-chi-quadrato" class="uagb-toc-link__trigger">Il Test del chi-quadrato</a><li class="uagb-toc__list"><a href="#lanalisi-della-varianza-anova" class="uagb-toc-link__trigger">L&#039;Analisi della varianza (ANOVA)</a><li class="uagb-toc__list"><a href="#il-test-u-di-mann-whitney" class="uagb-toc-link__trigger">Il Test U di Mann-Whitney</a><li class="uagb-toc__list"><a href="#il-test-esatto-di-fisher" class="uagb-toc-link__trigger">Il Test esatto di Fisher</a><li class="uagb-toc__list"><a href="#uno-sguardo-dinsieme-in-una-tabella" class="uagb-toc-link__trigger">Uno sguardo d&#039;insieme in una tabella</a><li class="uagb-toc__list"><a href="#potrebbe-interessarti-anche" class="uagb-toc-link__trigger">Potrebbe interessarti anche</a></ol>					</div>
									</div>
				</div>
			


<h3 class="wp-block-heading">Il Test Z</h3>



<p class="has-light-gray-background-color has-background">Il test Z è un test statistico di ipotesi utilizzato per <strong>verificare se la media campionaria differisce in modo significativo dalla media della popolazione</strong>, quando la varianza della popolazione è nota e la dimensione del campione è grande (di solito maggiore di 30).</p>



<p>Il test Z si applica quando si soddisfano le seguenti condizioni:</p>



<ul class="wp-block-list">
<li>La dimensione del campione è grande (n &gt; 30)</li>



<li>La varianza della popolazione è nota</li>



<li>I dati sono approssimativamente normalmente distribuiti</li>
</ul>



<p>Il test Z viene utilizzato per determinare se esiste una differenza significativa tra due medie di proporzioni, come ad esempio i tassi di clic. Può essere utilizzato, ad esempio, per verificare se l&#8217;introduzione di una nuova funzionalità su un sito web ha portato a un aumento significativo del tasso di conversione.</p>



<p><strong>Caso d&#8217;esempio:</strong> Un sito di e-commerce vuole testare se una nuova versione del carrello ha migliorato il tasso di conversione. Il tasso di conversione precedente è del 5% con una varianza nota di 0,0025. Dopo aver raccolto un campione di 500 utenti, il nuovo tasso di conversione osservato è del 6%. Verifichiamo se la differenza è statisticamente significativa utilizzando il test Z.</p>



<pre class="wp-block-preformatted"># Tasso di conversione originale
p0 &lt;- 0.05
# Varianza originale
var0 &lt;- 0.0025
# Dimensione del campione
n &lt;- 500
# Tasso di conversione osservato
p1 &lt;- 0.06

# Calcolo del test Z
z &lt;- (p1 - p0) / sqrt(var0/n)
z
</pre>



<pre class="wp-block-preformatted">[1] 4.472136</pre>



<p>Il valore z osservato è 4,47. Assumendo un livello di significatività di 0,05, il valore critico di z è 1,96. Poiché il valore osservato è superiore a 1,96, possiamo respingere l&#8217;ipotesi nulla e concludere che la differenza nel tasso di conversione è statisticamente significativa.</p>



<h3 class="wp-block-heading">Il Test t di Student</h3>



<p class="has-light-gray-background-color has-background">Il test t di Student è un test statistico di ipotesi utilizzato per <strong>verificare se la media di un campione differisce in modo significativo da un valore ipotetico o se due campioni hanno medie significativamente diverse.</strong> Questo test si applica quando la <strong>varianza della popolazione non è nota e la dimensione del campione è piccola </strong>(di solito minore di 30).</p>



<p>Il test t di Student si applica quando si soddisfano le seguenti condizioni:</p>



<ul class="wp-block-list">
<li>La dimensione del campione è piccola (n &lt; 30)</li>



<li>La varianza della popolazione non è nota</li>



<li>I dati sono approssimativamente normalmente distribuiti</li>
</ul>



<p>Il test t di Student viene utilizzato per confrontare le medie di due gruppi distinti, come ad esempio il tempo medio trascorso sul sito per gli utenti che hanno visto una variante A rispetto a quelli che hanno visto una variante B.</p>



<p><strong>Caso d&#8217;esempio:</strong> Un&#8217;azienda vuole testare se una nuova pagina di destinazione ha un impatto sul tempo medio trascorso sul sito. Viene condotto un esperimento A/B con 20 utenti per ogni gruppo. Il tempo medio trascorso sul sito per il gruppo di controllo è di 3 minuti, mentre per il gruppo di test è di 4 minuti. Verifichiamo se la differenza è statisticamente significativa utilizzando il test t di Student.</p>



<pre class="wp-block-preformatted"># Dati gruppo di controllo
control &lt;- c(2.5, 3.1, 2.8, 3.2, 2.9, 3.5, 3.0, 2.7, 3.3, 2.6, 3.4, 3.1, 2.8, 2.9, 3.2, 3.0, 3.1, 2.7, 3.3, 2.8)

# Dati gruppo di test
test &lt;- c(3.8, 4.2, 3.9, 4.1, 4.3, 3.7, 4.5, 4.0, 3.6, 4.2, 4.1, 3.9, 4.3, 3.8, 4.0, 4.2, 3.7, 4.4, 4.1, 3.9)

# Test t di Student
t.test(test, control, alternative = "greater")

data:  test and control
t = 12.585, df = 37.611, p-value = 2.354e-15
alternative hypothesis: true difference in means is greater than 0
95 percent confidence interval:
 0.900641      Inf
sample estimates:
mean of x mean of y 
    4.035     2.995 </pre>



<p>Il test t di Student fornisce un valore p inferiore al livello di significatività di 0,05; dunque possiamo respingere l&#8217;ipotesi nulla e concludere che la differenza nel tempo medio trascorso sul sito tra i due gruppi è statisticamente significativa.</p>



<h3 class="wp-block-heading">Il Test t di Welch</h3>



<p class="has-light-gray-background-color has-background">Il test t di Welch è una variante del test t di Student che<strong> non richiede l&#8217;assunzione di uguaglianza delle varianze tra i due campioni</strong>. Questo test si applica quando le dimensioni dei campioni e le varianze sono diverse.</p>



<p>Il test t di Welch si applica quando si soddisfano le seguenti condizioni:</p>



<ul class="wp-block-list">
<li>Le dimensioni dei campioni sono diverse</li>



<li>Le varianze dei campioni sono diverse</li>



<li>I dati sono approssimativamente normalmente distribuiti</li>
</ul>



<p>Il test t di Welch viene utilizzato per confrontare le medie di due gruppi distinti, come ad esempio il reddito medio degli utenti che hanno effettuato un acquisto in un sito di e-commerce rispetto a quelli che non hanno effettuato acquisti.</p>



<p><strong>Caso d&#8217;esempio:</strong> Un&#8217;azienda vuole testare se il reddito medio degli utenti che hanno effettuato un acquisto differisce da quello degli utenti che non hanno effettuato acquisti. Viene condotto un esperimento con 30 utenti che hanno effettuato un acquisto e 20 utenti che non hanno effettuato acquisti. Il reddito medio degli utenti che hanno effettuato un acquisto è di $50.000, mentre quello degli utenti che non hanno effettuato acquisti è di $40.000. Verifichiamo se la differenza è statisticamente significativa utilizzando il test t di Welch.</p>



<pre class="wp-block-preformatted"># Dati gruppo di acquirenti
buyers &lt;- c(48000, 52000, 49000, 51000, 47000, 55000, 53000, 50000, 46000, 54000,
            49000, 52000, 51000, 48000, 53000, 47000, 54000, 50000, 49000, 52000,
            48000, 51000, 53000, 47000, 52000, 49000, 50000, 51000, 48000, 53000)

# Dati gruppo di non acquirenti
non_buyers &lt;- c(38000, 42000, 39000, 41000, 37000, 43000, 40000, 39000, 42000, 38000,
                41000, 40000, 39000, 42000, 37000, 41000, 38000, 39000, 40000, 41000)

# Test t di Welch
t.test(buyers, non_buyers, alternative = "greater", var.equal = FALSE)</pre>



<pre class="wp-block-preformatted">Welch Two Sample t-test

data:  buyers and non_buyers
t = 17.811, df = 47.626, p-value &lt; 2.2e-16
alternative hypothesis: true difference in means is greater than 0
95 percent confidence interval:
 9556.368      Inf
sample estimates:
mean of x mean of y 
    50400     39850 </pre>



<p>Il test t di Welch fornisce un valore p pari a 2.2e-16. Poiché questo valore è inferiore al livello di significatività di 0,05, possiamo respingere l&#8217;ipotesi nulla e concludere che la differenza nel reddito medio tra gli utenti che hanno effettuato un acquisto e quelli che non hanno effettuato acquisti è statisticamente significativa.</p>



<h3 class="wp-block-heading">Il Test del chi-quadrato</h3>



<p class="has-light-gray-background-color has-background">Il test del chi-quadrato è un <strong>test statistico non parametrico</strong> utilizzato per verificare <strong>se esiste una relazione significativa tra due variabili categoriche </strong>o <strong>se la distribuzione osservata di una variabile categorica differisce dalla distribuzione attesa</strong>.</p>



<p>Il test del chi-quadrato si applica quando si soddisfano le seguenti condizioni:</p>



<ul class="wp-block-list">
<li>Le variabili sono categoriche</li>



<li>I campioni sono indipendenti</li>



<li>Le frequenze attese in ogni cella della tabella di contingenza sono maggiori di 5</li>
</ul>



<p>Il test del chi-quadrato viene utilizzato per analizzare l&#8217;associazione tra due variabili categoriche, come ad esempio la relazione tra il genere degli utenti e la preferenza per un determinato prodotto.</p>



<p><strong>Caso d&#8217;esempio:</strong> Un negozio di abbigliamento vuole capire se c&#8217;è una relazione tra il genere degli utenti e la preferenza per una particolare linea di prodotti. Viene condotto un sondaggio su 200 utenti, di cui 100 uomini e 100 donne. I risultati mostrano che 60 uomini e 40 donne preferiscono la linea di prodotti A, mentre 40 uomini e 60 donne preferiscono la linea di prodotti B. Verifichiamo se c&#8217;è una relazione significativa tra genere e preferenza utilizzando il test del chi-quadrato.</p>



<pre class="wp-block-preformatted"># Dati osservati
observed &lt;- matrix(c(60, 40, 40, 60), nrow = 2, byrow = TRUE)
rownames(observed) &lt;- c("Uomini", "Donne")
colnames(observed) &lt;- c("Linea A", "Linea B")
observed</pre>



<pre class="wp-block-preformatted">##        Linea A Linea B
## Uomini      60      40
## Donne       40      60</pre>



<pre class="wp-block-preformatted"># Test del chi-quadrato
chisq.test(observed)</pre>



<pre class="wp-block-preformatted">## Pearson's Chi-squared test with Yates' continuity correction

## data:  observed
## X-squared = 7.22, df = 1, p-value = 0.00721
</pre>



<p>Il test del chi-quadrato fornisce un valore p pari a 0,00721. Poiché questo valore è inferiore al livello di significatività di 0,05, possiamo respingere l&#8217;ipotesi nulla e concludere che esiste una relazione significativa tra il genere degli utenti e la preferenza per una particolare linea di prodotti.</p>



<h3 class="wp-block-heading">L&#8217;Analisi della varianza (ANOVA)</h3>



<p class="has-light-gray-background-color has-background">L&#8217;analisi della varianza (ANOVA) è un test statistico utilizzato per <strong>confrontare le medie di tre o più gruppi </strong>e determinare se esistono differenze significative tra di essi.</p>



<p>L&#8217;analisi della varianza si applica quando si soddisfano le seguenti condizioni:</p>



<ul class="wp-block-list">
<li>I dati sono approssimativamente normalmente distribuiti</li>



<li>Le varianze dei gruppi sono uguali (<em>omoschedasticità</em>)</li>



<li>I campioni sono indipendenti</li>
</ul>



<p>L&#8217;analisi della varianza viene utilizzata per confrontare le medie di diverse versioni di un prodotto, di diverse strategie di marketing o di diverse tecniche di vendita.</p>



<p><strong>Caso d&#8217;esempio:</strong> Un&#8217;azienda vuole testare l&#8217;efficacia di tre diverse strategie di marketing (A, B e C) sul fatturato medio mensile. Vengono selezionati 15 negozi per ciascuna strategia e il fatturato medio mensile viene registrato per un periodo di 6 mesi. Verifichiamo se esiste una differenza significativa tra le strategie di marketing utilizzando l&#8217;analisi della varianza.</p>



<pre class="wp-block-preformatted"># Dati
fatturato_A &lt;- c(120000, 115000, 130000, 125000, 110000, 135000, 118000, 122000, 127000, 115000, 128000, 120000, 124000, 117000, 121000)
fatturato_B &lt;- c(112000, 118000, 110000, 115000, 122000, 108000, 120000, 114000, 116000, 119000, 111000, 117000, 113000, 121000, 109000)
fatturato_C &lt;- c(105000, 110000, 108000, 112000, 107000, 115000, 111000, 109000, 113000, 106000, 108000, 114000, 110000, 112000, 107000)

# Analisi della varianza
anova_result &lt;- aov(c(fatturato_A, fatturato_B, fatturato_C) ~ rep(c("A", "B", "C"), each = 15))
summary(anova_result)</pre>



<pre class="wp-block-preformatted">                                 Df    Sum Sq   Mean Sq F value   Pr(&gt;F)    
rep(c("A", "B", "C"), each = 15)  2 1.086e+09 543200000    22.7 2.07e-07 ***
Residuals                        42 1.005e+09  23923810                     
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1</pre>



<p>L&#8217;analisi della varianza fornisce un valore p pari a 2.07e-07. Poiché questo valore è inferiore al livello di significatività di 0,05, possiamo respingere l&#8217;ipotesi nulla e concludere che esiste una differenza significativa nel fatturato medio mensile tra le tre strategie di marketing.</p>



<h3 class="wp-block-heading">Il Test U di Mann-Whitney</h3>



<p class="has-light-gray-background-color has-background">Il test U di Mann-Whitney è un test non parametrico utilizzato per <strong>confrontare le medie di due gruppi indipendenti quando i dati non soddisfano i requisiti di normalità o di uguaglianza delle varianze </strong>richiesti per il test t di Student.</p>



<p>Il test U di Mann-Whitney si applica quando si soddisfano le seguenti condizioni:</p>



<ul class="wp-block-list">
<li>I dati non sono normalmente distribuiti</li>



<li>Le varianze dei gruppi non sono uguali</li>



<li>I campioni sono indipendenti</li>
</ul>



<p>Il test U di Mann-Whitney viene utilizzato per confrontare le medie di due gruppi distinti, come ad esempio i ricavi medi di due diverse campagne pubblicitarie.</p>



<p><strong>Caso d&#8217;esempio:</strong> Un&#8217;azienda vuole confrontare i ricavi medi di due diverse campagne pubblicitarie, A e B. Vengono raccolti i dati sui ricavi di 15 negozi per ciascuna campagna. Verifichiamo se esiste una differenza significativa tra le due campagne utilizzando il test U di Mann-Whitney.</p>



<pre class="wp-block-preformatted"># Dati campagna A
ricavi_A &lt;- c(12000, 15000, 10000, 13000, 11000, 14000, 12500, 13500, 11500, 14500, 12200, 13800, 11800, 12700, 13200)

# Dati campagna B
ricavi_B &lt;- c(11000, 14000, 13000, 12000, 15000, 11500, 13500, 12500, 14500, 11800, 13200, 12700, 14200, 11600, 13800)

# Test U di Mann-Whitney
wilcox.test(ricavi_A, ricavi_B, alternative = "two.sided", correct = FALSE)</pre>



<pre class="wp-block-preformatted">	Wilcoxon rank sum test

data:  ricavi_A and ricavi_B
W = 102.5, p-value = 0.6779
alternative hypothesis: true location shift is not equal to 0</pre>



<p>Il test U di Mann-Whitney fornisce un valore p pari a 0,6779. Poiché questo valore è superiore al livello di significatività di 0,05, non possiamo respingere l&#8217;ipotesi nulla e non possiamo concludere che esista una differenza significativa nei ricavi medi tra le due campagne pubblicitarie.</p>



<h3 class="wp-block-heading">Il Test esatto di Fisher</h3>



<p class="has-light-gray-background-color has-background">Il test esatto di Fisher è un test statistico non parametrico utilizzato per<strong> analizzare l&#8217;associazione tra due variabili categoriche in tabelle di contingenza 2&#215;2, soprattutto quando le dimensioni campionarie sono piccole</strong>.</p>



<p>Il test esatto di Fisher si applica quando si soddisfano le seguenti condizioni:</p>



<ul class="wp-block-list">
<li>Le variabili sono categoriche</li>



<li>I campioni sono indipendenti</li>



<li>Le dimensioni campionarie sono piccole (una o più celle della tabella di contingenza hanno valori attesi inferiori a 5)</li>
</ul>



<p>Il test esatto di Fisher viene utilizzato per analizzare l&#8217;associazione tra due variabili categoriche, come ad esempio la relazione tra l&#8217;uso di un determinato farmaco e l&#8217;insorgenza di un effetto collaterale.</p>



<p><strong>Caso d&#8217;esempio:</strong> In uno studio clinico su un nuovo farmaco per il trattamento dell&#8217;ipertensione, vengono osservati 15 pazienti che hanno assunto il farmaco e 10 pazienti che hanno assunto un placebo. Dei 15 pazienti che hanno assunto il farmaco, 3 hanno sperimentato un effetto collaterale, mentre dei 10 pazienti che hanno assunto il placebo, 1 ha sperimentato l&#8217;effetto collaterale. Verifichiamo se c&#8217;è un&#8217;associazione significativa tra l&#8217;assunzione del farmaco e l&#8217;insorgenza dell&#8217;effetto collaterale utilizzando il test esatto di Fisher.</p>



<pre class="wp-block-preformatted"># Dati
effetto_collaterale &lt;- c(3, 12, 1, 9)
dim(effetto_collaterale) &lt;- c(2, 2)
rownames(effetto_collaterale) &lt;- c("Farmaco", "Placebo")
colnames(effetto_collaterale) &lt;- c("Effetto collaterale", "No effetto collaterale")
effetto_collaterale</pre>



<pre class="wp-block-preformatted">        Effetto collaterale No effetto collaterale
Farmaco                   3                      1
Placebo                  12                      9</pre>



<pre class="wp-block-preformatted"># Test esatto di Fisher
fisher.test(effetto_collaterale)</pre>



<pre class="wp-block-preformatted">	Fisher's Exact Test for Count Data

data:  effetto_collaterale
p-value = 0.6265
alternative hypothesis: true odds ratio is not equal to 1
95 percent confidence interval:
   0.145667 130.928066
sample estimates:
odds ratio 
  2.183137 </pre>



<p>Il test esatto di Fisher fornisce un valore p pari a 0,6265. Poiché questo valore è superiore al livello di significatività di 0,05, non possiamo respingere l&#8217;ipotesi nulla e non possiamo concludere che esista un&#8217;associazione significativa tra l&#8217;assunzione del farmaco e l&#8217;insorgenza dell&#8217;effetto collaterale.</p>



<h2 class="wp-block-heading">L&#8217;Analisi di regressione</h2>



<p class="has-light-gray-background-color has-background">L&#8217;analisi di regressione è un insieme di tecniche statistiche utilizzate per <strong>modellare la relazione tra una variabile dipendente (o di risposta) e una o più variabili indipendenti (o esplicative)</strong>.</p>



<p>L&#8217;analisi di regressione si applica quando si soddisfano le seguenti condizioni:</p>



<ul class="wp-block-list">
<li>Esiste una relazione lineare tra la variabile dipendente e le variabili indipendenti</li>



<li>I residui sono normalmente distribuiti e omoschedastici (hanno cioè varianza costante)</li>



<li>Le osservazioni sono indipendenti</li>
</ul>



<p>L&#8217;analisi di regressione viene utilizzata per comprendere l&#8217;impatto di diverse variabili indipendenti su una variabile dipendente, come ad esempio l&#8217;effetto dell&#8217;età, del reddito e del livello di istruzione sul consumo di una determinata categoria di prodotti.</p>



<p><strong>Caso d&#8217;esempio:</strong> Un&#8217;azienda di abbigliamento vuole analizzare l&#8217;impatto dell&#8217;età, del reddito e del livello di istruzione sul consumo annuale di abbigliamento. Vengono raccolti i dati su un campione di 100 individui. Utilizziamo l&#8217;analisi di regressione lineare multipla per modellare la relazione tra il consumo annuale di abbigliamento (variabile dipendente) e l&#8217;età, il reddito e il livello di istruzione (variabili indipendenti).</p>



<pre class="wp-block-preformatted"># Dati
consumo &lt;- c(1200, 1500, 2000, 1800, 2200, 1700, 2100, 1900, 1600, 2300, 1400, 1800, 2100, 1700, 2000, 1600, 1900, 2200, 1500, 1800)
eta &lt;- c(25, 35, 42, 30, 38, 28, 45, 33, 27, 40, 22, 31, 39, 26, 37, 24, 32, 41, 29, 36)
reddito &lt;- c(35000, 45000, 60000, 50000, 55000, 40000, 65000, 48000, 38000, 70000, 32000, 46000, 58000, 42000, 52000, 37000, 49000, 62000, 40000, 51000)
istruzione &lt;- c(2, 3, 4, 3, 4, 2, 4, 3, 2, 4, 2, 3, 4, 2, 3, 2, 3, 4, 3, 3)

# Modello di regressione lineare multipla
modello &lt;- lm(consumo ~ eta + reddito + istruzione)
summary(modello)</pre>



<pre class="wp-block-preformatted">Call:
lm(formula = consumo ~ eta + reddito + istruzione)

Residuals:
    Min      1Q  Median      3Q     Max 
-261.06  -93.14   39.80   66.26  223.24 

Coefficients:
              Estimate Std. Error t value Pr(&gt;|t|)   
(Intercept) 639.775078 165.734340   3.860  0.00139 **
eta         -13.127175  14.699870  -0.893  0.38509   
reddito       0.030875   0.008645   3.571  0.00255 **
istruzione   34.426950 107.969978   0.319  0.75396   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 128.1 on 16 degrees of freedom
Multiple R-squared:  0.8404,	Adjusted R-squared:  0.8105 
F-statistic: 28.08 on 3 and 16 DF,  p-value: 1.302e-06</pre>



<ol class="wp-block-list">
<li><strong>Coefficienti</strong>: L&#8217;output mostra i coefficienti per ogni variabile indipendente nel modello. In questo caso, le variabili indipendenti sono &#8216;eta&#8217;, &#8216;reddito&#8217; e &#8216;istruzione&#8217;. Il coefficiente di intercetta è 639.775078.</li>



<li><strong>Significatività</strong>: La variabile &#8216;reddito&#8217; è statisticamente significativa al livello di significatività del 5% (poiché il p-value è inferiore a 0.05), mentre le variabili &#8216;eta&#8217; e &#8216;istruzione&#8217; non lo sono. Ciò suggerisce che solo il &#8216;reddito&#8217; ha un impatto significativo sul &#8216;consumo&#8217;.</li>



<li><strong>R-squared</strong>: Il valore di R-squared è 0.8404, il che indica che circa l&#8217;84% della variazione nel &#8216;consumo&#8217; può essere spiegata dalle variabili &#8216;eta&#8217;, &#8216;reddito&#8217; e &#8216;istruzione&#8217;. Tuttavia, il valore di R-squared adjusted è 0.8105, il che suggerisce che quando si tiene conto del numero di variabili indipendenti nel modello, circa l&#8217;81% della variazione nel &#8216;consumo&#8217; può essere spiegata da queste variabili.</li>



<li><strong>F-statistic</strong>: Il valore F-statistic è 28.08 con un p-value di 1.302e-06, il che indica che il modello complessivo è statisticamente significativo.</li>
</ol>



<p>Il modello ci suggerisce che il &#8216;reddito&#8217; è l&#8217;unico predittore significativo del &#8216;consumo&#8217;. Tuttavia, il modello nel suo insieme è significativo e spiega una grande parte della variazione nel &#8216;consumo&#8217;. </p>



<h3 class="wp-block-heading">Uno sguardo d&#8217;insieme in una tabella</h3>



<figure class="wp-block-table"><table><tbody><tr><th>Test Statistico</th><th class="has-text-align-left" data-align="left">Condizioni di Applicabilità</th><th>Vantaggi</th><th>Svantaggi</th></tr><tr><td><strong>Test Z</strong></td><td class="has-text-align-left" data-align="left">Dimensione campione grande (n &gt; 30).<br><br>Varianza della popolazione nota <br>Dati normalmente distribuiti.    </td><td>Semplice da calcolare e interpretare. <br><br>Adatto per grandi campioni.   </td><td>Richiede la conoscenza della varianza della popolazione. <br><br>Non adatto per piccoli campioni.    </td></tr><tr><td><strong>Test t di Student</strong></td><td class="has-text-align-left" data-align="left">Dimensione campione piccola (n &lt; 30).<br><br>Varianza della popolazione sconosciuta. <br><br>Dati normalmente distribuiti.    </td><td>Adatto per piccoli campioni.<br><br>Non richiede la conoscenza della varianza della popolazione.     </td><td>
Presuppone la normalità dei dati.
    </td></tr><tr><td><strong>Test t di Welch</strong></td><td class="has-text-align-left" data-align="left">Dimensioni campionarie diverse. <br><br>Varianze diverse. <br><br>Dati normalmente distribuiti.     </td><td>Non richiede l&#8217;assunzione di uguaglianza delle varianze.     </td><td>Presuppone la normalità dei dati.     </td></tr><tr><td><strong>Test del Chi-quadrato</strong></td><td class="has-text-align-left" data-align="left">Variabili categoriche. <br><br>Campioni indipendenti. <br><br>Frequenze attese &gt; 5 per cella.     </td><td>Adatto per variabili categoriche. <br><br>Non richiede assunzioni sulla distribuzione.     </td><td>Può essere inaccurato se le frequenze attese sono troppo basse.     </td></tr><tr><td><strong>ANOVA</strong></td><td class="has-text-align-left" data-align="left">Dati normalmente distribuiti. <br>Omoschedasticità (varianze uguali). <br><br>Campioni indipendenti.     </td><td>Permette di confrontare più di due gruppi contemporaneamente.     </td><td>
Richiede l&#8217;assunzione di normalità e omoschedasticità.
    </td></tr><tr><td><strong>Test U di Mann-Whitney</strong></td><td class="has-text-align-left" data-align="left">Dati non normalmente distribuiti. <br><br>Varianze diverse. Campioni indipendenti.     </td><td>Non richiede assunzioni sulla distribuzione o l&#8217;uguaglianza delle varianze.     </td><td>Meno potente dei test parametrici se le assunzioni sono soddisfatte.     </td></tr><tr><td><strong>Test esatto di Fisher</strong></td><td class="has-text-align-left" data-align="left">Variabili categoriche. <br><br>Campioni indipendenti. <br><br>Piccole dimensioni campionarie.     </td><td>Accurato per piccoli campioni. <br><br>Adatto per tabelle di contingenza 2&#215;2.     </td><td>Non adatto per grandi campioni o tabelle di contingenza più grandi.     </td></tr><tr><td><strong>Analisi di Regressione</strong></td><td class="has-text-align-left" data-align="left">Relazione lineare tra variabili. <br><br>Residui normalmente distribuiti e omoschedastici. <br><br>Osservazioni indipendenti.     </td><td>Permette di modellare la relazione tra variabili.<br><br>Identifica i predittori significativi.            </td><td>
Richiede assunzioni sui residui e sulla linearità.
    </td></tr></tbody></table></figure>


<!-- internal-links-section -->
<h3>Potrebbe interessarti anche</h3>
<ul>
<li><a href="https://www.gironi.it/blog/ab-testing/">A/B Testing: come condurre esperimenti statisticamente validi (e gli errori da evitare)</a></li>
<li><a href="https://www.gironi.it/blog/intervalli-di-confidenza/">Intervalli di confidenza: cosa sono, come calcolarli (e cosa NON significano)</a></li>
</ul>]]></content:encoded>
					
					<wfw:commentRss>https://www.gironi.it/blog/guida-ai-test-statistici-per-analisi-a-b/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Come usare gli Alberi Decisionali per classificare i dati</title>
		<link>https://www.gironi.it/blog/come-usare-gli-alberi-decisionali-per-classificare-i-dati/</link>
					<comments>https://www.gironi.it/blog/come-usare-gli-alberi-decisionali-per-classificare-i-dati/#respond</comments>
		
		<dc:creator><![CDATA[paolo]]></dc:creator>
		<pubDate>Thu, 11 Jan 2024 10:17:41 +0000</pubDate>
				<category><![CDATA[statistica]]></category>
		<category><![CDATA[alberi decisionali]]></category>
		<guid isPermaLink="false">https://www.gironi.it/blog/?p=3065</guid>

					<description><![CDATA[Gli Alberi Decisionali sono un tipo di algoritmo di apprendimento automatico che utilizza una struttura ad albero per suddividere i dati in base a delle regole logiche e prevedere la classe di appartenenza di nuovi dati. Sono facili da interpretare e adattabili a diversi tipi di dati, ma possono anche soffrire di problemi come l’overfitting, &#8230; <a href="https://www.gironi.it/blog/come-usare-gli-alberi-decisionali-per-classificare-i-dati/" class="more-link">Leggi tutto<span class="screen-reader-text"> "Come usare gli Alberi Decisionali per classificare i dati"</span></a>]]></description>
										<content:encoded><![CDATA[
<p>Gli Alberi Decisionali sono un tipo di algoritmo di apprendimento automatico che utilizza una struttura ad albero per suddividere i dati in base a delle regole logiche e prevedere la classe di appartenenza di nuovi dati. Sono facili da interpretare e adattabili a diversi tipi di dati, ma possono anche soffrire di problemi come l’<em>overfitting</em>, la complessità e lo sbilanciamento.<br>Vediamo di capirne un po&#8217; di più e di esaminare un semplice esempio d&#8217;uso in R.</p>



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


				<div class="wp-block-uagb-table-of-contents uagb-toc__align-left uagb-toc__columns-1  uagb-block-5fb2a094      "
					data-scroll= "1"
					data-offset= "30"
					style=""
				>
				<div class="uagb-toc__wrap">
						<div class="uagb-toc__title">
							Table Of Contents						</div>
																						<div class="uagb-toc__list-wrap ">
						<ol class="uagb-toc__list"><li class="uagb-toc__list"><a href="#gli-alberi-decisionali-un-potente-strumento-di-classificazione" class="uagb-toc-link__trigger">Gli Alberi Decisionali: un potente strumento di classificazione</a><ul class="uagb-toc__list"><li class="uagb-toc__list"><a href="#un-semplice-esempio-di-albero-decisionale-in-r" class="uagb-toc-link__trigger">Un semplice esempio di Albero Decisionale in R</a><li class="uagb-toc__list"><li class="uagb-toc__list"><a href="#come-valutare-laccuratezza-di-un-albero-decisionale" class="uagb-toc-link__trigger">Come valutare l’accuratezza di un Albero Decisionale</a><li class="uagb-toc__list"><li class="uagb-toc__list"><a href="#cosa-si-intende-per-overfitting" class="uagb-toc-link__trigger">Cosa si intende per Overfitting?</a><li class="uagb-toc__list"><li class="uagb-toc__list"><a href="#cenni-ad-altri-algoritmi-di-classificazione" class="uagb-toc-link__trigger">Cenni ad altri algoritmi di classificazione</a></ul></ol>					</div>
									</div>
				</div>
			


<h1 class="wp-block-heading">Gli Alberi Decisionali: un potente strumento di classificazione</h1>



<p>Immagina di essere un medico e di dover diagnosticare una malattia a un paziente basandoti su alcuni sintomi. Come faresti a decidere quale malattia ha il paziente? Potresti usare la tua esperienza, la tua intuizione, o consultare dei manuali. Oppure potresti usare un algoritmo che ti guida passo dopo passo a scegliere la diagnosi più probabile, in base ai dati che hai a disposizione. Questo algoritmo si chiama&nbsp;<strong>Albero Decisionale</strong>.</p>



<p class="has-light-gray-background-color has-background">Un Albero Decisionale è una struttura grafica che rappresenta una serie di regole logiche per classificare degli oggetti o delle situazioni. <br>Ogni <strong>nodo</strong> dell’albero rappresenta una domanda o una condizione, che divide i dati in due o più sottogruppi omogenei. <br>Ogni<strong> ramo</strong> rappresenta una possibile risposta o un’azione, che collega un nodo a un altro nodo o a una foglia. <br>Il<strong> nodo iniziale si chiama radice</strong>, ed è il punto di partenza dell’albero. <br>I <strong>nodi finali si chiamano foglie</strong>, e sono i <strong>punti di arrivo dell’albero</strong>. <br><strong>Ogni foglia corrisponde a una classe</strong>, ovvero una categoria a cui appartiene l’oggetto o la situazione da classificare.</p>



<p>Gli Alberi Decisionali sono molto usati in ambito scientifico, tecnologico, medico, economico, e sociale, perché hanno diversi vantaggi:</p>



<ul class="wp-block-list">
<li>Sono&nbsp;<strong>facili da interpretare</strong>&nbsp;e da comunicare, anche a persone non esperte.</li>



<li>Sono&nbsp;<strong>flessibili</strong>&nbsp;e possono adattarsi a diversi tipi di dati, sia numerici che categorici.</li>



<li>Sono&nbsp;<strong>robusti</strong>&nbsp;e possono gestire dati incompleti, rumorosi, o inconsistenti.</li>



<li>Sono&nbsp;<strong>efficienti</strong>&nbsp;e richiedono poco tempo e memoria per essere costruiti e applicati.</li>
</ul>



<p>Tuttavia, gli Alberi Decisionali hanno anche alcuni svantaggi:</p>



<ul class="wp-block-list">
<li>Possono essere&nbsp;<strong>instabili</strong>, ovvero sensibili a piccole variazioni dei dati di partenza, e quindi produrre alberi molto diversi.</li>



<li>Possono essere&nbsp;<strong>complessi</strong>, ovvero avere molti nodi e rami, e quindi perdere in chiarezza e accuratezza.</li>



<li>Possono essere&nbsp;<strong>sbilanciati</strong>, ovvero favorire alcune classi rispetto ad altre, e quindi essere poco rappresentativi della realtà.</li>
</ul>



<p>Per ovviare a questi problemi, esistono diverse tecniche di&nbsp;<strong>ottimizzazione</strong>&nbsp;e di&nbsp;<strong>validazione</strong>&nbsp;degli Alberi Decisionali, che permettono di migliorare le loro prestazioni e di valutare la loro affidabilità.</p>



<h2 class="wp-block-heading">Un semplice esempio di Albero Decisionale in R</h2>



<p>Per capire meglio come funzionano gli Alberi Decisionali, vediamo un esempio pratico in linguaggio R. </p>



<p>Per il nostro esempio, useremo il dataset&nbsp;<code>iris</code>, che contiene le misure di lunghezza e larghezza dei sepali e dei petali di 150 fiori di iris, appartenenti a tre specie diverse: setosa, versicolor, e virginica. Il nostro obiettivo è di costruire un Albero Decisionale che ci permetta di classificare un fiore di iris in base alla sua specie, usando le sue misure come variabili esplicative.</p>



<p>Per prima cosa, carichiamo il dataset&nbsp;<code>iris</code>&nbsp;e la libreria&nbsp;<code>rpart</code>, che ci permette di creare gli Alberi Decisionali in R.</p>



<pre class="wp-block-preformatted"># Carichiamo il dataset iris
data(iris)
# Carichiamo la libreria rpart
library(rpart)
# Impostiamo il seme per la riproducibilità
set.seed(123)
# Estraiamo casualmente l'80% delle righe del dataset
train_index &lt;- sample(1:nrow(iris), 0.8*nrow(iris))
# Creiamo il dataset di training
train_data &lt;- iris[train_index, ]
# Creiamo il dataset di test
test_data &lt;- iris[-train_index, ]
</pre>



<p>Ora, siamo pronti per costruire il nostro Albero Decisionale, usando la funzione&nbsp;<code>rpart</code>. Questa funzione richiede alcuni parametri:</p>



<ul class="wp-block-list">
<li>La&nbsp;<strong>formula</strong>, che specifica la variabile da classificare (in questo caso,&nbsp;<code>Species</code>) e le variabili esplicative (in questo caso, tutte le altre).</li>



<li>Il&nbsp;<strong>dataset</strong>, che contiene i dati da usare per costruire l’Albero Decisionale (in questo caso,&nbsp;<code>train_data</code>).</li>



<li>Il&nbsp;<strong>metodo</strong>, che specifica il tipo di classificazione da usare (in questo caso,&nbsp;<code>class</code>, che indica una classificazione categorica).</li>
</ul>



<pre class="wp-block-preformatted"># Costruiamo l'Albero Decisionale
tree &lt;- rpart(formula = Species ~ ., data = train_data, method = "class")
</pre>



<p>Per visualizzare il nostro Albero Decisionale, usiamo la funzione&nbsp;<code>plot</code>, che ci permette di disegnare la struttura grafica dell’albero, e la funzione&nbsp;<code>text</code>, che ci permette di aggiungere le etichette dei nodi e dei rami.</p>



<pre class="wp-block-preformatted"># Visualizziamo l'Albero Decisionale
plot(tree, uniform = TRUE, branch=0.8)
text(tree, all=TRUE, use.n = TRUE)
</pre>



<p>Il risultato è il seguente:</p>



<div class="wp-block-uagb-image uagb-block-0ef4be0f wp-block-uagb-image--layout-default wp-block-uagb-image--effect-static wp-block-uagb-image--align-none"><figure class="wp-block-uagb-image__figure"><img decoding="async" srcset="https://www.gironi.it/blog/wp-content/uploads/2024/01/decision-tree-1-935x1024.png ,https://www.gironi.it/blog/wp-content/uploads/2024/01/decision-tree-1.png 780w, https://www.gironi.it/blog/wp-content/uploads/2024/01/decision-tree-1.png 360w" sizes="auto, (max-width: 480px) 150px" src="https://www.gironi.it/blog/wp-content/uploads/2024/01/decision-tree-1-935x1024.png" alt="decision tree 1" class="uag-image-3074" width="856" height="574" title="" loading="lazy"></figure></div>



<p>Come possiamo interpretare questo semplicissimo Albero Decisionale? Partiamo dalla radice, che è il nodo in alto. Questo nodo ci dice che la variabile più importante per classificare un fiore di iris è la&nbsp;<strong>lunghezza del petalo</strong>&nbsp;(<code>Petal.Lenght</code>). Se la larghezza del petalo è minore di 2.45 cm, allora il fiore è della specie&nbsp;<strong>setosa</strong>. Se invece la larghezza del petalo è maggiore, dobbiamo considerare se la lunghezza del petalo è minore o uguale a 4.75 cm. Se è minore allora il fiore è della specie&nbsp;<strong>versicolor</strong>. Se invece la lunghezza del petalo è maggiore di 4.75 cm, allora il fiore è della specie&nbsp;<strong>virginica</strong>. </p>



<h2 class="wp-block-heading">Come valutare l’accuratezza di un Albero Decisionale</h2>



<p>Per valutare l’accuratezza di un Albero Decisionale, dobbiamo confrontare le classi predette dall’albero con le classi reali dei dati di test. Per fare questo, usiamo la funzione&nbsp;<code>predict</code>, che ci permette di applicare l’Albero Decisionale ai dati di test e di ottenere le classi predette.</p>



<pre class="wp-block-preformatted"># Applichiamo l'Albero Decisionale ai dati di test
pred_class &lt;- predict(tree, newdata = test_data, type = "class")
</pre>



<p>Poi, usiamo la funzione&nbsp;<code>table</code>, che ci permette di creare una tabella di contingenza tra le classi predette e le classi reali.</p>



<pre class="wp-block-preformatted"># Creiamo la tabella di contingenza
table(pred_class, test_data$Species)
</pre>



<p>Il risultato è il seguente:</p>



<table>
  <tr>
    <td></td>
    <td>setosa</td>
    <td>versicolor</td>
    <td>virginica</td>
  </tr>
  <tr>
    <td>setosa</td>
    <td>10</td>
    <td>0</td>
    <td>0</td>
  </tr>
  <tr>
    <td>versicolor</td>
    <td>0</td>
    <td>13</td>
    <td>0</td>
  </tr>
  <tr>
    <td>virginica</td>
    <td>0</td>
    <td>2</td>
    <td>5</td>
  </tr>
</table>



<p>Questa tabella ci mostra quante volte l’Albero Decisionale ha predetto correttamente o sbagliato la classe di un fiore di iris. Per esempio, la cella in alto a sinistra ci dice che l’Albero Decisionale ha predetto correttamente che 10 fiori erano della specie setosa. La cella in basso al centro ci dice che l’Albero Decisionale ha sbagliato a predire che 2 fiori erano della specie virginica, quando in realtà erano della specie versicolor.</p>



<p>Per calcolare l’accuratezza di un Albero Decisionale, dobbiamo dividere il numero di predizioni corrette per il numero totale di predizioni. In questo caso, l’accuratezza è:</p>



\(
\frac{10 + 13 + 5}{10 + 13 + 5 + 2} = \frac{28}{30} = 0.93\\
\)



<p>Questo significa che il nostro Albero Decisionale ha predetto correttamente la specie di un fiore di iris nel 93% dei casi. Questo è un buon risultato, ma potrebbe essere migliorato con alcune tecniche di ottimizzazione, come la&nbsp;<strong>potatura</strong>&nbsp;o la&nbsp;<strong>selezione delle variabili</strong>.</p>



<p>La potatura è una tecnica che consiste nel ridurre la complessità di un Albero Decisionale, eliminando alcuni nodi o rami che non contribuiscono significativamente all’accuratezza. Questo può prevenire il problema dell’<strong>overfitting</strong>, ovvero quando l’Albero Decisionale si adatta troppo ai dati di training e perde la capacità di generalizzare ai dati di test.</p>



<p>La selezione delle variabili è una tecnica che consiste nel scegliere le variabili più rilevanti per la classificazione, eliminando quelle che sono irrilevanti o ridondanti. Questo può migliorare l’accuratezza e la chiarezza dell’Albero Decisionale, riducendo il numero di domande o condizioni da considerare.</p>



<h2 class="wp-block-heading">Cosa si intende per Overfitting?</h2>



<p>L’<strong><em>overfitting</em></strong> è un problema che si verifica<strong> quando un modello di apprendimento automatico si adatta troppo ai dati di addestramento, e non riesce a generalizzare bene ai dati nuovi</strong>. Questo significa che il modello memorizza le caratteristiche specifiche e il rumore dei dati di addestramento, ma non riesce a catturare la tendenza generale dei dati. Di conseguenza, il modello ha un’alta accuratezza sui dati di addestramento, ma una bassa accuratezza sui dati di test o di validazione. L’overfitting può essere causato da una complessità eccessiva del modello, da un numero insufficiente di dati di addestramento, o da un addestramento troppo lungo.</p>



<h2 class="wp-block-heading">Cenni ad altri algoritmi di classificazione</h2>



<p>Esistono innumerevoli altri algoritmi di classificazione, come ad esempio, la <strong>regressione logistica</strong>, il <strong>k-nearest neighbor</strong>, il <strong>support vector machine</strong> e le <strong>reti neurali</strong>. Questi algoritmi si basano su principi diversi dagli Alberi Decisionali, come la funzione di probabilità, la distanza, il margine o la trasformazione non lineare dei dati. Alcuni di questi algoritmi possono essere più accurati, flessibili o scalabili degli Alberi Decisionali, ma anche più difficili da interpretare o richiedere più tempo e risorse per essere addestrati e applicati.</p>



<p>Una tecnica che cerca di combinare i vantaggi degli Alberi Decisionali con quelli degli algoritmi di insieme è la <strong>Random Forest</strong>. </p>



<p>La Random Forest è un metodo che costruisce una collezione di Alberi Decisionali indipendenti e ne calcola la media delle previsioni. <br>Questo permette di <strong>ridurre la varianza e l’overfitting degli Alberi Decisionali, aumentando l’accuratezza e la robustezza del modello</strong>. La Random Forest introduce anche un elemento di casualità nella scelta dei dati e delle variabili da usare per costruire gli Alberi Decisionali, rendendo il modello più diversificato e de-correlato.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.gironi.it/blog/come-usare-gli-alberi-decisionali-per-classificare-i-dati/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
