- 問題
- 答え
- 解説
Python コード:
import pandas as pd import numpy as np np.random.seed(46) data = pd.Series(np.random.randn(100).cumsum()) rolling_features \ = data.rolling(window=10). \ agg(['mean', 'std']).dropna() print(rolling_features)
回答の選択肢:
(A) 各時点での各ウィンドウの平均と標準偏差
(B) データ全体の平均と標準偏差
(C) 各時点での過去データすべての平均と標準偏差
(D) 10個のランダムなサンプルの平均と標準偏差
mean std 9 1.818234 0.577177 10 1.893488 0.428380 11 1.847271 0.461325 12 1.875374 0.519711 13 1.936488 0.549977 .. ... ... 95 -6.574960 0.971891 96 -6.647001 0.908853 97 -6.652144 0.903989 98 -6.565331 0.951005 99 -6.508535 0.922355 [91 rows x 2 columns]
正解: (A)
回答の選択肢:
(A) 各時点での各ウィンドウの平均と標準偏差
(B) データ全体の平均と標準偏差
(C) 各時点での過去データすべての平均と標準偏差
(D) 10個のランダムなサンプルの平均と標準偏差
- コードの解説
-
このコードは、時系列データのローリングウィンドウ特徴量(平均と標準偏差)を計算しています。
import pandas as pd import numpy as np np.random.seed(46) data = pd.Series(np.random.randn(100).cumsum()) rolling_features \ = data.rolling(window=10). \ agg(['mean', 'std']).dropna() print(rolling_features)
詳しく説明します。
まず、
random
でランダムに生成された100要素の配列を生成します。cumsum()
関数を使って累積和を取り、1次の非定常過程のデータ(ランダムウォーク)を生成します。np.random.seed(46) data = pd.Series(np.random.randn(100).cumsum())
data
に格納されているデータは次のようになっています。0 0.584876 1 1.816072 2 2.637972 3 1.838743 4 2.250797 ... 95 -5.925298 96 -6.230614 97 -5.903785 98 -5.722589 99 -6.678199 Length: 100, dtype: float64
rolling()
メソッドを使って、10要素のローリングウィンドウ(移動窓)を扱うことができるようになります。結果は各ウィンドウに対応する部分時系列です。この部分時系列に対し、agg(['mean', 'std'])
メソッドを用いて、各ウィンドウの平均値と標準偏差を計算します。rolling_features \ = data.rolling(window=10). \ agg(['mean', 'std']).dropna()
最初の9要素にはウィンドウが適用できないため(ウィンドウサイズ未満なので)、それらは計算結果から除外され欠損します。
dropna()
メソッドを用いて、除外しています。したがって、元のデータは100要素ありましたが、結果のデータフレーム
rolling_features
には91行しか存在しかありません。この計算結果を出力します。各10要素からなるウィンドウの平均(
mean
)と標準偏差(std
)です。print(rolling_features)
mean std 9 1.818234 0.577177 10 1.893488 0.428380 11 1.847271 0.461325 12 1.875374 0.519711 13 1.936488 0.549977 .. ... ... 95 -6.574960 0.971891 96 -6.647001 0.908853 97 -6.652144 0.903989 98 -6.565331 0.951005 99 -6.508535 0.922355 [91 rows x 2 columns]
- ローリングウィンドウ特徴量
-
ローリングウィンドウ特徴量とは?
ローリングウィンドウ特徴量は、時系列データの解析手法の一つで、指定されたウィンドウサイズに基づいて一連の時系列データから計算される統計的特徴量(平均、標準偏差、最大値、最小値など)を意味します。
ウィンドウは一定の長さ(時点数)を持ち、時系列データ上を「ローリング」(移動)することで、各時点でのウィンドウ内のデータに基づいた特徴量を生成します。
これは、一定の時間窓でのデータの振る舞いを捉えることで、データの傾向、周期性、変動幅などを理解するための重要な手法です。これは、株価の動き、気温の変動、ウェブサイトの訪問者数の変化など、時間とともに変化するデータを解析する際に特に有用です。
Pandasの
rolling()
メソッドを使用してローリングウィンドウを適用し、その後agg()
メソッドを用いて各ウィンドウでの平均値と標準偏差を計算しています。よく用いられる統計的特徴量
Pandasのローリングウィンドウを使うと様々な統計的特徴量を計算することができます。
以下は、よく用いられる統計的特徴量の一部です。
- mean: 平均値
- std: 標準偏差
- var: 分散
- min: 最小値
- max: 最大値
- sum: 合計値
- median: 中央値
- quantile: 分位数
- skew: 歪度(分布の非対称性を表す)
- kurt: 尖度(分布の尖り具合を表す)
これらの関数を、
agg()
メソッドを用いて指定すれば、指定したウィンドウサイズ内のデータに対して特徴量計算が可能です。例えば、10要素のウィンドウで最大値と最小値を求めたい場合は次のように記述します。
rolling_features = data.rolling(window=10).agg(['max', 'min'])
これにより、各10要素のウィンドウに対する最大値と最小値のローリングウィンドウ特徴量が得られます。
よくある活用方法
ローリングウィンドウ特徴量は、時系列データの解析に広く活用されます。以下に、その活用例をいくつか紹介します:
金融データの解析
株価や為替レートなどの金融時系列データの解析によく使われます。例えば、過去10日間の株価の平均或いは標準偏差など、指標となる統計量を計算する際に利用されます。センサーデータの解析
工場や製品の状態監視に使われるセンサーデータ(温度、圧力、湿度など)も時系列データです。定期的にセンサーから取得されたデータにローリングウィンドウ特徴量を計算し、異常値の検出やトレンドの把握を行います。推移の確認・予測
気象情報(気温、降水量、風速など)やウェブサイトの訪問者数、販売数などの推移を確認し、予測する際に活用します。機械学習の特徴量生成
ローリングウィンドウ特徴量は、時系列データを用いた機械学習モデルの特徴量としても使われます。ウィンドウ内の統計量は、将来の予測を行う際に有用な情報を持つことが多いからです。以上のように、ローリングウィンドウ特徴量は、時間の経過とともに変化するデータの傾向を把握し、解釈や予測を行うための重要なツールとなります。