積分(累積和)によるトレンドの可視化
それでは、積算温度の概念が、どのようにトレンドを把握するのに役立つかを見ていきましょう。
60日間の温度変化と積算温度
図2の通り、60日間の温度変化のデータがあるとします。
これらの温度を積算してエリアチャートとして表示したのが、図3です。
D3.jsでは、それぞれの値が積み上がっていく配列を簡単に作成でき、リスト2のように計算ができます。
// (省略)
const { canvas , scale } = ...; // 描画の前準備の実行
// dataset = [ { value : 12, }, { value : 13 }, ..... ];
// (1) 配列の累積和(積算値)も簡単に算出可能
const totals = d3.cumsum(dataset, d => d.value);
const integratedDataset = dataset.map((d, i) => ({
...d,
total: totals[i]
}));
// (2) 積算温度を「面」で描画
const area = d3.area()
.x(d => scale.x(d.day))
.y0(scale.y(0))
.y1(d => scale.y(d.total));
canvas.append("path")
.datum(integratedDataset)
.attr("class", "area-integral")
.attr("d", area)
.attr('stroke','red')
.attr('fill','rgba(255,0,0,0.3)')
// (省略)
D3.jsのd3.cumsum関数を使うことで、簡単に各ステップの累積和(積算値)を算出できます((1))。この「単なる足し算」を繰り返すことで、日々の細かいノイズは面積の中に溶け込み((2))、データの持つ本質的なトレンドや「確定した事実」が明確になるのです。
予測判断の基準を変える
積算温度が特定の目標値(例:1000度)を超える日を予測する場合を考えてみましょう。以下の図は、序盤の10日間(青色)と終盤の10日間(緑色)のデータから、最小二乗法を用いてトレンドラインを引いたものです。
ゴールまで遠い時期(青色)の予測は、その時点のデータだけでは当てになりにくいものです。この場合は、過去の実績データを参考にすることが有効でしょう。
しかし、現象の発生が近づくにつれて、主役は「今年の蓄積(積分値)」へと移ります。「今年はすでにこれだけの量が溜まっている」という動かせない事実が、予測の確信度を高めていきます。これは、AIを活用した予測が、データからパターンを見出し将来を推測する仕組みと共通しています。積み重ねられたデータは、将来の出来事や状況を推測する上で非常に重要な根拠となるのです。
積分の副作用:一度入った「ゴミ」は一生消えない
ここまで、積分が持つ「局所的な値の変化を打ち消し、事実を積み上げる力」という良い面に注目してきました。しかし、実際のデータ処理においては、積分ならではの注意すべき性質があります。それは、「一度混入した誤差(ノイズ)を積み上げ続けてしまう」点です。
前回紹介した「微分(平滑化)」の場合、一時的に大きなノイズがデータに入り込んでも、時間が経てばその影響は徐々に小さくなります。しかし、積分は本質的に「足し算」です。一度加算されてしまった余計な数字は、その後どれだけ正しいデータを足し続けても、合計値の中に残り続けます。
「海の上を走るカーナビ」の正体
「積分の負の側面」が引き起こす具体的な悲劇として、かつてのカーナビに見られた「自動車が海の上を走ってしまう」という現象が挙げられます。これは、主に以下の状況で発生しやすくなります。
- GPS電波が届かない場所:トンネル内など、GPSの電波を受信できない場所
- 加速度センサーのみによる位置特定:スマートフォンアプリなどで、GPSに頼らず加速度センサーのデータだけで位置を特定しようとする場合
加速度センサーは物体の動きの変化を検出し、そのデータを積分することで速度や位置を推定できます。しかし、加速度センサーのデータに含まれるわずかな誤差も、積分を重ねるごとに蓄積され、最終的には大きなずれとなります。この累積誤差が、カーナビに誤った位置を表示させ、「海の上を走る」ような状況を生み出す原因となるのです。
この現象は、積分が持つ「ノイズを蓄積する」という特性を理解し、適切に対処することの重要性を示しています。
加速度センサーでの速度の算出方法と問題点
加速度センサーを用いて速度を算出する際、最も単純なケースとして一方向のみの加速度を測定する状況を考えます。物理学的には、以下の積分公式によって速度を求められます。
ここで、現在の速度v(T)は、スタート時の初速v0に、加速度センサーから得られるその瞬間の加速度a(t)を時間で積分した値を加えることで求められます。しかし、実際のデータ処理では、ここから技術的な課題が生じます。
「空白時間」の問題
実際のセンサーは、連続的に値を測定しているわけではなく、例えば「1秒間に100回」といった特定の瞬間の値をデジタルデータとして切り取っています。このため、データとデータ間の「計測していない時間(空白時間)」が存在します。
積分計算では、次のデータが届くまでの間、その直前の加速度が継続していたと仮定して計算を進めます。この「現実のスムーズな動き」と「デジタルの階段状の近似」の間に生じるわずかなずれ(サンプリング誤差)が、積分の精度を少しずつ狂わせていきます。
「バイアス(偏り)」の問題
さらに深刻なのが、センサー自体に避けられないわずかな誤差、いわゆる「バイアス」です。
例えば、加速度センサーが完全に静止しているにもかかわらず「0.01mm」などの人間には感知できない極めて小さなノイズを常に出し続けていたとします。
積分は蓄積の計算であるため、このわずかなノイズは時間とともに積み上がります。1秒間に100回計算すると、1秒後には秒速1mmとなり、1時間後には計算上の速度が約13km/hにも達してしまいます。さらに、これを「距離」としてもう一度積分すると、1時間後には実に6.5kmという巨大なずれに膨れ上がることになります。
積分は「過去」をすべて背負い続ける
これらの誤差に対して、センサー自身が能動的に「これは誤ったデータだ」と判断して補正することはできません。微分がその瞬間のノイズを次の瞬間には消し去る性質を持つのに対し、積分は「一度入り込んだゴミを、記録として背負い続ける」という性質を持っています。
そのため、何の対策も講じなければ、机の上に置いたままのスマートフォンが計算上では「隣町にある」といった誤った位置を示すことになってしまいます。このように、微小な誤差が積分によって累積し、計算値が実態から大きく乖離していく現象を「ドリフト(Drift)」と呼びます。
