Kural Tabanlı Yöntem
Lumoda'nın kuralı bir gömleğin deposunu neden görmüyor? Stoğa ve satış hızına bakan basit bir kural kuruyor ve Lumoda'yla aynı malla yarıştırıyoruz. Kural kazanıyor; kazanç erken başlamaktan ve depoyu görmekten geliyor.
İndirim Takvimi · 3 / 6
Bu yazıda stoğa ve satış hızına bakan basit bir kuralın, Lumoda’nın kuralından daha iyi indirim verip veremeyeceğini soruyoruz. Çünkü Pelin’in tablosu indirimin en temel sorusunu hiç sormuyor: bu mal, bu hızla, kaç haftada biter? Önce tablonun neye baktığını bir gömlek üzerinden göreceğiz. Sonra o soruyu soran kuralı kurup Lumoda’yla yarıştıracağız.
Pelin’in tablosu neye bakıyor
Pelin’in tablosu her pazartesi her ürünün STRSell-Through Rate; satılan adedin gönderilen adede oranı.’sine bakıyor: mağazalarda satılan adet, mağazalara gönderilen adede bölünüyor. Bu oran, sezonun o haftasında olması gereken yerin epey gerisindeyse ürün bir kademe iniyor.
Hesabın iki yanı da mağazaya bakıyor. Depoda bekleyen mal hesaba girmiyor. Tedarikçiye verilmiş ama henüz gelmemiş sipariş hiç görünmüyor. Bunun ne demek olduğunu bir gömlek gösteriyor.
Oduncu Gömlek
Pars toplantıya yeşil bir oduncu gömlekle geliyor. Gömlekten 13.050 adet alınmış; 4.350’si sezon içinde RPTRepeat sipariş; sezon içinde beklenenden çok satan ürünün tedarikçiye yeniden sipariş edilmesi. Depodan mağazaya sevkiyat değildir.’yle, yani tedarikçiye verilen tekrar siparişle. İndirim gününe kadar mağazalara 7.283 adet gitmiş, mağazalarda 4.713 adet satılmış.
— STR 0,65, diyor Pelin. Tablomda bu iyi bir sayı. Kural bu gömleğe dokunmaz.
— Dokunmuyor da, diyor Pars. Şimdi bütün resme bak. Aynı güne kadar, online dahil, bütün satış 5.490 adet. Bunu alınan bütün mala bölersen 0,42.
— Aynı gömlek, iki ayrı STR, diyor Veli.
— Paydaları ayrı, diyor Pars. Pelin’in tablosu yalnız mağazaya gideni sayıyor. Gömleğin bir kısmı hiç mağazaya çıkmadı, depoda bekliyor. Üstüne bir de tekrar sipariş yolda.
Talihsizlik zamanlamada. Tekrar sipariş, Pelin’in kuralının gömleğe ilk baktığı gün verilmiş. Mal depoya indirim başladıktan iki gün sonra giriyor. Kural bu malı ne yoldayken görüyor ne depodayken. Gömleği bir kez bile derinleştirmiyor: indirim günü herkesle birlikte %30’a indiriyor ve orada bırakıyor. Outlet kapandığında depoda 5.447 gömlek duruyor; bir daha satılmayacak ölü stokSezon ve outlet penceresi bittikten sonra depoda kalan, bir daha satılmayacak mal..
— Benim kuralım satıyor mu diye soruyor, diyor Pelin. Bu gömlek satıyor.
— Satıyor, diyor Pars. Ama elindeki malı kalan haftalarda bitirecek kadar değil. Asıl soru o.
Kapsama kuralı
Pars’ın önerdiği kural iki soru soruyor. Elimdeki mal bu hızla kaç haftada biter? Çıkışa kaç hafta kaldı? Çıkış, malın sezon mağazalarından toplanıp outlet’e gönderildiği gün. Birinci cevap ikincisinden uzunsa mal sezonda bitmeyecek demek; kural bir kademe iniyor. Değilse fiyat yerinde kalıyor.
Birinci sorunun cevabına kapsama diyoruz; sahada coverMevcut stoğun satış hızına bölünmesiyle bulunan yeterlilik süresi; kaç haftalık satışı karşılayacağını söyler. diye de geçer. Hesaba ürünün satılabilir bütün stoğu giriyor: raftaki, mağazaya yoldaki, depodaki ve tedarikçiden gelecek olan mal. Bu stok son iki haftanın satış hızına bölünüyor. Hız yalnız rafta mal olan günlerden ölçülüyor, çünkü rafı boş kalan gün satış yapamaz; hızı düşürmemeli.
Kodun özü birkaç satır. Aşağıdaki parça vakalar/markdown/ altındaki
çalışan koddan, tek bir ürün için sadeleştirildi. Gerçek kod bütün
ürünleri birlikte hesaplıyor, hızı da mağaza ve beden başına ölçüp
üründe topluyor.
# markdown/politika.py, Kural._karar (sadeleştirildi, tek ürün için)
def karar(urun, bugun, oran, alfa=1.0):
stok = urun.raf + urun.yolda + urun.depo + urun.acik_siparis
hiz = urun.stoklu_gun_satisi / urun.stoklu_gun # son iki hafta, günlük
kalan = urun.cikis_gunu - bugun # çıkışa kalan gün
if hiz > 0:
kapsama = stok / hiz # bu hızla kaç günde biter
else:
kapsama = float("inf") if stok > 0 else 0.0 # satmıyor ama mal var
if kapsama > alfa * kalan:
return bir_sonraki_kademe(oran) # %20, %30, %40, %50, %70
return oran
alfa kuralın tek ayarı: ne kadar sabırlı olacağı. alfa bir olduğunda
kural “kalan haftalarda bitmiyorsa in” diyor. Büyüdükçe bekliyor,
küçüldükçe acele ediyor.
Gerisi Lumoda’nın kuralına benziyor. Kural yalnız pazartesi karar veriyor, bir seferde tek kademe iniyor ve fiyat geri çıkmıyor. İki farkı var. İndirimden sekiz hafta önce başlayabiliyor, dört değil. İndirim günü de herkese taban vermiyor: kapsaması yeten ürün sezon indiriminde bile tam fiyatta kalabiliyor.
— Esneklik nerede peki? diyor Pelin. Bu kural indirimin ne kadar sattırdığını bilmiyor.
— Bilmiyor, diyor Pars. Bir kademe iniyor, bir hafta sonra sonuca bakıyor. İndirim satışı artırdıysa hız yükselir, kapsama kısalır, kural durur. Artırmadıysa bir kademe daha iner.
Ayarı, yarışacağımız sezonlara bakmadan, onlardan önceki iki sezonu simülasyonda yeniden oynatarak seçtik. En iyi sonucu en sade ayar verdi, “kalan haftalarda bitmiyorsa in”; denediğimiz her ayar o iki sezonda Lumoda’yı geçti.
Yarış
Yarışı iki sezonda yapıyoruz: ilk yazının yaz sezonu ve ondan önceki kış. Hakem bir simülasyon: aynı müşteri akışı, aynı mal, aynı tekrar siparişler; yalnız indirim takvimi değişiyor. Gerçek talep ve gerçek esneklik verinin kurgusunda. Gerçek hayatta böyle bir hakem yok. Ölçüt yine sezon katkısı: aynı maldan sezon ve outlet boyunca alınan net ciro, eksi o malın alış maliyeti.
Kapsama kuralı Lumoda’yı iki sezonda 24,91 M TL geçiyor; iki sezonda da aşağı yukarı aynı farkla.
| İki sezon | Lumoda | Kapsama kuralı |
|---|---|---|
| Ölü stok | 341.672 adet | 165.726 adet |
| Markdown TL | 86,97 M TL | 278,92 M TL |
Kural depoda çok daha az mal bırakıyor. Ama çok daha fazla indirim veriyor.
— Finans bunu görünce ne der? diyor Pelin. Benden istenen markdown TL’yi küçültmekti.
— Kural tam tersini yapıyor, diyor Pars. Daha çok indirim veriyor, depoda daha az mal bırakıyor ve sezon katkısı büyüyor. Raporundaki iki satırı birlikte okumak gerekiyor. Altıncı yazıda buna döneceğiz.
Oduncu Gömlek’e dönelim. Kapsama kuralı onu indirimden üç hafta önce %20’ye alıyor ve her pazartesi bir kademe daha indiriyor. İndirdiği her pazartesi tekrar sipariş de hesabın içinde: önce açık sipariş, sonra depo stoğu olarak. Outlet kapandığında depoda kalan gömlek 189. Gömleğin katkısı 0,36 M TL’den 0,82 M TL’ye çıkıyor.
Tulumlar da kuralla değişiyor. Veli’nin tulumunu kural, Lumoda’nınki daha uyanmadan indirmeye başlıyor. Lumoda’nın kuralıyla depoda 2.944 tulum kalmıştı; kapsama kuralıyla 1.514. Ali’nin tulumuna ise indirim günü dokunmuyor. O tulum zaten bitiyordu.
Kazanç nereden geliyor
Kazancın nereden geldiğini görmek için kuralı iki kez daha, her seferinde bir eksikle koşturduk; ikisi ayrı deney, sonuçları toplanmaz. İndirim gününe kadar beklemeye zorlanan kural iki sezonda 18,77 M TL daha az katkı bırakıyor; depoyu ve açık siparişi göremeyen kural 11,53 M TL daha az.
— Yani benim kuralımın asıl derdi ne zaman başladığı, diyor Pelin. Bir de depoyu görmemesi.
— Tulumda gördüğün ilkiydi, diyor Pars. Gömlekte gördüğün ikincisi.
Herkese aynı indirim
Bir taban çizgisi daha koştuk: herkese, indirim gününden çıkışa kadar aynı oran. Ayarı seçtiğimiz sezonlarda denediğimiz düz oranların en iyisi %40 çıktı. Yarış sezonlarında Lumoda’nın kuralı bu düz orandan yalnız 0,79 M TL iyi.
— Benim tablom herkese aynı indirimden ancak bu kadar mı iyi? diyor Pelin.
— Tablon çoğu ürüne indirimden önce dokunmuyor, diyor Pars. Dokunduğu gün de herkesi %30’a indirip çoğunu orada bırakıyor. Pratikte herkese aynı oranı vermiş oluyorsun.
Kapsama kuralı da çok şey bilmiyor. Esneklik bilmiyor, talebin sezonun geri kalanında nasıl eriyeceğini de bilmiyor; yalnız bugünkü hıza ve elindeki stoğa bakıyor. Yine de Lumoda’yı rahat geçiyor. Büyük olasılıkla bunun nedeni bu dünyada malın çokluğu; bunu ayrıca sınamadık. Bu kadar malın olduğu yerde ilk soru indirimin ne kadar derin olacağı değil, ne zaman başlayacağı. O soruyu kaba bir kural da doğru cevaplayabiliyor.
Beşinci yazıdaki optimizasyon, kuralın bakmadığı iki şeyi hesaba katıyor: indirimin ne kadar sattırdığını ve talebin nasıl eriyeceğini. Bakalım bunlar kuralı geçmeye yetecek mi.
Sizin verinizde zor olan
Kuralın en değerli bilgisi satılabilir bütün stok. Çoğu zincirde mağaza stoğu, depo stoğu ve tedarikçi siparişleri ayrı sistemlerde durur. Açık siparişin teslim tarihi de çoğu zaman kâğıt üstündeki tarihtir; Oduncu Gömlek’inki gibi geç gelen mal ancak geldiğinde görünür.
Hızı ölçmek için her mağazada, her bedende, her gün rafın boş olup olmadığını bilmek gerekir. Stok kaydı hatalıysa biten ürün yavaş satıyor görünür ve kural onu boşuna indirir. Son iki haftada bir kampanya geçtiyse de hız şişer, kapsama kısa görünür ve kural indirimi erteler.
Kural zincirin toplam stoğuna bakıyor. Veli’nin tulumu Anadolu’da birikmişti. Zincir için doğru zamanda gelen bir indirim, malın durduğu mağazada geç kalabilir; onu transfer düzeltir.
En zoru ayarı seçmek. Biz geçmiş iki sezonu simülasyonda yeniden oynattık. Gerçek bir zincirde geçmiş sezon yeniden oynatılamaz. Ayarı ancak bir kısım üründe deneyerek, sezondan sezona bulabilirsiniz.
Kapsama kuralı esneklik bilmeden iş görüyor. Bir sonraki yazıda bilmeye çalışıyoruz: indirim gerçekten ne kadar sattırır, bunu satıştan nasıl ölçeriz ve yanlış ölçünce ne olur?