standardプロシジャやstdizeプロシジャで色んな標準化の話

なんかスコアデータみたいのがあって、最低スコアを0にして
最大スコアを100になるように値を変換してということがありました。

z得点だしたり、偏差値だしたり、はしょっちゅうするんで同じノリでproc standardでできるかなと
思ったけど、よく考えてみると、あれ?ってなりました。

proc standardで行ういわゆる標準化は、平均と標準偏差が一定の値になるように変換するわけで
今回みたいに無理やり最低値と最高値を決まった上限下限値にするのと全然違うよな~、平均も標準偏差も
使わないし。

もういいや~、面倒だからsummaryで各変数の最大、最小だして
変換値 =(元の値 - 最小値) / (最大値 - 最小値) * (設定上限値 - 設定下限値 ) + 設定下限値
でデータステップで片づけてしまいました。

で後で、対応するプロシジャってなんになるんだろう、多分stdizeだろうなと思って調べると
やぱりstdizeでした。

stdizeは広い意味での様々な標準化変換を行えるもので、かなり奥が深いです。

さわりだけ見てみましょう

今、以下のようなデータがあります

data q1;
x=1;y=20;z=-5;output;
x=6;y=10;z=5;output;
x=4;y=0;z=-1;output;
x=8;y=0;z=-3;output;
x=2;y=100;z=8;output;
run;











とりあえず基本統計量を見てみましょう
proc means data = q1  n mean std max min median sum maxdec=3;
run;








例えば、データを中心化したいから、平均0に寄せてと言われたら
以下のように各変数の平均を引けばいいわけです。

data q2;
set q1;
 x = x - 4.2;
 y = y - 26;
 z = z - 0.8;
run;

中身と統計量は以下になります。ちゃんと0になってますね

これをstandardプロシジャで行う場合は以下のように書きます
m=0というのが平均0にしている部分ですね

proc standard data=q1 out=a1 m=0;
 var x y z;
run;





















同じ結果になることが確認できました。

次はいわゆる偏差値です std=は標準偏差の指定です
proc standard data=q1 out=a2 m=50 std=10;
 var x y z;
run;

確認






















つづいてm=0 std=1 でz得点 標準得点ってやつですね
proc standard data=q1 out=a2 m=0 std=1;
 var x y z;
run;





















さて一方stdizeプロシジャとはなんなのかという話で、
まずは以下のように何も指定せずにまわしてみます

proc stdize data= q1 out = a3;
 var x y z;
run;




















さっきstandardプロシジャでzスコアだしたのと同じですね。
つまり何も指定しないとデフォルトで標準得点に変換するということがわかりました

実は、何も指定しなかった場合、内部的には以下のコードを実行しているのと同じになります

proc stdize data= q1 out = a3
 method=std
 add =0
 mult=1
;
 var x y z;
run;

method=std というのが標準偏差を使った標準化(変な言い方ですが)であること
add はこの場合、指定する平均
multiは指定する標準偏差になります

ですので偏差値をだすのであれば以下のようにかけます。
methodは省略可です。


proc stdize data= q1 out = a4
 method=std
 add=50
 mult=10
;
 var x y z;
run;



さて、ここまでだとstandardプロシジャと何が違うんだという話ですが
stdizeの味噌はmethod=の箇所にいろいろ指定できて、広い意味でのいろんな基準化ができるというところです

例えば冒頭の例のように0から100にデータを変換する場合

変換値 =(元の値 - 最小値) / (最大値 - 最小値) * (設定上限値 - 設定下限値 ) + 設定下限値にしたがって


data q3;
set q1;
x = ( x - 1 ) / ( 8 - 1 ) * (100 - 0) + 0;
y = ( y - 0 ) / ( 100 - 0 ) * (100 - 0) + 0;
z = ( z -(-5) ) / ( 8 - (-5) ) * (100 - 0) + 0;
run;

と書くところを、stdizeであれば以下のようにできます
mehodがrangeになっているところがポイントです

proc stdize data= q1
out = a5
        method=range
add = 0
mult = 100
;
 var x y z;
run;

結果は同じで




















最低値20 最大値100であれば

data q4;
set q1;
x = ( x - 1 ) / ( 8 - 1 )  * (100 - 20) + 20;
y = ( y - 0 ) / ( 100 - 0 ) * (100 - 20) + 20;
z = ( z -(-5) ) / ( 8 - (-5) ) * (100 - 20) + 20;
run;

を以下のように指定できます。
proc stdize data= q1
out = a6
        method=range
add = 20
mult = 80
;
 var x y z;
run;





















stdizeプロシジャの挙動は、わかると明快で
一貫した以下のルールに従って変換を行うんですね。

変換値 = add指定値 + mult指定値 ×[(元の値 - location(method毎に決まってる)/scale(method毎に決まってる]

method=stdの場合locationは平均値 scaleは標準偏差になります
method=rangeの場合locationは最小値 scaleはレンジになります

メソッドごとのlocationとscaleの設定は以下にまとまっております
http://support.sas.com/documentation/cdl/en/statug/63033/HTML/default/viewer.htm#statug_stdize_sect012.htm

methodに関わらず addのデフォルトは0 multのデフォルトは1になります。

なので、例えば中央値を使って標準化をする場合

proc stdize data= q1
out = a7
    method=median
add = 50
;
 var x y z;
run;




















最後に平均と標準偏差を使った標準化に対して
ノンパラ版として平均の代わりに中央値、標準偏差の代わりに正規化四分位範囲を使った方法が工業分野とかでよくあるらしいです。
すみません、まったくアホなんで詳しくないですが

四分位範囲はmethod=IQR で指定できるので、それに正規化のnormオプションを付けて

proc stdize data= q1
out = a8
    method=iqr
norm
;
 var x y z;
run;
















な感じですかね


0 件のコメント:

コメントを投稿