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

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

統計解析 IMSL C# vs. R - Part2: 重回帰分析とグラフ出力

前回IMSL C#ライブラリとRとの比較を行い、カイ2乗検定と分割表(Contingency table)をIMSL C#でどのように実現するかをお伝えしました。今回は後半の記事で、グラフィック、可視化機能について紹介します。 blog.roguewave.jp

前回と同様、MSDNの統計解析に関する記事をベースにIMSL C#の機能をローグウェーブのEd Stewartが解説しています。C#などの.NET環境での統計解析についてイメージをつかむヒントになればと思います。

analytics in IMSL C# vs. R – Part II

blog.klocwork.com

例3: グラフィック

Rは強力で高品質なグラフ作成機能を備えています。IMSL C#もまたグラフ作成機能を持ち、2次元に限定されているとはいえ、お使いのデータをすぐに様々な種類のチャートで可視化することができます。出力形式はWindows.FormsアプリケーションおよびASP.NETをサポートしています。件のMSDNの記事では以下の数式をプロットしていました。

{ \displaystyle
z = x{e}^{-({x}^{2}+{y}^{2})}  for -2≤x≤2 , -2≤y≤2
}

z=f(x,y)を計算するのはC#の開発者にとって容易なことです。一方そのコンター図を作成しようとすると通常は工夫が必要ですが、IMSL C#を使うとわずかなコードで描くことができます。グレースケールでよいならさらに短くなります。コードの多くの部分はContourLevelオブジェクトの設定と値をカラーテーブルにマッピングする作業に費やされます。以下の例では配列x、y、zは50x50のグリッド上であらかじめ計算され、zRangeは簡単のため直接ハードコーディングしています。さらにチャートをカスタマイズするために多くのオプションが使用可能です。

Chart c = this.Chart;
AxisXY axis = new AxisXY(c);

int N = 21;
double[] zRange = { -0.5, 0.5 };
double[] cLevels = new double[N];
for (int i = 0; i < cLevels.Length; i++) {
    cLevels[i] = (double)i * (zRange[1] - zRange[0]) / (N - 1.0) + zRange[0];
}
Contour con = new Contour(axis, x, y, z, cLevels);

axis.AxisY.AxisTitle.SetTitle("Y");
axis.AxisX.AxisTitle.SetTitle("X");
c.ChartTitle.SetTitle("z = x * e^(-(x^2 + y^2))"); 

for (int i = 0; i <= N; i++) {
    con.GetContourLevel(i).FillColor =
        Colormap_Fields.BLUE_GREEN_RED_YELLOW.GetColor(1.0 - (i / (N * 1.0)));
}
con.ContourLegend.IsVisible = true;

このコードを、IMSLのFrameChartクラスを継承したWindows.Formクラス内に記述すると、以下の様な画像が表示されます。

http://blog.klocwork.com/wp-content/uploads/2015/08/imsl_image.jpg

例4: 多重線形回帰分析(重回帰分析)

この例はデータの扱い方がRでもIMSL C#でもやや複雑です。どのような魔法の統計パッケージを使うにせよアルゴリズムがどの分析に最適であるかを決めるための知識が必要です。色などのカテゴリー変数と数値解析のアルゴリズムの組み合わせに対し、多数の選択肢があり、いくつかの共通するコツがあります。私たちは3つの色に対して2つの数値を指標として使うことにしました。この例では(0,0)を青、(1.0)をピンク、(0,1)をティール(Teal)とします。いくつかのやり方を試しましたが、(0,1,2)という指標の単一のセットを使うよりもこの方がよい結果が得られました。

入力は花びらのデータを使います。色と花びらの長さとその幅を互いに独立した独立変数、従属変数として成長速度を考えます。これを以下のコードのように2つの配列で表現します。

int nVar = 4;
double[,] data = {{ 0.0, 0.0, 5.4, 1.8 },   // 0,0 = Blue
                  { 0.0, 0.0, 4.8, 1.5 },
                  { 0.0, 0.0, 4.9, 1.6 },
                  { 1.0, 0.0, 5.0, 1.9 },   // 1,0 = Pink
                  { 1.0, 0.0, 5.2, 1.5 },
                  { 1.0, 0.0, 4.7, 1.9 },
                  { 0.0, 1.0, 3.7, 2.2 },   // 0,1 = Teal
                  { 0.0, 1.0, 4.2, 1.9 },
 };
double[] rate = { 0.9, 0.7, 0.8, 0.4, 0.3, 0.4, 1.4, 1.2 };

この分析コンポーネントLinearRegression オブジェクトを生成し、Update()メソッドを呼んで標本値を登録します。

LinearRegression reg = new LinearRegression(nVar, true);
reg.Update(data, rate);

MSDNの記事では4番目の標本値のデータセット {Pink, 5.0, 1.9}がモデルの検証とrateの計算に使われました。この例では期待される値は0.4です。IMSL C#には非常に多くの統計処理機能が利用可能ですが、ここではRのデフォルトで使われているものを利用します。

係数は通常最も関心のある値であり、GetCoefficients()メソッドからdouble[]の形で取得できます。さらにANOVAプロパティと内部クラスCoefficientTTestsValueも得ることができます。いくつかの標本値に対する検証として、内部クラス CaseStatistics を使います。これらの値を得るためのコードは以下のようになります。

double[] coef = reg.GetCoefficients();
ANOVA anova = reg.ANOVA;

LinearRegression.CoefficientTTestsValue ct = reg.CoefficientTTests;
double[] test = { 1.0, 0.0, 5.0, 1.9 };   // test case for pink (1,0), 5.0, 1.9
LinearRegression.CaseStatistics cstat = reg.GetCaseStatistics(test, 0.0);
double predict = cstat.Statistics[1];   // predicted response

出力値は様々な方法で利用可能です。たとえばMSDNの記事のような形で出力してみましょう。

Coefficients:
               Estimate   Std. Error   t stat.    p-value
(Intercept)    -0.14758   0.48286      -0.30565   0.77986
Color-pink     -0.49083   0.04507      -10.89131  0.00166
Color-teal     0.35672    0.09990      3.57057    0.03754
Length         0.04159    0.07876      0.52800    0.63406
Width          0.45200    0.11973      3.77515    0.03255

Rate for {Pink, 5.0, 1.9}:
Predicted:     0.42832    Expected: 0.4

Case Statistics:
Degrees of Freedom, Model: 4 Error: 3
R-squared:     0.9927     Adjusted R-squared: 0.9829
F statistic:   101.6      p-value: 0.00156

r2の最大値(high value)と自由度調整済みの決定係数 (adjusted r2) を見ると、よい予測モデルが生成されたことがわかります。実際予測値は0.43であり、標本値の0.4に近い値です。

さらに

以上の記事は、ホワイトペーパーの形でも配布しています。例の順番は前後しています。 ホワイトペーパー See it for yourself: Analytics in IMSL C# vs. R

また、IMSL C#のドキュメントもご覧ください。

英語ブログのデータアナリティクスに関する過去記事もご覧ください。

blog.klocwork.com IMSL C#ライブラリについてさらに興味をお持ちの方は メール sales@roguewave.jp または お問い合わせフォームでお気軽にご連絡ください。

ローグウェーブソフトウェア セールスエンジニア 柄澤