Distribuzione Beta e inferenza Bayesiana: come ottimizzare campagne e A/B Test con la Data Science

Cerca:

Generic selectors
Exact matches only
Search in title
Search in content
Post Type Selectors
La Statistica Bayesiana per il Marketing

Il marketing ti invia un report dopo le prime 24 ore di campagna: 1000 impression, 45 click. Il CTR è al 4.5%. L’obiettivo aziendale era il 5%. La richiesta che ti arriva è immediata: “Sta andando male, spegniamo tutto?”

Se guardi solo la metrica grezza, la risposta sembra ovvia. Ma fermare un annuncio sulla base di una stima puntuale è uno degli errori decisionali più costosi che un’azienda possa fare. Il 4.5% è solo una fotografia istantanea sporcata dalla varianza.

Il vero compito di chi analizza i dati non è calcolare divisioni, ma quantificare l’incertezza. Finora abbiamo esplorato la distribuzione Beta per le sue proprietà matematiche. Oggi usciamo dalla teoria e vediamo come integrarla in un problema reale: trasformare un semplice calcolo del Click-Through Rate in uno strumento di decision intelligence.

Pubblicità

Fase 1 — Dati raccolti dalla campagna

L’obiettivo è capire se un annuncio sta funzionando oppure se deve essere sostituito.

La metrica principale è il Click-Through Rate (CTR):

[math]CTR = \frac{\text{click}}{\text{impression}}[/math]

Il problema è che il vero CTR dell’annuncio non è osservabile direttamente. Possiamo soltanto osservare quanti utenti hanno visto l’annuncio e quanti hanno cliccato, per poi dedurre quanti click potremmo aspettarci in futuro.

La vera domanda del Data Scientist quindi non è “Qual è il CTR osservato?”, ma: “Qual è la distribuzione plausibile del vero CTR dell’annuncio?”

Dopo il primo giorno otteniamo:

  • Impression: 1000
  • Click: 45

La stima puntuale tradizionale sarebbe:

[math]CTR = \frac{45}{1000} = 0.045[/math]

ovvero il 4.5%. Tuttavia, questa stima ignora l’incertezza. Un CTR osservato del 4.5% su questi volumi potrebbe derivare da un CTR reale del 3.8%, del 4.5% o del 5.2%. Non abbiamo ancora abbastanza informazioni per conoscere il valore esatto.

Fase 2 — Scelta del prior

Prima di osservare i dati scegliamo un prior non informativo:

[math]CTR \sim \text{Beta}(1,1)[/math]

La distribuzione [math]\text{Beta}(1,1)[/math] coincide con una distribuzione uniforme [math]f(x) = 1[/math].

In termini pratici significa: “Prima di osservare i dati, tutti i valori del CTR tra lo 0% e il 100% sono considerati ugualmente possibili”.

È una scelta neutrale nel senso che assegna la stessa densità a tutti i valori possibili, ma resta comunque un’assunzione modellistica.

Fase 3 — Aggiornamento Bayesiano

Il modello Beta-Binomiale permette di aggiornare automaticamente la nostra conoscenza non appena arrivano i dati. La regola generale è:

[math]\text{Beta}(\alpha,\beta) + \text{dati} \rightarrow \text{Beta}(\alpha + \text{successi}, \beta + \text{fallimenti})[/math]

Nel nostro caso specifico:

  • Successi: [math]x = 45[/math]
  • Fallimenti: [math]n – x = 1000 – 45 = 955[/math]

Applichiamo l’aggiornamento:

[math]\text{Beta}(1,1) \rightarrow \text{Beta}(1+45, 1+955)[/math]

La distribuzione a posteriori, che ora rappresenta la nostra conoscenza aggiornata, diventa:

[math]CTR \vert{} \text{dati} \sim \text{Beta}(46, 956)[/math]

Fase 4 — Stima del CTR

Possiamo ora calcolare la media della nostra nuova distribuzione Beta:

[math]E[X] = \frac{\alpha}{\alpha + \beta}[/math]

[math]E[CTR] = \frac{46}{46 + 956} \approx 0.0459[/math]

Il CTR stimato, tenendo conto del prior, è di circa 4.6%.

La differenza rispetto al valore puramente osservato (4.5%) è ridotta perché abbiamo già raccolto un buon volume di dati (1000 impression). Con campioni più piccoli, il prior avrebbe avuto un peso stabilizzante molto maggiore.

Fase 5 — Intervallo di Credibilità al 95%

A differenza dei confidence intervals della statistica frequentista (spesso controintuitivi), l’inferenza Bayesiana ci fornisce un vero e proprio intervallo di credibilità. Possiamo cioè ottenere un intervallo di valori che, con una data probabilità matematica, contiene il vero CTR.

Calcoliamo i quantili della distribuzione Beta in Python:

from scipy.stats import beta

alpha = 46
beta_param = 956

lower = beta.ppf(0.025, alpha, beta_param)
upper = beta.ppf(0.975, alpha, beta_param)

print(f"Intervallo 95%: [{lower:.3f}, {upper:.3f}]")

Il risultato è:

[math]CTR \in [3.4\%, 5.9\%][/math]

Forse potrebbe interessarti anche:  Conditional Value at Risk (CVaR): Calcolo, Interpretazione ed Esempi Dettagliati

Interpretazione:

Secondo il modello scelto e i dati osservati, la distribuzione a posteriori assegna il 95% della probabilità a valori del CTR compresi tra 3.4% e 5.9%.

Fase 6 — Decisione di business e Visualizzazione

Torniamo al problema iniziale. Supponiamo che il benchmark aziendale (il punto di pareggio della campagna) sia:

[math]CTR_{\text{min}} = 5\%[/math]

La domanda strategica da porre non è più se il 4.5% è minore del 5%, ma: “Quanto è probabile che il vero CTR sia superiore al 5%?”

Possiamo calcolarlo facilmente analizzando l’area sotto la curva della nostra distribuzione:

[math]P(CTR > 0.05)[/math]

Visualizzare l’Incertezza

Per comprendere appieno la situazione, generiamo il grafico della nostra distribuzione Beta(46, 956) e calcoliamo l’area di interesse:

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import beta

x = np.linspace(0.02, 0.08, 1000)
y = beta.pdf(x, 46, 956)

plt.figure(figsize=(10, 6))
plt.plot(x, y, label='Beta(46, 956)', color='#2ca02c', lw=2)
plt.axvline(0.05, color='#d62728', linestyle='--', label='Benchmark (5%)')

# Evidenziamo l'area P(CTR > 5%)
x_fill = np.linspace(0.05, 0.08, 500)
y_fill = beta.pdf(x_fill, 46, 956)
plt.fill_between(x_fill, y_fill, color='#2ca02c', alpha=0.3, label='P(CTR > 5%) ≈ 24.4%')

plt.title("Distribuzione del Vero CTR Plausibile")
plt.xlabel("Click-Through Rate (CTR)")
plt.ylabel("Densità di Probabilità")
plt.legend()
plt.grid(alpha=0.3)
plt.show()

# Calcolo esatto della probabilità
prob = 1 - beta.cdf(0.05, 46, 956)
print(f"Probabilità: {prob:.4f}")

distribuzione del vero ctr plausibile

Eseguendo il calcolo [math]1 – \text{beta.cdf}(0.05, 46, 956)[/math], otteniamo un valore di circa 0.244, ovvero il 24.4%.

Cosa significa per il business:

Solo il 24.4% dei valori plausibili per questa campagna supera la soglia desiderata del 5%. C’è oltre il 75% di probabilità che l’annuncio sia effettivamente sotto le aspettative. A questo punto, la decisione supportata dai dati potrebbe essere esplorare varianti, modificare il target o interrompere del tutto l’ad, ma con una solida base matematica a giustificarlo.

Verifica empirica con Simulazione Monte Carlo

Ai Data Scientist piace toccare i dati con mano. Oltre al calcolo analitico esatto visto sopra, possiamo ottenere lo stesso risultato tramite una simulazione Monte Carlo. Avendo già la distribuzione a posteriori definita, bastano due righe di codice:

# Estraiamo 100.000 campioni casuali dalla nostra distribuzione
samples = beta.rvs(46, 956, size=100000)

# Calcoliamo la percentuale di campioni maggiori del 5%
prob_mc = np.mean(samples > 0.05)
print(f"Probabilità stimata (Monte Carlo): {prob_mc:.4f}")

Simulando 100.000 possibili CTR compatibili con i dati osservati, circa il 24% supera il benchmark del 5%.

Statistica Bayesiana vs Frequentista

Perché abbiamo usato questo metodo e non il classico approccio frequentista che si insegna nei corsi base? La risposta è in questa tabella riassuntiva, fondamentale per la Data Science applicata:

Metodo Frequentista Bayesiano (Distribuzione Beta)
Concetto chiave Intervallo di confidenza Intervallo di credibilità
Natura del parametro Parametro fisso e sconosciuto Parametro casuale distribuito secondo probabilità
Interpretazione Difficile (“Se ripetessimo il test 100 volte…”) Diretta e probabilistica (“C’è il 95% di probabilità che…”)
Informazioni utilizzate Usa solo i dati attuali Incorpora la conoscenza pregressa (Prior) + dati osservati

Se quantificare l’incertezza di una singola campagna è utile, confrontare due campagne simultanee è il pane quotidiano di ogni marketer.

Vediamo come la distribuzione Beta risolve il problema più insidioso dell’A/B Testing.

Caso Studio 2: Quando il vincitore apparente potrebbe ingannarci: A/B Testing Bayesiano

Un’altra applicazione potentissima della distribuzione Beta si manifesta quando dobbiamo confrontare due opzioni, tipicamente in un A/B Test per due varianti di una landing page.

Il contesto:

  • Variante A (Storica): Ha accumulato molto traffico. 10.000 visualizzazioni, 500 conversioni. (Conversion Rate grezzo: 5%)
  • Variante B (Nuova): Lanciata ieri. 200 visualizzazioni, 14 conversioni. (Conversion Rate grezzo: 7%)

Un marketer guardando i numeri direbbe: “La Variante B converte al 7%, vince a mani basse, implementiamola subito su tutto il traffico”.

Ma il Data Scientist applica l’aggiornamento Bayesiano:

  • Variante A (Prior Beta(1,1) + dati): [math]\text{Beta}(501, 9501)[/math]
  • Variante B (Prior Beta(1,1) + dati): [math]\text{Beta}(15, 187)[/math]
Forse potrebbe interessarti anche:  Test Chi-Quadro: Guida Completa all'Adattamento e all'Indipendenza (con Esempi Pratici e Python)

A/B Testing Bayesiano: il 7% osservato è davvero migliore del 5%?

Confronto tra le distribuzioni posteriori delle due varianti

Asse x: Tasso di conversione (CTR)

Asse y: Densità di probabilità

Codice Python

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import beta

# Posteriori
a1, b1 = 501, 9501
a2, b2 = 15, 187

x = np.linspace(0.02, 0.10, 1000)

pdf_A = beta.pdf(x, a1, b1)
pdf_B = beta.pdf(x, a2, b2)

plt.figure(figsize=(10,6))

plt.plot(x, pdf_A, lw=2, label="Variante A - Beta(501,9501)")
plt.plot(x, pdf_B, lw=2, label="Variante B - Beta(15,187)")

# evidenzia sovrapposizione
plt.fill_between(
    x,
    np.minimum(pdf_A, pdf_B),
    alpha=0.35,
    label="Zona di sovrapposizione"
)

plt.xlabel("Conversion Rate")
plt.ylabel("Densità")
plt.title("Confronto Bayesiano tra le due varianti")
plt.grid(alpha=0.3)
plt.legend()

plt.show()

confronto bayesiano tra due varianti

Interpretazione

Sebbene la Variante B mostri un tasso di conversione osservato del 7%, la sua distribuzione a posteriori è molto più ampia rispetto a quella della Variante A, perché è stata osservata su un numero molto inferiore di utenti. La forte sovrapposizione tra le due curve indica che esiste ancora una probabilità non trascurabile che la Variante B sia in realtà meno efficace della Variante A.

Interrompere il test in questa fase significherebbe prendere una decisione basata su un’evidenza ancora debole.

samples = 200000

A = beta.rvs(501,9501,size=samples)
B = beta.rvs(15,187,size=samples)

prob = np.mean(B > A)

print(prob)
0.91616

Invece di confrontare semplicemente il 5% con il 7%, l’approccio bayesiano risponde direttamente alla domanda di business:

Qual è la probabilità che la Variante B sia realmente migliore della Variante A?

 

La simulazione indica che la Variante B ha circa il 91,6% di probabilità di essere migliore della Variante A. Sebbene questa probabilità sia elevata, significa anche che esiste ancora circa un 8,4% di probabilità che la Variante A sia in realtà la scelta migliore. In contesti dove un errore di decisione può avere costi elevati, molte aziende preferiscono attendere ulteriori dati prima di dichiarare un vincitore.

Questa è una differenza concettuale enorme: non stai più confrontando due percentuali osservate, ma stai stimando direttamente la probabilità che una variante sia migliore dell’altra. È proprio questo il principio su cui si basano il Thompson Sampling e molti algoritmi moderni di Multi-Armed Bandit. Con questa aggiunta, il secondo caso studio diventa completo e mostra in modo concreto il vantaggio operativo dell’inferenza bayesiana nell’A/B testing.

Questo approccio salva le aziende dall’errore fatale della sosta prematura di un test. Lo stesso schema matematico viene utilizzato nei sistemi di advertising online, nei motori di raccomandazione, nell’ottimizzazione continua delle landing page e nei moderni algoritmi di Multi-Armed Bandit (come il Thompson Sampling). Ogni nuovo click aggiorna la distribuzione Beta e modifica automaticamente la strategia di esplorazione e sfruttamento.

Oltre l’A/B Test: Automazione con il Thompson Sampling

Il passo successivo all’analisi statica è l’automazione.

Se il nostro test bayesiano ci dice che c’è ancora un margine di incertezza (quell’8,4% di probabilità che la Variante A sia ancora la migliore), come distribuiamo il traffico nel frattempo?

Qui entra in gioco il Thompson Sampling, un algoritmo di Multi-Armed Bandit che trasforma le nostre distribuzioni Beta in un motore decisionale dinamico. Invece di splittare il traffico al 50/50 in modo cieco come in un A/B test tradizionale, l’algoritmo estrae un singolo valore casuale dalle rispettive distribuzioni a posteriori per ogni nuovo visitatore. La variante che ottiene il valore estratto più alto “vince” l’impression.

Questo meccanismo converte direttamente l’incertezza in azioni: la Variante B (con il suo 7% osservato) vincerà più spesso perché la sua distribuzione è spostata verso destra, ma la Variante A continuerà a ricevere una frazione di traffico proporzionale alle sue reali probabilità di successo. È l’equilibrio matematico perfetto tra lo sfruttare l’opzione che sembra vincente (exploitation) e continuare a testare quella incerta (exploration), minimizzando i click persi.

Forse potrebbe interessarti anche:  Decision Intelligence e Risk Exposure: come ridurre i rischi aziendali con simulazioni Monte Carlo e AI decisionale

Lo Snippet Python

import numpy as np

# Le nostre distribuzioni a posteriori attuali
# Variante A: Beta(501, 9501)
# Variante B: Beta(15, 187)
a1, b1 = 501, 9501
a2, b2 = 15, 187

def thompson_sampling_router(a1, b1, a2, b2):
    """
    Estrae un campione da ciascuna distribuzione Beta.
    Ritorna la variante con il campione maggiore.
    """
    theta_A = np.random.beta(a1, b1)
    theta_B = np.random.beta(a2, b2)
    
    return "Variante A" if theta_A > theta_B else "Variante B"

# Simuliamo l'arrivo di 1.000 nuovi utenti sul sito
traffico_A = 0
traffico_B = 0

for _ in range(1000):
    scelta = thompson_sampling_router(a1, b1, a2, b2)
    if scelta == "Variante A":
        traffico_A += 1
    else:
        traffico_B += 1

print("Distribuzione dinamica dei prossimi 1.000 utenti:")
print(f"Traffico inviato alla Variante A: {traffico_A} utenti")
print(f"Traffico inviato alla Variante B: {traffico_B} utenti")

 Output atteso: circa ~85 utenti ad A e ~915 utenti a B.
L'algoritmo non "spegne" la Variante A, ma la de-prioritizza 
in proporzione esatta al rischio che stiamo correndo.

Nota: Lo script usa np.random.beta invece di scipy.stats perché Numpy è computazionalmente molto più veloce ed efficiente quando si tratta di simulare cicli operativi o generare numeri casuali in produzione


Perché questi esercizi sono così interessanti per un Data Scientist?

L’esercizio sul CTR (Fase 1-6): La peculiarità di questo caso studio sta nel cambio di prospettiva. Nel mondo frequentista, la domanda è un laconico:

“Il valore osservato è minore del benchmark?”.

Nel mondo bayesiano, l’esercizio ci insegna a rispondere alla domanda che il management fa davvero:

“Che rischio stiamo correndo tenendo accesa la campagna?”.

Calcolare che c’è un [math]24.4\%[/math] di probabilità di aver superato la soglia trasforma il Data Scientist da un semplice “calcolatore di divisioni” a un risk manager. Il [math]24.4\%[/math] non è “zero”: a seconda del budget, un’azienda aggressiva potrebbe decidere che vale la pena aspettare un altro giorno.

L’esercizio sull’A/B Testing (Caso Studio 2): Questo esercizio è il perfetto antidoto al Simpson’s Paradox e alla tirannia dei piccoli numeri. È interessante perché dimostra visivamente (attraverso le curve di densità) ciò che l’intuito umano sbaglia: un [math]7\%[/math] su 200 iterazioni è più debole e più incerto di un [math]5\%[/math] su 10.000 iterazioni. Inoltre, questo esercizio getta le basi esatte per spiegare gli algoritmi di Multi-Armed Bandit (come il Thompson Sampling), che automatizzano esattamente questa formula matematica per bilanciare exploration ed exploitation nelle piattaforme digitali.

📌 Da ricordare

Quando osserviamo una percentuale (come un CTR grezzo), non stiamo osservando la probabilità vera. Stiamo osservando solo una singola realizzazione casuale.

La distribuzione Beta rappresenta matematicamente tutte le probabilità plausibili alla luce dei dati raccolti, fornendo una misura chiara dell’incertezza.

📚 Per approfondire: dalla probabilità alla decision intelligence nella Data Science

La statistica moderna non serve solo a descrivere i dati, ma permette di prendere decisioni sotto incertezza.
Approfondisci il legame tra inferenza bayesiana, distribuzioni di probabilità, algoritmi adattivi e sistemi intelligenti di raccomandazione.

👉Inferenza statistica: l’approccio bayesiano spiegato passo dopo passo

👉Esercizi svolti sulla distribuzione Beta: teoria, calcoli e applicazioni

👉Comprendere la distribuzione Beta attraverso 5 esempi concreti

👉Errori comuni nelle distribuzioni di probabilità: guida pratica con esempi

👉Le 7 distribuzioni statistiche che ogni Data Scientist deve conoscere

👉Multi-Armed Bandit: cos’è, come funziona e perché supera l’A/B Testing

👉L’algoritmo di YouTube spiegato: Recommendation Systems e Decision Intelligence

Pubblicità