【Python】自己相関係数とコレログラムを簡単に紹介 〜Pythonでプロットしてみる〜

今回は統計検定とかにもよく出てくる自己相関係数とコレログラムについて紹介します!

自己相関と自己相関係数とは

自己相関とは、あるデータとそのデータを数タイムステップをずらしたデータとの相関のことを言います。

例えば、以下のようなsin波があるとします。

自己相関では、以下のように少しタイムステップをずらしたsin波との相関のことをいいます。

このずらしたタイムステップのことをラグと言います。

また、相関を数値化したものを自己相関係数といいます。

相関係数ですので、-1〜1までの値をとり、

  • 1に近ければ、正の相関がある
  • -1に近ければ、負の相関がある
  • 0に近ければ、相関がない

となります。

自己相関係数を数式で

ちなみに数式では以下のように定義します。

まず、データ\(X\)を以下のように定義します。

$$\begin{eqnarray}
X =
\begin{bmatrix}
x_0 \\
x_1 \\
\vdots \\
x_n \\
\end{bmatrix}
\end{eqnarray}$$

この時、ラグ\(L\)の自己相関係数\(r_L\)は

$$\begin{aligned}
r_L = \frac{\sum^{N-L}_{i=0}(x_i-\overline{x})(x_{i+L}-\overline{x})}{\sum^{N-L}_{i=0}(x_i-\overline{x})}
\end{aligned}$$

\(\overline{x} \)は\(X\)の平均値です。

コレログラム

コレログラムは自己相関係数をラグ毎にプロットしたグラフです。

横軸がラグで、縦軸が自己相関係数を表します。

sin波のコレログラムをpythonでプロットしてみます。

pandasのautocorrメソッドを使うことで自己相関係数を求めることができます。

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

# sin波の計算
x = np.linspace(-6 * np.pi, 6 * np.pi, 100)
sin = pd.Series(np.sin(x))

# 相関係数の計算
nb_lags = 40    # プロットするラグ数
autocorrs = [sin.autocorr(lag=lag) for lag in range(nb_lags)]

# プロット
fig, [ax1, ax2] = plt.subplots(2, 1, figsize=(10, 10))
ax1.plot(sin.index, sin)
ax1.set_title("sin波", fontsize="18")
ax2.bar(range(nb_lags), autocorrs)
ax2.set_title("コレログラム", fontsize="18")
ax2.set_xlabel("ラグ(Lag)", fontsize="18")

plt.show()

参考文献

補足

相関係数

2つのデータの関係を数量化したものを相関係数と言います。

タイトルとURLをコピーしました