SAS

Freqプロシジャでグラフを作成する(1) 度数グラフ


臨床統計では頻繁に使うFreqプロシジャ。カイ二乗検定、リスク比、オッズ比など主要な指標を出力するために日々使っていると思いますが、実はFreqプロシジャはグラフも作成できることをご存知でしょうか?

統計用のプロシジャで報告書に掲載するグラフを出力することはあまりないと思いますが、とりあえずデータの分布を確認したいときに利用するには効率的でしょう。

Plotsオプション

頻度集計を行う場合、Freqプロシジャのtablesステートメントと利用しますが、このときplotsオプションを指定すると、頻度集計結果をグラフで出力してくれます。なお出力されるグラフは棒グラフまたはドットプロットで、typeプロットオプションで指定できます。またorientプロットオプションでグラフの向き(horizontalまたはvertical)を指定できます。デフォルトは棒グラフ(vertical)です。

proc freq data=<データセット>;
 tables <クラス変数> / plots=<option(plot-option)>;
run;

累積度数グラフ

plotoptionに cumfreqplotを指定すると累積度数グラフを出力します。なおこのオプションは一元度数表のみ使用可能です。

入力データ

typeCOUNT
a19
b54
c22
proc freq data=ds1;
tables type / plots=cumfreqplot;
weight COUNT / zeroes;
run;​

実行結果

累積度数なのでtype=cの値はすべての度数の合計となります。グラフにする場合はパーセントにすることが多いと思うので、これを累積パーセントで出力します。cumfreqplotのplotオプションに(scale=percent)を指定するだけです

proc freq data=ds1;
tables type / plots=cumfreqplot(scale=percent);
weight COUNT / zeroes;
run;

実行結果

相対偏差グラフ

一元度数表に対してカイ二乗検定を実施するとき、deviationplotが利用可能です。相対偏差とは以下の数式で算出されます。

$$
相対偏差 = \frac {観測度数 – 期待度数} {期待度数}
$$

累積度数グラフで使用したデータを用いて相対偏差グラフを作成してみます。期待度数は帰無仮説「すべてのtypeの(総度数に対する)比率は等しい」に基づいて計算される度数です。

今回の場合、期待度数は31.67、type=bの相対偏差は約0.705となります。

proc freq data=ds1(where=(class=1));
tables type / chisq plots=deviationplot;
weight COUNT / zeroes;
run;



実行結果

度数グラフ

freqplotオプションを利用すると度数を棒グラフとして表示できます。以下の例では2元度数表から度数グラフを作成しています。

groupbyオプションでrowまたはcolumnを指定すると、度数表の行または列ごとにグラフを作成します。

twowayオプションは2元データのレイアウトを指定します。clusterに設定すると各系列の棒グラフは隣りあわせで配置されます。stackedは積み上げ棒グラフの配置となります。

入力データ

classtypeCOUNT
1a19
1b54
1c22
2a30
2b59
2c36
/*cluster*/
proc freq data=ds1;
tables class*type / plots=freqplot(groupby=row twoway=cluster);
weight COUNT / zeroes;
run;

/*stacked*/
proc freq data=ds1;
tables class*type / plots=freqplot(groupby=row twoway=stacked);
weight COUNT / zeroes;
run;

実行結果(twoway=cluster)

実行結果(twoway=stacked)

積み上げ棒グラフの場合は系列の合計を100とするパーセント表示で作図することが多いです。パーセント積み上げ棒グラフを作成するにはscaleオプションでgrouppercentを指定します。必要な計算はfreqプロシジャが計算してくれるので楽ちん

proc freq data=ds1;
tables class*type / plots=freqplot(groupby=row twoway=stacked scale=grouppercent);
weight COUNT / zeroes;
run;

実行結果(scale=grouppercent)