今回は統計検定とかにもよく出てくる自己相関係数とコレログラムについて紹介します!
自己相関と自己相関係数とは
自己相関とは、あるデータとそのデータを数タイムステップをずらしたデータとの相関のことを言います。
例えば、以下のようなsin波があるとします。
自己相関は、元のsin派と少しタイムステップをずらしたsin波との相関のことです。
このずらしたタイムステップのことをラグと言います。
また、相関を数値化したものを自己相関係数といいます。
相関係数ですので、-1〜1までの値をとり、
- 1に近ければ、正の相関がある
- -1に近ければ、負の相関がある
- 0に近ければ、相関がない
となります。
自己相関係数を数式で
ちなみに数式では以下のように定義します。
まず、データ\(X\)を以下のように定義します。
$$\begin{eqnarray}
X =
\begin{bmatrix}
x_0 \\
x_1 \\
\vdots \\
x_n \\
\end{bmatrix}
\end{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}$$
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()
参考文献
- 現場で使える!pandasデータ前処理入門 機械学習・データサイエンスで役立つ前処理手法
- http://ocw.nagoya-u.jp/files/71/jiko-soukan.pdf
- https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.autocorr.html
補足
相関係数
2つのデータの関係を数量化したものを相関係数と言います。