Lewati ke konten utama

Market Basket Analysis menggunakan R

Pelajari Market Basket Analysis & Algoritma APRIORI yang bekerja di baliknya. Anda akan melihat bagaimana ini membantu peritel meningkatkan bisnis dengan memprediksi item yang dibeli pelanggan secara bersamaan.
· 15 mnt Baca

Jelajahi bersama AI

Anda adalah seorang data scientist (atau sedang dalam proses menjadi!), dan Anda mendapat klien yang menjalankan toko ritel. Klien Anda memberi data semua transaksi yang berisi item yang dibeli di toko oleh beberapa pelanggan selama periode waktu tertentu dan meminta Anda menggunakan data tersebut untuk membantu meningkatkan bisnis mereka. Klien Anda akan menggunakan temuan Anda bukan hanya untuk mengubah/memperbarui/menambah item di inventaris, tetapi juga untuk mengubah tata letak toko fisik atau toko online. Untuk menemukan hasil yang akan membantu klien Anda, Anda akan menggunakan Market Basket Analysis (MBA) yang menggunakan Association Rule Mining pada data transaksi yang diberikan.

Dalam tutorial ini Anda akan belajar:

  • Apa itu Association Rule Mining dan Penerapannya
  • Apa itu Algoritma APRIORI?
  • Cara mengimplementasikan MBA/Association Rule Mining menggunakan R beserta Visualisasinya

Association Rule Mining

Association Rule Mining digunakan ketika Anda ingin menemukan keterkaitan antara objek yang berbeda dalam suatu himpunan, menemukan pola yang sering muncul dalam basis data transaksi, basis data relasional, atau repositori informasi lainnya. Penerapan Association Rule Mining ditemukan dalam Pemasaran, Analisis Data Keranjang (atau Market Basket Analysis) di ritel, klasterisasi, dan klasifikasi. Metode ini dapat memberi tahu Anda item apa yang sering dibeli pelanggan secara bersamaan dengan menghasilkan serangkaian aturan yang disebut Association Rules. Sederhananya, metode ini memberi keluaran berupa aturan dalam bentuk jika ini maka itu. Klien dapat menggunakan aturan tersebut untuk berbagai strategi pemasaran:

  • Mengubah tata letak toko sesuai tren
  • Analisis perilaku pelanggan
  • Perancangan katalog
  • Pemasaran silang di toko online
  • Item apa yang sedang tren dibeli pelanggan
  • Email kustom dengan penawaran tambahan

Pertimbangkan contoh berikut:

contoh

Diberikan satu set data transaksi. Anda dapat melihat transaksi bernomor 1 sampai 5. Setiap transaksi menampilkan item yang dibeli dalam transaksi tersebut. Anda dapat melihat bahwa Popok dibeli bersama Bir dalam tiga transaksi. Demikian pula, Roti dibeli bersama susu dalam tiga transaksi sehingga keduanya menjadi himpunan item yang sering muncul. Aturan asosiasi diberikan dalam bentuk seperti di bawah ini:

$A=>B[Support,Confidence]$

Bagian sebelum $=>$ disebut sebagai jika (Anteseden) dan bagian setelah $=>$ disebut sebagai maka (Konsekuen).

Di mana A dan B adalah himpunan item dalam data transaksi. A dan B adalah himpunan tak-saling-beririsan.

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

Aturan di atas menyatakan:

  1. 20% transaksi menunjukkan perangkat lunak Anti-virus dibeli bersamaan dengan pembelian Komputer
  2. 60% pelanggan yang membeli perangkat lunak Anti-virus membelinya bersama pembelian Komputer

Pada bagian berikut Anda akan mempelajari konsep dasar Association Rule Mining:

Konsep Dasar Association Rule Mining

Konsep Dasar Association Rule Mining
  1. Itemset: Kumpulan dari satu atau lebih item. K-item-set berarti himpunan dengan k item.

  2. Support Count: Frekuensi kemunculan suatu item-set

  3. Support (s): Fraksi transaksi yang memuat item-set 'X'

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

Untuk sebuah Aturan A=>B, Support diberikan oleh:

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

Catatan: P(AUB) adalah probabilitas A dan B terjadi bersamaan. P menyatakan probabilitas.

Silakan, coba cari nilai support untuk Milk=>Diaper sebagai latihan.

  1. Confidence (c): Untuk aturan A=>B Confidence menunjukkan persentase di mana B dibeli bersama A.

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

Jumlah transaksi yang memiliki A dan B dibagi dengan jumlah total transaksi yang memiliki A.

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

Sekarang cari confidence untuk Milk=>Diaper.

Catatan: Support dan Confidence mengukur seberapa menarik suatu aturan. Nilainya diatur oleh ambang minimum support dan minimum confidence. Ambang ini yang ditetapkan oleh klien membantu membandingkan kekuatan aturan sesuai keinginan Anda atau klien. Semakin mendekati ambang, semakin bermanfaat aturan tersebut bagi klien.

  1. Frequent Itemsets: Item-set yang support-nya lebih besar atau sama dengan ambang minimum support (min_sup). Pada contoh di atas min_sup=3. Ini ditentukan sesuai pilihan pengguna.

  2. Strong rules: Jika sebuah aturan A=>B[Support, Confidence] memenuhi min_sup dan min_confidence maka itu adalah aturan kuat.

  3. Lift: Lift memberikan korelasi antara A dan B dalam aturan A=>B. Korelasi menunjukkan bagaimana item-set A memengaruhi item-set B.

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

Misalnya, untuk aturan {Bread}=>{Milk}, lift dihitung sebagai:

$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$

  • Jika aturan memiliki lift 1, maka A dan B saling bebas (independen) dan tidak ada aturan yang dapat diturunkan darinya.

  • Jika lift > 1, maka A dan B saling bergantung, dan derajatnya diberikan oleh nilai lift.

  • Jika lift < 1, maka keberadaan A akan berdampak negatif pada B.

Tujuan Association Rule Mining

Saat Anda menerapkan Association Rule Mining pada himpunan transaksi T yang diberikan, tujuan Anda adalah menemukan semua aturan dengan:

  1. Support lebih besar atau sama dengan min_support
  2. Confidence lebih besar atau sama dengan min_confidence

Algoritma APRIORI

Pada bagian tutorial ini, Anda akan mempelajari tentang algoritma yang berjalan di balik pustaka R untuk Market Basket Analysis. Ini akan membantu Anda lebih memahami klien dan melakukan analisis dengan lebih cermat. Jika Anda sudah tahu tentang algoritma APRIORI dan cara kerjanya, Anda bisa langsung ke bagian kode.

Association Rule Mining dipandang sebagai pendekatan dua langkah:

  1. Frequent Itemset Generation: Temukan semua item-set yang sering muncul dengan support >= jumlah min_support yang ditentukan sebelumnya

  2. Rule Generation: Daftarkan semua Association Rules dari item-set yang sering muncul. Hitung Support dan Confidence untuk semua aturan. Pangkas aturan yang tidak memenuhi ambang min_support dan min_confidence.

Frequent Itemset Generation adalah langkah yang paling mahal secara komputasi karena memerlukan pemindaian basis data penuh.

Di antara langkah-langkah di atas, pembangkitan Frequent Item-set adalah yang paling mahal dari sisi komputasi.

Di atas Anda telah melihat contoh hanya 5 transaksi, tetapi dalam dunia nyata data transaksi untuk ritel dapat mencapai GB dan TB data sehingga dibutuhkan algoritma yang dioptimalkan untuk memangkas Item-set yang tidak akan membantu pada langkah selanjutnya. Untuk ini digunakan Algoritma APRIORI. Algoritma ini menyatakan:

Setiap subset dari suatu frequent itemset juga harus sering muncul. Dengan kata lain, tidak ada superset dari itemset yang jarang muncul yang boleh dihasilkan atau diuji

Hal ini direpresentasikan dalam Itemset Lattice yang merupakan representasi grafis dari prinsip algoritma APRIORI. Struktur ini terdiri dari node k-item-set dan relasi subset dari k-item-set tersebut.

itemset lattice

Anda dapat melihat pada gambar di atas bahwa di bagian paling bawah terdapat semua item dalam data transaksi dan kemudian Anda mulai bergerak ke atas membuat subset hingga himpunan kosong. Untuk jumlah item d, ukuran lattice akan menjadi $2^d$. Ini menunjukkan betapa sulitnya menghasilkan Frequent Item-set dengan menemukan support untuk setiap kombinasi. Gambar berikut menunjukkan seberapa besar bantuan APRIORI dalam mengurangi jumlah himpunan yang harus dihasilkan:

itemset lattice 2

Jika item-set {a,b} jarang muncul (infrequent) maka kita tidak perlu mempertimbangkan semua super-set-nya.

Mari pahami dengan contoh. Pada contoh berikut, Anda akan melihat mengapa APRIORI adalah algoritma yang efektif dan juga menghasilkan aturan asosiasi yang kuat langkah demi langkah. Ikuti dengan buku catatan dan pena Anda!

contoh

Seperti yang Anda lihat, Anda mulai dengan membuat Candidate List untuk 1-itemset yang akan menyertakan semua item yang ada di data transaksi, secara individual. Mengingat data transaksi ritel di dunia nyata, Anda dapat melihat betapa mahalnya pembangkitan kandidat ini. Di sinilah APRIORI berperan dan membantu mengurangi jumlah daftar kandidat, dan pada akhirnya aturan yang berguna dihasilkan. Pada langkah-langkah berikut, Anda akan melihat bagaimana kita mencapai akhir dari pembangkitan Frequent Itemset, yaitu langkah pertama dari association rule mining.

contoh

Langkah Anda berikutnya adalah mencantumkan semua itemset yang sering muncul. Anda akan mengambil Frequent Itemset tak-kosong terakhir, yang dalam contoh ini adalah L2={I1, I2},{I2, I3}. Lalu buat semua subset tak-kosong dari item-set yang ada pada Daftar Frequent Item-set tersebut. Ikuti seperti pada ilustrasi di bawah ini:

contoh

Anda bisa melihat di atas terdapat empat aturan kuat. Misalnya, ambil ${I2}=>I3$ yang memiliki confidence sebesar 75% menyatakan bahwa 75% orang yang membeli I2 juga membeli I3.

Sekarang Anda telah mempelajari algoritma APRIORI lengkap yang merupakan salah satu algoritma yang paling sering digunakan dalam data mining. Mari lanjut ke kodenya, phewww!

Mengimplementasikan MBA/Association Rule Mining menggunakan R

Dalam tutorial ini, Anda akan menggunakan dataset dari UCI Machine Learning Repository. Dataset tersebut bernama Online-Retail, dan Anda dapat mengunduhnya dari sini. Dataset berisi data transaksi dari 01/12/2010 hingga 09/12/2011 untuk ritel online non-toko berbasis di Inggris yang terdaftar. Alasan menggunakan ini dan bukan dataset R adalah karena Anda lebih mungkin menerima data ritel dalam bentuk ini yang memerlukan pra-pemrosesan data.

Deskripsi Dataset

  • Jumlah Baris:541909
  • Jumlah Atribut:08
Informasi Atribut
  • InvoiceNo: Nomor faktur. Nominal, angka integral 6 digit yang ditetapkan secara unik untuk setiap transaksi. Jika kode ini diawali huruf 'c', itu menunjukkan pembatalan. +StockCode: Kode produk (item). Nominal, angka integral 5 digit yang ditetapkan secara unik untuk setiap produk.
  • Description: Nama produk (item). Nominal.
  • Quantity: Kuantitas setiap produk (item) per transaksi. Numerik.
  • InvoiceDate: Tanggal dan waktu faktur. Numerik, hari dan waktu saat setiap transaksi dibuat. Contoh dari dataset: 12/1/2010 8:26
  • UnitPrice: Harga satuan. Numerik, harga produk per unit dalam pound sterling.
  • CustomerID: Nomor pelanggan. Nominal, angka integral 5 digit yang ditetapkan secara unik untuk setiap pelanggan.
  • Country: Nama negara. Nominal, nama negara tempat setiap pelanggan tinggal.

Memuat Library

Pertama, Anda akan memuat library yang diperlukan. Deskripsi singkat library (diambil dari Sini) diberikan pada tabel berikut, agar Anda tahu fungsi masing-masing library:

PaketDeskripsi
arulesMenyediakan infrastruktur untuk merepresentasikan, memanipulasi, dan menganalisis data transaksi dan pola (frequent itemsets dan association rules).
arulesVizMemperluas paket 'arules' dengan berbagai teknik visualisasi untuk association rules dan item-sets. Paket ini juga mencakup beberapa visualisasi interaktif untuk eksplorasi aturan.
tidyverseTidyverse adalah kumpulan paket R berpendapat yang dirancang untuk ilmu data
readxlMembaca File Excel di R
plyrAlat untuk Memisah, Menerapkan, dan Menggabungkan Data
ggplot2Membuat grafik dan bagan
knitrPembuatan Laporan Dinamis di R
lubridateLubridate adalah paket R yang mempermudah bekerja dengan tanggal dan waktu.
#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)

Pra-pemrosesan Data

Gunakan read_excel(path to file) untuk membaca dataset dari file yang diunduh ke dalam R. Berikan path lengkap ke file termasuk nama file dalam 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)

Catatan: Halaman 1 dari 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...

Sekarang, dataframe retail akan berisi 10 atribut, dengan dua atribut tambahan Date dan Time.

Sebelum menerapkan MBA/Association Rule mining, kita perlu mengonversi dataframe menjadi data transaksi sehingga semua item yang dibeli bersama dalam satu faktur berada dalam satu baris. Anda dapat melihat pada keluaran glimpse bahwa setiap transaksi berbentuk atomik, yaitu semua produk yang termasuk dalam satu faktur bersifat atomik seperti pada basis data relasional. Format ini juga disebut sebagai format singles.

Yang perlu Anda lakukan adalah mengelompokkan data dalam dataframe retail berdasarkan CustomerID, CustomerID dan Date atau Anda juga dapat mengelompokkan data menggunakan InvoiceNo dan Date. Kita memerlukan pengelompokan ini dan menerapkan sebuah fungsi padanya serta menyimpan keluarannya di dataframe lain. Ini dapat dilakukan dengan ddply.

Baris-baris kode berikut akan menggabungkan semua produk dari satu InvoiceNo dan date serta menggabungkan semua produk dari InvoiceNo dan date tersebut sebagai satu baris, dengan setiap item dipisahkan oleh ,

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

Catatan: Halaman 1 dari 100.

Berikutnya, karena InvoiceNo dan Date tidak akan berguna dalam rule mining, Anda dapat mengaturnya menjadi 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

Catatan: Halaman 1 dari 100.

Format untuk data transaksi ini disebut format basket. Selanjutnya, Anda harus menyimpan data transaksi ini ke dalam file .csv (Comma Separated Values). Untuk ini, gunakan 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.

Lihat apakah data transaksi Anda sudah dalam bentuk yang benar:

data transaksi

Selanjutnya, Anda harus memuat data transaksi ini ke dalam sebuah objek dari kelas transaksi. Ini dilakukan dengan menggunakan fungsi R read.transactions dari paket arules.

Baris kode berikut akan mengambil file data transaksi D:/Documents/market_basket_transactions.csv yang berformat basket dan mengonversinya menjadi objek dari kelas transaksi.

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 ','

Saat Anda menjalankan baris kode di atas Anda mungkin mendapatkan banyak EOF within quoted string dalam output Anda, jangan khawatir soal itu.

Jika Anda sudah memiliki data transaksi dalam sebuah dataframe, gunakan baris kode berikut untuk mengonversinya menjadi objek transaksi:

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

Lihat objek transaksi 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) adalah perintah yang sangat berguna yang memberi kita informasi tentang objek transaksi kita. Mari lihat apa yang dikatakan keluaran di atas:

  • Ada 22191 transaksi (baris) dan 7876 item (kolom). Perhatikan bahwa 7876 adalah deskripsi produk yang terlibat dalam dataset dan 22191 transaksi adalah kumpulan dari item-item tersebut.

  • Density menunjukkan persentase sel tak-nol dalam matriks jarang (sparse matrix). Anda bisa mengartikannya sebagai total jumlah item yang dibeli dibagi dengan jumlah item yang mungkin dalam matriks itu. Anda dapat menghitung berapa banyak item yang dibeli menggunakan density: 22191x7876x0.001930725=337445

Informasi! Sparse Matrix: Sparse matrix atau sparse array adalah matriks di mana sebagian besar elemennya bernilai nol. Sebaliknya, jika sebagian besar elemennya non-nol, maka matriks dianggap padat (dense). Jumlah elemen bernilai nol dibagi dengan jumlah total elemen disebut sparsity matriks (yang sama dengan 1 dikurangi density matriks).

  • Ringkasan juga dapat memberi tahu Anda item yang paling sering.

  • Distribusi panjang elemen (itemset/transaksi): Ini memberi tahu Anda ada berapa transaksi untuk 1-itemset, 2-itemset, dan seterusnya. Baris pertama menunjukkan jumlah item dan baris kedua menunjukkan jumlah transaksi.

Misalnya, hanya ada 3598 transaksi untuk satu item, 1594 transaksi untuk 2 item, dan ada 419 item dalam satu transaksi yang merupakan yang terpanjang.

Anda dapat membuat itemFrequencyPlot untuk membuat Plot Batang Frekuensi Item guna melihat distribusi objek berdasarkan itemMatrix (mis., >transactions atau item dalam >itemsets dan >rules) yang merupakan kasus kita.

# 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")
plot frekuensi item absolut

Dalam 

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

argumen pertama adalah objek transaksi yang akan diplot yaitu tr. topN memungkinkan Anda memplot N item dengan frekuensi tertinggi. type bisa berupa type="absolute" atau type="relative". Jika absolut, itu akan memplot frekuensi numerik setiap item secara independen. Jika relatif, itu akan memplot seberapa sering item tersebut muncul dibandingkan dengan yang lain.

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

Plot ini menunjukkan bahwa 'WHITE HANGING HEART T-LIGHT HOLDER' dan 'REGENCY CAKESTAND 3 TIER' memiliki penjualan terbanyak. Jadi untuk meningkatkan penjualan 'SET OF 3 CAKE TINS PANTRY DESIGN' peritel dapat menempatkannya dekat 'REGENCY CAKESTAND 3 TIER'.

Anda dapat mengeksplorasi opsi lain untuk itemFrequencyPlot di sini.

Membuat Aturan!

Langkah berikutnya adalah menambang aturan menggunakan algoritma APRIORI. Fungsi apriori() berasal dari 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))
 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 akan menerima tr sebagai objek transaksi yang akan ditambang. parameter memungkinkan Anda menetapkan min_sup dan min_confidence. Nilai default untuk parameter adalah minimum support 0.1, minimum confidence 0.8, maksimum 10 item (maxlen).

summary(association.rules) menunjukkan hal-hal berikut:

  • Spesifikasi Parameter: nilai min_sup=0.001 dan min_confidence=0.8 dengan maksimum 10 item dalam sebuah aturan.

  • Jumlah total aturan: Himpunan berisi 49122 aturan

  • Distribusi panjang aturan: Panjang 5 item memiliki aturan terbanyak: 16424 dan panjang 2 item memiliki jumlah aturan paling sedikit:105

  • Ringkasan ukuran Kualitas: Nilai minimum dan maksimum untuk Support, Confidence, dan Lift.

  • Informasi yang digunakan untuk membuat aturan: Data, support, dan confidence yang kita berikan ke algoritma.

Karena ada 49122 aturan, mari cetak 10 teratas saja:

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 

Menggunakan keluaran di atas, Anda dapat membuat analisis seperti:

  • 100% pelanggan yang membeli 'WOBBLY CHICKEN' juga membeli 'METAL'.

  • 100% pelanggan yang membeli 'BLACK TEA' juga membeli 'SUGAR JARS'.

Membatasi jumlah dan ukuran aturan serta

Bagaimana Anda dapat membatasi ukuran dan jumlah aturan yang dihasilkan? Anda dapat melakukannya dengan menetapkan parameters di apriori. Anda menetapkan parameter ini untuk menyesuaikan jumlah aturan yang akan Anda dapatkan. Jika Anda menginginkan aturan yang lebih kuat, Anda dapat meningkatkan nilai conf dan untuk aturan yang lebih panjang berikan nilai yang lebih tinggi pada maxlen.

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

Menghapus aturan yang redundan

Anda dapat menghapus aturan yang merupakan subset dari aturan yang lebih besar. Gunakan kode di bawah ini untuk menghapus aturan tersebut:

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() mengembalikan posisi elemen dalam vektor untuk nilai yang bernilai TRUE.

  • colSums() membentuk jumlah baris dan kolom untuk dataframe dan array numerik.

  • is.subset() Menentukan apakah elemen dari satu vektor memuat semua elemen dari yang lain

Terkadang, Anda ingin bekerja pada produk tertentu. Jika Anda ingin mengetahui apa yang memengaruhi pembelian item X Anda dapat menggunakan opsi appearance pada perintah apriori. appearance memberi kita opsi untuk mengatur LHS (bagian IF) dan RHS (bagian THEN) dari aturan.

Misalnya, untuk mengetahui apa yang dibeli pelanggan sebelum membeli 'METAL' jalankan baris kode berikut:

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 

Demikian pula, untuk menemukan jawaban atas pertanyaan Pelanggan yang membeli METAL juga membeli.... Anda akan menempatkan METAL di 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 

Memvisualisasikan Association Rules

Karena akan ada ratusan atau ribuan aturan yang dihasilkan berdasarkan data, Anda memerlukan beberapa cara untuk menyajikan temuan Anda. ItemFrequencyPlot sudah dibahas di atas yang juga merupakan cara bagus untuk mendapatkan item terlaris.

Berikut visualisasi yang akan dibahas:

  • Scatter-Plot
  • Interactive Scatter-plot
  • Representasi Aturan Individual

Scatter-Plot

Visualisasi langsung dari association rules adalah menggunakan scatter plot dengan plot() dari paket arulesViz. Plot ini menggunakan Support dan Confidence pada sumbu. Selain itu, ukuran ketiga Lift secara bawaan digunakan untuk pewarnaan (tingkat abu-abu) titik.

# 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

Plot di atas menunjukkan bahwa aturan dengan lift tinggi memiliki support rendah. Anda dapat menggunakan opsi berikut untuk plot:

plot(rulesObject, measure, shading, method)
  • rulesObject: objek aturan yang akan diplot

  • measure: Ukuran ketertarikan aturan. Dapat berupa Support, Confidence, lift atau kombinasi tergantung nilai method.

  • shading: Ukuran yang digunakan untuk mewarnai titik (Support, Confidence, lift). Bawaannya adalah Lift.

  • method: Metode visualisasi yang akan digunakan (scatterplot, two-key plot, matrix3D).

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

Two-key plot menggunakan support dan confidence pada sumbu x dan y. Plot ini menggunakan order untuk pewarnaan. Order adalah jumlah item dalam aturan.

Interactive Scatter-Plot

Plot interaktif yang luar biasa dapat digunakan untuk menyajikan aturan Anda yang menggunakan arulesViz dan plotly. Anda dapat mengarahkan kursor pada setiap aturan dan melihat semua ukuran kualitas (support, confidence, dan 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.

Visualisasi Berbasis Grafik

Teknik berbasis grafik memvisualisasikan association rules menggunakan simpul dan sisi, di mana simpul diberi label dengan nama item, dan item set atau aturan direpresentasikan sebagai himpunan simpul kedua. Item dihubungkan dengan item-set/aturan menggunakan panah terarah. Panah yang menunjuk dari item ke simpul aturan menunjukkan item LHS dan panah dari aturan ke item menunjukkan RHS. Ukuran dan warna simpul sering mewakili ukuran ketertarikan.

Plot grafik sangat bagus untuk memvisualisasikan aturan tetapi cenderung menjadi padat ketika jumlah aturan meningkat. Jadi lebih baik memvisualisasikan aturan dalam jumlah sedikit dengan visualisasi berbasis grafik.

Mari pilih 10 aturan dari subRules yang memiliki confidence tertinggi.

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

Sekarang, plot grafik interaktif:

Catatan: Anda dapat membuat semua plot interaktif menggunakan parameter engine=htmlwidget pada plot

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

Dari arulesViz grafik untuk himpunan association rules dapat diekspor dalam format GraphML atau sebagai file Graphviz dot untuk dieksplorasi di alat seperti Gephi. Misalnya, 1000 aturan dengan lift tertinggi diekspor dengan:

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

Representasi Aturan Individual

Representasi ini juga disebut sebagai Parallel Coordinates Plot. Ini berguna untuk memvisualisasikan produk mana bersama item mana yang menyebabkan jenis penjualan tertentu.

Seperti disebutkan di atas, RHS adalah Konsekuen atau item yang kita perkirakan akan dibeli pelanggan; posisinya berada di LHS di mana 2 adalah penambahan terbaru ke keranjang kita dan 1 adalah item yang sebelumnya kita miliki.

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

Lihat panah paling atas. Itu menunjukkan bahwa ketika saya memiliki 'CHILDS GARDEN SPADE PINK' dan 'CHILDS GARDEN RAKE PINK' di keranjang belanja saya, saya cenderung membeli 'CHILDS GARDEN RAKE BLUE' bersama keduanya juga.

Kesimpulan

Selamat! Anda telah mempelajari APRIORI, salah satu algoritma yang paling sering digunakan dalam data mining. Anda telah mempelajari semua tentang Association Rule Mining, penerapannya, dan penerapannya dalam ritel yang disebut Market Basket Analysis. Anda sekarang juga mampu mengimplementasikan Market Basket Analysis di R dan menyajikan association rules Anda dengan beberapa plot yang hebat! Selamat belajar!

Referensi:

  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

Jika Anda ingin mempelajari lebih lanjut tentang R, ikuti kursus DataCamp Importing and Managing Financial Data in R.

Topik

Terkait

blogs

Tutorial Korelasi di R

blogs

Spaghetti Plot dan Jalur Badai

blogs

40 Pertanyaan Wawancara DBMS Teratas di 2026