Pythonで時系列解析・超入門(その5)

テーブルデータ系の数理モデル(アルゴリズム)で
時系列予測するための準備

Pythonで時系列解析・超入門(その5)テーブルデータ系の数理モデル(アルゴリズム)で時系列予測するための準備

前回までは、時系列データ系の数理モデル(アルゴリズム)で、時系列予測モデルを構築し予測する方法について、説明してきました。前回は、Prophetモデルを扱いました。

Pythonで時系列解析・超入門(その4)Prophetモデルで予測する方法

多くの人にとって馴染みがあるのは、時系列データ系の数理モデル(アルゴリズム)よりも、テーブルデータ系の数理モデル(アルゴリズム)の方です。

例えば、以下の数理モデル(アルゴリズム)テーブルデータ系のものです。

  • 線形回帰モデル(単回帰、重回帰、など)
  • 正則化回帰モデル(Ridge回帰、Lasso回帰、など)
  • 一般化線形モデル(GLMM
  • 一般化加法モデル(GAM
  • 階層線形モデル、マルチレベルモデル、一般化混合モデル
  • 決定木(ディシジョンツリー)
  • ランダムフォレスト
  • ブースティングモデル(AdaBoostXGBoostLightGBMなど)
  • ニューラルネットワークモデル

……などなど。

テーブルデータ系の数理モデル(アルゴリズム)を使い、時系列予測モデルを作るには、時系列特徴量を生成することで、対応できます。

今回は、テーブルデータ系モデルで時系列予測するために、時系列特徴量を生成し、テーブルデータ系の数理モデルを構築するための準備をします。

利用するデータ

今回利用する時系列データのデータセットは、Airline Passengers(飛行機乗客数)は、Box and Jenkins (1976) の有名な時系列データです。サンプルデータとして、よく利用されます。

弊社のHPからもダウンロードできます。

弊社のHP上のURLからダウンロード
https://www.salesanalytics.co.jp/591h

 

このデータは上昇トレンド季節性(年間周期)があります。

 

今回生成する時系列特徴量

今回は、以下のラグ特徴量2つローリング特徴量1つを生成します。

  • ラグ特徴量(Lag Features)
    • Lag 1
    • Lag 12
  • ローリング特徴量(Rolling Window Features)
    • window size : 12

 

この3つの時系列特徴量で、上昇トレンド季節性(年間周期)を表現します。

 

ライブラリーとデータの読み込み

では、必要なライブラリーを読み込みます。

以下、コードです。

import numpy as np
import pandas as pd

import matplotlib.pyplot as plt

plt.style.use('ggplot') #グラフのスタイル
plt.rcParams['figure.figsize'] = [12, 9] # グラフサイズ設定

 

次に、データを読み込みます。

以下、コードです。

# データセットの読み込み
url='https://www.salesanalytics.co.jp/591h' #データセットのあるURL
df=pd.read_csv(url,                         #読み込むデータのURL
               index_col='Month',           #変数「Month」をインデックスに設定
               parse_dates=True)            #インデックスを日付型に設定

 

時系列特徴量の生成

shift関数ラグ特徴量を2つ作ります。元データと結合し新たなデータセットを生成します。

以下、コードです。

# ラグ特徴量付データセット
df_lag = pd.concat([df,
                    df.shift(1),
                    df.shift(12)
                   ],
                   axis=1
                  )

df_lag.columns = ['y',
                  'ylag1',
                  'ylag12'
                 ]

df_lag.head(20) #確認

 

以下、実行結果です。

 

次に、rolling関数ローリング特徴量を作ります。

以下、コードです。

# 過去12期平均(前期まで)~ mean(t-12,…,t-2,t-1)
shifted = df.shift(1)
window = shifted.rolling(window=12)
means12 = window.mean()

means12.columns = ['means_12']

means12.head(20) #確認

 

以下、実行結果です。

 

前期までの過去12期平均です。そのため、shift関数で1期ずらしたデータに対しrolling関数で特徴量を作っています。

先程生成したデータセットに、この時系列特徴量を結合します。

以下、コードです。

# ローリング特徴量付データセット
df_lag_RW = pd.concat([df_lag,means12],axis=1)

df_lag_RW.head(20) #確認

 

以下、実行結果です。

 

欠測値NaNを削除します。

以下、コードです。

# 欠損値NaNを除外
dataset = df_lag_RW.dropna()

dataset.head(10) #確認

 

以下、実行結果です。

 

CSV出力

最後に、生成した時系列特徴量付きデータセットを、CSVファイルとして出力します。

以下、コードです。

dataset.to_csv("dataset.csv")

 

dataset.csv」というファイル名にしています。

 

次回

今回は、テーブルデータ系モデルで時系列予測するために、時系列特徴量を生成し、テーブルデータ系の数理モデルを構築するための準備をしました。

次回は、今回作った時系列特徴量付きデータセットを使い、線形回帰系のモデルで時系列予測を実施していきます。

Pythonで時系列解析・超入門(その6)テーブルデータ系モデルで構築する時系列予測モデル(線形回帰)