Ürün sayısının yüksek adetlere ulaştığı e-ticaret sayfalarında hangi ürünün hangi sırada gösterileceği ciddi bir optimizasyon problemidir. Bu sorunu çözerken kullanılabilecek girdilerden birisi de Product Rank değeri.
Product Ranking basit bir tanımla ürünlerin kendi aralarındaki değer veya önem sırasını belirleme olarak ifade edilebilir. Ürünlerle ilgili rank değeri hesaplandıktan sonra e-ticaret sitelerinde kategori sayfalarında veya arama sonuç sayfasında sıralama için rahatlıkla kullanılabilir.
Bir çok e-ticaret sitesinde “product ranking” basitçe, belirlenen parametrelerle ilgili ağırlıklandırılmış katsayılar kullanarak puan hesaplanması şeklinde karşımıza çıkıyor. Her ne kadar basit kurallara dayalı bu model ranking noktasında bir nebze fayda sağlasa da optimum çözümden oldukça uzak.
Parametreler , Strateji ve Operasyonel Alt Yapı
Tabii ki bütün gerçek dünyadaki işleyişle ilişkili problemde olduğu gibi burada da tek bir formülle evrensel çözümden bahsetmek mümkün değil. Teknik başarıdaki ana etken, (iyi tasarlanmış bir ölçüm/test sistemi tarafından durumsal farkındalığın kazanılması ön şartıyla) firma stratejilerine paralel olarak belirlenmiş sarih hedefler ve buna ulaşmayı sağlayacak doğru parametreleri modele dahil edebilmek. Ayrıca ortaya çıkan uygulama ve servisleri hayata geçirebilecek seviyede operasyonel kabiliyet de büyük önem taşıyor.
Tabii ki stratejiler zaman içerisinde değişiklik de gösterecektir. Belli dönemlerde marjinal kar hedefinin ön planda tutulurken, başka bir zaman diliminde özel bir kampanya için yapılmış özel bir anlaşma sebebiyle işlem (transaction) sayısı ön plana çıkabilir.
Product Ranking ve Fuzzy Yaklaşım
Her ne kadar teknik bir konu olsa da üzerinden geçeceğim. Önce kısaca Fuzzy Logic (bulanık mantık) nedir kısaca bahsederek başlayalım. En temel tanımıyla bir şeyin aynı anda farklı aidiyet skorlarıyla farklı sınıflarda bulunabilmesi olarak ifade edebiliriz.
Nasrettin Hocamızdan bir örnek verelim;
Hoca Nasrettinin kadılık yaptığı zamanlarda adamın birisi komşusundan şikayetçi olmuş. Hoca adamın şikayetini dinlemiş ve haklısın deyip adamı yollamış. Şikayet edilen adamı tutup getirmişler. Adam şikayet konusunu doğrulamış ve fakat deyip mazeretlerini beyan etmiş. Hoca adamı dinledikten sonra adama da haklısın diyerek salıvermiş. Olan biteni seyretmiş olan hanımı hocaya yanaşmış ve “Efendi sen hem davacıya hem davalıya haklısın dedin bu nasıl iş ?” Hoca gülümsemiş ve “Ne diyeyim hanım sen de haklısın.”
demiş. Bulanık mantık tam olarak burada olduğu gibi davacının da davalının da belli seviyelerde hem “haklı” hem de “haksız” olması durumlarındaki problemleri çözmek için var.
Orjinal hali ve tafsilatı için linke bakabilirsiniz: http://derindelimavi.blogspot.com/2009/09/nasrettin-hocadan-bulank-mantk-dersi.html
Tekrar ranking konusuna dönersek;
Basitçe sadece 2 parametreye göre bir fuzzy ranking hesaplanma örneği yapalım. Bunlardan birisi son 7 günlük satış adetleri, diğeri ise ürünün bütün bedenlerinin var olup olmaması olsun. Gerçekte geliştirdiğimiz modelde tabii ki bir kaçını firmanın kendi stratejilerine göre seçtiği onlarca farklı parametre mevcut. Ayrıca kullanıcının sayfalar arasında tıkladığı ürünler ve arama kelimeleri de sıralamayı etkiliyor.
Arama kelimesi, hangi ürünlerin beraber tıklandığı, ürün benzerliği, ürünlerin birbirine rekabet durumu gibi karmaşık olanlardan, sepete ekleme, kar marjı, satış adeti gibi daha basit olanlara kadar bir çok örnek verilebilir.
Son 7 gün satış değeri için yüksek satış, ortalama satış ve düşük satış olarak 3 ayrı fuzzy sınıf oluşturarak başlayalım. Benzer şekilde beden kırıklığı için de çok kırık, ortalama kırık ve çok kırık gibi 3 sınıf oluşturalım.
weekly_sales_low = mf.trimf(x_weekly_sales, [0, 0, 30] weekly_sales_mid = mf.trimf(x_weekly_sales, [10, 50, 150]) weekly_sales_hgh = mf.trimf(x_weekly_sales, [80, 300 , 300])) option_indic_low = mf.trimf(x_option_indic, [0, 0, 30] option_indic_mid = mf.trimf(x_option_indic, [20, 40, 60]) option_indic_hgh = mf.trimf(x_option_indic, [40, 100 , 100]))
Sınıfa ait sınırlara ve sınıfların ne kadar iç içe geçeceğine ait hesaplamalara, ayrıca modelin hala fazla lineer olmasının nasıl giderileceğine farklı bir konu olduğu için burada değinmeyeceğim. Lakin kabaca, en iyileştirilmek istenen çıktılara (satış adeti, kar vb.) göre çalışma zamanında bir optimizasyon modelinin karar verdiğini söyleyebilirim.
Bir diğer çözümü çok zor olan problem ise sıralamayı yaparken relevance’ı (ilişkililik) bozmamak. Yani mavi elbise arayan bir kullanıcıya sırf çok satıyor diye kırmızı elbise göstermemek. Tabii burada başka bir konuya saparak “acaba gösterilse almaz mıydı gerçekten?” sorusunun cevabı da aranabilir ama bu başka bir mevzu bahis. Ranking uygularken sonuçlardaki ilişkililiğin bozulmamasını da bir başka yazıya bırakıyorum.
Fuzzy sınıfları çizdirelim;
Satış adetlerine göre sınıf aidiyetleri.
Benzer şekilde beden kırıklığı için sınıflar.
Şimdiki aşamada bir giriş verisinin bu sınıflara aidiyetine göre bir çıktı hesaplamamız gerekiyor. Bunu da basitçe 2 ayrı sınıf olarak düşünelim. Bunlar High Rank ve Low Rank olsun.
Bu aşamada çıktıyla daha önce belirlediğimiz fuzzy sınıfları ilişkilendirmek için bir takım kurallar tanımlamamız gerekiyor. Örneğin yüksek satış + düşük beden kırıklığı = yüksek rank, düşük satış + yüksek beden kırıklığı = düşük rank vb.
Örnek bir girdi olarak son 7 günde 65 adet satmış ve beden kırıklık degeri 0.88 olan bir ürün için bu modele göre ranking sınıflarına aidiyetlerini hesaplayalım.
Buna göre son 7 gün 65 adet satan ve benden kırıklı indeksi 0.88 olan bir ürün kırmızı kadar düşük, yeşil kadar yüksek rank değerine sahip olmalı.
Son aşamada ise durulaştırma işlemi uygulayarak nihai rank değeri olan 0.55 değerine ulaşıyoruz.
Bu işlemleri tek seferde tüm ürünler için uygulamak yerine bir çok parametreyi de hesaba katarak çalışma zamanında her bir liste için ayrı ayrı hesaplıyoruz. Böylece bazen beden kırıklığının önemi çok yüksek olurken bazen satış adetinin önemi daha yüksek oluyor ve yukarıda bahsettiğim kural setlerini dinamik olarak oluşturuluyor. Tabii ki madalyonun öteki yüzünde çalışma zamanında 5ms gibi sürelerde bu hesaplamayı yapabilme zorluğu yatıyor.
Test Sonuçları
Test seti olarak 100 adet long tail sorgudan oluşan bir veri kümesi oluşturduk. Belirlediğimiz test seti çok büyük olmadığı için eleştirilebilir ancak fikir vermesi için bir ön çalışma kapsamında düşünüyoruz.
Buna göre eski sıralamayla kıyasladığımızda ilk 50 ürününün haftalık satış adetleri ortalama 21 adetten 154 adete, beden kırıklığı 0.38 den 0.91’e yükseldi. Satış rakamlarına yansımasını ise önümüzdeki bir kaç hafta sonrasında net olarak göreceğiz.