C#.NETのChartで確率密度分布グラフ表示

C#.NET

ad2

データベース接続して、データ取得して確率密度分布図作成してみた

C#でoracleDatabaseのデータを取得して、データの確率密度分布図を作図するソースコードを書いてみました。

色々調べたのですが、あまり情報が載ていなくて、なんとか試行錯誤して出来た感じです。

処理のフロー

  • 事前にoracleDBにデータを入れておく。
  • oracleDBに接続
  • select文のクエリーでデータ取得
  • LinQでList化する。
  • 確率密度分布関数で計算し、データを取得する
  • グラフにデータプロットして描画させる。

OracleDBにデータを作成

Create table文でCHARTテーブルを作成、カラム(列)にNo,Value1,Value2を追加。

Create table CHART (NO NUMBER, Value1 VARCHAR2(100), Value1 VARCHAR2(100));

value1データは乱数で取得した数値を文字列として、2000個入れています。

Oracleデータベース接続し、データ取得

データベースに入れるデータは書きのcsvファイルで

ここで、ソースコードの全文を載せておきます。後述にて解説致します。

ビルドして、実行すると、下記のグラフのような確率密度分布図が描画される。value1のデータは、乱数で取得したので、均等にばらつきがある値が入っています。

 

Chartコントロールを画面上に配置

まずは、画面でchartコントロールを配置します。Formのデザイナーエディター画面を開いて、ツールボックスのデータ>ChartコントロールをForm画面上に配置。

Chartプロパティ画面で、seriesコレクション…を開いてChartTypeで、Column(棒グラフ)に設定する。

確率密度関数

  • x:データ(データベースから取得したデータ)
  • μ:xの平均値
  • σ:xの標準偏差
double sigma = list_value1.PopulationStandardDeviation();  //標準偏差σ
double average = list_value1.Average();                    //平均

List化したデータからLinqを活用して、μ:平均値とσ:標準偏差を求めている。

//確率密度分布関数
double normDist = (double)(Math.Exp(-Math.Pow(list_value1[valuesCount] - average, 2) / 2) / Math.Sqrt((2 * Math.PI)) * sigma);

確率分布関数式をソースコードで表現し、各値を代入する。

グラフにデータプロット

//グラフプロット
chart1.Series["Series1"].Points.AddXY(list_value1[valuesCount], normDist);

グラフにデータプロットする。

まとめ

oracleDBからデータを取得し、確率密度分布図を作成するソースコードを載せてみました。

仕事で確率密度分布図を使うので、C#でグラフ表示できないか。と、今回調べてなんとか実現できました。

誰かのお役に立てれば幸いです。