C#による 主成分分析

C#によるサンプルソースコード : 使用関数名:g03aa

Keyword: 主成分分析, 多変量解析

概要

本サンプルは主成分分析を行うC#によるサンプルプログラムです。 本サンプルは以下の「分析対象データ」に示される変数が3個で観察数が10のデータを分析対象とします。 このサンプルでは主成分分析を行い、固有値、寄与度、χ二乗値、自由度、有意度、主成分負荷量、主成分スコアを出力します。

主成分分析のデータ 

※本サンプルはnAG Library for .NETに含まれる関数 g03aa() のExampleコードです。本サンプル及び関数の詳細情報は g03aa のマニュアルページをご参照ください。
ご相談やお問い合わせはこちらまで

入力データ

(本関数の詳細はg03aa のマニュアルページを参照)

このデータをダウンロード
g03aa Example Program Data
 'V' 'E' 'U' 10 3
7.0 4.0 3.0
4.0 1.0 8.0
6.0 3.0 5.0
8.0 6.0 1.0
8.0 5.0 7.0
7.0 2.0 9.0
5.0 3.0 3.0
9.0 5.0 8.0
7.0 4.0 5.0
8.0 2.0 2.0
 1   1   1   3 

  • 1行目はタイトル行で読み飛ばされます。
  • 2行目は計算の際に用いる行列の種類 (matrix="V")、計算に利用する主成分スコアのタイプ (std="E")、 重み付けをするかどうか (weight="U")、観察数 (n=10)、変数の数 (m=3) を指定しています。 
    計算の際に用いる行列の種類に "V" が指定されていますが、これは分散共分散行列を用いることを意味します。
    主成分スコアのタイプは計算で用いる主成分スコアの種類を指定しますが、ここで指定されている"E" は主成分スコアに(分散が対応する固有値と同じになるように)標準化されたものを使う事が指定されています。
    また各観察データに重みをつけることも可能ですが、ここでは "U" を指定して重みを付けない事を指定しています。
  • 3行目〜12行目は観察データ(x)を指定しています。各行はそれぞれの観察値であり、3つ(2行目で示される変数の数)の値を持っています。
  • 13行目は計算で使う変数がどれであるかを示すパラメータ(isx)を指定しています。ここで 1 は計算で使う事を示しています。(0は計算で当該変数を使わないことを示します。ここで与える数字は変数の数分(ここでは3)なければなりません。 今回のデータはすべての変数を計算で使うので3つの 1 が与えられています。
    最後の数字 (=3) は出力として得たい主成分の数(nvar)を指定しています。この数値は2行目で指定される変数の数を超えてはいけません。

出力結果

(本関数の詳細はg03aa のマニュアルページを参照)

この出力例をダウンロード
g03aa Example Program Results

 Eigenvalues  Percentage  Cumulative     Chisq      DF     Sig
               variation   variation

      8.2739      0.6515      0.6515      8.6127      5.0000      0.1255
      3.6761      0.2895      0.9410      4.1183      2.0000      0.1276
      0.7499      0.0590      1.0000      0.0000      0.0000      0.0000

 Principal component loadings

  -0.1376   0.6990   0.7017
  -0.2505   0.6609  -0.7075
   0.9583   0.2731  -0.0842

Principal component scores

 1   -2.151   -0.173   -0.107
 2    3.804   -2.887   -0.510
 3    0.153   -0.987   -0.269
 4   -4.707    1.302   -0.652
 5    1.294    2.279   -0.449
 6    4.099    0.144    0.803
 7   -1.626   -2.232   -0.803
 8    2.114    3.251    0.168
 9   -0.235    0.373   -0.275
 10   -2.746   -1.069    2.094

  • 1行目はタイトルです
  • 3行目〜8行目には各主成分の固有値 (Eigenvalues)、寄与度 (Percentage variation)、累積寄与度 (Cumulative variation)、χ二乗値 (Chisq)、自由度 (DF)、有意度 (Sig) がそれぞれ出力されます。6行目から8行目の各行は上から順番に第一主成分、第二主成分、第三主成分の各値を示しています。
  • 10行目から14行目に主成分負荷量を示しています。
  • 16行目から27行目は主成分スコアが出力されています。 行方向は観察データ、列方向は主成分をそれぞれ表しています。

ソースコード

(本関数の詳細はg03aa のマニュアルページを参照)

※本サンプルソースコードは .NET環境用の科学技術・統計計算ライブラリである「nAG Library for .NET」の関数を呼び出します。
サンプルのコンパイル及び実行方法


このソースコードをダウンロード
//      g03aa Example Program Text
//      C# version, nAG Copyright 2008
using System;
using NagLibrary;
namespace NagDotNetExamples
{
  public class G03AAE
  {
    static bool defaultdata = true;
    static string datafile = "";
    static void Main(String[] args)
    {
      if (args.Length == 1)
      {
        defaultdata = false;
        datafile = args[0];
      }
      StartExample();
    }
    public static void StartExample()
    {
      try
      {
        DataReader sr = null;
        if (defaultdata)
        {
          sr = new DataReader("exampledata/g03aae.d");
        }
        else
        {
          sr = new DataReader(datafile);
        }
        int i,  j,  m,  n,  nvar; string matrix="",  std="",  weight="";
        int ifail;
        Console.WriteLine("g03aa Example Program Results");
        //      Skip heading in data file
        sr.Reset();
        sr.Reset();
        matrix = sr.Next();
        std = sr.Next();
        weight = sr.Next();
        n = int.Parse(sr.Next());
        m = int.Parse(sr.Next());
        double[] s = new double[m];
        double[] wt = new double[n];
        double[,] x = new double[n, m];
        int[] isx = new int[m];
        if ( n >= 2 && m >= 1 )
        {
          if ((weight == "U") || (weight == "u"))
          {
            for (i = 1 ; i <= n ; i++)
            {
              sr.Reset();
              for (j = 1 ; j <= m ; j++)
              {
                x[i - 1 , j - 1] = double.Parse(sr.Next());
              }
            }
          }
          else
          {
            for (i = 1 ; i <= n ; i++)
            {
              sr.Reset();
              for (j = 1 ; j <= m ; j++)
              {
                x[i - 1 , j - 1] = double.Parse(sr.Next());
              }
              wt[i - 1] = double.Parse(sr.Next());
            }
          }
          sr.Reset();
          for (j = 1 ; j <= m ; j++)
          {
            isx[j - 1] = int.Parse(sr.Next());
          }
          nvar = int.Parse(sr.Next());
          double[,] e = new double[nvar, 6];
          double[,] p = new double[nvar, nvar];
          double[,] v = new double[n, nvar];
          if ((matrix == "S") || (matrix == "s"))
          {
            sr.Reset();
            for (j = 1 ; j <= m ; j++)
            {
              s[j - 1] = double.Parse(sr.Next());
            }
          }
          // 
          G03.g03aa(matrix, std, weight, n, m, x, isx, s, wt, nvar, e, p, v, out ifail);
          // 
          if (ifail == 0)
          {
            Console.WriteLine("");
            Console.WriteLine(" {0}","Eigenvalues  Percentage  Cumulative     Chisq      DF     Sig");
            Console.WriteLine(" {0}","              variation   variation");
            Console.WriteLine("");
            for (i = 1 ; i <= nvar ; i++)
            {
              for (j = 1 ; j <= 6 ; j++)
              {
                Console.Write("{0, 12:f4}", e[i - 1 , j - 1]);
              }
              Console.WriteLine();
            }
            Console.WriteLine("");
            Console.WriteLine(" {0}","Principal component loadings");
            Console.WriteLine("");
            for (i = 1 ; i <= nvar ; i++)
            {
              for (j = 1 ; j <= nvar ; j++)
              {
                Console.Write("{0, 9:f4}", p[i - 1 , j - 1]);
              }
              Console.WriteLine();
            }
            Console.WriteLine("");
            Console.WriteLine("{0}","Principal component scores");
            Console.WriteLine("");
            for (i = 1 ; i <= n ; i++)
            {
              Console.Write(" {0}",  i);
              for (j = 1 ; j <= nvar ; j++)
              {
                Console.Write("{0, 9:f3}", v[i - 1 , j - 1]);
              }
              Console.WriteLine();
            }
          }
          else
          {
            Console.WriteLine("");
            Console.WriteLine("  {0}{1,5}"," ** g03aa returned with ifail = ",ifail);
          }
        }
        // 
      }
      catch (Exception e)
      {
        Console.WriteLine(e.Message);
        Console.WriteLine("Exception Raised");
      }
    }
  }
}

リファレンス

サンプル入力データは Cooley W C and Lohnes P R (1971) Multivariate Data Analysis Wiley よりのデータです。


関連情報
Privacy Policy  /  Trademarks