SHOEISHA iD

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

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

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

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

現実のデータを扱うための「微分」の考え方

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

単純移動平均(SMA)

 「データから離れて全体を見る」ための最も基本的かつ強力な手法の一つが、単純移動平均(Simple Moving Average:SMA)です。

 SMAは、ある一定の期間を定め、その期間内のデータの平均値を「その時点の代表値」として採用する方法です。これにより、データのノイズを減らし、トレンドを把握しやすくなります。以下に、単純移動平均を計算するJavaScriptの関数例を示します。

[リスト1]単純移動平均を求める関数例(js/sample/SMAController.jsの抜粋)
// (省略)
// dataは[{ x : 1, y: 20 },...] のような連続した元データセット
sma(data, n){
    return data.map((d, i, arr) => {
        // (1) 最初はデータが十分にない事に対する考慮
        const start = Math.max(0, i - n + 1);
        //  (2) nで指定された数だけ過去のデータを参考にする
        const subset = arr.slice(start, i + 1);
        //  (3) 平均を求める
        const average = d3.mean(subset,d => d.y);
        return { x: d.x, y: average };
    });
}
// (省略)

 この関数では、(2)で元データの過去n個分のデータを切り出し(3)でその平均を算出します。この処理がSMAの基本的な動作です。また、データ系列の先頭部分でまだn個分のデータが揃っていない場合は、(1)のように利用可能なすべてのデータを対象として平均を取る工夫が必要です。

 そして、この関数を使ってオリジナルのデータを変換した折れ線グラフが図2です。灰色が元のデータ、赤、青、緑がそれぞれ過去7、14、30個のデータを移動平均したものです。

図2:単純移動平均の図
図2:単純移動平均の図

 nの値を「7(赤線)」「14(青線)」「30(緑線)」のように大きくしていくと、描かれる線がよりなめらかになっていくことが視覚的にわかります。

 このnの値(移動平均期間)は、分析したいトレンドの周期に合わせて設定できます。例えば、n=7なら約1週間、n=14なら2週間単位、n=30なら約1か月単位といった、季節性などの大きな傾向を捉えるのに役立ちます。

 一方で、SMAの主要な問題点は「データの変化が遅れて現れる」ことです。

 SMAの計算は過去n個のデータの平均値であるため、最新のデータの急激な変化やトレンドの転換に対して、どうしても反応が鈍くなってしまいます。これは、最新値が全体の平均に与える影響が、過去n-1個のデータの影響よりも相対的に小さいためです。

指数平滑移動平均(EMA)

 単純移動平均(SMA)の課題は「過去のデータすべてを平等に扱う」点にありました。この課題を解決するため、過去に遡るほど影響が小さくなるように重み付けを工夫したのが「指数平滑移動平均(Exponential Moving Average:EMA)」です。

 EMAは「新しいデータほど重要である」という考え方に基づき、それ以前のデータよりも直近のデータに大きな重みを与えて平均を算出します。

 EMAは、以下の関数例のようにして計算できます。

[リスト2]指数平滑移動平均を求める関数例(js/sample/EMAController.jsの抜粋)
// (省略)
// dataは[{ x : 1, y: 20 },...] のような連続した元データセット
ema(data, n){
    // (1) 平滑化係数 α (アルファ) の計算
    const alpha = 2 / (n + 1);

    // (2) 初期値は最初のデータを使用
    let previousEMA = data[0].y;

    return data.map((d, i) => {
        if (i === 0) {
            return { ...d, ema: previousEMA };
        }

        // (3) EMAの公式: 今日のEMA = 前日のEMA + α * (今日の値 - 前日のEMA)
        const currentEMA = previousEMA + alpha * (d.y - previousEMA);
        previousEMA = currentEMA;

        return {
            x :  d.x,
            y: currentEMA,
        };
    });
};
// (省略)

(1)平滑化係数(α)の算出

 「alpha = 2 / (n + 1)」という式で、平滑化係数α(アルファ)を算出します。このαは「新しいデータをどれくらい重視するか」を決定する値です。ここでは、引数nをSMAの「期間n」と同じ感覚で扱えるように変換しています。

 例えば、nを「7」に設定すれば、SMAのn=7に近い滑らかさを保ちつつ、より最新の変化に鋭敏な線を描くことが可能になります。

(2)初期値の設定

 EMAは「一歩前の結果」をベースに次の値を積み上げていく計算手法であるため、基準となる初期値が必要です。この例では、最初のEMAの値として、データセットの1点目(data.y)をそのまま採用しています。

(3)EMAの計算式

 EMAの計算式は今日のEMA=前日のEMA+α*(今日の値-前日のEMA)です。これは一見複雑に見えますが、「前回のEMAから、今回起きた変化(前回のEMAと今日の値の差分)に対して、αの歩幅で一歩近づく」という処理を表しています。つまり、前回の値から今回の値に歩み寄るための「勢い」を作り出すイメージです。

 このEMA関数を使ってデータを変換すると、図3のようになります。

図3:指数平滑移動平均の図
図3:指数平滑移動平均の図

 図中のグレーの線が元のデータであり、黒線は比較用の単純移動平均(n=7)です。そして、赤線(n=7)、青線(n=14)、緑線(n=30)が指数平滑移動平均です。

 単純移動平均と比較した場合、EMAには以下の特徴があります。

  • トレンドへの追従性の速さ:EMAは最新のデータに重きを置くため、データの急激な変化やトレンドの転換に対して、SMAよりも素早く反応します。これは、SMAのデメリットであった「タイムラグ」を解消するための重要な利点です。
  • 計算の効率性:EMAの計算アルゴリズムは非常にシンプルです。SMAのように毎回過去n個のデータを保持して再計算する必要がなく、直前のEMAの値さえあれば現在のEMAを計算できます。そのため、データ量が増えても計算負荷が上がりにくく、非常に効率的な手法です。

次のページ
局所回帰

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

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

もっと読む

この記事の著者

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本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

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

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

この記事をシェア

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

イベント

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

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

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

メールバックナンバー