標準偏差を計算してみる

提供: とある社畜の頭脳整理
移動: 案内検索

標準偏差を計算するプログラムだよ。

標準偏差とは?

標準偏差というのは、値の散らばり具合をあらわす数値なんだ。詳しくはWikipediaを見てほしいんだ。
標準偏差 - Wikipedia

基本的な公式は以下のとおりだよ。


とした場合


数学に慣れてないと、非常にわかり辛い…(^_^;)

要は…

  1. データ全体の平均を出す。
  2. それぞれの値と平均の差を出す。
  3. 差を2乗して合計する。
  4. データの数で「差の2乗の合計」を割る。
  5. その、平方根を出す。

ってことなんだ。

ソース

ということで、C♯のソースだよ。WPFのモデルのソースをそのまま貼り付けているから、必要に応じて修正してね。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
 
namespace StandardDeviationSample
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
 
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            //リストに分析データを突っ込む
            List<Double> l_ImputData = new List<Double>();
            l_ImputData.Add(80.323);
            l_ImputData.Add(80.279);
            l_ImputData.Add(80.321);
            l_ImputData.Add(80.221);
            l_ImputData.Add(80.158);
            l_ImputData.Add(80.073);
            l_ImputData.Add(80.054);
            l_ImputData.Add(80.08);
            l_ImputData.Add(79.837);
            l_ImputData.Add(79.811);
 
            //標準偏差を計算
            Double l_StandardDeviation = this.CalcStandardDeviation(l_ImputData.ToArray());
 
            //結果を表示
            MessageBox.Show("標準偏差は「" + l_StandardDeviation.ToString() + "」です。", "標準偏差");
        }
 
        /// <summary>
        /// 標準偏差計算
        /// </summary>
        /// <param name="p_Values">データ</param>
        /// <returns>標準偏差</returns>
        private Double CalcStandardDeviation(Double[] p_Values)
        {
            //平均を取得
            Double l_Average = p_Values.Average();
 
            //「σの二乗×データ数」まで計算
            Double l_StandardDeviation = 0;
            foreach(Double f_Value in p_Values)
            {
                //乗数が固定ならMath.Powを使わないほうが高速!
                l_StandardDeviation += (f_Value - l_Average) * (f_Value - l_Average);
            }
 
            //σを算出して返却
            return Math.Sqrt(l_StandardDeviation / p_Values.Length);
        }
    }
}

関連項目