新規求人数の季節変動分析、将来性の予測

# **はじめに** 
このブログはAidemy Premiumのカリキュラムの一環で、受講修了条件を満たすために公開しています。
プログラミングがデータ分析の講座を受講し、時系列分析を行い、その過程と結果を記載しています。


:::note
**概要**
この記事では新規求人数の季節変動分析と新規求人数の将来的な数の予測を行いました。
取り扱いデータは厚生労働省　東京労働局の産業別新規求人数の推移を参考としています。
[リンク](https://jsite.mhlw.go.jp/tokyo-roudoukyoku/jirei_toukei/shokugyou_shoukai/_122954/_122963.html)
:::
:::note
**時系列分析とは**
時系列分析は時間とともに変化するデータ（<font color="red">**時系列データ**</font>）をもとに長期的な傾向、周期的な変動、不規則な変動などの要素に、統計的な手法を用いて分解し、将来の値を予測するものです。
:::

# **時系列分析**
**1、原系列の視覚化**
原系列とは元の時系列データであり、時系列分析の一歩目としてその視覚化を行いました。
原系列の確認と折れ線グラフでの表示を行いました。

<INS>原系列の確認<INS>
```python
#求人数のデータのダウンロードと加工し、2017年1月～2023年12月までの新規求人数のデータを作成する。
import pandas as pd
df=pd.read_excel('/content/drive/MyDrive/求人数.xlsx')
df0=df.drop(range(0,3))
days=df0.iloc[:,0]
days = pd.to_datetime(days)
print(df0)
>>>
         年度    産業計
3   2017.01  82318
4   2017.02  82467
5   2017.03  82568
6   2017.04  75536
7   2017.05  73171
..      ...    ...
82  2023.08  68842
83  2023.09  70548
84  2023.10  75040
85  2023.11  67884
86  2023.12  70921
```
<INS>原系列のグラフ化
```python
#2017年1月～2023年12月の各求人数をグラフに起こし、原系列データの視覚化
import matplotlib.pyplot as plt
plt.plot(days,df0.iloc[:,1])
plt.title('jobs-to-applicants ratio')
```
![ダウンロード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3774294/8eb0c749-1db0-6a96-f49b-937a25d21f49.png)

**2、3つのパターンに分解**
原系列には3つのパターンが存在する。

:::note
**トレンド**
トレンドとはデータの長期的な傾向を意味します。時間の経過とともにデータの値が上昇していたり下降していたりする時系列データは<font color='red'>**トレンドがある**</font>といい、値が上昇している場合には <font color='red'>**正のトレンド**</font> 下降している場合には<font color='red'>**負のトレンド**</font>があると言います。
:::

:::note
・周期変動
周期変動があるデータは時間の経過に伴ってデータの値が上昇と下降を繰り返します。特に1年間での周期変動を<font color='red'>**季節変動**</font> といいます。
:::

:::note
・不規則変動
不規則変動は時間の経過と関係なくデータの値が変動することをいいます。
:::

<INS>3つのパターンに分解
```python
#原系列データをトレンド、季節変動 、不規則変動に分ける
import statsmodels.api as sm
fig = sm.tsa.seasonal_decompose(df0.iloc[:,1], period=12).plot()
```
![ダウンロード (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3774294/dbfee8ca-a65d-0acd-a3f0-c7a75229ea6f.png)


**予測モデル**
時系列予測の代表的なモデル

:::note
・**MAモデル(移動平均モデル)**
MAモデルは過去の平均値と過去の誤差に影響されるモデルです。
:::

:::note
・**ARモデル(自己回帰モデル)**
現在の値は過去の値からのみ影響を受けるという考え方のモデルです。
:::

:::note
・**ARMAモデル(自己回帰和分移動平均モデル)**
互いに競合する性質がないMAモデルとARモデルを組み合わせて定式化したものです。
:::

:::note
・**ARIMAモデル(自己回帰和分移動平均モデル)**
ARMAモデルから長期変動要因（トレンド要因）を別で予測したもです。ARMAモデルへ原系列を階差系列に変換し適応しています。
:::

:::note
・**SARIMAモデル(季節変動自己回帰和分移動平均モデル)**
RIMAモデルをさらに季節周期を持つ時系列データにも拡張できるようにしたモデルです。
:::

今回の時系列分析では**SARIMAモデル**を採用します。

**3.データの周期の把握**
自己相関係数・偏自己相関係数を可視化することで、季節変動の周期を確認し、
パラメーターｓの決定を行う。

:::note
**・自己相関**
自己の過去のデータとの相関のことです。
:::

:::note
**・偏自己相関**
k次自己相関といえば ytとyt-kの相関を表しますが、k次偏自己相関はytとyt-kの間のデータすなわちyt-1からyt-k+1の影響を取り除いた相関になります。
:::

<INS>自己相関・偏自己相関の可視化
```python
#自己相関・偏自己相関の可視化
#自己相関係数のグラフの出力
fig=plt.figure(figsize=(12, 8))
ax1= fig.add_subplot(211)
fig = sm.graphics.tsa.plot_acf(df0.iloc[:,1],lags=83,ax=ax1)
# 偏自己相関係数のグラフを出力
ax2 = fig.add_subplot(212)
fig = sm.graphics.tsa.plot_pacf(df0.iloc[:,1],lags=12, ax=ax2)
plt.show()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3774294/72a055f5-9948-e334-f62c-cc3b2c766a11.png)
12か月の周期性が読み取ることができます。

**4.s以外のパラメーターの決定**
```python
# 1年間分のデータにする
index = pd.date_range("2017.01", "2024.01", freq = 'M')
df0.index = index
del df0['年度']
df0=df0['産業計'].astype(int)
df1=df0[:12]
print(df1)

# 関数の定義
import warnings
import itertools
import numpy as np

def selectparameter(DATA,s):
    p = d = q = range(0, 2)
    pdq = list(itertools.product(p, d, q))
    seasonal_pdq = [(x[0], x[1], x[2], s) for x in list(itertools.product(p, d, q))]
    parameters = []
    BICs = np.array([])
    for param in pdq:
        for param_seasonal in seasonal_pdq:
            try:
                mod = sm.tsa.statespace.SARIMAX(DATA,
                                            order=param,
                                            seasonal_order=param_seasonal)
                results = mod.fit()
                parameters.append([param, param_seasonal, results.bic])
                BICs = np.append(BICs,results.bic)
            except:
                continue
    return parameters[np.argmin(BICs)]

selectparameter(df1,s=12)
```
**結果**
[(0, 1, 0), (0, 1, 0, 12), nan]

**5.モデルの構築と予測の視覚化**
```python
#モデルの構築、予測の視覚化
SARIMA_df0 = sm.tsa.statespace.SARIMAX(df0,order=(0, 1, 0),seasonal_order=(0, 1, 0, 12)).fit()

# predに予測データを代入する
pred = SARIMA_df0.predict("2023.12", "2028.12")

# predデータともとの時系列データの可視化
plt.plot(df0)
plt.plot(pred, color="r")
plt.xlabel("month")
plt.ylabel("jobs-to-applicants ratio")
plt.title("jobs-to-applicants ratio")
plt.show()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3774294/b3153073-44ae-e91e-6aaa-f045bb968b3c.png)
赤線部分が予測値となり、2024年以降の有効求人数は2023年の増減周期を維持し、増加していくことが予測される。

# **おわりに**
プログラミング未経験者が一から学習した時系列分析を行ったが、その過程から至らぬ点が多く存在すると感じました。分析の進め方、Python、この記事の書き方に至ってまで、疑問点を一つずつ解決しながら進めていきました。データ分析講座で学んだことや、自身で疑問を解消していく経験を活かして、今後も新たな学習分野に挑戦していきたいと感じました。