LSTM - ANN Dynamic Pricing dalam Retail Barang Rumah

Bukan rahasia lagi bahwa metode pembelajaran mesin mulai menembus ke berbagai bidang bisnis di mana-mana, mengoptimalkan, meningkatkan, dan bahkan menciptakan proses bisnis baru. Salah satu bidang penting adalah masalah penetapan harga barang, dan di sini, dengan data yang cukup, MO membantu melakukan apa yang sebelumnya sulit dicapai - untuk mengembalikan kurva permintaan multi-faktor dari data. Berkat kurva permintaan yang dipulihkan, menjadi mungkin untuk membangun sistem penetapan harga dinamis yang memungkinkan optimalisasi harga tergantung pada tujuan penetapan harga - untuk meningkatkan pendapatan atau laba. Artikel ini adalah kompilasi disertasi saya, di mana model penentuan harga dinamis LSTM-ANN dikembangkan dan diuji dalam praktik selama 4 minggu untuk salah satu barang dari pengecer barang-barang rumah.

Saya ingin segera mencatat bahwa dalam artikel ini saya tidak akan mengungkapkan nama perusahaan tempat studi dilakukan (namun demikian, ini adalah salah satu perusahaan dari daftar di lokasi), sebagai gantinya saya hanya akan menamainya - Pengecer.

Latar belakang


Ada pemimpin harga di pasar ritel barang-barang rumah tangga, Leroy Merlin. Volume penjualan jaringan ini memungkinkan mereka untuk mempertahankan strategi harga minimum untuk seluruh jajaran produk, yang mengarah pada tekanan harga pada pemain pasar lainnya.

Pendapatan dan keuntungan dari pengecer utama di St. Petersburg pada tanggal 31 Desember 2017

gambar

Dalam hal ini, Pengecer menggunakan pendekatan berbeda untuk penetapan harga:

  • Harga ditetapkan pada pesaing terendah;
  • Pembatasan harga dari bawah: harga pembelian + premi minimum yang mencerminkan perkiraan biaya per unit barang.

Pendekatan ini merupakan kombinasi dari metode penetapan harga yang mahal dan penetapan harga pesaing. Namun, itu tidak sempurna - tidak secara langsung memperhitungkan permintaan konsumen.

Karena kenyataan bahwa model penetapan harga dinamis memperhitungkan banyak faktor (permintaan, musim, promosi, harga pesaing), dan juga memungkinkan Anda untuk menerapkan batasan pada harga yang diajukan (misalnya, dari biaya yang mencakup bawah), berpotensi sistem ini menghilangkan semua satu sisi dan kerugian dari metode penetapan harga lainnya.

Data


Untuk penelitian, perusahaan menyediakan data dari Januari 2015 hingga Juli 2017 (920 hari / 131 minggu). Data ini termasuk:

  • Penjualan siang hari, termasuk akhir pekan, untuk 470 produk (16 kelompok produk);
  • Hari-hari promosi di toko;
  • Hari di mana diskon barang disediakan;
  • Harga untuk masing-masing 470 produk;
  • Data harian tentang jumlah cek di seluruh jaringan di St. Petersburg;
  • Harga pesaing utama untuk sebagian besar dari 470 produk (data diambil seminggu sekali).

Selain data ini, saya juga menambahkan variabel dummy kalender:

  • Musim dalam setahun (musim gugur / dingin / musim panas / musim semi);
  • Bulan
  • Seperempat;
  • Hari dalam seminggu;
  • Liburan;

Juga, variabel cuaca:

  • Curah hujan - boneka;
  • Suhu
  • Penyimpangan suhu dari rata-rata di musim.

Dengan secara langsung menganalisis penjualan barang harian, saya menemukan bahwa:
Hanya sekitar 30% dari barang yang dijual sepanjang waktu, semua barang lainnya dijual pada akhir 2015, atau dihapus dari penjualan lebih awal dari 2017, yang menyebabkan pembatasan yang signifikan pada pilihan barang untuk penelitian dan percobaan harga. Ini juga membawa kita pada kenyataan bahwa karena perubahan barang yang konstan di garis toko, menjadi sulit untuk membuat sistem penetapan harga komoditas terintegrasi, namun ada beberapa cara untuk mengatasi masalah ini, yang akan dibahas nanti.

Sistem Harga


Untuk membangun sistem rekomendasi harga barang untuk periode waktu berikutnya berdasarkan model yang memprediksi permintaan, saya datang dengan skema berikut:

gambar

Karena, setelah melatih model pada data, kami mendapatkan model yang mengembalikan kurva permintaan multi-faktor dengan memasok berbagai harga barang ke input, kami akan menerima estimasi penjualan, tergantung pada harga ini. Dengan demikian, kita dapat melakukan optimasi harga untuk mencapai hasil yang diinginkan - memaksimalkan pendapatan yang diharapkan atau laba yang diharapkan. Tetap hanya melatih model yang bisa memprediksi penjualan dengan baik.

Apa yang tidak berhasil
Setelah memilih salah satu produk untuk penelitian, saya menggunakan XGBoost, sebelum pindah langsung ke model LSTM.

Saya melakukan ini dengan harapan bahwa XGBoost akan membantu saya membuang banyak faktor yang tidak perlu (ini terjadi secara otomatis), dan yang tersisa harus digunakan untuk model LSTM. Saya menggunakan pendekatan ini secara sadar, karena, untuk menghindari pertanyaan yang tidak perlu tentang pembelaan disertasi, saya ingin mendapatkan yang kuat dan, pada saat yang sama, pembenaran sederhana dari pilihan faktor-faktor untuk model di satu sisi, dan di sisi lain, penyederhanaan pengembangan. Selain itu, saya menerima model yang siap pakai, kasar, yang memungkinkan untuk dengan cepat menguji berbagai ide dalam penelitian. Dan setelah itu, setelah mencapai pemahaman akhir tentang apa yang akan berhasil dan apa yang tidak, buatlah model LSTM terakhir.

Untuk memahami masalah perkiraan, saya akan memberikan jadwal penjualan harian untuk produk pertama yang dipilih:

gambar

Seluruh rangkaian waktu penjualan pada bagan dibagi menjadi penjualan rata-rata untuk periode tersebut, agar tidak mengungkapkan nilai nyata, tetapi untuk mempertahankan tampilan.

Secara umum, banyak kebisingan, sementara ada ledakan diucapkan - ini adalah melakukan promosi di tingkat jaringan.

Karena bagi saya itu adalah pengalaman pertama dalam membangun model pembelajaran mesin, saya harus menghabiskan banyak waktu untuk berbagai artikel dan dokumentasi, sehingga pada akhirnya ada sesuatu yang berhasil bagi saya.

Daftar awal faktor-faktor yang mungkin mempengaruhi penjualan:

  • Data penjualan harian barang-barang lain dari grup ini, total penjualan dalam kelompok dalam potongan-potongan dan jumlah cek untuk semua toko di St. Petersburg dengan keterlambatan 1, 2, 3, 7, 14, 21, 28;
  • Data harga barang-barang lain dari kelompok;
  • Rasio harga produk yang diselidiki dengan harga barang-barang lain dari kelompok;
  • Harga terendah di antara semua pesaing (data diambil seminggu sekali, dan saya membuat asumsi bahwa harga seperti itu akan berlaku untuk minggu berikutnya);
  • Rasio harga produk yang diselidiki dengan harga terendah dari pesaing;
  • Penjualan tertinggal berdasarkan kelompok (dalam satuan potong);
  • Rata-rata sederhana dan RSI berdasarkan keterlambatan penjualan barang kelompok, total penjualan dalam kelompok, dan jumlah cek.

Sebanyak 380 faktor. (2,42 pengamatan per faktor). Dengan demikian, masalah memotong faktor-faktor yang tidak signifikan sangat tinggi, namun, XGBoost membantu mengatasi hal ini, secara signifikan memotong jumlah faktor menjadi 23 (40 pengamatan per faktor).

Hasil terbaik yang bisa saya capai menggunakan pencarian keserakahan adalah sebagai berikut:

gambar
R ^ 2-adj = 0,4 pada sampel uji

Data dibagi menjadi sampel pelatihan dan uji tanpa pencampuran (karena ini adalah deret waktu). Sebagai metrik, saya menggunakan indikator R ^ 2 disesuaikan secara sadar, karena presentasi hasil akhir pekerjaan harus diadakan sebelum komisi, termasuk. terdiri dari perwakilan bisnis, oleh karena itu, itu digunakan sebagai yang paling terkenal dan termudah untuk dipahami.

Hasil akhir mengurangi kepercayaan saya pada keberhasilan, karena hasil R ^ 2-adj 0,4 hanya berarti bahwa sistem prediksi tidak akan dapat memprediksi permintaan pada hari berikutnya dengan cukup baik, dan rekomendasi untuk harga tidak akan jauh berbeda dari sistem "finger in the sky".

Selain itu, saya memutuskan untuk memeriksa seberapa efektif penggunaan XGBoost untuk memprediksi penjualan harian untuk sekelompok barang (dalam lelucon) dan memprediksi jumlah cek secara umum melalui jaringan.

Penjualan berdasarkan kelompok produk:

gambar
R ^ 2-adj = 0,71

Cek:

gambar
R ^ 2-adj = 0,86

Saya pikir alasan bahwa data penjualan untuk produk tertentu tidak dapat diprediksi jelas dari grafik yang disajikan - noise. Penjualan barang secara individu ternyata terlalu rentan terhadap peluang, sehingga metode membangun regresi tidak efektif. Pada saat yang sama, dengan mengumpulkan data, kami menghilangkan pengaruh keacakan dan mendapatkan kemampuan prediksi yang baik.

Untuk akhirnya memastikan bahwa memprediksi permintaan untuk satu hari sebelumnya adalah latihan yang tidak ada gunanya, saya menggunakan model SARIMAX (paket statsmodels untuk python) untuk penjualan harian:

gambar

gambar

Bahkan, hasilnya tidak berbeda dengan cara apa pun dari yang diperoleh menggunakan XGBoost, yang menunjukkan bahwa penggunaan model yang kompleks dalam kasus ini tidak dibenarkan.

Pada saat yang sama, saya juga ingin mencatat bahwa faktor cuaca XGBoost maupun SARIMAX tidak signifikan.

Membangun model akhir


Solusi untuk masalah kualitas prediksi adalah dengan mengumpulkan data pada tingkat mingguan. Ini memungkinkan kami untuk mengurangi pengaruh faktor acak, namun, secara signifikan mengurangi jumlah data yang diamati: jika ada data harian 920, hanya data mingguan 131. Situasi memburuk karena jumlah faktor tetap hampir tidak berubah (boneka untuk hari-hari dalam seminggu tidak termasuk), tetapi jumlah pengamatan dari variabel target sangat menurun.

Selain itu, tugas saya diperumit oleh kenyataan bahwa pada waktu itu, perusahaan memutuskan untuk mengubah produk yang eksperimennya akan diterapkan menggunakan model, jadi saya harus mengembangkan model dari awal.

Perubahan barang terjadi pada barang dengan musiman yang diucapkan:

gambar

Karena beralih ke penjualan mingguan, muncul pertanyaan logis: apakah cukup untuk menggunakan model LSTM sama sekali dengan sejumlah kecil data? Saya memutuskan untuk mencari tahu dalam praktik dan, pertama-tama, untuk mengurangi jumlah faktor (bahkan jika itu adalah potensi kerusakan dalam mengurangi informasi penting). Saya membuang semua faktor yang dihitung berdasarkan keterlambatan penjualan (rata-rata, RSI), faktor cuaca (pada data harian, cuaca tidak masalah, dan transfer ke tingkat mingguan, lebih-lebih, kehilangan akal). Setelah itu, saya, secara tradisional, menggunakan XGBoost untuk memotong faktor tidak penting lainnya. Kemudian, saya juga memilah beberapa faktor berdasarkan model LSTM, tidak termasuk faktor satu per satu, melatih model lagi dan membandingkan hasilnya.

Daftar faktor terakhir adalah sebagai berikut:

  • Rasio harga per kilogram produk yang diselidiki dan primer CERESIT ST 17 10 l;
  • Rasio harga produk yang diselidiki dan produk serta primer CERESIT ST 17 10 l;
  • Rasio harga produk yang diselidiki dan primer EURO 3 PRIMER;
  • Rasio harga produk yang diselidiki dan harga minimum dari pesaing;
  • Variabel Dummy untuk tiga promosi di tingkat jaringan;
  • Variabel Dummy musim semi, musim panas, musim gugur;
  • Log 1 - 5 penjualan mingguan dari produk yang diselidiki.

Hanya 15 faktor (9 pengamatan per faktor).

Model LSTM terakhir ditulis menggunakan Keras, termasuk 2 lapisan tersembunyi (masing-masing 25 dan 20 neuron), dan aktivatornya adalah sigmoid.

Kode untuk model LSTM terakhir menggunakan Keras:

model = Sequential() model.add(LSTM(25, return_sequences=True, input_shape=(1, trainX.shape[2]))) model.add(LSTM(20)) model.add(Dense(1, activation='sigmoid')) model.compile(loss='mean_squared_error', optimizer='adam') model.fit(trainX, trainY, epochs=40, batch_size=1, verbose=2) model.save('LSTM_W.h5') 

Hasil:

gambar

gambar

Kualitas prediksi pada sampel uji terlihat cukup meyakinkan oleh metrik, namun, menurut pendapat saya, itu masih belum mencapai yang ideal, karena, meskipun penentuan tingkat rata-rata penjualan yang agak akurat, ledakan dalam minggu-minggu individual dapat menyimpang sedikit dari " tingkat penjualan rata - rata, yang memberikan penyimpangan yang kuat dari perkiraan penjualan dari kenyataan pada hari - hari tertentu (hingga 50%). Namun demikian, saya menggunakan model ini secara langsung untuk percobaan dalam praktik.

Menarik juga untuk melihat seperti apa kurva permintaan yang dipulihkan dalam hal harga. Untuk melakukan ini, saya menjalankan model pada kisaran harga dan, berdasarkan perkiraan penjualan, membangun kurva permintaan:

gambar

Eksperimen


Setiap minggu, jaringan menyediakan data penjualan untuk minggu sebelumnya di St. Petersburg, serta harga dari pesaing. Berdasarkan data ini, saya melakukan optimasi harga untuk memaksimalkan keuntungan yang diharapkan, mengatakan harga yang harus ditetapkan oleh jaringan untuk minggu depan, yang memang berhasil. Ini berlanjut selama 4 minggu (jangka waktu disepakati dengan pengecer).

Maksimalisasi keuntungan dilakukan dengan batasan: harga minimum adalah harga beli + fix. biaya tambahan, harga maksimum dibatasi oleh harga primer dari produsen yang sama, hanya dalam paket 10l.

Hasil eksperimen disajikan dalam tabel di bawah ini (semua angka dibagi dengan nilai tertentu agar tidak mengungkapkan nilai absolut):

Prediksi Penjualan:

gambar

Prediksi Keuntungan:

gambar

Untuk menilai dampak sistem penetapan harga baru terhadap penjualan, saya membandingkan penjualan untuk periode yang sama, hanya untuk tahun-tahun sebelumnya.

Hasil Ringkasan 4 Minggu:

gambar

Sebagai hasilnya, kita mendapatkan gambaran ganda: prediksi penjualan yang sama sekali tidak realistis, tetapi pada saat yang sama, hasil murni positif pada indikator ekonomi (baik dalam hal laba dan pendapatan).

Penjelasannya, menurut saya, adalah bahwa dalam kasus ini, modelnya, yang secara salah memprediksi penjualan, tetap menangkap ide yang benar - elastisitas harga untuk produk ini di bawah 1, yang berarti bahwa harga dapat ditingkatkan, tanpa takut akan penurunan penjualan, yang kami lihat (penjualan dalam unit tetap pada tingkat yang sama seperti pada tahun sebelumnya dan tahun sebelumnya).

Tetapi jangan lupa bahwa 4 minggu adalah periode jangka pendek dan percobaan dilakukan hanya pada satu produk. Dalam jangka panjang, barang-barang yang harganya terlalu mahal di toko akan menyebabkan penurunan penjualan untuk toko secara keseluruhan. Untuk mengkonfirmasi firasat saya tentang ini, saya memutuskan, menggunakan XGBoost, untuk memeriksa apakah konsumen memiliki "memori" untuk harga untuk periode sebelumnya (jika di masa lalu itu lebih mahal "keseluruhan" daripada pesaing, konsumen pergi ke pesaing). Yaitu apakah tingkat harga rata-rata untuk grup selama 1, 3 dan 6 bulan terakhir akan disediakan untuk penjualan oleh kelompok produk.

gambar

Memang, dugaan itu dikonfirmasi: satu atau lain cara, tingkat harga rata-rata untuk periode sebelumnya mempengaruhi penjualan pada periode saat ini. Ini berarti bahwa tidak cukup untuk melakukan optimasi harga pada periode saat ini untuk satu produk - juga perlu memperhitungkan tingkat harga umum dalam jangka panjang. Yang, secara umum, mengarah ke situasi di mana taktik (memaksimalkan keuntungan sekarang) bertentangan dengan strategi (bertahan dalam persaingan). Namun, ini sudah lebih baik diserahkan kepada pemasar.

Berdasarkan hasil dan pengalaman, menurut pendapat saya, yang paling optimal, sistem penetapan harga berdasarkan perkiraan penjualan dapat terlihat seperti ini:

  1. Untuk naik dari nomenklatur produk setengah langkah lebih tinggi adalah dengan melakukan analisis kluster dan obeng bersyarat grup berdasarkan kesamaan dan perkiraan penjualan serta menetapkan harga bukan untuk obeng tunggal, tetapi untuk subkelompok ini, jadi kami akan menghindari masalah untuk terus-menerus melepas dan menambahkan nomenklatur produk.
  2. Melakukan optimalisasi harga di kompleks - tidak hanya untuk subkelompok barang, tetapi juga memperhitungkan efek jangka panjang. Untuk melakukan ini, Anda dapat menggunakan model yang memprediksi penjualan secara keseluruhan melalui jaringan, untungnya, ternyata sangat akurat bahkan pada penjualan harian.

Merangkum hasil pekerjaan yang dilakukan, saya ingin mengatakan bahwa itu sulit bagi saya, karena bukan orang yang berpengalaman dalam pengembangan secara umum, dan dalam metode MO khususnya, bagaimanapun, semuanya ternyata layak. Itu juga menarik untuk memeriksa sendiri bagaimana metode ini berlaku dalam kenyataan. Setelah membaca banyak artikel sebelumnya, mata saya menyala karena saya akan mencoba melakukan semuanya sendiri dan saya mengantisipasi bahwa saya akan mendapatkan hasil yang sangat baik. Praktek ini ternyata keras - sejumlah kecil barang dengan sejarah penjualan yang panjang, data harian yang berisik, tidak dapat memprediksi volume penjualan, penggunaan model yang rumit tidak selalu dibenarkan. Meskipun demikian, saya mendapatkan pengalaman yang tak terlupakan dan belajar apa artinya menerapkan analitik.

β†’ Berdasarkan pekerjaan yang dilakukan, saya menyiapkan proyek di repositori saya

Dalam repositori Anda akan menemukan dataset yang dihasilkan berdasarkan dependensi yang diambil dari data nyata, serta skrip python yang memungkinkan Anda untuk melakukan eksperimen virtual pada data yang dihasilkan ini, menawarkan Anda untuk mencoba keberuntungan Anda dan mengambil alih model sesuai dengan keuntungan Anda, menetapkan harga barang. Yang Anda butuhkan hanyalah mengunduh dan menjalankan skrip.

Saya berharap pengalaman saya akan membantu dalam menentukan batasan penggunaan metode MO dan akan menunjukkan bahwa kesabaran dan ketekunan dapat mencapai hasil, bahkan jika Anda bukan seorang profesional di bidang apa pun.

Source: https://habr.com/ru/post/id421429/


All Articles