ヒートマップは2次元データの各数値の大きさを色で表現したグラフです。DNAマイクロアレイのデータやWEBのアクセス解析でよく使われます。
GTLではheatmapステートメントとheatmapparmステートメントで作図することが可能です。
heatmapparmは事前に決めておいたビン毎に集計する必要があります。
heatmapステートメント
heatmapステートメントであれば事前の集計をしなくてもSASが自動でビンを最適な大きさに設定し、頻度集計してくれます。
x軸の変数とy軸変数を指定するだけなので簡単です。
今回はnumpyを使って2変量正規乱数を生成し、乱数の発生頻度をヒートマップとして表現してみます。
proc template ;
define statgraph heatmap;
begingraph;
layout overlay /
xaxisopts=(linearopts=(viewmax=7 viewmin=-7
tickvaluesequence=(start=-7 end=7 increment=1)
)
)
yaxisopts=(linearopts=(viewmax=2 viewmin=-2
tickvaluesequence=(start=-2 end=2 increment=1))
) ;
heatmap x=x y=y /
nxbins=50
nybins=50
name="heat";
continuouslegend "heat";
endlayout;
endgraph;
end;
run;
ods graphics / width=15cm height=15cm;
proc sgrender data=bivariate_norm template=heatmap;
run;
特にオプションを指定しなくても作図できるのですが、見やすくするため軸設定とビンの設定を追加しています。
赤い部分が乱数の発生頻度が多い箇所です。
なおビンの設定は以下のオプションを使用すると細かく指定することができます。
オプション名 | 説明 |
---|---|
NXBINS | X軸のビンの個数 |
NYBINS | Y軸のビンの個数 |
XBINSIZE | X軸のビンの大きさ |
YBINSIZE | Y軸のビンの大きさ |
XBINSTART | X軸のビンの開始位置 |
YBINSTART | Y軸のビンの開始位置 |
XVALUE | XBINSTARTの値の定義 MIDPOINT=ビンの中央 |
YVALUE | YBINSTARTの値の定義 定義方法はXVALUEと同様 |
XBOUNDARY | 値がX軸ビンの境界上にあった場合の設定 UPPER=大きいほうのビンとして集計する |
YBOUNDARY | 値がY軸ビンの境界上にあった場合の設定 定義方法はXBOUNDARYと同様 |
なおdisplayオプションでallを設定するとビンの枠線を表示してくれます。
グラデーションの設定方法は前回紹介した等高線プロットと同様です。
heatmapparmステートメント
heatmapparmステートメントは事前に集計したデータを用意する必要があります。複雑な集計が必要な場合や、すでに集計済みのデータを入手できる場合はheatmapparmステートメントを利用するとよいでしょう。
今回は飛行機の乗客数のの推移をヒートマップで表現してみます。
proc template ;
define statgraph heatmap2;
begingraph;
entrytitle "旅客機の搭乗人数";
layout overlay ;
heatmapparm x=year y=month colorresponse=passengers/
name="heat" ;
continuouslegend "heat";
endlayout;
endgraph;
end;
run;
proc sgrender data=import2 template=heatmap2;
run;
これでも十分なのですが、各ビンの集計結果も同時に表示させてみます。すでに集計済みの変数をtextplotステートメントで表示させればできるのですが、数値変数を表示するとスペースが自動で挿入されて
表示位置がずれてしまうので、eval関数を使って乗客数を文字列型に変換して表示します。
proc template ;
define statgraph heatmap2;
begingraph;
entrytitle "旅客機の搭乗人数";
layout overlay ;
heatmapparm x=year y=month colorresponse=passengers/
name="heat" ;
/*集計結果の表示*/
textplot x=year y=month text=eval(strip(put(passengers,8.0)));
continuouslegend "heat";
endlayout;
endgraph;
end;
run;
proc sgrender data=import2 template=heatmap2;
run;
ラザニアプロット
ヒートマップはラザニアプロット(Lasagna plot)という作図にも使われます。これは個別の被験者の時系列データをヒートマップとして表現したものです。縦軸は個別の被験者、横軸は時間、応答変数の大きさはヒートマップの色として表現します。同様の作図にスパゲッティプロット(Spaghetti plot)がありますが、ラザニアプロットはスパゲッティプロットとことなり個々のデータが重ならないため可読性に優れています。
ラザニアプロットはheatmapparmステートメントで作図すれば作成できますが、heatmapparmはデフォルトでは文字列変数のような離散変数を軸変数として利用することができません。
xaxisoptsまたはyaxisoptsオプションで軸タイプをdiscreteに変更した後、heatmapparmのdiscretexまたはdiscreteyオプションをtrueに設定すると、離散軸であってもヒートマップを作成することができます。
スパゲッティプロットは以下の記事で紹介しています。
まずスパゲッティプロットで作図した例を紹介します。
今回は被験者数が少ないから各被験者の動向はわかりやすいですが、被験者が多くなってくるとラインが重なりすぎてわかりにくくなります。
同じデータをラザニアプロットで可視化すると以下のようになります。
proc template;
define statgraph lasagna;
begingraph;
layout overlay /
yaxisopts=(display=(label)
reverse=true type=discrete);
heatmapparm x=time y=usubjid colorresponse=response/
discretey=true
name="heat";
continuouslegend "heat" /
title="response"
orient=horizontal
valign=bottom;
endlayout;
endgraph;
end;
run;
proc sgrender data=sample template=lasagna;
run;
データ同士が重ならないので、どの被験者が異常値を出しているか、あるいは全体的な時間推移を把握しやすいグラフとなっています。range attribute mapを併用すれば、興味のある応答変数の閾値や上限・下限値を特定の色として表現できるようになるため、よりデータの状態がわかりやすくなります。