3.4 時系列のユースケース

家電量販店に勤務していますが、ここ2四半期でノートパソコンやタブレット端末の売上が伸びています。過去のタイムスタンプ・データを使用して、次の4四半期の製品売上を予測します。過去のデータを使用して等間隔の期間での変化を予測するため、指数平滑法アルゴリズムを使用して売上を予測します。

表3-2 関連コンテンツ

トピック リンク
OML4Py GitHubの例 時系列 - 指数平滑法
時系列について 時系列とは
モデルの設定について モデルの設定について
共有設定 共有設定
時系列のアルゴリズム 時系列のアルゴリズム

OML4Pyユースケースの探求を開始する前に、次の用意ができていることを確認します:

  • データ・セット

    このユースケースに使用されるデータ・セットは、SHスキーマからのものです。SHスキーマは、Oracle Autonomous Databaseで簡単にアクセスできます。オンプレミス・データベースの場合、スキーマはインストール時にインストールされるか、スクリプトをダウンロードして手動でインストールできます。サンプル・スキーマのインストールを参照してください。

    SHスキーマのSALES表を使用します。表にアクセスするには、OML NotebooksでSELECT文を実行します。

  • データベース

    次のいずれかのオプションを使用して、データベースを選択または作成します:

  • 機械学習ツール

    Oracle Autonomous Database用のOML Notebooksを使用します。

トピック:

3.4.1 データへのアクセス

SHスキーマからデータ・セットにアクセスし、属性を理解するためにデータを探索します。

注意:

このユースケースに使用されるデータ・セットは、SHスキーマからのものです。SHスキーマは、Oracle Autonomous AI Databaseで簡単にアクセスできます。オンプレミス・データベースの場合、スキーマはインストール時にインストールされるか、スクリプトをダウンロードして手動でインストールできます。サンプル・スキーマのインストールを参照してください。

データを理解するために、次を実行します。
  • データにアクセスします。
  • データ・セットの様々な属性または列を詳細に調べます。
  • データ品質を(データを探索することで)評価します。

データへのアクセス

SHスキーマのSALES表データを使用します。

データの調査

次の表に、SALESの属性に関する情報を示します。

属性名 情報
PROD_ID 製品のID
CUST_ID 顧客のID
TIME_ID yyy-mm-dd hh:mm:ss形式の製品購入のタイムスタンプ
CHANNEL_ID チャネル売上データのチャネルID
PROMO_ID 製品プロモーションID
QUANTITY_SOLD 販売品目数
AMOUNT_SOLD 金額または売上データ

目的変数の特定

このユースケースでのタスクは、売上額を予測するモデルをトレーニングすることです。したがって、ターゲット変数は属性AMOUNT_SOLDです。

3.4.2 データの探索

データを調べ、データの品質を理解して評価します。このステージでは、データを評価してデータ内のデータ型およびノイズを識別します。欠損値および数値外れ値を探します。

ノート:

データベース内の各レコードはケースと呼ばれ、各ケースはcase_idで識別されます。ここでは、ケースIDはTIME_IDであり、独立変数です。あなたは、等間隔の期間における売上を予測しています。

次のステップは、データの探索的分析に役立ちます。

  1. ライブラリのインポート

    %pythonインタプリタ・パラグラフで次のスクリプトを実行して、omlモジュール、Pandaのモジュールをインポートし、表示オプションを設定します:

    import oml
    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
      
    pd.set_option('display.max_rows', 500)
    pd.set_option('display.max_columns', 500)
    pd.set_option('display.width', 1000)
    
    import warnings
    warnings.simplefilter(action='ignore', category=FutureWarning)
  2. SH.SALES表でのDataFrameプロキシ・オブジェクトの作成

    oml.sync関数を使用して、データベース表SALESのプロキシとしてPythonオブジェクトSALESを作成します。oml.sync関数は、oml.DataFrameオブジェクトを戻します。

    ノート:

    指定したデータベース・スキーマに一度に存在できるのは、1つの環境のみです。"schema=None"の場合、オブジェクトは現在のユーザーのスキーマ内で作成および検索されます。
    SALES = oml.sync(table = "SALES", schema = "SH") 
    z.show(SALES.head())

    売上データの上位5行を示しています。

  3. 売上データセットの行数および列数

    oml.DataFrameオブジェクトSALES内の行数および列数を調べるには、DataFrame.shapeを使用します。

    print(f"Rows: {SALES.shape[0]}, Columns: SALES.shape[1]}")
    Rows: 918843, Columns: 7
  4. 売上データセットの列の型

    次のスクリプトを実行して、各列のデータ型を表示します。
    print(f"Data types of each column in the Sales dataset:\n{SALES.dtypes}")

    各列のデータ型を示しています。

  5. 列ごとの欠損値の数

    欠損値があるかどうかを確認するには、次のスクリプトを実行します。count関数は、各列のNULLでない要素の数を戻し、len()関数はデータセット内の行の数を戻します。

    print("Number of missing values in each column is : \n")
    print(len(SALES)-SALES.count())

    各列の欠損値の数を示しています。

  6. 必要な列を選択して売上を予測するためのデータの準備と内容の表示

    ここでは、SH.SALES表から必要な列を選択して、ESM_SH_DATAというPythonプロキシ・オブジェクトを準備します。このユースケースでは、TIME_IDおよびAMOUNT_SOLDを選択します。

    ESM_SH_DATA= SALES[['TIME_ID', 'AMOUNT_SOLD']]
    z.show(ESM_SH_DATA.head())

    ESM_SH_DATAデータセットの上位5行を示しています。

  7. ESM_SH_DATAの行および列

    ESM_SH_DATAの形状を確認します:

    print(f"Rows: {ESM_SH_DATA.shape[0]}, Columns: ESM_SH_DATA.shape[1]}")
    Rows: 918843, Columns: 2

これで、データの探索ステージが完了します。

3.4.3 モデルの構築

時系列データを使用してモデルを構築するには、探索ステージで生成されたOMLプロキシ・オブジェクトESM_SH_DATAに対して指数平滑法アルゴリズムを使用します。

オラクル社では、時系列に対して指数平滑法アルゴリズムを提供しています。

指数平滑法は、時系列データの予測手法です。移動平均法の一種であり、過去の観測に対して指数関数的に減少する重みを割り当てます。傾向や季節性の拡大などの指数平滑法モデル(ESM)の構成要素は、加法的または乗法的な形式を取ることがあります。加法的形式の場合、変動の振幅はレベルに依存しませんが、乗法的形式の場合、変動はレベルと関連します。より単純な加法的モデルでは、誤差やノイズ、傾向および季節性が再帰的定式化の範囲内の線形効果であると仮定します。

監視あり学習アルゴリズムを使用してモデルを構築するには、データのサブセットをトレーニング・データおよびテスト・データに使用できます。時系列モデルでは、通常、履歴データを使用して未来を予測します。これは、一般にデータをランダムにトレーニング・セットとテスト・セットに分割する分類や回帰のモデル検証とは異なります。このユースケースでは、モデルは常に過去の情報に基づいて現在の値を予測するため、データ・セットを分割する必要はありません。つまり、同じデータ・セットに対してトレーニングおよびテストが行われるように見えますが、モデルが適用されると、予測は常に前の日付に基づきます。このユースケースでは、omlプロキシ・オブジェクトESM_SH_DATAを使用します。

  1. 指数平滑法モデル(ESM)のヘルプを表示するには、次のスクリプトを実行します:
    help(oml.esm)
  2. 四半期設定を使用したHolt-Wintersモデルの作成

    ESM_SH_DATAプロキシ・オブジェクトを使用してモデルを構築するには、次の文を実行します:

    try:
        oml.drop(model = 'ESM_SALES_FORECAST_1')
    except:
        pass
    
    setting = {'EXSM_INTERVAL':'EXSM_INTERVAL_QTR',  # accumulation interval = quarter
               'EXSM_PREDICTION_STEP': '4',          # prediction step = 4 quarters
               'EXSM_MODEL': 'EXSM_WINTERS',         # ESM model = Holt-Winters
               'EXSM_SEASONALITY': '4',              # seasonal cycle = 4 quarters
               'EXSM_SETMISSING': 'EXSM_MISS_AUTO'}  # treat missing values as an irregular time series
    
    train_x=ESM_SH_DATA[:,0]
    train_y=ESM_SH_DATA[:,1]
    
    esm_mod = oml.esm(**setting).fit(train_x, train_y, time_seq = 'TIME_ID') 

    スクリプトを詳しく見てみます:

    • EXSM_INTERVAL: データ・セットの間隔または間隔サイズの単位(日、週、月など)を指定します。この設定は、datetime型の時間列にのみ適用されます。たとえば、四半期ごとの売上を予測する場合、設定はEXSM_INTERVAL_QTRです。
    • EXSM_PREDICTION_STEP: 実行する予測の数を指定します。たとえば、四半期を表す各値を表示する場合、値4は将来の4つの値(四半期)の予測を示します。
    • EXSM_MODEL: 使用する指数平滑法モデルのタイプを指定します。例として、EXSM_WINTERSは、加法型傾向および乗法型季節性を持つHolt-Wintersの3重指数平滑法モデルを表します。このタイプのモデルでは、加法的傾向と乗法的傾向、季節性と誤差、傾向減衰の有無の各種組合せが考慮されます。
    • EXSM_SEASONALITY: 季節の長さを指定します。このパラメータでは、季節周期の長さとして正の整数値を指定します。この値は、1より大きくする必要があります。たとえば、4は、4つの値の各グループが季節サイクルを形成することを意味します。これは、4つの四半期を使用して1年を表す場合に意味を持ちます。
    • EXSM_SETMISSING: 欠損値の処理方法を指定します。時系列では、特殊値EXSM_MISS_AUTOは、系列に欠損値が含まれている場合に、不規則な時系列として処理されることを示します。

これで、モデル構築ステージは完了です。

3.4.4 評価

診断メトリックを表示し、品質チェックを実行してモデルを評価します。

ディクショナリ・ビューおよびモデル・ディテール・ビューを問い合せれば、モデルのパフォーマンスを測定するのに十分な場合もあります。ただし、条件付き対数尤度、平均二乗誤差の平均(AMSE)、赤池情報量規準(AIC)などのテスト・メトリックを計算することで、モデルを評価できます。

モデル設定に関する情報

モデルの構築後に生成された様々な統計を調べて、モデルを評価します。統計はモデルの品質を示します。

  • 予測モデル設定の確認

    GLMモデル・オブジェクトで使用可能なモデル詳細(モデル設定、属性係数、適合詳細など)を確認するために、次のスクリプトを実行します。

    z.show(ESM_MOD)

    モデル詳細を示しています。

  • グローバル診断およびモデル品質の確認

    グローバル診断およびモデル設定の確認: 次のスクリプトを実行して、モデルのグローバル統計を表示します。

    z.show(ESM_MOD.global_stats)

    ESMモデルのグローバル統計を示しています。

    前述の属性は次のとおりです:

    • -2 Log_LIKELIHOOD: モデルがデータにどの程度適合しているかを評価する統計メジャーです。具体的には、モデルの負の対数尤度の2倍として計算されます。通常、値が小さいほど、モデルの適合度が高いことを示します。これは、モデル全体のパフォーマンスを評価するために、AICやBICなどの規準とともにモデルを比較する際によく使用されます。
    • AIC: 赤池情報量規準(AIC)は、モデル比較に使用されます。モデルの複雑性にペナルティが課されます。AICが低いほど、モデルが優れていることを示します。
    • AICC: 補正済赤池情報量規準(AICc)は、特にデータ分析のコンテキストで、モデル選択に使用される統計メジャーです。赤池情報量規準(AIC)を小さなサンプル・サイズに合わせて調整し、想定されるカルバック・ライブラー乖離度をより正確に推定します。AICcは数学的に定義され、サンプル・サイズに対してパラメータの数が多いモデルを扱うときに特に便利です。
    • ALPHA: 平滑化パラメータであり、0から1の範囲です。指数平滑法アルゴリズム(Holt-Winters)では、データの最近の変化に対する予測の感度を示します。値が大きいほど、感度が高くなります。
    • AMSE: AMSE (平均二乗誤差の平均)は、実際と予測の値との差を測定します。誤差が大きいほど、ペナルティが課せられます。AMSE値が低いほど、予測精度が高いことを意味します。

予測

ここでは、次の4つの四半期の売上を予測します。

  1. AMOUNT SOLDの予測

    モデルESM_MODは、信頼範囲の下限と上限(LOWERとUPPER)を使用して将来の4つの値を予測します。結果は降順の時系列でソートされるので、最新のポイントが最初に表示されます。

    z.show(ESM_MOD.prediction.sort_values(by='TIME_SEQ',
              ascending=False))

    ESMモデルの予測を示しています。

  2. 信頼区間を使用して予測されたAMOUNT_SOLDの値をチャート化

    OML Notebooksで予測を視覚的に表示するには、次の設定を使用して前述の同じ問合せを実行します。

    z.show(ESM_MOD.prediction.sort_values(by='TIME_SEQ'))

    ESMモデルの予測チャートの設定。


    予測のチャートを示しています。

これで、予測ステップが完了します。モデルは、次の4四半期の売上を予測することに成功しました。これにより、売上を追跡でき、製品の仕入れに関するアイデアを得ることもできます。