TPTブログ

テックポート株式会社のブログです。 技術情報や製品・サービス情報、 また未経験社員がデータサイエンティストを 目指す奮闘記など、更新していきます。

お弁当の需要予測3

f:id:tbtech:20190822170222p:plain
前回に続き、SIGNATEの「お弁当の需要予測」をやっていきます。
ds-blog.tbtech.co.jp

前回はチュートリアルで紹介されているコードを実装してみましたが、
課題が残っていましたので、そちらに取り組みたいと思います!

考察1

前回のチュートリアルの結果を見てみます。
f:id:tbtech:20190809130626p:plain
上に飛び出た日はかなり予測できていますが、小さく上に凸した日
売り上げが下がった日は殆ど予測できていませんでした。

その原因は何だったのでしょうか?

まずは、前回学習に使った変数を確認します。

cols = ["precipitation","weather","days","fun","curry"]

この5つの説明変数が使われました。

売り上げyとの関係を示すために使った箱ひげ図も見てみます。
f:id:tbtech:20190808142811p:plain

これを見て「week」も少なからず「y」に関連があるように思いました。
なので説明変数に「week」を追加します!

再学習1

変更点

コードの変更点はcolという変数にカラム名を指定する箇所のみです。
trainとtestでそれぞれ指定しますので2箇所変更しました。

cols = ["precipitation","weather","days","fun","curry","week","y"]
cols = ["precipitation","weather","days","fun","curry","week","y","t"]

結果1

では学習結果を見てみましょう!
f:id:tbtech:20190822152519p:plain
RMSE(平均平方二乗誤差)は7.986→7.066に下がりました!(低いほど良い)
グラフは、小さく上に凸の部分が先程に比べ予測できているようです。

考察2

続いて売り上げが下がる日について考えます。
グラフを見ると、売り上げが60を下回る日は予測できていないようです。

そこで売り上げが60以下の日のデータを抽出し、lowというDataFrameを作ります。

low=dat[dat.y < 60]

抽出した売り上げの低い日の分布が、周期的なのかそうでないのかを確認します。
分布の確認にはlowのindex値をy軸に取ります。
[1]グラフのx軸用の変数として、lowの長さと同じ連番の数を用意します。
 始まりの数がindexと同じ1になるように+1をします。
[2]lowのindexをy軸に取り、グラフに表示します。

x_index=np.array(range(len(low)))+1
plt.plot(x_index,low.index)

f:id:tbtech:20190822154555p:plain
グラフを見てみると、傾きがおおよそ一定になっているようなので
売り上げが低い日は、周期的に発生しているようです。

そこでデータに新たに「low」という変数を作り、売り上げが60以下の日に1を
それ以外の日は0を入れていき、周期的に発生する変数を作成します。

再学習2

変更点2

変更点は変数「low」を新たに追加する点と、
先程の変更と同様に、使用する変数に「low」というカラム名を追加する点です。

dat["low"] = dat["y"].apply(lambda x: 1 if x < 60 else 0)
cols = ["precipitation","weather","days","fun","curry","week","low","y"]
cols = ["precipitation","weather","days","fun","curry","week","low","y","t"]

結果2

では学習結果を見ていきます!
f:id:tbtech:20190822155810p:plain
RMSEは7.066→5.034に下がりました!!
グラフを見てみると、下に凸の部分が以前に比べかなり予測できています。

投稿し直し

以前の記事と同様にtestデータで予測した結果を投稿します!
前回の結果は,,,
61.17656でした。
f:id:tbtech:20190701002702p:plain

そして今回の結果は,,,
11.87758でした!
順位は2736位→225位に上がりました!!
f:id:tbtech:20190823135502p:plain

チュートリアルさまさまです(≧∇≦*)

次回は更に改善をしてもっと精度を上げるよう頑張ります!!