目次
経緯
CSVファイルからデータを読み込む処理ができたので、次のステップとして、統計情報(最大値・最小値・平均値・中央値・1σ・2σ)を自動的に計算したいと思い、今回学習しました。
C#では、ライブラリ「MathNet.Numerics」を使うと、統計解析の実装が非常に簡単に行えます。
使用ライブラリ:MathNet.Numerics
このライブラリを使えば、中央値(Median)や標準偏差(StandardDeviation)なども1行で取得できます。
使用前に、Visual Studio の「NuGet パッケージの管理」から MathNet.Numerics
をインストールしておきましょう。
実装コード:ボタンを押すと統計情報を計算
以下は、フォーム上のボタン btnStatisticalAnalysis
をクリックすると、CSVから読み込んだデータ dt
の T50_CO
列に対して統計処理を行うコード例です。
using MathNet.Numerics.Statistics;
private void btnStatisticalAnalysis_Click(object sender, EventArgs e)
{
// 最大値を取得
double maxT50_CO = dt.AsEnumerable()
.Max(row => double.TryParse(row["T50_CO"].ToString(), out var val) ? val : 0);
// 最小値を取得
double minT50_CO = dt.AsEnumerable()
.Min(row => double.TryParse(row["T50_CO"].ToString(), out var val) ? val : double.MaxValue);
// 平均値を取得
double averageT50_CO = dt.AsEnumerable()
.Where(row => double.TryParse(row["T50_CO"].ToString(), out _))
.Average(row => double.Parse(row["T50_CO"].ToString()));
averageT50_CO = Math.Round(averageT50_CO, 3);
// 中央値・標準偏差を取得する準備
var rows = dt.AsEnumerable()
.Where(row => double.TryParse(row["T50_CO"].ToString(), out _));
var values = rows.Select(row => double.Parse(row["T50_CO"].ToString())).ToArray();
// 中央値(Median)
double medianT50_CO = Statistics.Median(values);
// 標準偏差(1σ)
double standardDeviationT50_CO = Statistics.StandardDeviation(values);
// 2σ
double twoSigmaT50_CO = 2 * standardDeviationT50_CO;
// 結果表示(任意)
MessageBox.Show($"最大値: {maxT50_CO}\n最小値: {minT50_CO}\n平均値: {averageT50_CO}\n中央値: {medianT50_CO}\n1σ: {standardDeviationT50_CO}\n2σ: {twoSigmaT50_CO}");
}
統計用語の補足説明
- 最大値・最小値:対象データの中で一番大きい値/小さい値
- 平均値:データの合計を個数で割った値
- 中央値(Median):値を並べたときに中央に位置する値
- 標準偏差(1σ):データの散らばり具合を表す指標
- 2σ:標準偏差の2倍。約95%のデータがこの範囲に収まるとされます
注意点と補足
- データは
double.TryParse()
で数値として正しく扱えるかチェックしています Median
やStandardDeviation
を使うには、配列データに変換する必要があります(LINQで簡単に実装可能)- 計算対象となる列名(例:
T50_CO
)や型は、読み込むCSVファイルに応じて変更してください
まとめ
CSVファイルを読み込んで得られたデータから、最大値・最小値・平均値・中央値・1σ・2σ を求める処理は、MathNet.Numerics
を使えばシンプルな構文で実装できます。
データ分析やレポート出力に活用できるので、フォームアプリケーションでの統計処理の第一歩として非常に便利です。
最後までお読みいただきありがとうございました。