難易度:★☆☆☆☆
スーパーやデパートなどの食品売り場では、売上を最大化しつつも廃棄ロスを最小化することが大きな課題となります。準備した食品の数が少なければ販売機会ロスとなります。逆に多すぎて売り残れば廃棄せざるを得ません。食品の正確な需要予測ができれば、売上の向上と廃棄ロスの削減を両立させることができます。そこで本Questではこの課題への取り組みの1つとして、実際の食品販売データを使って食品の需要予測、すなわち食品販売数を予測するモデル作成に挑戦します。Questを通じて、仮説に基づくデータ分析の進め方や、予測モデルを作る前のデータの加工方法、そして重回帰モデルの使い方と精度改善の仕方を学びます。
※ 当Questが題材としているデータセットは、こちらの練習問題ページからダウンロードすることができます。(https://signate.jp/competitions/24)
千代田区のある会社では、お昼になるとお腹を空かした社員たちが続々とカフェフロアに集まってきます。彼らの目的は『お弁当』。午後の業務を遂行するためにも、お昼のエネルギー補充は欠かせません。平均年齢30歳の社員たちにとってのランチタイムは、財布、胃袋、時間、そして己の味覚との相談の時でもあります。
「財布に優しく、お昼は安く」「ランチに外に行く時間すら惜しい」「今日は好物のカレーだ。お弁当にしよう」
さまざまな思いが交錯するなか、お弁当はひとつ、またひとつと売れていきます。しかし、売れ残るお弁当もチラホラ。社員の胃袋に収まらなかった売れ残りのお弁当から漂う哀愁は、環境にも、そしてお弁当屋さんの懐にも優しくありません。
売り切れた場合も同様。「ひょっとしたら、もっと売れたかもしれない……」売り切れは、お弁当屋さんにとっては機会損失、カフェフロアまで来た社員にとっては時間損失となります。
弁当の売上向上・廃棄削減のためには、正確な需要予測に基づき生産計画を立てる必要があります。そこで、最適な弁当の生産量を推測するため、曜日やメニュー等の複数の変数から弁当の販売量を予測するモデルを作成します。
Mission 1
弁当の販売量を予測するモデルを作るため、カフェフロアの弁当販売店から過去の販売実績データを入手しました。店員さんによると、販売数量のデータだけでなく、予測に役立ちそうな付加情報も足してくれたそうです。どのような情報が含まれているのでしょうか?データをプログラムで読み込んで確認してみましょう。本ミッションでは、分析の第一歩として重要なデータの読み込み方を学びます。また読み込んだデータが正しく読み込めたことを確認することも大切になりますので、確認の方法についても学んでいきます。
データ分析を始めるにあたって、まずはPython上で扱えるようにデータを取り込まなくてはなりません。
このタスクでは、ライブラリのimport方法と、データ分析のための様々なツールが用意されているライブラリ`pandas`を使ったcsvデータの読み込み方法を学びます。
`DataFrame`形式で読み込むことで、各種データについて様々な処理を行う準備ができました。
このタスクでは、読み込んだデータについて中身を確認したり、その大きさを調べる方法を学びます。
現実のデータには、欠損値や異常値を含むものが多くあります。
ここではデータ分析を進める上で注意点となる欠損値や異常値の有無を確認する方法を学びます。
Mission 2
データを読み込んで確認したところ、販売数量の他にメニューや社内イベントの有無、天気の情報などが含まれていました。これらの要素は弁当の販売数に影響するのでしょうか?影響するのであれば予測に有効な情報となるので、調べてみましょう。本ミッションでは、分析の醍醐味の1つである探索的分析について学びます。データ分析ではデータの分布や数値等からデータの特徴を抽出し、それに基づき仮説を立てたり仮説の検証を行います。基本統計量や可視化の方法論についても学んでいきましょう。
このタスクではデータに含まれる各変数について、基本統計量を確認したりヒストグラムを描画することで、その分布の特徴を知る方法を学びます。
良い分析を行うにあたって、データの特徴を知ることは不可欠です。このタスクを通してその基本的な方法を学び、未知のデータに対しても活用できるようになりましょう。
ここまでは1つの変数について、その特徴を分析してきました。今度は複数の変数の関係性について見ていきましょう。
データ分析においては、変数間の関係性を明らかにすることは大変重要です。なぜなら、変数間の関係性は、データの解釈や仮説作りを検討する上で、重要な情報を提供してくれるからです。変数間の関係性を見る1つの方法として、変数間の相関関係を確認する方法があります。例えば、予測モデルを作る際には、予測したいデータに対して、有力な手掛かりになるデータを見つけ出すことが大切ですが、これは2変数間の相関係数を算出することである程度、指針を立てることができます。一方で、相関係数が低ければ、手掛かりになり得ないということで、除外して分析を進めることもできます。
ここまでグラフを用いた分析で仮説を検証してきました。
いくつか得られた「気づき」について、より理解を深めるため個々のデータをもっと細かく見ていきましょう。
Mission 3
弁当の販売数に影響する要素がわかったので、次にモデル作成の前の準備作業を実施しましょう。本ミッションではデータ前処理について学びます。ここでの前処理とはモデリングのための前処理についてです。適切な前処理をすることで、モデリングの精度を上げることができます。前処理の種類や、方法にどのようなものがあるのか学んでいきましょう。
「ある事柄を説明するためには、必要以上に多くを仮定するべきでない」という指針を「オッカムの剃刀」と言います。これまでの分析結果をもとに、有効そうな変数のみを特徴量として選択しましょう。
これまでの分析では、「仮説5:お楽しみメニュー」・「仮説2:気温」・「仮説8:天気」が重要な変数のようでした。販売数は減少傾向であったことから、日付も効果的な要素となるかもしれません。
また機械学習モデルに学習データを投入するためには、いくつかの変数について値の変換が必要です。ここではテキストデータを数値化したり、カテゴリー変数をダミー変数化します。
Mission 4
弁当の販売数に影響する要素がわかり、データの前処理もできました。いよいよ予測モデルを作る段階です。本ミッションではモデリング手法の1つ、重回帰モデルについて学びます。モデルを作成することで、過去の実績から将来の値を予測することができるようになります。具体的なモデルの作り方や作ったモデルの正しい評価方法について学んでいきましょう。
このタスクでは機械学習モデルの初期設定と、評価関数の定義をします。機械学習モデルは重回帰モデルを選択し、評価関数は連続値の評価でよく利用されるRMSE(Root Mean Squared Error)を利用します。
機械学習モデル(重回帰)と評価関数の準備が整いました。次は、仮説に基づいて選んだ「お楽しみメニュー」「気温」「天気」を説明変数として、重回帰モデルの学習を行いましょう。
重回帰モデルの学習と予測値の算出ができました。次は予測値を自作関数RMSEを用いて評価してみましょう。またグラフを描いて、予測結果を可視化して見てみましょう。
Mission 5
ついに弁当の販売数を予測する重回帰モデルが作れましたが、その精度はとても満足のいくものではありませんでした。もっと精度を上げることはできないでしょうか?手がかりは…やはりデータにあります。本ミッションでは、作成したモデルの予測精度をより改善する為の方法について学びます。作ったモデルの傾向や説明変数を選定・拡充することで、より良い予測モデル作成に挑戦しましょう。
モデリングの改善プロセスでは特徴量に工夫を凝らすことが多いですが、ここではまず販売数の推移に立ち返ってみます。分析の初期に描いた折れ線グラフを思い出しましょう。
さらなる改善のために、今度は特徴量に工夫を凝らしてみましょう。販売数の時間的経過を加味することを意図して、日付情報を追加します。
本Questでは、食品の需要予測として、弁当の販売数を予測する問題に挑戦しました。ただ予測モデルを作るだけでなく、予測モデルの精度を上げるために、販売数に影響しそうな要因を仮説を立てて検証し、予測精度を改善する試みも行いました。Questを通じて学んだこと、そしてQuestの成果をおさらいしましょう。
Competition
これまで学習したことを元に、SIGNATEの練習問題に挑戦してみましょう。このコンペでは、千代田区四番町のとある会社のカフェフロアで販売されているお弁当の販売数を予測するモデル作成にチャレンジします。
Competitionに挑戦する