Apriori Algoritması Üzerine Bir Vaka Çalışması: A Case Study on Apriori Algorithm

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ı(XY)/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

  1. Apriori algoritmasına uygun model veri setini oluşturunuz.
  2. Apriori modelini kurunuz.
  3. Güven, destek ve lift ölçüt değerlerinin grafiklerini çiziniz.
  4. Modelde ilk ve son en az 10 kuralın ağ ve gruplandırılmış matris grafiklerini çiziniz.
  5. Kurulan modelde en yüksek lift değerlerine sahip ilk 10 kuralı tablo halinde veriniz.
  6. Diğer ürünlerin yanında Luppo ürünü alınan durumların (rhs) kurallarını gösteriniz.
  7. Kurulan Luppo ürün modelinde en yüksek lift değerlerine sahip ilk 10 kuralı tablo halinde veriniz.
  8. Analizlerde elde edilen veri setlerini xlsx formatında oluşturunuz.
  9. 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

  1. 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
İ1deterjan
İ1zeytin
İ1tomates
İ2luppo
İ2deterjan
İ2makarna
İ2süt
İ3cay
İ3tomates
İ3luppo
İ3seker
İ3süt
İ4makarna
İ4ekmek
İ4peynir
İ4luppo
İ4süt
İ4tomates
İ5deterjan
İ5peynir
İ5patates
İ5ekmek
İ5luppo
İ5soğan
İ5makarna
İ6tomates
İ6süt
İ6soğan
İ6ekmek
İ6patates
İ6luppo
İ6makarna
İ6seker
İ7cay
İ7deterjan
İ7makarna
İ7peynir
İ7tomates
İ7luppo
İ7zeytin
İ7soğan
İ7ekmek
İ8cay
İ8makarna
İ8seker
İ8deterjan
İ8soğan
İ8luppo
İ8zeytin
İ8peynir
İ8patates
İ8tomates
İ9tomates
İ9seker
İ9deterjan
İ9patates
İ9luppo
İ9ekmek
İ9peynir
İ9cay
İ9zeytin
İ9makarna
İ9sü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.

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

lhsrhssupportconfidencecoverageliftcount
{}=>{süt}0,5560,5561,0001,0005,000
{}=>{ekmek}0,5560,5561,0001,0005,000
{}=>{peynir}0,5560,5561,0001,0005,000
{}=>{deterjan}0,6670,6671,0001,0006,000
{}=>{tomates}0,7780,7781,0001,0007,000
{}=>{makarna}0,7780,7781,0001,0007,000
{}=>{luppo}0,8890,8891,0001,0008,000
{zeytin}=>{cay}0,3330,7500,4441,6883,000
{cay}=>{zeytin}0,3330,7500,4441,6883,000
{zeytin}=>{peynir}0,3330,7500,4441,3503,000
{peynir}=>{zeytin}0,3330,6000,5561,3503,000
{zeytin}=>{deterjan}0,4441,0000,4441,5004,000
{deterjan}=>{zeytin}0,4440,6670,6671,5004,000
{zeytin}=>{tomates}0,4441,0000,4441,2864,000
{tomates}=>{zeytin}0,4440,5710,7781,2864,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.

lhsrhssupportconfidencecoverageliftcount
{ekmek}=>{makarna}0,5561,0000,5561,2865
{makarna}=>{ekmek}0,5560,7140,7781,2865
{peynir}=>{makarna}0,5561,0000,5561,2865
{makarna}=>{peynir}0,5560,7140,7781,2865
{ekmek,luppo}=>{makarna}0,5561,0000,5561,2865
{luppo,makarna}=>{ekmek}0,5560,7140,7781,2865
{luppo,peynir}=>{makarna}0,5561,0000,5561,2865
{luppo,makarna}=>{peynir}0,5560,7140,7781,2865
{deterjan,luppo}=>{makarna}0,5561,0000,5561,2865
{süt}=>{luppo}0,5561,0000,5561,1255
{luppo}=>{süt}0,5560,6250,8891,1255
{ekmek}=>{luppo}0,5561,0000,5561,1255
{luppo}=>{ekmek}0,5560,6250,8891,1255
{peynir}=>{luppo}0,5561,0000,5561,1255
{luppo}=>{peynir}0,5560,6250,8891,1255
{makarna}=>{luppo}0,7781,0000,7781,1257
{luppo}=>{makarna}0,7780,8750,8891,1257
{ekmek,makarna}=>{luppo}0,5561,0000,5561,1255
{makarna,peynir}=>{luppo}0,5561,0000,5561,1255
{deterjan,makarna}=>{luppo}0,5561,0000,5561,1255
{makarna,tomates}=>{luppo}0,5561,0000,5561,1255
{deterjan}=>{makarna}0,5560,8330,6671,0715
{makarna}=>{deterjan}0,5560,7140,7781,0715
{luppo,makarna}=>{deterjan}0,5560,7140,7781,0715
{luppo,tomates}=>{makarna}0,5560,8330,6671,0715
{}=>{deterjan}0,6670,6671,0001,0006
{}=>{tomates}0,7780,7781,0001,0007
{}=>{makarna}0,7780,7781,0001,0007
{}=>{luppo}0,8890,8891,0001,0008
{luppo}=>{tomates}0,6670,7500,8890,9646
{tomates}=>{luppo}0,6670,8570,7780,9646
{deterjan}=>{luppo}0,5560,8330,6670,9385
{luppo}=>{deterjan}0,5560,6250,8890,9385
{tomates}=>{makarna}0,5560,7140,7780,9185
{makarna}=>{tomates}0,5560,7140,7780,9185
{luppo,makarna}=>{tomates}0,5560,7140,7780,9185

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

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Google fotoğrafı

Google hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Connecting to %s