こんにちは、JS2IIUです。
時系列データは、株価、気象データ、センサーデータ、売上予測など、さまざまな分野で利用されます。従来はARIMAやHolt-Winters法などの統計手法が使われてきましたが、近年では機械学習やディープラーニングを活用した高度な手法が普及しています。本記事では、最新の時系列データ処理ライブラリである tsfresh、Prophet、Darts を取り上げ、それぞれの特徴や活用方法を詳しく解説します。
tsfresh: 自動特徴量抽出
tsfreshは、Pythonで時系列データから特徴量を自動抽出するためのオープンソースライブラリです。 このライブラリは、統計、信号処理、非線形動力学などの手法を組み合わせ、時系列データの基本的な特性から複雑なパターンまで、1200以上の特徴量を抽出できます。 抽出された特徴量は、機械学習モデルの入力として使用され、分類や回帰などのタスクに役立ちます。
tsfreshは、抽出した特徴量の中から、目的のタスクに関連性の高いものを選択するフィルタリング機能も備えています。このフィルタリング手法は、仮説検定の理論に基づいており、各特徴量の説明力や重要性を評価します。 これにより、ノイズや冗長性のある特徴量を排除し、モデルの性能向上と計算効率の改善が期待できます。
tsfreshのインストールは、以下のコマンドで行えます。
pip install tsfresh大規模な時系列データを扱う場合、Daskを利用して並列処理を行うことも可能です。tsfreshを使用することで、時系列データの特徴量抽出と選択が効率的に行え、機械学習モデルの精度向上に貢献します。
特徴:
- 時系列データから統計的特徴量を自動抽出
- 不要な特徴量を選別するフィルタリング機能
- 機械学習モデルと組み合わせやすい
メリット:
- 自動で特徴量を抽出し、分析の手間を削減
- 特徴量の重要度評価が可能
デメリット:
- 時系列予測機能はない(特徴量抽出専用)
- 計算コストが高い場合がある
活用例:
- 異常検知や分類問題の前処理
- 機械学習モデルの入力データの生成
サンプルコード:
from tsfresh import extract_features
from tsfresh.utilities.dataframe_functions import make_forecasting_frame
import pandas as pd
import numpy as np
data = pd.DataFrame({"value": np.random.rand(100), "time": range(100)})
features = extract_features(data, column_id="time")
print(features.head())実行結果:
色々な統計量を計算してまとめて出してくれます。
value__variance_larger_than_standard_deviation value__has_duplicate_max \
0 0.0 0.0
1 0.0 0.0
2 0.0 0.0
3 0.0 0.0
4 0.0 0.0
value__has_duplicate_min value__has_duplicate value__sum_values \
0 0.0 0.0 0.867636
1 0.0 0.0 0.933084
2 0.0 0.0 0.905754
3 0.0 0.0 0.725887
4 0.0 0.0 0.747724
value__abs_energy value__mean_abs_change value__mean_change \
0 0.752792 NaN NaN
1 0.870645 NaN NaN
2 0.820391 NaN NaN
3 0.526912 NaN NaN
4 0.559091 NaN NaN
value__mean_second_derivative_central value__median ... \
0 NaN 0.867636 ...
1 NaN 0.933084 ...
2 NaN 0.905754 ...
3 NaN 0.725887 ...
4 NaN 0.747724 ...
value__fourier_entropy__bins_5 value__fourier_entropy__bins_10 \
0 NaN NaN
1 NaN NaN
2 NaN NaN
3 NaN NaN
4 NaN NaN
value__fourier_entropy__bins_100 \
0 NaN
1 NaN
2 NaN
3 NaN
4 NaN
value__permutation_entropy__dimension_3__tau_1 \
0 NaN
1 NaN
2 NaN
3 NaN
4 NaN
value__permutation_entropy__dimension_4__tau_1 \
0 NaN
1 NaN
2 NaN
3 NaN
4 NaN
value__permutation_entropy__dimension_5__tau_1 \
0 NaN
1 NaN
2 NaN
3 NaN
4 NaN
value__permutation_entropy__dimension_6__tau_1 \
0 NaN
1 NaN
2 NaN
3 NaN
4 NaN
value__permutation_entropy__dimension_7__tau_1 \
0 NaN
1 NaN
2 NaN
3 NaN
4 NaN
value__query_similarity_count__query_None__threshold_0.0 \
0 NaN
1 NaN
2 NaN
3 NaN
4 NaN
value__mean_n_absolute_max__number_of_maxima_7
0 NaN
1 NaN
2 NaN
3 NaN
4 NaN
[5 rows x 783 columns]Prophet: トレンド変化を考慮した予測
Prophetは、FacebookのCore Data Scienceチームによって開発された、時系列データの予測を行うためのオープンソースライブラリです。 PythonとRの両方で利用可能で、年次、週次、日次の季節性や祝日効果などを考慮した加法モデルに基づいて、非線形のトレンドを捉えることができます。特に、強い季節性を持つデータや複数年分の履歴データに対して高い精度を発揮します。また、欠損値や外れ値、トレンドの変化にも強く、自動で高速な予測が可能であり、データサイエンティストやアナリストが手動で調整することも容易です。
特徴:
- Facebookが開発した時系列予測ライブラリ
- 季節性や休日の影響を考慮可能
- トレンド変化点を自動検出
メリット:
- データが少なくても高精度な予測が可能
- モデルの解釈が容易
デメリット:
- 短期間の変動に弱い
- 多変量時系列には対応していない
活用例:
- 売上やWebトラフィックの予測
- 季節性を考慮した需要予測
サンプルコード:
pip install prophetfrom prophet import Prophet
import pandas as pd
data = pd.DataFrame({"ds": pd.date_range(start='2022-01-01', periods=100, freq='D'),
"y": np.random.rand(100)})
model = Prophet()
model.fit(data)
future = model.make_future_dataframe(periods=30)
forecast = model.predict(future)
model.plot(forecast)次の様なグラフが表示されます。

Darts: 機械学習・ディープラーニング対応
Dartsは、Pythonで時系列データの予測や異常検知を簡単に行うためのライブラリです。ARIMAや深層ニューラルネットワークなど、多様なモデルを統一されたAPIで利用でき、scikit-learnのようにfit()やpredict()といった関数で操作できます。
このライブラリは、単変量および多変量の時系列データに対応しており、外部データを組み込んだ予測や、複数モデルの予測結果を組み合わせることも容易です。また、バックテストやグリッドサーチなどのモデル評価機能も充実しています。
さらに、Dartsは異常検知の機能も備えており、PyODなどのモデルを時系列データに適用して異常スコアを取得したり、Darts内の予測モデルやフィルタリングモデルを活用して異常検知モデルを構築することが可能です。
インストールは以下のコマンドで行えます。
pip install dartsDartsを使用することで、時系列データの分析や予測がより効率的かつ簡単になります。
特徴:
- ARIMA、Prophet、LSTMなど幅広いモデルを統合
- 複数の時系列データを扱える
- PyTorchやTensorFlowと連携可能
メリット:
- 深層学習を活用した高度な予測が可能
- シンプルなAPIで多様なモデルを試せる
デメリット:
- モデル選択に関する知識が必要
- 計算コストが高い
活用例:
- 株価予測
- IoTデータの解析
サンプルコード:
from darts import TimeSeries
from darts.models import RNNModel
import numpy as np
import pandas as pd
data = pd.DataFrame({"time": pd.date_range(start='2022-01-01', periods=100, freq='D'),
"value": np.random.rand(100)})
ts = TimeSeries.from_dataframe(data, "time", "value")
model = RNNModel(model="LSTM", input_chunk_length=10, output_chunk_length=5)
model.fit(ts)
pred = model.predict(n=10)
ts.plot()
pred.plot()このように予測グラフを表示します。

ライブラリの比較
| ライブラリ | 主な用途 | モデルの種類 | 特徴 |
|---|---|---|---|
tsfresh | 特徴量抽出 | 統計分析 | 時系列データの前処理用 |
Prophet | 予測 | 統計モデル | トレンド変化を考慮した予測 |
Darts | 予測 | 統計+機械学習 | 高度なモデルを簡単に適用可能 |
まとめ
時系列データの処理にはさまざまな手法があります。特徴量抽出には tsfresh、単純な時系列予測には Prophet、高度な機械学習を活用した予測には Darts が適しています。用途に応じて適切なライブラリを選択しましょう。
参考リンク
最後に、書籍のPRです。
24年9月に出版された「ハイパーモダンPython-信頼性の高いワークフローを構築するモダンテクニック」、Claudio Jolowicz著、嶋田、鈴木訳。開発環境の構築、プロジェクトの管理、テストに関して実践的な内容でとても参考になる一冊です。ぜひ手に取ってみてください。
最後まで読んでいただきありがとうございます。


コメント