準備

入門編では、予め用意したデータをSASに読み込んでSASデータセットを作成し、そのデータセットを用いて分析するという、SASの利用に関する最も基本的な手順を学びました。更に場合によっては読み込んだ変数をSASの中で変更する必要が生じます。また男女別、年齢別といった層別分析を行うことも必要になります。初級編ではSASでのデータハンドリングの基本と、層別分析の方法について学び、統計分析として回帰分析と分散分析、ノンパラメトリック検定の基本について学びます。


入門編の復習を兼ねて初級編で用いるデータセットを準備します。data4-1.xlsxに入力してあるデータをSASに読み込んで、SASデータセットを作成してください。変数名はワークシートの2行目に入力されている変数名を用います。データセット名はds41としてください。作成したプログラムはtutorialフォルダにsample4-1.sasとして保存してください。

data4-1.xlsxの各項目の内容は次のとおりです。

data4-1.xlsの内容

番号対象者の通し番号
性別M:男性
F:女性
年齢対象者の年齢
身長対象者の身長(cm)
体重対象者の体重(kg)
喫煙0:喫煙しない
1:喫煙する
2:禁煙した
喫煙本数1日あたり喫煙本数(非喫煙者=0)
飲酒0:飲酒しない
1:飲酒する
運動習慣0:運動習慣なし
1:運動習慣あり
収縮期血圧対象者の収縮期血圧(mmHg)
拡張期血圧対象者の拡張期血圧(mmHg)
総コレステロール対象者の総コレステロール(㎎/㎗)
空腹時血糖対象者の空腹時血糖(㎎/㎗)

(以下、解答になりますが、解答を見る前に必ず自分でプログラムを書いてみてください)


【Sample 4-1】

/* Sample 4-1 */

data ds41;
  infile '%userprofile%\documents\SASチュートリアル\data4-1.csv'
         dlm=',' firstobs=3;
  input NO SEX $ AGE TABACO TABACO_N
        SAKE UNDO HEIGHT WEIGHT SBP DBP TC FBS;
run;

まず、データの準備をします。エクセルでdata4-1.xlsを開き、新たにCSV形式で保存します。このファイル名をdata4-1.csvとし、SASチュートリアルフォルダに保存します。

データの準備ができたらSASのプログラムを書きます。まず、DATAステートメントで、これから作成するデータセットの名前を指定します。次にINFILEステートメントでデータファイルの場所と、それがCSVファイルで、実際のデータ行は3行目からであることを指定します。そしてINPUTステートメントで読み込む変数の名前を指定します。この時、data4-1.xlsには既に変数名が入力されていますから、そこからコピー&ペーストすれば楽ですし、ミスも起こしにくくなります。文字変数として読み込むSEXの後ろには $ を書くのを忘れないようにします(エクセルファイルで変数名を入力する段階で、文字変数名の後ろには $ を付けるように習慣付けるとよいでしょう)。最後にRUNステートメントでDATAステップを閉じます。


さて、作成したsample4-1をサブミットして、うまくds41データセットは出来たでしょうか?

実はdata4-1.xlsは上記のようにしても、正しくデータセットが出来ないようになっています。

ログを見てみましょう(図4-1)。まず、データファイルdata4-1.csvから449行を読み込んだ、と書かれています。実際、data-4-1.csv、あるいは元のエクセルファイルdata4-1.xlsを見ると、見出し行を除いてデータ行は449行あることが確認できます。つまりデータファイルには449件のデータがあって、SASは確かにその449件分のデータを読み込んでいます。しかし、作成されたds41の情報では448件のオブザベーションしかデータセットに含まれていません。これはどういうことでしょうか?

図4-1. Sample 4-1を実行した時のログ
図4-1. Sample 4-1を実行した時のログ

さらにログを見てみると「INPUTステートメントが行の終端に達したので、次の行を読み込みます。」というメッセージが出ています。このメッセージに見覚えはないでしょうか? そうです、「1-6. SASのログ」で、Errorは出ていないけれどDATAステップが正しく実行されていない場合の例で出てきたメッセージです。本チュートリアルで行っているように1ケースを1行でデータファイルを作成している場合は、このメッセージは出ないはずのものです。

では、何が起こっているのでしょうか。「1-6. SASのログ」の例ではINPUTステートメントで指定した変数の数と、実際にデータファイルの1行に含まれるデータの個数が合わないため、1ケースを読み込むのにデータファイルの2行を使ってしまい、結果として作成されたデータセットのケース数が元の半分になってしまっていたのでした。今回はデータセットのケース数は元の半分にはなっておらず、1件だけ少なくなってしまっています。ということは、どこか1件だけが2行のデータを使ってしまっていることが考えられます。具体的には、データファイルのどこか1行だけがINPUTステートメントで指定した変数の数よりもデータが少なくなってしまっており、足りないデータを次の行から読み込んでしまい、結果として1件分のデータを読むのに2行のデータ行を使ってしまった、ということです。


エクセルファイルの元データに戻って確認してみます。データが足りていないのですから、データが入力されていないセルがあるはずです。data4-1.xlsを開いて、データ入力範囲の空白セルを検索してみます。データ入力範囲を選択して(ちなみにご存知ない方のために、A3セルを選択した後、[Ctrl]+[Shift]+[→],[Ctrl]+[Shift]+[↓]としてみてください)「検索と置換」ダイアログを表示します(図4-2)。空のセルを探したいので、「検索する文字列(N)」には何も入力せず、「セル内容が完全に同一であるものを検索する(O)」にチェックを入れます。

図4-2. Excelの「検索と置換」ダイアログボックス
図4-2. Excelの「検索と置換」ダイアログボックス

この条件で検索するとデータ範囲のうち、I225のセルが空白になっているのが見つかったはずです。NO=223のケースの体重のデータが、これは本来は欠損値なのですが、欠損値を示す "."(半角のドット)が入力されていなかったのです。


I225のセルに "."(半角のドット)を入力して上書き、さらにCSVに書き出しをして、再度Sample 4-1をサブミットしてください。今度は449件、13変数のデータセットが正しく作成されたでしょうか。

※ データのバリデーションについて
通常、データの入力・読み込みができたら、まずはデータのバリデーションを行います。入力データに誤りがないか、入力ミスがないか、データの読み込みは正しく行われているか、といったことをチェックします。最初にこれをしっかりとやっておかないと、分析を進めた段階で実はデータに誤りがあったことが判ると、それまでの分析をすべてやり直すことになりかねません。
最も基本的なチェックはレンジチェックです。MEANSプロシジャを使って数値変数の最小値と最大値を出力し、各変数の値が正常な範囲に収まっているかを確認します。また、特定の値しかとらないような変数、例えば「あり・なし」を表す2値変数や5件法で尋ねた質問紙調査の項目に対する回答などは、FREQプロシジャを使って正常な値のみが列挙されることを確認します。他にもデータの性質に応じて実施するチェックがありますが、最低限これら2つのチェックは行うべきでしょう。