Code Interpreterで時系列データの予測をしてみた

# やってみた

Code Interpreterが便利だというので、ちょっと時系列データの予測が最近したかったので、やってもらいました。本当に、「やらせました」ですらなく、「やってもらいました」という感じです。結論から言うと、ほぼ「進めてください」と言い続けるだけでゴールまでたどり着けました。

全文はこちら。生成されたコードなどはこちらを参考にしてください。
https://chat.openai.com/share/6b2daa50-1fea-440c-ad81-fcbb033d6fe4

# とりあえずデータを準備する
データがなければ始まりません。とりあえずCSVファイルを準備してみました。

```
Timestamp,Latitude,Longitude
2023-07-09 11:18:00,35.5,135.5
2023-07-09 11:18:10,35.50000079,135.5000051
2023-07-09 11:18:20,35.50000496,135.5000068
...
```

初期値だけ決めてあとは `RAND()*0.00001`ずつ増えていくようなデータをExcelで準備しました。
単純に増えていくだけのデータです。

データの素性（という程のものでもない）も見れば分かるでしょうし、雑に投げます。

> このデータを使って、未来の位置情報を予測したい

しっかり中身を読んでくれます。よく分かっていらっしゃる。

> 提供いただいたデータを確認しました。これは時系列の位置情報（緯度と経度）を含んでいます。次のステップは、このデータを分析し、未来の位置情報を予測するモデルを作成することです。
> 
> ここでは、次のような手順を踏むことを提案します：
> 
> 1. データの前処理：Timestampを適切な形式に変換し、必要に応じて他の前処理を行います。
> 2. 探索的データ分析：データのパターンを理解するために、基本的な統計量を計算したり、グラフを描いたりします。
> 3. モデル作成と訓練：適切な予測モデルを選択し、提供されたデータを使ってモデルを訓練します。
> 4. 予測：訓練されたモデルを使って未来の位置情報を予測します。
> 
> それでは、まずはデータの前処理から始めましょう。具体的には、Timestamp列をdatetimeオブジェクトに変換します。これにより、後続の分析やモデル訓練で時間情報を扱いやすくなります。

# 進めてもらう

> 進めてください

> Timestamp列をdatetimeオブジェクトに変換しました。
> 
> 次に、探索的データ分析（EDA）を行います。これにより、データの傾向やパターンを把握します。具体的には、緯度と経度の時間経過による変化を視覚化します。これにより、データが周期性、トレンド、または他の特性を持っているかどうかを評価できます。
> 
> それでは、緯度と経度の時間経過による変化をプロットしてみましょう。

> 進めてください

> ![スクリーンショット 2023-07-09 12.15.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58775/5ae25dfa-b176-bdbb-56bd-e7ca6ab14655.png)
> プロットを作成しました。これにより、時間と共に緯度と経度がどのように変化するかを視覚化できます。
> 
> 次に、このデータを用いて予測モデルを作成します。位置情報の予測には多くの方法がありますが、ここではシンプルな線形回帰を用いて緯度と経度の予測を行います。
> 
> なお、位置情報の予測には時間が重要な要素となるため、Timestampを数値化して特徴量として使用します。具体的には、データの最初のTimestampからの経過時間（秒）とします。
> 
> それでは、線形回帰モデルを作成し、訓練を行いましょう。まずは緯度の予測から始めます。

# LSTMは使えなかった

線形回帰モデルは面白くないので、せっかくなのでがっつり機械学習してもらいたいと思います。

> いいえ、LTSMが使いたいです

即座に方針を切り替えてくれるChatGPTさんさすが。

> 了解しました。LSTM（Long Short-Term Memory）は、時系列データの予測において非常に強力な手法であり、一般的には線形回帰よりも高度な予測能力を持っています。LSTMはRNN（Recurrent Neural Network）の一種で、時間依存性のあるデータに対して優れた性能を発揮します。
> 
> それでは、以下の手順でLSTMモデルを作成し、訓練を行います：
> 
> データの前処理：データをLSTMが扱いやすい形式に変換します。具体的には、特徴量のスケーリングと時系列データのウィンドウ化を行います。
> モデルの作成：LSTMレイヤーを含むニューラルネットワークモデルを作成します。
> モデルの訓練：訓練データを使ってモデルを訓練します。
> まずはデータの前処理から始めましょう。具体的には、緯度と経度のデータをスケーリングし、時系列データをウィンドウ化します。スケーリングはモデルの訓練を助け、ウィンドウ化により時系列データを適切な形状に変換します。

やってくれそうなので、「進めてください」に戻ります。

> 進めてください

ところが、実行しようとしたところエラーが出てしまったようです。
```
File ~/.local/lib/python3.8/site-packages/keras/__init__.py:21
     15 """Implementation of the Keras API, the high-level API of TensorFlow.
     16 
     17 Detailed documentation and user guides are available at
     18 [keras.io](https://keras.io).
     19 """
     20 # pylint: disable=unused-import
---> 21 from tensorflow.python import tf2
     22 from keras import distribute
     24 # See b/110718070#comment18 for more details about this import.

ModuleNotFoundError: No module named 'tensorflow'
```

> すみませんが、この環境ではTensorFlowとKeras（LSTMを含むニューラルネットワークライブラリ）が利用できません。そのため、LSTMを用いた予測は行えません。
> 
> しかし、他の方法で位置情報の予測を行うことは可能です。例えば、ARIMA（AutoRegressive Integrated Moving Average）やSARIMA（Seasonal ARIMA）などの統計的手法、あるいは線形回帰や多項式回帰などのよりシンプルなモデルを用いることが可能です。これらのモデルはLSTMほどの性能は期待できませんが、一定の予測能力を持っています。
> 
> それらの手法の中から、お好みのものを選んでいただけますか？それとも、他にご希望の手法がありますか？

# ARIMAは予測まで出来た

仕方ありません。オススメしてくれたARIMAにしてみましょう。

> ARIMAを使います

> 了解しました。ARIMA（AutoRegressive Integrated Moving Average）モデルは、時系列データの予測に一般的に使用される統計的モデルの一つです。このモデルは、自己回帰（AR）、差分（I）、移動平均（MA）の3つの要素を組み合わせたもので、データのトレンドや季節性などを考慮に入れた予測を行います。
> 
> それでは、ARIMAモデルを使って緯度と経度の予測を行います。まずは緯度から始めましょう。ARIMAモデルのパラメータ（p, d, q）を決定するために、ACF（自己相関関数）とPACF（偏自己相関関数）のプロットを作成します。これらのプロットから、ARIMAモデルのパラメータを適切に選択します。
> 
> それでは、ACFとPACFのプロットを作成しましょう。

やる気っぽいので進めてもらいます。

> 進めてください

> ![スクリーンショット 2023-07-09 12.30.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58775/d641dea3-4282-5e1e-0756-801b788cf741.png)
> ACF（自己相関関数）とPACF（偏自己相関関数）のプロットを作成しました。
> 
> これらのプロットは、ARIMAモデルのパラメータ（p, d, q）を選択するための情報を提供します。具体的には、PACFのプロットからAR（自己回帰）の次数pを、ACFのプロットからMA（移動平均）の次数qを選びます。dはデータを定常にするために必要な差分の次数で、ここでは1次差分をとって定常にしているので、d=1とします。
> 
> PACFのプロットから、最初の数ラグでのみ有意な相関が見られ、それ以降は相関がほとんどないことから、p=1とします。一方、ACFのプロットからは、最初の数ラグでのみ有意な相関が見られ、それ以降は相関がほとんどないことから、q=1とします。
> 
> したがって、ARIMA(1,1,1)モデルを適用します。それでは、このモデルをデータにフィットさせてみましょう。

> 進めてください

> ARIMA(1,1,1)モデルを緯度のデータに適用しました。モデルの詳細を示す要約統計量を提供します。これには、各パラメータの係数、標準誤差、z値、p値などが含まれます。
> 
> 次に、このモデルを用いて未来の緯度を予測します。具体的には、次の10ステップ（これは変更可能です）の緯度を予測します。それでは、予測を行いましょう。

> 進めてください

> 次の10ステップの緯度の予測値を計算しました。これらの値は、ARIMA(1,1,1)モデルを使用して計算されました。
> 
> 同様に、経度の予測も行います。まず、経度のデータに対してARIMAモデルのパラメータ（p, d, q）を決定します。これは、ACF（自己相関関数）とPACF（偏自己相関関数）のプロットを作成して行います。それでは、経度に対するACFとPACFのプロットを作成しましょう。

何も言わなくても経度の予測に進んでくれます。

> 進めてください

> ![スクリーンショット 2023-07-09 12.33.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58775/7f786280-922e-5830-155f-6a97a333911b.png)
> 経度データに対するACF（自己相関関数）とPACF（偏自己相関関数）のプロットを作成しました。
> 
> これらのプロットから、ARIMAモデルのパラメータ（p, d, q）を選択します。具体的には、PACFのプロットからAR（自己回帰）の次数pを、ACFのプロットからMA（移動平均）の次数qを選びます。dはデータを定常にするために必要な差分の次数で、ここでは1次差分をとって定常にしているので、d=1とします。
> 
> PACFのプロットから、最初の数ラグでのみ有意な相関が見られ、それ以降は相関がほとんどないことから、p=1とします。一方、ACFのプロットからは、最初の数ラグでのみ有意な相関が見られ、それ以降は相関がほとんどないことから、q=1とします。
> 
> したがって、ARIMA(1,1,1)モデルを適用します。それでは、このモデルをデータにフィットさせてみましょう。

> 進めてください

> ARIMA(1,1,1)モデルを経度のデータに適用しました。モデルの詳細を示す要約統計量を提供します。これには、各パラメータの係数、標準誤差、z値、p値などが含まれます。
> 
> 次に、このモデルを用いて未来の経度を予測します。具体的には、次の10ステップ（これは変更可能です）の経度を予測します。それでは、予測を行いましょう。

> 進めてください

> 次の10ステップの経度の予測値を計算しました。これらの値は、ARIMA(1,1,1)モデルを使用して計算されました。
> 
> これで、ARIMAモデルを用いて未来の緯度と経度の予測を行うことができました。予測は完全に正確ではないかもしれませんが、これらのモデルは提供されたデータに基づいて最善の予測を提供します。
> 
> 何か他にご質問がありますか？

# 予測出来た

緯度と経度を順に予測してくれました。賢い。

> 予測結果を表にしてください

> 以下は、次の10ステップでの予測された緯度と経度を表にしたものです。
> 
> | | Forecasted Latitude | Forecasted Longitude |
> |---|---------------------|----------------------|
> | 0 | 35.500365 | 135.500355 |
> | 1 | 35.500370 | 135.500360 |
> | 2 | 35.500375 | 135.500365 |
> | 3 | 35.500380 | 135.500370 |
> | 4 | 35.500385 | 135.500375 |
> | 5 | 35.500390 | 135.500380 |
> | 6 | 35.500395 | 135.500384 |
> | 7 | 35.500400 | 135.500389 |
> | 8 | 35.500405 | 135.500394 |
> | 9 | 35.500410 | 135.500399 |
> 
> これらの値は、ARIMA(1,1,1)モデルを用いて予測されたものです。

パラメータの調整から予測まで、「進めてください」だけで進めてもらってしまいました。すごい。
もちろん、選択する手法や、採用されたパラメータが正しいかどうかは自分で判断する必要がありますが、「よさげだなー」と眺めるだけで最後まで行けてしまうのはなかなかです。