等間隔でない時系列データからトレンドを抽出する方法の考案

私は去年からモルモットを飼っている。毎週土曜日にケージ掃除し、その時に体重測定も行っている。体重というのはノイズが多い値である。体重測定の直前に餌をたくさん食べていれば大きめの値がでるし、逆に直前にフンをたくさんしていたりすると少なく出てしまう。そういったノイズの影響を排除するには、データを平滑化するというのが一般的である。よくやるのは、各データを前後の点と足して平均を取ったものをその点での値とする方法である。

平均値を用いた方法は簡単な割にそこそこいい感じのグラフを描くことができるのであるが、1つ問題がある。通常、時系列データといった場合には暗黙のうちにデータが等間隔で並んでいることが前提となっている。しかし、例えばモルモットの体重データの場合、土曜日が忙しいと日曜日に体重を測ったり、もしくはその週は体重を計るのをやめてしまったりするため、そうはいかない。つまり、ある点の1つ先のデータは一週間後のものだが、1つ前のものは二週間前のデータだったりすると、それらの平均を取るというのは正しくない。なぜなら、今着目している点により近いデータの方が、その点のデータとより大きな相関があるためである。このように、等間隔に並んでいない時系列データを平滑化する際には、ちょっとした工夫が必要となる。

そこで、今回はそんな工夫を1つ形として書き表してみようと思う。基本的なアイディアとしては、着目している点により近い点に対して大きな重みを与えるような形で加重平均を取るというものである。重みの与え方であるが、着目している点を中心とした正規分布を考え、その正規分布の値を利用する。こうすることで、近い点についてはある程度着目している点に影響を与えることができるし、またずっと遠い点については影響がほとんどなくなる。

また、計算のちょっとした工夫として、ある程度離れた点については、加重平均の計算に加えずとも、ほとんど影響がない。そこで、最初から計算から除外してしまっても差し支えない。これにより、計算を高速化することが可能となる。

まあこんな感じで大したアルゴリズムではないが、話を明確にするためにちょっと数理的に記述してみる。ある時刻の数列t0, t1, ... , tn-1に対して、その時の時系列データの値がy0, y1, ... , yn-1であるとする。また、平均値μ, 標準偏差σの正規分布の点xでの値をN(μ, σ, x)と表す。さらに、ある時刻tiに着目したとき、その点の前後の時間T以内にある点の添字集合をMti, Tとする。このとき、ある時点ti (0 <= i < n) について、平滑化後の値y'iは以下のようになる。

{ \displaystyle
y'_i = \frac{\sum_{k \in M_{t_i, T}} y_k N(t_i, \sigma, t_k)}{\sum_{k \in M_{t_i, T}} N(t_i, \sigma, t_k)}
}

このアルゴリズムではTとσがパラメータとなり、これらの値によってグラフの様子が変化する。適用される際には、これらの値をいろいろ変えてみて、よさ気な値を選んで貰えればと思う。