関西SASユーザｰ会ｰSASを使った便利なTIPS＆テクニックｰ
SAS Institute Japan Ltd.
東 一成（KazunariAzuma）
Kazunari.Azuma@
sas.com.com
Kazunari.Azuma@sas

本日のアジェンダ
w あるユーザーからの質問からサンプルを二つご紹介します。
(BaseSASだけではなくSAS/STATも必要ですがも必要ですが…
…)
BaseSASだけではなくSAS/STAT– SASでランダムサンプリングを行うにはどうすればよいですが？
SASでランダムサンプリングを行うにはどうすればよいですが？
w 色々な手法を選んだり、件数や繰り返してサンプリングを行う簡単な方法はありませんか？

– 主成分分析により、Prin1、Prin2、と変数が作成され主成分分析により、Prin1、Prin2、Prin3、、、Prin3、、、と変数が作成されます。Eigenvalue
が 1 以上の変数のみをKeepするには？
ます。Eigenvalueが以上の変数のみをKeepするには？

21

SASによるサンプリングについて

3サンプリングのための方法
w V6の場合・・・– RANUNI関数を利用して、乱数を発生させてデータステッRANUNI関数を利用して、乱数を発生させてデータステッ
プなどを利用して抽出する。
– SQLプロシジャなどを用いて抽出する。
SQLプロシジャなどを用いて抽出する。
– 層別抽出の場合はFREQ
プロシジャなどを組み合わせで層別抽出の場合はFREQプロシジャなどを組み合わせで実現をする。
– BaseSASがあればOK。
。
BaseSASがあればOK

w V8の場合・・・– SURVEYSELECTプロシジャを利用すれば数行で済む。
SURVEYSELECTプロシジャを利用すれば数行で済む。
– ただしSAS/STATが必要。
ただしSAS/STATが必要。
42

色々なサンプリング手法
w 例えば以下のようなサンプリング手法を考えます。
– 単純無作為抽出– 系統抽出法（システムサンプリング）– 層別抽出– 復元抽出– 非復元抽出– 上記の抽出方法をいかにして行うかをご紹介させていただきます。

w V6による方法は単純無作為抽出と層別抽出の二つだけにしV6による方法は単純無作為抽出と層別抽出の二つだけにしたいと思います。
5それぞれのサンプリング手法について１w 単純無作為抽出法– 単純無作為抽出とは、母集団のどの固体も同じ確率で取り出される抽出法。乱数表やコンピューターに乱数を発生をさせて、サンプルを抽出する場合が多い。

w 系統抽出法（システムサンプリング）– 系統抽出法は母集団構成員のリストで標本を等間隔に並んでいる個体を取り出していく方法。500人の母集団から5050人のサンプルが必要だとすると、最初人のサンプルが必要だとすると、最初出していく方法。500人の母集団からの1名は乱数などにより決定される。最初が5、25名は乱数などにより決定される。最初が5番だとするとそれ以降は、15番だとするとそれ以降は、15、、35･･･といった形で抽出されて行く方法。
35･･･といった形で抽出されて行く方法。

w 層別抽出法– 母集団をいくつかの層に分け、それぞれの層から単純無作為抽出法などによって、サンプルを作成する方法。各層から抽出する場合、母集団の各層の人数に比例させる方法が多い。これは各母集団の内部で、いくつかの均質な層に分かれていると考え、各層別に標本を抽出してサンプルを作成した方が誤差が小さく、均質なサンプルを得ることができるという考え方。
63

それぞれのサンプリング手法について２w

復元抽出
–w

母集団から標本を抽出する場合に、どの標本も同じ確率で取り出される状態である必要がある。このためには取り出した標本をもう一度母集団に戻して、次の標本を取り出す必要がある。ただ場合によっては重複されて抽出される標本が出てくる。

非復元抽出
上記の復元抽出とは逆で、一度抽出された標本は母集団に戻さないで、次の標本を抽出する。
上記の二つの手法であるが、サンプルの標本数に比較して、母集団が十分に大きければ、重複が起こる可能性も低いので、差はほとんど無いと考えられる。

–w

7

今回利用するデータについて
w 今回のサンプリングの例で利用するデータは以下のような形で、20,000件あります。
形で、20,000件あります。

8OBS
1234567891011121314

CUST_ID
1234567891011121314AGE
4444375632626040512744283134

GENDER
女性
女性
女性
女性
女性
女性
女性
男性
女性
女性
女性
不明
女性
女性

FLG
0
100
0
00
1
10
1
001Sales
1500
000
3400
00000012000
00MARRIAGE
既婚
未婚
既婚
既婚
既婚
既婚
未婚
未婚
未婚
未婚
未婚
既婚
既婚
既婚

HOUSING
学生寮
学生寮
社宅
マンション(賃)
社宅マンション(賃)マンション(賃)
社宅
社宅
学生寮
学生寮
マンション(持)社宅マンション(持)4無作為抽出の方法ｰSASV6の場合 1/*件数を指定する場合‑SQLプロシジャ*//*件数を指定する場合‑
SQLプロシジャ*/proc sql outobs=outobs=2000;
2000;
create table sample1 as
select ranuni(ranuni(0) as random, * from ksug.customer
ksug.customer orderby random;
quit;
quit;

SQLプロシジャを利用して行う方法。この場合は
RANUNI関数を利用して乱関数を利用して乱SQLプロシジャを利用して行う方法。この場合はRANUNI数を発生させ、乱数の値で上位2000件を取ってきている。
数を発生させ、乱数の値で上位2000件を取ってきている。
比較的単純に行う事が出きるので便利。

9

無作為抽出の方法ｰSASV6の場合 2/*件数を指定する場合‑データステップ*//*件数を指定する場合‑
データステップ*/
data sample2 ;set ksug.customer
ksug.customer nobs = total ;if ̲sample̲count̲ < 2000 then do ;if ranuni(ranuni(0) *(total + 1 ‑ ̲N̲ ) < = ( 2000 ‑ ̲sample̲count̲)̲sample̲count̲) then do ;
̲sample̲count̲ + 1 ;output ;
end ;
end ;
drop ̲sample̲count̲ ;run ;データステップを使って行う方法は上記の通り。
乱数を発生させる部分はSQLプロシジャの場合と同じであるが、上記の例では2,0002,000件と指定してあるの件と指定してあるの乱数を発生させる部分はSQLプロシジャの場合と同じであるが、上記の例ではで、偏ったとり方をしないように工夫が行われている。流れとしては以下のとおりになる。

10○例えば･･･20,000件のうち2,0002,000件を抽出したいので、全体の約件を抽出したいので、全体の約10%10%を抽出。
を抽出。
○例えば･･･20,000件のうち1件目 乱数0.5
乱数0.5 * 20000+1 - 1 <= (2000 - 0) →抽出されない2件目 乱数0.1
乱数0.1 * 20000+1 - 2 <= (2000 - 0) →抽出される3件目 乱数0.9
乱数0.9 * 20000+1 - 3 <= (2000 - 1) →抽出されない
上記の処理を2000件になるまで行う。
上記の処理を2000件になるまで行う。

5

無作為抽出の方法ｰSASV6の場合 3/*おおよその割合で抽出する場合*//*おおよその割合で抽出する場合*/
data sample3;
set ksug.customer;
ksug.customer;
if ranuni(;ranuni(0)<=0.1)<=0.1;
run;
run;
上記の場合も乱数を発生させる方法で同じですが、件数の指定をしていないので記述が簡単。ただ、20,000件のうち2,0002,000件を抽出したいと思っても、数件〜数十件程度の件を抽出したいと思っても、数件〜数十件程度のが簡単。ただ、20,000件のうちブレが見られる。

11

層別抽出の方法ｰSAS V6での場合/*性別の[男性][女性]]の各層から10%ずつ抽出*/*//*性別の[男性][女性の各層から10%ずつ抽出
data sample4（‑‑̲cnt̲cnt22）;
sample4（drop=n1
drop=n1‑‑
set ksug.customer;
ksug.customer;
if gender='gender='男性'
男性' then do;
do;
n1+1
n1+1;
if ̲cnt1̲ < 820 then do ;if ranuni(ranuni(0) *(8205*(8205 ‑ n1 ) < = ( 820 ‑ ̲cnt1̲) then do ;
̲cnt1̲ + 1 ;output ;
end ;
end ;
end ;
if gender='gender='女性'女性' then do;do;
n2+1n2+1;
if ̲cnt2̲ < 807 then do ;if ranuni(ranuni(0) *(8069*(8069 ‑ n2 ) < = ( 807 ‑ ̲cnt2̲) then do ;
̲cnt2̲ + 1 ;output ;
end ;
end ;
end ;
run;
run;

データステップなどを用いて層別抽出を行うには、左の図のようになる。
性別の各層から10％ずつ抽出
性別の各層から10％ずつ抽出する処理であるが、まずFREQする処理であるが、まずFREQ
プロシジャなどで各層の件数を把握し、その内10％の件数を把握し、その内10％の件数を抽出できるようにロジックを組み合わせていく必要がある。

126

V8以降(SAS/STAT必要)でのサンプリング
w SAS V8からは新たにSURVEYSELECTプロシジャが追加され、様々なサンプリプロシジャが追加され、様々なサンプリV8からは新たにSURVEYSELECTング手法を行う事ができるようになっている。
w 構文は以下のとおり。
PROC SURVEYSELECT options ;STRATA variables ;CONTROL variables ;SIZE variable ;ID variables ;w 手法は11通り用意されているが、今回は以下の手法を紹介します。
手法は11通り用意されているが、今回は以下の手法を紹介します。
– 単純無作為抽出– システムサンプリング（系統抽出法）– 層別抽出– 復元抽出– 非復元抽出13

単純無作為抽出 1/*件数を指定して行う非復元抽出*//*件数を指定して行う非復元抽出*/
PROC SURVEYSELECT DATA=ksug.customer
DATA=ksug.customer
METHOD=SRS
N=2000N=2000OUT=sample5;
RUN;
RUN;QUIT;QUIT;

最も単純なサンプリングを行っている。
手法は「METHOD=SRS」で指定してい手法は「METHOD=SRS」
る。SRSはSimple Random
る。SRSはSamplingの事。
Samplingの事。
結果は指定した通りに2000件のデータ
結果は指定した通りに2000件のデータセットがサンプルとして出力。

147

単純無作為抽出 2/*件数を指定。復元抽出で重複行を残さない*//*件数を指定。
復元抽出で重複行を残さない*/
PROC SURVEYSELECT DATA=ksug.customer
DATA=ksug.customer
METHOD=URS
N=2000N=2000OUT=sample6;
RUN;
RUN;QUIT;
QUIT;

今回のプログラムは、手法が「METHOD=URS」
METHOD=URS」であることが大きな違い。
URSは
URSはUnrestricted Random Samplingの事。
復元抽出を行っているため、何件かは複数回抽出されている。しかし何度も同じ標本が選ばれると、結果が歪んでしまうことも考えられるので、今回はデフォルト設定のまま複数回選択されたものは1複数回選択されたものは1件だけ残して削除する方法を取っている。
何件重複しているかは、新たに追加される
変数「NumberHits」を見ると分かる。
変数「NumberHits」
よって、このプログラムの結果は何行か削除されているので、2000件と指定したが実除されているので、2000件と指定したが実際には1917件しか抽出されていない。
際には1917件しか抽出されていない。

15

単純無作為抽出 3/*件数を指定。復元抽出で重複行を残す*//*件数を指定。
復元抽出で重複行を残す*/
PROC SURVEYSELECT DATA=ksug.customer
DATA=ksug.customer
METHOD=URS
N=2000N=2000
OUT=sample7
OUTHITS;RUN;
RUN;QUIT;
QUIT;

今回のプログラムも同じように手法が「METHOD=URS」
METHOD=URS」である。ただ今回は「OUTHITS」
OUTHITS」オプションを付けている。
復元抽出で同じ標本が何度抽出されても、削除はせずにサンプルとして出力する。何件重複しているかは、新たに追加される変数「NumberHits」を見ると分かる。
数「NumberHits」
よって、このプログラムの結果は重複しても削除される事が無いので、指定した2000件削除される事が無いので、指定した2000件が出力されている。

168

単純無作為抽出 4/*割合を指定。「N=」」に変更*//*割合を指定。
N=」を「RATE=を「RATE=」
変更*/
PROC SURVEYSELECT DATA=ksug
ksug.customer.customer
DATA=
METHOD=SRS
RATE=0.1
RATE=0.1
OUT=sample8;
RUN;
RUN;
QUIT;
QUIT;

単純無作為抽出をする時に、そのサンプルサイズを「N=2000」といった方法ではなく、サイズを「N=2000」全体の10％といった割合を指定して抽出を全体の10％といった割合を指定して抽出を行う方法。
「N=」」と指定するN=」ではなくて、「RATE=0.1
ではなくて、「RATE=0.1」と10％サンプリングを行える。
10％サンプリングを行える。

17

系統抽出(等間隔抽出法)/*件数を指定*//*件数を指定*/
PROC SURVEYSELECT DATA=ksug.customer
DATA=ksug.customer
METHOD=SYS
N=2000N=2000OUT=sample9;
RUN;
RUN;
QUIT;
QUIT;

系統抽出を行う際には、「METHOD=SYS」と指系統抽出を行う際には、「METHOD=SYS」
定を行う。これはSystematic定を行う。これはSystematic Random
Samplingの略となっている。
Samplingの略となっている。
全件で20,000件のデータから2,0002,000件のサンプ件のサンプ
全件で20,000件のデータからルを作るが、等間隔で抽出するので、200000／ルを作るが、等間隔で抽出するので、200000／2000＝10件ずつ抽出して件ずつ抽出して2000＝10という計算を行い、10という計算を行い、10くる。初期値はシステム時間などを利用して、決定する。

データがランダムに並んでいる、もしくは北海道〜沖縄県といった形で並んでいる場合はこれを反映することができる。ただし、何か特定のルールで並んでいる場合は、初期値によって全く傾向が違ったサンプルが抽出される恐れがあるので注意が必要。

189層別抽出法 1/*性別別に1000件ずつ持ってくる場合。
件ずつ持ってくる場合。
/*性別別に1000[男性][女性][][不明
不明]]なので合計3000名*/
男性][女性なので合計3000名
PROC SORT DATA=DATA=ksug.customer;
ksug.customer;
BY gender;
RUN;
RUN;
PROC SURVEYSELECT DATA=ksug.customer
DATA=ksug.customer
METHOD=SRS N=1000
N=1000 OUT=sample10;
STRATA gender;
RUN;
RUN;QUIT;QUIT;性別GENDER

度数パーセント

累積度数

累積パーセント

女性

100033.33

100033.33

男性

100033.33

2000

66.67

不明

100033.33

3000

100.00上記のプログラムでは、性別別に1000件ずつ抽出し、サンプルの作成を行っている。
上記のプログラムでは、性別別に1000件ずつ抽出し、サンプルの作成を行っている。
「STRATAステートメント」で変数「
GENDER」」を指定する事により、変数「GENDER」内の水準
STRATAステートメント」で変数「GENDERを指定する事により、変数「GENDER」を利用して、重み付けを行い同じ件数で抽出を行っている。
出力されたデータには重み付けの結果の変数などが追加されている。

19

またデータは「INDEXを作成しを作成しまたデータは「STRATAステートメント」で指定する変数でソートを行う、もしくはSTRATAステートメント」で指定する変数でソートを行う、もしくはINDEXておく必要がある。

層別抽出法 2/*性別別に10% 件ずつ持ってくる場合*//*性別別に10%件ずつ持ってくる場合*/
PROC SORT DATA=DATA=ksug.customer;
ksug.customer;
BY gender;
RUN;
RUN;
PROC SURVEYSELECT DATA=ksug.customer
DATA=ksug.customer
METHOD=SRS
RATE=0.1
RATE=0.1
OUT=sample11;
STRATA gender;
RUN;
RUN;quit;quit;

性別
累積
度数

累積パーセント

40.33

807

40.33

41.03

1628

81.36

18.64

2001

100.00

度数パーセント

女性

807

男性
不明

821
373

GENDER上記のプログラムでは、性別別に10％件ずつ抽出し、サンプルの作成を行っている
上記のプログラムでは、性別別に10％件ずつ抽出し、サンプルの作成を行っている。結果的に20,000件のうち20012001件のサンプルを抽出している。
件のサンプルを抽出している。
。結果的に20,000件のうちこの場合も前ページと同じように、出力されたデータには重み付けの結果の変数などが追加されている。またデータは「どが追加されている。またデータは「STRATAステートメント」で指定する変数でソー
STRATAステートメント」で指定する変数でソートを行う、もしくはINDEXを作成しておく必要がある。
トを行う、もしくはINDEXを作成しておく必要がある。
2010

繰り返してサンプリングを行うには？
/*100オブザベーションの10のサンプルを作成するには？
*//*100オブザベーションの10のサンプルを作成するには？*/PROC SURVEYSELECT DATA=ksug.customer
DATA=ksug.customer
METHOD=SRS
N=100
N=100
OUT=sample12REP=10;
REP=10;RUN;
RUN;QUIT;
QUIT;

左記は母集団のデータから無作為に、100オブザベーションの1010為に、100オブザベーションのサンプルを作成する方法となっています。
プログラムとしては普通の単純無作為抽出の場合と同じですが、「REP」
REP」オプションに値を設定する事により、その回数分サンプリングを行います。
この処理結果は別々のデータセッ
トではなく、一つのデータセットとして出力されるので、変数「Replicate」に繰り返しの回数が保Replicate」に繰り返しの回数が保存されます。

21

パフォーマンスの比較
ｰSQLプロシジャ、Dataステップ、SURVEYSELECTプロシジャでの比較ｰ
w テスト結果に関して– テストパターンは2通りを実施した。
– １つ目は2万〜100万件まで母集団を増やしていき、その中で2000件を抽出する時間をSQLプロシジャ、Dataステップ、SURVEYSELECTプロシジャで比較した。
– ふたつ目は上記とほぼ同じである
が、サンプルサイズを母集団の10％と指定を行った。

w データステップとSURVEYSELECTプロシジャのスピードが目立つが、記述の簡単さ、手法の多さを考えるとSURVEYSELECTプロシジャは便利に利用する事ができる。
2211

SASによる主成分分析について

23

頂いた質問の背景
w ユーザーの方はEnterpriseMinerを利用しており回帰分析ユーザーの方はEnterpriseMinerを利用しており回帰分析等の手法を使っている。
w データには数値項目の変数を多く保持しており、回帰分析を行う時に変数間の共線性の問題がある。それぞれの変数を幾つかのまとめて、その結果を利用して回帰分析を行いたいということであった(いたいということであった(主成分回帰)
主成分回帰)。
w その際に主成分分析の結果、主成分スコアの変数で有効なもの(だけを自動的に残すようなマクロがあるなもの(固有値>=1)固有値>=1)だけを自動的に残すようなマクロがあると便利なんだけど・・・・。
w ということでサンプルを作成をしました。
w ちなみに今回のデータと質問を頂いた会社とは全く関係ありません。
2412

主成分分析とは？
w 主成分分析とは？
– 主成分分析とは、幾つかの変数から主成分というお互いに無相関な合成変数を作るための手法。これにより複数の特徴を表す総合的な指標を作成する事が出きる。

w 特徴は？
–––生成された主成分スコアはお互いに無相関である。
主成分スコアは平均0主成分スコアは平均0、分散１に標準化されている。
生成された主成分スコアは複数生成されるが、いくつ利用するかは以下のような判断基準がある。解釈を考えると3がある。解釈を考えると3〜7つが限度。(つが限度。(目安程度とお考えを・・・)
目安程度とお考えを・・・)
w 固有値を目安にする方法・・・基準は1固有値を目安にする方法・・・基準は1以上
w 累積寄与率を目安とする方法・・・基準は70％〜8080％程度％程度累積寄与率を目安とする方法・・・基準は70％〜
w スクリープロットを目安にする方法・・・固有値をパレート図などを用いて大きい順に並べ、急激に落ち込む手前の主成分。

– 主成分をいかにしてに解釈するかが重要。(主成分をいかにしてに解釈するかが重要。(意見は色々とあると思いますが・・・）– 他の手法と同様だが、色々なグラフや手法と組み合わせると有効な結果が出てくると考えられる。
25

今回利用するデータは？
wwww

左図のような変数の構成をしているデー
タを使って、一番下の当期利益を予測できるようなモデルを作成したい。
一般的に当期利益を算出するためのロジックは決まっているため、ある一定の勘定項目が分かっていれば算出できてしまう。また金額といった値だけではなく、「流動比率」「売上高対総資産回転率」等の財務指標や格付けのデータなどがあれば面白い。
多くの数値変数があり、かつ微妙に絡み合っているが、業種によっては大きく構成が違ってくる。
この辺りを主成分分析を利用して解析するサンプルをご紹介し、質問に出てきた主成分回帰を行えるデータセットを作成する。

2613

主成分分析の実行と結果 1
proc princomp data=KSUG.ENTERPRISE
data=KSUG.ENTERPRISE
out=OUT̲PRIN;
out=OUT̲PRIN;
var SISAN̲RYUDO‑‑HAITOKIN;SISAN̲RYUDO‑‑HAITOKIN;
run;
;
quit;
;
run quit

データを利用して主成分分析を行う。
今回は目的変数以外の変数を利用。
出力結果としては、変数の基礎統計量と相関行列、固有値、固有ベクトルなどが出力される。
固有値（Eigenvalue）の出力結果を表固有値（Eigenvalue）示している。
先ほどの主成分の残す基準である、固有値が1固有値が1以上、累積寄与率(Cumulative)が3主Cumulative)が80％と考えると第80％と考えると第3成分、もしくは第4成分、もしくは第4主成分まで利用すればデータの説明はできそう。
「OUT=」
OUT=」オプションで主成分スコアのついたデータを書き出している。

27

主成分分析の実行と結果 2ww

前ページのプログラムにより、アウトプットとして入力データセットに主成分スコアが付けられたデータセットが作成される。この主成分スコアの変数には、プログラム中「var」オプションでたデータセットが作成される。この主成分スコアの変数には、プログラム中「var」指定された分だけ作成される。
今回は16変数追加されている。データ件数が多かったり、もっと変数が多い場合などはもう今回は16変数追加されている。データ件数が多かったり、もっと変数が多い場合などはもう一度プログラムを作って、前ページのアウトプット画面を見ながら、DROPする変数を決めて一度プログラムを作って、前ページのアウトプット画面を見ながら、DROPする変数を決めてデータセットを作り直すのも面倒となってくる。

データセット「OUT_PRIN」
OUT_PRIN」

Prin1〜Prin1〜Prin16
Prin16まで元のデータセットに追加されて出力

2814

データ可能のためのマクロ紹介%macro prin̲dat1(indata,outdata,input,eigen););prin̲dat1(indata,outdata,input,eigen
ods trace on;
ods output Eigenvalues=
Eigenvalues=Eigenvalues;
Eigenvalues;
proc princomp data=&indata;
data=&indata out=&outdata
out=&outdata;①
var &input;
run;quit;
ods output close;
data Eigenvalues;
Eigenvalues;
set Eigenvalues;
Eigenvalues;
if eigenvalue < &eigen&eigen then do ;
n+1
n+1;
②
call symput()),symput('drop̲prin' ￨￨ left(put(n,best.
left(put(n,best.)),compress(left('prin'￨￨number)));compress(left('prin'￨￨number)));call symput(symput('n̲data',n);'n̲data',n);
end;
run;
data &outdata;&outdata;
set &outdata(drop = %do i=1&i %end;)&outdata(dropi=1 %to &n̲data;n̲data; &&drop̲prin&&drop̲prin&i%end;) ;run;%mend;%mend;%prin̲dat1(KSUG.ENTERPRISE,OUT̲PRIN, SISAN̲RYUDO‑‑HAITOKIN,11);
SISAN̲RYUDO‑‑HAITOKIN,w

www

③w

ここまで説明を行ってきた事を行おうとした場合、有効な主成分を残すためには、出力結果を見ながら、その後に回帰分析時に主成分を選択する必要がある。また不必要な変数もあることからデータ容量が大きくなってしまう。
そこで指定した固有値以上の変数だ
けを残すようにする。
こうするとPRINCOMP
プロシジャの
こうするとPRINCOMPプロシジャのOUTオプションに指定されたデーアセ
OUTオプションに指定されたデーアセ
ットには必要な主成分スコアと元にあった変数だけが出力される。
マクロ全体の流れとしては、可変となるインプットのデータセット、出力のデータセット、分析変数、固有値の閾値を設定すれば自動的に実行されるようになっている。
プログラムの①〜③に関して説明を加えていく。

29① 主成分分析のアウトプットとデータセット化
ods trace on;on;
ods output Eigenvalues=Eigenvalues=Eigenvalues;
Eigenvalues;
proc princomp data=&
indata out=&outdata;;
data=&indata
out=&outdata
var &input;
run;
run;quit;quit;
ods output close;
close;
名前 :Eigenvalues
ラベル :Eigenvalues of the Correlation Matrix
テンプレート : Stat.PrinComp.Eigenvalues
Stat.PrinComp.
データラベル : Eigenvalues
パス :Princomp.
Princomp.Eigenvalues

PRINCOMPプロシジャなどの統計量を活用する場合はPRINCOMPプロシジャなどの統計量を活用する場合は、「OUT」オプション、「OUTSTAT」オプションなど、「OUT」オプション、「OUTSTAT」が利用できるが、今回は固有値だけのデータが欲しいのでODSの機能を利用する。
いのでODSの機能を利用する。
ods trace on;on;
PRINCOMPプロシジャでどのようなアウトプッ
PRINCOMPプロシジャでどのようなアウトプットが出せて、そのアウトプットをデータセット化するための名前を知る必要がある。その場合には「ods
場合には「ods trace on;on;」と記述する事により、ログにどのような統計量が出力されるか結果が分かる。
ods output Eigenvalues=Eigenvalues=Eigenvalues;
Eigenvalues;
今回は固有値のデータセットを作成したいので、「odsで、「ods output Eigenvalues」
Eigenvalues」という部分で、固有値をEigenvaluesというデータセッで、固有値をEigenvaluesというデータセットに出力する指定をしている。

30

出力されるデータセットを見てみると、主成分の固有値で１未満の変数は「Prin5」以降だということ
有値で１未満の変数は「Prin5」が分かるので、自動的この変数をセットして削除することを行う。

15

② 削除する変数の決定と変数へのセット
data ̲NULL̲;̲NULL̲;set Eigenvalues;
Eigenvalues;
if eigenvalue < &eigen&eigen then do ;n+1
n+1;
call symput()),
symput('drop̲prin' ￨￨ left(put(n,best.
left(put(n,best.)),compress(left('prin'￨￨number)));compress(left('prin'￨￨number)));call symput(symput('n̲data',n);'n̲data',n);
end;
end;
run;
run;

前ページのデータセット「 Eigenvalues 」を読込ん
で、固有値が指定した値以下の物だけマクロ変数に格納をしていき、その件数もセットをしておく。今回は固有値を1固有値を1にセットしているので第5にセットしているので第5主成分以下が格納されている。
マクロ変数には右の表のような形で格納されている。

マクロ変数名値

drop̲prin1
drop̲prin1

Prin5

drop̲prin2
drop̲prin2

Prin6

drop̲prin3
drop̲prin3

Prin7

drop̲prin4
drop̲prin4

Prin8

drop̲prin5
drop̲prin5

Prin9drop̲prin6
drop̲prin6

Prin10Prin10drop̲prin7
drop̲prin7Prin11
Prin11drop̲prin8
drop̲prin8

Prin12
Prin12drop̲prin9
drop̲prin9

Prin13
Prin13drop̲prin10
drop̲prin10

Prin14
Prin14drop̲prin1
drop̲prin11

Prin15
Prin15drop̲prin12
drop̲prin12

Prin16
Prin16

マクロ変数名値n̲data1231③ 余分な主成分スコア変数の削除
data &outdata;&outdata;
set &outdata(drop =&outdata(dropマクロ変数名値n̲data

12%do i=1
i=1 %to &n̲data;n̲data;&&drop̲prin&I&&drop̲prin&I%end;)%end;) ;run;

マクロ変数名値

drop̲prin1
drop̲prin1

Prin5

drop̲prin2
drop̲prin2

Prin6

drop̲prin3
drop̲prin3

Prin7

drop̲prin4
drop̲prin4

Prin8

drop̲prin5
drop̲prin5

Prin9drop̲prin6
drop̲prin6

Prin10Prin10drop̲prin7
drop̲prin7

Prin11Prin11drop̲prin8
drop̲prin8

Prin12
Prin12drop̲prin9
drop̲prin9

Prin13
Prin13drop̲prin10
drop̲prin10

Prin14
Prin14drop̲prin1
drop̲prin11

Prin15
Prin15drop̲prin12
drop̲prin12

Prin16
Prin16

最後にPRINCOMP
プロシ
最後にPRINCOMPプロシ
ジャで出力され、まだ多くの主成分スコア変数が残されているデータを読込む。
マクロに格納されている固有値が1有値が1未満の変数を呼出して、「SET」ステートメントして、「SET」の「DROP」オプションにセッの「DROP」
トをしていき、いらない変数を削除する。そして最終的なデータセットが書き出される。
これにより必要な変数だけが残されたデータセットが完成する。

3216

他には何か出来ないか？
w 今回はサンプリングと主成分分析を題材にしたプロシジャの結果のデータ二次加工についてご紹介しました。
w 一般的に企業で使われるデータの分布は非常歪んでおり、このような場合にモデルの妥当性を評価する必要があり、有名な方法としてジャックナイフ法、ブートストラップ法などがある。
w ふたつのテーマを組み合わせる事により、データからリサンプリングを行い、主成分分析を繰り返して行って、結果の安定性やバラツキを知る事ができるような処理も組み込めると考えられる。
3317