COVID-19とU-NEXTのGoogle Trendデータを用いた時系列解析

Googleトレンドでは過去５年間分の人気度データを見れます．
コロナによる行動変容を見る上で，ある時系列データをSTL分解して，ある時系列データへのグレンジャー因果性を見たいなーと思って作りました．

①Google Trendで調べたいワードを過去５年分のデータで探す．日中はサーバーが重いのかよくエラーになるのでF5連打しているとそのうち表示される．

②得たcsvデータを以下の画像のように加工．（上２行を消し，未満という文字が入っているところがあったら未満を消す）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3064963/3fa5a53d-b308-d98a-d7f4-69944031908f.png)

③以下のプログラムを回す

```python
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.tsa.seasonal import STL

Data1=pd.read_csv('COVID-19.csv',index_col="週")
Data2=pd.read_csv('U-NEXT.csv',index_col="週")

# ライブラリで自己相関係数，偏自己相関係数を求める（グラフ付き）
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf

MAX_LAG=40

fig = plt.figure(figsize=(12,8))
ax1 = fig.add_subplot(211)
plot_acf(Data2, lags=MAX_LAG, ax=ax1)
plt.xticks(range(0, MAX_LAG+1, 6))
plt.grid()

ax2 = fig.add_subplot(212)
plot_pacf(Data2, lags=MAX_LAG, ax=ax2)
plt.xticks(range(0, MAX_LAG+1, 6))
plt.grid()


# STL分解の実行
stl = STL(Data2['U-NEXT: (日本)'], period=17)
result = stl.fit()
# 分解された成分の取得
trend = result.trend
seasonal = result.seasonal
resid = result.resid

# 結果の可視化
plt.figure(figsize=(10, 8))
plt.subplot(411)
plt.plot(Data2, label='Original')
plt.legend(loc='best')
plt.title('Original Data')

plt.subplot(412)
plt.plot(trend, label='Trend')
plt.legend(loc='best')
plt.title('Trend Component')

plt.subplot(413)
plt.plot(seasonal, label='Seasonality')
plt.legend(loc='best')
plt.title('Seasonal Component')

plt.subplot(414)
plt.plot(resid, label='Residual')
plt.legend(loc='best')
plt.title('Residual Component')
plt.tight_layout()

from statsmodels.tsa.api import VAR

print(Data1)
Data=Data1
Data['trend']=trend
Data['seasonal']=seasonal
Data['resid']=resid


print(Data)

# モデルのインスタンス生成
var_model = VAR(Data.diff().dropna())
# モデルを構築
results = var_model.fit(maxlags=10, ic='aic')
col = Data.columns

# グレンジャー因果性を確認
for i in col: # colはモデルに入れた変数
    for j in col:
        print(i, '→', j, results.test_causality(caused=i,causing=j).pvalue)

# (直行化)インパルス応答関数
period = 10
irf = results.irf(period)
irf.plot(orth=True)
plt.show()
```

④結果

自己相関と偏自己相関の図．これを参考にSTL分解のperiodを決めた．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3064963/bb199eb0-9d06-fe74-66f9-1f1eb77c70a2.png)

STL分解の図．軸が終わってるのは拾い物のためご愛嬌（回転させたり別でリスト作れば容易に解決します）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3064963/ae69c508-6d39-80c6-bb4a-a63e62d79297.png)

グレンジャー因果の出力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3064963/52486cc6-8d99-d692-bac4-a1af80579183.png)
これらはp値です．なので両側90%で検定するなら0.05以下が帰無仮説を棄却してグレンジャー因果があるという話になるっぽいです．COVID-19の影響→残差があったら面白いなと思っていたのですが，逆の因果はあるけれど，って感じみたいですね．もうちょっとGoogleトレンドのワード自体でいいものを探す必要があるかもしれません．

インパルス応答
限界効用的なものらしいですね．制御でもインパルス応答はありますし，Shapもやってることは限界効用なので，感度分析は大事っぽいです．（図的にもわかりやすいです）
ただ，目的のグレンジャー因果が出てないのでなんとも的な感じではあります．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3064963/00c79818-68a0-7da1-ffd5-6a7f5050e326.png)

[参考文献・【実践時系列解析】グレンジャー因果検定とインパルス応答関数](https://qiita.com/icchi-ioo/items/09a8b69f04085ad3267c)
[参考文献・【気象データで時系列解析②】自己相関係数・偏自己相関係数](https://qiita.com/matsuda_tkm/items/8a7958b0127c28c73029)
[参考文献・ビジネスデータを解き明かす！ Python STL分解で時系列データを理解しよう](https://www.salesanalytics.co.jp/datascience/datascience226/)