Come si comporta il modello RFM applicato a dati reali?

Obiettivo

In questo documento vedremo come applicare il modello RFM a dati reali e verificarne insieme l’esito. Acronimo di Recency Frequency e Monetary, è uno dei più semplici ed efficaci modelli di clustering applicabili ai dati transazionali offline e online, per riconoscere pattern comportamentali di acquisto. L’obiettivo è quello di assegnare a ciascun cliente un voto per ciascuna variabile presa in esame.

Applicheremo tale modello a due dataset:

  • CDNOW ossia le transazioni di clienti sul sito web ecommerce di compact disc e prodotti musicali CDNOW. Maggiori informazioni qui.
  • DonorsChoose.org ossia un’organizzazione no-profit che permette di donare direttamente a progetti di scuole pubbliche. Maggiori informazioni qui.

I dati necesari per l’applicazione del modello sono:

  • ID cliente
  • Data Transazione
  • Totale Scontrino

Datasets Summary Statistics

A. CDNow

Di seguito alcune righe del set di dati a disposizione fornite da CDNow

dove cust indica il customer_iddate la data di transazione e sales il totale scontrino.

Alcune numeriche:

  • Numero di scontrini: 6919
  • Numero di clienti: 2357
  • Numero scontrini / numero clienti: 2.94
  • Data minima di transazione: 1997-01-0
  • Data massima di transazione: 1998-06-30
  • Valore medio di transazione: 35.28 $

Calcoliamo alcuni KPI per cliente in quanto siamo interessati a conoscere le loro abitudini di acquisto:

cd_today = max(cd_orders$date) 

cd_customers_stats <- cd_orders %>% 
  group_by(cust) %>%
  summarize(
    tot_orders = n(),
    first_date = min(date),
    last_date = max(date),
    total_amount = sum(sales),
    avg_amount = mean(sales)
  ) %>% mutate(
    T_since_first = as.numeric( difftime(cd_today, first_date, units = "days" ) ),
    T_since_last  = as.numeric( difftime(cd_today, last_date, units = "days" ) )
  )

dove tot_orders è il numero totale ordini, total_amount totale spesa, avg_amount spesa media, first/last_date prima e ultima data di acquisto, T_since_first/last il numero di giorni dal primo/ultimo acquisto (N.B. l’orizzonte temporale scelto – cd_today – corrisponde alla massima data disponibile tra nel set di dati).

Dalle statistiche di queste variabile possiamo vedere come metà popolazione abbia fatto soltanto un acquisto, la spesa media dei clienti si distribuisce attorno ad una media di circa 32$. Inoltre non ci sono stati nuovi clienti a partire dal 1997-03-25.

B. DonorsChoose.org

Di seguito alcune righe del set di dati a disposizione fornite da DonorsChoose

dove Donor ID indica il donatore, date la data di donazione e Donation Amount il totale donazione.

Di seguito alcune numeriche del dataset:

  • Numero di donazioni: 4687884
  • Numero di donatori: 2024554
  • Numero donazioni / numero donatori: ** 2.32 **
  • Data minima di donazione: 2012-10-08
  • Data massima di donazione: 2018-05-09
  • Valore medio di donazione: 60.67 $

Calcoliamo alcuni KPI per cliente in quanto siamo interessati a conoscere le loro abitudini in merito alle donazioni:

donation_today = max(donations$date)

donation_donors_stats <- donations %>%
                            group_by(`Donor ID`) %>%
                            summarize(
                              tot_donations = n(),
                              first_date = min(date),
                              last_date = max(date),
                              total_amount = sum(`Donation Amount`),
                              avg_amount = mean(`Donation Amount`)
                            ) %>% mutate(
                              T_since_first = as.numeric( difftime(donation_today, first_date, units = "days" ) ),
                              T_since_last  = as.numeric( difftime(donation_today, last_date, units = "days" ) )
                            )

dove tot_donations è il numero totale donazioni, total_amount totale donato, avg_amount donazione media, first/last_date prima e ultima data di donazione, T_since_first/last il numero di giorni dalla prima/ultima donazione (N.B. l’orizzonte temporale scelto – donation_today – corrisponde alla massima data disponibile tra i dati).

Dalle statistiche di queste variabile possiamo vedere come metà popolazione abbia fatto soltanto una donazione, la donazione media dei clienti si distribuisce attorno ad una media di circa 56$. Ci sono nuovi donatori anche alla fine della finestra temporale disponibile.

Analisi di esplorazione dei dati

In questa sezione metteremo a confronto i due dataset per vedere come si comporta l’RFM partendo da dati così estremamente diversi tra loro.

Andamenti Temporali

Clicca l’immagine qui sopra per navigare il grafico in modalità dinamica. 

CDNow

  • picco di transazioni nel primo trimestre del 1997 seguito da un andamento stazionario e infine decrescente

DonorsChoose

  • trend crescente con evidenti cicli stagionali
  • i minimi locali si trovano in prossimità del mese di giugno mentre i massimi in corrispondenza di agosto e dicembre
  • il picco a dicembre 2012 è dovuto alle poche ma generose donazioni iniziali

Distribuzione Clienti/Donatori

Per identificare alcuni pattern comportamentali possiamo esplorare le distribuzioni dei clienti/donatori su alcune variabili.
Alcune tra le variabili più importanti sono la Recenza dell’ultimo acquisto, la Frequenza e la Monetary ovvero la spesa totale.

Clicca l’immagine qui sopra per navigare il grafico in modalità dinamica. 

Assegnazione dei valori

A partire dalle distribuzioni dei clienti in Recenza, Frequenza e Monetary dobbiamo assegnare dei voti a ciascun cliente in base al comportamento su ciascuna variabile.

Per il calcolo dei voti procederemo utilizzando i quantili e supponiamo che la scala scelta dei voti sia da 1 a 5.

Di seguito la visualizzazione delle distribuzioni in Recency, Frequency e Monetary con i rispettivi quantili per entrambi i set di dati a disposizione:

Clicca l’immagine qui sopra per navigare il grafico in modalità dinamica. 

Dalla tabella precedente notiamo:

  • CDNow, nel caso della frequenza abbiamo primo e secondo quintile uguali
  • DonorsChoose, la frequenza ha primo, secondo e terzo quintile uguali

In questo caso non abbiamo a disposizione 4 valori distinti di quintili, ma abbiamo alcuni quintili coincidenti. Per procedere con l’assegnamento dei voti possiamo agire nel seguente modo:

  • cambiare la scala dei voti (es. voti nell’intervallo 1-3: dalla tabella precedente sappiamo che ci sono almeno 2 valori distinti di terzili disponibili per tutte le variabili)
  • non assegnare alcuni voti (es. nel caso della frequenza di CDNow potremmo scegliere di non assegnare il voto 5)

Nel seguito sceglieremo la seconda alternativa proposta. Per la prima opzione basta ricalcolare i quantili corrispondenti.

Per ciascun cliente, dobbiamo valutare in quale range si trova la sua Recenza, Frequenza e Monetary e assegnare il voto corrispondente. Partendo dal dataframe cd_customers_stats:

Basta confrontare il valore di Recenza, Frequenza e Monetary di ciascun cliente con le soglie trovate grazie ai quantili ed assegnare gli score di conseguenza:

# 
# cd_customers_stats$Recency_score <- with(cd_customers_stats, ifelse(T_since_last <= 152, 5, 
#                                                                     ifelse(T_since_last > 152 & T_since_last <= 442, 4,
#                                                                            ifelse(T_since_last > 442 & T_since_last <= 486, 3,
#                                                                                   ifelse(T_since_last > 486 & T_since_last <= 512, 2, 1)))))

cd_recency_threshold <- unique(cd_qnt_recency)
cd_customers_stats$Recency_score <- cut(cd_customers_stats$T_since_last, breaks = c(-Inf, unique(cd_recency_threshold), Inf), ordered_result = T)
cd_customers_stats$Recency_score <- as.integer(
  factor(
    cd_customers_stats$Recency_score_prova, levels = rev(levels(cd_customers_stats$Recency_score_prova))))
  
cd_frequency_threshold <- unique(cd_qnt_frequency)
cd_customers_stats$Frequency_score <- as.integer(cut(cd_customers_stats$tot_orders, breaks = c(-Inf, unique(cd_frequency_threshold), Inf),ordered_result = T) )

cd_monetary_threshold <- unique(cd_qnt_monetary)
cd_customers_stats$Monetary_score <- as.integer(cut(cd_customers_stats$total_amount, breaks = c(-Inf, unique(cd_monetary_threshold), Inf), ordered_result = T))

Allo stesso modo si calcolano gli score per Frequenza e Monetary.

Evoluzione temporale dei quantili

L’utilizzo dei quantili permette alle soglie scelte per ciascuna variabile di Recenza, Frequenza e Monetary, di adattarsi alla naturale evoluzione dei dati. Questo garantisce di avere delle definizioni dei cluster consistenti con i dati a disposizione.

Di seguito mostriamo il primo e quarto quintile per ciascuna variabile di Recenza, Frequenza e Monetary al variare del tempo.

Clicca l’immagine qui sopra per navigare il grafico in modalità dinamica. 

RFM cube

Calcolare gli score di Recenza, Frequenza e Monetary equivale ad aver mappato le tre variabili in un cubo di dimensioni pari alla scala di voti scelta.
Vediamo i due cubi RFM:

Clicca le immagini qui sopra per navigare i grafici in modalità dinamica. 

Clienti Top e a rischio abbandono

Ora che abbiamo visto insieme i risultati che possono emergere applicando il modello RFM a due dataset distinti e differenti fra loro, proviamo a capire quanto sia efficace il modello. In particolare quanto l’assunzione di selezionare i Top Customers o i clienti a rischio abbandono sia valida.

Selezioniamo ad esempio i Top Customers e assumiamo implicitamente che essi rimarranno tali anche in futuro. Come possiamo testare questa assunzione? Fissiamo un orizzonte temporale passato (calibrazione) per determinare il comportamento dei clienti assegnando loro gli score e un periodo futuro (test) nel quale andare a verificare se i Top Customers sono rimasti tali.

Nel caso CDNow possiamo selezionare i seguenti score per identificare i due pattern comportamentali di acquisto più importanti:

  • Top Customers: R = 4-5,F = 3-4, M = 4-5
  • Top Churned Customers: R = 1-2, F = 3-4, M = 4-5

I Churned Customers selezionatI sono i clienti che avevano speso nella fascia alta e frequentemente ma non lo fanno da tanto tempo (R = 1-2).

Nel caso DonorsChoose:

  • Top Customers: R = 4-5,F = 3, M = 4-5
  • Top Churned Customers: R = 1-2, F = 3, M = 4-5

Di seguito le numeriche ottenute:

Possiamo usare RFM come semplice modello di previsione?

In questa sezione vogliamo testare quanto efficace sia il modello RFM, in particolare vogliamo capire quanto l’assunzione di selezionare i top customers o i clienti a rischio abbandono sia valida.
Selezionando ad esempio i top customers, stiamo implicitamente assumendo che essi rimarranno tali anche in futuro.
Possiamo testare questa assunzione fissando un’orizzonte temporale passata che definisce un periodo passato nel quale determinare il comportamento dei clienti assegnando gli score ed un periodo “futuro” nel quale andare a verificare se i top customers sono rimasti tali.

I due dataset analizzati hanno un range temporale diverso e per tanto sceglieremo:

CDNow:

  • calibrazione: 1 anno
  • test: 6 mesi

 

DonorsChoose:

  • calibrazione: 4 anni
  • test: 2 anni

Di seguito gli andamenti temporali e il totale di spesa e donazione per mese, con riferimento all’orizzonte temporale scelto nei due casi. NOTA: i clienti e i donatori acquisti successivamente al riferimento temporale stabilito non sono presi in considerazione.

Clicca l’immagine qui sopra per navigare il grafico in modalità dinamica. 

Per misurare l’accuratezza delle assunzioni del RFM:

  • abbiamo ricalcolato gli score nel periodo di calibrazione
  • considerato soltanto i Top Customers e i Top Churned Customers definiti con le stesse regole espresse precedentemente
  • verificato per entrambe i comportamenti nel periodo futuro.

Nelle tabelle seguenti mostriamo i risultati dell’elaborazione.

Cosa emerge?

Consideriamo il caso CDNow:

  • il 65% dei Top Customers del periodo di calibrazione, hanno continuato ad acquistare anche nel periodo futuro
  • il 35% dei Top Customers del periodo di calibrazione, non hanno continuato ad acquistare anche nel periodo futuro
  • il 100% dei Top Churned Customers del periodo di calibrazione, erano effettivamente clienti che hanno abbandonato

Consideriamo il caso DonorsChoose:

  • il 57.6% dei Top Donors del periodo di calibrazione, hanno continuato a donare anche nel periodo futuro
  • il 42.4% dei Top Donors del periodo di calibrazione, non hanno continuato a donare anche nel periodo futuro
  • il 83.2% dei Top Churned Donors del periodo di calibrazione, erano effettivamente dontori che hanno abbandonato
  • il 16.8% dei Top Churned Donors del periodo di calibrazione, sono ritornati a donare nuovamente.

Abbiamo quindi testato le assunzioni implicite del modello RFM.

Cosa possiamo notare inoltre?

Per entrambi i dataset l’accuratezza risulta maggiore nel predire i Top Churned: la variabile Recenza risulta molto importante per entrambi i settori esplorati (Music, Donation). Inoltre i Top Spender di oggi non lo saranno anche in futuro. Circa il 40% dei Top Customers nel periodo di calibrazione, non ha fatto altri acquisti nel periodo futuro il che dimostra una limitazione se utilizzato come modello predittivo. Ricordiamo che in generale il 20% dei clienti Top Spender genera circa l’ 80% del fatturato, quindi assumere che i Top Customers rimarranno tali senza effettuare nessun tipo di strategia potrebbe risultare dannoso. Quanto detto convalida quindi l’obiettivo con cui nasce il modello RFM ossia clustering sui dati attuali. Quello che determina è una fotografia della base clienti oggi e dei cluster che vanno dai Top Customers ai Churned Customers.

Conclusioni

Abbiamo applicato il modello RFM (Recency, Frequency e Monetary) a due dataset, rispettivamente CDNow (settore musicale) e DonorsChoose.org (settore Donazioni). Il modello applicato permette di dare un voto al comportamento di acquisto/donazione dei clienti/donatori e pertanto di clusterizzare la base clienti. In particolare abbiamo mostrato una possibile definizione di Top Customers (ovvero clienti che spendono tanto, di recente e frequentemente) e Top Churned Customers (clienti che avevano un alto valore ma che probabilmente hanno abbandonato).

Grazie all’identificazione dei pattern comportamentali di acquisto è possibile applicare delle strategie di comunicazione ed engagement personalizzate per ciascun cluster. Ad esempio strategie di retention per i clienti a rischio abbandono, fidelizzazione per i clienti Top Spender, up-selling per i clienti che hanno una spesa medio-bassa e non mostrano ancora alta fidelizzazione (Es. Recenza = 3, Frequenza = 1-2, Monetary = 2-3), e così via.

Curioso di applicare il modello RFM al tuo business? In questo approfondimento potrai trovare qualche suggerimento.