Vai al contenuto principale
Attribution modeling moderno - immagine ufficiale della lezione su GinnyTech, creata da AD

Attribution modeling moderno

Dal last-click ai modelli incrementali: come leggere attribuzione e contributo reale dei canali senza confondere correlazione e causalità.

AD
Creato daAndrii Dyshkantiuk
Lezione 79 / 236Livello: IntermedioDurata: 25 minPrerequisiti: 1

Cosa imparerai

  • Distinguere attribuzione da incrementality con esempi operativi
  • Implementare modelli di attribuzione in Python e SQL
  • Progettare un framework decisionale multi-modello per l'allocazione budget

Attribution modeling moderno

Il punto di partenza dell’attribuzione è una domanda scomoda: quanto del tuo budget sta davvero creando vendite, e quanto sta solo seguendo domanda che esisterebbe comunque? Ogni dashboard misura conversioni, ma le conversioni non sono incremento. In questa lezione impari a distinguere i due concetti e a orchestrare modelli rule-based, data-driven e causali per decidere dove spostare il budget.

Che cos’è l’attribution modeling

L’attribution modeling distribuisce il credito di una conversione tra i touchpoint per rendere esplicita quale riallocazione di budget aumenta il revenue incrementale.

La procedura in cinque passaggi

Ecco la sequenza che seguiamo quando dobbiamo passare dal dato grezzo alla decisione di budget.

  1. Ricostruisci i journey completi con canale, tempo e valore di conversione.
  2. Calcola last-click e time-decay come baseline descrittiva condivisa.
  3. Stima il contributo marginale con catena di Markov o valori di Shapley.
  4. Valida il canale con geo-lift o holdout utente prima di spostare budget.
  5. Rialloca solo verso canali con ROAS incrementale positivo e stabile.

Il problema: tre metriche, tre storie diverse

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 per cento. Il team social ne mostra un altro dove Meta ha ROAS 390 per cento. Il team email ne ha un terzo dove le newsletter generano il 27 per cento del revenue totale. Sommando i tre report l’azienda ottiene un ROAS composito del 250 per cento, ma il fatturato totale cresce del 7 per cento. I numeri non mentono: si sovrappongono.

La radice del problema è che ogni dashboard misura conversioni, non incremento. Una conversione è un utente che ha visto un touchpoint e poi ha comprato. L’incremento è la differenza tra chi ha comprato grazie al touchpoint e chi avrebbe comprato comunque. La distanza tra questi due numeri è il costo dell’attribuzione ingenua. Uber la quantificò nel 2018: dopo aver speso 120 milioni di dollari in app-install ads, un audit rivelò che il 65 per cento delle installazioni attribuite erano organiche.

Tre famiglie di modelli, una gerarchia decisionale

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 usano machine learning, tipicamente regressione logistica, catena di Markov o valori di Shapley, 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 per cento e aggiungendo Facebook Ads sale al 3.4 per cento, 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. Quegli utenti avrebbero però 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 superiore del 8.2 per cento con p<0.05, l’incremento è reale e misurabile. Il limite è che sono costosi, richiedono settimane e non dicono nulla sul percorso, solo sull’effetto netto.

Verdetto: descrivi con rule-based per allineare il reporting, spiega le sinergie con MTA e sposta budget solo su evidenza causale.

Implementazione in SQL: dal last-click al time-decay

Il last-click è una finestra banale:

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.

Verdetto: usa last-click per il reporting quotidiano e time-decay calibrato sul ciclo di acquisto per la lettura operativa.

Caso reale: Booking.com e gli Shapley values in produzione

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 per cento 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 tutte le possibili combinazioni di canali.

Il calcolo è combinatoriamente esplosivo, 2 alla 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 per cento 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 per cento senza spendere un euro in più.

L’implementazione semplificata in Python del calcolo Shapley:


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 per cento del credito non perché chiude ma perché la sua presenza o assenza ha l’impatto marginale più alto in tutte le combinazioni.

Il framework Descrivi Spiega Decidi

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 per cento 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 per cento 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 per cento senza incremento di budget.

Verdetto: nessun canale sopra soglia di spesa vive senza un test causale trimestrale che confermi il suo ROAS incrementale.

Laboratorio: dal dato alla decisione

Nel primo esercizio confronti i modelli. Ti vengono dati 12000 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 è un array JSON di [{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 per cento.

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?

Errori frequenti e come evitarli

Il primo errore è confondere correlazione e causalità: due metriche che si muovono insieme non implicano che una causi l’altra. Solo un test con controllo stabilisce causalità. Il secondo è ignorare la stagionalità: confrontare novembre con dicembre senza correggere l’effetto festività produce insight fuorvianti. Usa quindi 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. Un JOIN che duplica righe, un filtro applicato troppo tardi o una finestra definita sul dataset sbagliato invalidano ogni metrica a valle.

Riferimenti

  • 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. e Tadelis, S. (2015). Consumer Heterogeneity and Paid Search Effectiveness: A Large Scale Field Experiment. Econometrica, 83(1), pp. 155-174.
  • Lewis, R. A. e Rao, J. M. (2015). The Unfavorable Economics of Measuring the Returns to Advertising. Quarterly Journal of Economics, 130(4), pp. 1941-1973.

Un caso che fa riflettere: Booking.com

Nel 2019 il team marketing science di Booking.com presentò al workshop NIPS un modello di attribuzione basato sui valori di Shapley. Con oltre 4 miliardi di dollari di spesa marketing annua, il passaggio da rule-based a Shapley ridistribuì il 18 per cento del budget tra canali. Il modello riconobbe a Facebook Ads e Display il ruolo di avvio dei journey. Il ROAS globale salì del 7 per cento senza aumento di spesa.

Domande per l’autoverifica

  1. Quale modello usi per il reporting quotidiano e quale per spostare budget?
  2. Quale sinergia tra canali emerge con Shapley ma resta invisibile al last-click?
  3. Quale geo-lift dimostra che un canale crea domanda invece di raccoglierla?
  4. Quale half-life di time-decay riflette il tuo ciclo medio di acquisto?
Serve una mano concreta?

Bloccato su questo argomento o vuoi applicarlo al tuo caso? Prenota una call di 15 minuti con un analista esperto.

Prenota una call