ITの隊長のブログ

ITの隊長のブログです。Rubyを使って仕事しています。最近も色々やっているお(^ω^ = ^ω^)

時系列の勉強雑メモ

スポンサードリンク

これまでゴリ推してきた時系列をなんとか数式含め脳内補完できないかなといことで再勉強中です。

早速ですが、ホワイトノイズは自己相関が0らしいので、本当か試してみる。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt


dlen = 1024 #ノイズデータのデータ長
mean = 0.0  #ノイズの平均値
std  = 1.0  #ノイズの分散

y = np.random.normal(mean, std, dlen)

_, ax = plt.subplots(figsize=(30, 5))
ax.plot(y)
plt.show()

f:id:aipacommander:20200410021846p:plain

自己相関係数を計算する関数をパクって用意。

def autocorrelation(y, lag=40):
    # 自己相関係数を試しに計算してみた(Numpy利用)
    y_mean = np.mean(y) # 乗客数の平均値
    under = np.sum((y - y_mean) ** 2) 

    # ラグ0の自己相関係数:1.0
    rk = [1]

    # ラグ1〜40の自己相関係数:-1.0〜1.0
    rk += [np.sum((y[k:] - y_mean) * (y[:-k] - y_mean)) / under for k in range(1, lag + 1)]

    return np.array(rk)

momonoki2017.blogspot.com

a = autocorrelation(y, lag=40)
_, ax = plt.subplots(figsize=(100, 20))
ax.stem(np.arange(len(a)), a, use_line_collection=True)
plt.show()

f:id:aipacommander:20200410021956p:plain

さてはて、ここからが言語化です。雑メモ。

lagをもう少しわかりやすくしたさ

  • 今回のデータは1024日分のデータを(ランダムで生成)用意
  • コレログラムの1個目はlag=1のときのデータ → k=1のズレで算出したもの
    • 2日 ~ 1024日目と1日 ~ 1023日目で算出
    • 30日 ~ 1024日目と1日 ~ 994日目で算出
    • 35日 ~ 1024日目と1日 ~ 989日目で算出
  • 求めたいものって何だっけ? → 周期とかズレでどの程度相関があるかそれぞれ確認する
  • いろいろ情報漁っている中で、6個目は「このコレログラムを素直に受け取れば現在と6日前までは自己相関を表している」という説明があったけど、ほんとう???
    • lag=6のときのデータは、6日 ~ 1024日目と1日 ~ 1018日目で算出
    • やっぱりギャップがある. 現在のデータ is 何? と仮に正しいとしても、計算は点ではなく範囲で計算している(つまり6日目の値ではなく6日目〜のデータを使っている)
    • ん? 6日前 か → 1日 ~ 1018日目 これは確かに6日前かな?(6日前までのデータ)
    • 現在とさしているのは、現在(1024日目) 〜 6日目まで
    • わかったかもしれん、1024日目は1024 - 6 = 1018日目なので、現在と6日前のデータで計算している(計算途中)
    • → これをズラした分だけ行う。ということか

これ、一年前もやった気がする。。。忘れたイメージを取り戻すの大変orz