0
0

相互相関の分析方法

Last updated at Posted at 2024-08-07

相互相関

とは、2つの時系列データの類似度の指標である。
相互相関解析では、遅れ (ラグ) と相互相関係数 (CCF) の2つの統計量が得られる。
相互相関係数の大きさは類似度を示す。

全体の目的

自己理解でExcelによってコレログラムを作成していたが、分析手法が正しいか不安。
統計ソフトウェアMinitab Statistical Softwareから得られた結果をExcel、Pythonで再現する。

使用データ

image.png
2つの時系列データC1, C2を手作りした。1日の環境変化量をイメージ。

Minitab

目的

・正しい相互相関係数 (CCF) を得る

手法

データを入力し、統計>時系列分析>相互相関と選択する。
ラグの範囲はデフォルトを使用した。

結果

コレログラム

image.png
ラグが3のとき相互相関係数は最大 (0.924) になった。

Excel

目的

・相互相関の計算方法の検証
・計算結果の比較

手法

2データの重複範囲の相関係数をCORREL関数を用いて計算する。

例:ラグが-10の場合

image.png
image.png
相互相関係数r = -0.58094

結果

image.png
ラグが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 ]

image.png

ラグが-3のとき相互相関係数は最大 (0.924) になった。
ラグの方向がMinitabやExcelと逆なのか、左右反転している。出力されたndarray配列 (xc_mp) を上下反転させて補正する。

ラグの方向の補正
np.flipud(xc_mp)

image.png
Minitabの結果とぴったり!

まとめ

Pythonから得られた分析結果は信頼できそう。
Excelを用いた計算方法の何が間違っているのか不明。

相互相関の解釈方法は以下のサイトを参照する。
↓     ↓     ↓     ↓     ↓
Minitab@ サポート メニュー>ヘルプと使用方法>統計モデリング>時系列>相互相関
セールス アナリティクス : 時系列データの自己相関と相互相関をPythonで求めてみよう
Qiita : 時系列データ分析の基本を勉強したのでまとめた。

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0