Ürün önerme sistemleri e-ticaret sitelerinin başarısı için kritik öneme sahiptir. ARL (Association Rule Learning) algoritması, müşterilerin satın aldığı ürünlerin kombinasyonlarını inceleyerek birbirleriyle ilişkilendirerek, bu ilişkileri kullanarak ürün önerilerinde bulunabilen bir makine öğrenmesi algoritmasıdır. Bu yazıda, ARL algoritması kullanarak ürün önerisinde bulunmanın nasıl yapıldığını ve bir e-ticaret sitesinin müşteri deneyimini nasıl geliştirebileceğini inceleyeceğiz.

ARL Algoritması ile Ürün Önerisinde Bulunma

  • İlk iş olarak gerekli kütüphaneleri yükleyip DataFrame oluşturalım. Oluşturduğumuz DataFrame’i inceleyelim.
import pandas as pd
from mlxtend.frequent_patterns import apriori, association_rules

pd.set_option('display.max_columns', None)
pd.set_option('display.width', 500)
pd.set_option('display.expand_frame_repr', False)
df_ = pd.read_excel("/Users/Asli1/datasets/online_retail_II.xlsx",
                    sheet_name="Year 2010-2011")
df_.head()
df = df_.copy()
df.head()

Bu kod bloğu, bir Excel dosyasından veri okuyarak bir pandas DataFrame nesnesi oluşturur ve bu DataFrame nesnesini df adı altında saklar.

“online_retail_II.xlsx” dosyasındaki “Year 2010-2011” sayfasından veriler okunur ve bir pandas DataFrame nesnesine yükledik. Son olarak, bu DataFrame nesnesi df_ olarak kopyaladık ve df adı altında sakladık.

.
  • StockCode’u “POST” olan gözlem birimlerini çıkaralım.
df = df[~df["StockCode"].str.contains("POST", na=False)]

(Bu veri setinde “POST” her faturaya eklenen bedeldir ve ürünü ifade etmemektedir.)

Bu kod satırı, “POST” kelimesini içeren “StockCode” sütunundaki satırları DataFrame nesnesinden çıkarır. “~” işareti, boolean bir maske oluşturmak için kullanılır ve bu maske “POST” kelimesini içeren satırları seçmek için kullanılır. “na=False” parametresi, eksik değerlerin yerini almak için kullanılır. Bu kod satırı, “StockCode” sütununda “POST” kelimesini içeren satırları çıkarır ve DataFrame nesnesini günceller. Sonuç olarak, DataFrame nesnesi artık “POST” kelimesini içermeyen satırlar içerir.

  • Boş değer içeren gözlemleri silelim.
df.isnull().sum()
df = df.dropna()

İlk satır, DataFrame nesnesindeki her sütundaki eksik değerlerin sayısını hesaplar ve her sütunun toplam eksik değer sayısını gösterir. “isnull()” metodu, her hücrenin boş olup olmadığını kontrol eder ve “sum()” metodu, her sütundaki boş hücrelerin sayısını hesaplar.

İkinci satır ise, DataFrame nesnesindeki tüm satırlardan en az bir eksik değer içeren satırları çıkarır. “dropna()” metodu, eksik değerleri içeren satırları çıkarır ve DataFrame nesnesini günceller. Bu işlem, eksik verilerin çıkarıldığı daha temiz bir veri kümesi oluşturmak için kullanılır. Sonuç olarak, DataFrame nesnesi artık eksik değer içermeyen bir veri kümesine sahip olur.

.
  • Invoice içerisinde “C” bulunan değerleri veri setinden çıkaralım. “C” faturanın iptalini ifade etmektedir. Veri setlerini iyi incelemek bu yüzden önemlidir.
df = df[~df["Invoice"].str.contains("C", na=False)]

Bu kod satırı, “Invoice” sütununda “C” harfini içeren satırları çıkarır ve DataFrame nesnesini günceller. Sonuç olarak, DataFrame nesnesi artık “C” harfini içermeyen satırlar içerir. Bu işlem, iptal edilen siparişleri çıkarmak için kullanılır.

  • Price değeri sıfırdan küçük olan gözlem birimlerini filtreleyelim.
df = df[df["Price"] > 0]

Bu kod satırı, “Price” sütunundaki değerleri sıfırdan büyük olan satırları DataFrame nesnesinde tutar ve diğerlerini çıkarır. “df[“Price”] > 0″ ifadesi, “Price” sütunundaki her satır için koşulu kontrol eder ve bu koşula uyan satırları DataFrame nesnesinde tutar. Bu işlem, sıfır veya negatif fiyat değerleri olan satırları çıkarmak için kullanılır. Sonuç olarak, DataFrame nesnesi, sıfırdan büyük fiyat değerleri olan satırları içerir.

  • Price ve Quantity değişkenlerinin aykırı değerlerini inceleyelim.
df.describe().T
df.describe(percentiles=[0.01, 0.05, 0.25, 0.5, 0.75, 0.95, 0.99]).T

İlk kod satırı, DataFrame nesnesindeki tüm sayısal sütunlar için istatistiksel özetlerini hesaplar. “describe()” metodu, bir DataFrame özetini verir. İkinci satır ise, yüzdelik dilimleri ekler ve verilerin yüzde kaçının belirli bir değerin altında veya üstünde olduğunu hesaplar. “percentiles=[0.01, 0.05, 0.25, 0.5, 0.75, 0.95, 0.99]” parametresi, hangi yüzdelik dilimlerinin hesaplanacağını belirler. Bu işlem, daha ayrıntılı bir istatistiksel özet elde etmek için kullanılır.
Bu sonuçta Price ve Quantity değişkenlerinde aykırı değer görünüyor.

  • Aykırı değerleri baskılayalım.
def outlier_thresholds(dataframe, variable):
    quartile1 = dataframe[variable].quantile(0.01)
    quartile3 = dataframe[variable].quantile(0.99)
    interquantile_range = quartile3 - quartile1
    up_limit = quartile3 + 1.5 * interquantile_range
    low_limit = quartile1 - 1.5 * interquantile_range
    return low_limit, up_limit


def replace_with_thresholds(dataframe, variable):
    low_limit, up_limit = outlier_thresholds(dataframe, variable)
    dataframe.loc[(dataframe[variable] < low_limit), variable] = low_limit
    dataframe.loc[(dataframe[variable] > up_limit), variable] = up_limit


replace_with_thresholds(df, "Quantity")
replace_with_thresholds(df, "Price")

Bu kod bloğu, “Quantity” ve “Price” sütunlarındaki aykırı değerleri belirlemek için “outlier_thresholds” fonksiyonunu kullanır ve bu aykırı değerleri alt veya üst sınırlarla değiştirmek için “replace_with_thresholds” fonksiyonunu kullanır.

“outlier_thresholds” fonksiyonu, bir veri kümesindeki değişken için alt ve üst sınırları belirler. Bunun için, değişkenin %1 ve %99’uncu yüzdelik dilimleri arasındaki aralığı hesaplar ve bu aralığı 1.5 katı kadar genişletir. Bu şekilde, alt sınır ve üst sınır belirlenir.

“replace_with_thresholds” fonksiyonu, belirlenen alt ve üst sınırların dışında kalan değerleri alt veya üst sınırlarla değiştirir. Bu şekilde, aykırı değerlerden kaynaklanabilecek sorunlar çözülmüş olur. Bu işlem, aykırı değerlerin belirlenmesi ve veri kümesindeki bu değerlerin değiştirilmesi için kullanılır.

  • Alman müşteriler üzerinden birliktelik kuralı üretelim.
def create_invoice_product_df(dataframe, id=False):
    if id:
        return dataframe.groupby(['Invoice', "StockCode"])['Quantity'].sum().unstack().fillna(0). \
            applymap(lambda x: 1 if x > 0 else 0)
    else:
        return dataframe.groupby(['Invoice', 'Description'])['Quantity'].sum().unstack().fillna(0). \
            applymap(lambda x: 1 if x > 0 else 0)


df_ger = df[df['Country'] == "Germany"]
create_invoice_product_df(df_ger, id=True)

“create_invoice_product_df” fonksiyonu, veri kümesindeki fatura ve ürün kodu bilgilerini gruplandırarak fatura ve ürün kodu çiftlerinin toplam satın alma miktarını hesaplar. Bu işlem, “id=True” parametresiyle çağrıldığında yapılır ve sonuçta, farklı fatura kodlarına karşılık gelen sütunlar ve farklı ürün kodlarına karşılık gelen satırlar bulunan bir ikili veri çerçevesi döndürülür. Bu veri çerçevesinin değerleri, satın alınan miktarların toplamıdır ve 0 veya 1 olabilir. Bir ürün kodu için 1, o ürünün satın alındığını ifade ederken 0, satın alınmadığını ifade eder.

def create_rules(dataframe, id=True, country="Germany"):
    dataframe = dataframe[dataframe['Country'] == country]
    dataframe = create_invoice_product_df(dataframe, id)
    frequent_itemsets = apriori(dataframe, min_support=0.01, use_colnames=True)
    rules = association_rules(frequent_itemsets, metric="support", min_threshold=0.01)
    return rules


rules = create_rules(df)

“create_rules” fonksiyonu, “create_invoice_product_df” fonksiyonunu kullanarak Almanya’daki müşterilerin satın aldığı ürünlerin ikili veri çerçevesini oluşturur. Bu ikili veri çerçevesi, daha sonra mlxtend kütüphanesinin “apriori” fonksiyonuna gönderilir. Bu fonksiyon, frekansı belirtilen destek değeri üzerinde olan ürünlerin birlikte görülme sıklığını hesaplar. Bu sıklık değerleri, “use_colnames=True” parametresi ile birlikte kullanarak, ürün kodları yerine ürün isimleri ile birlikte görüntülenir.

“Apriori” fonksiyonundan çıkan sık öğe kümeleri, “association_rules” fonksiyonuna verilerek, birliktelik kuralları çıkarılır. “metric” parametresi, birliktelik kurallarının hangi ölçütlere göre çıkarılacağını belirler. “support” ölçütü, birliktelik kurallarının en az ne kadar sıklıkta görülmeleri gerektiğini belirler. “min_threshold” parametresi, bu sıklık değerinin altında olan birliktelik kurallarının filtrelenmesi için kullanılır.

  • ARL kullanarak 3 müşteri için ürün önerisinde bulunalım.
def arl_recommender(rules, product_id, rec_count=1):
    sorted_rules = rules.sort_values("lift", ascending=False)
    recommendation_list = []
    for i, product in enumerate(sorted_rules["antecedents"]):
        for j in list(product):
            if j == product_id:
                recommendation_list.append(list(sorted_rules.iloc[i]["consequents"])[0])

    return recommendation_list[0:rec_count]


p1=arl_recommender(rules, 20675, 1)
p2=arl_recommender(rules, 22077, 1)
p3=arl_recommender(rules, 22326,1)

Bu fonksiyon, bir veri setindeki ürün ilişkilerini belirler ve bir ürüne dayanarak, o ürüne en çok benzerlik gösteren diğer ürünleri önerir. Burada, üç ayrı örnek için bu fonksiyon çağırılmış ve önerilen ürünler p1, p2 ve p3 değişkenlerine atanmıştır.

check_id(df, p1[0])
check_id(df, p2[0])
check_id(df, p3[0])

ARL

Bu projeyi, online bir perakende mağazasının müşterileri arasında birliktelik kurallarının oluşturulması ve bu kuralların kullanılarak müşterilere öneri yapılması için yaptık. Projede, önce perakende mağazasının müşterileri arasında birliktelik kurallarının oluşturulması için Online Retail II veri setinin 2010-2011 sayfasını okuyarak, veri setinin temizlenmesini sağladık. Daha sonra Alman müşterilerinin veri setindeki faturalarına ait pivot tablolar oluşturduk ve bu tablolar kullanılarak birliktelik kuralları elde ettik. Son olarak, seçilen birkaç kullanıcı için, kullanıcının sepetinde bulunan ürünlerin benzerlerinin önerilmesi için arl_recommender() fonksiyonu kullanılarak bir öneri yaptık. İyi Çalışmalar!

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir