Anasayfa / Makine Öğrenmesi / Birliktelik Kuralları Analizi / Python ile Birliktelik Kuralları Analizi (Association Rules Analysis with Python)

Python ile Birliktelik Kuralları Analizi (Association Rules Analysis with Python)

Merhabalar,

Bu gün sizlerde birlikte Python üzerinde Birliktelik Kuralları Analizi çalışmasını gerçekleştireceğiz. Çok daha evvel olması yazılması planlanan bu yazı için lütfen kusuruma bakmayınız. ☹ Birliktelik Kuralları Analizi (Association Rules Analysis) hakkındaki daha önceki yazılara aşağıdaki linklerden ulaşabilirsiniz.

  1. Birliktelik Kuralları Analizi (Association Rules Analysis) https://www.veribilimiokulu.com/associationrulesanalysis/
  1. R ile Birliktelik Kuralları Analizi (Association Rules Analysis with R Project) https://www.veribilimiokulu.com/association-rules-analysis-with-r/
  1. IBM SPSS Modeler ile Birliktelik Kuralları Analizi (Association Rules Analysis with IBM SPSS Modeler) https://www.veribilimiokulu.com/association-rules-analysis-with-ibm-spss-modeler/

Şimdi sıra Python’da 😊

Python üzerinde Birliktelik Kuralları Analizi için kullanacağım kütüphaneler başlıca kütüphaneler: mlxtend, pandas ve numpy

MLXTEND (Machine Learning Extensions)

MLXTEND modülü içerisinde; classifier, cluster, regressor, evaluate, feature extraction&selection, frequent_patterns, general concepts, image, preprocessing, , math, plotting vb. extension’lar yer almaktadır. Şuanki mevcut sürümü BSD lisansı altında 0.13.0’tür. Kendisi hakkında daha fazla bilgi elde etmek isterseniz resmi web sayfasını inceleyebilir ve yazarı Sebastian Raschka hakkında buradan bilgi edinebilirsiniz.

Numpy ve Pandas

Numpy ve Pandas paketleri ise, Matris İşlemleri ve Input&Output işlemleri için kullanmaktayım.

Not: Kullanmış olduğum; Python versiyonu 3.6.8 ve IDE(Integrated Development Environment) olarak Jupyter Notebook kullanmaktayım. Github repo’sunda .ipynb ve.py dosyasını paylaşacağım.

Gerekli Modüllerin Kurulması

Bu projeye ait Github reposu içerisinde requirements.txt dosyası yer alacaktır. Bu dosyayı ilgili dizinde iken komut istemi kısmında

ya da

olarak çalıştırmanız ve kurulumları yapmanız gerekmektedir. Ya da modülleri manuel olarak aşağıdaki gibi kurabilirsiniz.

ya da Conda Package Manager ile

Conda Forge mlxtend github reposu: https://github.com/conda-forge/mlxtend-feedstock

Modülleri Import Edelim

Veri Seti Oluşturma

Bu uygulama da daha öncekilerden farklı olarak veri setini kendimiz oluşturacağız. Hazır bir veri setinden ziyade kendimizin yazacağı ufak kodlar ile veri setini oluşturacağız. Burada oluşturacağımız veri seti gerçek dünya verisi olmadığı için birliktelik kuralları analizinde farklı çıktılar ile karşılaşmamız yüksek ile muhtemel 🙂

Veri setini oluştururken bazı kurallarımız olacak. Adımlar:

  1. Ürün listesinin belirlenmesi: 16 Adet (‘Apple’,’Corn’,’Dill’,’Eggs’, ‘Ice cream’,’Kidney Beans’,’Milk’,’Nutmeg’, ‘Onion’,’Unicorn’,’Yogurt’, ‘Bread’, ‘Cheese’, ‘Butter’, ‘Sugar’,’Chocolate’)
  1. Veri setinin içerisindeki gözlem sayısının belirlenmesi: 1000 Adet
Ben 16 adet ürün belirleyerek bunları bir listeye yazdım. Devamında 1 ile bu ürünlerin sayısı olan 16 arasında rasgele bir üreterek random.choices fonksiyonu ile itemset listesi içerisinden ürünlerin seçilmesi sağlıyoruz. Bu veri seti içerisinde 1000 adet gözlem olması istediğim için de for döngüsü ile 2. adımı tekrarlıyoruz. Devamında veri setimiz oluşuyor.

Veri Seti Output: ./output/dataset.csv

Veri setinin boyutu: 1000 (0 – 999)

İlk 5 Satırı Görelim:

Son 5 Satırı Görelim:

random.choices kullandığımız gibi random.sample fonksiyonunu da kullanabiliriz. Random.sample kullanmanız aynı satır içerisindeki ürünlerin benzersizliği sağlayacaktır. Yukarıda yorum satırı olarak bıraktığım (#random.sample) satırı çalıştırarak görebilirsiniz.

Veri setini oluşturduktan sonra nested list (iç içe liste) tipindeki verilerimizi tabular bir yapıya çevirmemiz gerekiyor. Bunun için mlxtend modülü içerisinde yer alan preprocessing sınıfı içerisinde TransactionEncoder fonksiyonunu kullanacağız.

Not: from mlxtend.preprocessing import TransactionEncoder

Not: TransactionEncoder hakkında daha fazla bilgi için: http://rasbt.github.io/mlxtend/user_guide/preprocessing/TransactionEncoder/

Şimdi de tabular formattaki verisetimizi görelim:

Apple Bread Butter Cheese Chocolate Corn Dill Eggs Ice cream Kidney Beans Milk Nutmeg Onion Sugar Unicorn Yogurt
0 False False False False True True False True False True False False False True True False
1 False False False True False True False False False False False True True True False False
2 True False False False True True False False False False False False False False True False
3 True True True True False False True False False True True True False True False True
4 False False False False True False False False False False False False True False False False

Model Oluşturma

Veri setimizi birliktelik kuralları analizi için uygun hale getirdikten sonra artık Apriori algoritmasını kullanabiliriz. mlxtend modülü içerisinde yer alan apriori() fonksiyonu yukarıda import etmiştik.

Not: from mlxtend.frequent_patterns import apriori

min_support değerini 0.1 yani %10 vererek apriori algoritması için başlangıç değerlerini set ediyoruz.

Not: Apriori hakkında daha fazla bilgi için : http://rasbt.github.io/mlxtend/user_guide/frequent_patterns/apriori/

support itemsets
1 0.368368 (1)
2 0.377377 (2)
3 0.371371 (3)
4 0.376376 (4)
5 0.376376 (5)
6 0.356356 (6)
7 0.405405 (7)
8 0.399399 (8)
9 0.364364 (9)
10 0.382382 (10)
11 0.359359 (11)
12 0.380380 (12)
13 0.379379 (13)
14 0.389389 (14)
15 0.375375 (15)
16 0.160160 (0, 1)
17 0.164164 (0, 2)
18 0.157157 (0, 3)
19 0.171171 (0, 4)
20 0.154154 (0, 5)
21 0.150150 (0, 6)
22 0.172172 (0, 7)
23 0.176176 (0, 8)
24 0.151151 (0, 9)
25 0.165165 (0, 10)
Not: Tablodaki itemset kolonu içerisinde yazan rakamları ürünleri (0-15) ifade etmektedir. 0 no’lu ürün Apple, 1 no’lu ürü Bread olarak 15 no’lu ürün ise Yogurt ifade etmektedir.
Şimdi de apriori algoritması içerisinde use_colnames=True parametresini kullanarak items(ürünler) numaralarından item(ürün) isimlerine geçiş yapıyoruz.
support itemsets
1 0.368368 (Bread)
2 0.377377 (Butter)
3 0.371371 (Cheese)
4 0.376376 (Chocolate)
5 0.376376 (Corn)
6 0.356356 (Dill)
7 0.405405 (Eggs)
8 0.399399 (Ice cream)
9 0.364364 (Kidney Beans)
10 0.382382 (Milk)
11 0.359359 (Nutmeg)
12 0.380380 (Onion)
13 0.379379 (Sugar)
14 0.389389 (Unicorn)
15 0.375375 (Yogurt)
16 0.160160 (Bread, Apple)
17 0.164164 (Butter, Apple)
18 0.157157 (Cheese, Apple)
19 0.171171 (Chocolate, Apple)
20 0.154154 (Corn, Apple)
21 0.150150 (Dill, Apple)
22 0.172172 (Eggs, Apple)
23 0.176176 (Ice cream, Apple)
24 0.151151 (Kidney Beans, Apple)
25 0.165165 (Milk, Apple)
Yukarıdaki tabloda tekli, ikili ve üçlü itemset’lerin oluştuğu görülmektedir. min_support değeri (0.15) değerini set edip kuralları rule setleri oluşturduktan sonra ilgilendiğimiz metriğe göre (confidence, lift, conviction ve vd.) Association Rules tablosunu oluşturuyoruz. Burada metric olarak Confidence ve değerini 0.3 (%30) seçtik.
Not: from mlxtend.frequent_patterns import association_rules
Not: association_rules hakkında daha fazla bilgi için: http://rasbt.github.io/mlxtend/user_guide/frequent_patterns/association_rules/
Oluşan Kural Sayısı:
Confidence metriğine göre (Z-A) 10 Kural:
antecedents consequents antecedent support consequent support support confidence lift leverage conviction
40 (Bread) (Ice cream) 0.368368 0.399399 0.180180 0.489130 1.224665 0.033054 1.175644
99 (Chocolate) (Corn) 0.376376 0.376376 0.182182 0.484043 1.286060 0.040523 1.208673
98 (Corn) (Chocolate) 0.376376 0.376376 0.182182 0.484043 1.286060 0.040523 1.208673
39 (Bread) (Eggs) 0.368368 0.405405 0.177177 0.480978 1.186413 0.027839 1.145606
121 (Dill) (Corn) 0.356356 0.376376 0.171171 0.480337 1.276215 0.037047 1.200054
178 (Sugar) (Ice cream) 0.379379 0.399399 0.182182 0.480211 1.202333 0.030658 1.155470
62 (Butter) (Ice cream) 0.377377 0.399399 0.181181 0.480106 1.202070 0.030457 1.155237
81 (Cheese) (Eggs) 0.371371 0.405405 0.178178 0.479784 1.183468 0.027622 1.142977
167 (Unicorn) (Eggs) 0.389389 0.405405 0.185185 0.475578 1.173093 0.027325 1.133810
170 (Kidney Beans) (Ice cream) 0.364364 0.399399 0.173173 0.475275 1.189974 0.027646 1.144600
Yorum 1: ID bilgisi 40 olan satırı inceleyecek olursak;
  • Bread ve Ice Cream item’larının birlikte görülme olasılığı (support) %18 (0.18) olduğunu,
  • Bread item’ının satın alan kişilerin (confidence)  %48’inin (0.489130) olasılıkla  Ice Cream item’ınıda satın aldığını,
  • Bread item’ının yer aldığı alışveriş sepetlerin de Ice Cream item’ının satışı (lift) 1,224 kat arttığı,
  • Bread ve Ice Cream item’larının birlikte satın alınmalarının ile birbirlerinden bağımsız olarak satın alınmalarından ne kadar fazla (leverage) 0.03 olduğunu,
  • Bread ve Ice Cream item’larının birbirleri ile ilişkili (conviction) 1.17 değeri ile olduğunu  söyleyebiliriz.

Daha önceki yazılarımızda tablo’da görülenler diğer değerlerin açıklamalarını ve hesaplamalarının nasıl yapıldığının üzerinden geçmiştik. Bu yüzden genel olarak önem atfedilen support, condifence, lift, leverage ve conviction metrikleri üzerinden yorumlar da bulundum. Diğer kısımlar için lütfen eski sayılara bakınız 🙂

Metrikler hakkında daha fazlasını görmek isterseniz Michael Hahsler sayfasına buradan ulaşabilirsiniz. Bu bağlantıya Dr. Tuğrul Taşçı bey’in ISE 302 sunumundan ulaştığımı belirtmek isterim.

Şimdi de antecedents ve consequents kısımlarında bulunan itemsleri sayılarını toplayalım ve ilk 5 satırı görelim:
antecedents consequents antecedent support consequent support support confidence lift leverage conviction antecedent_len consequents_len
40 (Bread) (Ice cream) 0.368368 0.399399 0.180180 0.489130 1.224665 0.033054 1.175644 1 1
99 (Chocolate) (Corn) 0.376376 0.376376 0.182182 0.484043 1.286060 0.040523 1.208673 1 1
98 (Corn) (Chocolate) 0.376376 0.376376 0.182182 0.484043 1.286060 0.040523 1.208673 1 1
39 (Bread) (Eggs) 0.368368 0.405405 0.177177 0.480978 1.186413 0.027839 1.145606 1 1
121 (Dill) (Corn) 0.356356 0.376376 0.171171 0.480337 1.276215 0.037047 1.200054 1 1
Yukarıdaki confidence metriği için yaptıklarımızı diğer metrikler içinde yapabiliriz. Github reposunda diğer metrikler için olan kısımları ekleyeceğim. Örnek olması adına lift metriği için:
Not: Bu çıktıları github reposundaki .ipynb dosyasında görebilirsiniz.
Oluşan Kural Setleri için Filtreleme
Filtre 1: Antecedent item uzunluğu 1 olan ve Confidence değeri 0.20’ye büyük eşit olan ve Lift değeri 1‘den büyük olan ilk 10 kayıtı görelim.
antecedents consequents antecedent support consequent support support confidence lift leverage conviction antecedent_len consequents_len
40 (Bread) (Ice cream) 0.368368 0.399399 0.180180 0.489130 1.224665 0.033054 1.175644 1 1
99 (Chocolate) (Corn) 0.376376 0.376376 0.182182 0.484043 1.286060 0.040523 1.208673 1 1
98 (Corn) (Chocolate) 0.376376 0.376376 0.182182 0.484043 1.286060 0.040523 1.208673 1 1
39 (Bread) (Eggs) 0.368368 0.405405 0.177177 0.480978 1.186413 0.027839 1.145606 1 1
121 (Dill) (Corn) 0.356356 0.376376 0.171171 0.480337 1.276215 0.037047 1.200054 1 1
178 (Sugar) (Ice cream) 0.379379 0.399399 0.182182 0.480211 1.202333 0.030658 1.155470 1 1
62 (Butter) (Ice cream) 0.377377 0.399399 0.181181 0.480106 1.202070 0.030457 1.155237 1 1
81 (Cheese) (Eggs) 0.371371 0.405405 0.178178 0.479784 1.183468 0.027622 1.142977 1 1
167 (Unicorn) (Eggs) 0.389389 0.405405 0.185185 0.475578 1.173093 0.027325 1.133810 1 1
Filtre 2: Benzer şekilde Antecedents item adı Bread olan ve Confidence metriğine göre [Z-A] sıralanmış ilk 10 kayıt:
antecedents consequents antecedent support consequent support support confidence lift leverage conviction antecedent_len consequents_len
54 (Bread) (Unicorn) 0.394394 0.388388 0.183183 0.464467 1.195883 0.030005 1.142061 1 1
43 (Bread) (Ice cream) 0.394394 0.409409 0.181181 0.459391 1.122082 0.019712 1.092454 1 1
52 (Bread) (Sugar) 0.394394 0.393393 0.180180 0.456853 1.161313 0.025028 1.116836 1 1
30 (Bread) (Butter) 0.394394 0.426426 0.178178 0.451777 1.059448 0.009998 1.046241 1 1
57 (Bread) (Yogurt) 0.394394 0.394394 0.178178 0.451777 1.145495 0.022631 1.104669 1 1
32 (Bread) (Cheese) 0.394394 0.398398 0.177177 0.449239 1.127611 0.020051 1.092309 1 1
39 (Bread) (Dill) 0.394394 0.409409 0.175175 0.444162 1.084886 0.013706 1.062524 1 1
40 (Bread) (Eggs) 0.394394 0.384384 0.175175 0.444162 1.155516 0.023576 1.107546 1 1
36 (Bread) (Corn) 0.394394 0.390390 0.172172 0.436548 1.118235 0.018204 1.081920 1 1
Verilen parametre değerlerine göre oluşan Birliktelik Kuralları Analizine ait oluşan kuralları .json olarak olarak export ediyoruz.
Not: PMML (Predictive Model Markup Language) gereksinimi doğrultusunda .xml olarak export edilmesi gerekmektedir.

Python üzerinden geçte olsa Birliktelik Kuralları Analizini gerçekleştirmiş bulunmaktayız. Malesef oluşan kurallar üzerinden görselleştirme yapamadık. Bu konuda mlxtend paketinin eksiklikleri olduğunu belirtebilirim. Burada başka bir şey kullanmalıyız. Bunu kendime görev addediyorum. Bulduğumda gerekli güncellemeleri geçeceğim.

Son olarak; Github üzerinde yer alan repository’e buradan (kod, input, output ve diğer dosyalara) ulaşabilirsiniz. Yazıyı beğenerek ve paylaşarak daha fazla kişiye ulaşmasına yardımcı olabilirsiniz. Görüş ve önerileriniz için uslumetin@gmail.com’dan bana ulaşabilirsiniz. Yeniden görüşmek üzere, Selamlar 🙂

Bağlantılı diğer yazılarım:

  1. Birliktelik Kuralları Analizi (Association Rules Analysis)
  2. R ile Birliktelik Kuralları Analizi (Association Rules Analysis with R Project)
  3. IBM SPSS Modeler ile Birliktelik Kuralları Analizi (Association Rules Analysis with IBM SPSS Modeler)

Kaynaklar:

Hakkında Metin USLU

GÖZ ATMAK İSTEYEBİLİRSİNİZ

Uygulamalı İstatistik – Merkezi Eğilim Ölçüleri

Giriş Herkese merhaba, bir önceki yazıda verileri gruplandırmıştık. Bu yazıda ise sizlere tanımlayıcı istatistiklerde en …

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir