アイスクリームの季節を考慮した売上予測
はじめに
この半年間でデータ分析を学習しました。
そこで学んだ技術を使って、商品の売り上げ予測して、その分析結果をまとめてみました。
解決したい社会課題
テーマは「アイスクリーム」。
アイスクリームは夏の食べ物と思われがちですが、「冬に食べるアイスクリームも美味しい」ということで好んで冬に食べる人も多いと聞きます。
売上データを分析して売上予測をして、本当に冬にもアイスクリームをたくさん入荷して販売しても大丈夫なのかを確かめてみたいと考えました。
実行環境
パソコン:MacBook Pro
開発環境:Google Coraboratory
言語:Python
ライブラリ:Matplotlib、pystan、fbprophet、plotly、pandas、numpy、seaborn
分析するデータ
以下の月次の売上データをもとに分析をします。
年月 | 売上 |
---|---|
2018-01 | 621.3 |
2018-02 | 448.5 |
2018-03 | 624 |
2018-04 | 767 |
2018-05 | 1206.4 |
2018-06 | 1162.2 |
2018-07 | 1,634 |
2018-08 | 1,799 |
2018-09 | 998.4 |
2018-10 | 813.9 |
2018-11 | 621.4 |
2018-12 | 754 |
2019-01 | 653.976 |
2019-02 | 479.973 |
2019-03 | 596.037 |
2019-04 | 745.953 |
2019-05 | 1076.01 |
2019-06 | 1067.547 |
2019-07 | 1,562 |
2019-08 | 1,677 |
2019-09 | 1019.187 |
2019-10 | 778.689 |
2019-11 | 554.931 |
2019-12 | 679.458 |
2020-01 | 735.7 |
2020-02 | 496.6 |
2020-03 | 613.6 |
2020-04 | 811.2 |
2020-05 | 1189.5 |
2020-06 | 1188.2 |
2020-07 | 1,812 |
2020-08 | 1,781 |
2020-09 | 1073.8 |
2020-10 | 808.7 |
2020-11 | 635.7 |
2020-12 | 744.9 |
2021-01 | 759.1 |
2021-02 | 540.8 |
2021-03 | 789.1 |
2021-04 | 969.8 |
2021-05 | 1162.2 |
2021-06 | 1,327 |
2021-07 | 1,958 |
2021-08 | 1,876 |
2021-09 | 1119.3 |
2021-10 | 862 |
2021-11 | 639.6 |
2021-12 | 698.1 |
2022-01 | 742.2 |
2022-02 | 549.9 |
2022-03 | 704.6 |
2022-04 | 867.1 |
2022-05 | 1,300 |
2022-06 | 1288.3 |
2022-07 | 1,607 |
2022-08 | 1,967 |
分析の流れ
- ライブラリのインポート
- 売上の時系列データの確認
- 直近の売上予測
- 時系列データよりトレンドの確認
ライブラリのインポート
利用するライブラリとして、以下のものをインストールする。
ライブラリのインストール
# 日本語化ライブラリ導入
!pip install japanize-matplotlib | tail -n 1
!pip install pystan~=2.14
!pip install fbprophet
!pip install plotly
ライブラリのインポート
# 必要ライブラリのimport
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from fbprophet.plot import plot_plotly
import plotly.offline as py
import seaborn as sns
# matplotlib日本語化対応
import japanize_matplotlib
# グラフのデフォルトフォント指定
plt.rcParams["font.size"] = 14
# matplotlib日本語化対応
import japanize_matplotlib
# グラフのデフォルトフォント指定
plt.rcParams["font.size"] = 14
売上の時系列データの確認
実行したコード
# Excelデータ読み込み
from google.colab import drive
# drive.mount('/content/drive')
url = '/content/drive/MyDrive/最終課題3.xlsx'
df = pd.read_excel(url, sheet_name=0)
# データ確認
display(df.head())
display(df.tail())
実行結果
エクセルのデータを読み込んで中身を確認。
実行したコード
# 時系列グラフの描画
fig, ax = plt.subplots(figsize=(12, 4))
# グラフ描画
ax.plot(df['年月'], df['売上'],c='b')
# 3か月区切りの目盛にする
month3 = mdates.MonthLocator(interval=3)
ax.xaxis.set_major_locator(month3)
# 日付表記を90度回転
ax.tick_params(axis='x', rotation=90)
# 開始日と終了日
sday = pd.to_datetime('2018-1-1')
eday = pd.to_datetime('2022-9-1')
ax.set_xlim(sday, eday)
# 方眼表示など
ax.grid()
ax.set_title('売上')
# 画面出力
plt.show()
可視化したデータ
可視化したデータから得られた情報
売上に周期性があることがわかった。
夏は売上が高く、冬は売り上げが低い。
売上の予測
実行したコード
# データ形式をProphet用に合わせる
x = df.copy()
# 列名の変更
data = x.reset_index().rename(columns={'年月': 'ds', '売上': 'y'})
# アルゴリズムの選択
from fbprophet import Prophet
# 学習データに基づいて未来を予測
m = Prophet()
m.fit(data)
#予測する日付を指定
future = m.make_future_dataframe(60)
forecast = m.predict(future)
# 2カ月後までの売上予測結果
fig1 = plot_plotly(m, forecast)
py.iplot(fig1)
データを可視化
可視化したデータから得られた情報
売上予測した2022年9月、10月は売上が下がる予測。
例年通りの予測。
時系列データよりトレンドを確認
実行したコード
# トレンド性と周期性の抽出
m.plot_components(forecast)
plt.show()
可視化したデータ
分析したデータから得られた情報
トレンドとして以下のことがわかった
- 全体的に売上は上昇傾向
- 年周期では6~9月に売上が高くなっている傾向
実行したコード
df_changepoints = data.loc[m.changepoints.index]
df_changepoints['delta'] = m.params['delta'].ravel()
df_changepoints['ds'] = df_changepoints['ds'].astype(str)
df_changepoints['delta'] = df_changepoints['delta'].round(2)
df_selection = df_changepoints[df_changepoints['delta'] != 0]
date_changepoints = df_selection['ds'].astype('datetime64[ns]').reset_index(drop=True)
トレンド変化点抽出
# グラフ
sns.set(style='whitegrid')
ax = sns.catplot(x='ds', y='delta', data=df_changepoints, kind='bar', color='skyblue', height=4, aspect=2)
ax.set_xticklabels(rotation=90)
plt.title('Change Points')
plt.show()
可視化したデータ
分析したデータから得られた情報
トレンドの変化は以下の時期におきたことが分析できた
- 2019年6月
- 2019年8月
- 2021年6月
この時期に「アイスクリームのイベント」などで売上が変わるようなことがあったと考えられる
実行したコード
# 売上予測グラフに変化点を追加
figure = m.plot(forecast)
for dt in date_changepoints:
plt.axvline(dt,ls='--', lw=1)
plt.show()
print(df_selection)
可視化したデータ
トレンドの位置も売上予測に組み込み可視化した
考察
「冬に食べるアイスは美味しいので、たくさん入荷すればたくさん売れる」という仮説のもと、実際に過去の売上の時系列データをもとに分析をしました。
分析した結果、以下のことがわかった。
- 売上は月毎に周期性があり、暑い6〜9月は売り上げが増える
- 寒い1月~3月は例年売り上げが下がるという傾向にある
- 売り上げ全体としては2018年から季節を問わず若干の上昇傾向にある
この結果から、何の販売戦略もなく冬にアイスを大量入荷して売り出すことは避けた方が良いと考えられます。
課題
データの分析結果から、「冬に食べるアイスは美味しい」ことが事実であったとしても、それが要因で売り上げが上がるということはなさそう。
前向きに捉えると、冬にアイスを好んで食べる人が一定数いることから、冬に販売するアイスにはまだ伸び代があるとも受け取れる。
冬にアイスを売るための広告・宣伝・イベントなど販促活動をする必要がある。
過去のトレンド変換した時期のイベントなどを調査して今後の冬の活動に繋がる。
また、冬向けアイスクリームとしての商品企画・商品開発も必要であると考えられます。
まとめ
- アイスはやっぱり夏に売れる
- 売上全体としては上昇傾向
- 好んで冬に食べる人向けには販促、商品開発を別途実施する必要がある
Discussion