Rakip Fiyat İzleme ve Dinamik Fiyatlandırma Sistemi
Rakip fiyatını herkes görür, rakip doluluğunu kimse.
- TypeScript
- Express
- node:sqlite
- Chrome Extension
Problem
Fiyat izleme bir emtia: yalnızca sokağı eşleyen bir otel, takvimi zaten doğru fiyatlayan bir sokağı eşliyor demektir. Ayırt edici bilgi fiyat değil doluluk — ama doluluk hiçbir kanalda yayımlanmıyor.
Kanalın söylediği tek şey "şu tarihte müsait oda var mı". Bu bir sayı değil, bir alt sınır: "8 oda müsait" cevabı, gerçekte 8 ya da daha fazla oda boş demek. İstatistikte buna sansürlü gözlem denir ve bir sansürlü gözlemi kesin değer gibi okumak, sistematik olarak yanlış tarafa sapan bir tahmin üretir.
Üstelik gerçekle cevap arasında üç ayrı tavan var: otelin kanala ayırdığı kota (%30–65), seçicinin 8 odada kesilmesi, ve otellerin dörtte birinde yayımlanan oda sayısının güncel olmaması.
Çözüm
Doluluk, müsaitlik sorgusu üzerinde ikili aramayla çıkarılıyor: monoton bir yüklem üzerinde arama, 8 istek yerine 3 istek demek. Hiçbir aşamada rezervasyon oluşturulmuyor.
Sansür, sorgu tavanına bakarak değil öğrenilmiş tavana bakarak işaretleniyor: bir otelin bugüne kadar döndürdüğü en yüksek müsaitlik, o otelin gösterebileceği en fazla şeydir. Kota sansürü, yalnızca 8'e bakan bir teste görünmez.
Tahmin, sansürlü satırları atmak yerine Tobit regresyonu ile kuruluyor (12 adımlı EM): sansürlü satır kendi alt sınırını taşıyor, kesilmiş normalin koşullu ortalamasıyla dolduruluyor, sigma yalnızca kesin satırlardan hesaplanıyor. İki bağımsız değişken var — kendi doluluğu ve o gecenin sansürsüz rakipleri; ikincisi olmadan tahmin kendi verisine demirliyor ve zaten bildiğin sinyali iptal ediyor.
Toplama tarafında headless tarayıcı bot korumasına takıldığı için, veri gerçek bir oturumda çalışan bir Chrome uzantısıyla okunuyor.
Sonuç
Çıkarım çalışıyor, ama karar kuralını iyileştirmiyor — ve bu böyle raporlanıyor.
Sansürlü regresyon 12 pazarın 12'sinde naif okumadan daha isabetli: ortalama mutlak hata 35 puandan 12 puana iniyor. Gelir tarafında ise tek satırlık bedava bir kontrolü (rakip medyanını eşleme) geçemiyor. Koşudan önce yazılmış üç hipotezden ikisi 12/12 çürüdü.
Asıl kazanç ölçümün kendisiydi: kurulan ölçüm düzeneği, projenin kendi kodundaki dört kusuru yakaladı — hiçbiri hata vermiyordu. Sansür yalnızca sorgu tavanına karşı test ediliyordu; model seçilmiş örneklem üzerine oturtulmuştu; tahminci kendi verisine demirlemişti (isabet artarken gelir düşüyordu); ve plasebo, mevsim bir sinüs olduğu için hâlâ cevabın üçte birini biliyordu.
Toplama ile tahmin arasındaki sınır bilinçli olarak dar: uzantı yalnızca ham gözlem yazıyor — tarih, müsait oda, yayımlanan oda, fiyat ve sansür bayrağı. Sansür türetilmiyor, saklanıyor; çünkü sonradan türetmek, o anki tavan bilgisini kaybettikten sonra tahmin yapmak demek.
Alım ucundaki doğrulama katı: alanın sayı olduğu typeof ile denetleniyor.
İlk sürüm Number(null) kullanıyordu ve müsaitliği bilinmeyen bir okuma
veritabanına kendinden emin bir sıfır olarak yazılıyordu. Testi yazılana
kadar görünmedi.
Kaynak kod
Yorumlar sayfanın dilinde gösteriliyor. Depodaki dosyalar hem İngilizce hem Türkçe yorum taşır.
Proje yapısı
README.md
131 satır · 12 KB
Yükleniyor…