Lerne die Marktkorbanalyse und den dahinterliegenden APRIORI-Algorithmus kennen. Erfahre, wie Händler damit vorhersagen, welche Artikel zusammen gekauft werden – und so ihr Geschäft ankurbeln.
Du bist Data Scientist (oder auf dem Weg dorthin) und hast einen Kunden, der ein Einzelhandelsgeschäft betreibt. Dein Kunde gibt dir Transaktionsdaten: Artikel, die im Zeitverlauf von verschiedenen Kundinnen und Kunden gekauft wurden. Er bittet dich, diese Daten zu nutzen, um sein Geschäft zu pushen. Deine Ergebnisse fließen nicht nur in das Ändern/Aktualisieren/Erweitern des Sortiments ein, sondern auch in die Gestaltung des Ladenlayouts oder des Onlineshops. Um aussagekräftige Ergebnisse zu liefern, nutzt du die Market Basket Analysis (MBA), die Assoziationsregel-Mining auf den Transaktionsdaten anwendet.
In diesem Tutorial lernst du:
Was Assoziationsregel-Mining ist und wofür es eingesetzt wird
Was der APRIORI-Algorithmus ist
Wie du MBA/Assoziationsregel-Mining in R inkl. Visualisierungen umsetzt
Assoziationsregel-Mining
Assoziationsregel-Mining kommt zum Einsatz, wenn du Zusammenhänge zwischen Objekten in einer Menge finden willst, etwa häufige Muster in einer Transaktionsdatenbank, relationalen Datenbanken oder anderen Informationsspeichern. Typische Anwendungen sind Marketing, Warenkorbanalyse (Market Basket Analysis) im Handel, Clustering und Klassifikation. Durch das Generieren von Assoziationsregeln zeigt dir das Verfahren, welche Artikel Kundinnen und Kunden häufig zusammen kaufen. Vereinfacht gesagt liefert es Regeln der Form wenn dies, dann das. Unternehmen nutzen diese Regeln für zahlreiche Marketingstrategien:
Anordnung des Sortiments nach Trends im Laden oder Onlineshop
Analyse des Kundenverhaltens
Kataloggestaltung
Cross-Selling im Onlineshop
Erkennen, welche Artikel aktuell im Trend sind
Personalisierte E-Mails mit passenden Zusatzangeboten
Betrachte das folgende Beispiel:
Gegeben ist ein Satz von Transaktionsdaten. Du siehst Transaktionen mit den Nummern 1 bis 5. Jede Transaktion zeigt die darin gekauften Artikel. Du erkennst, dass Windeln zusammen mit Bier in drei Transaktionen gekauft werden. Ähnlich wird Brot zusammen mit Milch in drei Transaktionen gekauft, was beide zu häufigen Itemsets macht. Assoziationsregeln werden wie folgt notiert:
$A=>B[Support,Confidence]$
Der Teil vor $=>$ ist das wenn (Antezedens), der Teil nach $=>$ das dann (Konsequens).
Wobei A und B Mengen von Artikeln in den Transaktionsdaten sind. A und B sind disjunkt.
Also die Anzahl der Transaktionen mit A und B geteilt durch die Gesamtzahl der Transaktionen mit A.
$Confidence(Bread=>Milk)=\frac{3}{4}=0.75=75\%$
Berechne nun die Confidence für Milch=>Windeln.
Hinweis: Support und Confidence messen, wie interessant eine Regel ist. Sie werden über minimale Schwellwerte min_support und min_confidence festgelegt. Diese vom Kunden definierten Schwellen erlauben, die Stärke der Regeln im gewünschten Kontext zu bewerten. Je näher an (oder über) der Schwelle, desto nützlicher ist die Regel für den Kunden.
Frequent Itemsets: Itemsets, deren Support größer oder gleich dem minimalen Support (min_sup) ist. Im obigen Beispiel ist min_sup=3. Dieser Wert wird vom Nutzer festgelegt.
Starke Regeln: Eine Regel A=>B[Support, Confidence] ist stark, wenn sie min_sup und min_confidence erfüllt.
Lift: Der Lift gibt die Korrelation zwischen A und B in der Regel A=>B an. Er zeigt, wie sich das Itemset A auf das Itemset B auswirkt.
$Lift(A=>B)=\frac{Support}{Supp(A)Supp(B)}$
Für die Regel {Bread}=>{Milk} ergibt sich der Lift wie folgt:
$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$
Hat die Regel einen Lift von 1, sind A und B unabhängig und es lässt sich keine nützliche Regel ableiten.
Ist der Lift > 1, hängen A und B voneinander ab; der Grad der Abhängigkeit zeigt sich im Lift-Wert.
Ist der Lift < 1, wirkt sich das Vorhandensein von A negativ auf B aus.
Ziel des Assoziationsregel-Minings
Wendest du Assoziationsregel-Mining auf einen gegebenen Transaktionssatz T an, möchtest du alle Regeln finden mit:
Support größer oder gleich min_support
Confidence größer oder gleich min_confidence
APRIORI-Algorithmus
In diesem Teil des Tutorials lernst du den Algorithmus kennen, der in R-Bibliotheken für die Marktkorbanalyse zum Einsatz kommt. Das hilft dir, deine Kundschaft besser zu verstehen und Analysen gezielter durchzuführen. Wenn du den APRIORI-Algorithmus bereits kennst, spring direkt zum Coding-Teil.
Assoziationsregel-Mining besteht aus zwei Schritten:
Generierung häufiger Itemsets: Finde alle häufigen Itemsets mit Support >= vorgegebenem min_support.
Regelerzeugung: Liste alle Assoziationsregeln aus den häufigen Itemsets auf. Berechne Support und Confidence für alle Regeln. Schneide Regeln weg, die min_support und min_confidence nicht erfüllen.
Die Generierung häufiger Itemsets ist der rechenintensivste Schritt, da dafür die gesamte Datenbank gescannt werden muss.
Im obigen Beispiel siehst du nur 5 Transaktionen. In der Praxis können Handelsdaten jedoch bis in den GB- oder TB-Bereich gehen. Dafür braucht es einen optimierten Algorithmus, der Itemsets frühzeitig aussondert, die später nicht helfen. Hier kommt der APRIORI-Algorithmus ins Spiel. Er besagt:
Jede Teilmenge eines häufigen Itemsets muss ebenfalls häufig sein. Anders ausgedrückt: Kein Superset eines seltenen Itemsets darf erzeugt oder getestet werden.
Das wird im Itemset-Gitter (Itemset Lattice) dargestellt, einer grafischen Repräsentation des Apriori-Prinzips. Es besteht aus Knoten für k-Itemsets und deren Teilmengenbeziehungen.
Du siehst oben: Am unteren Rand stehen alle Items der Transaktionsdaten, von dort gehst du nach oben und bildest Teilmengen bis zur leeren Menge. Bei d Items hat das Gitter die Größe $2^d$. Das zeigt, wie aufwendig es wäre, für jede Kombination den Support zu berechnen. Die folgende Abbildung zeigt, wie stark APRIORI die Zahl der zu erzeugenden Mengen reduziert:
Ist das Itemset {a,b} nicht häufig, müssen all seine Supersets nicht betrachtet werden.
Verstehen wir das an einem Beispiel. Im Folgenden siehst du, warum APRIORI so effektiv ist und wie Schritt für Schritt starke Assoziationsregeln entstehen. Schnapp dir Block und Stift und mach mit!
Wie du siehst, startest du mit einer Kandidatenliste für 1-Itemsets, die alle in den Transaktionsdaten vorkommenden Items einzeln umfasst. Bei echten Retail-Daten erkennst du, wie teuer diese Kandidatenerzeugung ist. APRIORI reduziert hier die Kandidatenzahl deutlich, und am Ende entstehen nützliche Regeln. In den folgenden Schritten siehst du, wie wir das Ende der Generierung häufiger Itemsets erreichen – also Schritt 1 des Assoziationsregel-Minings.
Als Nächstes listest du alle häufigen Itemsets auf. Du nimmst das letzte nichtleere häufige Itemset – in diesem Beispiel ist das L2={I1, I2},{I2, I3}. Dann bildest du alle nichtleeren Teilmengen der in dieser Liste enthaltenen Itemsets. Folge der Illustration unten:
Oben siehst du vier starke Regeln. Zum Beispiel besagt ${I2}=>I3$ mit einer Confidence von 75%, dass 75% der Personen, die I2 gekauft haben, auch I3 gekauft haben.
Du hast nun den APRIORI-Algorithmus vollständig kennengelernt – einen der meistgenutzten Algorithmen im Data Mining. Weiter geht’s mit dem Code, puh!
MBA/Assoziationsregel-Mining in R umsetzen
In diesem Tutorial verwendest du ein Dataset aus dem UCI Machine Learning Repository. Das Dataset heißt Online-Retail und du kannst es hier herunterladen. Es enthält Transaktionsdaten vom 01.12.2010 bis 09.12.2011 für einen im Vereinigten Königreich registrierten Onlinehändler ohne stationäres Geschäft. Wir nutzen dieses Dataset statt eines R-Beispieldatensatzes, weil du in der Praxis eher Daten in dieser Form erhältst und erst eine Datenvorverarbeitung nötig ist.
Beschreibung des Datasets
Anzahl Zeilen:541909
Anzahl Attribute:08
Attributinformationen
InvoiceNo: Rechnungsnummer. Nominal, eine sechsstellige ganze Zahl, die jeder Transaktion eindeutig zugeordnet ist. Beginnt der Code mit dem Buchstaben „c“, handelt es sich um eine Stornierung. +StockCode: Produktcode. Nominal, eine fünfstellige ganze Zahl, die jedem Produkt eindeutig zugeordnet ist.
Description: Produktname. Nominal.
Quantity: Anzahl je Produkt pro Transaktion. Numerisch.
InvoiceDate: Rechnungsdatum und Uhrzeit. Numerisch, der Zeitpunkt der Transaktion. Beispiel: 12/1/2010 8:26
UnitPrice: Stückpreis. Numerisch, Produktpreis pro Einheit in Pfund Sterling.
CustomerID: Kundennummer. Nominal, eine fünfstellige ganze Zahl, die jeder Kundin/jedem Kunden eindeutig zugeordnet ist.
Country: Ländername. Nominal, das Land, in dem die Kundin/der Kunde wohnhaft ist.
Bibliotheken laden
Als Erstes lädst du die benötigten Bibliotheken. Eine kurze Beschreibung (aus Here) findest du in der folgenden Tabelle, damit du weißt, wofür jedes Paket da ist:
Package
Description
arules
Stellt Infrastruktur zum Repräsentieren, Bearbeiten und Analysieren von Transaktionsdaten und Mustern (häufige Itemsets und Assoziationsregeln) bereit.
arulesViz
Erweitert das Paket „arules“ um verschiedene Visualisierungstechniken für Assoziationsregeln und Itemsets. Enthält außerdem interaktive Visualisierungen für die Regel-Exploration.
tidyverse
Der Tidyverse ist eine kuratierte Sammlung von R-Paketen für Data Science.
readxl
Excel-Dateien in R einlesen.
plyr
Werkzeuge zum Aufteilen, Anwenden und Zusammenführen von Daten.
ggplot2
Grafiken und Diagramme erstellen.
knitr
Dynamische Berichtserstellung in R.
lubridate
Erleichtert die Arbeit mit Datums- und Zeitangaben in R.
#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)Bereitgestellt von
Datenvorverarbeitung
Nutze read_excel(path to file), um das heruntergeladene Dataset in R einzulesen. Gib den vollständigen Pfad inklusive Dateiname in read_excel(path-to-file-with-filename) an.
#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))Bereitgestellt von
#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))Bereitgestellt von
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-0108:26:00,2010-12-0108:26:00,2010-12-0108: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...Bereitgestellt von
Nun enthält der Dataframe retail 10 Attribute, mit zwei zusätzlichen Attributen Date und Time.
Bevor wir MBA/Assoziationsregel-Mining anwenden, müssen wir den Dataframe in Transaktionsdaten umwandeln, sodass alle gemeinsam in einer Rechnung gekauften Items in einer Zeile stehen. Im glimpse-Output siehst du, dass jede Transaktion in atomarer Form vorliegt, d. h. alle Produkte zu einer Rechnung sind wie in relationalen Datenbanken atomar gespeichert. Dieses Format wird auch Singles-Format genannt.
Du musst die Daten im retail-Dataframe gruppieren – entweder nach CustomerID, CustomerID und Date oder auch nach InvoiceNo und Date. Diese Gruppierung benötigen wir, um eine Funktion darauf anzuwenden und das Ergebnis in einem neuen Dataframe zu speichern. Das geht mit ddply.
Die folgenden Codezeilen fassen alle Produkte einer Kombination aus InvoiceNo und Date zusammen und speichern sie als eine Zeile, in der die Items mit , getrennt sind.
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 usedBereitgestellt von
Da InvoiceNo und Date für das Regel-Mining nicht benötigt werden, setzt du sie auf 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
transactionDataBereitgestellt von
Hinweis: Seite 1 von 100.
Dieses Transaktionsformat nennt man Basket-Format. Als Nächstes speicherst du diese Transaktionsdaten in eine .csv-Datei (Comma Separated Values). Dafür nutzt du 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.Bereitgestellt von
Prüfe, ob deine Transaktionsdaten korrekt formatiert sind:
Nun lädst du diese Transaktionsdaten in ein Objekt der Klasse transactions. Das erledigt die R-Funktion read.transactions aus dem Paket arules.
Die folgende Codezeile liest die Datei D:/Documents/market_basket_transactions.csv im Basket-Format ein und wandelt sie in ein Objekt der Klasse transactions um.
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 ','Bereitgestellt von
Wenn du den obigen Code ausführst, siehst du eventuell viele Meldungen wie EOF within quoted string. Keine Sorge.
Wenn du Transaktionsdaten bereits in einem Dataframe hast, kannst du sie so in ein transactions-Objekt umwandeln:
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
18031709
JUMBO BAG RED RETROSPOT PARTY BUNTING
14601285
ASSORTED COLOUR BIRD ORNAMENT (Other)1250329938
element (itemset/transaction) length distribution:
sizes
12345678910111213141516173598159411419088617586966766635936245375165315515224641819202122232425262728293031323334441483419395315306272238253229213222215170159138142353637383940414243444546474849505113410911190113949387886563676360594964525354555657585960616263646566676840414943362939302728172525202724226970717273747576777879808182838485152019131616111512791415128911868788899091929394959697989910010110211148656116443652424103104105106107108109110111112113114116117118120121432263432131333121221231251261271311321331341401411421431451461471502132211211221121115415716817117717818020220422823624925028532040041932221111111111111
Min. 1st Qu. Median Mean 3rd Qu. Max.
1.003.0010.0015.2121.00419.00
includes extended item information - examples:
labels
11 HANGER
210 COLOUR SPACEBOY PEN
312 COLOURED PARTY BALLOONSBereitgestellt von
summary(tr) ist sehr hilfreich und liefert Infos zu unserem Transaktionsobjekt. Was sagt der Output oben?
Es gibt 22191 Transaktionen (Zeilen) und 7876 Items (Spalten). Beachte: 7876 sind die Produktbeschreibungen im Dataset und 22191 Transaktionen sind Kombinationen daraus.
Dichte (Density) gibt den Anteil nicht-nuller Zellen in der Sparse-Matrix an. Du kannst es auch als Anzahl gekaufter Items geteilt durch die möglichen Items in der Matrix verstehen. Über die Dichte lässt sich die Anzahl gekaufter Items schätzen: 22191x7876x0.001930725=337445
Info! Sparse-Matrix: Eine Sparse-Matrix ist eine Matrix, in der die meisten Elemente null sind. Sind die meisten Elemente ungleich null, spricht man von einer dichten Matrix. Die Anzahl der Nullelemente geteilt durch die Gesamtzahl der Elemente ist die Sparsity (1 minus der Dichte).
Die Zusammenfassung zeigt auch die häufigsten Items.
Längendistrubition der Elemente (Itemset/Transaktion): Zeigt, wie viele Transaktionen es für 1-Itemsets, 2-Itemsets usw. gibt. Die erste Zeile zeigt die Anzahl Items, die zweite die Anzahl Transaktionen.
Beispiel: Es gibt nur 3598 Transaktionen mit einem Item, 1594 Transaktionen mit zwei Items und die längste Transaktion enthält 419 Items.
Du kannst mit itemFrequencyPlot ein Balkendiagramm der Item-Häufigkeiten erstellen, um die Verteilung auf Basis der itemMatrix zu sehen (z. B. >transactions oder Items in >itemsets und >rules).
# Create an item frequency plot for the top 20 itemsif(!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")Bereitgestellt von
ist das erste Argument das zu plottende Transaktionsobjekt tr. Mit topN wählst du die Top-N-Items nach Häufigkeit. type kann type="absolute" oder type="relative" sein. Absolut plottet die numerische Häufigkeit je Item, relativ zeigt, wie oft Items im Vergleich zu anderen auftreten.
itemFrequencyPlot(tr,topN=20,type="relative",col=brewer.pal(8,'Pastel2'),main="Relative Item Frequency Plot")Bereitgestellt von
Dieser Plot zeigt, dass „WHITE HANGING HEART T-LIGHT HOLDER“ und „REGENCY CAKESTAND 3 TIER“ am häufigsten verkauft werden. Um den Absatz von „SET OF 3 CAKE TINS PANTRY DESIGN“ zu steigern, könnte der Händler es in der Nähe von „REGENCY CAKESTAND 3 TIER“ platzieren.
Weitere Optionen für itemFrequencyPlot findest du hier.
Regeln generieren!
Als Nächstes werden mit dem APRIORI-Algorithmus Regeln gemined. Die Funktion apriori() stammt aus dem Paket arules.
# Min Support as 0.001, confidence as 0.8.
association.rules <- apriori(tr, parameter = list(supp=0.001, conf=0.8,maxlen=10))Bereitgestellt von
Apriori
Parameter specification:
confidence minval smax arem aval originalSupport maxtime support minlen maxlen target
0.80.11 none FALSETRUE50.001110 rules
ext
FALSE
Algorithmic control:
filter tree heap memopt load sort verbose
0.1TRUETRUEFALSETRUE2TRUE
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 12345678910Bereitgestellt von
Mining stopped (maxlen reached). Only patterns up to a length of 10 returned!Bereitgestellt von
set of 49122 rules
rule length distribution (lhs + rhs):sizes
234567891010521116854164241485561021937613121
Min. 1st Qu. Median Mean 3rd Qu. Max.
2.0005.0005.0005.4996.00010.000
summary of quality measures:
support confidence lift count
Min. :0.001036 Min. :0.8000 Min. :9.846 Min. :23.001st Qu.:0.0010821st Qu.:0.83331st Qu.:22.2371st 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.453rd Qu.:0.0015323rd Qu.:0.92593rd Qu.:69.2003rd Qu.:34.00
Max. :0.015997 Max. :1.0000 Max. :715.839 Max. :355.00
mining info:
data ntransactions support confidence
tr 221910.0010.8Bereitgestellt von
apriori erhält tr als Transaktionsobjekt, auf dem gemined wird. Über parameter setzt du min_sup und min_confidence. Standardwerte sind Support 0.1, Confidence 0.8, maximal 10 Items (maxlen).
summary(association.rules) zeigt Folgendes:
Parameter-Spezifikation: min_sup=0.001 und min_confidence=0.8 bei maximal 10 Items pro Regel.
Gesamtzahl der Regeln:49122 Regeln.
Längendistribution: Länge 5 hat die meisten Regeln: 16424; Länge 2 hat am wenigsten: 105.
Qualitätsmaße: Min/Max für Support, Confidence und Lift.
Mining-Infos: Die Daten sowie Support und Confidence, die wir übergeben haben.
Da es 49122 Regeln sind, geben wir nur die Top 10 aus:
100% der Kundinnen und Kunden, die „WOBBLY CHICKEN“ kaufen, kaufen auch „METAL“.
100% der Kundinnen und Kunden, die „BLACK TEA“ kaufen, kaufen auch „SUGAR JARS“.
Anzahl und Länge der Regeln begrenzen
Wie begrenzt man Größe und Anzahl der generierten Regeln? Über die parameters in apriori. Erhöhe z. B. conf für stärkere Regeln und maxlen für längere Regeln.
shorter.association.rules <- apriori(tr, parameter = list(supp=0.001, conf=0.8,maxlen=3))Bereitgestellt von
Redundante Regeln entfernen
Du kannst Regeln entfernen, die Teilmengen größerer Regeln sind. Nutze den folgenden Code, um solche Regeln zu entfernen:
subset.rules <- which(colSums(is.subset(association.rules, association.rules))>1)# get subset rules in vector
length(subset.rules)#> 3913Bereitgestellt von
subset.association.rules.<- association.rules[-subset.rules] # remove subset rules.Bereitgestellt von
which() gibt die Positionen der Elemente im Vektor zurück, für die der Wert TRUE ist.
colSums() berechnet Spaltensummen für Dataframes und numerische Arrays.
is.subset() prüft, ob Elemente eines Vektors alle Elemente eines anderen enthalten.
Regeln zu bestimmten Items finden
Manchmal willst du ein bestimmtes Produkt betrachten. Wenn du herausfinden willst, was den Kauf von Item X beeinflusst, kannst du die Option appearance in apriori nutzen. Damit legst du LHS (IF-Teil) und RHS (THEN-Teil) der Regel fest.
Beispiel: Um zu sehen, was Kundinnen und Kunden vor dem Kauf von „METAL“ kaufen, führe Folgendes aus:
metal.association.rules <- apriori(tr, parameter = list(supp=0.001, conf=0.8),appearance = list(default="lhs",rhs="METAL"))Bereitgestellt von
Apriori
Parameter specification:
confidence minval smax arem aval originalSupport maxtime support minlen maxlen target
0.80.11 none FALSETRUE50.001110 rules
ext
FALSE
Algorithmic control:
filter tree heap memopt load sort verbose
0.1TRUETRUEFALSETRUE2TRUE
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 12345678910Bereitgestellt von
Mining stopped (maxlen reached). Only patterns up to a length of 10 returned!Bereitgestellt von
# 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))Bereitgestellt von
lhs rhs support confidence lift count
[1]{WOBBLY CHICKEN}=>{METAL}0.0012617731443.8228[2]{WOBBLY RABBIT}=>{METAL}0.0015321531443.8234[3]{DECORATION}=>{METAL}0.0022531661443.8250[4]{DECORATION,WOBBLY CHICKEN}=>{METAL}0.0012617731443.8228[5]{DECORATION,WOBBLY RABBIT}=>{METAL}0.0015321531443.8234Bereitgestellt von
Umgekehrt, um die Frage Kundinnen und Kunden, die METAL gekauft haben, kauften außerdem … zu beantworten, setzt du METAL auf die lhs:
metal.association.rules <- apriori(tr, parameter = list(supp=0.001, conf=0.8),appearance = list(lhs="METAL",default="rhs"))Bereitgestellt von
Apriori
Parameter specification:
confidence minval smax arem aval originalSupport maxtime support minlen maxlen target
0.80.11 none FALSETRUE50.001110 rules
ext
FALSE
Algorithmic control:
filter tree heap memopt load sort verbose
0.1TRUETRUEFALSETRUE2TRUE
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 12 done [0.01s].
writing ...[1 rule(s)] done [0.00s].
creating S4 object ... done [0.01s].Bereitgestellt von
# 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))Bereitgestellt von
lhs rhs support confidence lift count
[1]{METAL}=>{DECORATION}0.0022531661443.8250Bereitgestellt von
Assoziationsregeln visualisieren
Da je nach Daten Hunderte oder Tausende Regeln entstehen, brauchst du verschiedene Möglichkeiten, deine Ergebnisse zu präsentieren. ItemFrequencyPlot haben wir bereits genutzt – ebenfalls hilfreich, um Topseller zu identifizieren.
Wir betrachten folgende Visualisierungen:
Streudiagramm
Interaktives Streudiagramm
Darstellung einzelner Regeln
Streudiagramm
Eine einfache Visualisierung von Assoziationsregeln ist das Streudiagramm mit plot() aus arulesViz. Auf den Achsen stehen Support und Confidence. Zusätzlich wird standardmäßig die dritte Kennzahl Lift zur Einfärbung (Graustufen) der Punkte genutzt.
# Filter rules with confidence greater than 0.4 or 40%
subRules<-association.rules[quality(association.rules)$confidence>0.4]#Plot SubRules
plot(subRules)Bereitgestellt von
Der Plot zeigt, dass Regeln mit hohem Lift meist geringen Support haben. Du kannst die folgenden Optionen für den Plot nutzen:
'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.Bereitgestellt von
Graphbasierte Visualisierungen
Graphbasierte Techniken visualisieren Assoziationsregeln mit Knoten und Kanten: Knoten sind mit Itemnamen beschriftet, Itemsets oder Regeln werden als zweite Knotenmenge dargestellt. Items sind mit Itemsets/Regeln über gerichtete Pfeile verbunden. Pfeile von Items zu Regelknoten markieren LHS-Items, ein Pfeil von einer Regel zu einem Item markiert die RHS. Größe und Farbe der Knoten repräsentieren oft Interessantheitsmaße.
Graphplots sind sehr aussagekräftig, werden aber schnell unübersichtlich, wenn die Zahl der Regeln steigt. Daher besser nur wenige Regeln graphbasiert visualisieren.
Wählen wir 10 Regeln aus subRules mit der höchsten Confidence.
top10subRules <- head(subRules, n =10, by ="confidence")Bereitgestellt von
Jetzt plotten wir einen interaktiven Graphen:
Hinweis: Du kannst alle Plots interaktiv machen, indem du in plot den Parameter engine=htmlwidget setzt.
plot(top10subRules, method ="graph", engine ="htmlwidget")Bereitgestellt von
Mit arulesViz können Graphen von Regelsätzen als GraphML oder Graphviz dot-Dateien exportiert und z. B. in Gephi untersucht werden. Beispielsweise exportierst du die 1000 Regeln mit dem höchsten Lift so:
saveAsGraph(head(subRules, n =1000, by ="lift"), file ="rules.graphml")Bereitgestellt von
Darstellung einzelner Regeln
Diese Darstellung heißt auch Parallel Coordinates Plot. Sie ist nützlich, um zu sehen, welche Produkte zusammen mit welchen Items welchen Effekt auf den Verkauf haben.
Wie oben erwähnt, ist die RHS der Konsequens, also das Item, dessen Kauf wir prognostizieren. Die Positionen auf der LHS zeigen die Reihenfolge: 2 ist die jüngste Ergänzung im Warenkorb, 1 das zuvor enthaltene Item.
# Filter top 20 rules with highest lift
subRules2<-head(subRules, n=20, by="lift")
plot(subRules2, method="paracoord")Bereitgestellt von
Sieh dir den obersten Pfeil an. Er zeigt: Wenn „CHILDS GARDEN SPADE PINK“ und „CHILDS GARDEN RAKE PINK“ im Warenkorb liegen, ist es wahrscheinlich, dass auch „CHILDS GARDEN RAKE BLUE“ dazu gekauft wird.
Fazit
Glückwunsch! Du hast APRIORI kennengelernt, einen der am häufigsten genutzten Algorithmen im Data Mining. Du weißt nun, wie Assoziationsregel-Mining funktioniert, wofür es eingesetzt wird und wie es im Handel als Market Basket Analysis Anwendung findet. Außerdem kannst du die Marktkorbanalyse in R umsetzen und deine Regeln mit starken Visualisierungen präsentieren. Viel Erfolg beim Lernen!
Lerne die wichtigsten Arten von KI-Agenten kennen, wie sie mit ihrer Umgebung interagieren und wie sie in verschiedenen Branchen eingesetzt werden. Verstehe einfache reflexive, modellbasierte, zielbasierte, nutzenbasierte, lernende Agenten und mehr.
Keine Hacks, keine Tricks. Schüler/innen und Lehrer/innen, lest weiter, um zu erfahren, wie ihr die Datenerziehung, die euch zusteht, kostenlos bekommen könnt.
Gewinne Vertrauen in die OLS-Regression, indem du ihre theoretischen Grundlagen beherrschst. Erforsche, wie du einfache Implementierungen in Excel, R und Python durchführst.
Mach dich mit Python-Datenstrukturen vertraut: Lerne mehr über Datentypen und primitive sowie nicht-primitive Datenstrukturen wie Strings, Listen, Stapel usw.
Du bist Data Scientist (oder auf dem Weg dorthin) und hast einen Kunden, der ein Einzelhandelsgeschäft betreibt. Dein Kunde gibt dir Transaktionsdaten: Artikel, die im Zeitverlauf von verschiedenen Kundinnen und Kunden gekauft wurden. Er bittet dich, diese Daten zu nutzen, um sein Geschäft zu pushen. Deine Ergebnisse fließen nicht nur in das Ändern/Aktualisieren/Erweitern des Sortiments ein, sondern auch in die Gestaltung des Ladenlayouts oder des Onlineshops. Um aussagekräftige Ergebnisse zu liefern, nutzt du die Market Basket Analysis (MBA), die Assoziationsregel-Mining auf den Transaktionsdaten anwendet.
In diesem Tutorial lernst du:
Assoziationsregel-Mining
Assoziationsregel-Mining kommt zum Einsatz, wenn du Zusammenhänge zwischen Objekten in einer Menge finden willst, etwa häufige Muster in einer Transaktionsdatenbank, relationalen Datenbanken oder anderen Informationsspeichern. Typische Anwendungen sind Marketing, Warenkorbanalyse (Market Basket Analysis) im Handel, Clustering und Klassifikation. Durch das Generieren von Assoziationsregeln zeigt dir das Verfahren, welche Artikel Kundinnen und Kunden häufig zusammen kaufen. Vereinfacht gesagt liefert es Regeln der Form wenn dies, dann das. Unternehmen nutzen diese Regeln für zahlreiche Marketingstrategien:
Betrachte das folgende Beispiel:
Gegeben ist ein Satz von Transaktionsdaten. Du siehst Transaktionen mit den Nummern 1 bis 5. Jede Transaktion zeigt die darin gekauften Artikel. Du erkennst, dass Windeln zusammen mit Bier in drei Transaktionen gekauft werden. Ähnlich wird Brot zusammen mit Milch in drei Transaktionen gekauft, was beide zu häufigen Itemsets macht. Assoziationsregeln werden wie folgt notiert:
$A=>B[Support,Confidence]$
Der Teil vor $=>$ ist das wenn (Antezedens), der Teil nach $=>$ das dann (Konsequens).
Wobei A und B Mengen von Artikeln in den Transaktionsdaten sind. A und B sind disjunkt.
$Computer=>Anti-virus Software[Support=20\%,confidence=60\%]$
Die obige Regel bedeutet:
Im nächsten Abschnitt lernst du die Grundbegriffe des Assoziationsregel-Minings kennen:
Grundbegriffe des Assoziationsregel-Minings
Itemset: Sammlung aus einem oder mehreren Items. K-Itemset bezeichnet eine Menge mit k Items.
Support Count: Häufigkeit des Auftretens eines Itemsets.
Support (s): Anteil der Transaktionen, die das Itemset „X“ enthalten.
$Support(X)=\frac{frequency(X)}{N}$
Für eine Regel A=>B gilt für den Support:
$Support(A=>B)=\frac{frequency(A,B)}{N}$
Hinweis: P(A∪B) ist die Wahrscheinlichkeit, dass A und B gemeinsam auftreten. P bezeichnet die Wahrscheinlichkeit.
Probiere als Übung, den Support für Milch=>Windeln zu berechnen.
$Confidence(A=>B)=\frac{P(A\cap B)}{P(A)}=\frac{frequency(A,B)}{frequency(A)}$
Also die Anzahl der Transaktionen mit A und B geteilt durch die Gesamtzahl der Transaktionen mit A.
$Confidence(Bread=>Milk)=\frac{3}{4}=0.75=75\%$
Berechne nun die Confidence für Milch=>Windeln.
Hinweis: Support und Confidence messen, wie interessant eine Regel ist. Sie werden über minimale Schwellwerte min_support und min_confidence festgelegt. Diese vom Kunden definierten Schwellen erlauben, die Stärke der Regeln im gewünschten Kontext zu bewerten. Je näher an (oder über) der Schwelle, desto nützlicher ist die Regel für den Kunden.
Frequent Itemsets: Itemsets, deren Support größer oder gleich dem minimalen Support (min_sup) ist. Im obigen Beispiel ist min_sup=3. Dieser Wert wird vom Nutzer festgelegt.
Starke Regeln: Eine Regel A=>B[Support, Confidence] ist stark, wenn sie min_sup und min_confidence erfüllt.
Lift: Der Lift gibt die Korrelation zwischen A und B in der Regel A=>B an. Er zeigt, wie sich das Itemset A auf das Itemset B auswirkt.
$Lift(A=>B)=\frac{Support}{Supp(A)Supp(B)}$
Für die Regel
{Bread}=>{Milk}ergibt sich der Lift wie folgt:$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$
Hat die Regel einen Lift von 1, sind A und B unabhängig und es lässt sich keine nützliche Regel ableiten.
Ist der Lift > 1, hängen A und B voneinander ab; der Grad der Abhängigkeit zeigt sich im Lift-Wert.
Ist der Lift < 1, wirkt sich das Vorhandensein von A negativ auf B aus.
Ziel des Assoziationsregel-Minings
Wendest du Assoziationsregel-Mining auf einen gegebenen Transaktionssatz T an, möchtest du alle Regeln finden mit:
APRIORI-Algorithmus
In diesem Teil des Tutorials lernst du den Algorithmus kennen, der in R-Bibliotheken für die Marktkorbanalyse zum Einsatz kommt. Das hilft dir, deine Kundschaft besser zu verstehen und Analysen gezielter durchzuführen. Wenn du den APRIORI-Algorithmus bereits kennst, spring direkt zum Coding-Teil.
Assoziationsregel-Mining besteht aus zwei Schritten:
Generierung häufiger Itemsets: Finde alle häufigen Itemsets mit Support >= vorgegebenem min_support.
Regelerzeugung: Liste alle Assoziationsregeln aus den häufigen Itemsets auf. Berechne Support und Confidence für alle Regeln. Schneide Regeln weg, die min_support und min_confidence nicht erfüllen.
Die Generierung häufiger Itemsets ist der rechenintensivste Schritt, da dafür die gesamte Datenbank gescannt werden muss.
Im obigen Beispiel siehst du nur 5 Transaktionen. In der Praxis können Handelsdaten jedoch bis in den GB- oder TB-Bereich gehen. Dafür braucht es einen optimierten Algorithmus, der Itemsets frühzeitig aussondert, die später nicht helfen. Hier kommt der APRIORI-Algorithmus ins Spiel. Er besagt:
Das wird im Itemset-Gitter (Itemset Lattice) dargestellt, einer grafischen Repräsentation des Apriori-Prinzips. Es besteht aus Knoten für k-Itemsets und deren Teilmengenbeziehungen.
Du siehst oben: Am unteren Rand stehen alle Items der Transaktionsdaten, von dort gehst du nach oben und bildest Teilmengen bis zur leeren Menge. Bei d Items hat das Gitter die Größe $2^d$. Das zeigt, wie aufwendig es wäre, für jede Kombination den Support zu berechnen. Die folgende Abbildung zeigt, wie stark APRIORI die Zahl der zu erzeugenden Mengen reduziert:
Ist das Itemset {a,b} nicht häufig, müssen all seine Supersets nicht betrachtet werden.
Verstehen wir das an einem Beispiel. Im Folgenden siehst du, warum APRIORI so effektiv ist und wie Schritt für Schritt starke Assoziationsregeln entstehen. Schnapp dir Block und Stift und mach mit!
Wie du siehst, startest du mit einer Kandidatenliste für 1-Itemsets, die alle in den Transaktionsdaten vorkommenden Items einzeln umfasst. Bei echten Retail-Daten erkennst du, wie teuer diese Kandidatenerzeugung ist. APRIORI reduziert hier die Kandidatenzahl deutlich, und am Ende entstehen nützliche Regeln. In den folgenden Schritten siehst du, wie wir das Ende der Generierung häufiger Itemsets erreichen – also Schritt 1 des Assoziationsregel-Minings.
Als Nächstes listest du alle häufigen Itemsets auf. Du nimmst das letzte nichtleere häufige Itemset – in diesem Beispiel ist das L2={I1, I2},{I2, I3}. Dann bildest du alle nichtleeren Teilmengen der in dieser Liste enthaltenen Itemsets. Folge der Illustration unten:
Oben siehst du vier starke Regeln. Zum Beispiel besagt ${I2}=>I3$ mit einer Confidence von 75%, dass 75% der Personen, die I2 gekauft haben, auch I3 gekauft haben.
Du hast nun den APRIORI-Algorithmus vollständig kennengelernt – einen der meistgenutzten Algorithmen im Data Mining. Weiter geht’s mit dem Code, puh!
MBA/Assoziationsregel-Mining in R umsetzen
In diesem Tutorial verwendest du ein Dataset aus dem UCI Machine Learning Repository. Das Dataset heißt Online-Retail und du kannst es hier herunterladen. Es enthält Transaktionsdaten vom 01.12.2010 bis 09.12.2011 für einen im Vereinigten Königreich registrierten Onlinehändler ohne stationäres Geschäft. Wir nutzen dieses Dataset statt eines R-Beispieldatensatzes, weil du in der Praxis eher Daten in dieser Form erhältst und erst eine Datenvorverarbeitung nötig ist.
Beschreibung des Datasets
Attributinformationen
Bibliotheken laden
Als Erstes lädst du die benötigten Bibliotheken. Eine kurze Beschreibung (aus Here) findest du in der folgenden Tabelle, damit du weißt, wofür jedes Paket da ist:
arulesarulesViztidyversereadxlplyrggplot2knitrlubridateDatenvorverarbeitung
Nutze
read_excel(path to file), um das heruntergeladene Dataset in R einzulesen. Gib den vollständigen Pfad inklusive Dateiname inread_excel(path-to-file-with-filename)an.Nun enthält der Dataframe retail 10 Attribute, mit zwei zusätzlichen Attributen
DateundTime.Bevor wir MBA/Assoziationsregel-Mining anwenden, müssen wir den Dataframe in Transaktionsdaten umwandeln, sodass alle gemeinsam in einer Rechnung gekauften Items in einer Zeile stehen. Im
glimpse-Output siehst du, dass jede Transaktion in atomarer Form vorliegt, d. h. alle Produkte zu einer Rechnung sind wie in relationalen Datenbanken atomar gespeichert. Dieses Format wird auch Singles-Format genannt.Du musst die Daten im
retail-Dataframe gruppieren – entweder nachCustomerID,CustomerIDundDateoder auch nachInvoiceNoundDate. Diese Gruppierung benötigen wir, um eine Funktion darauf anzuwenden und das Ergebnis in einem neuen Dataframe zu speichern. Das geht mitddply.Die folgenden Codezeilen fassen alle Produkte einer Kombination aus
InvoiceNoundDatezusammen und speichern sie als eine Zeile, in der die Items mit,getrennt sind.Da InvoiceNo und Date für das Regel-Mining nicht benötigt werden, setzt du sie auf
NULL.Dieses Transaktionsformat nennt man Basket-Format. Als Nächstes speicherst du diese Transaktionsdaten in eine .csv-Datei (Comma Separated Values). Dafür nutzt du
write.csv().Prüfe, ob deine Transaktionsdaten korrekt formatiert sind:
Nun lädst du diese Transaktionsdaten in ein Objekt der Klasse transactions. Das erledigt die R-Funktion
read.transactionsaus dem Paketarules.Die folgende Codezeile liest die Datei
D:/Documents/market_basket_transactions.csvim Basket-Format ein und wandelt sie in ein Objekt der Klasse transactions um.Wenn du den obigen Code ausführst, siehst du eventuell viele Meldungen wie
EOF within quoted string. Keine Sorge.Wenn du Transaktionsdaten bereits in einem Dataframe hast, kannst du sie so in ein transactions-Objekt umwandeln:
Zeige das Transaktionsobjekt
tran:summary(tr)ist sehr hilfreich und liefert Infos zu unserem Transaktionsobjekt. Was sagt der Output oben?Es gibt 22191 Transaktionen (Zeilen) und 7876 Items (Spalten). Beachte: 7876 sind die Produktbeschreibungen im Dataset und 22191 Transaktionen sind Kombinationen daraus.
Dichte (Density) gibt den Anteil nicht-nuller Zellen in der Sparse-Matrix an. Du kannst es auch als Anzahl gekaufter Items geteilt durch die möglichen Items in der Matrix verstehen. Über die Dichte lässt sich die Anzahl gekaufter Items schätzen: 22191x7876x0.001930725=337445
Die Zusammenfassung zeigt auch die häufigsten Items.
Längendistrubition der Elemente (Itemset/Transaktion): Zeigt, wie viele Transaktionen es für 1-Itemsets, 2-Itemsets usw. gibt. Die erste Zeile zeigt die Anzahl Items, die zweite die Anzahl Transaktionen.
Beispiel: Es gibt nur 3598 Transaktionen mit einem Item, 1594 Transaktionen mit zwei Items und die längste Transaktion enthält 419 Items.
Du kannst mit
itemFrequencyPlotein Balkendiagramm der Item-Häufigkeiten erstellen, um die Verteilung auf Basis deritemMatrixzu sehen (z. B.>transactionsoder Items in>itemsetsund>rules).In
ist das erste Argument das zu plottende Transaktionsobjekt
tr. MittopNwählst du die Top-N-Items nach Häufigkeit.typekanntype="absolute"odertype="relative"sein. Absolut plottet die numerische Häufigkeit je Item, relativ zeigt, wie oft Items im Vergleich zu anderen auftreten.Dieser Plot zeigt, dass „WHITE HANGING HEART T-LIGHT HOLDER“ und „REGENCY CAKESTAND 3 TIER“ am häufigsten verkauft werden. Um den Absatz von „SET OF 3 CAKE TINS PANTRY DESIGN“ zu steigern, könnte der Händler es in der Nähe von „REGENCY CAKESTAND 3 TIER“ platzieren.
Weitere Optionen für
itemFrequencyPlotfindest du hier.Regeln generieren!
Als Nächstes werden mit dem APRIORI-Algorithmus Regeln gemined. Die Funktion
apriori()stammt aus dem Paketarules.apriorierhälttrals Transaktionsobjekt, auf dem gemined wird. Überparametersetzt du min_sup und min_confidence. Standardwerte sind Support 0.1, Confidence 0.8, maximal 10 Items (maxlen).summary(association.rules)zeigt Folgendes:Parameter-Spezifikation: min_sup=0.001 und min_confidence=0.8 bei maximal 10 Items pro Regel.
Gesamtzahl der Regeln: 49122 Regeln.
Längendistribution: Länge 5 hat die meisten Regeln: 16424; Länge 2 hat am wenigsten: 105.
Qualitätsmaße: Min/Max für Support, Confidence und Lift.
Mining-Infos: Die Daten sowie Support und Confidence, die wir übergeben haben.
Da es 49122 Regeln sind, geben wir nur die Top 10 aus:
Aus dem Output lassen sich Analysen ableiten wie:
100% der Kundinnen und Kunden, die „WOBBLY CHICKEN“ kaufen, kaufen auch „METAL“.
100% der Kundinnen und Kunden, die „BLACK TEA“ kaufen, kaufen auch „SUGAR JARS“.
Anzahl und Länge der Regeln begrenzen
Wie begrenzt man Größe und Anzahl der generierten Regeln? Über die
parametersinapriori. Erhöhe z. B.conffür stärkere Regeln undmaxlenfür längere Regeln.Redundante Regeln entfernen
Du kannst Regeln entfernen, die Teilmengen größerer Regeln sind. Nutze den folgenden Code, um solche Regeln zu entfernen:
which()gibt die Positionen der Elemente im Vektor zurück, für die der Wert TRUE ist.colSums()berechnet Spaltensummen für Dataframes und numerische Arrays.is.subset()prüft, ob Elemente eines Vektors alle Elemente eines anderen enthalten.Regeln zu bestimmten Items finden
Manchmal willst du ein bestimmtes Produkt betrachten. Wenn du herausfinden willst, was den Kauf von Item X beeinflusst, kannst du die Option
appearanceinapriorinutzen. Damit legst du LHS (IF-Teil) und RHS (THEN-Teil) der Regel fest.Beispiel: Um zu sehen, was Kundinnen und Kunden vor dem Kauf von „METAL“ kaufen, führe Folgendes aus:
Umgekehrt, um die Frage Kundinnen und Kunden, die METAL gekauft haben, kauften außerdem … zu beantworten, setzt du METAL auf die lhs:
Assoziationsregeln visualisieren
Da je nach Daten Hunderte oder Tausende Regeln entstehen, brauchst du verschiedene Möglichkeiten, deine Ergebnisse zu präsentieren.
ItemFrequencyPlothaben wir bereits genutzt – ebenfalls hilfreich, um Topseller zu identifizieren.Wir betrachten folgende Visualisierungen:
Streudiagramm
Eine einfache Visualisierung von Assoziationsregeln ist das Streudiagramm mit
plot()ausarulesViz. Auf den Achsen stehen Support und Confidence. Zusätzlich wird standardmäßig die dritte Kennzahl Lift zur Einfärbung (Graustufen) der Punkte genutzt.Der Plot zeigt, dass Regeln mit hohem Lift meist geringen Support haben. Du kannst die folgenden Optionen für den Plot nutzen:
rulesObject: Das zu plottende Regelobjekt.measure: Kennzahlen für die Interessantheit der Regeln. Möglich sind Support, Confidence, Lift oder Kombinationen – abhängig vonmethod.shading: Kennzahl zur Einfärbung der Punkte (Support, Confidence, Lift). Standard ist Lift.method: Zu nutzende Visualisierung (scatterplot, two-key plot, matrix3D).Der Two-Key-Plot nutzt Support und Confidence auf x- bzw. y-Achse. Für die Farbgebung wird die Order (Anzahl Items in der Regel) verwendet.
Interaktives Streudiagramm
Eine großartige interaktive Darstellung kombiniert
arulesVizundplotly. Beim Hover siehst du alle Qualitätsmaße (Support, Confidence, Lift).Graphbasierte Visualisierungen
Graphbasierte Techniken visualisieren Assoziationsregeln mit Knoten und Kanten: Knoten sind mit Itemnamen beschriftet, Itemsets oder Regeln werden als zweite Knotenmenge dargestellt. Items sind mit Itemsets/Regeln über gerichtete Pfeile verbunden. Pfeile von Items zu Regelknoten markieren LHS-Items, ein Pfeil von einer Regel zu einem Item markiert die RHS. Größe und Farbe der Knoten repräsentieren oft Interessantheitsmaße.
Graphplots sind sehr aussagekräftig, werden aber schnell unübersichtlich, wenn die Zahl der Regeln steigt. Daher besser nur wenige Regeln graphbasiert visualisieren.
Wählen wir 10 Regeln aus
subRulesmit der höchsten Confidence.Jetzt plotten wir einen interaktiven Graphen:
Hinweis: Du kannst alle Plots interaktiv machen, indem du in
plotden Parameterengine=htmlwidgetsetzt.Mit
arulesVizkönnen Graphen von Regelsätzen als GraphML oder Graphviz dot-Dateien exportiert und z. B. in Gephi untersucht werden. Beispielsweise exportierst du die 1000 Regeln mit dem höchsten Lift so:Darstellung einzelner Regeln
Diese Darstellung heißt auch Parallel Coordinates Plot. Sie ist nützlich, um zu sehen, welche Produkte zusammen mit welchen Items welchen Effekt auf den Verkauf haben.
Wie oben erwähnt, ist die RHS der Konsequens, also das Item, dessen Kauf wir prognostizieren. Die Positionen auf der LHS zeigen die Reihenfolge: 2 ist die jüngste Ergänzung im Warenkorb, 1 das zuvor enthaltene Item.
Sieh dir den obersten Pfeil an. Er zeigt: Wenn „CHILDS GARDEN SPADE PINK“ und „CHILDS GARDEN RAKE PINK“ im Warenkorb liegen, ist es wahrscheinlich, dass auch „CHILDS GARDEN RAKE BLUE“ dazu gekauft wird.
Fazit
Glückwunsch! Du hast APRIORI kennengelernt, einen der am häufigsten genutzten Algorithmen im Data Mining. Du weißt nun, wie Assoziationsregel-Mining funktioniert, wofür es eingesetzt wird und wie es im Handel als Market Basket Analysis Anwendung findet. Außerdem kannst du die Marktkorbanalyse in R umsetzen und deine Regeln mit starken Visualisierungen präsentieren. Viel Erfolg beim Lernen!
Referenzen:
https://datascienceplus.com/a-gentle-introduction-on-market-basket-analysis%E2%80%8A-%E2%80%8Aassociation-rules/
https://en.wikipedia.org/wiki/Sparse_matrix
https://cran.r-project.org/web/packages/arulesViz/vignettes/arulesViz.pdf
Wenn du mehr über R lernen möchtest, belege den DataCamp-Kurs Importing and Managing Financial Data in R.