Esempi di Business Analytics/Marketing clienti

Caricamento librerie

modifica
library(dplyr)
library(ggplot2)
library(factoextra)

Parte 1: Dati

modifica

Si tratta di un dataset transnazionale scaricabile da qui : https://archive.ics.uci.edu/ml/datasets/online+retail che contiene tutte le transazioni avvenute tra il 01/12/2010 e il 09/12/2011 per una vendita al dettaglio online non registrata, con sede nel Regno Unito. L'azienda vende principalmente regali unici per tutte le occasioni. Molti clienti dell'azienda sono grossisti.

Informazioni sulle variabili:

  • InvoiceNo: numero della fattura. Nominale, un numero integrale di 6 cifre assegnato in modo univoco a ciascuna transazione. Se questo codice inizia con la lettera 'c', indica una cancellazione.
  • StockCode: Codice prodotto (articolo). Nominale, un numero integrale di 5 cifre assegnato in modo univoco a ciascun prodotto distinto.
  • Description: nome del prodotto (articolo). Nominale.
  • Quantity: le quantità di ciascun prodotto (articolo) per transazione. Numerico.
  • InvoiceDate: Data e ora della fattura. Numerico, il giorno e l'ora in cui è stata generata ciascuna transazione.
  • UnitPrice: prezzo unitario. Numerico, prezzo del prodotto per unità in sterline.
  • CustomerID: numero cliente. Nominale, un numero integrale di 5 cifre assegnato in modo univoco a ciascun cliente.
  • Country: nome del paese. Nominale, il nome del paese in cui risiede ciascun cliente.


Caricamento dati:

data <- read.csv("data.csv")

Parte 2: Domanda di ricerca Si vogliono creare gruppi o clusters di clienti che possano essere considerati simili in modo da praticare un marketing adeguato alle loro caratteristiche.

Parte 3 : Esplorazione dei dati

Ci sono 135.080 clienti non identificati nel dataset attraverso l'ID. Presumo che siano stati venduti prodotti senza identificare il cliente quindi non li elimino dal dataset.

colSums(is.na(data))

Creo la variabile amount pari al prodotto della quantità per il prezzo relativamente ad ogni articolo, elimino dal dataset i valori negativi di questa variabile, estraggo le variabili relative ai clienti e creo la variabile day_to_max che contiene il numero di giorni tra la data di acquisto e la massima data contenuta nel dataset:


df <- data[,c("CustomerID","Quantity","UnitPrice","InvoiceDate")]
df$amount <- df$Quantity*df$UnitPrice
df <- df[which(df$amount>0),]

df$InvoiceDate <- as.Date(df$InvoiceDate,"%m/%d/%Y")
df$days_to_max<- as.numeric(difftime(time1 = "2011-12-10",
                                            time2 = df$InvoiceDate,
                                            units = "days"))

Si crea il dataset dei clienti con 3 variabili: recency.frequency e mean_amount. La recency indica da quanti giorni un cliente ha fatto il suo ultimo acquisto. Di solito più piccola è la recency,cioè quanto più recente è l'ultimo acquisto, tanto più probabile avverrà a breve il prossimo acquisto . D'altra parte, se un cliente non ha effettuato alcun acquisto per un lungo periodo di tempo, potrebbe aver perso interesse o essere passato alla concorrenza, che è una cattiva notizia per l'azienda. La frequenza, si riferisce al numero degli acquisti effettuati in passato. Più acquisti sono stati fatti in passato, più è probabile che avverranno acquisti in futuro. Infine, mean_amount si riferisce a l'importo medio speso per gli acquisti dal cliente. Ovviamente più un cliente spende in media, più è prezioso:


clienti<-df %>%
  group_by(CustomerID) %>%
  summarise(recency=min(days_to_max),frequency=n(),mean_amount=mean(amount))


Part3 3: Creazione clusters

Osservando la distribuzione dell'importo medio mean_amount, tracciando l'istogramma si nota che tale distribuzione è asimmetrica infatti la maggiorparte dei clienti spende per importi bassi e solo pochi clienti spendono per importi alti quindi conviene usare la funzione logaritmo per rendere più simmetrica la distribuzione...Inoltre per confrontare le variabili recency,frequency e mean_amount che si misurano diversamente conviene standardizzarle tramite la funzione scale in modo che possano assumere valori confrontabili:

df_clust <- clienti
df_clust$mean_amount <- log(df_clust$mean_amount)

df_clust <- scale(df_clust[,-1])

Applico i metodi Elbow e Silhoutte per calcolare il numero ottimale di clusters in cui suddividere il dataset e ottengo 4 nel primo e 3 nel secondo:

fviz_nbclust(df_clust, kmeans, method = "wss") +
  geom_vline(xintercept = 4, linetype = 2) + 
  labs(subtitle = "Elbow method")
 
# Silhouette method
fviz_nbclust(df_clust, kmeans, method = "silhouette") +
  labs(subtitle = "Silhouette method")
 

Si applica l'algoritmo k-means suddividendo il dataset in 4 clusters:

cl <- kmeans(df_clust,4)

clienti$groups = cl$cluster

Calcolo la media delle variabili di segmentazione per ognuno dei 4 cluster:

clienti %>%
  group_by(groups) %>%
  summarise_all(mean) %>%
  select(1,3,4,5)
 groups recency frequency mean_amount
   1      257.     27.8      20.4 
   2      43.7     88.6      21.8 
   3      88.1     53.5      603.  
   4      43.8     350.      6.54
  • Il cluster 1 ha una recency molto elevata (256 giorni) e bassi importi quindi si tratta di clienti che non fanno acquisti da molto tempo e che potrebbero essere passati alla concorrenza.
  • Il cluster 2 non si caratterizza per particolari fattori, eccetto che per una discreta frequenza di acquisto.
  • Il cluster 3 spende in media importi molto elevati anche a distanza di non pochi giorni.
  • Il cluster 4 fa molti acquisti di basso importo a distanza di 43 giorni in media dalla data più recente.