Googleトレンドでは過去5年間分の人気度データを見れます.
コロナによる行動変容を見る上で,ある時系列データをSTL分解して,ある時系列データへのグレンジャー因果性を見たいなーと思って作りました.
①Google Trendで調べたいワードを過去5年分のデータで探す.日中はサーバーが重いのかよくエラーになるのでF5連打しているとそのうち表示される.
②得たcsvデータを以下の画像のように加工.(上2行を消し,未満という文字が入っているところがあったら未満を消す)
③以下のプログラムを回す
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を決めた.
STL分解の図.軸が終わってるのは拾い物のためご愛嬌(回転させたり別でリスト作れば容易に解決します)
グレンジャー因果の出力
これらはp値です.なので両側90%で検定するなら0.05以下が帰無仮説を棄却してグレンジャー因果があるという話になるっぽいです.COVID-19の影響→残差があったら面白いなと思っていたのですが,逆の因果はあるけれど,って感じみたいですね.もうちょっとGoogleトレンドのワード自体でいいものを探す必要があるかもしれません.
インパルス応答
限界効用的なものらしいですね.制御でもインパルス応答はありますし,Shapもやってることは限界効用なので,感度分析は大事っぽいです.(図的にもわかりやすいです)
ただ,目的のグレンジャー因果が出てないのでなんとも的な感じではあります.
参考文献・【実践時系列解析】グレンジャー因果検定とインパルス応答関数
参考文献・【気象データで時系列解析②】自己相関係数・偏自己相関係数
参考文献・ビジネスデータを解き明かす! Python STL分解で時系列データを理解しよう