Apriori Algoritması ile Birliktelik Analizi (Örnek Proje ile)

Saltuk Bugra Karacan
6 min readJul 8, 2020

Merhaba, bugünkü yazım Birliktelik Analizi ve Apriori Algoritması üzerine olacak.

BİRLİKTELİK ANALİZİ

Birliktelik analizi; elimizdeki verilerin birbirleri arasındaki bağlantıyı ortaya koymak için yapılan analizdir. Bu metot ile birçok analiz yapılabilir:

  • Market sepet analizleri (birazdan örneğini göreceğiz.)
  • Netflix dizi-film tavsiye sistemleri
  • Spotify şarkı tavsiye sistemleri
  • YouTube video tavsiye sistemleri
  • E-ticaret sitelerinde önünüze çıkan ürün önerileri
netflix spotify youtube gibi platformlar için kullanılabilir.

ve daha birçok sistem bu analizle yapılabilir.(Bu büyük platformların kesinlikle çok daha kompleks algoritmaları vardır. Benim demek istediğim; elimizde veri olduğu takdirde bu platformlar için de aynı yöntemlerle birliktelik analizi uygulanabilir.)

Hatta günümüzde süpermarketlerde reyonlar bile bu yapılan analizlere bağlı olarak diziliyorlar. Birliktelik analizi deyince akla ilk gelen örneklerden biri bebek bezi ve bira!

BEBEK BEZİ - BİRA İLİŞKİSİ

Bebek bezi ile bira birer birer ele aldığımızda aslında birbiriyle ne kadar da alakasız iki ürün gibi düşünebilirsiniz ama Amerikan perakende devi Walmart’ın yaptığı analizlere bakarsak çok da alakasız olmadığını görebiliriz.

Yapılan analizlere göre ele alınan 200.000 satın alma verisinin 4.000 tanesi bebek bezi içeriyor. 5.500 tanesi ise bira içeriyor. Bunun yanında 3.500 işlem de bebek bezi ve bira ürünlerinin ikisini de içeriyor.

bebek bezi bira ilişkisi

Bu inceleme yorumlandığında yeni çocuk sahibi olan ebeveynlerin akşamlarını eğlenmek için dışarı çıkmak yerine bira alıp mecburen evde geçirdiği gözlemleniyor. Walmart, bu gözlemlere dayanarak bebek bezleri ve biraları yakın reyonlara koyarak kazanç elde etmeyi başarıyor.

Şimdi birliktelik analizi ile kullandığımız Apriori algoritması hakkında birkaç terimden bahsedeceğim ve daha sonra projeye geçeceğim.

APRİORİ ALGORİTMASI

Apriori algoritması, birliktelik analizi için çok kullanılan bir algoritmadır. Bu algoritmanın belirli metrikleri vardır. Support, Confidence ve Lift birazdan açıklayacağım metriklerdir.

Support = Frequency(X,Y) / N

İstediğimiz olayın, tüm olaylara oranıdır. Süpermarket örneğinden ele alacak olursak; Ekmek içeren alışverişlerin (100 diyelim), bütün alışverişlere (500 diyelim) oranını bulursak bu bize Support değerini verir.

(ekmek içeren alışveriş sayısı=100)/(bütün alışverişler=500) = 0.2 = %20

Buradan ekmeğin Support değerini 0.2 buluruz. Bu da şu anlama gelir: Tüm alışverişlerin %20'sinde ekmek ürünü bulunur.

Soru: Yukarıda verilen bebek bezi, bira ve bebek bezi - bira ilişkisinin support değerlerini ayrı ayrı bulunuz.

Toplam işlem = 200.000 | bebek bezi içeren işlem = 4.000 | bira içeren işlem = 5.500 | bebek bezi ve bira içeren işlem = 3.500

Çözüm:

Bebek bezi support değeri = 4.000/200.000 = 0.02 = %2

Bira support değeri = 5.500/200.000 = 0.0275 = %2.75

Bebek bezi ve bira support değeri = 3.500/200.000 = 0.0175 = %1.75

Confidence = Frequency(X,Y) / Frequency(X)

X olayı gerçekleştiğinde, Y olayının gerçekleşme olasılığını veren metriktir.

Yine süpermarket örneği üzerinden konuşursak: Ekmek alındığında süt de alınma olasılığını confidence metriği ile bulabiliriz. (Ekmek ve sütün beraber bulunduğu alışverişlerin sayısına 50 diyelim, sadece ekmek bulunan alışverişlerin sayısına da 100 diyelim)

(Ekmek+süt içeren alışverişler=50)/(ekmek içeren alışverişler=100)=0.5=%50

Buradan yapabileceğimiz çıkarım “ekmek alındığında %50 ihtimalle süt de alınır.” şeklinde olurdu.

Soru: Yukarıda verilen bebek bezi ve bira örneğinden confidence değerlerini çıkarın.

Toplam işlem = 200.000 | bebek bezi içeren işlem = 4.000 | bira içeren işlem = 5.500 | bebek bezi ve bira içeren işlem = 3.500

Çözüm:

Bebek bezi -> bira = 3.500/4.000 = 0.875 = %87.5

Bira -> bebek bezi = 3.500/5.500 = 0.636 = %63.6

Bu hesaplamalardan hareketle görebiliyoruz ki: bebek bezi satılınca bira da satılma olasılığı %87.5, bira satılınca bebek bezi de satılma olasılığı ise %63.6 oluyor.

Yani buradan anlayabiliriz ki Walmart’ın yaptığı analiz gerçekten tutarlı bir analiz.

Lift = Support(X,Y) / (Support(X) x Support(Y))

X olayının gerçekleşmesi, Y olayının gerçekleşmesi ihtimalini ne kadar kat artırır? Sorusuna cevap verir.

Yukarıda Support değerinin nasıl hesaplandığını açıklamıştım dolayısıyla direkt olarak bebek bezi - bira sorusuna geçiyorum.

Formülden de anlayacağınız üzere bebek bezi -> bira ile bira -> bebek bezi değerleri aynı olacaktır yani lift değerleri değişmez.

Soru: Yukarıda verilen bebek bezi ve bira örneğinden Lift değerlerini çıkarın.

Toplam işlem = 200.000 | bebek bezi içeren işlem = 4.000 | bira içeren işlem = 5.500 | bebek bezi ve bira içeren işlem = 3.500

Çözüm:

Support kısmında hepsinin tek tek support değerlerini bulmuştuk tekrardan burada hesaplamayacağım eğer nasıl hesaplandığını unuttuysanız tekrar Support başlığı altına bir göz atarsanız iyi olur.

Support(bebek bezi,bira) / (Support(bebek bezi) x Support(bira))

0.0175/(0.02 x 0.0275) = 31.82

Yukarıdaki işlemden görüldüğü gibi bebek bezi satışı bira satışını 31.82 kat artırır.

Yeteri kadar kağıt üstünde hesaplama yaptık konu iyice anlaşıldıysa şimdi işin en güzel kısmı olan proje kısmına geçelim.

Elimizdeki GroceryStoreDataSet.csv dosyasındaki veriler şu şekilde.

Sadece 1 column(sütun) var ve ürünler virgül ile ayrılmış durumda.
import pandas as pd #Pandas kütüphanesini notebooka ekledik.grocery = pd.read_csv("GroceryStoreDataSet.csv",header=None,names=['products']) 
#GroceryStoreDataSet.csv dosyasından grocery isimli bir dataframe oluşturduk. "header=None" kısmını yazmamızın sebebi, csv dosyasının ilk satırını sütun isimleri olarak algılamasın diye. Çünkü yukarıdaki fotoğrafta görüldüğü gibi csv dosyasının ilk satırından itibaren ürün isimleri yazılmaya başlamış hiçbir sütun adı görünmüyor.
df = grocery.copy()
#Bu hücrede grocery dataframe'i df adlı değişkene kopyaladık. Olur da grocery dataframe'i yanlış bir işlem yaparak bozarsak geri dönüşü kolay olsun diye df adlı değişkene kopyalayıp df üzerinde işlemlerimizi yapacağız. df'de bir bozulma olduğunda da geri dönüp bu hücreyi çalıştırdığımızda her şey eski haline geri dönmüş olacak. Kullanışlı bir yöntem.
df.head()
#dataframe'in ilk 5 satırını getirelim.
ilk 5 satır
!pip install mlxtend
#kullanacağımız bir kütüphane olan mlxtend kütüphanesini bilgisayarımıza bu hücre aracılığıyla indirmemiz gerekiyor. Eğer bu hücreyi bir kere çalıştırırsanız bir daha çalıştırmanıza gerek kalmaz, yorum satırına alabilirsiniz.
data = list(df["products"].apply(lambda x:x.split(',')))
#satırlardaki ürünleri ayırıp listeye atmak için bu hücreyi çalıştırırız.
data #bu hücrenin çıktısı şu şekilde olur:
virgüllerle ayrılıp ayrı ayrı listelere atılmış olan satırlar.
from mlxtend.preprocessing import TransactionEncoder
#Veriye TransactionEncoder uygulamak için
te = TransactionEncoder()
te_data = te.fit(data).transform(data)
df = pd.DataFrame(te_data,columns=te.columns_)
#TransactionEncoder ile bütün ürünleri birer sütun haline getirip, eğer satırlarda yani alışveriş sepetlerinde bu ürün bulunuyorsa True bulunmuyorsa False yazısını görürüz
df
TransactionEncoder sonucu
from mlxtend.frequent_patterns import apriori
df1 = apriori(df,min_support=0.2,use_colnames=True,verbose=1)
#support değeri minimum 0.2 olan ürün ve ürünleri getiren hücre
df1
df1.sort_values(by="support",ascending=False)
#support değerlerini büyükten küçüğe sıralayıp getiren hücre
büyükten küçüğe sıralanmış hali.
from mlxtend.frequent_patterns import association_rulesassociation_rules(df1, metric = "confidence", min_threshold = 0.2)
#confidence değerleri minimum 0.2 olan çoklu ürünleri getirir
ilk satırı ele alalım:biscuit support değeri = 0.35
bread support değeri = 0.65
biscuit-bread support değeri = 0.2
biscuit-bread confidence değeri = 0.571429
biscuit-bread lift değeri = 0.879121

Yukarıdaki detaylı tablodan belirli yorumlar çıkarılabilir. Bunun bir süpermarketin birliktelik analizi olduğunu düşünürsek şu tarz yorumlar yapılabilir:

1- Tea alanların Maggi alma olasılığı 2.28 kat artıyor(Tea->Maggi lift oranı= 2.28) yani Tea ve Maggi ürünlerini yan yana koyabiliriz. (13. satır)

2- Milk alan müşterilerin %80'i Bread de almaktadır(Milk -> Bread confidence = 0.80). Milk ile Bread ürünlerinin konumunu birbirinden uzak yaparsak müşterilerin %80'i milk ürününü alıp bread e doğru yönelir ve giderken gözüne almak isteyebileceği başka ürünler de çarpabilir ve bu da daha fazla satış yapmamızı sağlar. (3. satır)

3-Bread ürünü tüm alışverişlerin %65'inde görülüyor(bread support = 0.65). Eğer ki bread ürününü girişten uzakta bir yere koyarsak müşteriler ekmek reyonuna gidip dönerken başka ürünlere gözü takılabilir. Böylece
daha fazla satış yapabiliriz.

Okuduğunuz için teşekkürler.

Projeyi ve veri setini indirmek için buradan Github adresimi ziyaret edebilirsiniz.

Görüş, öneri ve sorularınız için bana LinkedIn’den ulaşabilirsiniz: https://www.linkedin.com/in/sbkaracan/

Projeyi buraya tıklayarak Kaggle’da görüntüleyebilirsiniz.

--

--

Saltuk Bugra Karacan

M. Sc. Informatics @ Technical University of Munich | AI Engineer WS @ Retorio