時系列分析:移動平均過程(MAモデル)の性質と定常性
時系列分析では、系列の統計量が時点に依存しないというシンプルな構造が基本となっています。まず定常性の元に基本的なモデルが構築され、そこから非定常のモデルに拡張されていくようです。そのため「定常かどうか」を議論されることが多いです。本投稿ではMA(q)モデルの性質と定常性を確認します。
定常性
我々が定常性を見る場合、以下2つのケースがあると思います
データの定常性の確認(定常性の推定)
モデルの定常性の確認
前者は観測したデータの構造を理解して、モデル化出来る構造があるかどうか見る際に行います。グラフを確認したり、検定したりです。後者は色々な時系列モデルの性質を理解するために行います。この際モデルは定式化されているので、その式を展開し、定常性の条件を満たしているか確認します。この投稿では[2]の定常性確認をMA(q)モデルに対して行います。
定常性の定義
を任意の定数とすると
を満たす時、その系列は弱定常といえます。は時点、は自己共分散、は時点のラグを表します。言葉でいうと系列の期待値と自己共分散が時点に依存しない ということです。自己共分散はの下付きは時刻に依存してないが、ラグには依存しても良いという気持ちが現れているのでしょう
移動平均過程 MA(q)の性質と定常性
ここから移動平均過程の性質と定常性について、一つ一つ確認していきます。
移動平均過程 MA(q)とは
移動平均過程では、現在の値 は過去のノイズからの影響を引きずっている(記憶している)と仮定します。 ここでは次のように定義します。
ここではホワイトノイズ
直感的に理解しにくいですが、以下に具体例としてスーパーマーケットの売上の例が書いてあります。
time series - Real-life examples of moving average processes - Cross Validated
リンクでは分析者が知らないところで発行されている裏クーポンがあるケースを考えています。分析者はクーポンの存在を知らないため、このクーポンによる売上増加は分析者からノイズに含まれて見えます。ノイズは裏クーポン有効開始日に跳ね上がって、徐々に減衰していきます。売上はこのノイズの影響を受け、自己相関関係が生まれます。MA(q)はこういった構造を記述できるようです。
モデルの性質と定常であるか確認してみます。
1. 期待値
移動平均過程の期待値をとってみるだけです
これは常に0で一定なので、期待値は時点に依存しません
式展開では期待値の線形性と なので を使っています。
2. 自己共分散
MA(q)のラグでの自己共分散は以下の様に書き下せます
式の括弧の中は、式の多項式の積の展開を行列の様に縦に方向に積み上げて表記したものです。なので式の括弧の中の項をすべて足し合わせ、期待値をとったものがになります。
ここでホワイトノイズの性質から次が成り立ちます
つまり式の括弧の中にある、例えば最初の項を考えると、2つのの下付きのとが一致しない場合、この項の期待値は0になります。結局2つのの下付きの値が一致する項のみを考慮すれば良いことになります。の下付きの値が一致する項はどういう時に現れるでしょうか。具体例で見てみます。
MA(2), k=0の場合:
2次の移動平均過程のラグが2での例をみてみます。つまりMAの自己共分散は
式にを代入して
2つのの下付きの値が一致するのは、括弧内の対角にある項のみで
2行目から3行目の展開は式(5)を利用しています。
MA(2), k=1の場合:
同様にの自己共分散は、式にを代入すると
MA(2), k=2の場合:
同様に式にを代入して
MA(2), k=3の場合:
さらにでも自己共分散を見てみましょう
ではの下付きが一致する項は存在しないので、すべての項の期待値は0になります。MA過程の次数より大きいラグ()での自己共分散は0になります
一般に:
の自己共分散は、において
では0になります。自己共分散はラグにのみ依存してに依存しません
3. 分散
分散は共分散のの場合なので
4. 自己相関係数
さらに自己相関係数は、共分散を分散で正規化したものなので
5.MA(q)の定常性
MA(q)の期待値と自己共分散は時点に依存しないため、移動平均過程は弱定常であるといえます
まとめ
移動平均過程MA(q) において
統計量 | 値 |
---|---|
期待値 | = 0] |
自己共分散 | |
分散 | |
自己相関 | |
定常性 | 常に弱定常を満たす |
以上です。時系列モデルは頭が混乱します。日々精進
参考
- 経済・ファイナンスデータの計量時系列分析 (統計ライブラリー) 単行本 – 2010/2/1 沖本 竜義 (著)
- Practical Time Series Analysis | Coursera
統計学習メモ:分散、共分散
データ分析の勉強をしていると期待値や分散の計算は非常によく使う。ほとんどこればっかりやっている感じ。 なので期待値や分散の性質は、一度納得したら覚えておくとスムーズ。 本記事では分散、共分散の定義や性質をまとめます。期待値のまとめはこちらから統計学習メモ:期待値 - 無粋な日々に
※本記事の定義や式の展開はソラで書いています。違和感や間違いがありましたら教えてもらえると嬉しいです。
定義
分散の定義
分散は変数の平均(重心)からの距離の期待値で定義される。変数の散らばりの程度を表すような統計量。 変数 の分散は
で定義される。ここで]はに関して期待値をとる操作を表す。どの変数に関して期待値を取るかが明確な場合は省略して]と表記することにする
共分散の定義
中心化された2変数の積の期待値で定義される。共分散は2変数の類似度を表すような統計量。 変数 の共分散は
で定義される。共分散をとの標準偏差で正規化すると相関係数になる。分散は共分散ののケースといえる
よく使う性質
1. 定数倍
変数を定数した変数の分散は、の分散の倍になる。つまりを定数とすると次が成り立つ
2. 分散公式
分散は(二乗の期待値) - (期待値の二乗) で計算できる。分散公式と呼ばれているらしい
次の展開を行えば導ける
分散は共分散ののケースと考えられるため、分散公式は共分散を以下のように展開し と考えても導ける
のとき
2. 独立な2変数の共分散は0
変数 とが独立なとき となる
ここでが互いに独立のときが成立するため
となり
3.分散の和
和の変数の分散は、分散の和 から共分散の2倍を足したものになる。つまり
ここでが互いに独立のときとなるため
分散の和についての導出は
展開では以下を用いている
- 1行目は分散公式
- 1行目から2行目、2行目から3行目は期待値の線形性とを利用
- 3行目から4行目は分散公式、分散・共分散の定義
統計学習メモ:期待値
データ分析の勉強をしていると期待値や分散の計算は非常によく使う。ほとんどこればっかりやっている感じ。 なので期待値や分散の性質は、一度納得したら覚えておくとスムーズ。 本記事では期待値の定義や性質をまとめます。分散、共分散のまとめはこちらから
※本記事の定義や式の展開はソラで書いています。違和感や間違いがありましたら教えてもらえると嬉しいです。
期待値の定義
連続型確率変数に関する の期待値は
] はに関して期待値をとる操作とする。
この期待値の定義や次の期待値の性質は分布を仮定せず、どんな分布でも使うことができる。 また具体的な期待値を計算する際は、確率密度関数(PDF)や確率質量関数(PMF)を設定して使うことになる。たとえば正規分布だと 。
よく使う期待値の性質
1. 定数の期待値
定数の期待値は定数になる(は定数)
2. 線形性
期待値は線形性をもつ
上の式は、が互いに独立でなくても成立する
3. 依存しない変数まわりの期待値
は変数に依存しないので、に関する操作は考えず、に関する期待値のみ考えれば良い
証明
1. 定数の期待値
定数は のケースで、 が確率変数に関係なく一定の値を取る場合に相当する
2. 線形性
複数の確率変数 の場合、期待値は同時確率 の計算となるため注意が必要だが、周辺化されるため結果は単純になる
2行目から3行目の変形は周辺化 を用いた。 が離散型確率変数の場合、期待値は総和 で定義されるが、この場合も次の期待値の性質は同様に成り立つ
3. 依存しない変数まわりの期待値
は周辺化により積分消去されるので関係なくなる
2行目から3行目の変形が周辺化 を用いている
例
期待値の線形性から和の期待値は期待値の和となるが、これはよく使う
例えば、正規分布に従う2つの変数と があり、平均がそれぞれ の正規分布に従うとする
との 和の確率変数 の平均は となる
誤差解析とか時系列、カルマンフィルタとかは比較的こういう考え方がよく出てくる印象
私は日頃よく以下が分からなくなることが多いです。
- 何周りの期待値を取っているのか
- 変数同士の独立を仮定しているのか
その整理のため書きました。日々精進
Python: 多次元のnumpy.arrayを1次元にするreshapeとravel
numpyの多次元配列を一次元配列にしたいときは、reshape(-1,)
かravel()
を使えば良い
import numpy as np # サンプルデータ生成(3 × 3) > x = np.arange(9).reshape(3, 3) # 表示 > x array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]) # 方法1 > x.reshape(-1,) array([0, 1, 2, 3, 4, 5, 6, 7, 8]) # 方法2 > np.ravel(x) array([0, 1, 2, 3, 4, 5, 6, 7, 8])
ねむい。ごきげんよう
Python: print関数の仕様
print関数って、意識せず使ってたけどこんな仕様なんですねぇ 面白かったので、いくつか見てみましょう。
複数引数がとれて、一気にprintできる
複数引数を渡すと、スペースで区切られて出力される
# 複数引数を与えてみる print('str1', 'str2', 'str3') #> str1 str2 str3
セパレタも選択できる
複数引数を出力する際のデフォルトのセパレタはスペースですが、これも変えられる これって、Rでいうpasteとprintを両方兼ね添えた感じですね
# セパレタを変えてみる print('str1', 'str2', 'str3', sep=':') #> str1:str2:str3
ってことはlistをアンパックしたりすればこんな事もできますね
# リストをアンパックして渡して、全部の要素を接続 x = ['a', 'b', 'c'] print(*x, sep='') #> abc
引数渡さなくてもいい(笑)
何も引数を渡さないと、end仮引数でデフォルトで指定されている\n
改行が出力される。
endを指定することで、第1引数の出力後のお尻を何で締めくくるか決めれるみたい
# エラーにはならず、改行が出力(見えんけど) print() #> # end引数に値を渡すと、出力のお尻を何で締めくくるか決められる print('str1', end='end') #> str1end
出力先も変えられる
標準出力(sys.stdout)以外にもwrite(string) メソッドを持つオブジェクトならなんでも出力できるみたいです。 例えば普通にファイルにも出力できる
# out.txtファイルに`str`が出力されます with open('out.txt', 'w') as f: print('str', file=f)
flushオプションはわからん
バッファするかどうか、指定するみたいですが私にはわからなかったのでどう使うのか、誰か教えてください。
ドキュメントに書いてること
print(*objects, sep=‘ ’, end=‘\n’, file=sys.stdout, flush=False)
objects (単数でも複数でも可) を sep で区切りながらテキストストリーム file に表示し、最後に end を表示します。sep、end、file を与える場合、キーワード引数として与える必要があります。 キーワードなしの引数はすべて、 str() がするように文字列に変換され、 sep で区切られながらストリームに書き出され、最後に end が続きます。 sep と end の両方とも、文字列でなければなりません。これらを None にすると、デフォルトの値が使われます。 objects が与えられなければ、 print() は end だけを書き出します。 file 引数は、 write(string) メソッドを持つオブジェクトでなければなりません。指定されないか、 None である場合、 sys.stdout が使われます。表示される引数は全てテキスト文字列に変換されますから、 print() はバイナリモードファイルオブジェクトには使用できません。代わりに file.write(…) を使ってください。 出力がバッファ化されるかどうかは通常 file で決まりますが、flush キーワード引数が真ならストリームは強制的にフラッシュされます。 バージョン 3.3 で変更: キーワード引数 flush が追加されました。
ではごきげんよう。
pandas.DataFrameのplotメソッドとsubplotを使って、複数グラフを柔軟にプロットする
pandasのデータフレームのplotメソッドは超便利でよくお世話になる。 複数カラムを別々のグラフに出力したい場合もsubplot=Trueを指定するだけいいので結構程度便利なんだけど、 もう少し柔軟にプロットしたい時がある。
例えば、
- カラム1とカラム2は1つ目のグラフに表示、カラム3とカラム4は2つ目のグラフに表示したい
- グラフごとにタイトル変えたい
- 軸をグラフごとに柔軟に変更したい
こういうときは、pyplotのsubplotとpandas.DataFrame.plotのあわせ技でプロットすると良いんではないだろうか 例えば以下のような感じ。あとは必要に応じて軸のformatterとか個別に設定するば良いんじゃないかと
Python: jsonな文字列に対してformatメソッドを使う
jsonな文字列に対してformatメソッドを使う方法
pythonでjson形式を含む文字列をformatメソッドを使う場合ちょっと工夫が必要だ。
例えば、以下のような文字列に対してformat
メソッドを使うとエラーが出る
# jsonな文字列 json_str = """\ {'member':'{name}', 'age': 26} """ # formatメソッドで値を指定しようとすると prof = json_str.format(name='john') # エラーが出る --------------------------------------------------------------------------- KeyError Traceback (most recent call last) <ipython-input-44-686c908f6197> in <module>() ----> 1 json_str.format(**{name='john'}) KeyError: "'member'"
これはプレースホルダのkeyとjsonのフォーマットのkeyをformat
メソッドが区別できないかららしい。以下のように文字列中のjson用の{}を二重にしてあげるとエラーは出ない。(深い理由は知らないです。ご存知のかた教えてください)
# jsonな文字列。{}を2重にする json_str = """\ {{'member':'{name}', 'age': 26}} """ prof = json_str.format(name='john') # エラーは出ない。 print(eval(prof)) #> {'age': 26, 'member': 'john'}
json形式の文字列から、eval関数を使ってdict型のデータを生成することはよくあるので知っておくとよい。