Vai al contenuto principale

Market Basket Analysis con R

Scopri la Market Basket Analysis e l’algoritmo APRIORI che la supporta. Vedrai come sta aiutando i retailer a far crescere il business prevedendo quali articoli i clienti acquistano insieme.
· 15 min leggi

Scopri con l'IA

Sei un data scientist (o stai per diventarlo!) e ricevi un incarico da un cliente che gestisce un negozio al dettaglio. Il cliente ti fornisce i dati di tutte le transazioni, ovvero gli articoli acquistati in negozio da vari clienti in un certo periodo, e ti chiede di usare quei dati per aiutarlo a far crescere il business. Il cliente userà i tuoi risultati non solo per cambiare/aggiornare/aggiungere articoli a magazzino, ma anche per modificare il layout del negozio fisico o dell’e-commerce. Per ottenere risultati utili al tuo cliente, userai la Market Basket Analysis (MBA), che applica il Mining delle Regole di Associazione ai dati di transazione.

In questo tutorial imparerai:

  • Che cos’è il Mining delle Regole di Associazione e le sue applicazioni
  • Che cos’è l’algoritmo APRIORI
  • Come implementare MBA/Mining delle Regole di Associazione in R con visualizzazioni

Mining delle Regole di Associazione

Il Mining delle Regole di Associazione si usa quando vuoi trovare un’associazione tra oggetti diversi in un insieme, individuare pattern frequenti in un database di transazioni, in database relazionali o in qualsiasi altro repository informativo. Le applicazioni del Mining delle Regole di Associazione si trovano nel Marketing, nella Basket Data Analysis (o Market Basket Analysis) nel retail, nel clustering e nella classificazione. Può dirti quali articoli i clienti acquistano spesso insieme generando un insieme di regole chiamate Regole di Associazione. In parole semplici, restituisce regole del tipo se questo allora quello. I clienti possono usare queste regole per numerose strategie di marketing:

  • Modificare il layout del negozio in base ai trend
  • Analisi del comportamento dei clienti
  • Progettazione del catalogo
  • Cross marketing sugli store online
  • Quali articoli sono di tendenza negli acquisti dei clienti
  • Email personalizzate con vendite aggiuntive

Considera il seguente esempio:

example

È dato un insieme di dati di transazione. Vedi transazioni numerate da 1 a 5. Ogni transazione mostra gli articoli acquistati in quella transazione. Puoi vedere che il pannolino è acquistato con la birra in tre transazioni. Allo stesso modo, il pane è acquistato con il latte in tre transazioni, rendendoli entrambi insiemi di articoli frequenti. Le regole di associazione sono fornite nella forma seguente:

$A=>B[Support,Confidence]$

La parte prima di $=>$ è detta if (Antecedente) e la parte dopo $=>$ è detta then (Consequente).

Dove A e B sono insiemi di articoli nei dati di transazione. A e B sono insiemi disgiunti.

$Computer=>Anti-virus Software[Support=20\%,confidence=60\%]$

La regola sopra dice:

  1. Nel 20% delle transazioni il software antivirus è acquistato insieme a un computer
  2. Il 60% dei clienti che acquistano software antivirus lo acquistano insieme a un computer

Nella sezione seguente imparerai i concetti di base del Mining delle Regole di Associazione:

Concetti di base del Mining delle Regole di Associazione

Basic Concepts of Association Rule Mining
  1. Itemset: Collezione di uno o più articoli. K-item-set significa un insieme di k articoli.

  2. Support Count: Frequenza di occorrenza di un itemset

  3. Support (s): Frazione di transazioni che contengono l’itemset "X"

    $Support(X)=\frac{frequency(X)}{N}$

Per una regola A=>B, il Support è dato da:

$Support(A=>B)=\frac{frequency(A,B)}{N}$

Nota: P(AUB) è la probabilità che A e B si verifichino insieme. P indica la probabilità.

Avanti, prova a calcolare il support per Latte=>Pannolino come esercizio.

  1. Confidence (c): Per una regola A=>B la Confidence indica la percentuale in cui B è acquistato con A.

$Confidence(A=>B)=\frac{P(A\cap B)}{P(A)}=\frac{frequency(A,B)}{frequency(A)}$

Il numero di transazioni che contengono sia A che B diviso per il numero totale di transazioni che contengono A.

$Confidence(Bread=>Milk)=\frac{3}{4}=0.75=75\%$

Ora trova la confidence per Latte=>Pannolino.

Nota: Support e Confidence misurano quanto una regola sia interessante. Sono fissati da soglie di support minimo e confidence minima. Queste soglie impostate dal cliente aiutano a confrontare la forza delle regole secondo le tue o le sue esigenze. Più vicina è alla soglia, più la regola è utile per il cliente.

  1. Frequent Itemsets: Itemset il cui support è maggiore o uguale alla soglia di support minimo (min_sup). Nell’esempio sopra min_sup=3. È una scelta dell’utente.

  2. Regole forti: Se una regola A=>B[Support, Confidence] soddisfa min_sup e min_confidence allora è una regola forte.

  3. Lift: Il Lift dà la correlazione tra A e B nella regola A=>B. La correlazione mostra come un itemset A influisce sull’itemset B.

$Lift(A=>B)=\frac{Support}{Supp(A)Supp(B)}$

Ad esempio, per la regola {Bread}=>{Milk}, il lift è calcolato come:

$support(Bread)=\frac{4}{5}=0.8$

$support(Milk)=\frac{4}{5}=0.8$

$Lift(Bread=>Milk)=\frac{0.6}{0.8*0.8}=0.9$

  • Se la regola avesse un lift pari a 1, allora A e B sono indipendenti e non si può derivare alcuna regola.

  • Se il lift è > 1, allora A e B sono dipendenti tra loro, e il grado è dato dal valore di lift.

  • Se il lift è < 1, allora la presenza di A ha un effetto negativo su B.

Obiettivo del Mining delle Regole di Associazione

Quando applichi il Mining delle Regole di Associazione a un insieme di transazioni T il tuo obiettivo è trovare tutte le regole con:

  1. Support maggiore o uguale a min_support
  2. Confidence maggiore o uguale a min_confidence

Algoritmo APRIORI

In questa parte del tutorial imparerai l’algoritmo che sta dietro alle librerie R per la Market Basket Analysis. Questo ti aiuterà a comprendere meglio i tuoi clienti e a eseguire l’analisi con più attenzione. Se conosci già l’algoritmo APRIORI e come funziona, passa direttamente alla parte di codice.

Il Mining delle Regole di Associazione è visto come un approccio in due fasi:

  1. Generazione degli itemset frequenti: Trova tutti gli itemset frequenti con supporto >= al min_support prefissato

  2. Generazione delle regole: Elenca tutte le Regole di Associazione dagli itemset frequenti. Calcola Support e Confidence per tutte le regole. Elimina le regole che non soddisfano le soglie di min_support e min_confidence.

La generazione degli itemset frequenti è il passaggio computazionalmente più costoso perché richiede una scansione completa del database.

Tra i passaggi sopra, la generazione degli itemset frequenti è la più onerosa in termini di calcolo.

Sopra hai visto un esempio con sole 5 transazioni, ma nel mondo reale i dati di transazione nel retail possono arrivare a GB e TB, per cui serve un algoritmo ottimizzato che elimini gli itemset che non saranno utili nei passi successivi. A questo serve l’algoritmo APRIORI. Esso afferma:

Ogni sottoinsieme di un itemset frequente deve essere anch’esso frequente. In altre parole, non va generato o testato alcun sovrainsieme di un itemset non frequente

È rappresentato nel Reticolo degli itemset (Itemset Lattice), una rappresentazione grafica del principio dell’algoritmo APRIORI. È composto da nodi di k-itemset e dalle relazioni di sottoinsiemi di quel k-itemset.

itemset lattice

Come vedi nella figura sopra, in basso ci sono tutti gli articoli nei dati di transazione e poi si sale creando sottoinsiemi fino all’insieme vuoto. Per un numero d di articoli la dimensione del reticolo diventa $2^d$. Questo mostra quanto sia difficile generare gli itemset frequenti calcolando il supporto per ogni combinazione. La figura seguente mostra quanto APRIORI aiuti a ridurre il numero di insiemi da generare:

itemset lattice 2

Se l’itemset {a,b} non è frequente, allora non serve considerare tutti i suoi sovrainsiemi.

Capciamolo con un esempio. Nel seguente esempio vedrai perché APRIORI è un algoritmo efficace e genererai anche regole di associazione forti passo dopo passo. Segui con quaderno e penna!

example

Come puoi vedere, inizi creando la Lista dei candidati per l’1-itemset, che includerà tutti gli articoli presenti nei dati di transazione, presi singolarmente. Considerando dati retail reali, puoi immaginare quanto sia costosa questa generazione di candidati. Qui APRIORI entra in gioco e aiuta a ridurre il numero della lista dei candidati, e alla fine vengono generate regole utili. Nei passaggi seguenti vedrai come arriviamo alla fine della generazione degli itemset frequenti, che è il primo passo del mining delle regole di associazione.

example

Il passo successivo è elencare tutti gli itemset frequenti. Prenderai l’ultimo itemset frequente non vuoto, che in questo esempio è L2={I1, I2},{I2, I3}. Quindi crea tutti i sottoinsiemi non vuoti degli itemset presenti in quella lista di itemset frequenti. Segui come mostrato nell’illustrazione qui sotto:

example

Come vedi sopra, ci sono quattro regole forti. Ad esempio, prendi ${I2}=>I3$ con confidence pari al 75%: indica che il 75% delle persone che hanno acquistato I2 hanno acquistato anche I3.

Ora hai imparato l’algoritmo APRIORI completo, uno dei più usati nel data mining. Passiamo al codice, phewww!

Implementare MBA/Mining delle Regole di Associazione in R

In questo tutorial userai un dataset dal UCI Machine Learning Repository. Il dataset si chiama Online-Retail e puoi scaricarlo da qui. Il dataset contiene dati di transazione dal 01/12/2010 al 09/12/2011 per un retailer online registrato con sede nel Regno Unito senza negozio fisico. Il motivo per usare questo e non un dataset R è che è più probabile ricevere dati retail in questa forma, sui quali dovrai applicare il pre-processing.

Descrizione del dataset

  • Numero di righe:541909
  • Numero di attributi:08
Informazioni sugli attributi
  • InvoiceNo: Numero di fattura. Nominale, un numero intero a 6 cifre assegnato univocamente a ogni transazione. Se questo codice inizia con la lettera 'c', indica una cancellazione. +StockCode: Codice prodotto (articolo). Nominale, un numero intero a 5 cifre assegnato univocamente 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. Esempio dal dataset: 12/1/2010 8:26
  • UnitPrice: Prezzo unitario. Numerico, prezzo per unità in sterline.
  • CustomerID: Numero cliente. Nominale, un numero intero a 5 cifre assegnato univocamente a ciascun cliente.
  • Country: Nome del paese. Nominale, il nome del paese di residenza di ciascun cliente.

Caricamento delle librerie

Per prima cosa caricherai le librerie necessarie. Una breve descrizione delle librerie (presa da qui) è data nella tabella seguente, così sai cosa fa ciascuna libreria:

PackageDescription
arulesFornisce l’infrastruttura per rappresentare, manipolare e analizzare dati di transazione e pattern (itemset frequenti e regole di associazione).
arulesVizEstende il pacchetto 'arules' con varie tecniche di visualizzazione per regole di associazione e itemset. Il pacchetto include anche diverse visualizzazioni interattive per l’esplorazione delle regole.
tidyverseIl tidyverse è una collezione di pacchetti R orientata al data science
readxlLegge file Excel in R
plyrStrumenti per suddividere, applicare e combinare dati
ggplot2Creare grafici e chart
knitrGenerazione dinamica di report in R
lubridateLubridate è un pacchetto R che rende più semplice lavorare con date e orari.
#install and load package arules
#install.packages("arules")
library(arules)
#install and load arulesViz
#install.packages("arulesViz")
library(arulesViz)
#install and load tidyverse
#install.packages("tidyverse")
library(tidyverse)
#install and load readxml
#install.packages("readxml")
library(readxl)
#install and load knitr
#install.packages("knitr")
library(knitr)
#load ggplot2 as it comes in tidyverse
library(ggplot2)
#install and load lubridate
#install.packages("lubridate")
library(lubridate)
#install and load plyr
#install.packages("plyr")
library(plyr)
library(dplyr)

Pre-processing dei dati

Usa read_excel(path to file) per leggere in R il dataset dal file scaricato. Fornisci il percorso completo del file, incluso il nome del file, in read_excel(path-to-file-with-filename)

#read excel into R dataframe
retail <- read_excel('D:/Documents/Online_Retail.xlsx')
#complete.cases(data) will return a logical vector indicating which rows have no missing values. Then use the vector to get only rows that are complete using retail[,].
retail <- retail[complete.cases(retail), ]
#mutate function is from dplyr package. It is used to edit or add new columns to dataframe. Here Description column is being converted to factor column. as.factor converts column to factor column. %>% is an operator with which you may pipe values to another function or expression
retail %>% mutate(Description = as.factor(Description))
retail %>% mutate(Country = as.factor(Country))
#Converts character data to date. Store InvoiceDate as date in new variable
retail$Date <- as.Date(retail$InvoiceDate)
#Extract time from InvoiceDate and store in another variable
TransTime<- format(retail$InvoiceDate,"%H:%M:%S")
#Convert and edit InvoiceNo into numeric
InvoiceNo <- as.numeric(as.character(retail$InvoiceNo))
NAs introduced by coercion
#Bind new columns TransTime and InvoiceNo into dataframe retail
cbind(retail,TransTime)
cbind(retail,InvoiceNo)
#get a glimpse of your data
glimpse(retail)

Nota: Pagina 1 di 100.
Observations: 406,829
Variables: 9
$ InvoiceNo   <chr> "536365", "536365", "536365", "536365", "536365", "536365", "53...
$ StockCode   <chr> "85123A", "71053", "84406B", "84029G", "84029E", "22752", "2173...
$ Description <chr> "WHITE HANGING HEART T-LIGHT HOLDER", "WHITE METAL LANTERN", "C...
$ Quantity    <dbl> 6, 6, 8, 6, 6, 2, 6, 6, 6, 32, 6, 6, 8, 6, 6, 3, 2, 3, 3, 4, 4,...
$ InvoiceDate <dttm> 2010-12-01 08:26:00, 2010-12-01 08:26:00, 2010-12-01 08:26:00,...
$ UnitPrice   <dbl> 2.55, 3.39, 2.75, 3.39, 3.39, 7.65, 4.25, 1.85, 1.85, 1.69, 2.1...
$ CustomerID  <dbl> 17850, 17850, 17850, 17850, 17850, 17850, 17850, 17850, 17850, ...
$ Country     <chr> "United Kingdom", "United Kingdom", "United Kingdom", "United K...
$ Date        <date> 2010-12-01, 2010-12-01, 2010-12-01, 2010-12-01, 2010-12-01, 20...

Ora il dataframe retail conterrà 10 attributi, con due attributi aggiuntivi Date e Time.

Prima di applicare MBA/Mining delle Regole di Associazione, dobbiamo convertire il dataframe in dati di transazione in modo che tutti gli articoli acquistati insieme in una fattura stiano su un’unica riga. Nel risultato di glimpse vedi che ogni transazione è in forma atomica, cioè tutti i prodotti appartenenti a una fattura sono atomici come nei database relazionali. Questo formato è chiamato anche formato singles.

Quello che devi fare è raggruppare i dati nel dataframe retail per CustomerID, CustomerID e Date oppure puoi anche raggruppare usando InvoiceNo e Date. Ci serve questo raggruppamento, applicare una funzione e salvare l’output in un altro dataframe. Questo si può fare con ddply.

Le righe di codice seguenti combineranno tutti i prodotti di uno stesso InvoiceNo e date e li uniranno in un’unica riga, con ciascun articolo separato da ,

library(plyr)
#ddply(dataframe, variables_to_be_used_to_split_data_frame, function_to_be_applied)
transactionData <- ddply(retail,c("InvoiceNo","Date"),
                       function(df1)paste(df1$Description,
                       collapse = ","))
#The R function paste() concatenates vectors to character and separated results using collapse=[any optional charcater string ]. Here ',' is used
transactionData

Nota: Pagina 1 di 100.

Poi, dato che InvoiceNo e Date non saranno utili nel rule mining, puoi impostarli a NULL.

#set column InvoiceNo of dataframe transactionData  
transactionData$InvoiceNo <- NULL
#set column Date of dataframe transactionData
transactionData$Date <- NULL
#Rename column to items
colnames(transactionData) <- c("items")
#Show Dataframe transactionData
transactionData

Nota: Pagina 1 di 100.

Questo formato per i dati di transazione è chiamato formato basket. Ora devi salvare questi dati di transazione in un file .csv (Comma Separated Values). Per farlo, write.csv()

write.csv(transactionData,"D:/Documents/market_basket_transactions.csv", quote = FALSE, row.names = FALSE)
#transactionData: Data to be written
#"D:/Documents/market_basket.csv": location of file with file name to be written to
#quote: If TRUE it will surround character or factor column with double quotes. If FALSE nothing will be quoted
#row.names: either a logical value indicating whether the row names of x are to be written along with x, or a character vector of row names to be written.

Controlla se i tuoi dati di transazione hanno la forma corretta:

transaction data

Successivamente, devi caricare questi dati di transazione in un oggetto della classe transaction. Questo si fa usando la funzione R read.transactions del pacchetto arules.

La riga di codice seguente prenderà il file dei dati di transazione D:/Documents/market_basket_transactions.csv in formato basket e lo convertirà in un oggetto della classe transaction.

tr <- read.transactions('D:/Documents/market_basket_transactions.csv', format = 'basket', sep=',')
#sep tell how items are separated. In this case you have separated using ','

Quando esegui le righe di codice sopra potresti ottenere molti EOF within quoted string in output, non preoccuparti.

Se hai già i dati di transazione in un dataframe, usa la riga di codice seguente per convertirli in un oggetto transaction:

          `trObj<-as(dataframe.dat,"transactions")`

Visualizza l’oggetto di transazione tr:

tr
transactions in sparse format with
 22191 transactions (rows) and
 30066 items (columns)
 summary(tr)
 
transactions in sparse format with
 22191 transactions (rows) and
 7876 items (columns)
transactions as itemMatrix in sparse format with
 22191 rows (elements/itemsets/transactions) and
 7876 columns (items) and a density of 0.001930725

most frequent items:
WHITE HANGING HEART T-LIGHT HOLDER           REGENCY CAKESTAND 3 TIER
                              1803                               1709
           JUMBO BAG RED RETROSPOT                      PARTY BUNTING
                              1460                               1285
     ASSORTED COLOUR BIRD ORNAMENT                            (Other)
                              1250                             329938

element (itemset/transaction) length distribution:
sizes
   1    2    3    4    5    6    7    8    9   10   11   12   13   14   15   16   17
3598 1594 1141  908  861  758  696  676  663  593  624  537  516  531  551  522  464
  18   19   20   21   22   23   24   25   26   27   28   29   30   31   32   33   34
 441  483  419  395  315  306  272  238  253  229  213  222  215  170  159  138  142
  35   36   37   38   39   40   41   42   43   44   45   46   47   48   49   50   51
 134  109  111   90  113   94   93   87   88   65   63   67   63   60   59   49   64
  52   53   54   55   56   57   58   59   60   61   62   63   64   65   66   67   68
  40   41   49   43   36   29   39   30   27   28   17   25   25   20   27   24   22
  69   70   71   72   73   74   75   76   77   78   79   80   81   82   83   84   85
  15   20   19   13   16   16   11   15   12    7    9   14   15   12    8    9   11
  86   87   88   89   90   91   92   93   94   95   96   97   98   99  100  101  102
  11   14    8    6    5    6   11    6    4    4    3    6    5    2    4    2    4
 103  104  105  106  107  108  109  110  111  112  113  114  116  117  118  120  121
   4    3    2    2    6    3    4    3    2    1    3    1    3    3    3    1    2
 122  123  125  126  127  131  132  133  134  140  141  142  143  145  146  147  150
   2    1    3    2    2    1    1    2    1    1    2    2    1    1    2    1    1
 154  157  168  171  177  178  180  202  204  228  236  249  250  285  320  400  419
   3    2    2    2    1    1    1    1    1    1    1    1    1    1    1    1    1

   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.
   1.00    3.00   10.00   15.21   21.00  419.00

includes extended item information - examples:
                      labels
1                   1 HANGER
2     10 COLOUR SPACEBOY PEN
3 12 COLOURED PARTY BALLOONS

summary(tr) è un comando molto utile che ci dà informazioni sul nostro oggetto transaction. Vediamo cosa dice l’output sopra:

  • Ci sono 22191 transazioni (righe) e 7876 articoli (colonne). Nota che 7876 è il numero di descrizioni prodotto coinvolte nel dataset e 22191 transazioni sono collezioni di questi articoli.

  • La densità indica la percentuale di celle non nulle in una matrice sparsa. Puoi intenderla come il numero totale di articoli acquistati diviso per il numero possibile di articoli in quella matrice. Puoi calcolare quanti articoli sono stati acquistati usando la densità: 22191x7876x0.001930725=337445

Informazione! Matrice sparsa: una matrice sparsa o array sparso è una matrice in cui la maggior parte degli elementi è zero. Al contrario, se la maggior parte degli elementi è diversa da zero, la matrice è considerata densa. Il numero di elementi pari a zero diviso per il numero totale di elementi è chiamato sparsità della matrice (che è uguale a 1 meno la densità della matrice).

  • Summary può anche indicarti gli articoli più frequenti.

  • Distribuzione della lunghezza dell’elemento (itemset/transazione): Indica quante transazioni ci sono per 1-itemset, per 2-itemset e così via. La prima riga indica il numero di articoli e la seconda riga indica il numero di transazioni.

Ad esempio, ci sono solo 3598 transazioni con un articolo, 1594 transazioni con 2 articoli, e ci sono 419 articoli in una transazione, che è la più lunga.

Puoi generare un itemFrequencyPlot per creare un grafico a barre delle frequenze degli articoli e visualizzare la distribuzione degli oggetti basata su itemMatrix (ad es., >transactions o articoli in >itemsets e >rules), che è il nostro caso.

# Create an item frequency plot for the top 20 items
if (!require("RColorBrewer")) {
  # install color package of R
install.packages("RColorBrewer")
#include library RColorBrewer
library(RColorBrewer)
}
itemFrequencyPlot(tr,topN=20,type="absolute",col=brewer.pal(8,'Pastel2'), main="Absolute Item Frequency Plot")
absolute item frequency plot

In 

itemFrequencyPlot(tr,topN=20,type="absolute")

il primo argomento è l’oggetto transaction da plottare, cioè tr. topN ti permette di plottare gli N articoli con frequenza più alta. type può essere type="absolute" o type="relative". Se absolute plottarà le frequenze numeriche di ciascun articolo in modo indipendente. Se relative mostrerà quante volte questi articoli sono comparsi rispetto agli altri.

relative item frequency plot
itemFrequencyPlot(tr,topN=20,type="relative",col=brewer.pal(8,'Pastel2'),main="Relative Item Frequency Plot")

Questo grafico mostra che 'WHITE HANGING HEART T-LIGHT HOLDER' e 'REGENCY CAKESTAND 3 TIER' hanno le vendite maggiori. Quindi, per aumentare la vendita di 'SET OF 3 CAKE TINS PANTRY DESIGN' il retailer può posizionarlo vicino a 'REGENCY CAKESTAND 3 TIER'.

Puoi esplorare altre opzioni per itemFrequencyPlot qui.

Generare le regole!

Il passo successivo è estrarre le regole usando l’algoritmo APRIORI. La funzione apriori() è del pacchetto arules.

# Min Support as 0.001, confidence as 0.8.
association.rules <- apriori(tr, parameter = list(supp=0.001, conf=0.8,maxlen=10))
 Apriori

Parameter specification:
 confidence minval smax arem  aval originalSupport maxtime support minlen maxlen target
        0.8    0.1    1 none FALSE            TRUE       5   0.001      1     10  rules
   ext
 FALSE

Algorithmic control:
 filter tree heap memopt load sort verbose
    0.1 TRUE TRUE  FALSE TRUE    2    TRUE

Absolute minimum support count: 22

set item appearances ...[0 item(s)] done [0.00s].
set transactions ...[30066 item(s), 22191 transaction(s)] done [0.11s].
sorting and recoding items ... [2324 item(s)] done [0.02s].
creating transaction tree ... done [0.02s].
checking subsets of size 1 2 3 4 5 6 7 8 9 10
Mining stopped (maxlen reached). Only patterns up to a length of 10 returned!
 done [0.70s].
writing ... [49122 rule(s)] done [0.06s].
creating S4 object  ... done [0.06s]. 
set of 49122 rules

rule length distribution (lhs + rhs):sizes
    2     3     4     5     6     7     8     9    10
  105  2111  6854 16424 14855  6102  1937   613   121

   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.
  2.000   5.000   5.000   5.499   6.000  10.000

summary of quality measures:
    support           confidence          lift             count       
 Min.   :0.001036   Min.   :0.8000   Min.   :  9.846   Min.   : 23.00  
 1st Qu.:0.001082   1st Qu.:0.8333   1st Qu.: 22.237   1st Qu.: 24.00  
 Median :0.001262   Median :0.8788   Median : 28.760   Median : 28.00  
 Mean   :0.001417   Mean   :0.8849   Mean   : 64.589   Mean   : 31.45  
 3rd Qu.:0.001532   3rd Qu.:0.9259   3rd Qu.: 69.200   3rd Qu.: 34.00  
 Max.   :0.015997   Max.   :1.0000   Max.   :715.839   Max.   :355.00  

mining info:
 data ntransactions support confidence
   tr         22191   0.001        0.8

apriori prenderà tr come oggetto transaction su cui applicare il mining. parameter ti permette di impostare min_sup e min_confidence. I valori di default per parameter sono support minimo 0.1, confidence minima 0.8, massimo 10 articoli (maxlen).

summary(association.rules) mostra quanto segue:

  • Parameter Specification: valori min_sup=0.001 e min_confidence=0.8 con massimo 10 articoli in una regola.

  • Numero totale di regole: L’insieme di 49122 regole

  • Distribuzione della lunghezza delle regole: Una lunghezza di 5 articoli ha il maggior numero di regole: 16424 e la lunghezza di 2 articoli ha il numero più basso: 105

  • Riepilogo delle misure di qualità: Valori min e max per Support, Confidence e Lift.

  • Informazioni usate per creare le regole: I dati, il support e la confidence che abbiamo fornito all’algoritmo.

Dato che ci sono 49122 regole, stampiamo solo le prime 10:

inspect(association.rules[1:10])
     lhs                         rhs             support     confidence lift      count
[1]  {WOBBLY CHICKEN}         => {METAL}         0.001261773 1          443.82000 28   
[2]  {WOBBLY CHICKEN}         => {DECORATION}    0.001261773 1          443.82000 28   
[3]  {DECOUPAGE}              => {GREETING CARD} 0.001036456 1          389.31579 23   
[4]  {BILLBOARD FONTS DESIGN} => {WRAP}          0.001306836 1          715.83871 29   
[5]  {WOBBLY RABBIT}          => {METAL}         0.001532153 1          443.82000 34   
[6]  {WOBBLY RABBIT}          => {DECORATION}    0.001532153 1          443.82000 34   
[7]  {FUNK MONKEY}            => {ART LIGHTS}    0.001712406 1          583.97368 38   
[8]  {ART LIGHTS}             => {FUNK MONKEY}   0.001712406 1          583.97368 38   
[9]  {BLACK TEA}              => {SUGAR JARS}    0.002072912 1          238.61290 46   
[10] {BLACK TEA}              => {COFFEE}        0.002072912 1           69.34687 46 

Usando l’output sopra, puoi fare analisi come:

  • Il 100% dei clienti che hanno acquistato 'WOBBLY CHICKEN' ha acquistato anche 'METAL'.

  • Il 100% dei clienti che hanno acquistato 'BLACK TEA' ha acquistato anche 'SUGAR JARS'.

Limitare numero e dimensione delle regole

Come puoi limitare la dimensione e il numero di regole generate? Puoi farlo impostando i parameters in apriori. Imposti questi parametri per regolare il numero di regole che otterrai. Se vuoi regole più forti, puoi aumentare il valore di conf e per regole più lunghe dai un valore più alto a maxlen.

shorter.association.rules <- apriori(tr, parameter = list(supp=0.001, conf=0.8,maxlen=3))

Rimuovere le regole ridondanti

Puoi rimuovere le regole che sono sottoinsiemi di regole più grandi. Usa il codice seguente per rimuovere tali regole:

subset.rules <- which(colSums(is.subset(association.rules, association.rules)) > 1) # get subset rules in vector
length(subset.rules)  #> 3913
[1] 44014
subset.association.rules. <- association.rules[-subset.rules] # remove subset rules.
  • which() restituisce la posizione degli elementi nel vettore per cui il valore è TRUE.

  • colSums() calcola somme per righe e colonne per data frame e array numerici.

  • is.subset() determina se gli elementi di un vettore contengono tutti gli elementi di un altro

A volte vuoi lavorare su un prodotto specifico. Se vuoi scoprire cosa influisce sull’acquisto dell’articolo X puoi usare l’opzione appearance nel comando apriori. appearance ci dà opzioni per impostare la LHS (parte IF) e la RHS (parte THEN) della regola.

Ad esempio, per scoprire cosa comprano i clienti prima di acquistare 'METAL' esegui la seguente riga di codice:

metal.association.rules <- apriori(tr, parameter = list(supp=0.001, conf=0.8),appearance = list(default="lhs",rhs="METAL"))
Apriori

Parameter specification:
 confidence minval smax arem  aval originalSupport maxtime support minlen maxlen target
        0.8    0.1    1 none FALSE            TRUE       5   0.001      1     10  rules
   ext
 FALSE

Algorithmic control:
 filter tree heap memopt load sort verbose
    0.1 TRUE TRUE  FALSE TRUE    2    TRUE

Absolute minimum support count: 22

set item appearances ...[1 item(s)] done [0.00s].
set transactions ...[30066 item(s), 22191 transaction(s)] done [0.21s].
sorting and recoding items ... [2324 item(s)] done [0.02s].
creating transaction tree ... done [0.02s].
checking subsets of size 1 2 3 4 5 6 7 8 9 10
Mining stopped (maxlen reached). Only patterns up to a length of 10 returned!
 done [0.63s].
writing ... [5 rule(s)] done [0.07s].
creating S4 object  ... done [0.02s]. 
# Here lhs=METAL because you want to find out the probability of that in how many customers buy METAL along with other items
inspect(head(metal.association.rules))
    lhs                            rhs     support     confidence lift   count
[1] {WOBBLY CHICKEN}            => {METAL} 0.001261773 1          443.82 28   
[2] {WOBBLY RABBIT}             => {METAL} 0.001532153 1          443.82 34   
[3] {DECORATION}                => {METAL} 0.002253166 1          443.82 50   
[4] {DECORATION,WOBBLY CHICKEN} => {METAL} 0.001261773 1          443.82 28   
[5] {DECORATION,WOBBLY RABBIT}  => {METAL} 0.001532153 1          443.82 34 

Allo stesso modo, per rispondere alla domanda I clienti che hanno acquistato METAL hanno acquistato anche... terrai METAL sulla lhs:

metal.association.rules <- apriori(tr, parameter = list(supp=0.001, conf=0.8),appearance = list(lhs="METAL",default="rhs"))
Apriori

Parameter specification:
 confidence minval smax arem  aval originalSupport maxtime support minlen maxlen target
        0.8    0.1    1 none FALSE            TRUE       5   0.001      1     10  rules
   ext
 FALSE

Algorithmic control:
 filter tree heap memopt load sort verbose
    0.1 TRUE TRUE  FALSE TRUE    2    TRUE

Absolute minimum support count: 22

set item appearances ...[1 item(s)] done [0.00s].
set transactions ...[30066 item(s), 22191 transaction(s)] done [0.10s].
sorting and recoding items ... [2324 item(s)] done [0.02s].
creating transaction tree ... done [0.02s].
checking subsets of size 1 2 done [0.01s].
writing ... [1 rule(s)] done [0.00s].
creating S4 object  ... done [0.01s].
# Here lhs=METAL because you want to find out the probability of that in how many customers buy METAL along with other items
inspect(head(metal.association.rules))
    lhs        rhs          support     confidence lift   count
[1] {METAL} => {DECORATION} 0.002253166 1          443.82 50 

Visualizzare le Regole di Associazione

Poiché verranno generate centinaia o migliaia di regole in base ai dati, ti servono un paio di modi per presentare i risultati. ItemFrequencyPlot è già stato discusso sopra ed è anche un ottimo modo per ottenere gli articoli più venduti.

Qui discuteremo le seguenti visualizzazioni:

  • Scatter plot
  • Scatter plot interattivo
  • Rappresentazione della singola regola

Scatter plot

Una visualizzazione diretta delle regole di associazione è usare uno scatter plot con plot() del pacchetto arulesViz. Usa Support e Confidence sugli assi. Inoltre, una terza misura, il Lift, viene usata di default per colorare (livelli di grigio) i punti.

# Filter rules with confidence greater than 0.4 or 40%
subRules<-association.rules[quality(association.rules)$confidence>0.4]
#Plot SubRules
plot(subRules)
scatter plot

Il grafico sopra mostra che le regole con lift elevato hanno support basso. Puoi usare le seguenti opzioni per il plot:

plot(rulesObject, measure, shading, method)
  • rulesObject: l’oggetto regole da plottare

  • measure: Misure di interessanza delle regole. Possono essere Support, Confidence, lift o una combinazione in base al valore di method.

  • shading: Misura usata per colorare i punti (Support, Confidence, lift). Il default è Lift.

  • method: Metodo di visualizzazione da usare (scatterplot, two-key plot, matrix3D).

plot(subRules,method="two-key plot")
two key plot

Il two-key plot usa support e confidence rispettivamente su asse x e y. Usa order per la colorazione. Order è il numero di articoli nella regola.

Scatter plot interattivo

Un fantastico grafico interattivo può essere usato per presentare le tue regole usando arulesViz e plotly. Puoi passare il mouse su ciascuna regola e vedere tutte le misure di qualità (support, confidence e lift).

plotly_arules(subRules)
'plotly_arules' is deprecated.
Use 'plot' instead.
See help("Deprecated")plot: Too many rules supplied. Only plotting the best 1000 rules using measure lift (change parameter max if needed)To reduce overplotting, jitter is added! Use jitter = 0 to prevent jitter.

Visualizzazioni basate su grafi

Le tecniche basate su grafi visualizzano le regole di associazione usando vertici e archi, dove i vertici sono etichettati con i nomi degli articoli e gli itemset o le regole sono rappresentati come un secondo insieme di vertici. Gli articoli sono collegati a itemset/regole usando frecce direzionali. Le frecce dai singoli articoli ai vertici delle regole indicano gli elementi LHS e una freccia da una regola a un articolo indica la RHS. La dimensione e il colore dei vertici spesso rappresentano le misure di interesse.

I grafi sono un ottimo modo per visualizzare le regole ma tendono a diventare congestionati all’aumentare del numero di regole. Quindi è meglio visualizzare un numero ridotto di regole con visualizzazioni basate su grafi.

Selezioniamo 10 regole da subRules con la confidence più alta.

top10subRules <- head(subRules, n = 10, by = "confidence")

Ora, traccia un grafo interattivo:

Nota: Puoi rendere tutti i tuoi grafici interattivi usando il parametro engine=htmlwidget in plot

plot(top10subRules, method = "graph",  engine = "htmlwidget")
graph

Da arulesViz i grafi per insiemi di regole di associazione possono essere esportati in formato GraphML o come file Graphviz dot per essere esplorati con strumenti come Gephi. Ad esempio, le 1000 regole con lift più alto si esportano con:

saveAsGraph(head(subRules, n = 1000, by = "lift"), file = "rules.graphml")

Rappresentazione della singola regola

Questa rappresentazione è detta anche Parallel Coordinates Plot. È utile per visualizzare quali prodotti, insieme a quali articoli, causano determinati tipi di vendite.

Come detto sopra, la RHS è il Consequente o l’articolo che proponiamo il cliente acquisterà; le posizioni sono nella LHS, dove 2 è l’aggiunta più recente al nostro carrello e 1 è l’articolo che avevamo in precedenza.

# Filter top 20 rules with highest lift
subRules2<-head(subRules, n=20, by="lift")
plot(subRules2, method="paracoord")
parallel coordinates plot

Guarda la freccia più in alto. Mostra che quando ho 'CHILDS GARDEN SPADE PINK' e 'CHILDS GARDEN RAKE PINK' nel carrello, è probabile che acquisti anche 'CHILDS GARDEN RAKE BLUE' insieme a questi.

Conclusione

Congratulazioni! Hai imparato APRIORI, uno degli algoritmi più usati nel data mining. Hai imparato tutto sul Mining delle Regole di Associazione, le sue applicazioni e la sua applicazione nel retail chiamata Market Basket Analysis. Ora sei anche in grado di implementare la Market Basket Analysis in R e presentare le tue regole di associazione con ottimi grafici! Buono studio!

Riferimenti:

  1. https://datascienceplus.com/a-gentle-introduction-on-market-basket-analysis%E2%80%8A-%E2%80%8Aassociation-rules/

  2. https://en.wikipedia.org/wiki/Sparse_matrix

  3. https://cran.r-project.org/web/packages/arulesViz/vignettes/arulesViz.pdf

Se vuoi imparare di più su R, segui il corso di DataCamp Importing and Managing Financial Data in R.

Argomenti

Correlato