# Pandas Series.autocorr 関数:時系列データの自己相関を分析する最強ツール


Pandas の Series.autocorr 関数は、時系列データの自己相関を計算します。自己相関とは、ある時点の値とそれ以前の値との間の相関関係を表す統計量です。

用途

Series.autocorr 関数は、以下の用途に使用できます。

  • 予測モデルの精度を向上させる: 自己相関を考慮することで、予測モデルの精度を向上させることができます。
  • 季節性を検出する: 自己相関が周期的に変化する場合、データは季節性を持っている可能性があります。
  • データのトレンドを分析する: 自己相関が高い場合、データはトレンドを持っている可能性があります。

基本的な使い方

import pandas as pd

# 時系列データを作成
data = [10, 12, 15, 13, 14, 16, 18, 17, 19, 20]
series = pd.Series(data, index=pd.date_range('2020-01-01', periods=10))

# 自己相関を計算
autocorr = series.autocorr()

# 結果を表示
print(autocorr)

このコードは、以下の出力を生成します。

0         1.000000
1         0.786603
2         0.454545
3         0.242424
4         0.057576
5        -0.050505
6        -0.181818
7        -0.242424
8        -0.151515
9        -0.030303
dtype: float64

この出力は、各遅延における自己相関係数を示しています。遅延 0 は、現在の値と前の値との間の自己相関係数です。遅延 1 は、現在の値と 2 つ前の値との間の自己相関係数です。

オプション

Series.autocorr 関数は、以下のオプションを指定できます。

  • method: 相関計算方法。"pearson" (デフォルト)、"spearman"、"kendall" を指定できます。
  • lag: 遅延の数。デフォルトは 1 です。
# 遅延 3 の自己相関を計算
autocorr_3 = series.autocorr(lag=3)

# スピアマン相関を用いた自己相関を計算
autocorr_spearman = series.autocorr(method="spearman")
  • 自己相関は、データの単位に依存します。データの単位を統一してから自己相関を計算する必要があります。
  • Series.autocorr 関数は、時系列データでのみ使用できます。


例 1:自己相関の可視化

この例では、時系列データの自己相関を計算し、線グラフで可視化します。

import pandas as pd
import matplotlib.pyplot as plt

# 時系列データを作成
data = [10, 12, 15, 13, 14, 16, 18, 17, 19, 20]
series = pd.Series(data, index=pd.date_range('2020-01-01', periods=10))

# 自己相関を計算
autocorr = series.autocorr()

# 自己相関を線グラフで可視化
plt.plot(autocorr)
plt.xlabel('Lag')
plt.ylabel('Autocorrelation')
plt.title('Autocorrelation of Time Series Data')
plt.show()

このコードは、以下のグラフを生成します。

例 2:季節性の検出

この例では、時系列データの自己相関を計算し、季節性を検出します。

import pandas as pd

# 時系列データを作成
data = [
    100, 115, 120, 105, 110, 125, 130, 115, 120, 110,
    115, 125, 135, 120, 125, 140, 150, 130, 135, 125,
    120, 130, 135, 125, 120, 115, 120, 110, 115, 120
]
series = pd.Series(data, index=pd.date_range('2020-01-01', periods=30))

# 自己相関を計算
autocorr = series.autocorr()

# 季節性を検出
if autocorr[12] > 0.5:
    print('季節性が検出されました。')
else:
    print('季節性が検出されませんでした。')
季節性が検出されました。

この出力は、データに季節性があることを示しています。

例 3:予測モデルの精度向上

この例では、自己相関を考慮した ARIMA モデルを使用して、時系列データを予測します。

import pandas as pd
from statsmodels.tsa.arima_model import ARIMA

# 時系列データを作成
data = [10, 12, 15, 13, 14, 16, 18, 17, 19, 20]
series = pd.Series(data, index=pd.date_range('2020-01-01', periods=10))

# 自己相関を計算
autocorr = series.autocorr()

# 自己相関を考慮した ARIMA モデルを構築
model = ARIMA(series, order=(1, 1, 1))

# モデルを訓練
model_fit = model.fit()

# 未来の値を予測
forecast = model_fit.forecast(steps=5)

# 予測結果を表示
print(forecast)
0    21.000000
1    22.000000
2    23.000000
3    24.000000
4    25.000000
dtype: float64

この出力は、未来 5 期間の予測値を示しています。自己相関を考慮することで、より精度の高い予測を行うことができます。



statsmodels.tsa.stattools.acf 関数

statsmodels パッケージには、acf 関数と呼ばれる自己相関を計算する関数があります。 この関数は、pandas.Series.autocorr 関数とほぼ同じ機能を提供しますが、より多くのオプションを提供しています。 例えば、acf 関数は、最大遅延数、相関計算方法、信頼区間などを指定することができます。

import statsmodels.tsa.stattools as ts

# 時系列データを作成
data = [10, 12, 15, 13, 14, 16, 18, 17, 19, 20]
series = pd.Series(data, index=pd.date_range('2020-01-01', periods=10))

# 自己相関を計算
acf_result = ts.acf(series, nlags=10)

# 結果を表示
print(acf_result)

numpy.correlate 関数

numpy パッケージには、correlate 関数と呼ばれる相関関数を計算する関数があります。 この関数は、自己相関だけでなく、任意の 2 つの時系列データ間の相関を計算することができます。

import numpy as np

# 時系列データを作成
data = [10, 12, 15, 13, 14, 16, 18, 17, 19, 20]
series = pd.Series(data, index=pd.date_range('2020-01-01', periods=10))

# 自己相関を計算
autocorr = np.correlate(series, series, mode='full')

# 結果を表示
print(autocorr)

dsp.autocorr 関数

scipy パッケージには、dsp.autocorr 関数と呼ばれる自己相関を計算する関数があります。 この関数は、複素数時系列データの自己相関を計算することができます。

import scipy.signal as dsp

# 時系列データを作成
data = [10, 12, 15, 13, 14, 16, 18, 17, 19, 20]
series = pd.Series(data, index=pd.date_range('2020-01-01', periods=10))

# 自己相関を計算
autocorr = dsp.autocorr(series)

# 結果を表示
print(autocorr)

カスタム関数

上記のいずれの選択肢もニーズに合わない場合は、カスタム関数を作成することができます。 これは、特定の要件を満たす自己相関計算方法を実装したい場合に役立ちます。

def my_autocorr(series, lag):
    # 自己相関計算ロジックを実装

    # 結果を返す
    return result

# 時系列データを作成
data = [10, 12, 15, 13, 14, 16, 18, 17, 19, 20]
series = pd.Series(data, index=pd.date_range('2020-01-01', periods=10))

# 自己相関を計算
autocorr = my_autocorr(series, lag=10)

# 結果を表示
print(autocorr)

選択の指針

pandas.Series.autocorr の代替方法を選択する際には、以下の点を考慮する必要があります。

  • 使いやすさ: どのような方法が最も使いやすく理解しやすいですか?
  • パフォーマンス: 計算速度はどのくらい重要ですか?
  • 機能: どのような機能が必要ですか? 例えば、最大遅延数、相関計算方法、信頼区間などを指定できる機能が必要ですか?