はじめに
時系列データを扱っていると、
- このデータには周期性があるのか?
- 周期性があるとしたら、どのくらいの周期なのか?
- その周期性は時間によって変化していないか?
といったことを確認したくなることがあります。
例えば、スマートフォンの加速度センサから取得した歩行データや、Webページのアクセス数、自然現象の観測データなど、種類の異なるデータにも周期的な変動が現れることがあります。
今回は、私が開発している周期性解析ライブラリ bedcmm を使って、いくつかの実データを解析してみます。
また、同じデータに対して bedcmm・自己相関・FFT を適用し、結果を比較できる簡単なWebアプリケーション Periodicity Lab も作成しました。
この記事では、このLABを使って実際のデータにどのような周期構造が見えるのかを確認してみます。
機械学習の予測の下調べなどにも役に立つかと思います。
bedcmmとは
bedcmm は、時系列データの周期性を解析するために開発しているPythonライブラリです。
周期性解析ではFFTや自己相関などがよく利用されますが、bedcmmでは別のアプローチから時系列データに含まれる周期構造を評価します。
今回の記事ではアルゴリズムそのものの詳細ではなく、実データに適用したときにどのような結果が得られるのかを見ていきます。
Periodicity Lab
今回、周期性解析の結果を確認しやすくするために、Streamlitを使って Periodicity Lab を作成しました。
CSV形式の時系列データを読み込み、一定のWindowをずらしながら周期性を解析します。
解析結果は、
- 元の時系列波形
- bedcmm
- 自己相関
- FFT
について、それぞれ時間方向の変化をヒートマップとして表示します。
さらに、任意の時刻を選択すると、その時刻の解析結果を3つの手法で比較できます。
解析の流れ
時系列データ
↓
Window / Hop Sizeを設定
↓
各Windowで周期性を解析
↓
時間 × 周期のヒートマップを作成
↓
bedcmm / 自己相関 / FFTを比較
このようにすることで、単に「このデータには周期があります」という結果だけではなく、
「どの周期が、いつ現れているのか」
を確認できます。
1. スマートフォンの加速度から歩行周期を見る
まずは、スマートフォンの加速度センサから取得した歩行データを解析してみます。
自分で歩いてデータを取得しました。
歩行では、足を動かすという一定の動作を繰り返すため、加速度にも周期的な変動が現れます。
元データ
まず、取得した加速度データを時系列として確認します。
周期的な波形が繰り返し現れていることが分かります。
bedcmmによる解析
次に、同じデータをbedcmmで解析します。
横軸を時間、縦軸を周期として、各Windowにおける周期性をヒートマップとして表示しています。
歩行に対応する周期付近に周期性が現れていることが確認できます。
ここで面白いのは、1回の解析結果だけを見るのではなく、Windowをずらしながら解析することで、
歩行中の周期性が時間とともにどのように変化しているか
を見ることができる点です。
自己相関との比較
同じデータについて自己相関も計算してみます。
自己相関では、ある時点の波形と一定時間ずれた波形の類似性を見ることができます。
周期的な信号であれば、周期に対応する遅延時間で自己相関が高くなります。
歩行データでも、周期に対応する位置にピークが現れています。
FFTとの比較
最後にFFTを使って周波数領域で確認します。
FFTでは、どの周波数成分が強いのかを確認できます。
周期と周波数には、
周期 = 1 / 周波数
という関係があるため、FFTで見つかった周波数から周期を考えることができます。
歩行データでは、周期的な動作に対応した周波数成分が現れています。
対数圧縮をかけていないので見づらいですが、振動が強い所で低い周波数にピークが出ている事が確認できます。
2. Wikipediaのページビューを解析する
次は、まったく異なる種類のデータを見てみます。
Wikipediaのページビューです。
歩行のような物理的な運動ではありませんが、人間の活動には時間的な周期があります。
例えば、曜日や時間帯によってWebサイトへのアクセス数が変化することがあります。
そこで、Wikipediaのページビューに周期性が存在するのかを解析してみます。
元データ
ページビューは時間によって大きく変動しています。
一見するとノイズのように見える変動もありますが、周期性解析を行うことで、その中に含まれる規則的な変動を確認できます。
Periodicity Labで解析
bedcmmで解析してみます。
二次元マップだと見づらくなってしまっているので、データを拡大した時刻の周期を見てみます。
1週間で周期性が出ている事が確認できます。
acは、正規化していないため1週間周期が見づらくなってしまっています。
歩行データとは異なり、人間の活動によって生じる周期的な変化を観察することができます。
このように、周期性解析はセンサデータだけではなく、Webアクセスのような社会活動に由来する時系列データにも利用できます。
3. 太陽黒点数を解析する
最後に、さらに長い時間スケールのデータを見てみます。
使用したのは太陽黒点数のデータです。
太陽黒点数には長期的な周期変動が知られています。
今回使用したデータは、SILSO(Royal Observatory of Belgium)のデータです。
歩行データでは秒程度、Wikipediaのページビューでは日や週程度の時間スケールでしたが、太陽黒点ではさらに長い周期を考える必要があります。
このように、データによって周期の時間スケールは大きく異なります。
それでも、時系列データを「時間」と「周期」の関係として見ることで、同じような方法で周期構造を探索できます。
4. なぜbedcmm・自己相関・FFTを比較するのか
今回のPeriodicity Labでは、
- bedcmm
- 自己相関
- FFT
の3つを比較しています。
それぞれ異なる方法で周期性を評価するため、同じデータでも結果の見え方が異なります。
FFT
周波数領域に変換することで、どの周波数成分が強いのかを調べます。
周期的な成分を周波数として捉えられるため、周期性を確認する代表的な方法の一つです。
自己相関(ac)
時系列データを時間方向にずらしたとき、元のデータとどの程度似ているかを調べます。
周期的なデータでは、周期に対応する遅延時間で類似性が高くなります。
bedcmm
bedcmmでは、これらとは異なる方法で周期性を評価します。
今回のLABでは、各Windowについて周期性を計算し、その結果を時間方向に並べています。
そのため、
「どの周期が存在するか」だけでなく、「その周期が時間とともにどう変化するか」
を確認できます。
5. 周期性は時間によって変化する
実際のデータでは、周期性が常に一定とは限りません。
例えば、
- 周期が徐々に変化する
- ある時間帯だけ周期性が強くなる
- 一時的に周期性が弱くなる
- 複数の周期が同時に現れる
といったことがあります。
そのため、時系列全体を一度だけ解析するよりも、Windowをずらしながら解析することで、より細かくデータの構造を確認できます。
Periodicity Labでは、この結果をヒートマップとして表示しています。
時間 →
周期
↑
│ █████████████
│ █████████████
│ ███████████
│
│ ███
│ ███
└────────────────────
この表示によって、
「このデータには周期がある」
だけではなく、
「この周期はいつ強く現れているのか」
という視点からデータを見ることができます。
6. ノイズを含む実データでの周期性解析
実際の計測データには、理想的な正弦波のようなデータだけが存在するわけではありません。
センサデータでは、
- 外れ値
- スパイク状のノイズ
- 欠損
- 振幅の変化
などが発生します。
そこで、周期性解析を実データに適用する場合には、ノイズを含んだ状態で周期構造を確認できることが重要になります。
例えば歩行データにスパイク状のノイズを加えた場合でも、周期性解析によって元の周期構造を確認できる場合があります。
bedcmmについても、こうした実データに含まれるノイズの影響を受けた状態で、どの程度周期構造を捉えられるのかを今後さらに検証していきたいと考えています。
7. bedcmmを何に使うのか
今回の結果から、bedcmmは単純に「周期を検出する」ためだけではなく、
時系列データにどのような周期構造が存在するのかを探索するための手法
として利用できるのではないかと考えています。
例えば、
探索的データ解析
初めて扱う時系列データに対して、
このデータには周期性があるのか?
を調べる。
センサデータ解析
歩行、振動、活動量など、周期的な動作や現象を含むデータを解析する。
予測モデルを作る前のデータ分析
時系列予測を行う前に、
- どの程度の周期が存在するのか
- 周期性が時間によって変化するのか
- 周期成分を特徴量として利用できるか
などを確認する。
このように、周期性解析を予測モデルそのものではなく、**予測問題に取り組む前の探索的データ分析(EDA)**として利用することも考えられます。
8. まとめ
今回は、Periodicity Labを使って、
- スマートフォンの歩行加速度
- Wikipediaのページビュー
- 太陽黒点数
という異なる種類の時系列データを解析してみました。
また、それぞれについて、
- bedcmm
- 自己相関
- FFT
による周期性解析結果を比較しました。
周期性解析というと、「このデータには○○の周期があります」という結果だけを見ることもできます。
しかし、実際の時系列データでは、
周期がいつ現れるのか、どの程度強いのか、時間とともに変化するのか
を見ることも重要です。
そのため、Periodicity Labでは解析結果を時間×周期のヒートマップとして表示することで、時系列データに含まれる周期構造を視覚的に探索できるようにしました。
bedcmmについては、今後、ノイズや欠損を含むデータに対する挙動や、FFT・自己相関などとの定量的な比較についても検証していきたいと思います。
Periodicity Lab
Periodicity LabはStreamlitで作成しています。
CSVファイルを読み込ませることで、自分の時系列データについても周期性を確認できます。
一列目にデータの時間、二列目にデータを入れて作成してください。
一つ目と二つ目の時刻の差分から時刻を計算します。
bedcmm
bedcmmはPyPIからインストールできます。
pip install bedcmm
GitHub:
参考
太陽黒点データには、SILSO(Royal Observatory of Belgium)のデータを使用しています。
Data source: SILSO, Royal Observatory of Belgium, Brussels
License: CC BY 4.0
おわりに
今回のPeriodicity Labを作ってみて、周期性解析は「周期を検出する」というだけでなく、時系列データを理解するための探索的な分析手段として利用できるのではないかと感じました。
今後は、人工的にノイズや欠損を加えたデータを使った比較や、周期性解析結果を実際の予測問題に利用した場合にどのような効果があるのかについても試してみたいと思います。









