時系列分析3　時系列データの前処理

[Aidemy](https://aidemy.net/)　2020/10/29
#はじめに
　こんにちは、んがょぺです！バリバリの文系ですが、AIの可能性に興味を持ったのがきっかけで、AI特化型スクール「Aidemy」に通い、勉強しています。ここで得られた知識を皆さんと共有したいと思い、Qiitaでまとめています。以前のまとめ記事も多くの方に読んでいただけてとても嬉しいです。ありがとうございます！
　今回は、時系列分析の3つ目の投稿になります。どうぞよろしくお願いします。

＊本記事は「Aidemy」での学習内容を「自分の言葉で」まとめたものになります。表現の間違いや勘違いを含む可能性があります。ご了承ください。

今回学ぶこと
・時系列データをpandasで扱う
・時系列データを定常性にする方法

#時系列データをpandasで扱う
##データの読み込みと表示
・SARIMAで時系列データを分析することが最終目標ではあるが、このとき渡すデータに対してはいくつかの前処理を行う必要がある。
・時系列データがCSVファイルで与えられている場合、読み込みは
__pd.read_csv("ファイルパス")__　で行う。

##時間情報をインデックスに変換する
・時系列データの分析の際には、時間の情報（Hour,Monthなど）をインデックスに変換することで扱いやすくする。
・変換の手順は以下のようになる。
　①index情報を__pd.date_range("開始時","終了時",freq="間隔")__で定義する。
　②定義した情報を元のデータのインデックスに代入する。
　③元のデータの時間情報を削除する。

・①で入力する元のデータの開始時や終了時、間隔は__df.head()__や__df.tail()__で確認できる。
・また間隔に関しては、秒単位でデータが構成されている場合は「S」、分なら「min」、時間なら「H」、日なら「D」、月なら「M」を渡せば良い。

・コード![スクリーンショット 2020-10-29 14.00.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/8846bc71-71c3-998c-537b-cd65c3c57872.png)

・結果![スクリーンショット 2020-10-29 14.00.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/efb179c4-e69c-3c49-6315-bde299bfbfc4.png)

##データが定常性を持たないときの原因
・時系列データが定常性を持たないときの原因には、__「トレンド」__と「__季節変動」__があげられる。
・定常性があるときには期待値が一定であるはずだが、__正のトレンドがあった場合期待値は上昇傾向にあると言うことになる__ので、定常性があるとは言えない。
・同様に、定常性があるときには自己相関係数が一定であるはずだが、季節変動のあるデータ、すなわち一年の中で一時期だけ値が急増急落するようなデータでは、自己相関係数が一定であるとは言えない。

・このような場合は、__トレンド、季節変動を取り除く変換__を行えば定常性があるデータにすることができる。
・この定常化したデータでモデルを作成した後、再度トレンドや季節変動を合成して原系列のモデルを構築する。

#時系列データを定常性にする
##トレンド、季節変動の除去
・トレンド、季節変動を除去し、定常性を持たせるには、以下の4つの方法が挙げられる。詳しくは後述。
　・__対数変換__で変動の分散を一様にする
　・__移動平均__を取ってトレンドを推定し、それを除去する
　・__階差系列__に変換する（一般的）
　・__季節調整__を行う

##対数変換
・「時系列分析1」で見た通り、__対数変換__を行えばデータの値の変化を穏やかにすることができる。
・これを利用すると、季節変動のような急激な値の変化があるデータに対して、自己共分散を一様にすることができる。すなわち、__季節変動を除去することができる__。
・しかし、この方法では__トレンドが除去できない__ので、対数変換の他にトレンドを除去する処理を行う必要がある。
・対数変換は__np.log(データ)__で行える。

・コード![スクリーンショット 2020-10-29 14.03.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/f3df871c-656e-8524-0451-329add719538.png)

・結果![スクリーンショット 2020-10-29 14.03.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/447705c8-b9fd-4df5-94c1-c04840f6dc45.png)


##移動平均
・__移動平均__とは、__一定の区間の平均を取ると言うことを、区間を移動しながら行うこと__である。
・移動平均によって、元のデータの特徴を残しつつ、データを滑らかにすることができる。これにより、__季節変動を除去し、トレンドを抽出することができる__。
・例として、月ごとのデータに季節変動があるとき、12個の移動平均をとることで季節変動を除去できる。また、抽出したトレンドについても「(元の系列)-(移動平均)」で除去することができる。

・移動平均は以下のように算出できる。
__データ.rolling(window=移動平均の個数).mean()__

・コード（CO2濃度のデータ、51週間（1年間）ごとの移動平均をとる）![スクリーンショット 2020-10-29 14.08.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/3acdfc2c-6d10-a226-0f5c-740246fdfd67.png)

・結果![スクリーンショット 2020-10-29 14.08.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/b1662775-9436-06d6-173b-78733ceaf6c2.png)

##階差系列
・「時系列分析1」で見た通り、データを一つ前の値との差をとって扱うことを__階差系列__という。
・階差系列にすることで、トレンドと季節変動を除去することができる。簡単に行えるため、定常性を持たせるための最も一般的な方法である。
・階差系列を求めるには__データ.diff()__で求めることができる。
・一回階差系列を求めたものを一次階差系列といい、一次階差系列の階差系列を求めたものを二次階差系列という。

・コード![スクリーンショット 2020-10-29 14.09.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/bc547a8a-ee6f-aaf6-01e1-53a367ecadf3.png)

・結果![スクリーンショット 2020-10-29 14.09.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/9f8ed0bc-d3a3-543f-b80f-8b0a7a17d56f.png)


##季節調整
・「時系列分析1」で見た通り、季節調整済み系列にすることで、原系列からトレンドと季節変動を除去することができる。
・除去の仕組みとしては、「原系列＝トレンド＋季節変動＋残差」というように原系列は分解できるが、これを「残差＝原系列ー（トレンド＋季節変動）」というように変換すると残差は原系列からトレンドと季節変動を除去したものになる。これを利用している。
・季節調整済み系列にするには、__sm.tsa.seasonal_decompose(データ,freq=区間の指定)__を行えば良い。

・コード![スクリーンショット 2020-10-29 14.19.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/d35cd55e-e896-dd35-fe13-c71155db3fd6.png)

・結果![スクリーンショット 2020-10-29 14.19.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/dc2f14cd-6f70-f0d2-4092-60ba30444634.png)

#まとめ
・時系列分析を行う前に、時系列データの時間情報をインデックスにしておく。
・時系列モデルに渡すデータは定常性がなければいけないので、定常性のないデータに関しては階差系列にするなどの前処理を行う必要がある。

今回は以上です。最後まで読んでいただき、ありがとうございました。