Birliktelik kuralı, veriler tarafından desteklenen bir sonuç veya algoritmik anlamda ifade edecek olursak eğer-o zaman (if-then-rule) kuralıdır. Birliktelik kurallarının geliştirilmesinin arkasında yatan motivasyon, büyük perakendecilerin satış noktası işlemlerinin içeriği ile ilgilenen pazar sepeti (market basket) analizidir. Böyle bir çalışmadan ortaya çıkan tipik bir birliktelik kuralında “ekmek ve tereyağı satın alan tüm müşterilerin yüzde 90’ı aynı zamanda süt de alıyor” olabilir. Müşteri davranışına ilişkin iç görüler, müşteri anketleri yoluyla da elde edilebilir, ancak işlem verilerinin analizi, çok daha ucuz olma ve mevcut tüm müşterileri kapsama avantajına sahiptir. Müşteri anketleriyle karşılaştırıldığında, işlem verilerinin analizinin bazı ciddi sınırlamaları vardır. Örneğin, satış noktası verileri tipik olarak müşterilerin kişisel ilgi alanları, yaşı ve mesleği hakkında herhangi bir bilgi içermez. Diğer taraftan, pazar sepeti analizi müşteri davranışına ilişkin yeni iç görüleri ortaya çıkarabilir ve daha iyi müşteri ilişkileri, müşteriyi elde tutma, daha iyi ürün yerleştirmeleri, ürün geliştirme ve sahtekarlık tespiti yoluyla daha yüksek karlar elde edilmesine imkan sağlayabilir. Çok sayıda müşteri tarafından birlikte satın alınan ürünler pazar sepeti analizi ile ortaya konabilir.
Birliktelik kurallarından ve kural madenciliği (rule mining) uygulamalarından biri olan Apriori algoritması, Agrawal ve Srikant tarafından 1993 yılında geliştirilmiştir. Apriori algoritması birliktelik analizlerinin yapılıp birliktelik kurallarının tespit edilmesinde yaygın bir şekilde kullanılan bir algoritmadır. Geniş ürün veya hizmet kümelerindeki ilişki kurallarının ortaya konulmasında kullanılan apriori algoritmasının ilk uygulama alanı olan pazar sepeti analizi (Market basket analysis), perakende alışverişle sınırlı değildir. Apriori algoritması pazar sepeti analizin yanında aşağıdaki şekilde belirtilen iş alanlarında da uygulanmaktadır:

Çalışma kapsamında apriori algoritmasının teorik çerçevesi verilmiş, ardından örnek bir olay kurgusu içerisinde sentetik veri üretilerek bu veri seti üzerinden örnek uygulama yapılmıştır.
Metodoloji
Bu kısımda ilk olarak apriori algoritmasının teorik çerçevesi verilmiştir. Ardından örnek olay senaryosu kapsamında basit tesadüfi örnekleme yöntemi kullanılarak üretilen sentetik veriler üzerinden örnek uygulama yapılmıştır. Analiz aşamasında R programlama dili, sonuçların çalışma kitaplarına yazdırılmasında ise Microsoft Excel çalışma kitapları kullanılmıştır.
Teorik Çerçeve
Birliktelik kuralı, {X -> Y} şeklindedir, burada {X} ve {Y} öğeler kümesidir. Bu birliktelik kuralının anlamı şudur: {X} içindeki tüm öğeler bir sepet içinde oluyorsa, {Y} de bu sepette “büyük olasılıkla” olacaktır.
- {X} öncül veya birliktelik kuralının sol tarafı (LHS: left-hand-side) olarak da adlandırılır ve
- {Y}, peşi sıra gelen veya birliktelik kuralının sağ tarafı (RHS: right-hand-side) olarak adlandırılır.
Bahsedilenleri aşağıdaki şekil üzerinde bir örnekler gösterirsek daha iyi anlaşılacağını düşünüyorum.

X market ürünleri için örnek bir ilişkilendirme kuralı {Patates, Soğan} -> {Ekmek} olabilir, yani X’den Patates ve Soğan {X} satın alınırsa, müşteriler büyük olasılıkla Ekmek de satın alır {Y} . “ -> ” sembolünün {X} ve {Y} arasında nedensel bir ilişkiyi göstermediğine dikkat etmek gerekir. Bu sembol yalnızca, {X} verildiğinde {Y} ‘nin koşullu olasılığının bir tahminini ortaya koymaktadır.
Şimdi on binlerce farklı ürünün bulunduğu bir gross market düşünün. Olası her ürün kombinasyonu arasındaki tüm ilişkileri hesaplamak istemeyiz . Bundan ziyade, tüm olası kurallar kümesinden yalnızca potansiyel olarak “ilgili” kuralları seçmek isteriz. Bu nedenle, analiz etmemiz gereken ilişki sayısını azaltmak için destek, güven ve lift ölçütlerini kullanırız:
- Destek (support) ölçütü, bir dizi öğenin sepetlerde ne sıklıkta göründüğünün bir göstergesidir. Destek(X–>Y)=sayı(X,Y)/N formülü ile destek metriği hesaplanmaktadır. Burada N bize toplam işlem sayısını göstermektedir. İfadeyi açacak olursak destek ölçütü, X ve Y ürünlerini satın alanların sayısının toplam işlem sayısına oranlanması ile hesaplanır. Karşılaştırmalı modellerde destek ölçütü değeri ne kadar yüksek ise o kadar iyidir. Destek ölçüt değerinin destek eşik (threshold) değerlerinden büyük olması gerekir. Altında olanlar elenerek bir sonraki adıma geçilir.
- Güven (confidence) ölçütü, destek kuralının ne kadar sıklıkla doğru bulunduğunun bir göstergesidir. Güven(X–>Y)=sayı(X∪Y)/sayı(X). Güven ölçütü, X ve Y ürünlerini satın alanların sayısının X ürünleri satın alanların sayısına oranlanması ile hesaplanan bir olasılık değeridir. Karşılaştırmalı modellerde güven ölçütü değeri ne kadar yüksek ise o kadar iyidir. Güven ölçüt değerinin güven eşik (threshold) değerlerinden büyük olması gerekir. Altında olanlar elenerek bir sonraki adıma geçilir.
- Lift , hem desteği hem de güveni kullanan bir birliktelik ölçütüdür. Bu ölçüt, Y ve X öğelerinin ne kadar sıklıkta olduğunu kontrol ederken, X öğesi satın alındığında Y öğesinin satın alınma olasılığının ne kadar yüksek olduğunu bize gösterir. İstatistiksel olarak bağımsız olsalardı, X ve Y’nin beklenenden kaç kez daha sık birlikte meydana geldiğini ölçer. Lift(X–>Y)=Destek(X∪Y) / (Destek(X) x Destek(Y)) eşitliği ile hesaplanır. Lift değeri eşik değerleri ve yorumu şöyledir:
- lift = 1 ise öğeler (ürünler veya hizmetler) arasında ilişki olmadığı anlamına gelir.
- lift> 1 ise X ürünü satın alınırsa Y ürünü satın alınma olasılığının yüksek olduğu anlamına gelir.
- lift <1 ise X ürünü satın alınırsa Y öğesinin satın alınmasının olası olmadığı anlamına gelir.
Örnek Uygulama
İlk olarak analizde kullanılacak R kütüphanelerini vererek işe başlayalım. Aşağıda gerekenden fazla kütüphane verdiğimi biliyorum. Ancak daha çok esneklik ve estetik tasarım tanıdığı için genellikle olması gerekenden fazla kütüphane ile çalışıyorum. Apriori algoritması için temel paketler “arules” ve “arulesViz” paketleridir.
Yüklenecek kütüphaneler
# Kütüphaneler
library<-c("dplyr","tibble","tidyr","ggplot2","ggthemes","readr","readxl","ggpubr","formattable", "ggstance", "pastecs", "rmarkdown", "knitr", "gtsummary", "writexl", "psych", "reshape2", "GGally", "Hmisc", "corrplot","dendextend", "kableExtra", "pander","arules","arulesViz", "RColorBrewer")
loading<-sapply(library, require, character.only = TRUE)
# Kütüphane yüklenme durumunu gösteren tablo
tablo=suppressWarnings(loading, classes = "warning")
isim=names(tablo)
deger=as_tibble(tablo)
cbind(kutuphane=isim, deger) %>% rename(yuklenme_durumu=value) %>% mutate(yuklenme_durumu=if_else(yuklenme_durumu==TRUE, "Yuklendi", "Paket Kurulumu Gerekli")) %>% pander(caption="Kütüphane Yüklenme Bilgisi")
Yukarıdaki R kod bloğunun çalıştırılmasından sonra yukarıdaki kütüphanelerin yüklenip yüklenmediğine dair aşağıdaki gibi mantıksal vektör sonuçları gelecektir. Eğer mantıksal vektör sonuçlarının hepsi TRUE ise kütüphanelerin hepsini yüklenmiştir demektir. Kolaylık sağlaması açısından yukarıda kütüphanelerin yüklenmesini gösterir tabloyu da elde etmek ve daha kolay okumanız için kod da yazdım. Bu kod çalıştırıldığında aşağıdaki tabloda görüleceği üzere bütün kütüphaneler yüklenmiştir. Eğer ilgili kütüphane yüklenmemiş olursa “Paket Kurulumu Gerekli” ifadesi satırda yazacaktır.
--------------------------------
kutuphane yuklenme_durumu
-------------- -----------------
dplyr Yuklendi
tibble Yuklendi
tidyr Yuklendi
ggplot2 Yuklendi
ggthemes Yuklendi
readr Yuklendi
readxl Yuklendi
ggpubr Yuklendi
formattable Yuklendi
ggstance Yuklendi
pastecs Yuklendi
rmarkdown Yuklendi
knitr Yuklendi
gtsummary Yuklendi
writexl Yuklendi
psych Yuklendi
reshape2 Yuklendi
GGally Yuklendi
Hmisc Yuklendi
corrplot Yuklendi
dendextend Yuklendi
kableExtra Yuklendi
pander Yuklendi
arules Yuklendi
arulesViz Yuklendi
RColorBrewer Yuklendi
--------------------------------
Table: Kütüphane Yüklenme Bilgisi
Örnek olay
Ankara ilinde ikamet olmakta olan Fehmi 🙂 , Covid-19’un devam ettiği dönemde mağaza zincirlerinin birinden 1 ayda farklı günlerde 9 kez alış-veriş yapmıştır. Bütün alış verişler içerisinde alınan toplam farklı ürün sayısı 12’dir. Bu 12 ürün şöyledir: “seker”, “cay”, “ekmek”, “süt”, “patates”, “soğan”, “zeytin”, “peynir”, “makarna”, “luppo”, “tomates”, “deterjan”. Tatlı apur cuburlara düşkün olan Fehmi alış-veriş listesine hepimizin bildiği Halley benzeri ürün olan Luppo’yu da eklemeyi ihmal etmemiştir 🙂 . Fehmi’nin yapılan alış-verişlerde aldığı ürünlerin listesi Tablo 1’de verilmiştir. Örneğin, Fehmi ilk alışverişte Tablo 1’de görüleceği üzere {deterjan, zeytin ve tomates} ürünlerini almıştır. Covid-19 yasaklarının başlayacağı hafta sonuna denk gelen Fehmi’nin son alışverişinde ise {tomates, seker, deterjan, patates, luppo, ekmek, peynir, cay, zeytin, makarna, süt} ürünleri alınmıştır. Bu son alış-veriş işlemi Tablo 1’de İ9 (işlem 9: transaction 9) olarak kodlanmıştır. Örnek olay kapsamındaki veriler tekrarsız basit tesadüfi örnekleme (simple random sampling without replacement) yöntemi kullanarak üretilmiştir. Not: Bu örnek olay kurgudan ibarettir, gerçek hayatta karşılığı bulunmamaktadır.
İstenenler
- Apriori algoritmasına uygun model veri setini oluşturunuz.
- Apriori modelini kurunuz.
- Güven, destek ve lift ölçüt değerlerinin grafiklerini çiziniz.
- Modelde ilk ve son en az 10 kuralın ağ ve gruplandırılmış matris grafiklerini çiziniz.
- Kurulan modelde en yüksek lift değerlerine sahip ilk 10 kuralı tablo halinde veriniz.
- Diğer ürünlerin yanında Luppo ürünü alınan durumların (rhs) kurallarını gösteriniz.
- Kurulan Luppo ürün modelinde en yüksek lift değerlerine sahip ilk 10 kuralı tablo halinde veriniz.
- Analizlerde elde edilen veri setlerini xlsx formatında oluşturunuz.
- Kurulacak 2. modeldeki destek (support) eşik değeri 0,5, güven (confidence) eşik değeri ise 0,6’dır. Maksimum ürün uzunluğu ise 10’dur. Bu parametrelere göre 2. modeli kurarak, oluşan kurallarının tamamını xlsx uzantılı çalışma kitabına yazdırınız. Aynı zamanda kurulan 2. modelden üretilen kuralları lift değerlerinin büyüklüğüne göre sıralayıp tabloda gösteriniz.
Verilenler
- Destek (support) eşik değeri 0,3, güven (confidence) eşik değeri ise 0,5’tir. Maksimum ürün uzunluğu ise 10’dur.
Tablo 1: Fehmi’nin Alış-veriş Listesi
İşlem | Ürün |
İ1 | deterjan |
İ1 | zeytin |
İ1 | tomates |
İ2 | luppo |
İ2 | deterjan |
İ2 | makarna |
İ2 | süt |
İ3 | cay |
İ3 | tomates |
İ3 | luppo |
İ3 | seker |
İ3 | süt |
İ4 | makarna |
İ4 | ekmek |
İ4 | peynir |
İ4 | luppo |
İ4 | süt |
İ4 | tomates |
İ5 | deterjan |
İ5 | peynir |
İ5 | patates |
İ5 | ekmek |
İ5 | luppo |
İ5 | soğan |
İ5 | makarna |
İ6 | tomates |
İ6 | süt |
İ6 | soğan |
İ6 | ekmek |
İ6 | patates |
İ6 | luppo |
İ6 | makarna |
İ6 | seker |
İ7 | cay |
İ7 | deterjan |
İ7 | makarna |
İ7 | peynir |
İ7 | tomates |
İ7 | luppo |
İ7 | zeytin |
İ7 | soğan |
İ7 | ekmek |
İ8 | cay |
İ8 | makarna |
İ8 | seker |
İ8 | deterjan |
İ8 | soğan |
İ8 | luppo |
İ8 | zeytin |
İ8 | peynir |
İ8 | patates |
İ8 | tomates |
İ9 | tomates |
İ9 | seker |
İ9 | deterjan |
İ9 | patates |
İ9 | luppo |
İ9 | ekmek |
İ9 | peynir |
İ9 | cay |
İ9 | zeytin |
İ9 | makarna |
İ9 | süt |
Yukarıdaki tabloyu aynı zamanda xlsx formatında aşağıdaki linkten indirebilirsiniz.
Alışveriş listesinin oluşturulması
Yukarıdaki tablo ilk olarak R’da yazılan aşağıdaki kod ile oluşturulmuş ve üretilmiştir.
#ürün listesi
urun=c("seker", "cay", "ekmek","süt", "patates", "soğan","zeytin", "peynir", "makarna", "luppo", "tomates","deterjan")
set.seed(61)#basit tekrarsız örnekleme tekniği ile ürün listesinden tesadüfi alış-veriş listeleri oluşturulmuştur.
orneklem1=sample(urun, size=3, replace = F)
orneklem2=sample(urun, size=4, replace = F)
orneklem3=sample(urun, size=5, replace = F)
orneklem4=sample(urun, size=6, replace = F)
orneklem5=sample(urun, size=7, replace = F)
orneklem6=sample(urun, size=8, replace = F)
orneklem7=sample(urun, size=9, replace = F)
orneklem8=sample(urun, size=10, replace = F)
orneklem9=sample(urun, size=11, replace = F)
#Alış-verişe konu ürünlerin liste formatına dönüştürülmesi
sepet <-
list(orneklem1, orneklem2, orneklem3, orneklem4, orneklem5, orneklem6, orneklem7, orneklem8, orneklem9
)
names(sepet) <- paste("İ", 1:length(sepet), sep = "")
sepet
Yukarıdaki R kod bloğunun çalıştırılmasından sonra elde edilen 1 ay içerisinde yapılan 9 alış-veriş listesi aşağıda verilmiştir. Tablo 1’de de görüleceği üzere aynı liste aşağıda da mevcuttur.
$İ1
[1] "deterjan" "zeytin" "tomates"
$İ2
[1] "luppo" "deterjan" "makarna" "süt"
$İ3
[1] "cay" "tomates" "luppo" "seker" "süt"
$İ4
[1] "makarna" "ekmek" "peynir" "luppo" "süt" "tomates"
$İ5
[1] "deterjan" "peynir" "patates" "ekmek" "luppo" "soğan" "makarna"
$İ6
[1] "tomates" "süt" "soğan" "ekmek" "patates" "luppo" "makarna" "seker"
$İ7
[1] "cay" "deterjan" "makarna" "peynir" "tomates" "luppo" "zeytin" "soğan" "ekmek"
$İ8
[1] "cay" "makarna" "seker" "deterjan" "soğan" "luppo" "zeytin" "peynir" "patates"
[10] "tomates"
$İ9
[1] "tomates" "seker" "deterjan" "patates" "luppo" "ekmek" "peynir" "cay" "zeytin"
[10] "makarna" "süt"
Listenin excel (xlsx) çalışma kitabına yazdırılması
Aşağıda yazılan kod bloğu ile yukarıdaki liste excel çalışma kitabına yazdırılmıştır. Yukarıda excel çalışma kitabı verildiğinden burada tekrar paylaşılmayacaktır.
library(plyr)
tablo=ldply(sepet,data.frame)
write_xlsx(tablo, "ürün.xlsx")
Listenin analize uygun hale getirilmesi
Burada oluşturulmuş olan liste aşağıda yazılan kod bloğu ile analizden önce “transactions” yani işlem formatına dönüştürülmüştür. Burada esasında yapılan şey, alış verişlerin sırası satırlara (alışverişin id’si), alınan ürünlerin adları ise sütunlara yazdırılır.
#Veri setinin satırlara ve sütunlara dönüştürülmesi: Bu işlemde yapılan alışverişlerin sırası satırlara ve satın alınan ürünler ise sütunlara dönüştürülür.
islem <- as(sepet, "transactions")
islem
dim(islem)#veri setinin boyutu (sonuç=[1] 9 12) yani veri seti 9 satır (alış veriş işlemi), 12 sütun (ürünler:değişkenler)'dan oluşmaktadır.
Yukarıdaki ilk satırdaki kod bloğunun çalıştırılmasından sonra veri setimiz işlem formatına dönüştürülmüştür. Aşağıdaki bulgular veri setimizin 9 satır, yani 9 kez alış veriş yaptığımızı, sütunlarda da 12 ürünümüzün olduğunu göstermektedir. 2. sıradaki kod ise 1. sıradaki yazılan koda dayalı olarak çalışan ve 1. sıradaki kod ile aynı işlevi göstermektedir. dim() fonksiyonu veri setlerinde veri setinin boyutlarını, yani veri setinin kaç satır, kaç sütundan oluştuğunu göstermektedir. Bu işlemleri yaptıktan sonra modelimizi kurabilir.
transactions in sparse format with
9 transactions (rows) and
12 items (columns)
Veri setindeki ürünlerin adları alınmak istenirse aşağıdaki kod bloğu yazılabilir.
itemLabels(islem)
Yukarıdaki kod bloğunun çalıştırılmasından sonra elde edilen ürün adları vektör olarak aşağıda verilmiştir.
[1] "cay" "deterjan" "ekmek" "luppo" "makarna" "patates" "peynir" "seker" "soğan"
[10] "süt" "tomates" "zeytin"
Ürünlerin alışverişlerdeki sıklıklarına bakacak olursak aşağıdaki kod bloğunu yazabiliriz.
itemFrequencyPlot(islem, topN = 10,
col = brewer.pal(10, "Greens"),
main = 'Göreceli Ürün Frekansı',
type = "relative",
ylab = "Göreceli Sıklık")
Yukarıdaki R kod bloğunun çalıştırılmasından sonra alışverişler içerisinde en sık satın alınan ürünler aşağıdaki grafikte verilmiştir.

Modelin kurulmasından önce işlemlerimizin özetini de aşağı yazılan R kod bloğu ile verelim.
summary(islem)
Yukarıdaki kod bloğunun çalıştırılmasından sonra elde edilen alış-veriş işlemleri özeti aşağıda verilmiştir. Yukarıdaki frekansları gösteren grafikteki sonuçlara benzer olarak aşağıda tabloda da en sık alış veriş yapılan ürünler aşağıda da verilmiştir. Bunun dışında veri setimizin 9 satır ve 12 sütun (değişken=ürün)’dan oluştuğu görülmektedir. En son satırda ise box plot dediğimiz kutu diyagram parametreleri görülmektedir. Yani minimum ve maksimum değerler ile ortalama, 1. çeyreklik ve 3. çeyreklik verileri ortaya konulmuştur.
transactions as itemMatrix in sparse format with
9 rows (elements/itemsets/transactions) and
12 columns (items) and a density of 0.5833333
most frequent items:
luppo makarna tomates deterjan ekmek (Other)
8 7 7 6 5 30
element (itemset/transaction) length distribution:
sizes
3 4 5 6 7 8 9 10 11
1 1 1 1 1 1 1 1 1
Min. 1st Qu. Median Mean 3rd Qu. Max.
3 5 7 7 9 11
Aşağıda yazılan kod bloğu ile 12 ürünün çapraz tablosunu da verelim.
crossTable(islem, sort=TRUE)
Yukarıdaki R kod bloğunun çalıştırılmasından sonra elde edilen çapraz tablo aşağıda verilmiştir.

- Modelin kurulması
Aşağıda yazılan R kod bloğu ile model kurulmuştur. Pazar sepet analizlerinde alınan ürünler arasındaki ilişki düzeyleri tanımlamada iki ölçütten yararlanılmaktadır. Bunlardan ilki destek (support), diğeri ise güven (confidence) ölçütleridir. Modelde minimum destek oranı değerimiz 0,3, güven olasılık değerimiz ise 0,5 olarak alınmıştır.
#Min destek 0.3, güven ise 0.5.
model <- apriori(islem,
parameter = list(supp=0.3, conf=0.5,
maxlen=10,
target= "rules"))
summary(model)
Yukarı kod bloğundaki model çalıştırıldıktan elde edilen model sonuçları aşağıda verilmiştir. Elde edilen bulgulara göre;
- Modelimiz 786 kuraldan oluşmaktadır. Diğer ifadeyle lhs (X) ve rhs (Y) kural uzunlukların toplamı (R)= 7+92+243+260+135+42+7=786’ya eşittir.
- Ortalama lift değerleri 1’in üzerindedir. Bu bulgu X ürünü satın alınırsa Y ürünü satın alınma olasılığının da yüksek olduğunu göstermektedir.
- Güven ve destek ölçüt değerleri de belirlenmiş eşik değerlerin üzerindedir.
set of 786 rules
rule length distribution (lhs + rhs):sizes
1 2 3 4 5 6 7
7 92 243 260 135 42 7
Min. 1st Qu. Median Mean 3rd Qu. Max.
1.000 3.000 4.000 3.735 4.000 7.000
summary of quality measures:
support confidence coverage lift count
Min. :0.3333 Min. :0.5000 Min. :0.3333 Min. :0.750 Min. :3.000
1st Qu.:0.3333 1st Qu.:0.7500 1st Qu.:0.3333 1st Qu.:1.125 1st Qu.:3.000
Median :0.3333 Median :1.0000 Median :0.3333 Median :1.286 Median :3.000
Mean :0.3598 Mean :0.8773 Mean :0.4283 Mean :1.406 Mean :3.238
3rd Qu.:0.3333 3rd Qu.:1.0000 3rd Qu.:0.4444 3rd Qu.:1.500 3rd Qu.:3.000
Max. :0.8889 Max. :1.0000 Max. :1.0000 Max. :2.250 Max. :8.000
Kuralların excel (xlsx) çalışma kitabına yazdırılması
i=inspect(model)
write_xlsx(i, "kurallar.xlsx")
Yukarıdaki kod bloğunun çalıştırılmasından sonra excel çalışma kitabına yazdırılan kurallar (R=786) setini ölçütlerle birlikte aşağıdaki linkten indirebilirsiniz.
Kurulan modelden üretilen ilk 15 kural aşağıdaki tabloda verilmiştir.
lhs | rhs | support | confidence | coverage | lift | count | |
{} | => | {süt} | 0,556 | 0,556 | 1,000 | 1,000 | 5,000 |
{} | => | {ekmek} | 0,556 | 0,556 | 1,000 | 1,000 | 5,000 |
{} | => | {peynir} | 0,556 | 0,556 | 1,000 | 1,000 | 5,000 |
{} | => | {deterjan} | 0,667 | 0,667 | 1,000 | 1,000 | 6,000 |
{} | => | {tomates} | 0,778 | 0,778 | 1,000 | 1,000 | 7,000 |
{} | => | {makarna} | 0,778 | 0,778 | 1,000 | 1,000 | 7,000 |
{} | => | {luppo} | 0,889 | 0,889 | 1,000 | 1,000 | 8,000 |
{zeytin} | => | {cay} | 0,333 | 0,750 | 0,444 | 1,688 | 3,000 |
{cay} | => | {zeytin} | 0,333 | 0,750 | 0,444 | 1,688 | 3,000 |
{zeytin} | => | {peynir} | 0,333 | 0,750 | 0,444 | 1,350 | 3,000 |
{peynir} | => | {zeytin} | 0,333 | 0,600 | 0,556 | 1,350 | 3,000 |
{zeytin} | => | {deterjan} | 0,444 | 1,000 | 0,444 | 1,500 | 4,000 |
{deterjan} | => | {zeytin} | 0,444 | 0,667 | 0,667 | 1,500 | 4,000 |
{zeytin} | => | {tomates} | 0,444 | 1,000 | 0,444 | 1,286 | 4,000 |
{tomates} | => | {zeytin} | 0,444 | 0,571 | 0,778 | 1,286 | 4,000 |
İlişki kurallarının grafiğe taşınması
Aşağıda yazılan kod bloğu ile ilk olarak güven ve destek ölçüt değerleri ile lift değerlerini gösteren grafik verilmiştir.
plot(model, main="786 Kuralın Lift Değerlerinin Saçılım Grafiği")
Yukarıdaki kod bloğunun çalıştırılmasından sonra ilk olarak güven ve destek ölçüt değerleri ile lift değerlerini gösteren grafik verilmiştir. Grafik, x eksenindeki desteği ve y eksenindeki güveni göstermektedir. Lift değerleri griden kırmızıya değişen farklı seviyelerde bir renk olarak gösterilmektedir.

Aşağıda yazılan kod bloğu ile alternatif olarak aynı grafiği html formatında da elde ederek daha yakın plandan ve dinamik olarak ölçütleri inceleyebiliriz. Aynı zamanda hangi kuralların 1’in üzerinde olduğunu görebiliriz.
plot(model, engine = "htmlwidget")
Yukarıdaki kod bloğunun çalıştırılmasından sonra güven ve destek ölçüt değerleri ile lift değerlerini gösteren dinamik grafik aşağıda verilmiştir. Aşağıda göreceğiniz grafik dinamik değildir. Bunun nedeni sitemin temel düzeyde olmasıdır. R’da yukarıda verilen kod bloğu çalıştırıldığında dinamik olduğunu rahatlıkla görebilirsiniz.

Grafikte sadece güven (confidence) değerlerini görmek istersek aşağıdaki kod bloğunu yazmamız yeterlidir.
plot(model, measure = "confidence", main="786 Kuralın Güven Değerlerinin Saçılım Grafiği")
Yukarıdaki kod bloğunun çalıştırılmasından sonra elde edilen güven ölçütü değerleri aşağıda grafikte verilmiştir.

Eğer kurduğumuz modeldeki kuralları güven, destek ve lift değerleri ile birlikte dinamik formatta (html) olarak görmek ve kaydetmek istersek aşağıdaki kod bloğunu yazabiliriz.
html <- inspectDT(model)
htmlwidgets::saveWidget(html, "kurallar.html", selfcontained = FALSE)
browseURL("kurallar.html")
Yukarıdaki kod bloğu çalıştırıldıktan sonra karşınıza aşağıdaki ekran görüntüsü gelecektir. Buradan ölçütleri eşik değerlere göre filtreleme yapabilir ve daha yakın plandan inceleyebilirsiniz.

Şimdide süpriz yapayım diyeceğim ama süpriz olmayacak 🙂 . Kurulan model ile ilgili simülasyon oluşturmak istersek ise aşağıdaki kod bloğunu yazmamız yeterli olacaktır. Bu simülasyon, model ile ilgili parametre yani ölçüt değerlerini değiştirmekten tutun da grafikler elde etmeye ve csv uzantılı olarak verileri kaydetmeye kadar pek değişikliğe olanak sağlamaktır. Kısaca bu simülasyon ara yüzü ile kurduğunuz modeli dilediğiniz gibi tasarlayabilir ve dizayn edebilirsiniz.
ruleExplorer(model, parameter = NULL)
Yukarıdaki kod bloğu çalıştırıldıktan sonra karşınıza aşağıdaki gibi simülasyon (Association Rule Explorer) ara yüz ekran görüntüsü gelecektir. Buradan ölçütleri dilediğiniz gibi değiştirebilir ve model iyileştirmeleri yapabilirsiniz.

Model kural ağının ve gruplandırılmış ürün grafiklerinin oluşturulması
Kurulan modelde ilişki kurallarının ağını çizmek ve onları yorumlamak mümkündür. Ancak ağın tamamını çizmek anlaşılırlığı azaltacağından aşağıda yazılan kod bloğu ile modeldeki ilk 30 ve son 15 kuralların ağ grafiği bu kısımda verilmiştir. Bunun nedeni oluşturulan kural gruplarının giderek artan ürün sayısına sahip olmasıdır.
#İlk 30 kural
set.seed(61) #ağ yapısını sabitlemek için
plot(head(model,30), method="graph", main="Modeldeki Ürünlerin İlk 30 Kural Ağı")
#Son 15 kural
set.seed(61) #ağ yapısını sabitlemek için
plot(tail(model,15), method="graph", main="Modeldeki Ürünlerin Son 15 Kural Ağı")
Yukarıdaki kod bloğunun ilk iki satırı çalıştırıldığında elde edilen ilk 30 kural ağı aşağıdaki ağ grafiğinde verilmiştir. Aşağıdaki grafikte destek ölçütü değerinin büyüklüğü dairenin büyüklüğü, lift değerinin büyüklüğü ise renk tonu ile doğru orantılı olarak değişiklik göstermektedir. Yani daire ne kadar büyükse destek (support) değeri, dairenin renki ne kadar koyu tonlarda ise lift değeri o kadar yüksek demektir.

Yukarıdaki kod bloğunun son iki satırı çalıştırıldığında elde edilen son 15 kural ağı aşağıdaki ağ grafiğinde verilmiştir. Aşağıdaki grafikte destek ölçütü değerinin büyüklüğü dairenin büyüklüğü, lift değerinin büyüklüğü ise renk tonu ile doğru orantılı olarak değişiklik göstermektedir. Yani daire ne kadar büyükse destek (support) değeri, dairenin renki ne kadar koyu tonlarda ise lift değeri o kadar yüksek demektir.

Şimdi de ilk 20 kuralın gruplandırılmış matrisini aşağıda yazılan kod bloğu ile verelim. Son 20 kural burada verilmemiştir. Bunun nedeni gruplar içerisindeki ürün sayısının artışına bağlı olarak matrisin aşırı karmaşık hal almasıdır.
set.seed(61)
plot(head(model,20), method = "grouped", main="Modeldeki Ürünlerin İlk 20 Gruplandırılmış Matrisi")
Yukarıdaki kod bloğu çalıştırıldığında elde edilen ilk 20 kuralın gruplandırılmış ürün matrisi aşağıdaki grafikte verilmiştir.

Model Lift değerlerinin incelenmesi
Kurulan modelde en yüksek lift ölçütü değerlerine göre sahip ilk 10 kurala aşağıda yazılan kod bloğu ile bakalım.
inspectDT(head(model, by = "lift", 10))
Yukarıdaki kod bloğunun çalıştırılmasından sonra kurulan modelde en yüksek lift değerine sahip ilk 10 kural aşağıdaki tabloda verilmiştir. İdeal lift değerlerinin 1’den büyük olması istenir. Seçilen kurallara bakıldığında lift değerleri ile birlikte güven ve destek ölçüt eşik değerlerinin karşılandığını göstermektedir. Tabi biz burada en yüksek lift değerine sahip ilk 10 kuralı verdik. Dilerseniz araştırmanızın amacına ve tasarımına bağlı olarak ilk 20 veya son 30 gibi kurallar belirleyebilirsiniz. Bu tamamen sizin ne yapmak istediğiniz ile ilgili olan bir şeydir.

Belirli kuralları inceleme
Kurulan modelde sadece belirli kuralları, örneğin rhs (Y) kuralına göre luppo ürününe bakacak olursak aşağıdaki gibi bir kod bloğu yazabiliriz. Kurulan modele göre gruplarda oluşacak ürün sayısı en az iki en fazla ise 10’dur.
luppo_rhs <- apriori(islem,
parameter = list(supp=0.3, conf=0.5,
maxlen=10,
minlen=2),
appearance = list(default="lhs", rhs="luppo"))
inspect(luppo_rhs[1:10])
Yukarıdaki R kod bloğunun çalıştırılmasından sonra diğer ürünlerin sağ tarafında (rhs:right-hand-side) yer alan Luppo ürününe giden ilk 10 kural aşağıdaki tabloda verilmiştir. Örneğin ilk sıradaki kuraldan şunu anlamamız gerekir; {Zeytin} -> {luppo} yani zeytinin bulunduğu bir ürün kümesinde lupponun da bulunma olasılığı güven (confidence) değerine bakacak olursak % 75’dir. Ancak lift değeri 1’in altında olduğu için yorumlamaktan kaçınmak yerinde olacaktır. Diğer taraftan ikinci satıda yer alan süt ürününün bulunduğu bir ürün kümesinde lupponun da bulunma olasılığı güven (confidence) değerine bakacak olursak % 100’dür. Aynı zamanda burada lift değeri 1’den de büyüktür.

Yukarıda Luppo ürünü ile ilgili olarak kurulan modelde diğer ürünlere göre sağ tarafta (rhs:right-hand-side) yer alan luppo ürününe giden son 10 kural ise aşağıda yazılan kod bloğunda verilmiştir.
inspectDT(tail(luppo_rhs,10))
Yukarıdaki R kod bloğunun çalıştırılmasından sonra diğer ürünlerden sağ tarafta (rhs:right-hand-side) yer alan Luppo ürününe giden son 10 kural verilmiştir. İlk satırdaki yorumlamak ile işe başlayabiliriz. {deterjan,ekmek,makarna,peynir} ürünlerin bulunduğu bir ürün kümesinde lupponun da bulunma olasılığı ({deterjan,ekmek,makarna,peynir} -> {luppo}) güven (confidence) değerine bakacak olursak % 100’dür. Lift değeri ise 1’in üstünde olduğu için makuldur. Aşağıdaki bütün ürün grupları esasında güven, destek ve lift ölçütlerine ilişkin değerleri eşik değerlerin üzerindedir. Dolayısıyla tamamı kabul edilebilir ve yorumlanabilirdir. Dilerseniz sizler de diğer ürünlerin rhs (X) ve lhs (Y) parametrelerini modele girerek bu ürünlere de ulaşabilirsiniz.

Yukarıda Luppo ürünü ile ilgili olarak modelde diğer ürünlere göre sağ tarafta (rhs:right-hand-side) yer alan Luppo ürününe giden son 10 ve ilk 15 kuralın ağ yapısı yukardaki tablonun yanı sıra aşağıda yazılan kod bloğu ile de verilmiştir.
#son 10 kural
plot(tail(luppo_rhs,10), method="graph", main="Luppo Ürünü Son 10 Kural (RHS) Ağı")
#ilk 15 kural
plot(head(luppo_rhs,15), method="graph", main="Luppo Ürünü İlk 15 Kural (RHS) Ağı")
Yukarıda yer alan kod bloğunun çalıştırılmasından sonra Luppo ürününe giden son 10 kuralın ağ yapısı aşağıda verilmiştir. Aşağıdaki grafikte destek ölçütü değerinin büyüklüğü dairenin büyüklüğü, lift değerinin büyüklüğü ise renk tonu ile doğru orantılı olarak değişiklik göstermektedir. Yani daire ne kadar büyükse destek (support) değeri, dairenin renki ne kadar koyu tonlarda ise lift değeri o kadar yüksek demektir.

Yukarıda yer alan kod bloğunun çalıştırılmasından sonra Luppo ürününe giden ilk 15 kuralın ağ yapısı aşağıda verilmiştir. Aşağıdaki grafikte destek ölçütü değerinin büyüklüğü dairenin büyüklüğü, lift değerinin büyüklüğü ise renk tonu ile doğru orantılı olarak değişiklik göstermektedir. Yani daire ne kadar büyükse destek (support) değeri, dairenin renki ne kadar koyu tonlarda ise lift değeri o kadar yüksek demektir.

Şimdi de kurulan Luppo ürünü modelinin gruplandırılmış matrisini aşağıda yazılan kod bloğu ile verelim.
set.seed(61)
plot(luppo_rhs, method = "grouped", main="Luppo Ürünü Gruplandırılmış Matrisi")
Yukarıdaki kod bloğu çalıştırıldığında elde edilen Luppo ürünü gruplandırılmış matrisi aşağıdaki grafikte verilmiştir.

Luppo ürünü Lift değerlerinin incelenmesi
Kurulan luppo ürünü modelinde en yüksek lift ölçütü değerlerine göre sahip ilk 10 kurala aşağıda yazılan kod bloğu ile bakalım.
inspectDT(head(luppo_rhs, by = "lift", 10))
Yukarıdaki kod bloğunun çalıştırılmasından sonra kurulan Luppo ürünü modelinde en yüksek lift değerine sahip ilk 10 kural aşağıdaki tabloda verilmiştir. İdeal lift değerlerinin 1’den büyük olması istenir. Seçilen kurallara bakıldığında lift değerleri ile birlikte güven ve destek ölçüt eşik değerlerinin karşılandığını göstermektedir. Tabi biz burada en yüksek lift değerine sahip ilk 10 kuralı verdik. Dilerseniz araştırmanızın amacına ve tasarımına bağlı olarak ilk 20 veya son 30 gibi kurallar belirleyebilirsiniz. Bu tamamen sizin ne yapmak istediğiniz ile ilgili olan bir şeydir.

Yukarıdaki kod bloğunun çalıştırılmasından sonra kurulan modelde en yüksek lift değerine sahip ilk 10 kural aşağıdaki tabloda verilmiştir. İdeal lift değerlerinin 1’den büyük olması istenir. Seçilen kurallara bakıldığında lift değerleri ile birlikte güven ve destek ölçüt eşik değerlerinin karşılandığını göstermektedir. Tabi biz burada en yüksek lift değerine sahip ilk 10 kuralı verdik. Dilerseniz araştırmanızın amacına ve tasarımına bağlı olarak ilk 20 veya son 30 gibi kurallar belirleyebilirsiniz. Bu tamamen sizin ne yapmak istediğiniz ile ilgili olan bir şeydir.
Yukarıdaki Luppo ürününe ilişkin kurulan modelde elde edilen kuralların tamamını ölçütlerle birlikte eğer excel çalışma kitabına yazdırmak istersek aşağıdaki kod bloğunu yazmamız yeterlidir.
luppo_kural=inspect(luppo_rhs)
write_xlsx(luppo_kural, "luppo.xlsx")
Yukarıdaki kod bloğunun çalıştırılmasından sonra luppo ürününe ilişkin elde elde edilen rhs (sağ taraf) kuralları (R=121)’nın tamamını xlsx formatında aşağıdaki linkten indirebilirsiniz.
2. Modelin kurulması
Aşağıda yazılan R kod bloğu ile 2. model kurulmuş, ardından kurallar Microsoft excel çalışma kitabına yazdırılmıştır. Pazar sepet analizlerinde alınan ürünler arasındaki ilişki düzeyleri tanımlamada temel iki ölçütten yararlanılmaktadır. Bunlardan ilki destek (support), diğeri ise güven (confidence) ölçütleridir. 2. modelde minimum destek oranı değerimiz 0,5, güven olasılık değerimiz ise 0,6 olarak alınmıştır.
model2 <- apriori(islem,
parameter = list(supp=0.5, conf=0.6,
maxlen=10,
target= "rules"))
summary(model2)
Yukarı kod bloğundaki model çalıştırıldıktan elde edilen model sonuçları aşağıda verilmiştir. Elde edilen bulgulara göre;
- Modelimiz 36 kuraldan oluşmaktadır. Diğer ifadeyle lhs (X) ve rhs (Y) kural uzunlukların toplamı (R)= 4+20+12=36’ya eşittir.
- Ortalama lift değerleri 1’in üzerindedir. Bu bulgu X ürünü satın alınırsa Y ürünü satın alınma olasılığının da yüksek olduğunu göstermektedir.
- Güven ve destek ölçüt değerleri de belirlenmiş eşik değerlerin yani destek ölçütü için 0,5, güven için 0,6’nın üzerindedir.
Absolute minimum support count: 4
set item appearances ...[0 item(s)] done [0.00s].
set transactions ...[12 item(s), 9 transaction(s)] done [0.00s].
sorting and recoding items ... [7 item(s)] done [0.00s].
creating transaction tree ... done [0.00s].
checking subsets of size 1 2 3 done [0.00s].
writing ... [36 rule(s)] done [0.00s].
creating S4 object ... done [0.00s].
set of 36 rules
rule length distribution (lhs + rhs):sizes
1 2 3
4 20 12
Min. 1st Qu. Median Mean 3rd Qu. Max.
1.000 2.000 2.000 2.222 3.000 3.000
summary of quality measures:
support confidence coverage lift count
Min. :0.5556 Min. :0.6250 Min. :0.5556 Min. :0.9184 Min. :5.000
1st Qu.:0.5556 1st Qu.:0.7143 1st Qu.:0.5556 1st Qu.:1.0000 1st Qu.:5.000
Median :0.5556 Median :0.8333 Median :0.7778 Median :1.1250 Median :5.000
Mean :0.5988 Mean :0.8339 Mean :0.7377 Mean :1.1088 Mean :5.389
3rd Qu.:0.5556 3rd Qu.:1.0000 3rd Qu.:0.8889 3rd Qu.:1.1652 3rd Qu.:5.000
Max. :0.8889 Max. :1.0000 Max. :1.0000 Max. :1.2857 Max. :8.000
2. Model kurallarının excel (xlsx) çalışma kitabına yazdırılması
i2=inspect(model2)
write_xlsx(i2, "2.modelkurallar.xlsx")
Yukarıdaki kod bloğunun çalıştırılmasından sonra excel çalışma kitabına yazdırılan kurallar (R=36) setini ölçüt değerleriyle birlikte aşağıdaki linkten indirebilirsiniz.
Kurulan 2. modelden üretilen kurallar (R=36) lift değerlerinin büyüklüğüne göre büyükten küçüğe doğru sıralanmış ve aşağıdaki tabloda verilmiştir.
lhs | rhs | support | confidence | coverage | lift | count | |
{ekmek} | => | {makarna} | 0,556 | 1,000 | 0,556 | 1,286 | 5 |
{makarna} | => | {ekmek} | 0,556 | 0,714 | 0,778 | 1,286 | 5 |
{peynir} | => | {makarna} | 0,556 | 1,000 | 0,556 | 1,286 | 5 |
{makarna} | => | {peynir} | 0,556 | 0,714 | 0,778 | 1,286 | 5 |
{ekmek,luppo} | => | {makarna} | 0,556 | 1,000 | 0,556 | 1,286 | 5 |
{luppo,makarna} | => | {ekmek} | 0,556 | 0,714 | 0,778 | 1,286 | 5 |
{luppo,peynir} | => | {makarna} | 0,556 | 1,000 | 0,556 | 1,286 | 5 |
{luppo,makarna} | => | {peynir} | 0,556 | 0,714 | 0,778 | 1,286 | 5 |
{deterjan,luppo} | => | {makarna} | 0,556 | 1,000 | 0,556 | 1,286 | 5 |
{süt} | => | {luppo} | 0,556 | 1,000 | 0,556 | 1,125 | 5 |
{luppo} | => | {süt} | 0,556 | 0,625 | 0,889 | 1,125 | 5 |
{ekmek} | => | {luppo} | 0,556 | 1,000 | 0,556 | 1,125 | 5 |
{luppo} | => | {ekmek} | 0,556 | 0,625 | 0,889 | 1,125 | 5 |
{peynir} | => | {luppo} | 0,556 | 1,000 | 0,556 | 1,125 | 5 |
{luppo} | => | {peynir} | 0,556 | 0,625 | 0,889 | 1,125 | 5 |
{makarna} | => | {luppo} | 0,778 | 1,000 | 0,778 | 1,125 | 7 |
{luppo} | => | {makarna} | 0,778 | 0,875 | 0,889 | 1,125 | 7 |
{ekmek,makarna} | => | {luppo} | 0,556 | 1,000 | 0,556 | 1,125 | 5 |
{makarna,peynir} | => | {luppo} | 0,556 | 1,000 | 0,556 | 1,125 | 5 |
{deterjan,makarna} | => | {luppo} | 0,556 | 1,000 | 0,556 | 1,125 | 5 |
{makarna,tomates} | => | {luppo} | 0,556 | 1,000 | 0,556 | 1,125 | 5 |
{deterjan} | => | {makarna} | 0,556 | 0,833 | 0,667 | 1,071 | 5 |
{makarna} | => | {deterjan} | 0,556 | 0,714 | 0,778 | 1,071 | 5 |
{luppo,makarna} | => | {deterjan} | 0,556 | 0,714 | 0,778 | 1,071 | 5 |
{luppo,tomates} | => | {makarna} | 0,556 | 0,833 | 0,667 | 1,071 | 5 |
{} | => | {deterjan} | 0,667 | 0,667 | 1,000 | 1,000 | 6 |
{} | => | {tomates} | 0,778 | 0,778 | 1,000 | 1,000 | 7 |
{} | => | {makarna} | 0,778 | 0,778 | 1,000 | 1,000 | 7 |
{} | => | {luppo} | 0,889 | 0,889 | 1,000 | 1,000 | 8 |
{luppo} | => | {tomates} | 0,667 | 0,750 | 0,889 | 0,964 | 6 |
{tomates} | => | {luppo} | 0,667 | 0,857 | 0,778 | 0,964 | 6 |
{deterjan} | => | {luppo} | 0,556 | 0,833 | 0,667 | 0,938 | 5 |
{luppo} | => | {deterjan} | 0,556 | 0,625 | 0,889 | 0,938 | 5 |
{tomates} | => | {makarna} | 0,556 | 0,714 | 0,778 | 0,918 | 5 |
{makarna} | => | {tomates} | 0,556 | 0,714 | 0,778 | 0,918 | 5 |
{luppo,makarna} | => | {tomates} | 0,556 | 0,714 | 0,778 | 0,918 | 5 |
Yapılan apriori algoritması çalışması ile veri bilimi (data science) ile ilgilenen akademi ve saha çalışanlarına bir katkı sunulması amaçlanmıştır.
Faydalı olması ve farkındalık oluşturması dileğiyle.
Bilimle ve teknolojiyle kalınız.
Saygılarımla.
Not: Kaynak gösterilmeden alıntı yapılamaz veya kopyalanamaz.
Note: It can not be cited or copied without referencing.
Yararlanılan Kaynaklar
- The R Project for Statistical Computing. https://www.r-project.org/
- Microsoft Excel 2016, Microsoft
- https://cran.r-project.org/web/packages/arulesViz/arulesViz.pdf.
- https://www.rdocumentation.org/packages/RColorBrewer/versions/1.1-2/topics/RColorBrewer
- http://snap.stanford.edu/class/cs246-2013/slides/02-assocrules.pdf
- https://web.stanford.edu/class/cs246/slides/02-assocrules.pdf.
- https://ocw.mit.edu/courses/sloan-school-of-management/15-097-prediction-machine-learning-and-statistics-spring-2012/lecture-notes/MIT15_097S12_lec01.pdf.
- Schmidt-Thieme, L. (2004). Algorithmic Features of Eclat. FIMI.
- https://www.kirenz.com/post/2020-05-14-r-association-rule-mining/
- Markus Hegland The Apriori Algorithm–a Tutorial. Mathematics and Computation in Imaging Science and Information Processing, pp. 209-262 (2007). DOI: 10.1142/9789812709066_0006
- Rakesh Agrawal, Tomasz Imieliński, and Arun Swami. 1993. Mining association rules between sets of items in large databases. In Proceedings of the 1993 ACM SIGMOD international conference on Management of data (SIGMOD ’93). Association for Computing Machinery, New York, NY, USA, 207–216. DOI:https://doi.org/10.1145/170035.170072
- https://ab.org.tr/ab16/bildiri/46.pdf
- Christian Borgelt (2012) Frequent Item Set Mining. Wiley Interdisciplinary Reviews: Data Mining and Knowledge Discovery 2(6):437-456. J. Wiley & Sons, Chichester, United Kingdom 2012. 10.1002/widm.1074
- Christian Borgelt and Rudolf Kruse (2002) Induction of Association Rules: Apriori Implementation. 15th Conference on Computational Statistics (COMPSTAT 2002, Berlin, Germany) Physica Verlag, Heidelberg, Germany.
- Christian Borgelt (2003) Efficient Implementations of Apriori and Eclat. Workshop of Frequent Item Set Mining Implementations (FIMI 2003, Melbourne, FL, USA).