SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

データサイエンス基礎を高校数学から復習

積分は「変化の蓄積」。現実の積分データからトレンドを可視化する

データサイエンス基礎を高校数学から復習しよう 第6回

データで確認してみる

 実際に、わずかな誤差の蓄積が、積分によってどれほど致命的なズレを生むのかをシミュレーションしてみましょう。

 図6は、等速直線運動しているはずの車が誤差により大きくズレてしまう様子を表したものです。実際のサンプルコードを実行すると、最初は重なっていた二つの円が、時間の経過とともに加速度的に離れ、赤い円は「海」側へと外れていきます。

図6:二重積分による累積誤差(ドリフト現象)のシミュレーション
図6:二重積分による累積誤差(ドリフト現象)のシミュレーション

 この様子は、リスト3によって作成したデータを元にしたものです。

[リスト3]加速度と速度の二重積分シミュレーションプログラム例(js/sample/DriftController.jsの抜粋)
// (省略)
/**
* @param {number} initialVelocity - スタート時の速度 (v0)
* @param {number} accelIdeal      - 理想的な加速度
* @param {number} biasError       - センサーノイズ(バイアス)
* @param {number} dataCount       - データ個数
*/
simulateWithInitialVelocity(initialVelocity,
                            accelIdeal, biasError, dataCount) {
    let posIdealX = 0;
    let posErrorX = 0;

    let posErrorY = 200;

    // (1) 速度の初期値として「初速」をセットする
    let velIdeal  = initialVelocity;
    let xMeasured = initialVelocity;
    let yMeasured = 0;

    //  単位時間
    const dt = 1;

    return Array.from({ length: dataCount }).map((_, i) => {

        // (2) 理論上の位置の計算
        velIdeal += accelIdeal * dt;
        posIdealX += velIdeal * dt;

        // (3) センサーでの加速度(センサーの誤差を含める)
        const accelMeasured = accelIdeal + biasError;

        // (4) 1回目の積分:速度を求める
        xMeasured += accelMeasured * dt;
        yMeasured += accelMeasured * dt;

        // (5) 2回目の積分:位置を求める
        posErrorX += xMeasured * dt;
        posErrorY += yMeasured * dt;

        return {
            step: i,
            idealX: posIdealX,
            idealY: 200,
            errorX: posErrorX,
            errorY: posErrorY,
        };
    });
}

 このプログラムの各ステップは以下の通りです。

(1)初速の設定

 シミュレーションの初期段階として、initialVelocity(初速)を設定します。この例では、X軸方向のみに動く車を想定し、Y軸方向はノイズの影響のみを考慮しています。

(2)理論上の位置計算

 誤差を含まない理想的な状態での速度と位置を計算します。加速度の蓄積により速度を求め、その速度を用いて距離(位置)を算出します。

(3)センサーの誤差付与

 実際のセンサーには誤差が伴うため、理論上の加速度にbiasError(バイアス誤差)を加えて、測定されるであろう加速度accelMeasuredを生成します。

(4)1回目の積分(速度計算)

 accelMeasuredを用いて速度を計算します。ここで、biasErrorが1回目の積分によって速度に累積され始めます。

(5)2回目の積分(位置計算)

 誤差を含んだ速度xMeasuredおよびyMeasuredをさらに積分して位置を計算します。これにより、biasErrorが2回目の積分によって位置データに加速度的に累積し、理想位置からのずれが顕著になっていく様子が再現されます。

 このシミュレーションは、微小なセンサーノイズ(バイアス)が積分を繰り返すことで、最終的には元のデータを大幅に歪めてしまう「ドリフト現象」を視覚的に理解するのに役立ちます。

積分データの限界と補正戦略

 積分はデータの蓄積を通じて全体的なトレンドを把握する強力なツールですが、その性質上、データが特定の状況下で破綻する可能性があります。

 例えば、「積算温度」のように、多少の測定誤差があっても、それらが互いに打ち消し合ったり、全体に与える影響が小さかったりする場合、誤差は無視できる範囲に収まります。

 しかし、微細な変化を基に大きな結果を導き出そうとする場合、誤差の蓄積がやがて致命的なズレ(ドリフト)となり、データが実態から大きく乖離してしまうという問題に直面します。

 そのため、積分を利用する際には、定期的な「絶対的な答え合わせ」を組み合わせる戦略が不可欠です。例えば、GPSセンサーが示す「絶対的な現在地」を定期的に再取得し、それまでに累積した積算誤差をゼロにリセットするといった補正が必要です。

微分と積分の「逆転現象」

 ここで興味深い「逆転現象」が起こります。

 本来、「微分」は一瞬の動きや変化を捉え、「積分」は長い期間の蓄積や総量を捉えるものです。しかし、実データの世界で信頼性を担保しようとすると、その役割は逆転します。

  • 積分データ:信頼性を確保するためには、誤差が爆発する前に定期的にリセットする必要があるため、有効なデータ範囲は補正された短い区間に限定されます。
  • 微分データ:一瞬のノイズに惑わされず「全体としてどの方向に動いているか」というトレンドを把握するためには、より長い観測時間を通じて平滑化する(つまり、時間を広げて見る)ことが必要になります。

 このように、積分によって事実を積み上げつつ、微分の視点で常に現在のズレを監視する、両者のバランスを取る戦略こそが、不確実な現実世界から「確かな答え」を導き出すために必要不可欠となります。

最後に

 これまでの説明を通して、データ分析の視点から微分と積分の意味を再解釈してきました。実際の分析現場では、これらは単純な四則演算として簡単に計算できます。しかし、その本質や特性を意識せずに処理を進めると、測定データに含まれる不完全さを見落とすことになります。

 一瞬のガタつき(ノイズ)に惑わされたり、微小なゴミ(バイアス)を積分によって巨大な嘘(ドリフト)へと育ててしまったりすることがあります。大切なのは、公式の計算方法だけを覚えるのではなく、公式が持つ意味を理解した上で、データの不完全さをどのように扱い、戦略的に解釈していくかということです。

 次回は、データの「バラツキ」の正体に迫るべく、偏差と分散について深掘りします。

この記事は参考になりましたか?

データサイエンス基礎を高校数学から復習連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 小林 昌弘(コバヤシ マサヒロ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/23998 2026/04/24 08:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング