相互相関の分析方法

# 相互相関
とは、2つの時系列データの類似度の指標である。
相互相関解析では、遅れ (ラグ) と相互相関係数 (CCF) の2つの統計量が得られる。
相互相関係数の大きさは類似度を示す。
### 全体の目的
自己理解でExcelによってコレログラムを作成していたが、分析手法が正しいか不安。
統計ソフトウェアMinitab Statistical Softwareから得られた結果をExcel、Pythonで再現する。

### 使用データ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657535/03576a36-3131-8bf6-7ede-b0e4310fa12f.png)
2つの時系列データC1, C2を手作りした。1日の環境変化量をイメージ。

## Minitab
### 目的
・正しい相互相関係数 (CCF) を得る
### 手法
データを入力し、統計＞時系列分析＞相互相関と選択する。
ラグの範囲はデフォルトを使用した。
### 結果
#### コレログラム
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657535/1f7d09ff-2bad-79dc-eb02-5baacd604527.png)
ラグが3のとき相互相関係数は最大 (0.924) になった。

## Excel
### 目的
・相互相関の計算方法の検証
・計算結果の比較
### 手法
2データの重複範囲の相関係数をCORREL関数を用いて計算する。
##### 例：ラグが-10の場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657535/45452fc7-69ec-a424-5e7e-c972b270029a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657535/78d3e9bf-0f15-139b-9dd3-d09b4ccf9078.png)
相互相関係数r = -0.58094
### 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657535/ad7d4878-f42c-09e2-324e-08cd4d0d99e6.png)
ラグが3のとき相互相関係数は最大 (0.972) になった。
大まかな傾向はMinitabから得られた結果と一致したが、局所的に過大評価・過小評価をしている。→計算手法が間違っている？

## Python
### 目的
・相互相関の計算方法の検証
・計算結果の比較
### 手法
データを標準化 (平均0、分散1に) して、matplotlib.pyplot.xcorrを用いる ([参考1](https://qiita.com/SHUsss/items/a357a33849d583093849), [参考2](https://www.salesanalytics.co.jp/datascience/datascience114/)) 。
```python:コード
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)
```
### 結果
```python:出力
[-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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657535/62f2b849-b34e-16dc-5f57-a4057e4104c4.png)

ラグが-3のとき相互相関係数は最大 (0.924) になった。
ラグの方向がMinitabやExcelと逆なのか、左右反転している。出力されたndarray配列 (xc_mp) を上下反転させて補正する。
```python:ラグの方向の補正
np.flipud(xc_mp)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657535/abd8d179-2612-1a4a-2ce0-72f08c739821.png)
Minitabの結果とぴったり！

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

相互相関の解釈方法は以下のサイトを参照する。
↓　　　　　↓　　　　　↓　　　　　↓　　　　　↓
[Minitab@ サポート メニュー＞ヘルプと使用方法＞統計モデリング＞時系列＞相互相関](https://support.minitab.com/ja-jp/minitab/help-and-how-to/statistical-modeling/time-series/how-to/cross-correlation/before-you-start/overview/)
[セールス アナリティクス : 時系列データの自己相関と相互相関をPythonで求めてみよう](https://www.salesanalytics.co.jp/datascience/datascience114/)
[Qiita : 時系列データ分析の基本を勉強したのでまとめた。](https://qiita.com/tomyu/items/3935eb40ed0a36d10253#%E6%99%82%E7%B3%BB%E5%88%97%E3%83%87%E3%83%BC%E3%82%BF%E3%81%A3%E3%81%A6%E4%BD%95%E3%81%A7%E3%81%99%E3%81%8B)