
Modern Attribution Modeling
From last-click to incremental models: how to read attribution and the real contribution of channels without confusing correlation and causality.
What you will learn
- Distinguish attribution from incrementality with operational examples
- Implement attribution models in Python and SQL
- Design a multi-model decision framework for budget allocation
import itertools
import numpy as np
Modern Attribution Modeling
La piattaforma attribuisce vendite al retargeting, il CRM vede clienti già caldi e il team brand sostiene di aver creato domanda settimane prima. Un modello di attribuzione moderno non deve solo distribuire credito: deve rendere chiaro quale decisione di budget cambierà. Questa lezione porta la discussione fuori dalla guerra tra canali e la tratta come scelta tra modelli utili e modelli seducenti. Attribution, Shapley, Markov o approcci incrementali hanno senso solo se dichiarano cosa misurano, cosa ignorano e quale azione rendono più razionale.
The problem: three metrics, three different stories
Ogni azienda che spende più di un milione all’anno in marketing vive lo stesso paradosso. Il team paid search mostra un dashboard dove Google Ads domina con ROAS 520%, il team social ne mostra un altro dove Meta ha ROAS 390%, e il team email ne ha un terzo dove le newsletter generano “il 27% del revenue totale”. Sommando i tre report l’azienda ottiene un ROAS composito del 250%, ma il fatturato totale cresce del 7%. I numeri non mentono: si sovrappongono.
The root of the problem is that each dashboard measures conversions, not incrementality. Una conversione è un utente che ha visto un touchpoint e poi ha comprato. L’incremento è la differenza tra chi ha comprato because of al touchpoint e chi avrebbe comprato comunque. La distanza tra questi due numeri è il costo dell’attribuzione ingenua, e Uber la quantificò nel 2018: dopo aver speso 120 milioni di dollari in app-install ads, un audit rivelò che il 65% delle installazioni attribuite erano organiche. L’utente cercava “Uber” sull’app store dopo aver visto l’ad? Sì. Ma lo avrebbe cercato comunque? Sì. L’ad era una tassa, non un investimento.
Three model families, one decision hierarchy
Non esiste un modello migliore in assoluto. Esiste un modello appropriato alla domanda che stai facendo.
I modelli rule-based (last-click, first-click, lineare, time-decay) assegnano il credito di una conversione a uno o più touchpoint secondo una regola fissa. Il loro merito è la trasparenza: chiunque capisce un last-click in 30 secondi. Il difetto è che ignorano la controfattuale, cioè cosa sarebbe successo senza quel touchpoint. Usali per la reportistica operativa quotidiana, mai per decidere se un canale vive o muore.
I modelli data-driven MTA (Multi-Touch Attribution) usano machine learning, tipicamente regressione logistica, catena di Markov o Shapley values, per pesare ogni touchpoint in base al suo contributo predittivo alla conversione. Un modello di Markov, per esempio, calcola la probabilità di conversione partendo da ogni canale e attribuisce il delta: se la probabilità base è 2.1% e aggiungendo Facebook Ads sale al 3.4%, il contributo incrementale di Facebook è 1.3 punti. Questi modelli catturano sinergie tra canali che i rule-based ignorano. Il limite è che sono correlazionali, non causali. Se gli utenti più propensi all’acquisto tendono anche a cliccare più email, il modello MTA attribuirà molto credito alle email, ma quegli utenti avrebbero comprato comunque.
I modelli causali (incrementality test, MMM, geo-lift, differenze-in-differenze) misurano direttamente l’effetto incrementale confrontando un gruppo esposto con un gruppo di controllo. Un geo-lift test, per esempio, attiva una campagna Meta in 20 regioni e la spegne in altre 20 statisticamente equivalenti. Dopo 4 settimane confronta il revenue nelle regioni trattate e in quelle di controllo. Se le regioni trattate hanno un revenue +8.2% con p<0.05, l’incremento è reale e misurabile. Il limite è che sono costosi, richiedono settimane e non dicono nulla sul the path, solo sull’effetto netto.
La gerarchia operativa non è “sostituisci A con B”. È descrivi con rule-based, spiega con MTA, decidi con causale. I tre livelli rispondono a domande diverse e coesistono.
SQL implementation: from last-click to time-decay
Last-click is a trivial window:
WITH last_touch AS (
SELECT conversion_id, user_id, channel, touch_time,
ROW_NUMBER() OVER (
PARTITION BY conversion_id ORDER BY touch_time DESC
) AS rn
FROM touchpoints
)
SELECT channel, COUNT(*) AS conversions,
SUM(conversion_value) AS attributed_revenue
FROM last_touch WHERE rn = 1
GROUP BY channel;
Il time-decay è più sofisticato e meglio allineato alla realtà psicologica dell’acquisto, perché il touchpoint più recente ha più peso:
WITH ranked AS (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY conversion_id ORDER BY touch_time DESC) AS recency_rank,
COUNT(*) OVER (PARTITION BY conversion_id) AS total_touches
FROM touchpoints
),
weighted AS (
SELECT *, POWER(0.5, recency_rank - 1) AS raw_weight
FROM ranked
),
normalized AS (
SELECT conversion_id, channel, conversion_value,
raw_weight / SUM(raw_weight) OVER (PARTITION BY conversion_id) AS norm_weight
FROM weighted
)
SELECT channel,
ROUND(SUM(conversion_value * norm_weight), 0) AS attributed_revenue
FROM normalized
GROUP BY channel
ORDER BY attributed_revenue DESC;
Il coefficiente 0.5 è l’half-life: ogni passo indietro dimezza il peso. Se lo metti a 0.7 l’effetto è più piatto; a 0.3 l’ultimo click prende quasi tutto. La scelta non è arbitraria, va calibrata sulla lunghezza media del ciclo di acquisto del tuo prodotto. Un SaaS enterprise con sales cycle di 6 mesi userà half-life più lunghi; un e-commerce fast-fashion userà half-life più corti.
Real case: Booking.com and Shapley values in production
Nel 2019 il team di marketing science di Booking.com pubblicò un paper al workshop NIPS che fece scuola. Con oltre 4 miliardi di dollari di spesa marketing annua, anche un errore dell’1% nell’attribuzione vale 40 milioni. Il loro approccio fu modellare il customer journey come un gioco cooperativo, dove ogni canale è un giocatore che contribuisce, o non contribuisce, alla conversione. Gli Shapley values calcolano il contributo marginale medio di ogni canale in all possible combinations of channels.
Il calcolo è combinatoriamente esplosivo, 2^N combinazioni per N canali, ma Booking.com lo approssima con campionamento Monte Carlo. Il risultato pratico fu che il passaggio da rule-based a Shapley ridistribuì il 18% del budget tra canali. Facebook Ads e Display ricevettero più credito di quanto il last-click suggerisse, perché il modello riconosceva il loro ruolo nell’iniziare il journey. Il ROAS globale salì del 7% senza spendere un euro in più.
Simplified Python implementation of Shapley calculation:
def shapley_attribution(channels, conversion_rates):
"""Calcola Shapley values per ogni canale dati i tassi di conversione per combinazione."""
n = len(channels)
shapley = {ch: 0.0 for ch in channels}
for ch in channels:
others = [c for c in channels if c != ch]
for subset in itertools.chain.from_iterable(
itertools.combinations(others, r) for r in range(len(others) + 1)
):
subset_with = tuple(sorted(list(subset) + [ch]))
subset_without = tuple(sorted(subset))
marginal = conversion_rates.get(subset_with, 0) - conversion_rates.get(subset_without, 0)
weight = (np.math.factorial(len(subset)) *
np.math.factorial(n - len(subset) - 1) /
np.math.factorial(n))
shapley[ch] += weight * marginal
return shapley
# Esempio con 3 canali
rates = {(): 0.02, ('email',): 0.04, ('social',): 0.03, ('search',): 0.05,
('email', 'social'): 0.07, ('email', 'search'): 0.09,
('social', 'search'): 0.08, ('email', 'social', 'search'): 0.12}
print(shapley_attribution(['email', 'social', 'search'], rates))
# Output: {'email': 0.035, 'social': 0.025, 'search': 0.06}
Nota che search prende il 50% del credito non perché “chiude” ma perché la sua presenza o assenza ha l’impatto marginale più alto in tutte le combinazioni.
The “Describe + Explain + Decide” framework
La vera maturità analitica non è scegliere un modello, ma orchestrare una catena decisionale su tre livelli.
Al primo livello descrivi con modelli semplici, last-click e lineare. Servono per il reporting quotidiano e per allineare 20 stakeholder diversi su una baseline condivisa. Non usarli per prendere decisioni.
Al secondo livello spieghi con MTA o Shapley. Qui emergono le sinergie: il social che non chiude ma inizia il 40% dei journey, la brand search che intercetta domanda generata da altri canali. Il confronto tra il report descrittivo e quello esplicativo è già un insight, perché la differenza tra i due è il bias del modello semplice.
Al terzo livello decidi con test di incrementality. Ogni trimestre esegui almeno un geo-lift o un holdout test su un canale importante. Se il canale supera il test, mantieni o aumenti il budget; se fallisce, riduci. Non importa cosa dicono i modelli descrittivi o esplicativi, l’incremento misurato batte qualsiasi predizione.
Questo framework fu adottato da HelloFresh nel 2021 dopo che un audit rivelò che il 31% della spesa display era non incrementale. Implementarono geo-lift test trimestrali su tutti i canali sopra i 2 milioni di spesa annua. In 18 mesi riallocarono 14 milioni di euro da canali non incrementali a canali ad alta incrementalità, aumentando il revenue del 6.3% senza incremento di budget.
Lab: from data to decision
Nel primo esercizio confronti i modelli. Ti vengono dati 12.000 journey di conversione con 3-8 touchpoint ciascuno su 5 canali. Implementa last-click, lineare e time-decay con half-life 7 giorni e confronta la distribuzione del credito. Quale canale cambia di più tra last-click e lineare, e perché? Il dataset ha schema journey_id, user_id, touch_sequence, conversion_value, dove ogni touch_sequence is a JSON array of [{channel, timestamp}].
Nel secondo esercizio simuli una geo-lift analysis. Hai 40 regioni, 20 trattate e 20 di controllo. Per ogni regione hai revenue_pre, le 4 settimane prima del test, e revenue_post, le 4 settimane durante. Calcola il lift incrementale con un difference-in-differences e l’intervallo di confidenza al 95%.
Nel terzo esercizio, sullo Shapley semplificato, parti dai tassi di conversione per combinazione di canali, implementa il calcolo Shapley e confrontalo con il last-click. In che direzione cambia l’allocazione del credito?
Common Mistakes and How to Avoid Them
Anche gli analisti esperti cadono in trappole prevedibili. Il primo errore è confondere correlazione e causalità: due metriche che si muovono insieme non implicano che una causi l’altra, e solo un A/B test o un’analisi controfattuale stabilisce causalità. Il secondo è ignorare la stagionalità: confrontare novembre con dicembre senza correggere l’effetto festività produce insight fuorvianti, quindi usa un confronto anno su anno o una media mobile destagionalizzata. Il terzo è non validare il grain della query, la causa più comune di risultati errati, tra JOIN che duplicano righe, filtri applicati troppo tardi e finestre definite sul dataset sbagliato. Prima di interpretare un numero, verifica il conteggio delle righe a ogni step.
Summary
L’attribuzione diventa utile quando produce una decisione di budget più chiara, non quando aggiunge un modello in più. La gerarchia regge sempre: descrivi con rule-based per allineare, spiega con MTA o Shapley per vedere le sinergie, decidi con test di incrementality perché solo l’incremento misurato batte la predizione. Il rischio da evitare è scambiare un credito descrittivo per una prova causale e spostare spesa su un canale che avrebbe comunque raccolto quella domanda.
References:
- Shapley, L. S. (1953). “A Value for n-Person Games.” Contributions to the Theory of Games, 2(28), pp. 307-317. Princeton University Press.
- Booking.com. (2019). “A Shapley Value Approach to Marketing Channel Attribution.” NIPS 2019 Workshop on Machine Learning for E-Commerce.
- Blake, T., Nosko, C. & Tadelis, S. (2015). “Consumer Heterogeneity and Paid Search Effectiveness: A Large Scale Field Experiment.” Econometrica, 83(1), pp. 155-174.
- Lewis, R. A. & Rao, J. M. (2015). “The Unfavorable Economics of Measuring the Returns to Advertising.” Quarterly Journal of Economics, 130(4), pp. 1941-1973.
Related Path
Lessons to read together
Questi collegamenti portano la lezione dentro il resto del corso: basi da riprendere, passaggi successivi e connessioni tematiche tra moduli.