Analiza reguł asocjacyjnych jest jednym z kluczowych podejść w analizie koszyków zakupowych, umożliwiającym identyfikację produktów, które są często kupowane razem. W tym projekcie analizujemy dane transakcyjne przy użyciu algorytmu Apriori w celu odkrycia reguł asocjacyjnych. Reguły asocjacyjne pozwalają zrozumieć, które produkty są ze sobą powiązane, co jest pomocne w tworzeniu strategii marketingowych, rekomendacjach produktowych, czy organizacji przestrzeni sklepowej.
Dane pochodziły z pliku AssociationAlgorithm.csv z platformy Kaggle, który zawiera informacje o transakcjach zakupowych w sklepie. Moim celem jest wydobycie reguł, które wskazują, jakie produkty najczęściej pojawiają się razem w koszykach zakupowych klientów.
Celem projektu jest analiza danych transakcyjnych za pomocą algorytmu Apriori, który służy do wykrywania reguł asocjacyjnych. W szczególności:
Identyfikacja powiązań między produktami - Chcemy znaleźć produkty, które są często kupowane razem.
Wykrycie najistotniejszych reguł - Wyszukam reguły z wysokim support i confidence, które pokazują silne powiązania między produktami.
Wizualizacja wyników - Użyję wykresów i tabel, aby przedstawić wyniki w przystępnej formie.
Na początku musimy załadować dane i przygotować je do analizy. Wczytujemy plik CSV, który zawiera dane transakcyjne, a następnie przekształcamy dane do formatu transactions, który jest wymagany przez algorytm Apriori.
# Wczytanie danych
data <- read.csv("/Users/gabisztuka/Desktop/maszynowe/AssociationAlgorithm.csv", stringsAsFactors = TRUE)
# Sprawdzanie danych
head(data)
## Transaction.ID Items
## 1 1 bread, milk, eggs
## 2 2 bread, juice, butter
## 3 3 milk, eggs, butter
## 4 4 bread, milk
## 5 5 bread, eggs
## 6 6 juice, butter
Plik zawiera dwie kolumny: Transaction.ID: identyfikator transakcji, Items: lista produktów zakupionych w danej transakcji, rozdzielona przecinkami. Następnie rozdzielamy produkty w kolumnie Items na pojedyncze elementy i konwertujemy je do formatu transakcji.
# Rozdzielanie produktów na pojedyncze przedmioty
data$Items <- strsplit(as.character(data$Items), split = ", ")
# Tworzenie transakcji
trans <- as(data$Items, "transactions")
summary(trans)
## transactions as itemMatrix in sparse format with
## 20 rows (elements/itemsets/transactions) and
## 5 columns (items) and a density of 0.46
##
## most frequent items:
## bread eggs juice milk butter (Other)
## 11 9 9 9 8 0
##
## element (itemset/transaction) length distribution:
## sizes
## 1 2 3
## 3 8 9
##
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1.0 2.0 2.0 2.3 3.0 3.0
##
## includes extended item information - examples:
## labels
## 1 bread
## 2 butter
## 3 eggs
Po załadowaniu danych warto przeprowadzić krótką analizę eksploracyjną. Możemy sprawdzić, jakie produkty występują najczęściej w transakcjach, co da nam wstępny obraz struktury danych.
# Wykres najczęstszych produktów
itemFrequencyPlot(trans, topN = 10, type = "absolute", main = "Top 10 Products")
Z wykresu możemy wyciągnąć pierwsze wnioski na temat popularności produktów w transakcjach.
Do wykrywania reguł asocjacyjnych zastosujemy algorytm Apriori. Kluczowymi parametrami w tym algorytmie są: support: minimalny poziom wsparcia reguły, określający, jak często produkt (lub zestaw produktów) występuje w transakcjach. confidence: minimalny poziom pewności reguły, mówiący o tym, jak często reguła jest prawdziwa, gdy lewa strona jest obecna w transakcji. Zastosujemy próg support = 0.01 (1%) oraz confidence = 0.5 (50%).
# Wykrywanie reguł asocjacyjnych
rules <- apriori(trans, parameter = list(supp = 0.01, conf = 0.5, target = "rules"))
## Apriori
##
## Parameter specification:
## confidence minval smax arem aval originalSupport maxtime support minlen
## 0.5 0.1 1 none FALSE TRUE 5 0.01 1
## maxlen target ext
## 10 rules TRUE
##
## Algorithmic control:
## filter tree heap memopt load sort verbose
## 0.1 TRUE TRUE FALSE TRUE 2 TRUE
##
## Absolute minimum support count: 0
##
## set item appearances ...[0 item(s)] done [0.00s].
## set transactions ...[5 item(s), 20 transaction(s)] done [0.00s].
## sorting and recoding items ... [5 item(s)] done [0.00s].
## creating transaction tree ... done [0.00s].
## checking subsets of size 1 2 3 done [0.00s].
## writing ... [10 rule(s)] done [0.00s].
## creating S4 object ... done [0.00s].
# Podsumowanie reguł
summary(rules)
## set of 10 rules
##
## rule length distribution (lhs + rhs):sizes
## 1 2 3
## 1 4 5
##
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1.0 2.0 2.5 2.4 3.0 3.0
##
## summary of quality measures:
## support confidence coverage lift
## Min. :0.05 Min. :0.5000 Min. :0.100 Min. :0.9091
## 1st Qu.:0.10 1st Qu.:0.5000 1st Qu.:0.150 1st Qu.:0.9318
## Median :0.15 Median :0.5528 Median :0.300 Median :1.0101
## Mean :0.19 Mean :0.5550 Mean :0.345 Mean :1.0293
## 3rd Qu.:0.25 3rd Qu.:0.5556 3rd Qu.:0.450 3rd Qu.:1.0859
## Max. :0.55 Max. :0.6667 Max. :1.000 Max. :1.2121
## count
## Min. : 1.0
## 1st Qu.: 2.0
## Median : 3.0
## Mean : 3.8
## 3rd Qu.: 5.0
## Max. :11.0
##
## mining info:
## data ntransactions support confidence
## trans 20 0.01 0.5
## call
## apriori(data = trans, parameter = list(supp = 0.01, conf = 0.5, target = "rules"))
Po wykryciu reguł możemy je posortować według lift, który pokazuje siłę związku między przedmiotami w porównaniu do ich przypadkowego wystąpienia.
# Wyświetlanie reguł posortowanych według lift
inspect(head(sort(rules, by = "lift"), 10))
## lhs rhs support confidence coverage lift count
## [1] {butter, juice} => {bread} 0.10 0.6666667 0.15 1.2121212 2
## [2] {eggs, milk} => {bread} 0.10 0.6666667 0.15 1.2121212 2
## [3] {bread, butter} => {juice} 0.10 0.5000000 0.20 1.1111111 2
## [4] {juice} => {bread} 0.25 0.5555556 0.45 1.0101010 5
## [5] {eggs} => {bread} 0.25 0.5555556 0.45 1.0101010 5
## [6] {milk} => {bread} 0.25 0.5555556 0.45 1.0101010 5
## [7] {} => {bread} 0.55 0.5500000 1.00 1.0000000 11
## [8] {butter} => {bread} 0.20 0.5000000 0.40 0.9090909 4
## [9] {eggs, juice} => {bread} 0.05 0.5000000 0.10 0.9090909 1
## [10] {juice, milk} => {bread} 0.05 0.5000000 0.10 0.9090909 1
Aby lepiej zrozumieć, jakie reguły zostały wykryte, stworzymy kilka wizualizacji:
Za pomocą funkcji inspectDT() tworzymy interaktywną tabelę, która umożliwia łatwe przeglądanie i filtrowanie reguł.
inspectDT(rules)
Reguły asocjacyjne możemy również przedstawić w formie grafu, gdzie węzły to produkty, a krawędzie to reguły między nimi. Używamy do tego funkcji plot() z pakietu arulesViz.
# Wizualizacja reguł w formie grafu
plot(rules, method = "graph", engine = "htmlwidget")
Wykres Support vs Lift pozwala zobaczyć, które reguły są najbardziej interesujące w kontekście częstotliwości i wzmocnienia powiązań.
# Wizualizacja reguł: Support vs Lift
plot(rules, measure = c("support", "lift"), shading = "confidence", main = "Support vs Lift of Rules", jitter = TRUE)
Wnioski: Reguły w prawym górnym rogu wykresu Support vs Lift są najbardziej interesujące, ponieważ mają zarówno wysokie support, jak i wysoki lift, co oznacza, że te reguły są jednocześnie częste i silnie powiązane. Reguły w lewym dolnym rogu mają niski lift, co oznacza, że ich zależność między produktami jest słaba, pomimo tego, że są częste. Takie reguły mogą być mniej interesujące w kontekście marketingowym.
Zamiast typowej heatmapy, która pokazywałaby wszystkie produkty w jednym obrazie, tworzymy macierz współwystępowania produktów. Macierz ta wskazuje, które produkty są najczęściej kupowane razem, a jej wizualizacja może pomóc w identyfikacji silnych powiązań między produktami.
# Stworzenie macierzy współwystępowania produktów
co_occurrence_matrix <- crossTable(trans, measure = "support", sort = TRUE)
# Wizualizacja współwystępowania produktów w formie heatmapy
ggplot(as.data.frame(as.table(co_occurrence_matrix)), aes(Var1, Var2, fill = Freq)) +
geom_tile() +
scale_fill_gradient(low = "white", high = "blue") +
theme_minimal() +
labs(title = "Co-occurrence Matrix of Items", x = "Items", y = "Items") +
theme(axis.text.x = element_text(angle = 90, hjust = 1))
Ciemniejsze komórki na heatmapie wskazują na silne powiązania między produktami.
Na podstawie przeprowadzonej analizy reguł asocjacyjnych, możemy wyciągnąć następujące wnioski:
Produkty często występujące razem: Wykryte reguły asocjacyjne pozwalają zrozumieć, które produkty są najczęściej kupowane razem, co może pomóc w tworzeniu skuteczniejszych promocji, ustawieniu produktów w sklepie lub w strategiach cross-sellingowych.
Reguły z wysokim lift: Reguły o wysokim lift wskazują na silne zależności między produktami, które są bardziej prawdopodobne, niż wynikałoby to z przypadku. Tego typu reguły mogą stanowić podstawę dla zaawansowanych rekomendacji produktowych.
Analiza współwystępowania: Macierz współwystępowania pokazała nam, które produkty są najczęściej kupowane razem, umożliwiając analizę, która może być wykorzystywana w planowaniu ofert promocyjnych lub ustawieniu produktów w sklepie.
Projekt wykorzystujący algorytm Apriori pozwolił na wykrycie reguł asocjacyjnych w danych transakcyjnych, które mogą służyć do optymalizacji działań marketingowych i organizacyjnych w sklepach. Wizualizacje, takie jak wykresy graficzne i interaktywne tabele, umożliwiają lepsze zrozumienie wykrytych reguł oraz pozwalają na bardziej intuicyjne przeglądanie wyników analizy.