見出し画像

ChatGPTと学ぶ:時系列データの自己相関

時系列データの自己相関について勉強中です。ChatGPTは多くの知識を持つ頼りになる相棒ですが、ときどき間違ったことも言うので一緒に試行錯誤している感じです。

たくさん教えてもらったのだけど、まだぜんぜん消化できてないので、とりあえず今日の記録としてごく一部のメモ。
自己相関の基本的な概念を理解したとしても、これを学習データの特徴量にどのように応用するかは大きな課題です。


自己相関関数(ACF)

自己相関とは、時系列データ内の異なる時点間での相関のことです。
ダミーデータを生成して、どのタイムラグがデータに影響を与えているかを視覚化します。

上記のグラフは、生成した時系列データとその自己相関を可視化したものです。

  1. 時系列データのグラフ:周期性を持つランダムなデータがプロットされています。このようなデータは実際の時系列データ解析でよく見られます。

  2. 自己相関関数(ACF)のグラフ:このグラフは、異なるタイムラグでのデータの自己相関を示しています。自己相関が高いラグは、データに影響を与える重要な時間のずれを示しています。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from statsmodels.tsa.stattools import acf

# サンプルデータの生成
np.random.seed(0)
n = 100
time = np.arange(n)
data = np.sin(time / 8) + np.random.normal(scale=0.5, size=n)

# データフレームに変換
df = pd.DataFrame({'Time': time, 'Value': data})

# 自己相関の計算
lag_acf = acf(df['Value'], nlags=20)
acf_df = pd.DataFrame({'Lag': range(len(lag_acf)), 'ACF': lag_acf})

# 時系列データのプロット
plt.figure(figsize=(12, 6))
plt.subplot(2, 1, 1)
plt.plot(df['Time'], df['Value'])
plt.title('Time Series Data')
plt.xlabel('Time')
plt.ylabel('Value')

# 自己相関のプロット
plt.subplot(2, 1, 2)
sns.barplot(x='Lag', y='ACF', data=acf_df)
plt.title('Autocorrelation Function')
plt.xlabel('Lags')
plt.ylabel('ACF')
plt.tight_layout()

plt.show()

パーシャル自己相関関数(PACF)

時系列データの自己相関を可視化する方法として、**パーシャル自己相関関数(PACF)**を用いる方法があります。PACFは、他の全てのラグの効果を除いた上での、特定のラグのデータポイント間の相関を表します。これにより、他のラグの影響を受けずに、特定のラグの影響力をより正確に評価することができます。

それでは、先ほどの時系列データに対して、パーシャル自己相関関数を計算し、そのグラフと時系列データのグラフを比較してみましょう。

上記のグラフには、先ほどの時系列データと、そのパーシャル自己相関関数(PACF)が表示されています。

  1. 時系列データのグラフ:以前と同様、時系列データがプロットされています。これはデータの時間的変動を示しています。

  2. パーシャル自己相関関数(PACF)のグラフ:このグラフは、特定のタイムラグでのデータポイント間の相関を、他の全てのラグの影響を排除した状態で示しています。PACFは特定のラグが時系列データに与える独立した影響を捉えるため、自己相関関数(ACF)よりも詳細な情報を提供します。

ACFとPACFを両方使って時系列データを分析することで、データの内部構造についてより深い理解を得ることができます。これらの情報は、ARIMAモデルのような時系列モデリングにおいて、適切なモデルのパラメータを選択する際に特に有用です。

from statsmodels.tsa.stattools import pacf

# パーシャル自己相関の計算
lag_pacf = pacf(df['Value'], nlags=20, method='ols')
pacf_df = pd.DataFrame({'Lag': range(len(lag_pacf)), 'PACF': lag_pacf})

# 時系列データのプロット
plt.figure(figsize=(12, 6))
plt.subplot(2, 1, 1)
plt.plot(df['Time'], df['Value'])
plt.title('Time Series Data')
plt.xlabel('Time')
plt.ylabel('Value')

# パーシャル自己相関のプロット
plt.subplot(2, 1, 2)
sns.barplot(x='Lag', y='PACF', data=pacf_df)
plt.title('Partial Autocorrelation Function')
plt.xlabel('Lags')
plt.ylabel('PACF')
plt.tight_layout()

plt.show()



この記事が気に入ったらサポートをしてみませんか?