分散の公式はなぜ「2乗の平均ー平均の2乗」でいいの?新人エンジニアのための直感的統計学

こんにちは。ゆうせいです。

みなさんは、データの分析をしていて分散という言葉にぶつかったことはありませんか?統計学の教科書を開くと、最初に習う定義の式と、実際に計算するときに使う便利な公式が違っていて、なんで?と首を傾げた経験があるかもしれません。

今日は、そんな疑問をスッキリ解消していきましょう。特にエンジニアとしてデータを扱うようになると、この計算式の違いがプログラムの処理速度や精度にどう関わってくるのかを知っておくことはとても大切です。

難しそうな数式も、日本語で噛み砕けば意外と単純なストーリーが見えてきますよ。

そもそも分散ってなに?

まずは基本のキからお話しします。分散とは、一言で言えばデータのばらつき具合を表す数値のことです。

例えば、テストの点数が全員50点のクラスと、0点から100点までバラバラにいるクラスでは、平均点は同じ50点でも中身は全然違いますよね。この違いを数字で表したのが分散です。

定義通りに計算しようとすると、次のような手順になります。

  1. 全データの平均値を求める
  2. それぞれのデータから平均値を引く(これを偏差と呼びます)
  3. 引き算した結果を2乗する(マイナスをなくすためです)
  4. それらを全部足して、データの個数で割る

これを数式っぽく書くとこうなります。

分散 = (データ - 平均)の 2 乗の平均

言葉にすると少し長いですね。実はこの定義通りの計算には、ちょっとした弱点があります。それは、計算の手間です。一度平均を出してから、もう一度全データに戻って引き算をしないといけない。つまり、データを2回走査する必要があるんです。データが100万個あったら大変ですよね。

魔法の公式「2乗の平均ー平均の2乗」

そこで登場するのが、みなさんがよく目にするショートカット公式です。教科書や技術ブログでは、このように書かれていることが多いでしょう。

分散 = 2乗の平均 - 平均の2乗

この式を見て、なんでこうなるの?と不思議に思ったことはありませんか。定義の式とは似ても似つかない形をしています。でも、この2つは数学的に全く同じ結果になるんです。

なぜこの式が便利かというと、データを1つずつ読み込みながら、そのままの合計と、2乗した値の合計を同時に作っていけるからです。つまり、データを1回読み込むだけで計算が終わってしまうのです!

エンジニアとしては、計算コストが下がるこの公式を使わない手はありません。

なぜこの式に変形できるのか?

では、ここからが本題です。なぜ定義式がこの便利な公式に変身するのか、そのトリックを紐解いていきましょう。高校数学で習った展開公式を思い出してください。

(a - b)^2 = a^2 - 2ab + b^2

これを使います。分散の定義である データ - 平均 の 2 乗という部分を、この公式に当てはめて展開してみましょう。ここで、データ(変数)を X 、平均を \mu とします。

すると、定義の中身はこう変形できます。

(X - \mu)^2 = X^2 - 2X \mu + \mu^2

さて、分散というのはこの全体の平均を取ることでしたね。項ごとに分けて平均を取ってみましょう。

まず第1項。

X^2 の平均は、そのまま 2乗の平均 です。

次に第2項。

-2X \mu の平均を考えます。ここで重要なポイントがあります。平均値である \mu は定数(ただの数字)だということです。平均を取るときに変化するのはデータである X だけです。

つまり、 -2 \mu はそのままにして、 X の部分だけ平均を取ればいいのです。 X の平均はもちろん \mu ですよね。

合わせると、 -2 \mu \times \mu となり、結果は -2 \mu^2 になります。

最後に第3項。

\mu^2 の平均です。 \mu は定数なので、何度平均を取っても値は変わりません。テストで全員が同じ点数を取ったら、平均点もその点数になるのと同じです。

よって、ここは \mu^2 のままです。

これら3つを合計してみましょう。

分散 = 2乗の平均 - 2 \mu^2 + \mu^2

後ろの2つの項を計算して整理すると……

分散 = 2乗の平均 - \mu^2

ほら、出てきました! \mu は平均のことですから、まさに 2乗の平均 - 平均の2乗 になりましたね。

例題に挑戦

今回は、計算しやすくてイメージが湧きやすい、こんなデータを扱います。

【例題】

ある5人の数学の小テストの点数が、以下の通りでした。このデータの分散を求めてください。

データ: 10, 20, 30, 40, 50

きれいに並んだ数字ですね。まずは、このデータを使って手順を確認していきましょう。

手順1:平均値を求める

何はともあれ、まずは平均値が必要です。これは基本中の基本ですね。

データを全部足して、人数で割ります。

平均値 = \frac{10 + 20 + 30 + 40 + 50}{5}

平均値 = \frac{150}{5}

平均値 = 30

平均点は 30 点です。

手順2:「2乗の平均」を求める

ここからが公式の出番です。

それぞれのデータを2乗(同じ数を2回掛けること)して、その平均を出します。

10 の2乗 = 100

20 の2乗 = 400

30 の2乗 = 900

40 の2乗 = 1600

50 の2乗 = 2500

これらを全部足して、平均を取りましょう。

2乗の平均 = \frac{100 + 400 + 900 + 1600 + 2500}{5}

2乗の平均 = \frac{5500}{5}

2乗の平均 = 1100

数字が大きくなりましたが、焦らなくて大丈夫です。

手順3:公式に当てはめる

さあ、役者が揃いました。

前回紹介した魔法の公式を思い出してください。

分散 = 2乗の平均 - 平均の2乗

この式に、さっき計算した数値を当てはめます。

  • 2乗の平均1100
  • 平均30 (なので、平均の2乗は 30 \times 30 = 900 です)

計算してみましょう。

分散 = 1100 - 900

分散 = 200

はい、出ました! このデータの分散は 200 です。

どうですか? データから平均を引いて、それを2乗して……とやるよりも、機械的に計算が進む感じがしませんか?


あなたもやってみよう! 練習問題

では、今の流れを忘れないうちに、皆さんにも1問解いてもらいましょう。

今度は少しだけ数字を変えてみます。

【練習問題】

次の3つのデータの分散を、「2乗の平均ー平均の2乗」の公式を使って求めてください。

データ: 2, 4, 9

ヒント:データが3つなので、割り算するときは 3 で割ってくださいね。

(少しスクロールすると解答と解説があります。まずは自分で計算してみましょう!)

.

.

.

.

.

練習問題の解答と解説

計算できましたか?

それでは答え合わせをしていきましょう。

1. 平均値を求める

まずは平均です。

平均値 = \frac{2 + 4 + 9}{3}

平均値 = \frac{15}{3}

平均値 = 5

平均は 5 になりました。

2. 「2乗の平均」を求める

次に、それぞれの数字を2乗して平均します。

2 の2乗 = 4

4 の2乗 = 16

9 の2乗 = 81

これらを足して 3 で割ります。

2乗の平均 = \frac{4 + 16 + 81}{3}

2乗の平均 = \frac{101}{3}

ここで「あれ? 割り切れないぞ?」と思った方、鋭いです!

101 \div 3 = 33.666... と続いてしまいますね。

こういうときは、無理に小数にせず、分数のまま計算を進めるのがコツです。これが数学(そしてプログラミング)で誤差を減らすテクニックの一つでもあります。

ひとまず、2乗の平均は \frac{101}{3} のままにしておきましょう。

3. 公式に当てはめてフィニッシュ!

公式に投入します。

分散 = 2乗の平均 - 平均の2乗

分散 = \frac{101}{3} - 5^2

分散 = \frac{101}{3} - 25

分数の引き算をするために、通分(分母を揃えること)をします。

25\frac{75}{3} と同じことですよね。

分散 = \frac{101}{3} - \frac{75}{3}

分散 = \frac{26}{3}

これを小数に直すと、約 8.67 になります。

正解: \frac{26}{3} (または約 8.67

正解できましたか?

もし定義通りに計算しようとすると、偏差(データ - 平均)が 2 - 5 = -34 - 5 = -19 - 5 = 4 となり、これらを2乗して……と計算することになります。今回はデータが少ないのでどちらでも大変さは変わりませんが、公式を使う手順に慣れておくと、データが増えたときに圧倒的に楽になりますよ。

まとめ

今回は、分散の計算を実際に行ってみました。

  1. 平均 を出す
  2. 2乗の平均 を出す
  3. 引き算 する

この3ステップのリズム、掴めましたか?

統計学やデータ分析は、理屈を知ることも大切ですが、こうして実際に手を動かして計算してみることで、「肌感覚」として身についていきます。

メリットとデメリットを知っておこう

この公式は魔法のように便利ですが、エンジニアとして知っておくべき落とし穴もあります。

メリット:計算速度が速い

先ほどもお伝えしましたが、最大のメリットは計算速度です。データを一度読み込むだけで済むため、オンラインアルゴリズム(データが次々とやってくるような処理)に組み込むのに最適です。

デメリット:桁落ちの危険性

ここが重要です。コンピュータで計算する場合、桁落ちという誤差が発生することがあります。

もし、2乗の平均という値と、平均の2乗という値が非常に近い巨大な数字だった場合どうなるでしょうか?

例えば、10000.0001と10000.0000を引き算するような状況です。コンピュータは有効桁数に限界があるため、巨大な数同士のわずかな差を正確に表現できず、計算結果が 0 になったり、おかしな値になったりすることがあるのです。

データのばらつきが極端に小さい場合、この公式を使うと負の値(分散なのにマイナス!)が出てしまうことさえあります。

今後の学習の指針

いかがでしたか?

単なる数式の暗記ではなく、背景にあるロジックと、それを実装する際のメリット・デメリットを理解することで、より強いエンジニアになれるはずです。

もし業務で厳密な精度が求められる科学技術計算をする場合は、あえて定義通りの計算をするか、ナイーブアルゴリズムと呼ばれる誤差を抑えるアルゴリズムを採用することを検討してください。

次は、実際にPythonなどのプログラミング言語を使って、非常に大きな数値の分散をこの2つの方法で計算し、誤差がどう出るかを実験してみると面白いですよ。

それでは、また次の記事でお会いしましょう。

セイ・コンサルティング・グループでは新人エンジニア研修のアシスタント講師を募集しています。

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。

学生時代は趣味と実益を兼ねてリゾートバイトにいそしむ。長野県白馬村に始まり、志賀高原でのスキーインストラクター、沖縄石垣島、北海道トマム。高じてオーストラリアのゴールドコーストでツアーガイドなど。現在は野菜作りにはまっている。