C#で最大、最小、中央値、標準偏差、分散、四分位などの統計情報を計算する際、Math.NET というフリーのライブラリが良く使われます。
今回は、この Math.NET のインストール方法と使い方、そして簡単な関数のサンプルを作ったてみたので、それらを合わせて紹介したいと思います。
Math.NETとは
.NET で数値計算を行う場合、標準のMathクラスが用意されていますが、これはルートや乗数、三角関数などの計算に用いるメソッドしか用意されていません。
一方、Math.NET は、行列やベクトル計算、データ生成、回帰など、標準のMathには無い様々な数値計算用クラスや関数が用意されています。
詳しい説明はこちらの公式ページに記載されていますので、必要に応じてご参照下さい。英語ですが、Chromeなどで日本語に翻訳すれば、おおよその使い方は理解できると思います。
インストール方法
NuGetでインストールします(NuGetの使い方が知りたい方は、こちらのページをご覧ください)。
Math、又は Math.NET で検索すれば 「MathNet.Numerics」が表示されるので、これを選んでプロジェクトにインストールします。
Math.NETによる統計量の計算方法と関数一覧
プログラムの先頭に以下の通り using を記述します。
1 |
using MathNet.Numerics.Statistics; |
統計量の計算は、double型の配列に対する拡張メソッドとして呼び出すことが可能です。
1 2 3 |
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; の記述をお忘れなく。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
/// <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引数に標準偏差を指定出来ます。
1 2 3 4 5 6 7 8 9 10 11 |
//テストデータの生成 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が大いに役立つと思います。
この記事が皆さんのお役に立てれば幸いです。
コメント