相互相関
とは、2つの時系列データの類似度の指標である。
相互相関解析では、遅れ (ラグ) と相互相関係数 (CCF) の2つの統計量が得られる。
相互相関係数の大きさは類似度を示す。
全体の目的
自己理解でExcelによってコレログラムを作成していたが、分析手法が正しいか不安。
統計ソフトウェアMinitab Statistical Softwareから得られた結果をExcel、Pythonで再現する。
使用データ
2つの時系列データC1, C2を手作りした。1日の環境変化量をイメージ。
Minitab
目的
・正しい相互相関係数 (CCF) を得る
手法
データを入力し、統計>時系列分析>相互相関と選択する。
ラグの範囲はデフォルトを使用した。
結果
コレログラム
ラグが3のとき相互相関係数は最大 (0.924) になった。
Excel
目的
・相互相関の計算方法の検証
・計算結果の比較
手法
2データの重複範囲の相関係数をCORREL関数を用いて計算する。
例:ラグが-10の場合
結果
ラグが3のとき相互相関係数は最大 (0.972) になった。
大まかな傾向はMinitabから得られた結果と一致したが、局所的に過大評価・過小評価をしている。→計算手法が間違っている?
Python
目的
・相互相関の計算方法の検証
・計算結果の比較
手法
データを標準化 (平均0、分散1に) して、matplotlib.pyplot.xcorrを用いる (参考1, 参考2) 。
import math
import numpy as np
from scipy import stats
from matplotlib.pyplot import xcorr
C1 = np.array([1, 2, 1, 2, 3, 2, 3, 1, 1, 1, 3, 8, 14, 22, 26, 40, 38, 40, 36, 32, 27, 28, 25, 24, 21, 18, 16, 14, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 1, 1, 3, 2, 2, 3, 1, 1, 2], dtype=float)
C2 = np.array([1, 1, 1, 3, 1, 2, 2, 2, 1, 2, 3, 1, 1, 4, 10, 18, 23, 27, 34, 39, 37, 38, 34, 31, 29, 27, 27, 26, 25, 24, 21, 19, 17, 14, 13, 12, 10, 8, 7, 7, 5, 4, 3, 2, 1, 1, 3, 3], dtype=float)
C1_std = stats.zscore(C1) #標準化
C2_std = stats.zscore(C2) #標準化
N = len(C1) #データ数
ML = math.floor(np.sqrt(N) + 10) #遅れの範囲
lags, xc_mp, fig, ax = xcorr(C1_std, C2_std, maxlags=ML)
print(lags)
print(xc_mp)
結果
[-16 -15 -14 -13 -12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0 1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16]
[-0.24885638 -0.17205831 -0.0823837 0.01555624 0.11755925 0.22220718
0.3269769 0.43982926 0.55644888 0.66985806 0.77394046 0.85463629
0.91181505 0.92401296 0.90212285 0.84529211 0.76145544 0.62592125
0.48370517 0.33437221 0.19046827 0.06174645 -0.060424 -0.1720061
-0.27592319 -0.37160975 -0.45685587 -0.52872953 -0.57761685 -0.61214858
-0.62342424 -0.62216269 -0.5884401 ]
ラグが-3のとき相互相関係数は最大 (0.924) になった。
ラグの方向がMinitabやExcelと逆なのか、左右反転している。出力されたndarray配列 (xc_mp) を上下反転させて補正する。
np.flipud(xc_mp)
まとめ
Pythonから得られた分析結果は信頼できそう。
Excelを用いた計算方法の何が間違っているのか不明。
相互相関の解釈方法は以下のサイトを参照する。
↓ ↓ ↓ ↓ ↓
Minitab@ サポート メニュー>ヘルプと使用方法>統計モデリング>時系列>相互相関
セールス アナリティクス : 時系列データの自己相関と相互相関をPythonで求めてみよう
Qiita : 時系列データ分析の基本を勉強したのでまとめた。