適正在庫管理は需要予測ができれば簡単です。極端にいえば、需要予測が100%の精度でできれば安全在庫はゼロになります。発注してから納品されるまでのリードタイム分だけの在庫を持っておけば良いことになります。適正在庫を維持するための発注数の決め方をわかりやすく【定期発注方式の場合】そのため需要予測は重要なのですが、一番簡単な方法は直近データの平均を使うことです。上記の記事で解説した方法は、これに基づいています。需要変動は予測不能だけれども、平均を中心に対称的にばらつくでしょうという考え方です。需要変動には予測可能な要素も含まれています。コーラは夏に、カイロは冬に多く売れるという季節変動はその一種です。短期的には、週末は出荷が少ないけれども、金曜日や月曜日にその分多くなるといったような曜日変動もあるかもしれません。一つは長期トレンドです。成長期にある商品は毎月少しずつ出荷が増えるでしょうし、衰退期にある商品はその逆かもしれません。このように予測可能な要素を元に需要予測をすれば、平均よりも精度の高い予測ができそうです。本記事では、生の需要データからこれら予測可能な要素を分離することを、Pythonを使って行ってみました。周期/トレンド/残差を可視化する◆仕事や勉強の息抜きに。需要データをデータフレームに読み込む560アイテムについて取得した6ヶ月間の日々の出荷データをデータフレームraw_dfに読み込みます。日付データを日付型に変換raw_df今回はこの中のS00239のアイテムについて分析することにします。data_df.set_index('Date')data_dfグラフにすると次のようになります。5))plt.plot(data_df)plt.show()自己相関(コレログラム)を見てみるまずは自己相関を調べてみます。自己相関とは元データと時間をずらしたデータとの相関のことです。カイロの毎月の売上データを2年間とったら、1年目と2年目のグラフは似たような形になることが予想できます。この場合、元データと12ヶ月ずらしたデータは相関が高くなります。この相関が自己相関です。詳しくはこちらのサイトでわかりやすく解説されています。自己相関を調べるにはコレログラムを作るとよくわかります。このS00239の需要データでコレログラムを作ってみましょう。これはStatsmodelsのplot_acfを使うことによって簡単にできます。plot_acf(data_df.S00239)このグラフの横軸はずらす時間を示しています。グラフを見ると、横軸7に対する縦軸の値が0.5になっています。これから、7日ずらした時系列のデータと元の時系列データとの相関が0.5と高くなっていることがわかります。14日ずらしたデータと21日ずらしたデータも、元のデータとの相関が高くなっていることがわかります。1週間ごとに似たような需要データになっていることがこれで示されます。次に偏自己相関を見てみます。自己相関では7の倍数日で相関が高くなっていましたが、1週周期に意味はありますが、2週とか3週周期に意味はありません。1週周期が2つ、3つ重なった結果、2週間後や3週間後に似たようなデータが現れているだけです。このような場合、偏自己相関では本当に意味のある1週周期だけを取り出すことができます。plot_pacf(data_df.S00239)周期/トレンド/残差に分解する時系列データは周期変動、長期トレンド、残差に分解できます。最初に周期変動を取り出します。先のコレログラムにより1週間の周期変動があることがわかったので、各曜日ごとにデータの平均を取ってみます。下図の例では、日曜日の需要データの平均は354、月曜日の平均は480、、、となっています。これを周期変動係数とします。次に、元データを周期変動係数で割れば、それが周期変動調整後の値になります。調整前と調整後のデータを曜日別に集計してグラフにすると、次のように曜日の影響が取り除かれていることがわかります。次に、周期変動調整後のデータの移動平均を取ることによってトレンド係数が求まります。周期変動調整後のデータをトレンド係数で割ることにより、トレンド調整後のデータが得られます。このトレンド調整後のデータを元データで割ると、残りが残差です。このように周期変動/長期トレンド/残差を分解する方法を移動平均法を利用した乗法モデルによる分解といいます。元データ=周期変動✕長期トレンド✕残差のように掛け算の形で分解していることになります。同様に移動平均法を利用した加法モデルによる分解方法もあります。これは元データ=周期変動+長期トレンド+残差のように足し算の形で分解します。STL分解というノンパラメトリック回帰モデルを利用した分解方法もあります。周期/トレンド/残差を可視化するこれら3つの分解方法はPythonのstatsmodelライブラリーのseasonal_decomposeにすべてカバーされています。移動平均法を利用した乗法モデルによる分解を実行してみます。period=7)mul_output.plot()plt.show()4つのグラフが表示されますが、一番上から元データ、長期トレンド、周期変動、残差になっています。長期トレンドはギザギザになっていますが、年末にかけて増加、年明けから減少しているトレンドがなんとなく読み取れます。周期変動は1週間単位での周期が明確に読み取れます。残差は1を中心にほぼ均等に分散していることがわかります。次に移動平均法を利用した加法モデルによる分解を行ってみます。period=7)add_output.plot()plt.show()先程の乗法モデルの場合とほぼ同じ結果ですが、残差は0近辺に均等に散らばっている点が異なります。次にSTL分解を実行してみましょう。robust=True).fit()stl_output.plot()plt.show()今度は長期トレンドが滑らかになって、わかりやすくなりました。周期変動もはっきり現れていて、残差の散らばり具合も0近辺のデータ密度が高くなっていて、一番よく分解されているようです。最後に、4つのグラフを重ねてSTL分解の結果を表示してみましょう。'Residuals')plt.legend()plt.show()3つの成分に分解される様子を同じスケールで表示することができました。...Simpyを使ってM/M/Cモデルの待ち行列をシミュレーションしてみた待ち時間はサービス窓口を増やせば短くなりますが、その分コストは上がります。...【Pythonで需要予測2】SARIMAモデルの自動構築で出荷数量を予測してみた前回は重回帰分析を使って、物流センターからの出荷数量の需要予測を行いました。...◆キーワードで探すイチローの安打数がポアソン分布にならず正規分布になる理由を考察してみた【マルコフ連鎖】標準体重の人が太りすぎになるまで平均何年かかる?待ち行列理論を応用して10分カットが儲かる仕組みを解明してみた。計算グラフモンテカルロ積分クラスタリングカーネルトリックPythonSimPy(離散事象シミュレーション)inventorize(在庫シミュレーション)SARIMAX(時系列解析)investpy(財務データ取得)PyPDF2(PDF操作)仕事や勉強の合間の息抜きに管理人ロジギークロジスティクス業界で6か国に勤務。