{"id":3492,"date":"2026-03-05T12:35:19","date_gmt":"2026-03-05T11:35:19","guid":{"rendered":"https:\/\/www.gironi.it\/blog\/?p=3492"},"modified":"2026-03-08T17:55:13","modified_gmt":"2026-03-08T16:55:13","slug":"calcolatore-sample-size-ab-test","status":"publish","type":"post","link":"https:\/\/www.gironi.it\/blog\/calcolatore-sample-size-ab-test\/","title":{"rendered":"Calcolatore Sample Size per A\/B Test"},"content":{"rendered":"<p>Una delle domande pi\u00f9 ricorrenti quando si progetta un <strong>A\/B test<\/strong> \u00e8: <em>quanti utenti mi servono per ottenere un risultato affidabile?<\/em> La risposta non \u00e8 un numero magico: dipende da quanto \u00e8 grande l&#8217;effetto che vogliamo rilevare, dal tasso di conversione di partenza e dal livello di certezza statistica che desideriamo raggiungere.<\/p>\n<p>Calcolare in anticipo la <strong>dimensione campionaria<\/strong> (sample size) \u00e8 un passaggio fondamentale per evitare due errori classici: fermare il test troppo presto, dichiarando un vincitore che non c&#8217;\u00e8, 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>\n<p>Chi ha letto l&#8217;articolo sul <a href=\"https:\/\/www.gironi.it\/blog\/ab-testing\/\">A\/B Testing<\/a> ricorder\u00e0 che la <strong>power analysis<\/strong> \u00e8 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\u00e0 che livello di significativit\u00e0 e potenza del test non sono concetti astratti, ma leve operative che influenzano direttamente la dimensione del campione.<\/p>\n<p><!--more--><\/p>\n<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>\n<div style=\"border: 1px solid #ccc;padding: 1.2em 1.5em;margin: 1.5em 0;border-radius: 6px\">\n<h3 style=\"margin-top: 0\">Indice<\/h3>\n<ul>\n<li><a href=\"#calcolatore\">Il calcolatore<\/a><\/li>\n<li><a href=\"#formula\">La formula: come funziona il calcolo<\/a><\/li>\n<li><a href=\"#come-usare\">Come usare il calcolatore<\/a><\/li>\n<li><a href=\"#approfondimenti\">Approfondimenti<\/a><\/li>\n<\/ul>\n<\/div>\n<hr \/>\n<h2 id=\"calcolatore\">Il calcolatore<\/h2>\n<p>Inseriamo i parametri del nostro A\/B test e il calcolatore restituisce istantaneamente la dimensione campionaria necessaria.<\/p>\n<style>\n.ss-calc{max-width:620px;margin:2em auto;padding:1.5em 2em;background:#f8f8f8;border:1px solid #ddd;border-radius:8px;font-family:inherit}\n.ss-calc h3{margin:0 0 1em;color:#333;font-size:1.2em}\n.ss-calc label{display:block;margin:0.8em 0 0.3em;font-weight:600;color:#333;font-size:0.95em}\n.ss-calc .ss-hint{font-size:0.82em;color:#777;margin:0.15em 0 0}\n.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}\n.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)}\n.ss-calc .ss-row{display:flex;gap:1.2em}\n.ss-calc .ss-col{flex:1}\n.ss-calc .ss-result{margin-top:1.5em;padding:1.2em;background:#fff;border:2px solid #2ecc71;border-radius:6px;text-align:center}\n.ss-calc .ss-result .ss-big{font-size:2em;font-weight:700;color:#2ecc71;display:block;margin:0.2em 0}\n.ss-calc .ss-result .ss-label{font-size:0.85em;color:#666}\n.ss-calc .ss-result .ss-total{font-size:1.1em;color:#333;margin-top:0.5em}\n.ss-calc .ss-result .ss-days{font-size:1em;color:#0073aa;margin-top:0.4em;font-weight:600}\n.ss-calc .ss-warn{color:#e74c3c;font-size:0.85em;margin-top:0.5em;display:none}\n@media(max-width:520px){.ss-calc .ss-row{flex-direction:column;gap:0}.ss-calc{padding:1em 1.2em}}\n<\/style>\n<div class=\"ss-calc\" id=\"ssCalc\">\n<h3>Calcolatore Sample Size<\/h3>\n<p><label for=\"ssBase\">Tasso di conversione base (%)<\/label><br \/>\n<input type=\"number\" id=\"ssBase\" value=\"5\" min=\"0.1\" max=\"100\" step=\"0.1\"><\/p>\n<p class=\"ss-hint\">Il conversion rate attuale della variante di controllo<\/p>\n<p><label for=\"ssMde\">Effetto minimo rilevabile &mdash; MDE (% relativo)<\/label><br \/>\n<input type=\"number\" id=\"ssMde\" value=\"20\" min=\"1\" max=\"100\" step=\"1\"><\/p>\n<p class=\"ss-hint\">L&#8217;incremento relativo minimo che consideriamo significativo (es. 20% = da 5% a 6%)<\/p>\n<div class=\"ss-row\">\n<div class=\"ss-col\">\n<label for=\"ssAlpha\">Significativit&agrave; (&alpha;)<\/label><br \/>\n<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>\n<\/div>\n<div class=\"ss-col\">\n<label for=\"ssPower\">Potenza (1&minus;&beta;)<\/label><br \/>\n<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>\n<\/div>\n<\/div>\n<p><label for=\"ssTraffic\">Traffico giornaliero <span style=\"font-weight:400;color:#999\">(opzionale)<\/span><\/label><br \/>\n<input type=\"number\" id=\"ssTraffic\" value=\"\" min=\"1\" step=\"1\" placeholder=\"es. 1000\"><\/p>\n<p class=\"ss-hint\">Visitatori giornalieri totali per stimare la durata del test<\/p>\n<div class=\"ss-result\" id=\"ssResult\">\n<span class=\"ss-label\">Sample size per variante<\/span><br \/>\n<span class=\"ss-big\" id=\"ssN\">&mdash;<\/span><\/p>\n<div class=\"ss-total\" id=\"ssTotal\"><\/div>\n<div class=\"ss-days\" id=\"ssDays\"><\/div>\n<\/div>\n<div class=\"ss-warn\" id=\"ssWarn\"><\/div>\n<\/div>\n<p><script>\n(function(){\n  function qnorm(p){\n    if(p<=0||p>=1)return NaN;\n    if(p<0.5)return -qnorm(1-p);\n    var t=Math.sqrt(-2*Math.log(1-p));\n    var c0=2.515517,c1=0.802853,c2=0.010328;\n    var d1=1.432788,d2=0.189269,d3=0.001308;\n    return t-(c0+c1*t+c2*t*t)\/(1+d1*t+d2*t*t+d3*t*t*t);\n  }\n  function calcSS(){\n    var base=parseFloat(document.getElementById('ssBase').value);\n    var mde=parseFloat(document.getElementById('ssMde').value);\n    var alpha=parseFloat(document.getElementById('ssAlpha').value);\n    var power=parseFloat(document.getElementById('ssPower').value);\n    var traffic=document.getElementById('ssTraffic').value;\n    var warn=document.getElementById('ssWarn');\n    warn.style.display='none';\n    if(isNaN(base)||isNaN(mde)||base<=0||base>100||mde<=0||mde>100){\n      document.getElementById('ssN').innerHTML='&mdash;';\n      document.getElementById('ssTotal').textContent='';\n      document.getElementById('ssDays').textContent='';\n      return;\n    }\n    var p1=base\/100;\n    var p2=p1*(1+mde\/100);\n    if(p2>1){\n      warn.textContent='Attenzione: con questi valori il tasso di conversione della variante supererebbe il 100%.';\n      warn.style.display='block';\n      document.getElementById('ssN').innerHTML='&mdash;';\n      document.getElementById('ssTotal').textContent='';\n      document.getElementById('ssDays').textContent='';\n      return;\n    }\n    var za=qnorm(1-alpha\/2);\n    var zb=qnorm(power);\n    var diff=p1-p2;\n    var n=Math.ceil((Math.pow(za+zb,2)*(p1*(1-p1)+p2*(1-p2)))\/(diff*diff));\n    document.getElementById('ssN').textContent=n.toLocaleString('it-IT');\n    document.getElementById('ssTotal').textContent='Totale (2 varianti): '+(n*2).toLocaleString('it-IT')+' osservazioni';\n    if(traffic && parseInt(traffic)>0){\n      var days=Math.ceil((n*2)\/parseInt(traffic));\n      document.getElementById('ssDays').textContent='Durata stimata: circa '+days+' giorni';\n    }else{\n      document.getElementById('ssDays').textContent='';\n    }\n  }\n  ['ssBase','ssMde','ssAlpha','ssPower','ssTraffic'].forEach(function(id){\n    document.getElementById(id).addEventListener('input',calcSS);\n    document.getElementById(id).addEventListener('change',calcSS);\n  });\n  calcSS();\n})();\n<\/script><\/p>\n<hr \/>\n<h2 id=\"formula\">La formula: come funziona il calcolo<\/h2>\n<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>\n<p>Partiamo dai parametri che inseriamo:<\/p>\n<ul>\n<li><strong>p<sub>1<\/sub><\/strong>: il tasso di conversione di base (controllo), espresso come proporzione. Se il nostro CR \u00e8 del 5%, allora p<sub>1<\/sub> = 0.05.<\/li>\n<li><strong>p<sub>2<\/sub><\/strong>: il tasso di conversione atteso per la variante. Se l&#8217;effetto minimo rilevabile (MDE) \u00e8 del 20% relativo, allora p<sub>2<\/sub> = p<sub>1<\/sub> &times; (1 + MDE\/100) = 0.05 &times; 1.20 = 0.06.<\/li>\n<li><strong>&alpha;<\/strong>: il livello di significativit\u00e0, cio\u00e8 la probabilit\u00e0 di dichiarare un effetto quando non c&#8217;\u00e8 (errore di tipo I). Con &alpha; = 0.05 lavoriamo al 95% di confidenza.<\/li>\n<li><strong>1 &minus; &beta;<\/strong>: la potenza del test, cio\u00e8 la probabilit\u00e0 di rilevare un effetto quando effettivamente esiste. Con potenza 0.80, abbiamo l&#8217;80% di probabilit\u00e0 di cogliere l&#8217;effetto.<\/li>\n<\/ul>\n<p>La formula \u00e8:<\/p>\n\\( 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} \\)\n<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\u00f9 comuni:<\/p>\n<ul>\n<li>&alpha; = 0.05 &rarr; z<sub>&alpha;\/2<\/sub> = 1.96<\/li>\n<li>&alpha; = 0.01 &rarr; z<sub>&alpha;\/2<\/sub> = 2.576<\/li>\n<li>&beta; = 0.20 (potenza 0.80) &rarr; z<sub>&beta;<\/sub> = 0.842<\/li>\n<li>&beta; = 0.10 (potenza 0.90) &rarr; z<sub>&beta;<\/sub> = 1.282<\/li>\n<\/ul>\n<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\u00e8 passare dal 3% al 3.6%), con &alpha; = 0.05 e potenza = 0.80:<\/p>\n<ul>\n<li>p<sub>1<\/sub> = 0.03, p<sub>2<\/sub> = 0.036<\/li>\n<li>z<sub>&alpha;\/2<\/sub> = 1.96, z<sub>&beta;<\/sub> = 0.842<\/li>\n<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>\n<li>Denominatore: (0.03 &minus; 0.036)<sup>2<\/sup> = 0.000036<\/li>\n<li>n = 0.5008 \/ 0.000036 &asymp; <strong>13.911 per variante<\/strong><\/li>\n<\/ul>\n<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\u00e0 circa 56 giorni. \u00c8 uno dei motivi per cui, nella pratica, molti A\/B test su siti a traffico medio richiedono settimane, non giorni.<\/p>\n<hr \/>\n<h2 id=\"come-usare\">Come usare il calcolatore<\/h2>\n<p><strong>Come scegliere l&#8217;MDE.<\/strong> L&#8217;effetto minimo rilevabile \u00e8 il parametro pi\u00f9 delicato. Non chiediamoci &#8220;quanto vorremmo che migliorasse&#8221; ma piuttosto: <em>qual \u00e8 il miglioramento minimo che giustificherebbe lo sforzo di implementare la modifica?<\/em> Un MDE del 5% relativo richiede campioni enormi; un MDE del 50% \u00e8 facile da rilevare ma raramente realistico. La fascia 10-30% \u00e8 un buon punto di partenza per la maggior parte dei test su conversion rate.<\/p>\n<p>Un dettaglio importante: l&#8217;MDE nel calcolatore \u00e8 <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\u00e8 un punto percentuale assoluto, ma il 20% relativo del valore iniziale).<\/p>\n<p><strong>Come stimare il traffico giornaliero.<\/strong> Il traffico da inserire \u00e8 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 \u00e8 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>\n<hr \/>\n<h3 id=\"approfondimenti\">Potrebbe interessarti anche<\/h3>\n<ul>\n<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>\n<li><a href=\"https:\/\/www.gironi.it\/blog\/intervalli-di-confidenza\/\">Intervalli di confidenza<\/a><\/li>\n<li><a href=\"https:\/\/www.gironi.it\/blog\/il-test-delle-ipotesi\/\">Il test delle ipotesi<\/a><\/li>\n<\/ul>\n<hr \/>\n<h3>Per approfondire<\/h3>\n<p>Il riferimento pi\u00f9 completo sulla progettazione rigorosa di esperimenti online \u00e8: <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>\n","protected":false},"excerpt":{"rendered":"<p>Una delle domande pi\u00f9 ricorrenti quando si progetta un A\/B test \u00e8: quanti utenti mi servono per ottenere un risultato affidabile? La risposta non \u00e8 un numero magico: dipende da quanto \u00e8 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 &hellip; <a href=\"https:\/\/www.gironi.it\/blog\/calcolatore-sample-size-ab-test\/\" class=\"more-link\">Leggi tutto<span class=\"screen-reader-text\"> &#8220;Calcolatore Sample Size per A\/B Test&#8221;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_uag_custom_page_level_css":"","footnotes":""},"categories":[629],"tags":[],"class_list":["post-3492","post","type-post","status-publish","format-standard","hentry","category-statistica-it"],"lang":"it","translations":{"it":3492,"en":3495},"uagb_featured_image_src":{"full":false,"thumbnail":false,"medium":false,"medium_large":false,"large":false,"1536x1536":false,"2048x2048":false,"post-thumbnail":false},"uagb_author_info":{"display_name":"autore-articoli","author_link":"https:\/\/www.gironi.it\/blog\/author\/autore-articoli\/"},"uagb_comment_info":2,"uagb_excerpt":"Una delle domande pi\u00f9 ricorrenti quando si progetta un A\/B test \u00e8: quanti utenti mi servono per ottenere un risultato affidabile? La risposta non \u00e8 un numero magico: dipende da quanto \u00e8 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&hellip;","_links":{"self":[{"href":"https:\/\/www.gironi.it\/blog\/wp-json\/wp\/v2\/posts\/3492","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gironi.it\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gironi.it\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gironi.it\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gironi.it\/blog\/wp-json\/wp\/v2\/comments?post=3492"}],"version-history":[{"count":2,"href":"https:\/\/www.gironi.it\/blog\/wp-json\/wp\/v2\/posts\/3492\/revisions"}],"predecessor-version":[{"id":3494,"href":"https:\/\/www.gironi.it\/blog\/wp-json\/wp\/v2\/posts\/3492\/revisions\/3494"}],"wp:attachment":[{"href":"https:\/\/www.gironi.it\/blog\/wp-json\/wp\/v2\/media?parent=3492"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gironi.it\/blog\/wp-json\/wp\/v2\/categories?post=3492"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gironi.it\/blog\/wp-json\/wp\/v2\/tags?post=3492"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}