日大文系卒が学ぶ時系列解析②　~自己相関関数/定常性/波形分解~

## 初めに。
前回の続きです。前回は[こちら](https://qiita.com/The_Boys/private/40233521bf8d7fe82093)。　


### 前回のあらすじ
時系列解析の概念とボキャブラリーを紹介致しました。
今回も同じです。まずはきちっとボキャブラリーを増やして理解する事。
`長文読解するには英単語から`みたいなイメージで進めています。

##### バックナンバーはこちら。
- [日大文系卒が学ぶ時系列解析①　~概念と用語紹介~](https://qiita.com/The_Boys/items/40233521bf8d7fe82093)
- [日大文系卒が学ぶ時系列解析②　~自己相関関数/定常性/波形分解~](https://qiita.com/The_Boys/items/0224076f1cd722d8bca3)
- [日大文系卒が学ぶ時系列解析③　~モデル~](https://qiita.com/The_Boys/private/deabab92dfb89f05e697)
- [日大文系卒が学ぶ時系列解析④　~実践~](https://qiita.com/The_Boys/private/284b250869fb380bc125)
- 
## 学習

### 事前知識

平均/期待値　分散　標準偏差
私は分散や標準偏差は社会人になってから勉強し始めました。やばいでしょ。



共分散
xの分散とyの分散の平均。
`A(英語の点数)の分散` と `B(数学の点数）の分散` の平均　＝　`英語と数学の共分散`

難しい数式はひとまずスルーで。

### 自己共分散
共分散に時系列の概念を取り入れたもの。
<font color="red">自己共分散</font> = `共分散` + `時系列(現在や過去の概念)`


例：`今季の英語テストの分散(基準点)` と `前期の英語テストの分散(過去)`の平均 = `自己共分散`

#### <font color="red">自己相関係数ACF</font>:Autocorrelation Function
現在のデータと過去の値がどれほど似ているか、相関関係があるか。確認できるもの。

#### コレログラム

自己相関係数をグラフにしたもの

まずはコレログラムから説明させてください。下記がコレログラムです。
コレログラムの利点：`周期性が分かる` (伏線を張りました。今はピンと来なくて結構です。)　相関関係が分かる。


![2022-08-05_18h55_20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2719278/11877c2b-0b85-bf45-5f83-aa0dfb156624.png)

そしてこれがこのコレログラムを作成した材料の折れ線グラフです。

![111.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2719278/ac7cd647-9234-8127-be36-f901c4e37da9.jpeg)

青とオレンジは現在のデータと過去のデータを比較しております。
<font color="blue">青</font>：現在のデータ。　<font color="red">オレンジ</font>：過去データ。

当然現在と過去のデータを並べているので、ズレてますよね。
その`ずらし具合`なんですけど、できるだけズレの少ない(ラグがない)ポイントを探そう。という事です。


１２が`ズレ(ラグ)`が少ない⇒良い！という事です。

![111.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2719278/960e6601-0db6-dada-c0ab-825090d602e6.jpeg)

詳しくはこちら

https://data-viz-lab.com/correlogram




### Pythonでコレログラムを実装する
実際にpythonで確認してみましょう。

```python
#モジュールインポート
import pandas as pd
from datetime import datetime
import seaborn as sns
import matplotlib.pyplot as plt

#データの読込。平均気温のデータです。
df = pd.read_csv("3-2_TS_sample2.csv",index_col="年月日",encoding="shift_jis",parse_dates=True)
df.head(5)

#コレログラム作成モジュール　インポート
import statsmodels.api as sm

plt.rc("figure",figsize=(20,10))  #大きさの設定

# コレログラム作成
res = sm.graphics.tsa.plot_acf(df["平均気温(℃)"],lags=400)
```

![2022-08-05_19h04_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2719278/1a15974c-df49-f5bd-fb18-e87c2917b7ce.png)

データは[こちらのサイトの「自己相関、コレログラム、波形分解」](https://analysis-navi.com/?p=3868)

#### グラフの見方。

`sm.graphics.tsa.plot_acf()`：グラフ作成
第一引数はデータ、第二引数は`lags`
`lags`：どのくらいずらすか。ちょっとずらすのか思いっきりとずらすのか。
上の折れ線グラフ｢ラグ1｣｢ラグ2｣｢ラグ3｣ を参照してください。

<font color="red">横軸</font>：X軸をどのくらいずらしたか。`lags`は400と設定しましたので、X軸の最大は400です。
<font color="blue">縦軸</font>：相関関係。1.00が正の相関があり、-1.00が負の相関。そして0は相関関係なし。

:::note info
考察
- 例えば1や5ズラしてもあまり相関はありますよね。「昨日と今日の気温どんだけ違うの？」と言われても大差ないですよね。
しかし90~100ずらしてはいかがでしょう？`3カ月だから夏と秋`。さすがに温度の相関は取れませんよね。逆に半年､180くらいは`夏と冬`負の相関は取れています。

- そのように考えると、`365周期`なのでは？　という事が見受けられるのです。
:::


## 定常性

どんな時点、どんな時間差でも変わらない変化。現在や過去でも変わらない変化。
定常性が強い項目⇒時間の影響を受けない。トレンドは持たない。データ。
`時間の経過によらず一定の値を軸とし、同程度の幅で振れて変化する`
⇒現実世界には、こうしたデータはほとんど存在しません。
でも時系列解析の際には定常性の確認を可視化して行う事。⇒`ADF検定`というもので確認します。

例：500Vの電圧のデータ。⇒一定の電圧で一定の振れ幅。

:::note info
定常性があるデータをそのまま時系列分析してはいけません。
⇒時系列解析の意味をなさないし、疑似相関が生じるからです。
:::

言い換えると、定常性のあるデータに時系列という概念を組み込んではいけません。
- 


https://ailearn.biz/learn/20200830772#i-7

### ホワイトノイズ

定常性があるデータの振れ幅の部分。

イメージはこちら。
```python
import pandas as pd
import matplotlib.pyplot as plt
import statsmodels.api as sm
import numpy as np
from pandas import datetime
#ホワイトノイズの設定
mean = 0
std = 1
num_samples = 1000
samples = np.random.normal(mean, std, size=num_samples)
# ホワイトノイズのプロット
plt.title("Whitenoise")
plt.plot(samples)
plt.show()
```
このギザギザ部分です。定常性のあるデータは時系列関係なしに一定なのですが、その一定の中でも同一の振れ幅はありますよね。その部分の事です。
![2022-08-05_14h01_14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2719278/6228e7f4-feae-54d7-b539-ef30ee587b1c.png)



#### 波形分解。
用語を蓄え多少レベルアップした所でグラフをお見せ致します。

データは[こちらのサイトの「自己相関、コレログラム、波形分解」](https://analysis-navi.com/?p=3868)
```python
import pandas as pd
from datetime import datetime

#データの読込。平均気温のデータです。
df = pd.read_csv("3-2_TS_sample2.csv",index_col="年月日",encoding="shift_jis",parse_dates=True)

#第一引数にデータを格納｡ 第二引数には周期を指定。今回は365｡
x = sm.tsa.seasonal_decompose(df["平均気温(℃)"].values,freq=365).plot()
```
![2022-08-05_21h54_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2719278/8e9753be-d387-f850-d133-3bb32db91ca1.png)

これは何ですか？というと、<font color="red">波形分解</font>です｡
その名の通り一つの原系列を分解しています。　一つのおもちゃを分解して部品ごとに確認するように。

- Observed : 元の時系列データです。
- Seasonabl: 1つの波が繰り返されています。
- Trend    : 考えとしてObservedからSeasonableを抜いたデータです。
夏暑い、冬寒いという当たり前の要素を抜いた時、どうなっているかを確認する事が出来ます。
平均気温、例年と比較して低い周期がある、高い周期がある等比較できます。
![2022-08-05_22h03_48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2719278/d330f827-0e1b-8b98-2e96-c2c5884820bc.png)
- 残差(residual)：細かい誤差、ノイズです。計算に入れる事が出来ず、傾向を知るうえで邪魔な外れ値みたいなものと考えております。

:::note info
`トレンド(Trend)`+`季節調整済みモデル(Seasonabl)`+`残差(residual)`=`原系列(Observed)`
:::

## 終わりに

だんだんとしんどくなっていきますね。正直、自己共分散についてはまだ説明や理解が足りませんよね私自身の。今結構な勢いで時系列解析の資料を読み漁っているのでこの記事も私の成長に合わせてアップデートする予定です:relieved:。

次回は謎の暗号`ARMA`(アーマ)､`ARIMA`(アリマ)､`SARIMA`(サリマ)etc､について学んでいこうと思います。



## 参照

https://data-viz-lab.com/correlogram

https://analysis-navi.com/?p=3868

https://www.youtube.com/watch?v=e6jSPo80iHI