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 da Andrii Dyshkantiuk
Lezione 79 / 216 Livello: Intermedio Durata: 25 min Prerequisiti: 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

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 moderno non deve solo distribuire credito: deve rendere chiaro quale decisione di budget cambierà. Attribution modeling moderno porta questa discussione fuori dalla guerra tra canali.

Una scena da cui partire

Leggi la lezione come scelta tra modelli utili e modelli seducenti. Attribution, Shapley, Markov o approcci incrementali hanno senso solo se dichiarano cosa possono misurare, cosa ignorano e quale azione rendono più razionale.

  • Contesto: Quale canale riceve credito senza aver creato domanda?
  • Metodo: Quale modello cambia davvero la decisione di allocazione?
  • Applicazione: Come comunicheresti incertezza e limite dell’attribuzione?

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%, il team social mostra un altro dashboard 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 ha un ROAS composito del 250% — ma il fatturato totale cresce del 7%. 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 utenti che hanno comprato grazie al touchpoint e utenti che avrebbero 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.

Tre famiglie di modelli, una gerarchia decisionale

Non esiste un modello “migliore” in assoluto. Esiste un modello appropriato alla domanda che stai facendo.

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 unico merito è la trasparenza: chiunque capisce come funziona un last-click in 30 secondi. Il loro difetto è che ignorano completamente la controfattuale — cosa sarebbe successo senza quel touchpoint. Usali per la reportistica operativa quotidiana, mai per decidere se un canale vive o muore.

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 completamente. Il limite: 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.

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 vs controllo. Se le regioni trattate hanno un revenue +8.2% con p<0.05, l’incremento è reale e misurabile. Il limite: costosi da eseguire, richiedono settimane, e non dicono nulla sul percorso — 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.

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 — 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.

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% nell’attribuzione vale 40 milioni. Il loro approccio: 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^N combinazioni per N canali), ma Booking.com lo approssima con campionamento Monte Carlo. Il risultato pratico: 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ù.

L’implementazione semplificata in Python del calcolo Shapley:

import itertools
import numpy as np

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: 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.

Il framework “Descrivi + Spiega + Decidi”

La vera maturità analitica non è scegliere un modello, ma orchestrare una catena decisionale:

  1. Descrivi con modelli semplici (last-click, lineare). Servono per il reporting quotidiano e per allineare 20 stakeholder diversi su una baseline condivisa. Non usarli per prendere decisioni.

  2. Spiega 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 il report esplicativo è già un insight — la differenza tra i due è il bias del modello semplice.

  3. Decidi con test di incrementality. Ogni trimestre, esegui almeno un geo-lift o 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.

Laboratorio: dal dato alla decisione

Esercizio 1 — Confronto tra modelli. Ti vengono dati 12.000 journey di conversione con 3-8 touchpoint ciascuno su 5 canali. Implementa last-click, lineare e time-decay (half-life 7 giorni) e confronta la distribuzione del credito. Quale canale cambia di più tra last-click e lineare? Perché?

Dataset: journey_id, user_id, touch_sequence, conversion_value. Ogni touch_sequence è un array JSON di [{channel, timestamp}].

Esercizio 2 — Geo-lift analysis. Simula un geo-lift test: hai 40 regioni, 20 trattate e 20 di controllo. Per ogni regione hai revenue_pre (4 settimane prima del test) e revenue_post (4 settimane durante). Calcola il lift incrementale con un difference-in-differences e l’intervallo di confidenza al 95%.

Esercizio 3 — Shapley semplificato. Partendo 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?


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. & 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.

Laboratorio ed esercizi

Metti in pratica quanto appreso con esercizi a difficoltà crescente. Lavora su un dataset reale — se non hai accesso al tuo data warehouse aziendale, usa dataset pubblici come Google Analytics Sample su BigQuery o il dataset E-Commerce di Kaggle.

Esercizio 1 — Implementazione base. Riproduci la query o il modello descritto nella lezione, adattandolo al tuo dataset. Verifica che i risultati siano coerenti con le metriche attese: se il totale non quadra con una query di controllo, c’è un problema di grain.

Esercizio 2 — Estensione. Aggiungi una dimensione di analisi non coperta nella lezione: segmenta per paese, per device, per fascia oraria o per coorte. Dove emergono pattern inattesi? Cosa implicano per le decisioni operative?

Esercizio 3 — Automazione. Trasforma la query in una vista o in un modello dbt con test di integrità (unique, not_null) e documenta le colonne. Se il tuo stack lo permette, configura un alert che notifichi quando la metrica esce da 2 deviazioni standard dalla media mobile.

Problema reale

Nel dominio di marketing data science, Attribution modeling moderno serve a risolvere questo problema: usare modelli e segmentazioni per decidere dove intervenire, non per produrre complessità fine a se stessa. La lezione non va trattata come teoria isolata, ma come un modo per migliorare una scelta concreta con dati, assunzioni esplicite e controlli minimi.

Obiettivo operativo: Distinguere attribuzione da incrementality con esempi operativi; Implementare modelli di attribuzione in Python e SQL. Se alla fine non sai indicare quale decisione cambia, quale dato osservi e quale errore vuoi evitare, la lezione non è ancora diventata competenza applicata.

Modello concettuale

FaseCosa chiarireOutput
DomandaQuale scelta reale deve migliorare?Decisione da prendere
MisuraQuale segnale osservabile rappresenta il problema?Metrica o dato sorgente
ControlloQuale baseline rende il risultato interpretabile?Confronto credibile
AzioneChe cosa cambia dopo l’analisi?Prossimo passo operativo

Il modello concettuale è intenzionalmente semplice: decisione, dato, controllo, azione. Ogni approfondimento tecnico deve rafforzare almeno uno di questi quattro punti.

Formalizzazione rigorosa

Per rendere Attribution modeling moderno analizzabile, definisci prima l’unità di lavoro: cliente, campagna, segmento, previsione o feature. Poi collega questa unità a una metrica osservabile: lift, errore, stabilità, valore marginale e costo operativo. Infine dichiara la decisione attesa: modello, esperimento, segmento attivabile o raccomandazione.

ElementoSpecifica richiesta
Unità di analisicliente, campagna, segmento, previsione o feature
Segnale principalelift, errore, stabilità, valore marginale e costo operativo
BaselinePeriodo precedente, gruppo comparabile, benchmark o scenario controfattuale
Decisionemodello, esperimento, segmento attivabile o raccomandazione
RischioScambiare un numero disponibile per una prova sufficiente

La formalizzazione e solida quando un altro analista può riprodurre la logica, criticare le assunzioni e ottenere la stessa decisione partendo dagli stessi dati.

Esempio o caso studio

Un retailer confronta tre letture della stessa campagna: last-click premia retargeting, un modello data-driven sposta credito su search generica, il holdout mostra che una parte del volume sarebbe arrivata comunque. Il caso è utile perché costringe a distinguere credito descrittivo, causalità e decisione di budget.

Evidenza osservataLettura prudenteAzione consigliata
Il numero miglioraPotrebbe essere effetto reale o variazione normaleCercare confronto e segmento
Un segmento cambia più degli altriLa media aggregata nasconde una differenzaSeparare coorti o casi d’uso
Il costo cresce insieme al risultatoL’impatto va letto sul margineStimare trade-off e sostenibilità

Lab / esercizio

Livello base

Scrivi una scheda di una pagina per Attribution modeling moderno: decisione da supportare, metrica primaria, baseline, rischio principale e azione se il segnale e confermato.

Livello intermedio

Costruisci una tabella con tre segmenti, periodi o scenari. Per ciascuno indica cosa cambia, quale spiegazione alternativa e plausibile e quale controllo useresti prima di raccomandare un azione.

Livello research-grade

Prepara un decision memo: ipotesi, dati richiesti, criteri di esclusione, controlli di qualità, soglia decisionale, rischio residuo e piano di monitoraggio dopo la decisione.

Dataset e materiali consigliati

Usa CRM, campagne, transazioni, feature marketing, testo, embeddings e serie storiche. Se non hai accesso a dati reali, crea un dataset sintetico con almeno 200 righe, una dimensione temporale, una dimensione segmento e una metrica di outcome.

Errore tipico da evitare

L’errore più comune e usare Attribution modeling moderno come etichetta invece che come processo. Succede quando il team mostra un grafico senza decisione, una metrica senza baseline, o una conclusione senza indicare quale assunzione potrebbe invalidarla.

La domanda di controllo è: se questo risultato fosse instabile, quale scelta sbaglierei? Se la risposta non è concreta, manca ancora il collegamento tra analisi e azione.

Quiz o checkpoint

  1. Quale decisione concreta dovrebbe migliorare questa lezione?
  2. Quale unità di analisi rende il problema misurabile?
  3. Quale baseline useresti per evitare una lettura ingenua?
  4. Quale errore tipico potrebbe cambiare la conclusione?
  5. Quale output consegneresti a uno stakeholder non tecnico?

Riepilogo operativo

Attribution modeling moderno diventa utile quando produce una decisione più chiara, non quando aggiunge terminologia. Usa il framework problema, modello, formalizzazione, esempio, lab e checkpoint per trasformare la lezione in pratica verificabile. Categoria: Marketing Analytics. Difficoltà: intermediate. Tempo stimato: 25 min.