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.

Cel projektu

Celem projektu jest analiza danych transakcyjnych za pomocą algorytmu Apriori, który służy do wykrywania reguł asocjacyjnych. W szczególności:

  1. Identyfikacja powiązań między produktami - Chcemy znaleźć produkty, które są często kupowane razem.

  2. Wykrycie najistotniejszych reguł - Wyszukam reguły z wysokim support i confidence, które pokazują silne powiązania między produktami.

  3. 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.

Wydobywanie reguł asocjacyjnych

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

Wizualizacja wyników

Aby lepiej zrozumieć, jakie reguły zostały wykryte, stworzymy kilka wizualizacji:

Interaktywna tabela reguł

Za pomocą funkcji inspectDT() tworzymy interaktywną tabelę, która umożliwia łatwe przeglądanie i filtrowanie reguł.

inspectDT(rules)

Wizualizacja reguł w formie grafu

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")

Wizualizacja reguł: Support vs Lift

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.

Analiza współwystępowania produktów

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.

Wnioski

Na podstawie przeprowadzonej analizy reguł asocjacyjnych, możemy wyciągnąć następujące wnioski:

  1. 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.

  2. 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.

  3. 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.

Podsumowanie

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.