もっと詳しく

C#で最大、最小、中央値、標準偏差、分散、四分位などの統計情報を計算する際、Math.NET というフリーのライブラリが良く使われます。

今回は、この Math.NET のインストール方法と使い方、そして簡単な関数のサンプルを作ったてみたので、それらを合わせて紹介したいと思います。

Math.NETとは

.NET で数値計算を行う場合、標準のMathクラスが用意されていますが、これはルートや乗数、三角関数などの計算に用いるメソッドしか用意されていません。

一方、Math.NET は、行列やベクトル計算、データ生成、回帰など、標準のMathには無い様々な数値計算用クラスや関数が用意されています。

詳しい説明はこちらの公式ページに記載されていますので、必要に応じてご参照下さい。

英語ですが、Chromeなどで日本語に翻訳すれば、おおよその使い方は理解できると思います。

インストール方法

NuGetでインストールします(NuGetの使い方が知りたい方は、こちらのページをご覧ください)。

Math、又は Math.NET で検索すれば 「MathNet.Numerics」が表示されるので、これを選んでプロジェクトにインストールします。

Math.NETによる統計量の計算方法と関数一覧

プログラムの先頭に以下の通り using を記述します。

using MathNet.Numerics.Statistics;

統計量の計算は、double型の配列に対する拡張メソッドとして呼び出すことが可能です。

var values = new double[]{1.25,3.58,7.25,6.36,5.18};
var max = values.Maximum();
var sd = values.StandardDevaton();

下記が、Math.NET で使える統計量の関数です。

機能 メソッド名
最大値 values.Maximum()
最小値 values.Minimum()
中央値 values.Medan()
平均値 values.Average()
母標準偏差 values.PopulatonStandardDevaton()
標準偏差 values.StandardDevaton()
母分散 values.PopulatonVarance()
分散 values.Varance()
歪度 values.Skewness()
尖度 values.Kurtoss()
25%パーセンタイル(第一四分位) values.Percentle(25)
50%パーセンタイル(中央値) values.Percentle(50)

サンプルプログラム(関数サンプル)

Math.NET の使い方を紹介するにあたり、一通りの統計量を返す関数にしてみました。

とりあえず使いたいという方は、コピペして直ぐにお使いいただけます。

関数のソースコード

以下が関数のソースコードですが、単純にMath.NETのメソッドを呼んでListに結果を格納しているだけです。

これを使う際には、プログラム先頭に using MathNet.Numerics.Statistics; の記述をお忘れなく。

/// <summary>
/// 統計情報を求める
/// </summary>
/// <param name="self"></param>
/// <returns></returns>
public (string title, double value)[] CalcStatistics(double[] values)
{
    List<(string title, double value)> info = new List<(string title, double value)>();

    info.Add(("最大値", values.Maximum()));
    info.Add(("最小値", values.Minimum()));
    info.Add(("中央値", values.Median()));
    info.Add(("平均値", values.Average()));
    info.Add(("母標準偏差", values.PopulationStandardDeviation()));
    info.Add(("標準偏差", values.StandardDeviation()));
    info.Add(("母分散", values.PopulationVariance()));
    info.Add(("分散", values.Variance()));
    info.Add(("歪度", values.Skewness()));
    info.Add(("尖度", values.Kurtosis()));
    info.Add(("25%パーセンタイル(第一四分位)", values.Percentile(25)));
    info.Add(("50%パーセンタイル(中央値)", values.Percentile(50)));
    info.Add(("75%パーセンタイル(第三四分位)", values.Percentile(75)));
    info.Add(("-3σ", values.Average() - values.StandardDeviation() * 3));
    info.Add(("+3σ", values.Average() + values.StandardDeviation() * 3));

    return info.ToArray();
}

関数の使い方

関数の使い方は CalcStatics の引数に配列を指定するだけです。

MathNet.Numerics.Generate.Normal() を使うと、正規分布のサンプルデータを簡単に生成することが出来ます。

第1引数にデータ個数、第2引数に平均値、第3引数に標準偏差を指定出来ます。

//テストデータの生成
var values = MathNet.Numerics.Generate.Normal(1000, mean: 10.0, standardDeviation: 2.0);

//統計量の計算
var statistics = CalcStatistics(values);

//結果の出力
foreach (var item in statistics)
{
    Console.WriteLine("{0} {1}", item.title, item.value);
}

MathNet.Numerics.Generate.Normal() で自動生成したデータは、以下の分布になっています。

サンプルプログラムの実行結果は以下の様になりました。

最大値 15.791455911737938			
最小値 3.962619679598153			
中央値 9.986782046921993			
平均値 9.93137690012798			
母標準偏差 1.9780080643264362			
標準偏差 1.9789978107302926			
母分散 3.912515902540415			
分散 3.9164323348752905			
歪度 -0.00477716332587092			
尖度 -0.29619411501881826			
25%パーセンタイル(第一四分位) 8.542725661820077			
50%パーセンタイル(中央値) 9.986782046921993			
75%パーセンタイル(第三四分位) 11.249605639810254			
-3σ 3.9943834679371015			
+3σ 15.868370332318857

まとめ

今回は .NET 用のフリーな数値演算ライブラリ Math.NET について、インストール方法と使い方について紹介致しました。

データ分析をする上で統計量を使う場合、標準偏差や分散などの単一情報ではなく、統計量全体を見ることが多いので、一括して結果を返す仕様で関数を作りました。

データ分析と言えばPythonが良く使われますが、色々なデータに対して簡単に統計量を表示するようなケースでは、WPFやWindowsForm でツール化したくなります。

そんな時、このMath.NETが大いに役立つと思います。

この記事が皆さんのお役に立てれば幸いです。