Ana içeriğe geç

R kullanarak Market Sepeti Analizi

Market Sepeti Analizi ve arka planda çalışan APRIORI Algoritmasını öğrenin. Perakendecilerin müşterilerin birlikte satın aldığı ürünleri öngörerek işleri nasıl büyüttüğünü göreceksiniz.
· 15 dk. oku

Yapay Zeka ile Keşfedin

Bir veri bilimcisiniz (ya da olmak üzeresiniz!) ve bir perakende mağazası işleten bir müşteriyle çalışıyorsunuz. Müşteriniz size, belirli bir zaman aralığında çeşitli müşterilerin mağazadan satın aldığı ürünlerden oluşan tüm işlemlere ait verileri veriyor ve bu verileri kullanarak işlerini büyütmelerine yardımcı olmanızı istiyor. Müşteriniz bulgularınızı yalnızca stoktaki ürünleri değiştirmek/güncellemek/eklemek için değil, fiziksel mağazanın ya da çevrimiçi mağazanın yerleşimini değiştirmek için de kullanacak. Müşterinize yardımcı olacak sonuçları bulmak için, verilen işlem verileri üzerinde Birliktelik Kuralı Madenciliği kullanan Market Sepeti Analizi (MBA) uygulayacaksınız.

Bu eğitimde şunları öğreneceksiniz:

  • Birliktelik Kuralı Madenciliği nedir ve nerelerde kullanılır
  • APRIORI Algoritması nedir?
  • R ile görselleştirmeler kullanarak MBA/Birliktelik Kuralı Madenciliği nasıl uygulanır

Birliktelik Kuralı Madenciliği

Birliktelik Kuralı Madenciliği, bir kümedeki farklı nesneler arasında ilişki bulmak, bir işlem veritabanında, ilişkisel veritabanlarında veya diğer bilgi depolarında sık örüntüler bulmak istediğinizde kullanılır. Birliktelik Kuralı Madenciliğinin uygulamaları; Pazarlama, Sepet Verisi Analizi (ya da Market Sepeti Analizi), kümeleme ve sınıflandırmada karşımıza çıkar. Birliktelik Kuralları adı verilen kural setleri üreterek müşterilerin hangi ürünleri birlikte sıkça satın aldığını söyleyebilir. Basitçe ifade etmek gerekirse, çıktıyı eğer bu ise o halde şu biçiminde kurallar hâlinde verir. Müşteriler bu kuralları çok sayıda pazarlama stratejisi için kullanabilir:

  • Mağaza yerleşimini trendlere göre değiştirme
  • Müşteri davranışı analizi
  • Katalog tasarımı
  • Çevrimiçi mağazalarda çapraz pazarlama
  • Müşterilerin satın aldığı trend ürünler nelerdir
  • Ek satış içeren kişiselleştirilmiş e-postalar

Şu örneği ele alın:

example

Verilen bir işlem veri kümesi var. 1’den 5’e numaralanmış işlemleri görebilirsiniz. Her işlem, o işlemde satın alınan ürünleri gösteriyor. Bez bebek bezi ile Bira’nın üç işlemde birlikte alındığını görebilirsiniz. Benzer şekilde Ekmek ile Süt’ün üç işlemde birlikte alındığını görürüz; bu da onları sık öğe kümeleri yapar. Birliktelik kuralları aşağıdaki biçimde verilir:

$A=>B[Support,Confidence]$

$=>$ öncesindeki kısım eğer (Öncül), $=>$ sonrasındaki kısım ise o halde (Ardıl) olarak adlandırılır.

Burada A ve B, işlem verilerindeki öğe kümeleridir. A ve B ayrık kümelerdir.

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

Yukarıdaki kural şunu söyler:

  1. İşlemlerin %20’sinde Bilgisayar satın alımıyla birlikte Antivirüs yazılımı da alınmıştır
  2. Antivirüs yazılımı satın alan müşterilerin %60’ında bu alışveriş Bilgisayar alımıyla birliktedir

İzleyen bölümde Birliktelik Kuralı Madenciliğinin temel kavramlarını öğreneceksiniz:

Birliktelik Kuralı Madenciliğinin Temel Kavramları

Basic Concepts of Association Rule Mining
  1. Öğe kümesi (Itemset): Bir veya daha fazla öğenin bir araya gelmesi. K-öğe-kümesi, k öğeden oluşan küme demektir.

  2. Destek Sayısı (Support Count): Bir öğe kümesinin görülme sıklığı

  3. Destek (s): 'X' öğe kümesini içeren işlemlerin oranı

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

Bir A=>B kuralı için Destek şöyle verilir:

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

Not: P(AUB), A ve B’nin birlikte gerçekleşme olasılığıdır. P, olasılığı gösterir.

Alıştırma olarak Süt=>Bebek Bezi için desteği bulmayı deneyin.

  1. Güven (c): A=>B kuralı için Güven, B’nin A ile birlikte alınma yüzdesini gösterir.

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

Hem A hem B’nin bulunduğu işlem sayısının, A’nın bulunduğu toplam işlem sayısına bölünmesi.

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

Şimdi Süt=>Bebek Bezi için güveni bulun.

Not: Destek ve Güven, kuralın ne kadar ilgi çekici olduğunu ölçer. Asgari destek ve asgari güven eşiklerine göre belirlenir. Müşteri tarafından belirlenen bu eşikler, kuralın gücünü sizin ya da müşterinizin tercihine göre karşılaştırmaya yardımcı olur. Eşiğe ne kadar yakınsa, kural müşteriye o kadar faydalıdır.

  1. Sık Öğe Kümeleri: Desteği asgari destek eşiğine (min_sup) eşit veya ondan büyük olan öğe kümeleri. Yukarıdaki örnekte min_sup=3. Bu, kullanıcı tercihiyle belirlenir.

  2. Güçlü kurallar: A=>B[Support, Confidence] kuralı min_sup ve min_confidence şartlarını sağlıyorsa güçlü kuraldır.

  3. Kaldıraç (Lift): A=>B kuralındaki A ve B arasındaki korelasyonu verir. Korelasyon, bir A öğe kümesinin B öğe kümesi üzerindeki etkisini gösterir.

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

Örneğin, {Bread}=>{Milk} kuralı için kaldıraç şöyle hesaplanır:

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

  • Kuralın kaldıracı 1 ise A ve B bağımsızdır ve onlardan kural türetilemez.

  • Kaldıraç > 1 ise A ve B birbirine bağımlıdır; bağımlılığın derecesi lift değeriyle verilir.

  • Kaldıraç < 1 ise A’nın varlığı B üzerinde olumsuz etkiye sahiptir.

Birliktelik Kuralı Madenciliğinin Amacı

Verilen bir T işlem kümesine Birliktelik Kuralı Madenciliği uyguladığınızda amacınız şu kuralları bulmaktır:

  1. Asgari desteğe eşit veya ondan büyük Destek
  2. Asgari güvene eşit veya ondan büyük Güven

APRIORI Algoritması

Bu bölümde, Market Sepeti Analizi için R kütüphanelerinin arka planında çalışan algoritmayı öğreneceksiniz. Bu, müşterilerinizi daha iyi anlamanıza ve analizi daha dikkatli yapmanıza yardımcı olur. APRIORI algoritmasını ve nasıl çalıştığını zaten biliyorsanız, kodlama bölümüne geçebilirsiniz.

Birliktelik Kuralı Madenciliği iki aşamalı bir yaklaşım olarak görülür:

  1. Sık Öğe Kümesi Üretimi: Önceden belirlenmiş min_support sayısından büyük veya ona eşit desteğe sahip tüm sık öğe kümelerini bulun

  2. Kural Üretimi: Sık öğe kümelerinden tüm Birliktelik Kurallarını listeleyin. Tüm kurallar için Destek ve Güveni hesaplayın. min_support ve min_confidence eşiklerini sağlamayan kuralları budayın.

Sık Öğe Kümesi Üretimi tam veritabanı taraması gerektirdiği için hesaplama açısından en maliyetli adımdır.

Yukarıdaki adımlar arasında hesaplama açısından en maliyetli olanı Sık Öğe Kümesi üretimidir.

Yukarıda yalnızca 5 işlemden oluşan bir örnek gördünüz; ancak gerçek dünyada perakende işlem verileri GB’lar ve TB’lar seviyesine çıkabilir. Bu nedenle sonraki adımlarda işe yaramayacak öğe kümelerini elemek için optimize edilmiş bir algoritmaya ihtiyaç vardır. Bunun için APRIORI Algoritması kullanılır. Şöyle der:

Sık bir öğe kümesinin her alt kümesi de sık olmalıdır. Başka bir deyişle, Sık olmayan bir öğe kümesinin hiçbir üst kümesi üretilmemeli veya test edilmemelidir

Bu ilke, APRIORI algoritması prensibinin görsel bir temsili olan Öğe Kümesi Kafesi (Itemset Lattice) ile gösterilir. k-öğe-kümesi düğümlerinden ve o k-öğe-kümesinin alt küme ilişkilerinden oluşur.

itemset lattice

Yukarıdaki şekilde, en altta işlem verilerindeki tüm öğeleri görürsünüz ve ardından boş kümeye kadar alt kümeler oluşturarak yukarı doğru ilerlersiniz. d adet öğe için kafesin boyutu $2^d$ olur. Bu, her kombinasyon için destek bularak Sık Öğe Kümesi üretmenin ne kadar zor olacağını gösterir. Aşağıdaki şekil, APRIORI’nin üretilmesi gereken küme sayısını ne kadar azalttığını gösterir:

itemset lattice 2

{a,b} öğe kümesi sık değilse, tüm üst kümelerini dikkate almamız gerekmez.

Bunu bir örnekle anlayalım. Aşağıdaki örnekte, APRIORI’nin neden etkili bir algoritma olduğunu görecek ve ayrıca adım adım güçlü birliktelik kuralları üreteceksiniz. Not defteriniz ve kaleminizle eşlik edin!

example

Gördüğünüz gibi, işlem verilerinde yer alan tüm öğeleri tek tek içerecek şekilde 1-öğe-kümesi için Aday Listesi oluşturarak başlıyorsunuz. Gerçek dünyadaki perakende işlem verilerini düşündüğünüzde, bu aday üretiminin ne kadar maliyetli olabileceğini görebilirsiniz. Burada APRIORI devreye girer; Aday listesinin sayısını azaltmaya yardımcı olur ve sonunda kullanışlı kurallar üretilir. İzleyen adımlarda, Birliktelik kuralı madenciliğinin ilk adımı olan Sık Öğe Kümesi üretiminin sonuna nasıl ulaştığımızı göreceksiniz.

example

Bir sonraki adımınız tüm sık öğe kümelerini listelemek olacak. Bu örnekte L2={I1, I2},{I2, I3} olan son boş olmayan Sık Öğe Kümesini alacaksınız. Ardından, bu Sık Öğe Kümesi Listesinde yer alan öğe kümelerinin tüm boş olmayan alt kümelerini yapın. Aşağıdaki görselde gösterildiği gibi ilerleyin:

example

Yukarıda dört güçlü kural olduğunu görebilirsiniz. Örneğin, güveni %75 olan ${I2}=>I3$ kuralı, I2 satın alanların %75’inin I3’ü de satın aldığını söyler.

Artık veri madenciliğinde en çok kullanılan algoritmalardan biri olan APRIORI algoritmasını baştan sona öğrendiniz. Hadi koda geçelim, ohhh!

R kullanarak MBA/Birliktelik Kuralı Madenciliğinin uygulanması

Bu eğitimde UCI Machine Learning Repository’den bir veri kümesi kullanacaksınız. Veri kümesinin adı Online-Retail ve buradan indirebilirsiniz. Veri kümesi, 01/12/2010 ile 09/12/2011 tarihleri arasında Birleşik Krallık merkezli, kayıtlı bir mağazasız çevrimiçi perakendecinin işlem verilerini içerir. Bunu bir R veri kümesi yerine kullanma nedenimiz, perakende verilerini bu formda alma olasılığınızın daha yüksek olması ve bu veriler üzerinde veri ön işleme uygulamanızın gerekecek olmasıdır.

Veri Kümesi Açıklaması

  • Satır Sayısı:541909
  • Özellik Sayısı:08
Özellik Bilgileri
  • InvoiceNo: Fatura numarası. Nominal, her işleme benzersiz olarak atanan 6 basamaklı tam sayı. Bu kod 'c' harfiyle başlıyorsa iptali belirtir. +StockCode: Ürün (öğe) kodu. Nominal, her bir farklı ürüne benzersiz olarak atanan 5 basamaklı tam sayı.
  • Description: Ürün (öğe) adı. Nominal.
  • Quantity: İşlem başına her ürünün (öğenin) miktarı. Sayısal.
  • InvoiceDate: Fatura tarihi ve saati. Sayısal, her işlemin oluşturulduğu gün ve saat. Veri kümesinden örnek: 12/1/2010 8:26
  • UnitPrice: Birim fiyat. Sayısal, ürünün birim başına sterlin cinsinden fiyatı.
  • CustomerID: Müşteri numarası. Nominal, her müşteriye benzersiz olarak atanan 5 basamaklı tam sayı.
  • Country: Ülke adı. Nominal, her müşterinin ikamet ettiği ülkenin adı.

Kütüphanelerin Yüklenmesi

Önce gerekli kütüphaneleri yükleyeceksiniz. Her bir kütüphanenin kısa açıklaması ( Buradan alınmıştır) aşağıdaki tabloda verilmiştir; böylece her kütüphanenin ne yaptığını bilirsiniz:

PaketAçıklama
arulesİşlem verilerini ve örüntüleri (sık öğe kümeleri ve birliktelik kuralları) temsil etmek, işlemek ve analiz etmek için altyapı sağlar.
arulesViz'arules' paketini birliktelik kuralları ve öğe kümeleri için çeşitli görselleştirme teknikleriyle genişletir. Paket ayrıca kural keşfi için birkaç etkileşimli görselleştirme içerir.
tidyverseTidyverse, veri bilimi için tasarlanmış bir R paketleri koleksiyonudur.
readxlR’de Excel Dosyalarını Okuyun
plyrVeriyi Ayırma, Uygulama ve Birleştirme Araçları
ggplot2Grafik ve çizimler oluşturun
knitrR’de Dinamik Rapor Oluşturma
lubridateLubridate, tarih ve saatlerle çalışmayı kolaylaştıran bir R paketidir.
#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)

Veri Ön İşleme

İndirilen dosyadan veri kümesini R’a okumak için read_excel(path to file) kullanın. read_excel(path-to-file-with-filename) içine dosya adı dahil tam dosya yolunuzu verin

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

Not: Sayfa 1 / 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...

Artık dataframe retail, Date ve Time olmak üzere iki ek özellikle 10 öznitelik içerecektir.

MBA/Birliktelik Kuralı madenciliğini uygulamadan önce, dataframe’i işlem verisine dönüştürmemiz gerekir; böylece bir faturada birlikte alınan tüm ürünler tek satırda yer alır. glimpse çıktısında her işlemin atomik biçimde olduğunu, yani bir faturaya ait tüm ürünlerin ilişkisel veritabanlarında olduğu gibi atomik olduğunu görebilirsiniz. Bu formata tekiller (singles) formatı da denir.

Yapmanız gereken, retail dataframe’indeki verileri CustomerID, CustomerID ve Date ile veya InvoiceNo ve Date kullanarak gruplamaktır. Bu gruplamaya ihtiyacımız var; üzerinde bir fonksiyon uygulayıp çıktıyı başka bir dataframe’e kaydedeceğiz. Bunu ddply ile yapabilirsiniz.

Aşağıdaki kod satırları bir InvoiceNo ve date’e ait tüm ürünleri birleştirir ve bu InvoiceNo ve date’ten gelen tüm ürünleri her bir öğe , ile ayrılmış tek bir satır olarak birleştirir

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

Not: Sayfa 1 / 100.

Sonraki adımda, kural madenciliğinde işinize yaramayacakları için InvoiceNo ve Date’i NULL yapabilirsiniz.

#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

Not: Sayfa 1 / 100.

İşlem verileri için bu formata sepet formatı denir. Sonraki adımda bu işlem verilerini bir .csv (Virgülle Ayrılmış Değerler) dosyasına kaydetmeniz gerekir. Bunun için 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.

İşlem verilerinizin doğru biçimde olup olmadığını kontrol edin:

transaction data

Sonraki adımda, bu işlem verilerini işlem sınıfı nesnesine yüklemeniz gerekir. Bu, arules paketinin read.transactions R fonksiyonu kullanılarak yapılır.

Aşağıdaki kod satırı, sepet formatında olan D:/Documents/market_basket_transactions.csv dosyasını alır ve onu işlem sınıfı nesnesine dönüştürür.

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

Yukarıdaki kod satırlarını çalıştırdığınızda çıktınızda çok sayıda EOF within quoted string görebilirsiniz, endişelenmeyin.

Elinizde zaten bir dataframe içinde işlem verisi varsa, bunu işlem nesnesine dönüştürmek için aşağıdaki kod satırını kullanın:

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

tr işlem nesnesini görüntüleyin:

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), işlem nesnemiz hakkında bilgi veren çok yararlı bir komuttur. Yukarıdaki çıktı ne söylüyor, bakalım:

  • Toplam 22191 işlem (satır) ve 7876 öğe (sütun) var. 7876 sayısının veri kümesinde yer alan ürün açıklamaları, 22191 işlemin ise bu öğelerin koleksiyonları olduğuna dikkat edin.

  • Yoğunluk (Density), seyrek bir matristaki sıfır olmayan hücrelerin yüzdesini söyler. Bunu, o matriste satın alınan toplam öğe sayısının, matriste mümkün olan öğe sayısına bölünmesi gibi düşünebilirsiniz. Yoğunluğu kullanarak kaç öğe satın alındığını hesaplayabilirsiniz: 22191x7876x0.001930725=337445

Bilgi! Seyrek Matris: Seyrek matris ya da seyrek dizi, elemanlarının çoğu sıfır olan matristir. Buna karşılık, elemanlarının çoğu sıfır değilse matris yoğundur. Sıfır değerli eleman sayısının toplam eleman sayısına oranı, matrisin seyreklik oranı olarak adlandırılır (yoğunluğun 1 eksiğine eşittir).

  • Özet, en sık görülen öğeleri de söyleyebilir.

  • Öğe takımı/işlem uzunluk dağılımı: Bu, 1-öğe-kümesi, 2-öğe-kümesi vb. için kaç işlem olduğunu gösterir. İlk satır öğe sayısını, ikinci satır ise işlem sayısını gösterir.

Örneğin yalnızca 3598 adet tek öğeli işlem, 1594 adet iki öğeli işlem ve bir işlemde 419 öğe vardır ki bu en uzunudur.

itemFrequencyPlot kullanarak, itemMatrix’e dayalı nesnelerin dağılımını görmek için bir öğe Sıklığı Çubuk Grafiği oluşturabilirsiniz (ör. bizim durumumuzda >transactions veya >itemsets ve >rules içindeki öğeler).

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

Şunda 

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

ilk argüman, çizdirilecek işlem nesnesi olan tr’dir. topN, en yüksek sıklığa sahip ilk N öğeyi çizdirmenizi sağlar. type, type="absolute" veya type="relative" olabilir. Absolute ise her öğenin sayısal sıklığını bağımsız olarak çizer. Relative ise bu öğelerin diğerlerine kıyasla kaç kez göründüğünü çizer.

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

Bu grafik, 'WHITE HANGING HEART T-LIGHT HOLDER' ve 'REGENCY CAKESTAND 3 TIER' ürünlerinin en çok satıldığını gösteriyor. Dolayısıyla 'SET OF 3 CAKE TINS PANTRY DESIGN' satışını artırmak için, perakendeci bunu 'REGENCY CAKESTAND 3 TIER' yakınına koyabilir.

itemFrequencyPlot için diğer seçenekleri burada keşfedebilirsiniz.

Kuralların Üretilmesi!

Sonraki adım, APRIORI algoritmasını kullanarak kuralları çıkarmaktır. apriori() fonksiyonu arules paketindendir.

# 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, madenciliğin uygulanacağı işlem nesnesi olarak tr’yi alır. parameter, min_sup ve min_confidence’ı ayarlamanıza olanak tanır. parameter için varsayılan değerler, 0.1 asgari destek, 0.8 asgari güven ve en fazla 10 öğedir (maxlen).

summary(association.rules) şunları gösterir:

  • Parametre Belirtimi: min_sup=0.001 ve min_confidence=0.8 değerleri; bir kuralda en fazla 10 öğe.

  • Toplam kural sayısı: 49122 kural kümesi

  • Kural uzunluğu dağılımı: 5 öğe uzunluğu en çok kurala sahip: 16424 ve 2 öğe uzunluğu en az kurala sahip: 105

  • Kalite ölçüleri özeti: Destek, Güven ve Lift için min ve max değerleri.

  • Kural oluşturmak için kullanılan bilgiler: Algoritmaya sağladığımız veri, destek ve güven.

49122 kural olduğuna göre, sadece ilk 10’unu yazdıralım:

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 

Yukarıdaki çıktıyı kullanarak şu tür analizler yapabilirsiniz:

  • 'WOBBLY CHICKEN' alan müşterilerin %100’ü 'METAL' de almıştır.

  • 'BLACK TEA' alan müşterilerin %100’ü 'SUGAR JARS' da almıştır.

Kural sayısını ve boyutunu sınırlama

Üretilen kuralların sayısını ve boyutunu nasıl sınırlayabilirsiniz? Bunu apriori içindeki parameters’ı ayarlayarak yapabilirsiniz. Bu parametreleri, elde edeceğiniz kural sayısını ayarlamak için belirleyin. Daha güçlü kurallar istiyorsanız conf değerini artırın; daha uzun kurallar için maxlen’i daha yüksek verin.

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

Artık kuralların kaldırılması

Daha büyük kuralların alt kümeleri olan kuralları kaldırabilirsiniz. Bu tür kuralları kaldırmak için aşağıdaki kodu kullanın:

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(), değeri TRUE olan vektördeki elemanların konumunu döndürür.

  • colSums(), dataframe’ler ve sayısal diziler için satır ve sütun toplamları oluşturur.

  • is.subset(), bir vektörün elemanlarının diğerinin tüm elemanlarını içerip içermediğini belirler

Bazen belirli bir ürün üzerinde çalışmak istersiniz. X öğesinin satın alınmasını neyin etkilediğini bulmak istiyorsanız, apriori komutunda appearance seçeneğini kullanabilirsiniz. appearance, kuralın LHS (EĞER kısmı) ve RHS (O HALDE kısmı) için ayar yapma seçenekleri verir.

Örneğin, müşterilerin 'METAL' satın almadan önce ne aldığını bulmak için aşağıdaki kod satırını çalıştırın:

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 

Benzer şekilde, METAL alan müşteriler ayrıca .... almıştır sorusunun cevabını bulmak için METAL’i lhs’te tutarsınız:

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 

Birliktelik Kurallarının Görselleştirilmesi

Veriye bağlı olarak yüzlerce hatta binlerce kural üretileceği için, bulgularınızı sunmanın birkaç yoluna ihtiyacınız olacak. ItemFrequencyPlot yukarıda zaten ele alındı ve en çok satılan ürünleri görmek için harika bir yol.

Burada şu görselleştirmeler ele alınacaktır:

  • Saçılım Grafiği (Scatter-Plot)
  • Etkileşimli Saçılım Grafiği
  • Tekil Kural Gösterimi

Saçılım Grafiği

Birliktelik kurallarının doğrudan görselleştirilmesi, arulesViz paketinin plot() fonksiyonunu kullanarak bir saçılım grafiği üretmektir. Eksenlerde Destek ve Güven kullanılır. Ek olarak, üçüncü ölçüt Lift nokta renklerini (grinin tonları) varsayılan olarak belirler.

# 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

Yukarıdaki grafik, lift’i yüksek olan kuralların desteğinin düşük olduğunu gösteriyor. Grafik için şu seçenekleri kullanabilirsiniz:

plot(rulesObject, measure, shading, method)
  • rulesObject: çizdirilecek kural nesnesi

  • measure: Kural ilginçlik ölçütleri. Support, Confidence, lift veya method değerine bağlı kombinasyonları olabilir.

  • shading: Noktaları renklendirmede kullanılan ölçüt (Support, Confidence, lift). Varsayılan Lift’tir.

  • method: Kullanılacak görselleştirme yöntemi (scatterplot, two-key plot, matrix3D).

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

Two-key plot x ve y eksenlerinde sırasıyla destek ve güveni kullanır. Renklendirme için order kullanılır. Order, kuraldaki öğe sayısıdır.

Etkileşimli Saçılım Grafiği

Kural kümenizi sunmak için arulesViz ve plotly kullanan harika bir etkileşimli grafik kullanabilirsiniz. Her kuralın üzerine geldiğinizde tüm kalite ölçütlerini (destek, güven ve lift) görebilirsiniz.

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.

Graf Tabanlı Görselleştirmeler

Graf tabanlı teknikler, düğümler ve kenarlar kullanarak birliktelik kurallarını görselleştirir; düğümler öğe adlarıyla etiketlenir ve öğe kümeleri veya kurallar ikinci bir düğüm kümesi olarak temsil edilir. Öğeler, yönlü oklarla öğe kümelerine/kurallarına bağlanır. Öğelerden kural düğümlerine giden oklar LHS öğelerini, bir kuraldan bir öğeye giden ok ise RHS’yi gösterir. Düğüm boyutu ve rengi genellikle ilgi ölçülerini temsil eder.

Graf çizimleri kuralları görselleştirmek için harikadır, ancak kural sayısı arttıkça sıkışık hâle gelirler. Bu nedenle graf tabanlı görselleştirmelerde daha az sayıda kuralı görselleştirmek daha iyidir.

subRules içinden en yüksek güvene sahip 10 kuralı seçelim.

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

Şimdi etkileşimli bir graf çizin:

Not: plot içindeki engine=htmlwidget parametresiyle tüm grafiklerinizi etkileşimli yapabilirsiniz

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

arulesViz’den, birliktelik kuralları kümeleri için grafikler GraphML formatında veya Graphviz dot dosyası olarak dışa aktarılabilir; böylece Gephi gibi araçlarda incelenebilir. Örneğin, en yüksek lift’e sahip 1000 kural şu şekilde dışa aktarılır:

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

Tekil Kural Gösterimi

Bu gösterime Paralel Koordinatlar Grafiği de denir. Hangi ürünlerin, hangi öğelerle birlikte, ne tür satışlara yol açtığını görselleştirmek için kullanışlıdır.

Yukarıda belirtildiği gibi, RHS müşterinin alacağını öngördüğümüz Ardıl’dır; konumlar LHS’dedir; burada 2, sepete en son eklenen, 1 ise daha önce elimizde olan öğeyi ifade eder.

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

En üstteki oka bakın. 'CHILDS GARDEN SPADE PINK' ve 'CHILDS GARDEN RAKE PINK' alışveriş sepetimde olduğunda, bunlarla birlikte 'CHILDS GARDEN RAKE BLUE' alma olasılığımın da yüksek olduğunu gösteriyor.

Sonuç

Tebrikler! Veri madenciliğinde en sık kullanılan algoritmalardan biri olan APRIORI’yi öğrendiniz. Birliktelik Kuralı Madenciliğini, uygulamalarını ve perakendecilikte Market Sepeti Analizi olarak adlandırılan uygulamasını öğrendiniz. Artık R’da Market Sepeti Analizini uygulayabilir ve birliktelik kurallarınızı harika grafiklerle sunabilirsiniz! İyi öğrenmeler!

Kaynakça:

  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

R hakkında daha fazla bilgi edinmek isterseniz, DataCamp’in Importing and Managing Financial Data in R kursunu alın.

Konular

İlgili