データの要約#

このセクションでは、SASでの探索的データ分析の基本を学びます。カテゴリー変数、量的変数、および2変量データの基本的な要約を学びます。数値およびグラフによる要約の両方をカバーします。後のセクションでは、プレゼンテーション用にグラフの外観を改善するためプロットを扱います。

SASには、さまざまな記述統計量を生成し、理解しやすいレポートで表示するように特別に設計された多くのプロシージャがあります。特に利用するものとしては、MEANS、SUMMARY、UNIVARIATE、およびFREQプロシージャの4つです。

FREQプロシージャは、離散データ値を要約するために使用されます。したがって、青い目をした人の割合や、立ち枯れ病に罹ったニレの木の数を計算するのに使用できます。

MEANS、SUMMARY、およびUNIVARIATEプロシージャは、連続的な数値を要約するために使用され、したがって、平均身長、中央給与、最小走行距離などの統計量を計算するのに使用できます。

主にはMEANSプロシージャを使用し、SUMMARYおよびUNIVARIATEプロシージャにはMEANSプロシージャと共通のオプションおよびステートメントがあるため時間はあまりかけません。3つのプロシージャの最大の違いは、UNIVARIATEプロシージャがMEANSおよびSUMMARYプロシージャでは利用できないいくつかの統計量を計算できることです。ただし、これらの統計量を計算する必要がない場合は、MEANSおよびSUMMARYプロシージャを使用するほうが効率的です。

3つのプロシージャはすべて、次の一般的な形式をとります。

proc procname options;
  statement1;
  statement2;
  etc;
run;

ここで、当然ながらPROCNAMEはプロシージャの名前を表し、したがってMEANS、SUMMARY、またはUNIVARIATEのいずれかになります。

プロットについては、主にPROC SGPLOTを使用します。

量的データの要約#

MEANS、SUMMARY、およびUNIVARIATEプロシージャを扱うにあたり、ICDB研究から得られた血液学データセットhem2.sas7bdat(READMEを参照)を使用します。次のプログラムは、SASにデータセットについて情報とデータセットの最初の15オブザベーションを表示するよう指示しています。

libname phc6089 '/folders/myfolders/SAS_Notes/data/';
 
proc contents data = phc6089.hem2 position;
run;
 
proc print data = phc6089.hem2 (obs = 15);
run;
SAS 出力

SAS システム

CONTENTS プロシジャ

データセット名 PHC6089.HEM2 オブザベーション数 635
メンバータイプ DATA 変数の数 9
エンジン V9 インデックス数 0
作成日時 2008/11/19 14:48:26 オブザベーションのバッファ長 72
更新日時 2008/11/19 14:48:26 削除済みオブザベーション数 0
保護   圧縮済み NO
データセットタイプ   ソート済み NO
ラベル      
データ表現 WINDOWS_32    
エンコード wlatin1 Western (Windows)    
エンジン/ホスト関連情報
データセットのページサイズ 8192
データセットのページ数 6
データページの先頭 1
ページごとの最大OBS数 113
先頭ページのOBS数 87
データセットの修復数 0
ファイル名 /home/user-name/SAS_Notes/data/hem2.sas7bdat
作成したリリース 9.0101M3
作成したホスト XP_PRO
I ノード番号 9976945192
アクセス権限 rw-r--r--
所有者名 user-name
ファイルサイズ 49KB
ファイルサイズ (バイト) 50176
変数と属性リスト (アルファベット順)
# 変数 タイプ 長さ
6 hcrit 数値 8
5 hemog 数値 8
2 hosp 数値 8
8 mch 数値 8
9 mchc 数値 8
7 mcv 数値 8
4 rbc 数値 8
1 subj 数値 8
3 wbc 数値 8
作成順の変数
# 変数 タイプ 長さ
1 subj 数値 8
2 hosp 数値 8
3 wbc 数値 8
4 rbc 数値 8
5 hemog 数値 8
6 hcrit 数値 8
7 mcv 数値 8
8 mch 数値 8
9 mchc 数値 8

SAS システム

OBS subj hosp wbc rbc hemog hcrit mcv mch mchc
1 110027 11 7.5 4.38 13.8 40.9 93.3 31.5 33.7
2 110029 11 7.6 5.20 15.2 45.8 88.0 29.2 33.1
3 110039 11 7.5 4.33 13.1 39.4 91.0 30.2 33.2
4 110040 11 8.3 4.52 12.4 38.1 84.2 27.4 32.5
5 110045 11 8.9 4.72 14.6 42.7 90.4 30.9 34.1
6 110049 11 6.2 4.71 13.8 41.7 88.5 29.2 33.0
7 110051 11 6.4 4.56 13.0 37.9 83.1 28.5 34.3
8 110052 11 7.1 3.69 12.5 35.9 97.2 33.8 34.8
9 110053 11 7.4 4.47 14.4 43.6 97.5 32.2 33.0
10 110055 11 6.1 4.34 12.8 38.2 88.1 29.6 33.6
11 110057 11 9.5 4.70 13.4 40.5 86.0 28.4 33.0
12 110058 11 6.5 3.76 11.6 34.2 91.0 30.7 33.8
13 110059 11 7.5 4.29 12.3 36.8 85.7 28.6 33.4
14 110060 11 7.6 4.57 13.8 42.0 91.8 30.1 32.8
15 110062 11 4.6 4.87 13.9 42.9 88.2 28.5 32.3

最初に、血液学データセットをPC上の任意の場所にダウンロードして保存します。次にプログラムを開き、LIBNAMEステートメントを編集して、データセットを保存した場所を反映させます。最後に、プログラムを実行します。上記のような出力が表示されるはずです。

最初の2つの変数「subj」 と「hosp」は、それぞれ被験者番号とデータが収集された病院を示します。残りの変数「wbc」、「rbc」、「hemog」、…は、最も関心のある血液データ変数です。たとえば、変数「wbc」と「rbc」はそれぞれ被験者の白血球数と赤血球数を含んでいます。出力を確認する際に注目すべき重要なことは、すべての血液データ変数が連続的な数値変数ということであり、したがってMEANSプロシージャによる記述統計に適しているということです。

MEANSおよびSUMMARYプロシージャ#

このセクションでは、基本的なMEANSおよびSUMMARYプロシージャの構文を確認し、それらが生成する出力に慣れましょう。

#

MEANSプロシージャでは様々なステートメントとオプションにより統計量を出力できます。単純にするために最も基本的な形から始めましょう。 以下のプログラムはデータセットphc6089.hem2の各数値変数について、基本的な統計量を出力します。

proc means data = phc6089.hem2;
run;
SAS 出力

SAS システム

MEANS プロシジャ

変数 N 平均 標準偏差 最小値 最大値
subj
hosp
wbc
rbc
hemog
hcrit
mcv
mch
mchc
635
635
635
635
635
635
635
634
634
327199.50
32.7133858
7.1276850
4.4350079
13.4696063
39.4653543
89.1184252
30.4537855
34.1524290
144410.20
14.4426330
1.9019097
0.3941710
1.1097954
3.1623819
4.5190963
1.7232248
0.7562054
110027.00
11.0000000
3.0000000
3.1200000
9.9000000
29.7000000
65.0000000
22.0000000
31.6000000
520098.00
52.0000000
14.2000000
5.9500000
17.7000000
51.4000000
106.0000000
37.0000000
36.7000000

プログラムを開いて実行し、MEANSおよびSUMMARYプロシージャによる出力を確認してください。デフォルトでMEANSプロシージャは、N(欠損値ではない値の数)、平均、標準偏差、最小値、最大値を表示します。 ほとんどの場合ではデータセット内のすべての数値変数に対する要約統計は不要で、いくつかの重要な変数に焦点を当てたいと思うでしょう。たとえば、血液学データセットの場合、subjおよびhosp変数に対してSASが要約統計を計算するのはあまり意味がありません。結局のところ、平均のsubj番号が327199.5であることがわかっても、役に立つでしょうか?

#

以下のプログラムではMEANSプロシージャのVARステートメントにより、icdb.hem2 から7つの変数のみに限定して統計量を算出しています。

proc means data = phc6089.hem2;
  var wbc rbc hemog hcrit mcv mch mchc;
run;
SAS 出力

SAS システム

MEANS プロシジャ

変数 N 平均 標準偏差 最小値 最大値
wbc
rbc
hemog
hcrit
mcv
mch
mchc
635
635
635
635
635
634
634
7.1276850
4.4350079
13.4696063
39.4653543
89.1184252
30.4537855
34.1524290
1.9019097
0.3941710
1.1097954
3.1623819
4.5190963
1.7232248
0.7562054
3.0000000
3.1200000
9.9000000
29.7000000
65.0000000
22.0000000
31.6000000
14.2000000
5.9500000
17.7000000
51.4000000
106.0000000
37.0000000
36.7000000

プログラムを開いて実行し、出力を見て「subj」と「hosp」が分析から除外されていることを確認してください。
出力については、他にも気になる点があります。デフォルトでは、SASはMEANSプロシージャで作成されたレポートに値を表示するためにbest.形式を使用します。技術的には、これはSASが要約統計情報を最大限に提供しつつ、デフォルトのフィールド幅を12に保つ形式を選択することを意味します。実際には、しばしば不要な多くの小数点以下が表示されることがあります。

#

以下のプログラムは、前のプログラムと同じですが、2つの点が異なります:

  • MEANSキーワードはSUMMARYキーワードに置き換えられました

  • PROCステートメントにPRINTオプションが追加されました

proc summary data = phc6089.hem2 maxdec = 2 fw = 10 print;
  var wbc rbc hemog hcrit mcv mch mchc;
run;
SAS 出力

SAS システム

SUMMARY プロシジャ

変数 N 平均 標準偏差 最小値 最大値
wbc
rbc
hemog
hcrit
mcv
mch
mchc
635
635
635
635
635
634
634
7.13
4.44
13.47
39.47
89.12
30.45
34.15
1.90
0.39
1.11
3.16
4.52
1.72
0.76
3.00
3.12
9.90
29.70
65.00
22.00
31.60
14.20
5.95
17.70
51.40
106.00
37.00
36.70

MEANSとSUMMARYプロシージャは、PRINTオプションのデフォルト設定を除いて同じ機能を実行します。デフォルトでは、MEANSプロシージャは出力を生成し、SUMMARYプロシージャは生成しません。MEANSプロシージャでは、出力を抑制するにはNOPRINTオプションを使用する必要がありますが、SUMMARYプロシージャでは印刷されたレポートを取得するにはPRINTオプションを使用する必要があります。
プログラムを開いて実行し、MEANSプロシージャとSUMMARYプロシージャによって作成された2つのレポート間には違いがないことを確認してください。
実際には違いがあります。上記のプログラムのVARステートメントは、SASにどの(数値)変数を要約するかを指示します。SUMMARYプロシージャにVARステートメントを含めない場合、SASはデータセット内の単純なオブザベーションのカウントを提供します。このことを確認するために、VARステートメントを削除し、再度プログラムを実行してみてください。出力は次のようになります:

proc summary data = phc6089.hem2 maxdec = 2 fw = 10 print;
run;
SAS 出力

SAS システム

SUMMARY プロシジャ

Obs 数
635

統計量の指定#

MEANSプロシージャがデフォルトで生成する統計量(N、平均、標準偏差、最小値、最大値)が必要な統計量でない場合があります。平均と標準偏差のみを出力に限定したい場合や、中央値や範囲などの完全に異なる統計量を計算したい場合があります。

デフォルトとは異なる要約統計量を計算させるには、単に必要な統計量のキーワードをPROC MEANSステートメントのオプションとして配置します。

#

以下のプログラムはデータセットphc6089.hem2の赤血球数(rbc)の合計、範囲、中央値を算出します。

proc means data=phc6089.hem2 fw=10 maxdec=2 sum range median;
  var rbc;
run;
SAS 出力

SAS システム

MEANS プロシジャ

分析変数 : rbc
合計 範囲 中央値
2816.23 2.83 4.41

SASプログラムを開いて実行し、結果が説明通りに出力されていることを確認してください。特にPROC MEANSステートメントで統計量を指定すると、デフォルトの統計量は生成されないことには注意してください。ちなみにSUMMARYプロシージャでもPROC ステートメントの最後にPRINTオプションを追加すると同じ出力が得られます。

MEANSプロシージャおよびSUMMARYプロシージャで使用できるキーワードは次のとおりです。

記述統計量#

キーワード

説明

CLM

平均の両側信頼限界

CSS

補正済み平方和

CV

変動係数

KURT

尖度

LCLM

平均より小さい片側信頼限界

MAX

最大値

MEAN

平均値

MIN

最小値

N

欠損値ではないオブザベーションの数

NMISS

欠損値の数

RANGE

範囲

SKEW

歪度

STD

標準偏差

STDERR

平均の標準誤差

SUM

合計

SUMWGT

Weight変数値の合計

UCLM

平均より大きい片側信頼限界

USS

補正されていない平方和

VAR

分散

分位統計量#

キーワード

説明

MEDIAN

または P50 中央値または50パーセンタイル

P1

1パーセンタイル

P5

5パーセンタイル

P10

10パーセンタイル

Q1 または P25

下位四分位数または25パーセンタイル

Q3 または P75

上位四分位数または75パーセンタイル

P90

90パーセンタイル

P95

95パーセンタイル

P99

99パーセンタイル

QRANGE

四分位範囲: Q3-Q1

仮説検定#

キーワード

説明

PROBT

t値の絶対値がより大きい確率

T

母平均が0であることを検定するためのStudentのt値

グループ処理#

これまでの例では、データセット内のすべてのオブザベーションを要約していました。しかしほとんどの場合では、特定のサブグループについて要約統計量を計算したいことが多いです。たとえば、男女別に平均身長を計算するほうが、すべての個人の平均身長を計算するよりも意味があります。このセクションでは、サブグループの要約統計量を生成する2つのアプローチを確認します。1つのアプローチはCLASSステートメントを使用し、もう1つのアプローチはBYステートメントを使用します。すぐにわかるように、使用するアプローチは最終的なレポートの見え方によって使い分けます。

#

以下のプログラムはVARステートメントとCLASSステートメントにより9つの病院別に 変数「rbc」, 「wbc」, と「hcrit」でデフォルトの要約統計量を算出します。

proc means data=phc6089.hem2 fw=10 maxdec=2;
  var rbc wbc hcrit;
  class hosp;
run;
SAS 出力

SAS システム

MEANS プロシジャ

hosp Obs 数 変数 N 平均 標準偏差 最小値 最大値
11 106
rbc
wbc
hcrit
106
106
106
4.41
7.11
39.78
0.42
1.92
3.30
3.47
3.30
32.80
5.55
13.10
48.90
21 108
rbc
wbc
hcrit
108
108
108
4.43
7.37
39.28
0.39
1.94
2.90
3.33
3.10
33.00
5.35
12.60
48.00
22 42
rbc
wbc
hcrit
42
42
42
4.40
7.37
38.80
0.43
2.15
3.09
3.12
3.90
31.00
5.12
14.20
45.30
23 6
rbc
wbc
hcrit
6
6
6
4.28
5.17
39.37
0.45
1.37
3.31
3.64
3.30
35.90
4.94
6.60
44.80
31 52
rbc
wbc
hcrit
52
52
52
4.42
7.50
39.28
0.41
1.87
3.34
3.55
4.00
33.90
5.62
13.20
47.80
41 92
rbc
wbc
hcrit
92
92
92
4.50
7.00
40.19
0.44
1.93
3.51
3.54
3.00
32.50
5.49
12.50
49.90
42 95
rbc
wbc
hcrit
95
95
95
4.40
7.01
39.14
0.33
1.79
2.66
3.63
3.30
33.90
5.95
12.00
51.40
51 65
rbc
wbc
hcrit
65
65
65
4.50
7.25
40.00
0.42
1.95
3.50
3.80
3.50
33.00
5.70
11.50
49.00
52 69
rbc
wbc
hcrit
69
69
69
4.43
6.74
38.81
0.32
1.66
2.89
3.75
3.90
29.70
5.40
10.20
45.00

CLASSステートメントの変数は文字列変数である必要はありません。ここでは、数値変数「hosp」を使って、データセットphc6089.hem2内の635のオブザベーションを9つのサブグループに分割しています。数値変数がCLASS変数である場合、意味のあるサブグループを表す限られた数の離散値である必要があります。そうでない場合、多くの使えない出力が作成されることでしょう。

プログラムを開いて実行し、出力を確認して説明されているとおりのレポートが生成されていることを確認してください。CLASSステートメントで使用した変数の統計量はMEANSプロシージャでは生成されません。その変数の値は、データを分類するためにのみ使用されます。

CLASSステートメントが複数の変数を含む場合はどうなるでしょうか。

#

以下のプログラムは国立公園のデータを一時データセットparksに読み込み、MEANSプロシージャでVARステートメントとCLASSステートメントを指定し、ミュージアムとキャンプ施設の合計数を変数「Type」と「Region」別に算出します。

data parks;
  input ParkName $ 1-21 Type $ Region $ Museums Camping;
  datalines;
Dinosaur              NM West 2  6
Ellis Island          NM East 1  0
Everglades            NP East 5  2
Grand Canyon          NP West 5  3
Great Smoky Mountains NP East 3 10
Hawaii Volcanoes      NP West 2  2
Lava Beds             NM West 1  1
Statue of Liberty     NM East 1  0
Theodore Roosevelt    NP West 2  2
Yellowstone           NP West 9 11
Yosemite              NP West 2 13
;
run;
 
proc means data = parks fw = 10 maxdec = 0 sum;
  var museums camping;
  class type region;
run;
SAS 出力

SAS システム

MEANS プロシジャ

Type Region Obs 数 変数 合計
NM East 2
Museums
Camping
2
0
  West 2
Museums
Camping
3
7
NP East 2
Museums
Camping
8
12
  West 5
Museums
Camping
20
31

プログラムを開いて実行し、出力を確認してください。例として「Type」がNM、「Region」がEastのミュージアムの合計は2と算出されています。同様に「Region」がWestの場合は3で、以降も同様です。
ここではCLASSステートメントがMEANSプロシージャでどのように動作するかのほうが重要でしょう。変数「Type」が最初、「Region」が2番目にCLASSステートメントで指定されています。このことから変数「Type」が最初、「Region」が2番目に結果の表の列では表示されています。一般にCLASSステートメントでの変数の順序が出力テーブルでの順序を決定します。これを確認するには、CLASSステートメントの変数の順序を変更して、プログラムを再実行すると良いでしょう。

#

CLASSステートメントと同様に、BYステートメントもオブザベーションを分類するための変数を指定します。次のプログラムでは、MEANSプロシージャのBYステートメントを使って、変数「Type」および「Region」によって決まる4つのサブグループに公園データセットのオブザベーションを分類した後、各サブグループのミュージアムおよびキャンプ施設の数の合計、最小値、最大値を計算しています。

proc sort data = parks out = srtdparks;
  by type region;
run;
 
proc means data = srtdparks fw = 10 maxdec = 0 sum min max;
  var museums camping;
  by type region;
run;
SAS 出力

SAS システム

MEANS プロシジャ

変数 合計 最小値 最大値
Museums
Camping
2
0
1
0
1
0
変数 合計 最小値 最大値
Museums
Camping
3
7
1
1
2
6
変数 合計 最小値 最大値
Museums
Camping
8
12
3
2
5
10
変数 合計 最小値 最大値
Museums
Camping
20
31
2
2
9
13

プログラムを実行して、CLASS ステートメントの代わりに BY ステートメントを使ってサブグループを形成したときのレポートの見え方を確認してみてください。CLASS ステートメントを使うと、SAS は全ての要約統計を含む単一の大きなテーブルを生成することを覚えているでしょう。ここの出力のように、代わりに BY ステートメントを使うと、変数「Type」と「Region」の組み合わせごとにテーブルを生成します。具体的に言うと、SAS はここで 4 つのテーブルを作成しています - 1 つは Type = NM かつ Region = East 、1 つは Type = NP かつ Region = East 、1 つは Type = NM かつ Region = West 、1 つは Type = NP かつ Region = West です。

もちろん、これまでこのコードで対処していない 1 つのことがあります…それが SORT プロシージャです。CLASS ステートメントとは異なり、BY グループ処理ではデータを BY ステートメントに現れる変数の順序でソートする必要があります。データセットのオブザベーションが BY ステートメントに現れる変数の順序でソートされていない場合、MEANS プロシージャで使用する前に SORT プロシージャを使ってデータセットをソートする必要があります。OUT= オプションを指定せずに SORT プロシージャを実行すると、初期データセットが新しくソートされたオブザベーションで上書きされることを忘れないでください。ここでは、SORT プロシージャで SAS に データセットparksを 変数「Type」 と「Region」でソートし、ソート済みのデータセットを新しいデータセットsrtdparks に保存するように指示しています。

グループ処理について議論を終えるにあたり、おそらくどちらのアプローチ - CLASS ステートメントか BY ステートメントかがより適切かについて議論する必要があるでしょう。私の個人的な意見では、それは全て好みの問題です。要約統計を 1 つの大きなテーブルで見たい場合は CLASS ステートメントを使うべきです。代わりに要約統計を複数の小さなテーブルで見たい場合は BY ステートメントを使うべきです。しかし、私の個人的な意見はプログラムの効率については考慮していません。CLASS ステートメントの利点は、最初にデータをソートする必要がないので使いやすいことです。BY ステートメントの利点は、多くの変数でデータを分類する場合により効率的になる可能性があることです。

要約データセットの作成#

連続データで統計解析を行う際、オブザベーションが元のデータではなく要約統計を含むようなデータセットを作成したい状況がよくあります。例えば、10 か所の減量クリニックの被験者の平均減量量を比較するグラフを作りたい場合などです。そのようなグラフを作る1つの方法は、最初にクリニックごとの10個のオブザベーションと平均減量量の変数を含むデータセットを作成することです。MEANS プロシージャの OUTPUT ステートメントと NOPRINT オプションを組み合わせると、そのようなデータセットを作成できます。

NOPRINT オプションは、SAS にアウトプットウィンドウへの出力を抑制するよう指示します。OUTPUT ステートメントは出力データセットを作成するよう指示するもので、一般的な形式は次のとおりです。

output out=dsn keyword1=name1 keyword2=name2 ....;

ここで、dsn は作成するデータセット名、keyword1 は出力データセットに含めたい最初の統計値、「name1」はその最初の統計値を表す変数名です。同様に、keyword2 は出力データセットに出力したい 2 番目の統計値、「ame2」 はその 2 番目の統計値を表す変数名で、以降も同様です。キーワードを指定せずに OUTPUT ステートメントを使うと、デフォルトでは N、MEAN、STD、MIN、MAX の要約統計がすべての数値変数、または VAR ステートメントにリストされたすべての変数について生成されます。

#

次のプログラムでは、MEANS プロシージャの OUTPUT ステートメント(と NOPRINT オプション)を使って、各病院の要約統計のオブザベーションからなる一時データセット hospsummary を作成しています。

proc means data=phc6089.hem2 noprint;
  var rbc wbc hcrit;
  class hosp;
  output out = hospsummary
         mean = MeanRBC MeanWBC MeanHCRIT
       median = MedianRBC MedianWBC MedianHCRIT;
RUN;

title 'Hospital Statistics'; 
proc print data = hospsummary;   
run;

title ; *Reset title;
SAS 出力

Hospital Statistics

OBS hosp _TYPE_ _FREQ_ MeanRBC MeanWBC MeanHCRIT MedianRBC MedianWBC MedianHCRIT
1 . 0 635 4.43501 7.12769 39.4654 4.410 7.0 39.30
2 11 1 106 4.41321 7.10660 39.7821 4.405 7.2 39.35
3 21 1 108 4.42991 7.36944 39.2769 4.440 7.6 39.00
4 22 1 42 4.39571 7.37071 38.8024 4.445 7.1 39.40
5 23 1 6 4.27667 5.16667 39.3667 4.235 5.4 39.10
6 31 1 52 4.42135 7.50212 39.2846 4.375 7.5 39.10
7 41 1 92 4.50207 7.00435 40.1859 4.455 6.8 40.20
8 42 1 95 4.39726 7.00632 39.1358 4.350 6.9 39.30
9 51 1 65 4.50000 7.24615 39.9969 4.500 7.1 40.00
10 52 1 69 4.42580 6.74203 38.8145 4.410 6.7 38.50

まずコードを確認しましょう。VAR ステートメントは、要約したい3つの変数 「rbc」、「wbc」、「hcrit」 を指定しています。CLASS ステートメントは、変数「hosp」の値でカテゴリ分けしたいことを伝えています。OUTPUT ステートメントの OUT= 部分は 一時データセットhospsummaryを作成するよう指示しています。OUTPUT ステートメントの MEAN= 部分は、「rbc」、「wbc」、「hcrit」の値の平均を計算し、結果をそれぞれ 「MeanRBC」、「MeanWBC」、「MeanHCRIT」 という 3 つの新しい変数に保存するよう指示しています。OUTPUT ステートメントの MEDIAN= 部分は、「rbc」、「wbc」、「hcrit」の 値の中央値を計算し、結果をそれぞれ「MedianRBC」、「MedianWBC」、「MedianHCRIT」 という3つの新しい変数に保存するよう指示しています。各キーワードについて、変数は VAR ステートメントと同じ順序で記載する必要があることに注意してください。

PROC MEANS ステートメントの NOPRINT オプションは、SAS に要約統計の出力を抑制するよう指示しています。そのため、データセットhospsummaryの内容を表示するにはPRINT プロシージャを使って表示するよう指示する必要があります。PROC PRINT ステートメントに DATA= オプションがないため、SAS は最新のデータセットを表示します。MEANS プロシージャで作成されたデータセットが最新のデータセットになります。したがって、hospsummary データセットが表示されるのです。

さて、プログラムを実行し、作成した要約データセットの出力を確認して理解を深めましょう。予想どおり、データセットには変数「hosp」と、要求した 「MeanRBC」、「MeanWBC」、…、「MedianHCRIT」 の 6つの変数が含まれており、そこには要約統計が入っています。ご覧のとおり、データセットには 「_TYPE_」 と 「_FREQ_」 という 2 つの追加の変数も含まれています。

CLASS ステートメントを使ってサブグループの統計CLASS ステートメントを使ってサブグループの統計を含む出力データセットを作成する場合、SASは自動的にこれら2つの追加の変数「_TYPE_」と_FREQ_を作成します。変数「_FREQ_」は驚くような点はなく、各統計値の計算に寄与したオブザベーションの数を示しています。変数「_TYPE_」は、データセットhospsummaryの各オブザベーションがどのような種類の要約統計値を含むかを示しています。ここでは「_TYPE_」が0と1の2つの値を取ることがわかります。「_TYPE_」が1の場合、それはサブグループ(hosp)レベルの要約統計値であることを意味します。そのため、hospsummaryの9つのオブザベーションで「_TYPE_」が1になっているのです。つまり、病院ごとに1つずつです。ここでは本当はこれらの9つのオブザベーションが欲しかっただけですが、結果はさらに複雑で私たちにこの「ボーナス」のオブザベーションを与えてしまいました。「_TYPE_」が0の場合、それは全体の要約統計値であることを意味します。そのため、「_TYPE_」が0のオブザベーション1つでは、「_FREQ_」が635となっているのです。これは、データセットphc6089.hem2のすべてのオブザベーションが、hospsummaryのそのオブザベーションの平均値と中央値の計算に使われたことを示しています。そのため、そのオブザベーションではhosp=.となっていることも理にかなっています。うーん、これは混乱しそうですね!

#

SUMMARYプロシージャを使っても要約データセットを作成できます。次のプログラムは、前のプログラムと2点が異なるだけです。

  • MEANSキーワードがSUMMARYに置き換えられている

  • NOPRINTオプションがPROCステートメントから削除されている

proc summary data=phc6089.hem2;
  var rbc wbc hcrit;
  class hosp;
  output out = hospsummary 
         mean = MeanRBC MeanWBC MeanHCRIT
         median = MedianRBC MedianWBC MedianHCRIT;
run;

title 'Hospital Statistics'; 
proc print data = hospsummary;
run;

title ; *reset title;
SAS 出力

Hospital Statistics

OBS hosp _TYPE_ _FREQ_ MeanRBC MeanWBC MeanHCRIT MedianRBC MedianWBC MedianHCRIT
1 . 0 635 4.43501 7.12769 39.4654 4.410 7.0 39.30
2 11 1 106 4.41321 7.10660 39.7821 4.405 7.2 39.35
3 21 1 108 4.42991 7.36944 39.2769 4.440 7.6 39.00
4 22 1 42 4.39571 7.37071 38.8024 4.445 7.1 39.40
5 23 1 6 4.27667 5.16667 39.3667 4.235 5.4 39.10
6 31 1 52 4.42135 7.50212 39.2846 4.375 7.5 39.10
7 41 1 92 4.50207 7.00435 40.1859 4.455 6.8 40.20
8 42 1 95 4.39726 7.00632 39.1358 4.350 6.9 39.30
9 51 1 65 4.50000 7.24615 39.9969 4.500 7.1 40.00
10 52 1 69 4.42580 6.74203 38.8145 4.410 6.7 38.50

ここで本当に新しいことはありません。この例は、SUMMARYプロシージャとMEANSプロシージャの根本的な違いを補強するだけです。SUMMARYプロシージャはデフォルトでアウトプットに出力しません。そのため、NOPRINTオプションを使ってアウトプットへの出力を抑制するよう指示する必要がありません。この例はまた、SUMMARYプロシージャとMEANSプロシージャの根本的な類似点、つまり2つのプロシージャが同じ構文を使い、同じ出力を生成するということを補強するはずです。プログラムを開いて実行し、出力を確認して、MEANSプロシージャとSUMMARYプロシージャで作成されたデータセットに違いがないことを確認してください。

#

CLASSステートメントの代わりにBYステートメントを使っても、前の2つの例で作成したhospsummaryと同様の要約データセットを作成でき、次のプログラムではそれを行っています。

proc sort data = phc6089.hem2 out = srtdhem2;
  by hosp;
run;
 
proc means data=srtdhem2 noprint;
  var rbc wbc hcrit;
  by hosp;
  output out = hospsummary 
         mean = MeanRBC MeanWBC MeanHCRIT
         median = MedianRBC MedianWBC MedianHCRIT;
run;

title 'Hospital Statistics'; 
proc print data = hospsummary;  
run;

title ; *reset title;
SAS 出力

Hospital Statistics

OBS hosp _TYPE_ _FREQ_ MeanRBC MeanWBC MeanHCRIT MedianRBC MedianWBC MedianHCRIT
1 11 0 106 4.41321 7.10660 39.7821 4.405 7.2 39.35
2 21 0 108 4.42991 7.36944 39.2769 4.440 7.6 39.00
3 22 0 42 4.39571 7.37071 38.8024 4.445 7.1 39.40
4 23 0 6 4.27667 5.16667 39.3667 4.235 5.4 39.10
5 31 0 52 4.42135 7.50212 39.2846 4.375 7.5 39.10
6 41 0 92 4.50207 7.00435 40.1859 4.455 6.8 40.20
7 42 0 95 4.39726 7.00632 39.1358 4.350 6.9 39.30
8 51 0 65 4.50000 7.24615 39.9969 4.500 7.1 40.00
9 52 0 69 4.42580 6.74203 38.8145 4.410 6.7 38.50

ご覧のとおり、唯一の違いはCLASSステートメントがBYステートメントに置き換えられたこと、そしてそのため、SORTプロシージャを追加してデータセットphc6089.hem2を「hosp」でソートする必要があったことです。プログラムを開いて実行し、出力を確認して、ここでの結果のデータセットhospsummaryが前の例のものと変わらないことを確認してください。

ここでは_TYPE_=0の場合、すべてのオブザベーションがサブグループレベルの要約統計値を含むことを意味します。「_TYPE_」の意味がこれまでとはかなり違うので、もはや混乱してしまったかもしれません。幸いそれについて心配する必要はありません!詳しく知りたければいつでもSASヘルプとドキュメントを参照できます。より重要なのは、MEANSプロシージャが入力データの独立したサブセットとしてそれぞれのBYグループを要約するため、CLASSステートメントを使う場合のようには全体の要約は生成されないことです。
このような出力を必要とする場合、CLASSステートメントを使う場合でもnwayオプションを指定することで同様の出力を得ることが可能です。

PROC SGPLOTのグラフによる要約#

このセクションでは、量的変数のグラフによる要約を作成するためにPROC SGPLOTを使用する方法と、要約データセットを使用して交互作用プロットを作成する例を見ていきます。このセクションでは主に以下のプロットの作成に焦点を当てます。

  • ヒストグラム

  • ボックスプロット

  • 散布図

#

次のプログラムはデータセットphc6089.hem2を使用してヒストグラムを作成します。

proc sgplot data = phc6089.hem2;
  histogram wbc;
run;
SAS 出力
SGPlot プロシジャ

SGPLOTプロシージャには、以下のような一般的な形式があります。

proc sgplot data = データセット;
  plot_keyword 変数 / プロットオプション;
run;

ここで「PLOT_KEYWORD」はプロットの種類のためのステートメント、「変数」はデータセットからプロットに含まれる変数、「プロットオプション」はプロットを修正するためのオプション引数です。

ボックスプロットを作成するには、横向きのプロットならキーワードにHBOX、または縦向きならVBOXを使用します。

proc sgplot data = phc6089.hem2;
  vbox wbc;
run;
SAS 出力
SGPlot プロシジャ

散布図を作成するには、キーワードSCATTERを使用します。散布図には2つの変数が必要なので、単一の変数ではなく X=Y= を指定する必要があります。

proc sgplot data = phc6089.hem2;
  scatter x=rbc y=wbc;
run;
SAS 出力
SGPlot プロシジャ

PROC SGPLOTで利用可能な量的変数の他の標準的なプロットには、以下があります。

  • DENSITY - 密度プロットを作成

  • SERIES - 線プロットを作成

  • BUBBLE - 散布図の点のサイズを別の第3の変数で決める、バブルプロットを作成

data back;
  set phc6089.back;
  if race = 4 then race2 = 0;
  else race2 = 1;
run;

proc sort data=back out=back;
  by sex race2;
run;
 
proc means data=back noprint;
  by sex race2;
  var ed_level;
  output out=meaned mean=mn_edlev;
run;

title 'Mean Education Level for Sex and Race combinations'; 
proc print data = meaned;   
run;

title 'Interaction Plot of SEX, RACE, and Mean Education Level'; 
proc sgplot data=meaned;  
  series x = race2 y = mn_edlev / group = sex;
  xaxis min = -0.5 max = 1.5;
run;

title ; *reset title;
SAS 出力

Mean Education Level for Sex and Race combinations

OBS sex race2 _TYPE_ _FREQ_ mn_edlev
1 1 0 0 51 3.47059
2 1 1 0 5 4.40000
3 2 0 0 542 3.70849
4 2 1 0 40 3.42500

SGPlot プロシジャ

最初のデータステップでは、「race」の値が4以外のすべての人種をnon-whiteとしてまとめるために、新しい変数「race2」を追加しています。SORTプロシージャでは、BYグループ処理のためのデータセットbackの準備を行っています。MEANSプロシージャは、「sex」「race」の各組み合わせについて平均教育水準(「ed_level」)を計算し、結果を新しいデータセットmeanedに出力しています。PRINTプロシージャは、当然のことながらmeanedデータセットを出力するよう指示しています。

データセットmeanedが作成されたら、データセットの平均値を使ってプロットを作成するだけです。SGPLOTプロシージャは、Y軸に「ed_level」、X軸に「race2」をプロットするよう指示しています。SERIESステートメントの「group=sex」オプションは、SASに2つの異なる線グラフ(1つは男性用、もう1つは女性用)を作成させます。このプロットは、男性(sex=1)の場合、non-whiteの平均教育水準がwhiteよりも高く、一方女性(sex=2)の場合、non-whiteの平均教育水準がwhiteよりも低いことを示しています。ただし、両方の性別のnon-whiteのサンプルサイズが非常に小さいため、このnon-whiteと女性の平均教育水準の差はより多くのデータではなくなる可能性があります。

この種の交互作用を表示する別の方法は、次のコードに示すように、横に並んだボックスプロットを使うことです。

title 'Interaction Plot Using Boxplots of SEX, RACE, and Mean Education Level';
proc sgplot data=back; 
  vbox ed_level / category = race2 group = sex;
  xaxis min = -0.5 max = 1.5;
run;

title ; *reset title;
SAS 出力
SGPlot プロシジャ

ボックスプロットを使うと、データのばらつきも確認できます。これは、平均値の違いは統計的に有意ではない可能性が高いことを示しています。

VBOXステートメントでは、「category=」オプションを使用して横に並んだボックスプロットを作成し、次に「group=s」オプションを使用してwhiteとnon-whiteの両方のグループに対して男女別のボックスプロットを作成しました。

UNIVARIATEプロシージャ#

このセクションでは、UNIVARIATEプロシージャを概要を見ていき、MEANSおよびSUMMARYプロシージャの出力と、それらがどのように異なるかを確認します。

#

以下は(ほぼ)最もシンプルなUNIVARIATEプロシージャのコードで、データセット phc6089.hem2の赤血球数「rbc」の単変量解析を行います。

title 'Univariate Analysis of RBC';
proc univariate data = phc6089.hem2; 
  var rbc;
run;
SAS 出力

Univariate Analysis of RBC

UNIVARIATE プロシジャ

変数 : rbc

モーメント
N 635 重み変数の合計 635
平均 4.43500787 合計 2816.23
標準偏差 0.394171 分散 0.15537078
歪度 0.29025297 尖度 0.51198988
無修正平方和 12588.5073 修正済平方和 98.505075
変動係数 8.88771825 平均の標準誤差 0.0156422
基本統計量
位置 ばらつき
平均 4.435008 標準偏差 0.39417
中央値 4.410000 分散 0.15537
最頻値 4.600000 範囲 2.83000
    四分位範囲 0.52000
 位置の検定 H0: Mu0=0
検定 統計量 p 値
Student の t 検定 t 283.5284 Pr > |t| <.0001
符号検定 M 317.5 Pr >= |M| <.0001
符号付順位検定 S 100965 Pr >= |S| <.0001
 分位点 (定義 5)
水準 分位点
100% 最大値 5.95
99% 5.41
95% 5.12
90% 4.92
75% Q3 4.69
50% 中央値 4.41
25% Q1 4.17
10% 3.97
5% 3.82
1% 3.55
0% 最小値 3.12
極値
最小値 最大値
Obs Obs
3.12 218 5.49 369
3.33 152 5.55 33
3.35 227 5.62 286
3.47 72 5.70 517
3.54 365 5.95 465

最もシンプルなUNIVARIATEプロシージャは、VARステートメントを使っていないものでしょう。今回はデータセットphc6089.hem2の赤血球数の変数「rbc」に対して単変量解析を実行するよう指示しています。

プログラムを開いて実行し、出力を確認して、UNIVARIATEプロシージャが算出する要約統計量の種類を確認しておいてください。出力には、Moments、Basic Statistical Measures、Tests for Location Mu0=0、Quantiles、Extreme Observationsの5つの主要なセクションがあることがわかります。

入門レベルの統計コースを履修済みであれば、出力の内容を理解できるはずです。たとえば、出力によると、データセット内の635人の被験者(N)の平均(Mean)赤血球数は4.435で、標準偏差は0.394です。中央値(50% Median)の赤血球数は4.41です。データセット内の最小赤血球数は3.12(オブザベーション#218)で、最大は5.95(オブザベーション#465)です。

#

NORMALオプションを指定た場合、VARステートメントで指定した変数が正規分布であるという帰無仮説に対して、4つの検定統計量Shapiro-Wilk , Kolmogorov-Smirnov , Cramer-von MisesAnderson-Darlingを算出します。
PLOTオプションを指定すると、ヒストグラム、箱ひげ図、正規確率プロットをVARステートメントで指定された各変数で出力します。
同様にBYステートメントも指定した場合はBYグループごとに各変数がプロットされます。
以下のUNIVARIATEプロシージャではデータセットhem2の変数「rbc」についてNORMALとPLOTオプションを使用しています。

title 'Univariate Analysis of RBC with NORMAL and PLOT Options';
proc univariate data = phc6089.hem2 normal plot;   
  var rbc;
run;
SAS 出力

Univariate Analysis of RBC with NORMAL and PLOT Options

UNIVARIATE プロシジャ

変数 : rbc

モーメント
N 635 重み変数の合計 635
平均 4.43500787 合計 2816.23
標準偏差 0.394171 分散 0.15537078
歪度 0.29025297 尖度 0.51198988
無修正平方和 12588.5073 修正済平方和 98.505075
変動係数 8.88771825 平均の標準誤差 0.0156422
基本統計量
位置 ばらつき
平均 4.435008 標準偏差 0.39417
中央値 4.410000 分散 0.15537
最頻値 4.600000 範囲 2.83000
    四分位範囲 0.52000
 位置の検定 H0: Mu0=0
検定 統計量 p 値
Student の t 検定 t 283.5284 Pr > |t| <.0001
符号検定 M 317.5 Pr >= |M| <.0001
符号付順位検定 S 100965 Pr >= |S| <.0001
正規性の検定
検定 統計量 p 値
Shapiro-Wilk W 0.992948 Pr < W 0.0044
Kolmogorov-Smirnov D 0.033851 Pr > D 0.0771
Cramer-von Mises W-Sq 0.145326 Pr > W-Sq 0.0279
Anderson-Darling A-Sq 1.070646 Pr > A-Sq 0.0085
 分位点 (定義 5)
水準 分位点
100% 最大値 5.95
99% 5.41
95% 5.12
90% 4.92
75% Q3 4.69
50% 中央値 4.41
25% Q1 4.17
10% 3.97
5% 3.82
1% 3.55
0% 最小値 3.12
極値
最小値 最大値
Obs Obs
3.12 218 5.49 369
3.33 152 5.55 33
3.35 227 5.62 286
3.47 72 5.70 517
3.54 365 5.95 465
rbc のプロット

プログラムを開いて実行し、 UNIVARIATEプロシージャのNORMAL、PLOTオプションによる出力を見てみてください。新しいセクションとして正規性の検定が追加され、4つの正規性の検定統計量とp値が算出されます。 アウトプットの末尾ではヒストグラムと箱ひげ図を確認できます。

#

UNIVARIATEプロシージャでIDステートメントを使用すると、SASは極値として最大と最小から5オブザベーションを、(通常意味のない)オブザベーション番号だけではなく、IDステートメントで指定した変数の値で示します。次のUNIVARIATEプロシージャでは、被験者番号「subj」を使って赤血球数「rbc」の極値を示します。

title 'Univariate Analysis of RBC with ID Option';
proc univariate data = phc6089.hem2;   
  var rbc;
  id subj;
run;
SAS 出力

Univariate Analysis of RBC with ID Option

UNIVARIATE プロシジャ

変数 : rbc

モーメント
N 635 重み変数の合計 635
平均 4.43500787 合計 2816.23
標準偏差 0.394171 分散 0.15537078
歪度 0.29025297 尖度 0.51198988
無修正平方和 12588.5073 修正済平方和 98.505075
変動係数 8.88771825 平均の標準誤差 0.0156422
基本統計量
位置 ばらつき
平均 4.435008 標準偏差 0.39417
中央値 4.410000 分散 0.15537
最頻値 4.600000 範囲 2.83000
    四分位範囲 0.52000
 位置の検定 H0: Mu0=0
検定 統計量 p 値
Student の t 検定 t 283.5284 Pr > |t| <.0001
符号検定 M 317.5 Pr >= |M| <.0001
符号付順位検定 S 100965 Pr >= |S| <.0001
 分位点 (定義 5)
水準 分位点
100% 最大値 5.95
99% 5.41
95% 5.12
90% 4.92
75% Q3 4.69
50% 中央値 4.41
25% Q1 4.17
10% 3.97
5% 3.82
1% 3.55
0% 最小値 3.12
極値
最小値 最大値
subj Obs subj Obs
3.12 220007 218 5.49 410063 369
3.33 210057 152 5.55 110086 33
3.35 220021 227 5.62 310092 286
3.47 110134 72 5.70 510026 517
3.54 410059 365 5.95 420074 465

プログラムを開いて実行します。IDステートメントを使用することによるUNIVARIATEプロシージャ出力の変化について出力を確認してください。前の例では、UNIVARIATEプロシージャの出力はオブザベーション#218が、データセット内で最小の赤血球数(3.12)を持ち、オブザベーション#465が最大(5.95)の赤血球数を持つことを示していました。しかし今回は、被験者番号をID変数(“id subj”)として使用したため、SASはより役立つ情報を報告しています。被験者220007が最小の赤血球数を持ち、被験者420074が最大の赤血球数を持つと報告されています。
UNIVARIATEプロシージャはここで扱えるよりもはるかに多くのことができることを知っても驚かないでください。BYステートメントをMEANSおよびSUMMARYプロシージャで使用して入力データセットのオブザベーションをサブグループに分類できるように、UNIVARIATEプロシージャでもBYステートメントを使用できます。また、OUTPUTステートメントをMEANSおよびSUMMARYプロシージャで使用して要約データセットを作成できるように、UNIVARIATEプロシージャでもOUTPUTステートメントを使用できます。UNIVARIATEプロシージャの機能と構文の詳細については、SASヘルプおよびドキュメンテーションを参照してください。

カテゴリカルデータの要約#

このセクションでは、FREQプロシージャをカテゴリカルデータの要約と分析のためのツールとして使用方法を確認します。このプロシージャは、記述的なプロシージャであると同時に統計的なプロシージャでもあります。1次元から多次元の度数およびクロス集計表を作成することができます。2次元表の場合、FREQプロシージャはカイ2乗検定と関連尺度も計算します。また、多次元表の場合、FREQプロシージャは層別分析を実行し、層内および層間の統計量を計算します。FREQプロシージャは、定性変数の要約統計量(カウントやパーセンテージなど)をSASデータセットに出力することもできます。

基本的な1次元の表#

デフォルトでは、FREQプロシージャは、入力データセットの各変数の値ごとに、度数パーセンテージ累積度数累積パーセンテージを含む1次元の表を作成します。変数が文字変数か数値変数かは、FREQプロシージャには関係ありません。数値変数の場合、ごく少数の可能な結果しか持たない離散的な数値変数(きょうだいの数など)か、無限の可能な結果を持つ連続的な数値変数(体重など)かは関係ありません。つまり、デフォルトのFREQプロシージャを使うと、膨大な出力が作成される可能性があります。そのため、デフォルトバージョンはスキップし、TABLESステートメントを使って作成するテーブル数を制限するより実用的な使用方法に移ります。

FREQプロシージャには以下の一般的な形式があります。

proc freq options;
  tables ... /options;
run;

TABLESステートメントは、作成する特定の度数テーブルを指示します。TABLESステートメントを含めない場合、入力データセットの各変数に対して1次元の度数分布表を作成します。

前のコードからプロシージャオプションとテーブルオプションの2種類のオプションがあることがわかります。プロシージャオプション(典型的な「DATA=」オプションなど)は、PROC FREQステートメントの後に続けて指定します。テーブルオプションは、TABLESステートメントのスラッシュ(/)の後に指定する必要があります。いずれの場合も、任意の数のオプションを指定できます。

ここでは、ICDBの背景データセットを使ってFREQプロシージャについて説明します。データセットをPC上の任意の場所に保存してください。

#

次のFREQプロシージャは最もシンプルな実行例で、何の処理もされていない変数「sex」の一次元の度数分布表を作成します。:

LIBNAME phc6089 '/folders/myfolders/SAS_Notes/data/';

title 'Frequency Count of SEX'; 
proc freq data=phc6089.back;   
  tables sex;
run;
SAS 出力

Frequency Count of SEX

FREQ プロシジャ

sex 度数 パーセント 累積
度数
累積
パーセント
1 56 8.78 56 8.78
2 582 91.22 638 100.00

プログラムを開いて、LIBNAMEステートメントをデータセットbackの保存先に合わせて修正し、実行して出力を確認いてください。 このような基本的な一次元の度数分布表が表示されるはずで、変数「sex」の各値の度数、パーセンテージ、累積度数、累積パーセンテージが出力されます。
この出力によると、例としてICDB研究の被験者の56人、8.78%が男性(sex=1)であることがわかります。

#

繰り返しになりますが、デフォルトではSASは度数、パーセント、累積度数、累積パーセントを出力します。TABLEステートメントのNOCUMオプションは、一次元度数分布表の累積度数と累積パーセンテージが出力されないようします。以下NOCUMオプションの例:

title 'Frequency Count of SEX: No Cumulative Stats';
proc freq data=phc6089.back;    
  tables sex / nocum;
run;
SAS 出力

Frequency Count of SEX: No Cumulative Stats

FREQ プロシジャ

sex 度数 パーセント
1 56 8.78
2 582 91.22

プログラムを開いてして実行し、確かに累積度数と累積パーセンテージが出力されていないことを確認してください。表には各性別の数とパーセンテージのみが含まれています。 FREQプロシージャで、TABLESステートメントに多くの変数を指定できます。リストが長い場合、リストを指定するための短縮形を使用できます。TABLESステートメントで番号付きの複数の変数を以下のように指定できます。

tables var1-var4;

このように指定すると「var1」、「var2」、「var3」、「var4」という4つの変数に対して1次元の度数分布表を作成します。代わりにTABLESステートメントでデータセット内の変数の位置で複数の変数を指定する場合、

tables sex--race;  

のようにすると、変数「sex」と「race」の間にあるすべての変数(この場合のデータセットbackでは「sex」、「state」、「country」、「race」の変数)に対して一次元の度数分布表を作成します。データセット内の変数の位置がわからない場合は、CONTENTSプロシージャのVARNUMオプションを使用してデータセット内の変数の位置を確認できます。(2つのダッシュはタイプミスではありません。データセット内の変数の位置による複数の変数の指定には2つのダッシュが必要です。)

TABLESステートメントに複数の変数を指定する代わりに、FREQプロシージャに複数のTABLESステートメントを指定することができます。複数のテーブルを作成させる方法に関係なく、PAGEオプションを使って1ページ1テーブルのみを出力させることができます。それ以外の場合、FREQプロシージャはスペースに余裕があれば、複数の表を1ページに出力します。

#

以下のプログラムはPAGEオプションと合わせて2つの1次元の度数分布表の作成します。

title 'Frequency Count of SEX and RACE';
proc freq data=phc6089.back page;   
  tables sex race;
run;
SAS 出力

Frequency Count of SEX and RACE

FREQ プロシジャ

sex 度数 パーセント 累積
度数
累積
パーセント
1 56 8.78 56 8.78
2 582 91.22 638 100.00

Frequency Count of SEX and RACE

FREQ プロシジャ

race 度数 パーセント 累積
度数
累積
パーセント
1 2 0.31 2 0.31
2 7 1.10 9 1.41
3 29 4.55 38 5.96
4 593 92.95 631 98.90
5 3 0.47 634 99.37
6 2 0.31 636 99.69
7 1 0.16 637 99.84
8 1 0.16 638 100.00

プログラムを開いて実行し出力を確認すると、2つの一次元の度数分布表(1つはカテゴリカル変数「sex」に対し、もう1つはカテゴリカル変数「race」に対し)を作成していることがわかります。PAGEオプションが指定されたため、各表が個別のページに出力されているはずです。最初のページには変数「sex」の表、2ページ目には変数「race」の表が出力されます。

TABLESステートメントの変数の順序が出力の順序を決めることにも注目してください。

#

他のSASプロシージャと同様に、BYステートメントを使用して、BYグループの各水準に対して算出をするように指定できます。以下のプログラムは、変数「ed_level」に対して、変数「sex」の各水準に対する一次元の度数分布表を作成します:

proc sort data=phc6089.back out=s_back;
  by sex;
run;

title 'Frequency Count of Education Level within Each Level of Sex';    
proc freq data=s_back;    
  tables ed_level;
  by sex;
run;
SAS 出力

Frequency Count of Education Level within Each Level of Sex

FREQ プロシジャ

ed_level 度数 パーセント 累積
度数
累積
パーセント
1 4 7.14 4 7.14
2 7 12.50 11 19.64
3 12 21.43 23 41.07
4 20 35.71 43 76.79
5 13 23.21 56 100.00

Frequency Count of Education Level within Each Level of Sex

FREQ プロシジャ

ed_level 度数 パーセント 累積
度数
累積
パーセント
1 7 1.20 7 1.20
2 22 3.78 29 4.98
3 220 37.80 249 42.78
4 229 39.35 478 82.13
5 104 17.87 582 100.00

他の場合と同様にSORTプロシージャは、背景データセットをBYグループ処理用に並べ替えるだけです。SORTプロシージャは、データセットphc6089.backを「sex」で並べ替え、結果を新しいデータセットs_backに格納します。次に、FREQプロシージャではBYステートメント(「by sex」)とTABLESステートメント(「tables ed_level」)の両方が呼び出されています。プログラムを開いて実行し、出力を確認すると、教育水準「ed_level」の一次元の度数分布表を2つ作成していることがわかります。1つは男性(sex=1)、もう1つは女性(sex=2)の表です。

これまでの例ではすべて欠損値が存在しませんでした。欠損値が存在する場合、SASはデフォルトで要求された度数分布表から欠損値を除外します。代わりに、表の下にFrequency Missingを出力します。代わりに、TABLEステートメントのオプションMISSINGを使って、欠損値を非欠損値のように扱うことで、パーセンテージやその他の統計量の計算に含めるよう指示することができます。またはMISSPRINTオプションを使って、度数の出力時には欠損値を非欠損値として扱い、統計量の計算には含めないよう指示することもできます。

#

以下のプログラムは背景データセットの変数「state」にMISSINGとMISSPRINTオプションを使用します。

title 'One-way Table of State: with MISSING Option';
proc freq data=phc6089.back;   
  tables state / missing;
  where state <= 5; *To keep the output small;
run;
SAS 出力

One-way Table of State: with MISSING Option

FREQ プロシジャ

state 度数 パーセント 累積
度数
累積
パーセント
. 42 43.30 42 43.30
1 4 4.12 46 47.42
3 1 1.03 47 48.45
4 5 5.15 52 53.61
5 45 46.39 97 100.00

プログラムを開いて実行し出力を確認すると、TABLEステートメントのオプションMISSINGを使用したFREQプロシージャの出力は上の表のようになります。最初の行は、42人の被験者が居住の州を回答していないことを示しています。MISSINGオプションが使用されたため、この42人がデータセットの6.58%を占めていることも示しています。この42人は累積パーセンテージの計算に含まれています。
一方、TABLEステートメントのオプションMISSPRINTを使用したFREQプロシージャの出力の最初の数行は次のようになるはずです。

title 'one-way table of state: with missprint option';
proc freq data=phc6089.back;   
  tables state/missprint;
  where state <= 5; *to keep the output small;
run;
SAS 出力

one-way table of state: with missprint option

FREQ プロシジャ

state 度数 パーセント 累積
度数
累積
パーセント
欠損値の度数 = 42
. 42 . . .
1 4 7.27 4 7.27
3 1 1.82 5 9.09
4 5 9.09 10 18.18
5 45 81.82 55 100.00

最初の行では、再び42人の被験者が居住州を回答していないことが示されています。ただしこの場合、MISSPRINTオプションが指定されたため、他の項目は出力されません。つまりこれらの被験者をパーセンテージ、累積度数、累積パーセンテージの計算には含まれていません。

2次元および多次元の表#

これまででは、FREQプロシージャを使って1次元の数表のみを作成してきました。ただし、複数の変数の度数からなるクロス集計表を作成するほうが役立つ場合があります。たとえば、新しい治療で副作用が発現する割合が年齢層間でどのように異なるかを知りたい場合、2つのカテゴリカル変数―年齢層(18-29歳、30-44歳、45-54歳、55-70歳、70歳超など)と副作用(はい または いいえ)の2次元の度数分布表を作成する必要があります。このような表をこのセクションでは扱います。

#

以下のFREQプロシージャは2次元の度数分布表を作成する最もシンプルなもので、変数「sex」、「ed_level」について余分なものを含まない表を出力します。

title 'Crosstabulation of Education Level and Sex';
proc freq data=phc6089.back;   
  tables ed_level*sex;
run;
SAS 出力

Crosstabulation of Education Level and Sex

FREQ プロシジャ

度数
パーセント
行のパーセント
列のパーセント
表 : ed_level * sex
ed_level sex
1 2 合計
1
4
0.63
36.36
7.14
7
1.10
63.64
1.20
11
1.72
 
 
2
7
1.10
24.14
12.50
22
3.45
75.86
3.78
29
4.55
 
 
3
12
1.88
5.17
21.43
220
34.48
94.83
37.80
232
36.36
 
 
4
20
3.13
8.03
35.71
229
35.89
91.97
39.35
249
39.03
 
 
5
13
2.04
11.11
23.21
104
16.30
88.89
17.87
117
18.34
 
 
合計
56
8.78
582
91.22
638
100.00

これまでに見ているように、教育水準と性別の2変量の度数分布表を作成するよう指示するには、TABLESステートメントで2つの変数を*でつなげます。
プログラムを開いて実行し、2次元の度数分布表が作成されたことを確認してください。
一般的に、*の前の変数の値が表の行を、*の後の変数の値が表の列となります。この場合、「ed_level」が*の前にあるので表の行、「sex」が*の後にあるのでが表の列となります。
2次元の度数分布表を作成する際、デフォルトでは各セルにセルの度数、全体に対するセルの割合、行度数に対するセル割合、列度数に対するセル割合が表示されます。表の左上にあるガイドを確認して、セルの数値がそれぞれ何を表しているかを確認してください。ここでは、(i, j)セルの最初の数値が「ed_level」がiで「sex」がjである被験者数、2番目の数値がその割合、3番目の数値が「ed_level」がiの被験者のうち「sex」がjである割合、4番目の数値が「sex」がjの被験者のうち「ed_level」がiである割合を表していることがわかります。 例えば、ed_level=4かつsex=2のセルについては、229人の被験者がその条件を満たし、全体の35.89%を占め、ed_level=4の被験者の91.97%がsex=2であり、sex=2の被験者の39.35%がed_level=4であることがわかります。

ショートカットについて 多くの2次元の度数分布表を作成する必要がある場合は、次のようなショートカットを使うことができます。

tables a*(b c);

このステートメントは、a*bとa*cの2つの2次元の度数分布表を作成します。

tables (a b)*(c d);

このステートメントは、a*c、b*c、a*d、b*dの4つの2次元の度数分布表を作成します。

tables (a b c)*d;

このステートメントは、a*d、b*d、c*dの3つの2次元の度数分布表を作成します。

#

3変量以上の頻度分析を行う場合、FREQプロシージャを使って多次元の度数分布表を作成することができます。その場合、他の変数のそれぞれの水準ごとに2次元の度数分布表が作成されます。次のプログラムは、「sex」、「job_chng」、「ed_level」の3次元の度数分布表を作成します。

title '3-way Table of Sex, Job Change, and Ed. Level';
proc freq data=phc6089.back;   
  tables sex*job_chng*ed_level;
run;
SAS 出力

3-way Table of Sex, Job Change, and Ed. Level

FREQ プロシジャ

度数
パーセント
行のパーセント
列のパーセント
表 1 : job_chng * ed_level
層別変数 :  sex=1
job_chng ed_level
1 2 3 4 5 合計
0
4
7.84
8.33
100.00
6
11.76
12.50
100.00
11
21.57
22.92
100.00
15
29.41
31.25
88.24
12
23.53
25.00
92.31
48
94.12
 
 
1
0
0.00
0.00
0.00
0
0.00
0.00
0.00
0
0.00
0.00
0.00
2
3.92
66.67
11.76
1
1.96
33.33
7.69
3
5.88
 
 
合計
4
7.84
6
11.76
11
21.57
17
33.33
13
25.49
51
100.00
欠損値の度数 = 5
度数
パーセント
行のパーセント
列のパーセント
表 2 : job_chng * ed_level
層別変数 :  sex=2
job_chng ed_level
1 2 3 4 5 合計
0
4
0.84
0.99
80.00
14
2.95
3.47
82.35
148
31.16
36.72
85.06
163
34.32
40.45
83.16
74
15.58
18.36
89.16
403
84.84
 
 
1
1
0.21
1.39
20.00
3
0.63
4.17
17.65
26
5.47
36.11
14.94
33
6.95
45.83
16.84
9
1.89
12.50
10.84
72
15.16
 
 
合計
5
1.05
17
3.58
174
36.63
196
41.26
83
17.47
475
100.00
欠損値の度数 = 107

3次元の度数分布表を作成するためには、TABLESステートメントで3つの変数を*でつなげます。多次元の度数分布表では変数の順序が重要で、TABLESステートメントの最後から2番目と最後の変数が2次元の度数分布表の行と列となります。それより前の変数は、2次元の度数分布表を層別します。したがって、この場合はsex=1のときとsex=2のときで2つのj「ob_chng」と「ed_level」の2次元の度数分表が作成されます。
プログラムを開いて実行し、出力をから3次元の度数分布表が説明通りに作成されたことを確認してください。sex=1のときとsex=2のときの2つの「job_chng」と「ed_level」の2次元の度数分布表が作成されているはずです。
おそらく言うまでもありませんが、一般的に多次元の度数分布表は大量の出力を生成します。

セルの統計量#

既に見たように、2次元の度数分布表を作成する際、デフォルトではセル度数、(結合)セル割合、条件付き行割合、条件付き列割合がセルに表示されます。いつものように、デフォルトの設定で実行する必要はありません。デフォルトで表示される統計量の一部を出力しないようにしたり、他の統計量を出力することができます。

多変量の度数分布表の場合、次のTABLEステートメントのオプションを使うことで、デフォルトのセルの出力を抑制できます。

  • NOFREQ: セル度数の表示を抑制

  • NOROW: 行割合の表示を抑制

  • NOCOL: 列割合の表示を抑制

  • NOPERCENT: (結合)セル割合の表示を抑制

#

次のプログラムはNOROW、NOCOL、NOPERCENTテーブルオプションの使用例です。

title 'Crosstabulation of SEX and RACE: No percents';
proc freq data=phc6089.back;   
  tables race*sex / norow nocol nopercent;
run;
SAS 出力

Crosstabulation of SEX and RACE: No percents

FREQ プロシジャ

度数
表 : race * sex
race sex
1 2 合計
1
0
2
2
2
3
4
7
3
1
28
29
4
51
542
593
5
0
3
3
6
0
2
2
7
1
0
1
8
0
1
1
合計
56
582
638

プログラムを開いて実行し、出力を確認すると、行割合、列割合、セル割合が表示されなくなっていることがわかります。また、表の左上のガイドを変更され、各セルに表示される値がセル度数のみであることを示していることにも注目してください。

出力を抑制する代わりに、次のオプションを使って各セルに追加の出力を要求することもできます。

  • EXPECTED: 独立の帰無仮説の下での期待セル度数を表示

  • DEVIATION: セル度数と期待セル度数(独立の帰無仮説の下)の偏差を表示

  • CELLCHI2: 合計カイ2乗統計量に対するセルの寄与度を表示

つまり、CELLCHI2は(度数 - 期待値)^2 / 期待値で定義されます。

#

「race と「sex」の2次元の度数分布表を作成する際に、次のFREQプロシージャは統計量EXPECTEDとCELLCHI2を出力し、同時に(結合)、行、列の割合の表示を抑制しています。

title 'Crosstabulation of SEX and RACE: With Expecteds';
proc freq data=phc6089.back;  
  tables race*sex / expected cellchi2 norow nocol nopercent;
run;
SAS 出力

Crosstabulation of SEX and RACE: With Expecteds

FREQ プロシジャ

度数
期待
セルのカイ 2 乗
表 : race * sex
race sex
1 2 合計
1
0
0.1755
0.1755
2
1.8245
0.0169
2
 
 
2
3
0.6144
9.2624
4
6.3856
0.8912
7
 
 
3
1
2.5455
0.9383
28
26.455
0.0903
29
 
 
4
51
52.05
0.0212
542
540.95
0.002
593
 
 
5
0
0.2633
0.2633
3
2.7367
0.0253
3
 
 
6
0
0.1755
0.1755
2
1.8245
0.0169
2
 
 
7
1
0.0878
9.4806
0
0.9122
0.9122
1
 
 
8
0
0.0878
0.0878
1
0.9122
0.0084
1
 
 
合計
56
582
638

プログラムを開いて実行し、出力を確認すると、(結合)、行、列の割合の表示が抑制され、代わりに期待セル度数とセルのカイ2乗統計量への寄与度が各セルに追加されていることがわかります。また表の左上のガイドが変更され、各セルの2番目の値が期待セル度数、3番目の値がセルのカイ2乗統計量への寄与度であることを示していることにも注目してください。

表の形式変更#

3変数以上を指定すると、多次元の度数分布表のレベルの組み合わせが多くなり、出力が肥大化する可能性があります。そのような多量で複雑な度数分布表は、リスト形式で表示した方が読みやすくなります。度数分布表をデフォルトの表形式ではなくリスト形式で生成するには、TABLEステートメントのオプションLISTを指定します。

#

次のFREQプロシージャではLISTオプションを使用しています。

title 'Crosstabulation of SEX and RACE: In List Format';
proc freq data=phc6089.back;  
  tables sex*race/list;
run;
SAS 出力

Crosstabulation of SEX and RACE: In List Format

FREQ プロシジャ

sex race 度数 パーセント 累積
度数
累積
パーセント
1 2 3 0.47 3 0.47
1 3 1 0.16 4 0.63
1 4 51 7.99 55 8.62
1 7 1 0.16 56 8.78
2 1 2 0.31 58 9.09
2 2 4 0.63 62 9.72
2 3 28 4.39 90 14.11
2 4 542 84.95 632 99.06
2 5 3 0.47 635 99.53
2 6 2 0.31 637 99.84
2 8 1 0.16 638 100.00

プログラムを開いて実行し、出力を確認すると、2次元の度数分布表を作成する代わりに、要求された2変量の度数分布表をリスト形式で出力していることがわかります。行割合と列割合が不要な場合は、このリスト形式がいいでしょう(リスト形式ではこれらの割合は報告されません)。
補足として、LISTオプションは、TABLESステートメントで統計的検定や関連性の尺度を出力に含めるよう指定した場合は使用できません(これらの検定や尺度については後で説明します)。また、EXPECTEDオプションを指定しても、LISTオプションが指定されている場合は期待セル度数は出力されません。
LISTオプションの代替手段としてCROSSLISTテーブルオプションがあります。TABLESステートメントにCROSSLISTオプションを追加すると、標準のOutput Delivery System(ODS)列形式で度数分布表を出力します。この利点はODSについて学ぶまでよくわからないかもしれません。このオプションは、TEMPLATEプロシージャを使ってカスタマイズできる表を作成します。まずは、CROSSLISTオプションを使った例で出力の見た目を確認してみましょう。

#

次のFREQプロシージャではCROSSLISTオプションを使用しています。

title 'Crosstabulation of SEX and RACE: In Crosslist Format';
proc freq data=phc6089.back;   
  tables sex*race/crosslist;
run;
SAS 出力

Crosstabulation of SEX and RACE: In Crosslist Format

FREQ プロシジャ

表 : sex * race
sex race 度数 パーセント
パーセント

パーセント
1 1 0 0.00 0.00 0.00
  2 3 0.47 5.36 42.86
  3 1 0.16 1.79 3.45
  4 51 7.99 91.07 8.60
  5 0 0.00 0.00 0.00
  6 0 0.00 0.00 0.00
  7 1 0.16 1.79 100.00
  8 0 0.00 0.00 0.00
  合計 56 8.78 100.00  
2 1 2 0.31 0.34 100.00
  2 4 0.63 0.69 57.14
  3 28 4.39 4.81 96.55
  4 542 84.95 93.13 91.40
  5 3 0.47 0.52 100.00
  6 2 0.31 0.34 100.00
  7 0 0.00 0.00 0.00
  8 1 0.16 0.17 100.00
  合計 582 91.22 100.00  
合計 1 2 0.31   100.00
  2 7 1.10   100.00
  3 29 4.55   100.00
  4 593 92.95   100.00
  5 3 0.47   100.00
  6 2 0.31   100.00
  7 1 0.16   100.00
  8 1 0.16   100.00
  合計 638 100.00    

プログラムを開いて実行し、出力からCROSSLISTオプションを使った出力を確認してみてください。

出力データセットの作成#

UNIVARIATEプロシージャ、MEANSプロシージャ、SUMMARYプロシージャを使って数値変数の要約統計量を含む新しいデータセットを作成できるのと同様に、FREQプロシージャを使ってカテゴリ変数の集計統計量を含む新しいデータセットを作成することができます。これはデータの操作と後の分析において非常に有用なツールです。

#

次のFREQプロシージャは、変数「sex」と「race」の組み合わせごとの度数と割合を含む一時データセットsexfreqを作成します。

proc freq data=phc6089.back;
   tables sex*race / out = sexfreq noprint;
run;

title 'Output Dataset: SEXFREQ'; 
proc print data = sexfreq;  
run;
SAS 出力

Output Dataset: SEXFREQ

OBS sex race COUNT PERCENT
1 1 2 3 0.4702
2 1 3 1 0.1567
3 1 4 51 7.9937
4 1 7 1 0.1567
5 2 1 2 0.3135
6 2 2 4 0.6270
7 2 3 28 4.3887
8 2 4 542 84.9530
9 2 5 3 0.4702
10 2 6 2 0.3135
11 2 8 1 0.1567

NOPRINTオプションは、sex*raceの2次元の度数分布表の出力を抑制するよう指示します。代わりに、結果がOUT=テーブルオプションで指定された一時データセットsexfreqに出力されます。OUT=オプションのデータセットが現在のデータセットになります。したがって、PRINTプロシージャにデータセット名を指定するDATA=オプションがないため、現在のデータセット、つまりsexfreqを出力します。
ログラムを実行し、出力を確認すると、データセットsexfreqには、データセットに含まれる「sex」と「race」の組み合わせごとに1レコードずつが含まれていることがわかります。また、このデータセットには4つの変数「sex」、「race」と、該当の性別・人種の被験者の数および割合「COUNT」、「PERCENT」が含まれています。

#

TABLEステートメントのオプションSPARSEは、水準の組み合わせが存在しないときでも、すべての可能な組み合わせの水準についての情報を出力します。このオプションは、LISTオプションの出力と出力データセットにのみ影響します。次のコードは、SPARSEオプションを使って出力データセットsexfreqを作成します。

proc freq data=phc6089.back;
  tables sex*race / out = sexfreq noprint sparse;
run;

title 'Output Dataset: SEXFREQ with SPARSE option'; 
proc print data = sexfreq;  
run;
SAS 出力

Output Dataset: SEXFREQ with SPARSE option

OBS sex race COUNT PERCENT
1 1 1 0 0.0000
2 1 2 3 0.4702
3 1 3 1 0.1567
4 1 4 51 7.9937
5 1 5 0 0.0000
6 1 6 0 0.0000
7 1 7 1 0.1567
8 1 8 0 0.0000
9 2 1 2 0.3135
10 2 2 4 0.6270
11 2 3 28 4.3887
12 2 4 542 84.9530
13 2 5 3 0.4702
14 2 6 2 0.3135
15 2 7 0 0.0000
16 2 8 1 0.1567

前のコードとの唯一の違いは、SPARSEオプションが含まれている点です。このプログラムを開いて実行し、出力を確認すると、データセットsexfreqには、組み合わせがデータセット内に存在するかどうかに関係なく、「sex」と「race」のすべての可能な組み合わせごとに1レコードずつ含まれていることがわかります。つまり、2つの性別と8つの人種があるため、データセットsexfreqには16レコード(すべての組み合わせ)が含まれています。例えば、sex=1かつrace=1のレコードでは、その組み合わせの被験者はデータセット内に存在しないため(COUNT=0)となっています。

演習#

この演習では、自転車レーンのデータ(Bike_Lanes.csv)を使用します。(データについてはREADME参照)

  1. Baltimoreにはいくつの自転車レーンがありますか?各観測値/行が異なる自転車レーンであると想定できます。

  2. Baltimoreにある自転車レーンの総延長距離は(a)フィート数と(b)マイル数でいくらですか?(変数「length」が延長距離で単位はフィート、1マイルは5280フィート)

  3. 自転車レーンの種類(type)は何種類ありますか?最も多い種類と(b)平均レーン長が最も長い種類はどれですか?

  4. 自転車レーンはいくつのプロジェクト(project)に分かれていますか?最も平均レーン長が長いプロジェクトカテゴリはどれですか?

  5. 設置された年ごとの自転車レーンの平均延長距離はどのくらいですか?(「dateInstalled」が0の場合は先に値を.としてください)

  6. 自転車レーンの長さ(length)の分布を(a)統計量、(b)グラフにより表してください。

  7. 自転車レーンの長さの分布を(a)type、(b)numLanesごとに層別化して、統計量とグラフに表してください。