データの要約#
このセクションでは、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;
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 |
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
SGPLOTプロシージャには、以下のような一般的な形式があります。
proc sgplot data = データセット;
plot_keyword 変数 / プロットオプション;
run;
ここで「PLOT_KEYWORD」はプロットの種類のためのステートメント、「変数」はデータセットからプロットに含まれる変数、「プロットオプション」はプロットを修正するためのオプション引数です。
ボックスプロットを作成するには、横向きのプロットならキーワードにHBOX、または縦向きならVBOXを使用します。
proc sgplot data = phc6089.hem2;
vbox wbc;
run;
散布図を作成するには、キーワードSCATTERを使用します。散布図には2つの変数が必要なので、単一の変数ではなく X= と Y= を指定する必要があります。
proc sgplot data = phc6089.hem2;
scatter x=rbc y=wbc;
run;
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;
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 |
最初のデータステップでは、「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;
ボックスプロットを使うと、データのばらつきも確認できます。これは、平均値の違いは統計的に有意ではない可能性が高いことを示しています。
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;
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 Mises と Anderson-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;
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 |
プログラムを開いて実行し、 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;
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;
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;
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;
FREQ プロシジャ
sex | 度数 | パーセント | 累積 度数 |
累積 パーセント |
---|---|---|---|---|
1 | 56 | 8.78 | 56 | 8.78 |
2 | 582 | 91.22 | 638 | 100.00 |
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;
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 |
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;
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;
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;
FREQ プロシジャ
|
|
これまでに見ているように、教育水準と性別の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;
FREQ プロシジャ
|
|
|
|
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;
FREQ プロシジャ
|
|
プログラムを開いて実行し、出力を確認すると、行割合、列割合、セル割合が表示されなくなっていることがわかります。また、表の左上のガイドを変更され、各セルに表示される値がセル度数のみであることを示していることにも注目してください。
出力を抑制する代わりに、次のオプションを使って各セルに追加の出力を要求することもできます。
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;
FREQ プロシジャ
|
|
プログラムを開いて実行し、出力を確認すると、(結合)、行、列の割合の表示が抑制され、代わりに期待セル度数とセルのカイ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;
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;
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;
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;
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参照)
Baltimoreにはいくつの自転車レーンがありますか?各観測値/行が異なる自転車レーンであると想定できます。
Baltimoreにある自転車レーンの総延長距離は(a)フィート数と(b)マイル数でいくらですか?(変数「length」が延長距離で単位はフィート、1マイルは5280フィート)
自転車レーンの種類(type)は何種類ありますか?最も多い種類と(b)平均レーン長が最も長い種類はどれですか?
自転車レーンはいくつのプロジェクト(project)に分かれていますか?最も平均レーン長が長いプロジェクトカテゴリはどれですか?
設置された年ごとの自転車レーンの平均延長距離はどのくらいですか?(「dateInstalled」が0の場合は先に値を.としてください)
自転車レーンの長さ(length)の分布を(a)統計量、(b)グラフにより表してください。
自転車レーンの長さの分布を(a)type、(b)numLanesごとに層別化して、統計量とグラフに表してください。