Correlazione o causalità: cosa consente davvero di affermare un’analisi?
La correlazione descrive una variazione congiunta. Un effetto causale richiede un controfattuale credibile e ipotesi di identificazione che non derivano dal solo coefficiente.
Redazione scientifica: Marketing Science Center
Risposta diretta
Separare un’associazione osservata da un effetto causale identificato e mostrare cosa cambia l’aggiustamento.
La correlazione descrive una variazione congiunta. Un effetto causale richiede un controfattuale credibile e ipotesi di identificazione che non derivano dal solo coefficiente.
Hernán & Robins, Causal Inference: What IfCinelli, Forney & Pearl, 2022
01
La risposta in 30 secondi
1
Una correlazione o differenza grezza descrive ciò che si osserva insieme. Non definisce né l’intervento né l’esito controfattuale.
2
Un effetto causale confronta gli esiti medi sotto due interventi ben definiti per una popolazione e un periodo dichiarati.
3
In uno studio osservazionale, l’interpretazione causale dipende dal disegno, dal grafo causale e da ipotesi non provate dal coefficiente.
02
Tre livelli di lettura
- 1
Decisore: chiedere quale decisione cambierebbe e quale confronto controfattuale la sostiene.
- 2
Professionista: dichiarare esposizione, esito, popolazione, periodo e variabili di aggiustamento prima dell’analisi.
- 3
Analista: separare estimando, identificazione e stima; documentare positività, sensibilità e validità esterna.
03
Situazione marketing concreta
Un team osserva che i clienti sottoposti a retargeting acquistano di più entro 30 giorni. Tuttavia il retargeting riguarda soprattutto visitatori con forte intenzione precedente. La domanda utile non è solo «chi acquista di più?», ma «quale sarebbe stato il tasso della stessa popolazione con e senza retargeting?»
04
Domanda scientifica ed estimando
Popolazione obiettivo: clienti idonei rappresentati da un campione sintetico di 10.000 unità. Al tempo zero, A=1 è l’assegnazione a una politica fissa: una sola impression display, stessa creatività, entro 24 ore, con limite di una in sette giorni. A=0 sopprime ogni impression di retargeting per sette giorni. Y è l’acquisto entro 30 giorni e L l’intenzione precedente. Estimando: ATE = E[Y¹] − E[Y⁰], standardizzato sui pesi empirici fissi del campione.
ATE = E[Y¹] − E[Y⁰]05
Perché il confronto grezzo può ingannare
- Confondimento: l’intenzione precedente influenza retargeting e acquisto; L → A e L → Y creano associazione non causale.
- Causalità inversa: un segnale precoce dell’esito può attivare l’esposizione se la cronologia è mal definita.
- Controllo errato: aggiustare per un mediatore o collider può bloccare parte dell’effetto o aprire un percorso di bias.
06
Intuizione del metodo
Il DAG dichiarato è L → A, L → Y e A → Y. La variazione di A proviene dal targeting operativo, non da assegnazione casuale. La standardizzazione confronta i rischi A=1 e A=0 a parità di L, poi pesa gli strati secondo la popolazione obiettivo. Chiude il percorso back-door osservato tramite L; non corregge confondenti non misurati.
Greenland, Pearl & Robins (1999) Cinelli, Forney & Pearl (2022)
07
Dati necessari
- Una riga per strato d’intenzione e livello di esposizione, con numerosità n e acquisti y.
- Definizione stabile dell’esposizione, esito binario a 30 giorni, popolazione, finestra ed esclusioni fissati prima del calcolo.
- Confondenti scelti tramite ragionamento causale, non con selezione automatica.
08
Modello formale e simboli
Associazione
RDcrude = E[Y|A=1] − E[Y|A=0]A: assegnazione alla politica; Y: acquisto entro 30 giorni.
Standardizzazione
E[Yᵃ] = Σₗ E[Y|A=a,L=l]P(L=l)L: intenzione precedente; a: intervento dichiarato; ATE: differenza dei rischi standardizzati.
09
Calcolo dichiarato, passo dopo passo
- 01
Calcolare i rischi grezzi per esposizione.
- 02
Calcolare il rischio in ogni cella L × A.
- 03
Pesare ogni rischio con P(L) nella popolazione obiettivo.
- 04
Sottrarre i rischi standardizzati e calcolare l’errore standard.
10
Esempio numerico completo
Insieme di dati sintetico creato per l’apprendimento. Non descrive alcuna campagna reale.
| L | A | n | Y=1 | Rischio |
|---|---|---|---|---|
| 0 | 0 | 4.800 | 192 | 4% |
| 0 | 1 | 1.200 | 72 | 6% |
| 1 | 0 | 800 | 192 | 24% |
| 1 | 1 | 3.200 | 896 | 28% |
Associazione
22,00% − 6,86% = 15,14 punti
ATE
14,80% − 12,00% = 2,80 punti
IC al 95%
[1,20; 4,40] punti
Lo scarto tra 15,14 e 2,80 punti deriva dalla composizione dell’intenzione. L’intervallo di Wald tratta il campionamento, non confondenti omessi.
11
Ipotesi di validità
- Coerenza: l’assegnazione osservata corrisponde esattamente alla politica display definita, al comparatore e al tempo zero.
- Scambiabilità condizionale: a parità di L, nessun determinante non misurato influenza ancora A e Y.
- Positività: ogni livello di L contiene clienti esposti e non esposti.
- Assenza d’interferenza: l’esposizione di un cliente non modifica l’esito di un altro.
Hernán & Robins, Causal Inference: What If Cinelli, Forney & Pearl (2022)
12
Diagnostica e incertezza
01
Verificare numerosità e rischi di ogni cella, cronologia e definizione del trattamento.
02
Controllare la positività: nessuna cella vuota; ispezionare probabilità di esposizione estreme su dati individuali.
03
L’IC di Wald assume celle binomiali indipendenti e condiziona su numerosità e pesi osservati. Se i pesi sono stimati, usare bootstrap o funzione d’influenza. Riportare separatamente la sensibilità a confondenti non misurati e al DAG.
13
Interpretare i due risultati
L’associazione grezza risponde a «quale differenza si osserva tra i gruppi ricevuti?». L’ATE standardizzato risponde a «quale differenza media si avrebbe sotto due politiche per la popolazione dichiarata?», solo se le ipotesi di identificazione sono credibili. L’intervallo quantifica il campionamento sotto il modello, non automaticamente il bias da confondimento.
14
Conclusioni ammesse e vietate
Ammesso
- Descrivere un’associazione grezza di 15,14 punti in questo insieme di dati.
- Sotto le ipotesi dichiarate, stimare un ATE standardizzato di 2,80 punti per questa popolazione.
Vietato
- Dire che coefficiente o significatività provano l’impatto del retargeting.
- Generalizzare a un’altra popolazione, periodo o versione del trattamento senza nuova giustificazione.
15
Decisione marketing possibile
La responsabile può decidere un A/B test quando l’importanza giustifica variazione randomizzata, oppure usare provvisoriamente la stima standardizzata con prudenza e sensibilità. Il calcolo prepara la decisione; non sceglie budget o lancio.
16
Quando usare e quando non usare
01
Usare la standardizzazione quando trattamento, esito, popolazione e un insieme di aggiustamento pretrattamento difendibile sono disponibili.
02
Non usarla come scorciatoia causale se manca positività, il trattamento è ambiguo o mancano confondenti importanti.
03
Alternative: esperimenti A/B o geografici, differenza-nelle-differenze, variabili strumentali, controllo sintetico e analisi di sensibilità secondo il disegno.
17
Implementazioni riproducibili
Stesso CSV, stessa standardizzazione, stessi output attesi. Il software esegue il calcolo; non valida le ipotesi causali.
Python 3.13
# Python 3.13, standard library only
import csv, math
rows = list(csv.DictReader(open("msc-p002-retargeting.csv", encoding="utf-8")))
for r in rows:
r.update({k:int(r[k]) for k in ("prior_intent","retargeted","n","purchases")})
N = sum(r["n"] for r in rows)
weights = {l:sum(r["n"] for r in rows if r["prior_intent"]==l)/N for l in (0,1)}
risk = {(r["prior_intent"],r["retargeted"]):r["purchases"]/r["n"] for r in rows}
crude = {a:sum(r["purchases"] for r in rows if r["retargeted"]==a)/sum(r["n"] for r in rows if r["retargeted"]==a) for a in (0,1)}
standardized = {a:sum(weights[l]*risk[l,a] for l in (0,1)) for a in (0,1)}
ate = standardized[1]-standardized[0]
se = math.sqrt(sum(weights[l]**2*(risk[l,1]*(1-risk[l,1])/next(r["n"] for r in rows if r["prior_intent"]==l and r["retargeted"]==1)+risk[l,0]*(1-risk[l,0])/next(r["n"] for r in rows if r["prior_intent"]==l and r["retargeted"]==0)) for l in (0,1)))
print(crude[1]-crude[0], ate, (ate-1.959964*se, ate+1.959964*se))R 4.5
# R 4.5
d <- read.csv("msc-p002-retargeting.csv")
d$risk <- d$purchases / d$n
w <- aggregate(n ~ prior_intent, d, sum); w$weight <- w$n / sum(w$n)
d <- merge(d, w[c("prior_intent","weight")], by="prior_intent")
crude <- aggregate(cbind(purchases,n) ~ retargeted, d, sum)
crude$risk <- crude$purchases / crude$n
std <- aggregate(I(weight*risk) ~ retargeted, d, sum)
ate <- std[std$retargeted==1,2] - std[std$retargeted==0,2]
cell <- transform(d, v=weight^2*risk*(1-risk)/n)
se <- sqrt(sum(cell$v))
c(crude_RD=diff(crude$risk), ATE=ate, lo=ate-qnorm(.975)*se, hi=ate+qnorm(.975)*se)IBM SPSS Statistics 31
* IBM SPSS Statistics 31.
GET DATA /TYPE=TXT /FILE='msc-p002-retargeting.csv' /FIRSTCASE=2 /DELCASE=LINE
/DELIMITERS=',' /VARIABLES=prior_intent F1.0 retargeted F1.0 n F8.0 purchases F8.0.
MATRIX.
GET x /VARIABLES=prior_intent retargeted n purchases.
COMPUTE risk=x(:,4)&/x(:,3).
COMPUTE N=CSUM(x(:,3)).
COMPUTE w={CSUM(x(1:2,3))/N;CSUM(x(1:2,3))/N;CSUM(x(3:4,3))/N;CSUM(x(3:4,3))/N}.
COMPUTE p1=CSUM((x(:,2)=1)&*x(:,4))/CSUM((x(:,2)=1)&*x(:,3)).
COMPUTE p0=CSUM((x(:,2)=0)&*x(:,4))/CSUM((x(:,2)=0)&*x(:,3)).
COMPUTE s1=CSUM((x(:,2)=1)&*w&*risk); s0=CSUM((x(:,2)=0)&*w&*risk).
COMPUTE se=SQRT(CSUM(w&*w&*risk&*(1-risk)&/x(:,3))).
PRINT {p1-p0;s1-s0;s1-s0-1.959964*se;s1-s0+1.959964*se}
/TITLE='crude_RD ATE CI_low CI_high'.
END MATRIX.SAS 9.4
/* SAS 9.4 */
proc import datafile='msc-p002-retargeting.csv' out=d dbms=csv replace; guessingrows=max; run;
proc sql;
create table cell as select a.*, purchases/n as risk,
(select sum(n) from d b where b.prior_intent=a.prior_intent)/(select sum(n) from d) as weight
from d a;
create table crude as select retargeted, sum(purchases)/sum(n) as risk from cell group by retargeted;
create table std as select retargeted, sum(weight*risk) as risk,
sum(weight*weight*risk*(1-risk)/n) as variance from cell group by retargeted;
quit;
data result; merge crude(where=(retargeted=0) rename=(risk=c0)) crude(where=(retargeted=1) rename=(risk=c1))
std(where=(retargeted=0) rename=(risk=s0 variance=v0)) std(where=(retargeted=1) rename=(risk=s1 variance=v1));
crude_RD=c1-c0; ATE=s1-s0; SE=sqrt(v0+v1); CI_low=ATE-1.959964*SE; CI_high=ATE+1.959964*SE; run;
proc print data=result; var crude_RD ATE CI_low CI_high; run;18
Risultato finale atteso
Un dossier decisionale contiene domanda causale, DAG versionato, estimando, popolazione e periodo, dizionario dati, calcolo grezzo e aggiustato, intervallo, diagnostica di positività, ipotesi non testabili, sensibilità, limiti di generalizzazione e decisione umana proposta.
19
Fonti scientifiche e livello di prova
- Hernán & Robins, Causal Inference: What If
Testo metodologico completo: controfattuali, coerenza, scambiabilità, positività, standardizzazione e interferenza.
- Cinelli, Forney & Pearl (2022)
Articolo metodologico su controlli buoni e cattivi, percorsi back-door, mediatori e collider.
- Greenland, Pearl & Robins (1999)
Fondamento formale dei grafi causali e dei criteri di identificazione basati sui percorsi.
Le fonti sostengono il metodo. L’insieme di dati e i risultati numerici sono creazioni sintetiche MSC; non costituiscono una validazione empirica esterna.
Dati · Strumento
Connessioni metodologiche

