SAS

GTLで円グラフを作成する piechartステートメント

GTLとsgplotは単一のグラフであればほぼ同じ機能を持ちますが、円グラフはGTLだけが作図できるグラフの一つです。
円グラフを作成するsgpieプロシジャというものもあるようですが、GTLで統合されているのでわざわざ使う必要はないでしょう。

piechartステートメント

piechartはその名の通り円グラフを作成するステートメントで、頻繁に使用するlayout overlayブロック内ではなくlayout regionという特殊なレイアウトブロック内に設置します。
名前に「overlay」とついているレイアウトブロックでは使用不可です。

データの並び順によって同じテンプレートを使っていてもスライスの色が変わってしまう恐れ場あるため、基本的にはattribute mapを使用することを推奨します。

categoryのみを指定した場合、分類項目ごとにレコード数を集計して全レコードの比率から円グラフを作成します。responseを指定した場合は応答変数を集計(デフォルトでは合計(stat=sum))し、全体の比率から円グラフを作成します。

またデフォルトでは全体の4%未満の項目が2つ以上ある場合は「other」として1つのスライス(扇形の部分)にまとめて表示するようです。まあ臨床統計の場合はちゃんとその他の分類ラベルを用意して集計したほうが良いのでまず使いませんが・・・勝手にotherスライスを作ってほしくないときはothersliceオプションをFALSEにしましょう。

EXCELと仕様が異なり、スライスの開始位置は右側で、反時計回りにスライスが配置されます。直交座標の第一象限から第四象限の並び順と同じです。

piechart category=分類変数 < response=応答変数(集計対象の変数) > / < options >;

作図例

まずはsashelpのデータセットを利用して作図してみます。各曜日の故障頻度とその比率を円グラフで表示します。

proc template; 
define statgraph pie; 
begingraph; 
layout region ; 
   piechart categry=day response=count / 
      stat=sum 
      datalabelcontent=all; 
   endlayout; 
endgraph; 
end; 
run; 

proc sgrender data=sashelp.failure template=pie; 
run;

実行結果

datalabelcontentオプションでラベルに表示する項目を指定できます。項目はCATEGORY, RESPONSE, PERCENTから選択し、引数リストとして指定します。(例:( CATEGORY PERCENT) )

もしすでに集計されたデータセットをつかって円グラフを作成したい場合は、集計結果を格納した変数をRESPONSEとして指定し、statオプションはsumを指定します。
statオプションは作図に使用する要約統計量を指定します。使用するのはsumとfreqくらいでしょうかね。

スライスの並び順を指定する。

SASのデフォルトのスライスの配置はあまり一般的ではないため、EXCEL等でよく見られたものに修正します。
startオプションはスライスの開始位置を指定するオプションで、時計の3時の位置からの角度を指定します。
categorydirectionオプションはデータの配置順を指定します。通常は時計回りなのでclockwiseを指定すればOKです。

proc template; 
define statgraph pie; 
begingraph; 

layout region ; 

   piechart categry=day response=count / 
        stat=sum 
        start=90 
        categorydirection=clockwise 
        datalabelcontent=all; 
endlayout; 
endgraph; 
end; 
run; 

proc sgrender data=sashelp.failure template=pie; 
run;
実行結果

データラベルの自動調整

データラベルの配置はスライスの大きさと余白に応じて自動配置されますが、表示位置はDATALABELLOCATIONオプションで指定できます。 設定値はAUTO(自動)INSIDE(スライスの内部) OUTSIDE(スライスの外) CALLOUT (スライスとラベルを線で結ぶ)の4種類です。データによってどこに余白が生じるのかわからないので、基本的にはAUTOをお勧めします。CALLOUTを指定すると以下のようになります。

CALLOUTを指定した結果

多重円グラフ

groupオプションでクラス変数を指定するとクラス変数ごとに大きさを変えてグラフを重ねた多重円グラフを作成できます。groupgapオプションは外側の円グラフと内側の円グラフの余白を指定します。

proc template; 
define statgraph pie; 
begingraph; 
layout region ; 
   piechart categry=day response=count / 
      stat=sum 
      group=cause 
      groupgap=20px 
      start=90 
      categorydirection=clockwise 
      datalabelcontent=(category percent); 
endlayout; 
endgraph; 
end; 
run; 

data test; 
set sashelp.failure;
run; 

proc sgrender data=sashelp.failure template=pie; 
where cause in ("Contamination", "Oxide Defect"); 
run;

多重円グラフ