プログラミング初心者の勉強日記

情報科学専攻です. 機械学習と競技プログラミングについて日々勉強しています.

MENU

統計学の基礎知識 : 平均、分散、標準偏差

今回は統計学の基礎中の基礎である平均、分散、標準偏差についての記事です.

簡単にですが、pythonでの実装例も最後に載せておきます.

1. はじめに

分布の特徴を数値で表す方法にはいくつか存在します. 非常に良く使われるものとしては、分布の位置を表す指標と、分布の散らばり具合や広がりの大きさを表す指標の2つがあります.

今回は、平均分散標準偏差を用いて分布の特徴を捉えることができることについて紹介します.

2. 準備

n個の観測値を、x_{1}, x_{2}, \cdots, x_{n}と表します. またi番目の観測値はx_{i}で表します.

3. 平均

平均 (mean) は全観測データの重心となりますので以下のように定義されます. $$ \overline{x} = \frac{1}{n} \sum_{i = 1}^{n}x_{i} $$

このことから、「分布の位置を表す」指標として利用されます.

左右対称の綺麗な分布である場合は、全観測データの中心を示しますが、偏りのある分布の場合、その中心の意味は弱くなります.

4. 分散

「分布の位置」を表す指標を平均で表したので、次は「分布の散らばり具合や広がりの大きさ」を表す指標についてです.

まず、各観測データが、平均からどれだけ離れているかを平均からの「偏差 (deviation) 」で表します.

各観測値の平均からの偏差は、(x_1 - \overline{x}), \cdots, (x_n - \overline(x))求まります. この偏差を用いれば、分布の偏りを表すことができますが、偏差は正負どちらの値もとるので、少し不便です.

そこで、正負に依存しないで、どれだけ離れているかを示すために2乗して平均を取ります. (絶対値でも正負に依存しないように表現できますが、絶対値は取り扱いにくいので2乗で定義します.)

この各観測値の平均からの偏差の2乗の平均を分散 (variance) と呼びます. 具体的には次のように定義されます. $$ s^{2} = \frac{1}{n} \sum_{i = 1}^{n} (x_i - \overline{x})^{2} $$

5. 標準偏差

分散では、各観測値の平均からの偏差を2乗にしました. なので、観測値の単位と分散の単位は異なります. (観測値の単位の2乗 = 分散の単位.)

そこで、観測値の単位と同じにするために、分散の平方根を考えます. これを標準偏差 (standard deviation) と呼びます.

$$ s = \sqrt{s^{2}} = \sqrt{\frac{1}{n}\sum_{i = 1}^{n}(x_i - \overline{x})^{2}} $$

6. 実装例

ソースコード

今回はnumpyなどのsum関数を用いずにシグマ計算はforループで書きました.

なお、今回使うデータは平均が5となるデータを適当に3つ用意しました.

$$ A = [5, 5, 5, 5, 5] \\ B = [1, 3, 5, 7, 9] \\ C = [1, 1, 5, 8, 10] $$

import math

A = [5, 5, 5, 5, 5]
B = [1, 3, 5, 7, 9]
C = [1, 1, 5, 8, 10]

def calMean(d) :
    sum_v = 0.0
    for di in d :
        sum_v += di
    rsl = sum_v / len(d)
    return rsl

def calVariance(d) :
    sum_v = 0.0
    mean_d = calMean(d)
    for di in d :
        sum_v += pow(di - mean_d, 2)
    rsl = sum_v / len(d) 
    return rsl

def calStandardDeviation(d) :
    variance_d = calVariance(d)
    rsl = math.sqrt(variance_d)
    return rsl


print 'mean of A : ' + str(round(calMean(A), 2))
print 'variance of A : ' + str(round(calVariance(A), 2))
print 'standard deviation of A : ' + str(round(calStandardDeviation(A), 2))
print 'mean of B : ' + str(round(calMean(B), 2))
print 'variance of B : ' + str(round(calVariance(B), 2))
print 'standard deviation of B : ' + str(round(calStandardDeviation(B), 2))
print 'mean of C : ' + str(round(calMean(C), 2))
print 'variance of C : ' + str(round(calVariance(C), 2))
print 'standard deviation of C : ' + str(round(calStandardDeviation(C), 2))
結果
データ群 平均 分散 標準偏差
A 5.0 0.0 0.0
B 5.0 8.0 2.83
C 5.0 13.2 3.63

Aは全てが5なので、偏りがないことがわかります. Bでは平均からの偏差が少し大きい観測値が含まれているため、分散や標準偏差の値が大きくなっています. さらにCでは、Bよりも平均からの偏差が大きい観測値が含まれているので、Bの分散や標準偏差の値よりも大きくなっています.

このように、平均は同じでも、分布の偏りがどうなっているかを知るために、分散や標準偏差を用いて考察することがあります.