Teknik

Hangi Ürün RPT'ye Aday

Her hafta her Collection ürünü için "tekrar üretmeye değer mi" sorusu. Etiketin tanımı, kural, lojistik regresyon ve LightGBM, yanlış alarmın ve kaçırmanın bedeli.

Tekrar Sipariş (RPT) · 4 / 6

Banu’nun kuralı bu ilkbahar-yazda 103 ürüne RPT verdi. Bunların 64’ü tutan ürünler değildi; gerçek talepleri planın bir buçuk katını geçmedi. Göze batan hata bu: tutmayan ürüne verilmiş, depoda bekleyen RPT. Bu yazı o sayının arkasındaki soruyu açıyor: bir ürünün RPT’ye aday olup olmadığına nasıl karar verilir? Sonunda kuralın asıl pahalı hatasının göze batmayan tarafta olduğunu göreceğiz.

Önceki yazıda “daha olsaydı ne kadar satardı” sorusunu cevapladık. Adaylık o sorunun cevabını kullanır ama aynı soru değildir. Bir ürün çok satıyor olabilir ve yine de aday olmayabilir: tekrar üretilen mal geldiğinde satacak zaman kalmamışsa.

Kapsam

Soru yalnız Collection ürünlerinde sorulur. NOS ve Basic ürünler zaten sürekli tedarik ediliyor. Bir sezonun Collection’ı Lumoda’da 210 option. Her biri için lansmandan sonraki ikinci, üçüncü, dördüncü, beşinci ve altıncı pazartesi bir karar satırı var; henüz RPT verilmemiş her option için bir satır. Bir sezonda en çok 1.050 satır.

Her satır o pazartesi sabahı bilinenden kuruluyor: ürünün o sabaha kadarki satışı, önceki yazıdaki gibi karar anında doldurulmuş talebi ve zincirin o sabahki stoğu.

Etiket: en zor kısım

Bir sınıflandırıcı kurmak kolay. Neyi sınıflandırdığını tanımlamak zor. “Ürün tuttu mu” iyi bir etiket değildir; tutan ama geç fark edilen ürün için RPT artık değersizdir. Kullandığımız tanım şu:

Bu pazartesi RPT verilseydi, tedarik süresi dolunca gelen maldan en az MOQ’nun yarısı tam fiyattan satılır mıydı?

Sipariş miktarı, bir sonraki yazıda kuracağımız hesabın önerdiği miktar ile MOQ’nun büyüğü. Tedarik süresi ürünün kendi tedarikçisininki. Eşik “MOQ’nun yarısı”, çünkü tedarikçiye verdiğimiz en küçük siparişin yarısını bile tam fiyattan satamayacaksak o sipariş zaten indirime üretilmiş demektir.

Bu etiketi geçmiş sezonlar için sonradan hesaplıyoruz. Burada bir tuzak var: etiket gerçek talebe bakarak hesaplanırsa sahada kurulamaz, çünkü sahada gerçek talebi bilmiyoruz. O yüzden etiketi iki kez hesapladık:

  • (i) gerçek talepten: ürünün kendi satışı + karşılanmayan talep. Yalnız sentetik veride var.
  • (ii) Satış Kaybı’nın yöntemiyle doldurulmuş talepten. Geçmiş sezonların stoksuz günleri Basit’le dolduruluyor, sınav sezonunun ilk lansman sabahı elde olan veriyle. Her zincir bunu kendi verisinden hesaplayabilir.

Modeller (ii) ile eğitiliyor, (i) ile sınanıyor. İlkbahar-yaz modelinin eğitim satırlarında iki etiket satırların %95,5’inde aynı sonucu veriyor; şansa göre düzeltilmiş uyum ölçüsü, Cohen’in kappası, 0,866. Sonbahar-kış modelininkinde %95,1 ve 0,858. Ayrıldıkları yerde yön belli: (ii) daha cömert. 3.502 satırın 145’inde yalnız (ii) “evet” diyor, 11’inde yalnız (i). Doldurulmuş talep bazı ürünlerde gerçeği biraz fazla görüyor; Satış Kaybı dizisinde de Basit kaybı biraz fazla yazmıştı. Sahada kurulabilen etiket gerçeği bilen etiketle birebir örtüşmüyor, ama evet ya da hayır sorusunda yeterince yakın.

Aday nadir değil

İlkbahar-yaz sezonunun 1.050 karar satırının 334’ü pozitif: %31,8. Sonbahar-kışta 218, %20,8. Aday olmak nadir değil; ilkbahar-yazda her üç satırdan biri, sonbahar-kışta her beş satırdan biri “evet”. Zor olan, hangisinin “evet” olduğunu erken görmek.

Pozitiflerin nerede toplandığına bakın. İlkbahar-yaz modelinin eğitildiği dört geçmiş sezonda, (ii) etiketiyle, pozitif / satır:

Menşeh=2h=3h=4h=5h=6
Yerli210 / 358201 / 358105 / 28043 / 20512 / 140
Mısır38 / 10638 / 10625 / 8913 / 734 / 54
Uzak Doğu55 / 37634 / 37617 / 3517 / 3270 / 303

Satır sayısı haftalar ilerledikçe azalıyor, çünkü RPT verilen option sonraki haftalarda listeden düşüyor. İki şey açıkça okunuyor. Yerli ürünlerde aday olmanın penceresi ikinci ve üçüncü haftada geniş, dördüncü haftada daralıyor, altıncı haftada neredeyse kapanmış. Uzak Doğu’dan gelen ürün de aday olabiliyor, ama yalnız erken: ikinci pazartesi 376 satırın 55’i, altıncı pazartesi hiçbiri. On iki ile on beş haftalık tedarik süresi, eğriden ancak erken verilen siparişe pay bırakıyor.

Banu’nun kuralı ürüne ilk kez üçüncü pazartesi bakıyor. Yerli üründe pencere o gün hâlâ açık. Uzak Doğu’da en verimli hafta geçmiş oluyor.

Özellikler

Her satır için, o pazartesi sabahı bilinenlerden:

  • Karar anında doldurulmuş talebin haftalık hızı, ilk alıma oranı
  • Önceki yazının d kestirimi ve FRR kestirimi, ilk alıma oranları
  • Zincir STRSell-Through Rate; satılan adedin gönderilen adede oranı.’si (Banu’nun kuralının baktığı tek şey)
  • Stoklu mağaza payı, kırık mağaza payı, kapsama (eldeki stok kaç haftalık)
  • Karar haftası, indirime kalan hafta
  • Tedarikçinin RPT süresi ve Uzak Doğu olup olmadığı
  • Yaşam eğrisine göre gelişten sonra kalan tam fiyat talep payı
  • Tahmini ek talep, ilk alıma oranı
  • MOQ ÷ tahmini ek talep: tedarikçinin en küçük siparişi, gelişten sonra karşılanamayacak talebin ne kadarı

Üç model

Banu’nun kuralı (STR ≥ %55, üçüncü ile altıncı pazartesi arası), lojistik regresyon ve LightGBM. İlkbahar-yaz sezonu için modeller ondan önce kapanmış dört sezonun 3.502 satırında, 802 pozitifle eğitildi; sınav sezonunu hiç görmedi.

ModelAlarmDoğruYanlış alarmKaçanİsabetDuyarlılık
Banu’nun kuralı267162105172%60,7%48,5
Lojistik regresyon3902929842%74,9%87,4
LightGBM3823008234%78,5%89,8

Banu’nun kuralı çok bağırmıyor. Bağırdığında da çoğunlukla haklı: 267 alarmın 162’si doğru. Asıl sorunu susması: yakalanması gereken 334 satırın yarısından azını buluyor. İkinci pazartesinin pozitiflerini hiç görmüyor, çünkü ürüne ilk kez üçüncü pazartesi bakıyor. Modeller kuraldan daha çok alarm veriyor ve yine de daha az yanılıyor; pozitiflerin onda dokuza yakınını buluyorlar.

Bu, girişteki sayıyla çelişiyor gibi görünebilir: kural 103 RPT’nin 64’ünü tutmayan ürüne vermişti. İkisi ayrı sorular. Tutmak, gerçek talebin planın bir buçuk katını geçmesi. RPT’ye değmek, gelen malın en az MOQ’nun yarısı kadarının tam fiyattan satılması. Planı biraz aşan, ama RPT geldiğinde hâlâ satan bir ürün tutan sayılmaz, yine de RPT’yi hak eder. Etikete göre kuralın alarmları çoğunlukla doğru. Asıl hatası kaçırdığı 172 satır.

Kaçırma oranı da birinci yazıdakinden yüksek görünüyor. Orada kural tutan ürünlerin üçte birini kaçırıyordu, burada pozitif satırların yarısından fazlasını. Ölçü farklı: satır düzeyinde, kuralın hiç bakmadığı ikinci pazartesiler de sayılıyor, kuralın ürünü sonradan yakaladığı haftadan önceki pozitif haftalar da.

Satır sayıları paranın kendisi değil. Aynı sınavı TL ile de okuyabiliriz: her yanlış alarm, verilmemesi gereken bir siparişin sonradan bakıldığında kaybettirdiği kâr; her kaçan satır, verilmesi gereken siparişin getirmediği kâr.

ModelYanlış alarmların bedeliKaçanların bedeli
Banu’nun kuralı6.182.207 TL205.808.206 TL
Lojistik regresyon14.825.493 TL10.405.622 TL
LightGBM17.038.283 TL6.440.643 TL

Kuralın yanlış alarmları ucuz: 6,2 milyon TL. Kaçırdıkları 205,8 milyon TL. Modellerin yanlış alarmı kuralınkinin iki ila üç katı, ama kaçırdıklarının bedeli 10,4 ve 6,4 milyon TL.

Bu tutarlar satır satır toplanıyor; aynı ürün üst üste haftalarda kaçırılınca bedeli her hafta yeniden yazılıyor. Kuralın kaçırma bedelinin mükemmel bir sınıflandırıcının bütün kârından büyük çıkması bu yüzden. Tablo hataların yönünü gösteriyor, büyüklüğünü değil. Paranın gerçek ölçüsü aşağıdaki ilk alarm tablosu: orada kural mükemmelin dörtte birini bırakıyor.

Bir option’a sezonda en fazla bir RPT verildiğini varsayıp, her modelin bir option için ilk alarmında sipariş verildiğini düşünelim. RPT’lerin sezon sonunda getirdiği kâr:

Modelİlk alarm alan optionKâr
Banu’nun kuralı103100.600.229 TL
Lojistik regresyon110130.700.734 TL
LightGBM101129.519.127 TL
Mükemmel sınıflandırıcı79134.774.625 TL

Sipariş miktarı doğru hesaplanınca Banu’nun kuralı da kazandırıyor: mükemmel bir sınıflandırıcının getireceği kârın %74,6’sını, yani dörtte üçünü alıyor. Modeller neredeyse tamamını alıyor: lojistik regresyon %97,0, LightGBM %96,1. Aradaki fark kuralın kaçırdığı ürünlerde.

Aynı sınav sonbahar-kış sezonunda aynı resmi veriyor: kural %44,6 isabet ve %50,9 duyarlılıkla, lojistik regresyon %61,4 ve %91,3 ile, LightGBM %61,8 ve %95,0 ile. İlk alarm kârında kural mükemmelin %69,0’ını, lojistik regresyon %82,0’ını, LightGBM %80,0’ını alıyor. O sezonun modeli üç kapanmış sezonun 2.604 satırıyla ve 623 pozitifle eğitildi. Üç kapanmış sezon bir model kurmaya yetiyor.

Model neye bakıyor?

İlkbahar-yaz modelinde lojistik regresyonun katsayıları, özellikler ölçeklendikten sonra, büyükten küçüğe ilk altısı:

ÖzellikKatsayı
Tedarikçinin RPT süresi−2,98
İndirime kalan hafta2,08
Gelişten sonra kalan tam fiyat talep payı−1,15
Stok kapsaması−1,02
Karar haftası−0,97
MOQ ÷ tahmini ek talep−0,90

Bu tabloyu okurken bir uyarı. İlk üç özellik aynı takvimden türüyor: gelişten sonra kalan tam fiyat payı, tedarikçinin RPT süresinin, karar haftasının ve indirime kalan haftanın neredeyse bir fonksiyonu. Böyle özelliklerde tek bir katsayının işaretini tek başına okumak yanıltır. Kalan payın eksi görünmesi “kalan pay arttıkça aday olma ihtimali düşer” demek değil. Bu üçlüyü tek bir blok olarak okumak gerekir: mal geldiğinde satacak zaman kalıyor mu?

Tablonun en ağır kısmı bu blok. Tedarik uzadıkça aday olma ihtimali düşüyor, indirime kalan hafta arttıkça yükseliyor. Stok kapsaması ve tedarikçinin en küçük partisinin kalan talebe oranı da daha küçük ağırlıkla aynı şeyi söylüyor: elde çok stok varsa ya da MOQ kalan talebe göre büyükse ihtimal düşüyor. Banu’nun kuralının baktığı STR, on dört özelliğin on üçüncüsü; katsayısı 0,13, en büyük katsayının yirmide birinden küçük.

Bu, aday olmanın tanımını değiştiriyor. “Satıyor mu” sorusu önemli, ama belirleyici değil. Belirleyici olan, malın geldiğinde satacak zaman bulup bulmayacağı.

Uzak Doğu’dan gelmek ayrı bir özellik olarak küçük bir ağırlık taşıyor ve işareti sezona göre değişiyor: ilkbahar-yaz modelinde +0,42, sonbahar-kış modelinde −0,02. Uzak Doğu’nun dezavantajı zaten tedarik süresi sütununda.

Hangisi?

LightGBM biraz daha isabetli, kârda ikisi başa baş. Sonraki yazılardaki oyunlarda “öneri” kolu LightGBM ile koşturuldu; aynı oyunlar lojistik regresyonla da koşturuldu ve iki model neredeyse aynı siparişleri verdi. İlkbahar-yazda LightGBM 77 option’a, lojistik regresyon 79 option’a RPT verdi; 76’sı ortak. İki modelin kâr farkı kârlarının %2’sinden az (altıncı yazıda).

Ben olsam lojistiği seçerdim. LightGBM sınıflandırmada az farkla önde, ilk alarm kârında lojistik. Fark, açıklanabilirlikten vazgeçmeye değecek kadar büyük değil. Lojistik regresyon bir buyer’a “bu ürün neden aday” sorusunun cevabını tek tabloda veriyor. Replenishment dizisinin tezi burada da geçerli: karmaşıklık kendini ölçümle kazanmalı.

Bir uyarı

Sınav satırları, hiç RPT verilmeyen bir oyundan alındı. Gerçekte bir ürüne RPT verildiği an sonraki haftaların stok durumu değişir ve o ürün artık aday listesinde görünmez. Bir de şu var: ürünün aday olup olmadığı, ne kadar sipariş verileceğine bağlı. Etiket, bir sonraki yazının miktar hesabını kullanıyor. Aday ile miktar ayrı sorular gibi anlatılıyor ama aynı hesabın iki yüzü.

Sizin verinizde zor olan

Bu yazının sınavı (i) etiketiyle yapıldı ve (i) gerçek talebi biliyor. Sizin zincirinizde yalnız (ii) var. Modeli onunla eğitebilirsiniz, ama sınamak için de yine onu kullanmak zorundasınız; soruyu da cevap anahtarını da aynı kestirimden yazıyorsunuz. Lumoda’da iki etiketin yirmi satırın on dokuzunda aynı sonucu verdiğini gördük. Sizin verinizde bu oranı ölçemezsiniz. Yalnız bu oranın, stoksuz günleri ne kadar doğru doldurduğunuza bağlı olduğunu bilirsiniz.

Bir de maliyetin görünürlüğü var. Kuralın en pahalı hatası kaçırmak ve kaçırılan RPT hiçbir raporda görünmez. Tutmayan ürüne verilmiş RPT depoda durur, herkes görür. Verilmeyen RPT’nin bedeli, rafı boş bulan müşteriyle birlikte kaybolur. Sahadaki kurallar bu yüzden görünen hataya göre ayarlanmaya, yani fark edilmeden temkinli olmaya eğilimlidir.

Sonraki yazıda miktar hesabını kuruyoruz: ne kadar, ne zaman?

Yazan: Sabri Suyunu