KNIMEでARIMAモデルの時系列分析

(執筆時点では)新型コロナ第六波が猛威を振るっています。せっかく子供を連れてスキーに行こうとしていたのも見送りです。なかなか終息しませんね。

新型コロナ関係は統計値が得られやすいので、早く収まって欲しい一方、データであれこれしている身にとってはいい教材でもあります。近頃KNIMEでいろいろ試しているので、KNIMEで時系列分析を試みた備忘録を書いてみました。

#1.KNIMEと時系列分析とPython
KNIMEについては[デジタル推進課](https://degitalization.hatenablog.jp/)さんが素晴らしいまとめを書いてくださっているのでここでは細かく書きません。要はジェネリックSPSS modelerで、様々な機能のノード(アイコン)を矢印でつなげてワークフローを組み、データ操作・集計・グラフ化・機械学習モデル適用などを行うことができます。

時系列分析と言えばARIMAモデルです。詳細は気の利いた記事がいっぱいありますので、そちらを熟読いただければよいですが、「とりあえずこれやっとけ」的な分析モデルで、過去データからの自己回帰・移動平均を用いて将来を予測します。自己回帰・移動平均の取り方のパラメータをチューニングする必要があるのですが、その最適化の方法が確立されており、それらを評価指標的に”いい感じ”にしてくれるAuto ARIMAも併せて、ARIMAモデルはRやPythonでパッケージ化されています。

そして、KNIMEでの時系列分析・ARIMAモデルはPythonのstatsmodels.tsaパッケージをラップする形で実装されています。標準のノードではないため、KNIME Hub又はKNIME Labsからノードを取得する必要があります。

#2.KNIMEでARIMAモデルを使う (KNIME Hubから)

KNIME Hubからノードを取得する場合でおおよその手順を解説します。

- KNIMEにデータを読み込む。同一観測対象の数字の一覧で、各1行に同一間隔で数値が収まり、抜け漏れなく連続した状態にしておく。
- KNIME HubからAuto ARIMA Learnerを取得し、繋ぐ。 (KNIME HubからKNIMEにドラッグアンドドロップ)
- KNIME上でのPythonの設定がまだであればこれを行う。(KNIMEのPython連携モジュールはARIMAノードの取得とともに関連モジュールとしてインストール画面が立ち上がる)
- KNIME HubからAuto ARIMA Predictorを取得し、繋ぐ。

学習用データや、予測結果はLine Plotノードで見ると良いでしょう。ワークフローはこんな感じです。
![arima_hub.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515832/0c156e0b-99fa-66ee-8d23-5ae752938567.png)
[KNIME Hubの時系列分析ノードはこちらから](https://hub.knime.com/knime/spaces/Examples/latest/00_Components/Time%20Series~1415IA5ZFtVXlwg_/)。 学習用データをARIMA Learner又はAuto ARIMA Learnerで学習し、 ARIMA Predictorで予測結果を出します。
取り急ぎ動かすのであれば、Auto ARIMA LearnerはTarget columunを、ARIMA PredictorはNumber of periods for forcastを指定すれば動きます。

__この記事の執筆地点では、KNIME HubのARIMA Learner/Auto ARIMA Learnerを使う場合、Python環境で少し注意することがあります。__ローカルにPythonの実行環境を整え、pipまたはcondaで必要なパッケージ(statsmodels)を入れておく必要があるのですが、statsmodelsのバージョンが0.12.2までである必要があります。
そもそもKNIME自体もAnaconda環境が推奨のようなのですが、conda(またはAnaconda一式)のパッケージであれば0.12になるので問題ありません。
しかし、この記事の執筆時点では、pip installでバージョンを指定をしないと最新版の0.13以降が入ってしまい、動作しないのです。これは、現時点で、KNIME HubのARIMA Learner/Auto ARIMA Learner が引用している statsmodels.tsa.arima_model が、0.13で statsmodels.tsa.arima に変更されてしまい、引用出来ないことに起因します。
（なお、0.12.2以下にバージョン指定を行えば、pipで構築した環境でも動作しました）

さて、全国と都道府県別のコロナ感染者の発表数は、[NHKがデータセットとして公開してくれています](https://www3.nhk.or.jp/news/special/coronavirus/data/)。このうち東京都内の新規感染者数をプロットしたのがこちらです。
![arima_hub2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515832/18b6f200-71a1-1eeb-e36a-c5ded933ad5d.png)
これは2022年1月22日時点のデータで、第6波が伸び始め、都内で新規感染者1日10,000人が見えてきた時期です。
Auto ARIMA Learnerがこれを学習し、ARIMA Predictorがその後2週間程度を予測した結果がこちらです。
![arima_hub3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515832/a60a69ac-2f58-c2a1-ed8b-863c0bdf2601.png)
20,000人超えちゃうのかぁ、とその日は思っていたのですが、その2週後にこの記事を書いていまして、実際予測通りになっています。

なお、ARIMAモデルのパラメータ、p,d,qは、AutoARIMAが5,2,5を選んでいます。(p,d,qの最大値は指定でき、デフォルトでは5,2,5が最大値になっています)

#3.KNIMEでARIMAモデルを使う (KNIME Labsから)

安定版の位置づけのKNIME HubのTime Seriesノード群の他に、preview版となる[KNIME Labs の ARIMAノード群](https://hub.knime.com/knime/extensions/org.knime.features.arima/latest)があります。
おおよそKNIME Hubのものと同じですが、

- 2022年2月時点で、AutoARIMAはまだ実装されていない。
- statsmodelsが0.13以降でも動作する。(恐らくこの対策で開発されている)
- 学習用データ、同期間の予測値、将来の予測値その上下95%信頼区間を1グラフに図示できるARIMA Visualization が追加された。

という差異があります。
ワークフローを組むとこんな感じです。
![arima_hub4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515832/e64b720b-d9b7-6839-e2a6-92bb473cd5e9.png)

ARIMA Learnerで Column containing univariate time series で学習対象のデータ列を指定し、AR-order, I-order, MA-order (ARIMAのパラメーターp,d,q)を指定して学習させます。現時点でAutoARIMAがまだないので、パラメーターp,d,qは別途検討する必要があります。(ここでは、先にAutoARIMAが採用したパラメーター5,2,5を流用しています)

結果はARIMA　PredictorまたはARIMA Visualizationで確認します。このARIMA Visualizationは、前述の通り、学習用データ、同期間の予測値、将来の予測値その上下95%信頼区間を1グラフに図示してくれます。

少々見辛いですが、次の図がそのアウトプットで、黒線は学習用データ＋将来予測値、灰色の線・範囲は、学習用データと同期間の予測値＋将来予測値の上下95%信頼区間になっています。
![arima_hub5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515832/3c258d95-a4aa-c620-d0c9-7137891e7d43.png)
日本語がフォントの問題で表示されていないのはご愛敬ですが、このプロットはモデルの出来具合を確認するのに良いですね。

#4.終わりに
KNIMEで時系列分析をしてみようと思い立ったのは、誰でも無償ソフトでGUIで時系列分析ができたら素敵だな、と思ったからですが、いざ動かしてみますとKNIMEにもPythonにも慣れていないと環境構築はちょっと厳しそうでした。
しかし、環境さえ作ってしまえばノーコードでここまで出来るのはとても便利です。
いずれLabs側の新ノードに置き換わっていくのだと思いますが、そちらでもAutoARIMAは実装されるのかなど、暫くウォッチしてみたいと思います。