2009年7月28日火曜日

分散 (標本分散: sample variance) と 標準偏差 (standard deviation)

分散はデータのバラツキ。
平均からどれくらいサンプルが離れているかを知りたいので、 平均からサンプルを引き、負の値にしないために2乗すると考えると分かりやすい。
標準偏差は分散の平方根。

公式 (分散)


公式 (標準偏差)


C言語での実装

式(2) を実装。ゼロ除算を防ぐために、nが0(0以下)の場合は0を返すようにする。
#include <stdio.h>
#include <math.h>

/* ---------------------------------------------
  分散を計算する
  引数1: a データ
  引数2: n aの要素数
  戻り値 分散
 ---------------------------------------------*/
double variance(double *a, int n)
{
    size_t i;
    double sum = 0.0;
    double sqsum = 0.0;
    double avg;

    if ( n < 1 ) return 0.0;

    for (i = 0; i < n; i++) {
        sum += a[i]; /* 和 */
        sqsum += a[i] * a[i]; /* 平方和 */
    }

    avg = sum / (double)n; /* 平均 */
    return sqsum / (double)n - avg * avg; /* 分散 */
}

/* main */
int main(void)
{
    double numbers[] = {1.0, 2.0, 3.0};
    double var, std_dev;

    var = variance(numbers, 3);
    std_dev = sqrt(var);
    printf("分散:%f\n", var);
    printf("標準偏差:%f\n", std_dev);

    return 0;
}
実行例
分散:0.666667
標準偏差:0.816497

0 件のコメント:

コメントを投稿