不規則な間隔で集計されたデータに基づいて予測する方法は?


10

自動販売機での売上を予測してみます。問題は、マシンが不規則な間隔で充填されており、充填ごとに、マシンの最後の充填以降の総売上高しか記録できないことです(つまり、毎日の売上データはありません)。したがって、基本的には不定期に集計された売上のデータがあります。間隔は通常2日から3週間です。これは、1台の自動販売機と1つの製品のデータ例です。

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

現在の単純なアルゴリズムは、過去90日間に販売された合計数量を90で割ることにより、1日あたりの平均売上を計算することです。

1日あたりの売上予測を改善する方法はありますか?次回のマシン訪問時に何が販売されるかを予測する必要があります。データの性質を考慮して、ある種の指数平滑アルゴリズムを使用することは可能ですか?

前もって感謝します!

更新:すべての回答とコメントをありがとうございます。もう少しコンテキストを説明してみましょう(質問の背後にあるビジネスケース-もちろん非常に単純化されています)。私たちは何百もの自動販売機を持っています。毎日、補充のために訪れる20人を決定する必要があります。そのために、マシンの現在のステータスを予測し、「空の」20マシンを選択しようとしています。各マシンと製品について、上記の単純なアルゴリズムを使用して1日あたりの平均売上(SPD)を計算しています。次に、SPDにマシンの最後の充填からの日数を掛けます。結果は予測販売量です。


面白い質問だと思います。あなたの正確な質問とデータセットに対する私の答えは:それは重要ですか?そして:より多くのデータを取得します。また、自動販売機の容量を知っておくと便利だと思います。
Adam

@Adamこの製品の容量は50ボトルです。多分私の問題の説明は十分に明確ではありません。もっとコンテキストを与えるために少し編集してみます。基本的に私は一般的な問題を解決するためのアイデアを探しており、これまでのすべてのコメントにとても感謝しています。特定のデータセットは、データがどのように見えるかの例として与えられています。他の自動販売機の場合は、より長い期間データを提供できます。
Ivan Dimitrov

@IvanDimitrov:データの列2とは正確には何ですか?
カイル・ブラント

@KyleBrandt列2は、最後の自動販売機の訪問以降に販売されたボトルの数です。したがって、一番上の行にある48という数字は、48本のボトルが17/02〜27/02の間に販売されたことを意味します
Ivan Dimitrov

回答:


11

ビジネスの問題に焦点を当て、それに対処するための戦略を立て、その戦略を簡単な方法で実装し始めましょう。努力がそれを正当化するならば、後で、それは改善されることができます。

ビジネス上の問題はもちろん、利益を最大化することです。これは、補充機のコストと販売損失のコストのバランスをとることによって行われます。現在の定式化では、マシンの補充コストは固定されています。20は毎日補充できます。したがって、失われた販売のコストは、マシンが空になる頻度に依存します。

この問題の概念的な統計モデルは、以前のデータに基づいて、各マシンのコストを推定する方法を考案することによって取得できます。予想今日、マシンのサービスを行わない場合のコストは、マシンが実行される確率に、マシンが使用される率を掛けたものにほぼ等しくなります。たとえば、マシンが今日空になる可能性が25%あり、平均して1日あたり4本のボトルを販売している場合、その予想コストは、25%* 4 = 1本のボトルが失われた販売に相当します。(あなたがそうするようにそれをドルに換算してください、1つの販売が失われると無形の費用が発生することを忘れないでください:人々は空の機械を見たり、それに頼らないことを学んだりします。マシンはしばらく空の状態で動作し、無形のコストはほとんど発生しない場合があります。マシンを補充すると、予想される損失がすぐにゼロにリセットされると想定するのは公平です。マシンが毎日空になることはまれです(望まないことです)。 ..)。アズ・タイム・ゴーズ・バイ、

これらの線に沿った単純な統計モデルは、マシンの使用の変動がランダムに見えることを提案しています。これは、ポアソンモデルを示唆しています。具体的には、マシンにボトルの基本的な1日の販売率があり、期間日間に販売された数には、パラメーターポアソン分布があると仮定できます。(他のモデルは、販売のクラスターの可能性を処理するために定式化できます。これは、販売が個別で、断続的で、互いに独立していると想定しています。)X θ Xθxθx

この例では、観察された期間は 7、7、7、13、11、9、8、7、8、10で、対応する売上は 4、14、4、16、16、16)でした。可能性を最大化すると、ます。このマシンは、1日に約2本のボトルを販売しています。データ履歴は、より複雑なモデルが必要であることを示唆するほど長くはありません。これは、これまでに観察されたことの適切な説明です。Y = 4 14 4 16 16 12 7 16 24 48 θ = 1.8506x=(7,7,7,13,11,9,8,7,8,10)y=(4,14,4,16,16,12,7,16,24,48)θ^=1.8506

実際vs適合

赤い点は販売の順序を示しています。青い点は、一般的な販売率の最尤推定に基づく推定です。

t

時間の経過による損失

50/1.85=27

このようなグラフを各マシン(数百台あるようです)に指定すると、現在最大の予想損失が発生している20台のマシンを簡単に特定できます。それらのサービスを提供することがビジネス上の最適な決定です。 (各マシンには独自の推定速度があり、最後にサービスされた時期に応じて、曲線に沿って独自のポイントになることに注意してください。)実際にこれらのチャートを見る必要はありません。これに基づいてサービスするマシンを特定することは簡単ですシンプルなプログラムまたはスプレッドシートで自動化されます。

これは始まりにすぎない。時間の経過とともに、追加のデータがこの単純なモデルへの変更を示唆する可能性があります。週末や休日、またはその他の予想される売上への影響を考慮に入れる場合があります。毎週の周期または他の季節の周期があるかもしれません。予測に含める長期的な傾向があるかもしれません。マシンでの予期しない1回限りの実行を表す外れ値を追跡し、この可能性を損失の見積もりなどに組み込むことをお勧めします。ただし、売上のシリアル相関について多くを考慮する必要があるとは思えません。考えるのは難しいです。そのようなことを引き起こすあらゆるメカニズムの。

θ^=1.871.8506

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

Excelの場合(A2最後の補充からの時間を含むセルでThetaあり、1日の推定販売率です)および

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

Rの場合)

より洗練されたモデル(トレンド、サイクルなどを組み込んだもの)は、推定にポアソン回帰を使用する必要があります。

θ


1
私にとって、売上/イベントは互いに独立しているという仮定は、同じマシンで時間をかけて測定されたものであるため、非論理的であるように見えます。レベルが変化した可能性のある自動相関販売データをどのように処理しますか?ちょっと興味があるんだけど ?
IrishStat 2012年

1
私は、「自己相関」の可能性のある形式を評価し、処理するためのルートをスケッチしたと思います。たとえ定期的に間隔を置いたデータが利用できたとしても、従来の時系列分析ではそれらは明示されません。時間的相関は、週次や季節周期などの外部要因の相関から生じます。興味深い形式は、購入の一時的なクラスタリング(たとえば、昼食直後または週末)から発生します。「レベルの正味の変化」は、必要に応じてトレンドフィッティングで処理できますが、単純に移動平均を使用すると、自動的に処理されます。
whuber

4

通常、定期的な時系列に変換する最初のステップがあると思います。あなたは平均90日かかると言いました。あなたはそれより頻繁なデータを持っているので、各観察の間の日数を取り、それをその期間に販売されたアイテムの数で割ることによって、あなたが持っているもののほとんどを使用する方が理にかなっていると思います(それがあなたの2列目です)。

免責事項として私は完全に素人なので、次のコードについてIrishStatなどの専門家の助言を受けたいと思います(たとえば、ETSは悪いモデルなので、これはおもちゃの例としてのみ扱う)と期待しています。これにより時間を節約できます。ここでは、使用できるRコードをいくつか示します。

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))

結果のプロットは次のとおりです。

ここに画像の説明を入力してください


「実際の需要を整備間隔の日数で割ることにより需要を率に変換することでこれを解決しました」という私の回答を読んでください。私はあなたがモデルであると仮定するのではなく、有用なモデルを特定しました。あなたの予測は、それらを調整するのではなく、最近の「異常レート」を信じているので爆発的です。
IrishStat 2012年

2
@IrishStat:はい、私は自分のコードにコメントがあり、それが悪いモデルだとあなたが言ったという事実を指摘しています。いくつかのRコードが実験の基礎を与えることで人々を助けるかもしれないと思いました。
カイル・ブラント2012年

1

あなたが持っているのは「断続的な需要問題」です。これを解決するには、実際の需要を整備間隔の日数で割ることにより、需要を率に変換します。次に、このレートを伝達関数としてモデル化して、間隔の予測が与えられた場合のレートを予測できます。次に、この予測レートを需要に変換できます。介入検出を介してレートの構造的な変化を検出するように注意する必要があります。「伝達関数手法を使用した断続的な需要モデリングアプローチ」をググリングしてみてください。CrostonまたはExponential Smoothingのモデル推定アプローチは非常に不十分であるため、それらを非常に明確にします。

追加の分析:

間隔の関数としてレートをモデル化すると、次の結果が得られました。過去の式を使用してINTERVALの予測を使用すると、レートを予測できます。これを使用して需要を予測できます。この種のモデルでは、レートの自己回帰構造を組み込むことができ、パルス、レベルシフト、および/またはレートのローカルタイムトレンドを可能にします。

      MODEL COMPONENT       LAG    COEFF     STANDARD      P       T        

#(BOP)エラー値値

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

入力シリーズX1インターバル

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

入力シリーズX2 I〜P00002 12/03/11パルス

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

入力シリーズX3 I〜P00007 12/08/11パルス

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

入力シリーズX4 I〜P00010 12/11/11パルス

 Differencing                  1                                            
5Omega (input) -Factor #  4    0   1.37       .260       .0062     5.27

1
私はこれが質問を少し誤解していると思います:彼は断続的に需要を観察しましたが断続的な需要はありません、そして彼は1日あたり一定の根本的な需要を想定して喜んでいるようです。実際、伝達関数のアプローチは、線形性の仮定、90日間のウィンドウ、そして共変量がないにもかかわらず、彼がここで試みているアプローチのようです。FWIWは、最後の読み取り以降の(外因性)日数に対して需要を後退させて、1日あたり約2.2項目の需要を求めていますが、その見積もりには高い不確実性があります。
共役前の

@ConjugatePrior彼は実際の1日あたりの需要を観察することができず、まれな間隔でサンプリングするため、断続的な需要の問題と事実上同等です。彼の「レート」は、12/16; 2で3つの例外(パルス)を持つランダムウォークとして特徴付けることができます。 / 02; 2/27。ここでの考え方は、レートを間隔の関数としてモデル化し、次に間隔を予測して需要を予測することです。この場合、単純な平均レートを取得する間隔の関数として需要をモデル化しているように見えます。 3つの異常なデータポイントの影響を受け、自己回帰構造を反映していません。
IrishStat 2012年

2
確かに、売り上げは上昇するか、変わらない(株価は下落するか、同じレベルにとどまる)ため、ランダムな散歩にはなりません。これは、更新プロセスのようなものです。また、正確に3ポイントが外れ値であることをどのように理解したかわかりません。(ところで、私が提案した「分析」は彼自身の一般化されたバージョンであり、持続不可能な線形性の仮定があるため、私は個人的にはそれに満足しません。)
共役

@ConjugatePrior間隔の関数としての速度は、速度が以前の速度に強く依存しており、3つの「異常な速度」の影響を受けることも示しました。レベルシフトは確認されませんでした。私が言っておくべきだったのは、速度は定数のないランダムウォークであり、識別可能な傾向はないということです。
IrishStat

1
@IrishStat答えてくれてありがとう。転送機能を使用して断続的な需要について読みます。1つの小さな修正:区間を予測する必要はありません。レートの予測に基づいて、マシンをいつ訪問するかを決定する必要があります。たとえば、あるビジネスルールは、「60%が空のときにマシンにアクセスする」
Ivan Dimitrov
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.