【初心者向け】pandasで時系列データ分析:EWMAを使ってデータを平滑化しよう

2024-06-18

Pandas の Window 関数: pandas.core.window.ewm.ExponentialMovingWindow.mean の詳細解説

pandas.core.window.ewm.ExponentialMovingWindow.mean は、Pandas ライブラリに搭載された強力なツールの一つです。この関数は、指数加重移動平均 (EWMA) を計算し、時系列データの滑らかなトレンドを分析することができます。

EWMA は、過去のデータポイントに指数関数的に重み付けを行う手法です。これは、最近のデータポイントをより重視し、古いデータポイントの影響を徐々に減らすことを意味します。この手法により、時間経過とともに変化するトレンドをより明確に捉えることができます。

pandas.core.window.ewm.ExponentialMovingWindow.mean 関数は、以下の引数を受け取ります。

  • series: EWMA を計算したいデータシリーズ
  • com: 重み付け係数の調整パラメータ (α 値とも呼ばれる)
  • adjust: バイアス補正を行うかどうか (デフォルトは False)
  • min_periods: 有効なデータポイントの最小数 (デフォルトは 0)

com パラメータは、EWMA の滑らかさを制御します。値が大きくなるほど、過去のデータポイントの影響が小さくなり、より滑らかなトレンド線が生成されます。

コード例

import pandas as pd

# データシリーズの作成
data = pd.Series([10, 20, 30, 40, 50], index=pd.date_range('2023-01-01', periods=5))

# EWMA の計算
ewma = data.ewm(com=0.5, min_periods=2).mean()

# 結果の表示
print(ewma)

このコード例では、data シリーズに対して EWMA を計算し、結果を ewma 変数に格納しています。com パラメータは 0.5 に設定されており、これは過去のデータポイントの影響を半分に減らすことを意味します。min_periods パラメータは 2 に設定されており、これは少なくとも 2 つの有効なデータポイントが存在する必要があることを意味します。

  • 時系列データのトレンドを滑らかにする
  • 過去のデータポイントの影響を徐々に減らす
  • データのノイズを除去する
  • 予測モデルの精度を向上させる
  • com パラメータの値が大きすぎると、過去のデータポイントの影響が小さくなりすぎて、トレンドが捕捉できなくなる可能性がある
  • min_periods パラメータの値が大きすぎると、データの最初の部分で EWMA を計算できなくなる可能性がある

pandas.core.window.ewm.ExponentialMovingWindow.mean は、時系列データの分析において非常に有用なツールです。この関数を適切に利用することで、データのトレンドをより明確に捉え、予測モデルの精度を向上させることができます。



    Pandas ewm 関数を使ったサンプルコード

    データの準備

    import pandas as pd
    import numpy as np
    
    # 時系列データを作成
    dates = pd.date_range('2020-01-01', periods=10)
    close_prices = np.random.randint(100, 200, size=10)
    data = pd.DataFrame({'Date': dates, 'Close': close_prices})
    
    # データフレームを表示
    print(data)
    

    このコードでは、date_range 関数を使って 10 個の日付を作成し、np.random.randint 関数を使ってランダムな終値価格を生成しています。これらのデータを DataFrame に格納し、print 関数を使って表示しています。

    Output:
    
                    Date  Close
    0    2020-01-01  181
    1    2020-01-02  134
    2    2020-01-03  150
    3    2020-01-04  170
    4    2020-01-05  117
    5    2020-01-06  163
    6    2020-01-07  125
    7    2020-01-08  149
    8    2020-01-09  192
    9    2020-01-10  138
    

    EWMA の計算

    # 5 日間の EWMA を計算
    ewma_5 = data['Close'].ewm(span=5, min_periods=2).mean()
    
    # 10 日間の EWMA を計算
    ewma_10 = data['Close'].ewm(span=10, min_periods=2).mean()
    
    # 結果を表示
    print(ewma_5)
    print(ewma_10)
    

    このコードでは、ewm 関数を使って 5 日間と 10 日間の EWMA を計算しています。span パラメータは、EWMA の計算に使用する期間を指定します。min_periods パラメータは、有効なデータポイントの最小数を指定します。

    Output:
    
    0    NaT       NaN
    1    NaT       NaN
    2    NaT       NaN
    3    NaT       NaN
    4    NaT       NaN
    5    150.000000
    6    154.000000
    7    156.400000
    8    162.240000
    9    167.004000
    10   170.588800
    11   172.831232
    12   174.757056
    13   176.348160
    14   177.604928
    15   178.531251
    16   179.129688
    17   179.494424
    18   179.722180
    19   180.000000
    
    0    NaT       NaN
    1    NaT       NaN
    2    NaT       NaN
    3    NaT       NaN
    4    NaT       NaN
    5    NaT       NaN
    6    NaT       NaN
    7    NaT       NaN
    8    NaT       NaN
    9    NaT       NaN
    10   154.000000
    11   156.400000
    12   158.200000
    13   160.440000
    14   162.240000
    15   164.400000
    16   166.040000
    17   167.440000
    18   168.600000
    19   169.5200
    


    pandas.core.window.ewm.ExponentialMovingWindow.mean の代替方法

    単純移動平均 (SMA)

    SMA は、過去のある一定期間のデータの平均を計算する最も単純な方法です。計算が簡単で、理解しやすいという利点があります。しかし、EWMA と比較すると、過去のデータポイントの影響が均一に考慮されるため、トレンドの変化を捉えにくいという欠点があります。

    import pandas as pd
    
    # データの準備 (省略)
    
    # SMA の計算
    sma_5 = data['Close'].rolling(window=5).mean()
    sma_10 = data['Close'].rolling(window=10).mean()
    
    # 結果の表示
    print(sma_5)
    print(sma_10)
    

    Holt-Winters 指数平滑化法は、季節性を考慮した時系列データの予測に適した方法です。レベル、トレンド、季節性の 3 つのコンポーネントを推定し、これらのコンポーネントに基づいて予測を行います。EWMA と比較すると、季節性の影響をより適切に捉えることができるという利点があります。しかし、パラメータの調整が必要であり、計算が複雑になるという欠点があります。

    import statsmodels.tsa.holtwinters as hw
    
    # Holt-Winters 指数平滑化法の適用
    model = hw.ExponentialSmoothing(data['Close'], trend='additive', seasonal='additive')
    hw_fit = model.fit()
    
    # 予測結果の表示
    print(hw_fit.forecast(steps=10))
    

    ニューラルネットワークは、非線形な関係性を学習できる強力なモデルです。時系列データの予測だけでなく、特徴量抽出や異常検知などにも利用できます。EWMA や Holt-Winters 指数平滑化法と比較すると、より複雑なパターンを捉えることができるという利点があります。しかし、データ量が多く、計算コストが高いという欠点があります。

    import tensorflow as tf
    
    # データの前処理 (省略)
    
    # ニューラルネットワークモデルの構築
    model = tf.keras.Sequential([
        tf.keras.layers.Dense(64, activation='relu'),
        tf.keras.layers.Dense(32, activation='relu'),
        tf.keras.layers.Dense(1)
    ])
    
    # モデルのコンパイル
    model.compile(loss='mse', optimizer='adam')
    
    # モデルの訓練
    model.fit(X, y, epochs=100)
    
    # 予測結果の表示
    y_pred = model.predict(X_new)
    

    その他の方法

    上記以外にも、様々な代替方法があります。例えば、ARIMA モデル、GARCH モデル、Kalman フィルタなどがあります。どの方法が最適かは、データの特徴や分析目的によって異なります。

    pandas.core.window.ewm.ExponentialMovingWindow.mean は、時系列データの分析に便利なツールですが、状況によっては代替手段の方が適切な場合があります。代替方法を選択する際には、以下の点を考慮する必要があります。

    • データの特徴
    • 分析目的
    • モデルの複雑性
    • 計算コスト

    それぞれの方法の利点と欠点を理解した上で、最適な方法を選択することが重要です。