ローグウェーブソフトウェアのブログ

開発をシンプルに 安全で高品質のコードを 素早くお客様のもとへ

統計解析 IMSL C# vs. R - Part1

ローグウェーブソフトウェアのセールスエンジニアであるEd Stewartが書いたIMSL C#についての記事をご紹介します。この記事ではまずマイクロソフトR言語(GNU R)とC#を比較した記事を紹介した上で、同じことをローグウェーブの数値計算・統計解析ライブラリIMSLのC#版における実際のコードと比較して、よりシンプルで高品質なコードをすばやく書けるということをお見せしています。

その2はこちら

IMSL C#ライブラリとは

IMSL C#(.NET)ライブラリは、高度な数値計算・統計解析機能の他に、幅広いチャート機能やグラフ機能をC#、F# およびVisual Basic .NETを含む全ての.NET言語で利用できる業界唯一の数値ライブラリです。

Visual Studioを利用する.NET開発者に、最高レベルのプログラミングの生産性や性能、使い易さと共に解析機能へのシームレスなアクセスを提供します。

f:id:RWSJapan:20150909100532g:plain

IMSL C# vs. R - Part1

blog.klocwork.com

デスクトップで統計解析やモデリングを行う際にはR言語が広く使われています。プログラマではない多くの統計家(statistician)にとっては、RやPythonのような高級言語を使うことにより直観的で容易にモデル構築を試行錯誤することができます。

とはいえ、複数のデータ解析タスクをWebアプリケーションやデータベースと組み合わせて大規模で高速なアプリケーションを作成するような時には、C#(.NET)のような本格的な言語が必要となるでしょう。Rは手軽に統計解析の手段を提供してくれるものではありますが、コンピュータの性能をフルに引き出すためのものではありません。

最近マイクロソフトMSDNマガジンである記事を発表しました。

記事の中で統計解析の必要性を論じ、R言語をすすめています。たしかに自前の便利な統計関数も含まれているようです。とはいえ、これらのコードをコピーしたり自分のコードを書き換えたりする必要はありません。既にIMSL C#という、よりすぐれた堅牢な手段が存在し、プラグインとして呼び出すだけで純粋なC#での統計解析をすぐに開始できるからです。

以下、2回に分けてこのMSDNの記事中の例題を使い、IMSL C#を使うとRと同じ結果がより早くシンプルに得られるということを示しましょう。

例1: R を使用したカイ2乗検定

MSDNの記事の最初の例はサイコロの目の出方に偏りがあるかどうかを確かめる分析です。カイ2乗検定はこのデータ・セットを分析する上でよい選択肢であり、IMSL C#で利用可能です。入力データは150回サイコロを転がして観察された6つの目それぞれの回数です。カイ2乗検定を使うと統計学的にサイコロがフェアであるかどうか、つまり偏りがなくどの目も平等に出現するのかを調べることができます。IMSL C#の例は以下のように書かれています。

double[] obs = { 20, 28, 12, 32, 22, 36 }; 
ChiSquaredTest cs = new ChiSquaredTest(this, obs.Length-1, 0);
cs.SetRange(0, 6); // min is exclusive, max is inclusive
cs.Update(new double[] { 1, 2, 3, 4, 5, 6 }, obs);

ここで、ChiSquaredTestのコンストラクタに渡されるthisに注目してください。mainクラスがIMSLの ICdfFunctionインターフェイスを実装し、検定で使用される適切な連続分布関数(CDF,continuous distribution function)を指定します。サイコロを転がす事例に対しては、適切な連続分布関数は離散一様分布(discrete uniform)であり、これもIMSLで利用可能です。このインターフェイスメソッドCdfFunctionの実装を要求します。CdfFunctionはCDFを検査する場所を表す実数を1つ引数に取り、実数を返します。確率差異を整数に丸め、また返り値を0.0以上にするためのコードを追加します。

public double CdfFunction(double x) {
   int xi = (int)Math.Floor(x);
   if (xi > 0) {
      return Cdf.DiscreteUniform(xi, 6);
   } else {
      return 0.0;
   }
}

この段階で計算の準備が整い、あとは知りたい計測値を受け取るだけになります。元記事で紹介されていた例はIMSL C#でできることのほんの一部ですが、プロパティにアクセスするかgetterメソッドを使えば必要な情報を受け取ることができます。

double chisq = cs.ChiSquared;
double dof = cs.DegreesOfFreedom; 
double pvalue = cs.P; 
double[] expected = cs.GetExpectedCounts();

出力の設定やフォーマットはアプリケーション次第で自由に決められます。たいていの場合はGUIの要素かコンソールへの直接出力になるでしょう。

chi-squared statistic: 15.28 
degrees of freedom: 5 
p-value: 0.009231 
Expected Counts: { 25, 25, 25, 25, 25, 25 }

カイ2乗が大きな値を持ちp-valueが1パーセントより小さいため、このサイコロが統計的に偏りがあると結論付けることができます。

例2: 分割表(Contingency table)

MSDNの記事の別の例ではRについてそれほど詳細には説明されていません。コンセプトは観測量が統計的に独立かどうかを評価するというものです。結果のp-valueが5パーセントより小さければ2つの観測量が互いに独立ではなく関係がある、という結論になります。これを調べるためには先ほどのカイ2乗検定も有効ですが、IMSL C#にはさらにこういった問題に特化した関数があります。ContingencyTableクラスを使うと簡潔なコードになります。

double[,] matrix = { { 15, 25, 10 }, { 30, 15, 5 } };
ContingencyTable ct = new ContingencyTable(matrix);
double pvalue = ct.P;

あとはp-valueの値を0.05と比較して統計的な有意性をたしかめるだけです。今回の例ではp-value=0.01022となり、2 つの要素が無関係ではないことが 5% の有意水準で示されます。

その他

残りの例、線形回帰分析とグラフについても追って記事をご紹介し、IMSL C#ライブラリが同じ結果をより早くシンプルに書けることをお伝えします。

roguewave.jp

IMSL C#JMSLを使えばC#Javaのような言語で書かれた既存のアプリケーションからもそのまま同じ言語ですぐれた関数をすぐに利用することができます。なお、C#ではなくR言語を使いたい、という統計家のみなさまには、ローグウェーブのOpenLogicサービスからもダウンロードやサポートをご利用いただけますのでご検討ください。 olex.openlogic.com

blog.roguewave.jp

by YK