見出し画像

はじめまして!!風速 千早です!データサイエンスのポートフォリオを作成しました!

こんにちは! 風速 千早(かぜはや ちはや)です。
みなさん初めましてですね。
今日が初投稿になります。
今回は、架空の売上データを分析していこうと思います。
不慣れなところが多く現れてしまうでしょうが、気軽に読んでいただけると嬉しいです。
それでは、始めたいと思います。


売上データを棒ぐらふで可視化する

まず初めに今回使う、架空の売上データを添付しておきます。

このデータをGoogle Colabolatoryを用いて可視化していきます。
コードは次のようになります。

import numpy as np
import pandas as pd
import matplotlib
import matplotlib.pyplot as plt
import matplotlib.ticker as ptick
import statsmodels.api as sm
from google.colab import files
uploaded=files.upload()

df_uriagedata = pd.read_csv('demodata2.csv',
                          skiprows=0,
                          header=[0])
df_uriagedata.plot.bar()
plt.title("amount data")
plt.xlabel("month")
plt.ylabel("amount")
yaxis = plt.gca().get_yaxis()
yaxis.set_major_formatter(ptick.ScalarFormatter(useMathText=True,))

このコードを実行した際に出来上がるグラフは次のようになります。

月別売上データ

このグラフでは、横軸に月を縦軸に売上をとり、棒グラフで可視化しました。
横軸は0から59ヶ月分なので5年分のデータになります。
縦軸は分かりにくい表記ですが、1.0×10^7が1,000万円なので多く売り上げた時でおよそ1,000万円くらいの売り上げだと思ってください。

売上データの折れ線グラフと移動平均線

次に、このグラフを折線グラフに直し、同時に移動平均線を取っていきたいと思います。移動平均線をとることで、長期的なトレンドを見ることができます。
それでは、このコードを書き表してみると、

df_sales = pd.read_csv('demodata2.csv',
                       skiprows=0,
                       header=[0])
df_ma=df_sales.amount.rolling(window=12).mean().shift(-6)
df_cma = df_ma.rolling(window=2).mean()
df_sales.amount.plot()
df_cma.plot()
yaxis = plt.gca().get_yaxis()
yaxis.set_major_formatter(ptick.ScalarFormatter(useMathText=True,))

このようなコードになります。
このコードによって、得られるグラフは、

月別売り上げデータと移動平均線

このようになります。このオレンジ色の線が移動平均線になります。グラフを見る限り、この店舗は上昇トレンドにあり年々少しずつ売上を伸ばしていますね。

繁盛期と閑散期の可視化

さて次は、可視化されたグラフから、どの月が売り上げが多く、どの月が売り上げが少ないのかをみていきましょう。
コードは、次のようになります。

df_sales_div_cma = df_sales.amount/df_cma
sales_div_cma = df_sales_div_cma.values
season_index = np.zeros(12)
counter = np.zeros(12)
for i in range(len(sales_div_cma)):
    if(pd.notnull(sales_div_cma[i])):
        season_index[i%12] +=sales_div_cma[i]
        counter[i%12] += 1
season_index /= counter
season_index = season_index / season_index.sum() * 1200
x = pd.Series(
    season_index, index=["4", "5", "6", "7", "8", "9", 
"10", "11", "12", "1", "2", "3"]
)
plt.plot(x, label="seasonal index")
plt.legend()
plt.hlines(100,"4","3",
           color="r",
           linestyle=":")
plt.xlabel("month")
plt.ylabel("100=Average")
plt.show()

このコードで得られる、グラフは次のようになります。

繁盛期と閑散期の可視化グラフ

100のところに点線を入れました。この線が、全体の売上に対して平均を表すラインになります。
このグラフから、4、5、6、7月が繁盛期であり、8月以降が閑散期ということになります。
マーケティングの視点で見れば、v字型に変化している5月、11月、12月あたりの売り上げを改善できれば、この店舗はさらに良くなるのではないでしょうか?

SARIMAモデルを用いた売上予測

最後に、SARIMAモデルを用いて、この店舗の今後の売り上げ予測をしていきたいと思います。
それでは、コードを書いていきます。

df_sales.amount = df_sales.amount.astype('float64')
df_sales.time = pd.to_datetime(df_sales.time)
y = pd.Series(df_sales["amount"].values,index=df_sales['time'])
y = y.astype('f')
train_data = y[y.index < "2019-06"]
result = sm.tsa.SARIMAX(
    train_data,
    order=(2, 1, 3),
    seasonal_order=(1, 1, 1, 12),
    enforce_stationarity=False,
    enforce_invertibility=False,
).fit()
pred = result.predict('2019-06-01', '2022-05-01')
plt.plot(y,label="observation")
plt.plot(pred,"--",label="pred")
yaxis = plt.gca().get_yaxis()
yaxis.set_major_formatter(ptick.ScalarFormatter(useMathText=True,))
plt.title("prediction data")
plt.xlabel("year")
plt.ylabel("amount")
plt.legend()

このコードで得られるグラフは

売り上げ予測データ

このようになります。青色の線が元のデータを折線グラフにしたもので、オレンジ色の点線がデータを基にして得られた売り上げ予測の折線グラフです。
2019年から2020年を元データと予測データを重ねました。これは2つのグラフの差を見るためです。大きくそれた予測をしていないことがこれで分かると思います。

まとめ

最後まで、ご拝読いただきありがとうございます。
今日が初の投稿になり少し難しいチャレンジでしたが、なんとか書き終えることができました。まだまだポートフォリオとしては荒削りな投稿だと思いますので、これから先もっと上手くそして分かりやすいポートフォリオを作成できるようにしていきたいと思います。

最後になりますが、フォローをしてもらえたり、スキを押してもらえると嬉しいです。分かりにくかったところ、もっと詳しく教えてほしいこと等がありましたらコメントいただけると返信します。

今後の投稿について

週末に一本のずつポートフォリオを上げられるように準備していきたいと思います。平日は時間がないので、データサイエンスで使う用語や数学の解説をメインに投稿できればと思います。



#データサイエンティスト#データサイエンス#データエンジニア
#データアナリシス#機械学習#ポートフォリオ#初投稿

この記事が気に入ったらサポートをしてみませんか?