SAS_GTL

SAS Plotterでマルチヒストグラムを作図する

「SAS Plotter」はモダンなグラフを簡単に作成できるグラフマクロパッケージです。
このページではSAS Plotter Ver1.2でマルチヒストグラムを作成する方法を解説します。

https://picolabs.jp/sasplotter_usage

マルチヒストグラムとは

マルチヒストグラムとは、群別に表示したヒストグラムのことで、頻度分布の群間比較に適したグラフです。

従来のヒストグラムでも群別に表示することはできましたが、重ね合わせで表示するか積み上げ棒グラフの体裁で表示することくらいで群間比較がしにくいという欠点があります。マルチセルレイアウトを用意しヒストグラムを表示する方法もありますが、プログラムが複雑になり軸の表示スペースが必要になりますので表示スペースがより多く必要になります。

各カテゴリを連続変数と見なして箱ひげ図等で要約統計量を表示する方法もありますが、それが使えるのはカテゴリ変数が間隔尺度と見なせる場合のみであり、最頻値の情報が欠落するため、結局のところ仮定が必要のないヒストグラムでの表示のほうが望ましいケースもあるでしょう。

マルチヒストグラムは一つのプロットエリア内に複数のヒストグラムを配置できるため、少ない表示面積で多くの頻度分布の情報を表示することが可能です。

SASPlotterでは多群別のヒストグラムを作成することに加え、二値変数(例えば性別や被験薬と対照薬など)の表示にも対応しております。

以下の論文に掲載されているグラフを作成する方法について相談をうけ、今回SASPlottterのパッケージに追加いたしました。

Input data

あらかじめ集計したデータが必要となります。データの集計はproc univariateやproc freqを使用して作成してください。入力データセットの構造は以下の通りです。

category、pairおよびlevelについてはフォーマットを適用してください。

key変数変数型
1category数値
2pair数値
3level数値
response数値

文法

ods graphics / < graphics option > ;
ods listing gpath=< output path >;

%macro multihistogram(
    data=,
    group=,
    pair=none,
    level=,
    levelfmt=,
    response=,
    leveltitle=level,
    responsetxt=false,
    orient=v,
    pairsplit=false,
    pairtitle=pair,
    legend=true,
    palette=sns
);

パラメータ

data : データセット名(必須)

入力データセット名。whereオプションおよびrenameオプションが使用できます。

category : 変数名 (必須)

群変数。この変数は軸変数となります。

pair : 変数名 (オプション)

二値変数(Yes/No、男性/女性など)。デフォルトはNone(設定しない)。

level : 変数名 (必須)

水準変数。この変数が軸変数となります。

levelfmt : フォーマット名(必須)

水準変数に適用するフォーマット名。フォーマットは事前に作成してください。

response : 変数名 (必須)

応答変数。例えば頻度や割合を格納した変数。

leveltitle : テキスト(オプション)

水準軸の軸ラベル。デフォルトは”Level”。

responsetxt : 真偽値(オプション)

Trueの場合は応答変数の値が表示されます。デフォルトはFalse。

orient : キーワード(オプション)

グラフの向き(垂直方向(v)または水平方向(h))を指定します。デフォルトはv。

pairsplit : 真偽値(オプション)

Trueの場合はpair変数に基づいてヒスとグラムを分割します。pair変数を指定している場合、このパラメータを有効にすると表示面積を節約できます。デフォルトはFalse。

pairtitle : テキスト(オプション)

pair変数の凡例タイトル。legendパラメータをFalseに設定している場合、この設定は無視されます。デフォルトは”Pair”。

legend : 真偽値(オプション)

Trueifに設定するとpair変数の凡例を表示します。pairパラメータがNoneの場合このパラメータは無視されます。デフォルトはTrue。

pallete : キーワード(オプション)

塗り、ライン、マーカーで使用するカラーパレットを指定します。以下のパレットが使用できます。デフォルトは”SNS”(seabornのデフォルトパレット)。

  • SAS
  • SNS (Seaborn)
  • STATA
  • TABLEAU

作図例

基本的なマルチヒストグラム

髪の毛別の集計をした結果を2つの地域および目の色別に可視化してみます。

proc format;
value regionf
    1="Region 1"
    2="Region 2"
    ;
value eyecolorf
    1="blue"
    2="brown"
    3="green"
    ;

value haircolorf
    1="black"
    2="dark"
    3="fair"
    4="medium"
    5="red";
run;

data Color;
format region regionf. eyes eyecolorf. hair haircolorf.;
input Region Eyes Hair Count @@;
label Eyes  ='Eye Color'
        Hair  ='Hair Color'
        Region='Geographic Region';

datalines;
1 1 3 23  1 1 5 7   1 1 4 24
1 1 2 11  1 3 3 19  1 3 5 7
1 3 4 18  1 3 2 14  1 2 3 34
1 2 5 5   1 2 4 41  1 2 2 40
1 2 1 3   2 1 3 46  2 1 5 21
2 1 4 44  2 1 2 40  2 1 1 6
2 3 3 50  2 3 5 31  2 3 4 37
2 3 2 23  2 2 3 56  2 2 5 42
2 2 4 53  2 2 2 54  2 2 1 13
;
proc sort; by region eyes hair;
run;

/* dummy data */
data dummy;
do region =1 to 2;
do eyes = 1 to 3;
do hair = 1 to 5;
output;
end;
end;
end;
run;

data freq;
merge dummy color;
by region eyes hair;
if count=. then count=0;
run;

/* basic multiple histogram */

ods listing gpath="output path";
ods graphics / height=15cm width=15cm imagefmt=svg imagename="multihisto_basic" ;

%multihistogram(
    data=freq,
    category=eyes,
    pair=region,
    level=hair,
    response=count,
    levelfmt = haircolorf,
    leveltitle=hair color,
    pairtitle=region
);
基本的なマルチヒストグラム

pairパラメータはオプションです。pairパラメータを指定しない場合はヒストグラムはカテゴリ別に塗分けされます。

%multihistogram(
    data=freq(where=(region=1)),
    category=eyes,
    level=hair,
    response=count,
    levelfmt = haircolorf,
    leveltitle=hair color,
    pairtitle=region
);
pairパラメータを指定しない場合

グラフの向き

orientパラメータでグラフの向きを指定できます。hを指定すると通常のヒストグラムと同じ向きに表示されます。

%multihistogram(
    data=freq,
    category=eyes,
    pair=region,
    level=hair,
    response=count,
    orient=h,
    levelfmt = haircolorf,
    leveltitle=hair color,
    pairtitle=region
);
水平方向のマルチヒストグラム

スプリットモード

pairパラメータを指定しないノーマルモードの場合、カテゴリ変数およびペア変数ごとに独立したヒストグラムを作成します。pairsplitパラメータをTrueに設定するとスプリットモードが有効になり、一つのヒストグラムはペア変数に従い左右または上下に分割されます。つまり反転ヒストグラムと同様の表示となります。こちらのほうが必要とするスペースが少なくなります。

%multihistogram(
    data=freq,
    category=eyes,
    pair=region,
    level=hair,
    response=count,
    pairsplit=true,
    levelfmt = haircolorf,
    leveltitle=hair color,
    pairtitle=region
);
Splitモード

応答変数の表示

マルチヒストグラムは応答変数軸が存在しないため、応答変数の値をグラフから読み取ることは難しいです。responsetxtパラメータをTrueに設定すると、応答変数の値がグラフ上に表示されます。通常は別途集計結果を別途表に表示していない場合はこのパラメータは有効かもしれません。

%multihistogram(
    data=freq,
    category=eyes,
    pair=region,
    level=hair,
    response=count,
    responsetxt=true,
    levelfmt = haircolorf,
    leveltitle=hair color,
    pairtitle=region
);
応答変数の表示