3-4. 度数分布と分割表

度数分布を求める、またはクロス表(分割表)の分析を実行するにはFREQプロシジャを用います。

PROC FREQ

度数分布表またはクロス表を作成します。クロス表の χ2 統計量やFisherの直接確率も算出します。FREQプロシジャの基本的な書式は次のとおりです。

proc freq data=データセット オプション ;
  tables 変数 [*変数] / オプション ;
run;

tablesの後に変数をひとつだけ指定した場合はその変数の度数分布表を作成します。更にその後に *変数 を指定するとそれらの変数の組み合わせによる分割表を作成します。

TABLESステートメントのオプション

PROC FREQステートメントのオプションはそれほど必要になることはありません。TABLESステートメントには統計量の計算や結果表示等をコントロールする非常に多くのオプションがあります。しかし統計量はその内容を理解した上で、データの性質と分析の目的に応じて使用する必要がありますので、ここでは最も基本的なオプションだけを紹介します。

[統計量に関するもの]
chisq分割表に対する χ2 統計量を計算します。
relrisk相対危険度(relative risk)とオッズ比(odds ratio)を計算します。
agree一致性に関する統計量(κ係数、McNemar検定の結果など)を計算します。
missing欠損値を一つの有効なレベルとして用い、分割表に表示し、各種統計量の計算にも用いるようにします。
[結果の表示に関するもの]
expectedセルの期待度数を表示します。
deviationセルの期待度数からの偏差を表示します。
missprint欠損値の度数を表示します。
alpha=α信頼区間を表示する場合の信頼度(confidence level)を指定します(0<α<1)。省略すると0.05が用いられます。
noprint分割表を表示しません(統計量は表示します)。
nofreqセルの度数を表示しません。
nopercent全セルに対する百分率を表示しません。
nocol列に対する百分率を表示しません。
norow行に対する百分率を表示しません。

EXACTステートメント

FREQプロシジャではEXACTステートメントを用いて各統計量の正確確率(Exact Probability)に基づく有意確率を計算することができます。正確確率に基づく正確検定の考え方については「初級編」のノンパラメトリック検定の章で解説します。

exact 統計量オプション [/ 計算オプション] ;

EXACTステートメントのオプション

EXACTステートメントには主に次のようなオプションがあります。

[統計量オプション]
chisqχ2 統計量の正確確率を計算します。
fisherFisherの直接確率を計算します。2×2表ではデフォルトで出力されます。
or正確確率に基づく2×2表のオッズ比の信頼区間を計算します。デフォルトでは95%信頼区間が表示されますが、TABLESステートメントでalpha=αとしてオプションを指定すると100×(1-α)%信頼区間を表示します。
[計算オプション]
maxtime=t計算時間の上限をt秒に設定します。

N数および分割表のセル数が多くなると正確確率の計算時間は爆発的に増加します。一昔前と比べればPCの性能が桁違いによくなっていることに加え、計算アルゴリズムの改良もあって、相当大規模なデータでない限りは計算が終了しなくなることはなくなってきていますが、念のためmaxtime=オプションを指定して、一定時間経過しても計算が終了しない場合には強制的にプロシジャが終了するようにしてください。

計算に時間がかかりすぎて正確確率が得られないというのは、多くの場合、各セルの期待度数が十分大きく、通常は各統計量とも漸近近似によるp値が有効ですので、正確確率を用いる必要はありません。


データセットds22(Sample 2-2 を用いて作成済)を用いてクロス表の分析を実行してみます。次のプログラムを入力して実行してください(コメント部分は入力しなくても構いません)。Sample 3-4はtutrialフォルダにsample3-4.sasとして保存しておきます。

【Sample 3-4】

/* Sample 3-4 */

/* 成績の度数分布 */

title1 'Sample 3-4 度数分布の表示';

title2 '成績';
proc freq data=ds22;
  tables grade / chisq;
run;

/* 性別と成績のクロス表 */

title1 'Sample 3-4 クロス表の分析';

title2 '性別と成績 χ二乗統計量';
proc freq data=ds22;
  tables sex*grade / chisq;
run;

title2 '性別と成績 χ二乗統計量の正確確率とFisherの直接確率';
proc freq data=ds22;
  tables sex*grade;
  exact chisq fisher / maxtime=300;
run;

結果出力はこのようになります。


はじめに変数gradeについて、1変量の度数分布を表示させています。gradeの各水準、A、B、Cの度数、パーセント、累積度数、累積パーセントの表に続いて、帰無仮説 H0:すべての水準の母比率が等しい、とした χ2検定の結果が表示されています。この場合、帰無仮説 H0πA=πB=πC=1/3 は、p=0.4771 で棄却されない、すなわち「成績A、B、Cの母比率が等しくないとはいえない」ということになります。

次に、性別と成績の関係についてクロス表(分割表)の分析を行っています。まずクロス表が表示され、クロス表の各セルには上から順に度数、(総合計に対する)パーセント、行の(合計に対する)パーセント、列の(合計に対する)パーセント、が示されています。TABLESステートメントにchisqオプションを付けたため、続いて χ2統計量に関連する統計量が表示されています。「カイ2乗値」がいわゆる「ピアソンの χ2統計量」の値です。ここでは「カイ2乗値」または「尤度比カイ2乗値」を参照して、「性別と成績の間に関連があるとはいえない」ということになります。もう少し正確な言い方をすると、「一方の変数の水準によって、もう一方の変数の水準の母比率が異なるとはいえない」ということです。

最後に、上の性別と成績との関係についての分析と同じですが、EXACTステートメントを用いて正確確率を求めています。正確確率で求めたp値は、ピアソンの χ2検定、尤度比 χ2検定、Fisherの正確検定(直接確率)、いずれにおいても 0.6172 であり、結論は変わりませんが、漸近近似のp値よりも大きくなっていることが分かります。


集計されたデータの分析

すでにクロス表の形に集計されたデータを用いて分析を行いたい場合があります。すなわち、

sexgrade
ABC合計
169520
27111230
合計13201750

のようなクロス表がデータとして与えられて、これを元にχ2検定を行いたい、というような場合です。このような時は次のようなプログラムを書くことで分析を実行できます。

【Sample 3-5】

/* Sample 3-5 */

/* 性別と成績のクロス表 ― 集計データを元にした分析 */

* 分析用データセットを作成する ;
data tabledata;
  input sex grade $ w;
datalines;
1 A  6
1 B  9
1 C  5
2 A  7
2 B 11
2 C 12
;
run;

* 上で作成した分析用データセットを用いて分析を実行する ;
title1 'Sample 3-5 クロス表の分析';
title2 '性別と成績 χ二乗統計量';
proc freq data=tabledata;
  tables sex*grade / chisq;
  weight w;
run;

結果はこのように、Sample 3-4 の2つ目のFREQプロシジャによる出力と同じになります。

Sample 3-5 ではまず、DATAステップで分析用のデーセットを作成しています。tabledataデータセットは変数sexと変数gradeの値の組み合わせで6件のオブザベーションから成ります。各オブザベーションはsexとgradeの値の組み合わせが何件ずつあるかという情報、すなわちクロス表のセルの値、を変数wに持たせています。そして分析を実行するFREQプロシジャでWEIGHTステートメントを用いています。WEIGHTステートメントは文字どおり、ここで指定した変数の値で各オブザベーションを重み付けします。例えば最初のオブザベーションは w=6 なので sex=1 grade='A' のオブザベーションが6件あるものとして分析に用います。残りのオブザベーションも同様にして、結局、計50件のオブザベーションがあるものとして分析が実行されます。