見出し画像

【時系列大好き】時系列クラスタリング

筆者はセンサーデータが好きだ。人には不可能な方法で世界を観測しているからだ。そんなセンサーデータを扱うのに欠かせないのが時系列を考慮した数々の処理。そんな時系列処理を実装ベースで触っていこうという趣である。

”筆者の心の声”より

こんにちは!株式会社Rosso AI部です!
時系列データって面白いですよね!目に見えないのに必ず同じ方向に進んでいて、重ねていくと規則性が隠れていたり、んん~ディフィカルトゥ(翻訳:difficult)
ということで、実務でもよく出てくる時系列データへのアプローチを綴っていこうと思います。



📈0.モチベ

🖋本記事について

 まず時系列データ(クレンジング済み)を目の前にしたときに「何か規則性がないかな~」と思うのが人の心かと思います。そんな心の欲求を満たしてくれる手法を今回は紹介したいと思います。
 なお、本記事は実装ベースの手法としての紹介記事である為、理論の詳細を知りたい方は論文やソースコードを追っていただければと思います。



📈1.結果のイメージ

 早速ですが、結果のイメージを先に共有しておこうと思います(fig.1)。規則性を見つけたいので、時系列の時間方向でクラスタリングしました。

fig.1 クラスタリング結果
横軸:時間 縦軸:観測値 背景縦帯の色:クラスタの種類


📈2.アルゴリズム

🖋実装

 sticky-HDP-HMM(sticky-HierarchicalDirichletProcess-HiddenMarkovModel)と呼ばれる、確率ベースのアルゴリズムを実装してみました。
 実装にあたっては、オープンソースライブラリ”bnpy”(BSD-3ライセンス)を利用しました。一部出力を改編して実装しています。

🖋アルゴリズム概要

 マルコフ過程をベースに時系列を扱い、クラスタ=隠れ状態として捉えることで、データに対して隠れマルコフモデルをフィッティングさせるというコンセプトです。
 アルゴリズムの強みとしては、所謂ノンパラメトリックなことです。クラスタ近傍に関する閾値などのパラメータをデータから最適化していきます。クラスタが確率密度分布に基づいていると仮定して、パラメータをディリクレ過程に基づいて推定する仕組みです。



📈3.対象データ

 時系列データについては、サンプルデータとして次のデータを引用させていただきました。リンク自体は予測アルゴリズムのGitHubになっていますが、今回はデータセットのみ引用しました。(Apache2.0ライセンス)


このデータには異常値と呼ばれる値が含まれています。人手でラベル付けされて、その時間帯を着色してプロットしたのが下図(fig.2)になります。

fig.2 生データと人手で付与された異常値と呼ばれる時間帯


※異常値あるあるな話
 
よく「異常が含まれているデータ」に対して「どこから異常?異常の定義は?」と聞くと、「異常な箇所はわかるけど異常の定義が分からない」といった回答が来るかと思います(筆者だけかな~)。今回のデータも着色された時間帯を見て、直観的に境界が分かりにくいラベル付け(6000付近を境目に傾向が変化しているが一纏めに異常とされている)になっているかと思います。
 データから異常の定義をしたい、異常個所というクラスタをデータから導き出したい、というのが隠れたモチベとしてあります。

”筆者体験談”より


📈4.結論

 規則性が定量的に確認できたと思います。異常個所についても、大きなクラスタとして分類され、隠れたモチベである”データからの異常範囲を定義” についても達成できたと言えるでしょう。
 それぞれの結論に至る考察は以下の「5.考察」に記載しました。



📈5.考察

 結果についての確認ポイントと考察を以下に記載しました。確認の為に再度クラスタリング結果を可視化した図(fig.3)を掲載しておきます。こちらは「1.」で掲載したものと同じ図となります。

fig.3 確認のために再掲したクラスタリング結果。fig1と同じ。

🖋ポイント1:規則性

 わかりやすい代表的な時間帯として、はじめの0secから550secを確認していきます。確認しやすいように拡大した図(fig.4)を掲載しました。

fig.4 0sec~550secまでの拡大図

主に確認するポイントとしては、

  • クラスタの規則性

  • クラスタの周期性

が存在すると考えられます。この観点で確認すると、以下のような現象が確認できます。

  • 1回目の境目(開始~3回目の紫のcluster8エンドまで)

    • > 規則性として紫のcluster8が存在

    • > 周期性として周期が若干長め

  • 2回目の境目(おおよそ280sec以降から440secまで)

    • > 規則性として紫のcluster8が無くなる

    • > 周期が短くなる

  • 3回目の境界(おおよそ440secあたり(6回目の赤のcluster6エンド))

    • > 赤のcluster6が無くなる

    • > 周期性は大きな変化なし

考察
 以上がクラスタリング結果から確認できるポイントとなります。つまり、正常と異常という2値で考えていたデータですが、クラスタリング結果から観測パターンが3パターン存在するのではないかと言える結果になりました。また、クラスタが規則的に、かつその規則性が連続して遷移している箇所は1つの現象ではないかと推察できます。


🖋ポイント2:異常個所

 異常とされている箇所についても同様に見ていきます。下図(fig.5)はラベル付けされた(fig1の背景色が付いた)時間帯の拡大図になります。
※開始50secほどは、異常個所の開始を確認しやすくするために追加したものでラベル時間帯の範囲外データ。

fig.5 異常ラベルの時間帯を拡大した図
  • 1回目の境目(cluster7エンドまで)

    • > ピーク値周辺で明らかに傾向が異なる

    • > 大きく2つのクラスタで表現されている(cluster5cluster7

  • 以降

    • > 波形形状としては正常とされていた波形と近い形状

    • > ただし、全体的にsignalが負方向にオフセットされたような値

考察
 人手によるラベリングでは時間帯が広めにラベル付けされていましたが、クラスタリング結果によって、ピーク値は明確に異なるクラスタとして確認することができました。
 ピーク後の時間帯は、正常時に近しい波形形状を持つ為、データのみでは正常か異常かは判別が難しいかと思います。当該部分については、ドメイン知識との整合性から解釈する必要があると考えます。ほかの正常値とも異なるクラスタとして確認されたことは解釈の材料になるかもしれません。



📈6.まとめ

 いかがでしょうか。本記事のモチベ「規則性の発見」「異常の定量化」を達成できているかと思います。世の中的にはこういった機械学習はニューラルネットワークが主流になりつつありますが、本記事のような時間方向のクラスタリングに関しては、まだまだ確率ベースのアルゴリズムも強いので紹介させていただきました。
 解析など、”データから発見する”というタスクには強いですが、”未来を予測する”という予測タスクに関しては、確率ベースでは課題が残るのが正直なところかと思います。
 クラスタ=ラベルとして扱ってニューラルネットワークの分類タスクに活用すれば、解析としてだけではなく予測にも活用できるのではないだろうかと筆者は妄想してます。

※参考記事
 筆者が参考にしたデータセットの解説をしている参考記事も合わせて紹介。こちらの前処理ソースコードを利用させていただきました。



📉APPENDIX:もう少し踏み込んで

「規則性を見つけたい」や「”異常”をデータから見つけたい」については達成できたかと思います。ここではもう少し踏み込んで、各クラスタをどのような分布で捉えたかを見ていこうと思います。(fig.6)

fig.6 予測分布と生データの分布

 クラスタ(k1~k9)を表現した予測分布の平均・分散(●)と、クラスタに分類された生データのクラスタごとの平均・分散(▲)をプロットして差異を確認してみました。
 差異は小さく、平均はほぼ同じ。分散も一番大きいところでもk2のおおよそ0.02くらい(標準偏差0.141)なので、クラスタの精度も良いのではないかと思います。ほかには、k3k6k1のような固まっているクラスタを確認することもできます。
 このように分布の差異を見ることで、それをどう解釈するか、クラスタ数Kを増やすか減らすか等々の深い検討ができるようになるかと思います。