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が大いに役立つと思います。
この記事が皆さんのお役に立てれば幸いです。
コメント