Bagaimana cara meramalkan berdasarkan data yang dikumpulkan dalam interval yang tidak teratur?

10

Saya mencoba meramalkan penjualan produk di vending machine. Masalahnya adalah bahwa mesin diisi pada interval yang tidak teratur dan pada setiap pengisian kita hanya dapat mencatat penjualan agregat sejak pengisian terakhir mesin (yaitu kita tidak memiliki data penjualan harian). Jadi pada dasarnya kami memiliki data untuk penjualan agregat pada interval tidak teratur. Interval biasanya antara 2 hari dan 3 minggu. Berikut adalah contoh data untuk satu mesin penjual otomatis dan satu produk:

27/02/2012 48
17/02/2012 24
09/02/2012 16
02/02/2012 7
25/01/2012 12
16/01/2012 16
05/01/2012 16
23/12/2011 4
16/12/2011 14
09/12/2011 4
02/12/2011 2

Algoritma naif kami saat ini adalah untuk menghitung rata-rata penjualan per hari dengan membagi jumlah total yang terjual selama 90 hari terakhir dengan 90.

Apakah Anda tahu bagaimana cara meningkatkan perkiraan penjualan per hari? Saya perlu memperkirakan apa yang akan dijual pada kunjungan mesin berikutnya. Apakah mungkin untuk menggunakan semacam algoritma pemulusan eksponensial mengingat sifat data kami?

Terima kasih sebelumnya!

PEMBARUAN: Terima kasih banyak untuk semua jawaban dan komentar. Biarkan saya mencoba untuk memberikan konteks yang sedikit lebih (kasus bisnis di balik pertanyaan - tentu saja sangat disederhanakan). Kami memiliki ratusan mesin penjual otomatis. Setiap hari kita harus memutuskan yang mana dari 20 yang akan mereka kunjungi untuk diisi ulang. Untuk melakukannya, kami mencoba memprediksi status mesin saat ini dan memilih 20 mesin "paling kosong". Untuk setiap mesin dan produk, kami menghitung rata-rata penjualan per hari (SPD) menggunakan algoritma naif yang dijelaskan di atas. Kemudian kami mengalikan SPD dengan jumlah hari sejak pengisian terakhir mesin dan hasilnya adalah kuantitas yang diprediksi terjual.

Ivan Dimitrov
sumber
Saya pikir ini pertanyaan yang menarik. Jawaban saya atas pertanyaan dan set data Anda yang tepat adalah: apakah itu penting? dan: dapatkan lebih banyak data. Juga, saya pikir itu berguna untuk mengetahui berapa kapasitas untuk mesin penjual otomatis.
Adam
@ Adam Kapasitas untuk produk ini adalah 50 botol. Mungkin uraian saya tentang masalahnya tidak cukup jelas. Saya akan mencoba mengeditnya sedikit untuk memberikan lebih banyak konteks. Pada dasarnya saya mencari ide bagaimana menyelesaikan masalah umum dan saya sangat berterima kasih atas semua komentar sejauh ini. Dataset spesifik diberikan seperti contohnya seperti apa data itu. Untuk mesin penjual otomatis lainnya saya dapat memberikan data untuk periode yang lebih lama.
Ivan Dimitrov
@IvanDimitrov: Apa sebenarnya kolom dua di data Anda?
Kyle Brandt
@KyleBrandt Kolom dua adalah jumlah botol yang terjual sejak kunjungan terakhir ke mesin penjual otomatis. Jadi angka 48 di baris atas berarti bahwa 48 botol dijual antara 17/02 dan 27/02
Ivan Dimitrov

Jawaban:

11

Mari kita fokus pada masalah bisnis, mengembangkan strategi untuk mengatasinya, dan mulai menerapkan strategi itu dengan cara yang sederhana. Nantinya, hal itu dapat ditingkatkan jika upaya menjaminnya.

Masalah bisnisnya adalah memaksimalkan keuntungan, tentu saja. Itu dilakukan di sini dengan menyeimbangkan biaya pengisian ulang mesin dengan biaya kehilangan penjualan. Dalam formulasi saat ini, biaya pengisian ulang mesin ditetapkan: 20 dapat diisi ulang setiap hari. Karenanya, biaya penjualan yang hilang tergantung pada frekuensi mesin mana yang kosong.

Model statistik konseptual untuk masalah ini dapat diperoleh dengan merancang beberapa cara untuk memperkirakan biaya untuk masing-masing mesin, berdasarkan data sebelumnya. Yang diharapkanbiaya untuk tidak melayani mesin hari ini kira-kira sama dengan peluang mesin habis saat digunakan. Misalnya, jika mesin memiliki peluang 25% kosong hari ini dan rata-rata menjual 4 botol per hari, biaya yang diharapkan sama dengan 25% * 4 = 1 botol dalam penjualan yang hilang. (Terjemahkan itu ke dalam dolar sesuka Anda, jangan lupa bahwa satu penjualan yang hilang menimbulkan biaya yang tidak berwujud: orang melihat mesin kosong, mereka belajar untuk tidak bergantung padanya, dll. Anda bahkan dapat menyesuaikan biaya ini sesuai dengan lokasi mesin; memiliki beberapa yang tidak jelas mesin berjalan kosong untuk sementara waktu mungkin menimbulkan beberapa biaya tidak berwujud.) Adalah wajar untuk mengasumsikan bahwa mengisi ulang mesin akan segera mengatur ulang kerugian yang diharapkan menjadi nol - jarang terjadi bahwa mesin akan dikosongkan setiap hari (tidak Anda inginkan. ..) Seiring berjalannya waktu,

θxθx

x=(7,7,7,13,11,9,8,7,8,10)y=(4,14,4,16,16,12,7,16,24,48)θ^=1.8506

Aktual vs fit

Titik merah menunjukkan urutan penjualan; titik biru adalah estimasi berdasarkan estimasi kemungkinan maksimum dari tingkat penjualan tipikal.

t

Kerugian seiring waktu

50/1.85=27

Dengan bagan seperti ini untuk setiap mesin (yang sepertinya ada beberapa ratus), Anda dapat dengan mudah mengidentifikasi 20 mesin yang saat ini mengalami kerugian terbesar yang diharapkan: melayani mereka adalah keputusan bisnis yang optimal. (Perhatikan bahwa setiap mesin akan memiliki laju perkiraan sendiri dan akan berada pada titiknya sendiri di sepanjang kurva, tergantung pada kapan terakhir kali diservis.) Tidak ada yang benar-benar harus melihat grafik ini: mengidentifikasi mesin untuk diservis berdasarkan ini adalah mudah diotomatisasi dengan program sederhana atau bahkan dengan spreadsheet.

Ini baru permulaan. Seiring waktu, data tambahan dapat menyarankan modifikasi pada model sederhana ini: Anda dapat memperhitungkan akhir pekan dan hari libur atau pengaruh yang diantisipasi lainnya pada penjualan; mungkin ada siklus mingguan atau siklus musiman lainnya; mungkin ada tren jangka panjang untuk dimasukkan dalam perkiraan. Anda mungkin ingin melacak nilai-nilai terluar yang mewakili operasi satu kali yang tidak terduga pada mesin dan memasukkan kemungkinan ini dalam perkiraan kerugian, dll. Namun, saya ragu bahwa perlu khawatir tentang korelasi serial penjualan: sulit untuk berpikir mekanisme apa pun untuk menyebabkan hal seperti itu.

θ^=1.871.8506

1-POISSON(50, Theta * A2, TRUE)

untuk Excel ( A2adalah sel yang berisi waktu sejak isi ulang terakhir dan Thetamerupakan perkiraan tingkat penjualan harian) dan

1 - ppois(50, lambda = (x * theta))

untuk R.)

Model yang lebih mewah (yang menggabungkan tren, siklus, dll) perlu menggunakan regresi Poisson untuk perkiraan mereka.

θ

whuber
sumber
1
Bagi saya asumsi bahwa penjualan / acara tidak tergantung satu sama lain akan tampak tidak logis karena ini adalah pengukuran yang diambil dari waktu ke waktu pada nachine yang sama. Bagaimana pendekatan Anda menangani data penjualan yang dikorelasikan otomatis yang mungkin memiliki perubahan level? Hanya penasaran ?
IrishStat
1
Saya percaya saya telah membuat sketsa rute untuk menilai dan menangani kemungkinan bentuk "autokorelasi." Mereka tidak akan dimanifestasikan seperti itu dalam analisis deret waktu tradisional, bahkan jika data spasi yang teratur tersedia. Korelasi temporal akan dihasilkan dari korelasi dalam faktor-faktor eksternal, seperti siklus mingguan atau musiman. Suatu bentuk yang menarik akan terjadi dari pengelompokan temporal pembelian (misalnya, setelah makan siang atau pada akhir pekan). "Perubahan level bersih" dapat ditangani dengan penyesuaian tren, jika perlu, tetapi hanya dengan menggunakan rata-rata berjalan akan menghadapinya secara otomatis.
Whuber
4

Saya pikir Anda biasanya akan memiliki langkah pertama untuk mengubah ke deret waktu reguler. Anda bilang Anda perlu rata-rata 90 hari. Karena Anda memiliki data yang lebih sering dari itu, saya pikir lebih masuk akal untuk menggunakan sebagian besar dari apa yang Anda miliki dengan mengambil hari antara setiap pengamatan dan membaginya dengan jumlah barang yang dijual untuk periode itu (dengan asumsi itulah yang Anda kolom kedua adalah).

Sebagai penafian, saya adalah seorang amatir total, jadi Anda ingin mengambil saran dari seorang ahli seperti IrishStat atas kode berikut (misalnya, katanya ETS adalah model yang buruk, jadi hanya memperlakukan ini sebagai contoh mainan), tetapi dengan harapan bahwa ini menghemat waktu Anda, berikut adalah beberapa kode R yang dapat Anda mainkan:

library("xts")
library("forecast")

x = read.table(text="27/02/2012 48
17/02/2012 24
09/02/2012 16
02/02/2012 7
25/01/2012 12
16/01/2012 16
05/01/2012 16
23/12/2011 4
16/12/2011 14
09/12/2011 4
02/12/2011 2")

#Convert the data into an XTS object which works with irregular time series 
x.xts = xts(x[,2], as.POSIXct(x[,1], format="%d/%m/%Y"))

#Conver to a daily rate by taking the observed data and dividing it by 
#the number of days between observations
daily_rate <- lag(x.xts) / diff(index(x.xts))

#Generate a daily time series for the dates
dummy_dates <- seq(from=index(x.xts)[1], to=tail(index(x.xts), 1), by="day")

#Combine daily series with observered daily rate
m.xts <- merge(daily_rate, dummy_dates)

#Interpolate the daily sales -- kind of evil because we "invent" data
m.xts.interpolate <- na.approx(m.xts)

#Convert to regular time series
m.ts <- ts(m.xts.interpolate, freq=365, start=c(2011, 336))
#Clean up dimnames in case of stl forecast (just an R thing when converting from dataframes)
dim(m.ts) <- NULL

#Fit TS to an ETS model (Rudely ignoring IrishStat's advice that it is a bad model, but this is just an example)
fit <- ets(m.ts)

#Forecast and Plot
plot(forecast(fit, h=30))

Plot yang dihasilkan adalah:

masukkan deskripsi gambar di sini

Kyle Brandt
sumber
Apakah Anda membaca respons saya "Kami telah menyelesaikan ini dengan mengonversi permintaan ke nilai dengan membagi permintaan aktual dengan jumlah hari dalam interval antara servis". Daripada mengasumsikan model seperti Anda, saya mengidentifikasi model yang bermanfaat. Perkiraan Anda eksplosif karena mereka percaya "tingkat anomali" baru-baru ini daripada menyesuaikannya.
IrishStat
2
@IrishStat: Ya, saya bahkan punya komentar dalam kode saya yang menunjukkan fakta bahwa Anda mengatakan itu adalah model yang buruk, saya hanya berpikir beberapa kode R dapat membantu orang dengan memberikan dasar untuk bereksperimen.
Kyle Brandt
1

Apa yang Anda miliki adalah "Masalah Permintaan Berselang". Kami telah memecahkan masalah ini dengan mengubah permintaan menjadi nilai dengan membagi permintaan aktual dengan jumlah hari dalam interval antara servis. Tingkat ini kemudian dapat dimodelkan sebagai Fungsi Transfer untuk memprediksi tingkat yang diberikan prediksi interval. Kurs yang diprediksi ini kemudian dapat dikonversi ke permintaan. Perawatan harus diambil untuk mendeteksi pergeseran struktural dalam laju melalui Intervensi Deteksi. Coba googling "Pendekatan pemodelan Permintaan Intermiten menggunakan metodologi fungsi Transfer". Sray sangat jelas dengan pendekatan model dugaan Croston atau Exponential Smoothing karena mereka cukup kurang.

ANALISIS TAMBAHAN:

Ketika saya memodelkan Rate sebagai fungsi Interval, saya mendapatkan yang berikut ini. Menggunakan prediksi INTERVAL menggunakan masa lalu persamaan ini kemudian dapat memprediksi tingkat, yang dapat digunakan untuk memprediksi permintaan. Model semacam ini memungkinkan struktur autoregresif dalam laju untuk dimasukkan serta memungkinkan untuk Pulsa, Pergeseran Level dan / atau Tren Waktu Lokal dalam laju.

      MODEL COMPONENT       LAG    COEFF     STANDARD      P       T        

# (BOP) NILAI NILAI KESALAHAN

 Differencing                  1                                            
1CONSTANT                          .295       .840E-01   .0246     3.51

SERI INPUT X1 INTERVAL

 Differencing                  1                                            
2Omega (input) -Factor #  1    0   .685E-01   .346E-01   .1193     1.98

SERI INPUT X2 I ~ P00002 12/03/11 PULSA

 Differencing                  1                                            
3Omega (input) -Factor #  2    0   1.43       .168       .0010     8.52

SERI INPUT X3 I ~ P00007 12/08/11 PULSA

 Differencing                  1                                            
4Omega (input) -Factor #  3    0  -.935       .168       .0051    -5.57

SERI INPUT X4 I ~ P00010 12/11/11 PULSE

 Differencing                  1                                            
5Omega (input) -Factor #  4    0   1.37       .260       .0062     5.27
IrishStat
sumber
1
Saya pikir ini sedikit salah memahami pertanyaan: dia tidak memiliki permintaan yang terputus-putus, dia telah mengamati permintaan yang terputus-putus , dan dia tampaknya senang menerima permintaan mendasar yang terus-menerus per hari. Memang pendekatan fungsi transfer tampaknya secara luas menjadi yang ia coba di sini, meskipun dengan asumsi linearitas, jendela 90 hari, dan tidak ada kovariat. FWIW mengurangi permintaan terhadap hari-hari (eksogen) sejak pembacaan terakhir memberikan sekitar 2,2 item yang diminta per hari, tetapi ketidakpastian yang tinggi di sekitar perkiraan itu.
conjugateprior
@ConjugatePrior Dia tidak dapat mengamati permintaan aktual per hari dan sampel pada interval yang jarang sehingga secara de facto setara dengan masalah permintaan intermiten. "Kurs" -nya dapat dikarakteristikkan sebagai jalan acak dengan 3 pengecualian (pulsa) pada 12/16; 2 / 02; 2/27. Ide kami di sini adalah untuk memodelkan laju sebagai fungsi dari interval, kemudian memprediksi interval dan kemudian memprediksi permintaan. Anda tampaknya telah memodelkan permintaan sebagai fungsi dari interval yang memperoleh tingkat rata-rata sederhana yang dalam hal ini sangat / merugikan dipengaruhi oleh 3 titik data anomol & tidak mencerminkan struktur autoregresif.
IrishStat
2
Tentunya itu tidak dapat berjalan secara acak karena penjualan hanya dapat naik atau tetap sama (stok yang setara hanya dapat menurun atau tetap pada tingkat yang sama) - sesuatu yang lebih seperti proses pembaruan. Juga saya tidak yakin bagaimana Anda mengetahui bahwa 3 poin adalah outlier. (BTW 'analisis' yang saya sarankan hanyalah versi umum dari dirinya sendiri, dengan asumsi linearitas yang tidak berkelanjutan, jadi saya pribadi tidak akan puas dengan itu.)
conjugateprior
@ConjugatePrior Kurs sebagai fungsi interval menunjukkan bahwa kurs sangat bergantung pada kurs sebelumnya dan juga dipengaruhi oleh tiga "kurs tidak biasa". Tidak ada pergeseran level yang diidentifikasi. Apa yang seharusnya saya katakan adalah bahwa laju adalah jalan acak tanpa konstanta sehingga tidak ada tren yang terlihat.
IrishStat
1
@IrishStat Terima kasih banyak atas jawabannya. Saya akan membaca tentang Permintaan Intermittent menggunakan fungsi Transfer. Satu koreksi kecil: Kami tidak harus memprediksi INTERVAL. Kami harus memutuskan kapan harus mengunjungi mesin berdasarkan prediksi tarif. Misalnya, satu aturan bisnis mungkin "kunjungi mesin saat 60% kosong"
Ivan Dimitrov