ITエンジニアのブログ

IT企業でエンジニアやってる人間の日常について

統計学とプログラミング:平均と分散

平均と分散、さらに代表値の例と標準偏差について書きます。

環境

ライブラリ

Pythonではnumpyを使います。

import numpy as np

C言語ではmath.hを使います。

#include <math.h>

データ

テストの得点を想定して、numpyで0~100までの乱数を用意します。

n個の値をx_k (1 \leq k \leq n)とおきます。

# 乱数初期化
np.random.seed(0)
# scoresに0~100までの整数100個を格納
scores = np.random.randint(0, 101, 100)

中身を確認します。

scores
# 出力
array([ 44,  47,  64,  67,  67,   9,  83,  21,  36,  87,  70,  88,  88,
        12,  58,  65,  39,  87,  46,  88,  81,  37,  25,  77,  72,   9,
        20,  80,  69,  79,  47,  64,  82,  99,  88,  49,  29,  19,  19,
        14,  39,  32,  65,   9,  57,  32,  31,  74,  23,  35,  75,  55,
        28,  34,   0,   0,  36,  53,   5,  38,  17,  79,   4,  42,  58,
        31,   1,  65,  41,  57,  35,  11,  46,  82,  91,   0,  14,  99,
        53,  12,  42,  84,  75,  68,   6,  68,  47,   3,  76, 100,  52,
        78,  15,  20,  99,  58,  23,  79,  13,  85])

平均

算術平均 (mean)

よく\muと書かれます。

\mu = \displaystyle \frac{1}{n} \sum_{k=1}^{n} x_k

Python

meanメソッドを使います。

scores.mean()
# 出力
48.75

C言語

配列の中を全て足し、個数で割り算します。

// count: 要素の個数
// array: 得点の配列
double mean(int count, int* array){
    double sum = 0;
    // 各値について
    for(int i = 0; i < count; i++){
        // sumに足し算する
        sum += (double)array[i];
    }
    // 個数で割り算する
    return sum / (double)count;
}

中央値 (median)

中央値は平均値と違い、外れ値(集団と大きく離れた値)の影響を受けにくいです。

例えば、年収の分布であれば、大金持ちが少数含まれていることが想定できる場合、平均値だけでなく中央値も確認したいところです。

np.median(scores)
# 出力
47.0

分散 (variance)

よく\sigma^2と表される分散は、次の式で求められます。

\sigma^2 = \displaystyle \frac{1}{n} \sum_{k=1}^{n} (x_k - \mu)^2

Python

varメソッドを使います。

scores.var()
# 出力
823.4675

C言語

各値に対し、平均との差分を2乗して合計し、個数で割り算します。

// count: 要素の個数
// array: 得点の配列
double variance(int count, int* array){
    // 平均を求める
    double x_mean = mean(count, array);
    double sum = 0;
    // 各値についてsumに足し算していく
    for(int i = 0; i < count; i++){
        // 平均との差分を求める
        double x_diff = (double)array[i] - x_mean;
        // 2乗する
        sum += x_diff * x_diff;
    }
    // 個数で割り算する
    return sum / (double)count;
}

標準偏差

標準偏差Sは、分散の平方根を取れば求められます。

S = \sqrt{\sigma^2}

Python

scores.std()
# 出力
28.696123431571728

C言語

// count: 要素の個数
// array: 得点の配列
double standardDeviation(int count, int* array){
    // 分散の平方根を計算
    return sqrt(variance(count, array));
}

偏差値得点

平均を50とするもので、よく学力試験でよく見られるものですが、今まで求めた平均と標準偏差を用いて、偏差値得点p

p = 10 \cdot \displaystyle\frac{x - \mu}{S} + 50

とします。標準偏差が約28.7だったので、平均48.75から28.7離れると、偏差値得点が10変わることになります。

10 * (scores - scores.mean()) / scores.std() + 50
# 出力
array([48.34472415, 49.39016153, 55.31430666, 56.35974404, 56.35974404,
       36.14795476, 61.93541005, 40.32970427, 45.55689115, 63.32932655,
       57.40518142, 63.67780568, 63.67780568, 37.19339214, 53.22343191,
       55.66278579, 46.60232853, 63.32932655, 49.0416824 , 63.67780568,
       61.2384518 , 45.90537027, 41.72362077, 59.8445353 , 58.10213967,
       36.14795476, 39.98122514, 60.88997267, 57.05670229, 60.54149355,
       49.39016153, 55.31430666, 61.58693092, 67.51107606, 63.67780568,
       50.08711978, 43.11753727, 39.63274602, 39.63274602, 37.89035039,
       46.60232853, 44.16297465, 55.66278579, 36.14795476, 52.87495279,
       44.16297465, 43.81449552, 58.79909792, 41.02666252, 45.20841202,
       59.14757705, 52.17799453, 42.76905814, 44.8599329 , 33.01164263,
       33.01164263, 45.55689115, 51.48103628, 34.75403826, 46.2538494 ,
       38.93578776, 60.54149355, 34.40555913, 47.6477659 , 53.22343191,
       43.81449552, 33.36012176, 55.66278579, 47.29928678, 52.87495279,
       45.20841202, 36.84491301, 49.0416824 , 61.58693092, 64.72324305,
       33.01164263, 37.89035039, 67.51107606, 51.48103628, 37.19339214,
       47.6477659 , 62.28388918, 59.14757705, 56.70822317, 35.10251738,
       56.70822317, 49.39016153, 34.05708001, 59.49605617, 67.85955518,
       51.13255716, 60.19301442, 38.23882951, 39.98122514, 67.51107606,
       53.22343191, 41.02666252, 60.54149355, 37.54187126, 62.6323683 ])

参考文献

統計学入門」(東京大学出版会