デバッグ、データ転送、ファイルからの読み込み

統計解析 01 クラス : 第4回(05/08/03)

前回は SAS を使うための操作方法やコマンドを中心に説明を行った。 今回は、SAS のプログラムについて構成を解説すると共に、 データをファイルから読み込んで実行するプログラムを、 修正方法を含めて紹介する。
  1. プログラムの構成とその出力結果 : 先週 の演習内容
    1. プログラムの呼び出し :
      Program Editorエリアのコマンド行で : [入力] inc 'les0301.sas'

    2. プログラム : Program Editorエリア : les0301.sas
      • はじめてのプログラム : 右側は説明用。プログラムは左側のみ。
      • 3つのパート : コメント部、データの定義(data部)、緒処理の実行(proc部)
      • コメントは後々のために入れる習慣を付けよう
      • ブランクは無視されるが見易さのために入れよう(段下げ)
      • 各行は(基本的に)セミコロンで終わる
      • (基本的には) proc コマンド(procedure)ごとに出力が得られる

      • [注意] データ名や変量名は8文字以内で (判りやすい)名前を付けること。以下の例で言えば、データ名は「kenshin」であり、 変量名は「name, height, weight」のことである。
       /* Lesson 3-1 */                             : コメント、実行には無関係
       /*    File Name = les0301.sas  05/01/03   */ : 後々の記録のためのメモ
                                                    : 見易さのための空行
      data kenshin;                                 : データ名の定義
        input name $ height weight;                 : 読み込む変量名、型($は文字型を示す)
      cards;                                        : データの始まりを示す
        Takahashi   156  44                         : Case 1
        Nishino     165  58                         :      2
        Yamada      157  43                         :      3
        Murohashi   159  44                         :      4
        Yamasaki    162  44                         :      5
        Tada        159  59                         :      6
      ;                                             : データの終りを示す
      proc print data=kenshin;                      : 読み込んだデータの表示
      run;                                          : 上記の実行
      proc means data=kenshin;                      : 平均値等の算出
      run;                                          : 上記の実行
      

    3. 出力、計算結果 : Outputエリア : les0301.lst : 先週の配布資料参照
      1. 読み込んだデータの表示 : proc print
        • 縦方向にケース、横方向に変量
        • 左端にケース番号(Observation)
        • 入力が期待通りかを確認 : 数値のずれ、異常値、...
      2. 平均値等の算出 : proc means
        • 各変量ごとのサンプル数、平均、標準偏差、最小値、最大値
        • 小サンプル時の注意
      3. 有効桁数に注意せよ : どこまでが「意味ある桁」か?
        [蛇足的例1] 日本の観測史上の 最高気温は、1933(昭和8)年7月25日に山形市で観測された40.8度であり、 最低気温は、1902(明治35)年1月25日に北海道旭川市の-41度であった。
        [蛇足的例2] 2001年のイチロー選手の打率は3割5分であった。
    4. デバッグ : 実行時にエラーが出なければ良いのだが...
      • Outputエリアに期待した結果が表示されているのなら正常だろう
      • エラーがあれば Logエリア(les0301.log)に表示される
      • 綴りミスはある程度修正されるが、致命的なミスの時は実行が中断される
        1. 画面が三種類ある : Program Editor, Log, Output
          必要に応じて各エリアを行き来する。コマンド行で。
          1. Program Editorエリアへ : PGM : プログラムの作成
          2. Logエリアへ : LOG : 実行過程の記録(ログ)
          3. Outputエリアへ : OUTput : 計算結果、出力
        2. プログラムのエラー個所を Logエリアで確認
        3. Program Editorエリアに移って該当個所を修正
        4. 再実行しエラーがなくなるまで修正を繰り返す
      • エラーの例 : Logエリアに実行結果が表示される
        1. セミコロン忘れ
        2. コメントの終了ミス : /* ... */
        3. つづりミス : plint, ran, ...
        4. 変量名の順や個数、タイプ($ マークの位置)
        5. データファイルの内容が記述(or 予想)と異なる : 出力で確認
        6. マウスを使ったことによるノイズの混入
        7. ...

  2. データをファイルから読み込んで使うには...
    1. データを電子化する : Excel 等で ===> 第3節
    2. ファイルを stat システムに転送する : FFFTP 等で ===> 第4節
    3. 転送が期待通り行なわれたかを確認する ===> 第5節
    4. データをファイルから読み込むように SAS プログラムを記述する ===> 第6節
    5. SAS プログラムを改良する ===> 第7節、第8節

  3. データの電子化
    取り扱うデータが長方形(表形式)をしているので、表計算ソフトと呼ばれるアプリケーションを利用するのが便利である。 ここでは、Microsoft Excel を例に実際に電子化の手順を説明する。 なお、Excel のより詳しい使い方については、 「PC・ネットワーク利用ガイド」や市販の書籍を参考にしてほしい。
    1. Excel の起動
      「スタート」→「プログラム(P)」→「Microsoft Office」→「Microsoft Excel」とクリックする。
    2. データの入力
      表示された枠に「表形式」と呼ばれる並び(縦:ケース、横:変量) で順にデータをキー入力していく。なお、実習では半角英数字のみを取り扱うことにする。
    3. カーソルの移動には、「Tab」キーが便利である(右方向へ移動)。 縦方向の移動には「Enter」キー。矢印キーやマウスで移動させることもできるが、 次変量の入力のための移動にこれらのキーを使うと入力スピードが遅くなるので得策ではない。
    4. データの電子化のためには、コード化も必要になることがある。
      • 「男/女」を「M/F」等と置き換える。
      • 「自宅生/下宿生」を「J/G」等と置き換える。
      • 欠測値(欠損値、不明)データには「.(ピりオド)」を入力。 : データ採取は難しい!!

    5. [演習(4月24日分)] : データの電子化 : 小泉内閣の資産公開資料のデータを電子化せよ。
      • 入力時の注意 : 今回の例ではあまり起らないと思うが
        • 各項目内に空白は入れないこと。
        • SAS は空白を区切り記号と判断するため。
      • [補足] SAS 用のデータに漢字が含まれていても構わない。 しかし、日本語入力を行うと作業時間がかかるので、 講義では半角英数字のみを用いる。

      Name Sex Goukei Tochi Yotyokin Kashituke Kariire
      Koizumi M 5012 3052 1960 0 731
      Katayama M 7874 1371 6502 0 2697
      Moriyama F 12606 6907 5699 0 0
      Tanaka F 74940 31739 43201 0 0
      Shiokawa M 56561 54336 2225 7500 0
      Touyama F 24146 10901 13245 0 2200
      Sakaguchi M 2601 451 2150 0 140
      Takebe M 5084 2796 2288 0 549
      Hiranuma M 4723 451 223 0 12682
      Ohogi F 19554 18354 1200 7102 36000
      Kawaguchi F 13550 1490 12060 0 0
      Fukuda M 8089 7272 817 1130 7600
      Murai M 6492 1669 4823 0 260
      Nakatani M 1620 0 1620 0 0
      Omi M 3278 3278 0 1800 1764
      Yanagisawa M 5375 2475 2900 0 2205
      Takenaka M 2808 2651 157 9475 10456
      Ishihara M 5932 2347 3585 0 3230

      入力画面

    6. 項目の右揃え
      SAS は空白(スペース)を区切り文字として、テキストファイルからデータを 読み込むことができる。つまり各項目間には空白を入れておく必要がある。 しかし、氏名や性別、また欠損値を示す「.」 は Excel 内では 「文字型」と判断されてデフォルトでは「左寄せ」で出力されてしまい 左隣の項目(数値)と引っ付いてしまう。 そこでこの現象を回避するために全ての項目を「右揃え」してから 保存するようにしておく。
      表の左上の何も書いていないボタンをクリックすると「表全体」 が選択されて反転表示されるので、この状態で「右揃え」ボタンを押す。
      また、今回の例では発生しないかもしれないが、 項目一つあたりの入力文字数の多い(つまり長い)項目の場合、 隣のセルの項目とくっついて表示されてしまうことがある。 そのような場合は、列の幅を大きくして隙間を空けておく。
    7. データの保存 : テキスト形式で
      Excel の標準形式(*.xls)で保存すると、SAS では利用できないので、 テキスト形式で保存する必要がある。 「ファイル(F)」→「名前を付けて保存(A)」で保存ができる。 ドライブ名やファイル名を指定後、 「ファイルの種類」の項に対して「テキスト(スペース区切り)(*.prn)」を指定する。
      「選択した種類のファイルでは、作業中のシート以外は保存されません」等のメッセーが出る場合があるが、無視してよい。
      [補足] また stat システム(UNIX)では、漢字のファイル名や空白を含むファイル名は 取り扱いが面倒なので、「スペースを含まない英数字で」ファイル名を付けることを 勧める。
    8. Lesson 4-1 : データの保存 : 演習で入力したデータを SAS で使うことを考慮して テキスト形式で保存せよ。
      この後の説明を簡単にするために、ここでは、ドライブ名に「H:」、 ファイル名に「naikaku01」を指定したとして説明を進める (naikaku01.prn)。
    9. Excel の終了

  4. データ転送(送信) : FFFTP を使ったファイルの送受信
    MNC では、漢字コード変換を含むファイルの送受信ツールとして FFFTP が用意されているので、このソフトウェアの使い方を説明する。 なお、これはフリーソフトウェアである。
    1. [背景] 漢字コードについて
      漢字コードには幾つかの体系があって、異なったコード体系間では 変換を行わないと正常には読み出せない。
      Windows マシンで利用される漢字コードは、 「Shift-JISコード」に固定されているため、この様な混乱は少ない。 しかし、stat システムを含む UNIX マシンの場合は、 「EUC コード」や「JIS コード」が使われることが多く、 Windows マシンとデータを共有しようとすると、 漢字コードの変換を頭に入れて、 適宜変換しながら利用する必要がある。
      • Windows マシン : Shift-JIS コード
      • UNIX マシン : EUC コード, JIS コード

      stat システム上の SAS に関して言えば、SAS の出力中の日本語は 「EUC コード」を使って表現されているので、 SAS の「計算結果」を Windows マシンに転送する時には、 「EUC コード」を「Shift-JIS コード」に変換する必要が生じる。
      また同様の理由で、ファイル名に漢字を使うのは避けるべきである。

    2. 操作手順
      1. 転送プログラム(FFFTP)の起動
        「スタート」→「プログラム(P)」→「stat システム」→「FFFTP」とクリックする。
      2. ホスト「stat-system」を選択し「接続」ボタンをクリックする。
      3. stat システム用の「ユーザー名 :」を入力する。
      4. stat システム用の「パスワード :」を入力する。
      5. 画面の左半分は Windows 側を、 右半分は stat システム側のファイルを表示している。
      6. 転送元のドライブ、ファイルを指定する。
      7. 転送モードには 3種類ある。
        • 「A」は ASCII モード(文字型用、行末コード処理機能を利用する)
        • 「B」は Binary モード(非文字型用、行末コード処理機能を利用しない)
        • 「A/B」は ファイルの拡張子によって自動判定
      8. 漢字コードには 2種類ある。
        • 「EUC」は UNIX 側の漢字コードが EUC コード
        • 「JIS」は UNIX 側の漢字コードが JIS コード
        • 「無」は無変換
      9. ファイルを選択すると、左上にある灰色だった矢印キーが 青に変わってクリック可能となる。このキーで送受信を指定する。
        • 送信 : 上向き矢印、アップロード、Windows から stat システムへ
        • 受信 : 下向き矢印、ダウンロード、stat システムから Winodws へ
      10. 終了は「接続(F)」→「終了(X)」をクリックする。

    3. Lesson 4-2 : ファイルの転送: Windows ===> stat システム(UNIX)
      • 転送元 : H:naikaku01.prn
      • 転送先 : 各自の stat システムのディレクトリ(正確にはホームディレクトリと呼ぶ)
      • 転送モードは「ASCII」を選択
      • 漢字コードは「EUC」を選択

  5. 転送されたデータの表示 : 確認のため。簡単な UNIX コマンド
    1. stat システムにログイン
      「スタート」→「プログラム(P)」→「stat システム」→「stat1」とクリックする。 (stat1 と 2, 3 はどれでも対等。混み具合いによって各自の判断で変更してよい)。
    2. 「login:」、「Password:」と表示されるので、 それぞれ個人のIDとパスワードを入力する。 なお、パスワードはセキュリティの都合上、画面には表示されない。
    3. UNIX の初歩のコマンド
      • ファイル名一覧の表示 : ls
      • ファイルの内容の表示 : less [filename]
      • ログアウト : logout
    4. Lesson 4-3 : 転送されたファイルの確認
      転送したファイルが実際に存在し、ファイル内容も正しいことを確認せよ。
      • ls
      • less naikaku01.prn
      • q で less を終了する

  6. データをファイルから読み込む : プログラムとデータの分離
    データが追加されたり、別クラスのデータを解析したくなったら??
    : データをファイルから読み込んで処理しよう
    : 大量データや定型的な処理に有効
    Lesson 4-4 : 前項で作成したデータをファイルから読み込んで変量の平均値を求めてみよう。 なお、ファイル名は各自で命名したものを指定せよ。
    ここでは「naikaku01.prn」という名前で説明する。

    1. 新しいプログラムを作る時にはまず現在のプログラムを消去
      Program Editorエリアのコマンド行で : [入力] clear
    2. プログラム : les0404.sas
       /* Lesson 4-4 */                               :
       /*    File Name = les0404.sas   05/08/03   */  :
                                                      :
      data naikaku;                                   : データ名の定義
        infile 'naikaku01.prn'                        : ファイル名の指定
          firstobs=2;                                 : 数値は 2行目から入っている
        input name $ sex $ goukei;                    : 読み込む変量名
                                                      :
      proc print data=naikaku;                        : データの表示
      run;                                            :
      proc means data=naikaku;                        : 平均、標準偏差、最大最小値の算出
      run;                                            :
      
    3. 出力結果 : les0404.lst : 平均の意味するもの。最大値、最小値との位置関係。
      • 画面の移動には BACKward, FORWard, TOP, BOTtom コマンドを使う。
                                    SAS システム                             1
                                                    22:04 Tuesday, May 6, 2003
      
                          OBS    NAME        SEX    GOUKEI
      
                            1    Koizumi      M       5012
                            2    Katayama     M       7874
                            3    Moriyama     F      12606
                            4    Tanaka       F      74940
                            5    Shiokawa     M      56561
                            6    Touyama      F      24146
                            7    Sakaguch     M       2601
                            8    Takebe       M       5084
                            9    Hiranuma     M       4723
                           10    Ohogi        F      19554
                           11    Kawaguch     F      13550
                           12    Fukuda       M       8089
                           13    Murai        M       6492
                           14    Nakatani     M       1620
                           15    Omi          M       3278
      
                                    SAS システム                             2
                                                    22:04 Tuesday, May 6, 2003
      
                          OBS      NAME      SEX    GOUKEI
      
                           16    Yanagisa     M      5375 
                           17    Takenaka     M      2808 
                           18    Ishihara     M      5932 
      
                                    SAS システム                             3
                                                    22:04 Tuesday, May 6, 2003
             Analysis Variable : GOUKEI
      
              N          Mean       Std Dev       Minimum       Maximum
             ----------------------------------------------------------
             18      14458.06      19845.53       1620.00      74940.00
             ----------------------------------------------------------
      
    4. プログラムの保存 :
      Program Editorエリアのコマンド行でプログラムを recall 後 : [入力] file 'les0404.sas'

  7. プログラムの改良 : 入力済みのものを有効利用 : コピー、挿入、削除、...

    1. 今までのプログラムを活用 : les0405.sas
       /* Lesson 4-5 */                                      
       /*    File Name = les0405.sas   05/08/03   */
                                                             
      data naikaku;                                          
        infile 'naikaku01.prn'
          firstobs=2;
        input name $15. sex $ goukei tochi          : 文字列長の指定方法
              yotyokin kasituke kariire;            : 長い場合は 2行に。最後はセミコロン
                                                 
      proc print data=naikaku;
      run;
      proc means data=naikaku;
        var goukei;
      run;
      
      proc chart data=naikaku;                      : ヒストグラムを描く
        hbar goukei;                                : 水平棒グラフで。変量を指定
        vbar goukei;                                : 垂直棒グラフで。変量を指定
      run;
      
    2. 編集コマンド : 行コマンド (MNCセミナー用テキスト)、 先週の配布資料参照
      • [Ctrl]+[X] : インサートモード
      • i : 行挿入

      • cc : 領域コピー(コピーしたいところを囲む)
      • b : 当該行の前(before)に挿入
      • c : 一行コピー

      • a : 当該行の後ろ(after)に挿入
      • d : 一行削除
      • dd : 領域削除

    3. 出力結果 : les0405.lst : 以下掲載分には一部省略あり
                                    SAS システム                             1
                                                    22:23 Tuesday, May 6, 2003
      
       OBS   NAME        SEX   GOUKEI   TOCHI   YOTYOKIN   KASITUKE   KARIIRE
      
         1   Koizumi      M      5012    3052      1960         0        731 
         2   Katayama     M      7874    1371      6502         0       2697 
         3   Moriyama     F     12606    6907      5699         0          0 
         4   Tanaka       F     74940   31739     43201         0          0 
         5   Shiokawa     M     56561   54336      2225      7500          0 
         6   Touyama      F     24146   10901     13245         0       2200 
         7   Sakaguchi    M      2601     451      2150         0        140 
         8   Takebe       M      5084    2796      2288         0        549 
         9   Hiranuma     M      4723     451       223         0      12682 
        10   Ohogi        F     19554   18354      1200      7102      36000 
        11   Kawaguchi    F     13550    1490     12060         0          0 
        12   Fukuda       M      8089    7272       817      1130       7600 
        13   Murai        M      6492    1669      4823         0        260 
        14   Nakatani     M      1620       0      1620         0          0 
        15   Omi          M      3278    3278         0      1800       1764 
      
                                    SAS システム                             4
                                                    22:23 Tuesday, May 6, 2003
      
        GOUKEI                                        Cum.              Cum.
       Midpoint                                 Freq  Freq  Percent  Percent
                 |
          7500   |****************************    14    14    77.78    77.78
                 |
         22500   |****                             2    16    11.11    88.89
                 |
         37500   |                                 0    16     0.00    88.89
                 |
         52500   |**                               1    17     5.56    94.44
                 |
         67500   |**                               1    18     5.56   100.00
                 |
                 ----+---+---+---+---+---+---+
                     2   4   6   8   10  12  14
                           Frequency
      
                                    SAS システム                             5
                                                    22:23 Tuesday, May 6, 2003
      Frequency
      
         |       *****                                                        
      12 +       *****                                                        
         |       *****                                                        
       8 +       *****                                                        
         |       *****                                                        
       4 +       *****                                                        
         |       *****       *****                   *****       *****        
         --------------------------------------------------------------------
                  7500       22500       37500       52500       67500
                                    GOUKEI Midpoint
      
    4. 出力からの知見 :
      • 入力した全変量が正しく読み込まれているか?
      • 氏名は切れずに読み込まれているか?
      • ヒストグラム(度数分布)からデータの分布状況を判断する
      • 平均値はヒストグラムのどこに位置するか?
      • 累積頻度や累積割合が表示されるのは横棒グラフだけ
      • ...

    5. プログラムの保存 :
      Program Editorエリアのコマンド行でプログラムを recall 後 : [入力] file 'les0405.sas'

  8. 再度改良

    1. 今までのプログラムに追加 : les0406.sas
       /* Lesson 4-6 */                                      
       /*    File Name = les0406.sas   05/08/03   */         
                                                             
      data naikaku;                                          
        infile 'naikaku01.prn'
          firstobs=2;
        input name $15. sex $ goukei tochi
              yotyokin kasituke kariire;
      
      proc print data=naikaku(obs=5);              : 先頭の 5ケースだけを表示。確認用
      run;
      proc means data=naikaku;
        var goukei;
      run;
      
      proc chart data=naikaku;
        hbar goukei;
        vbar goukei;
      run;
      
      proc chart data=naikaku;
        hbar goukei / midpoints=10000 to 80000 by 10000;   : 軸の値を指定
        vbar goukei / midpoints=10000 to 80000 by 20000;   : 軸の値を指定
      run;
      
    2. 編集コマンドを駆使せよ

    3. 出力結果 : les0406.lst : 以下掲載分には一部省略あり
                                    SAS システム                             1
                                                    22:23 Tuesday, May 6, 2003
      
       OBS     NAME     SEX   GOUKEI   TOCHI   YOTYOKIN   KASITUKE   KARIIRE
      
         1   Koizumi     M      5012    3052      1960         0        731 
         2   Katayama    M      7874    1371      6502         0       2697 
         3   Moriyama    F     12606    6907      5699         0          0 
         4   Tanaka      F     74940   31739     43201         0          0 
         5   Shiokawa    M     56561   54336      2225      7500          0 
      
                                    SAS システム                             5
                                                    22:23 Tuesday, May 6, 2003
      
        GOUKEI                                        Cum.              Cum.
       Midpoint                                 Freq  Freq  Percent  Percent
                 |
         10000   |****************************    14    14    77.78    77.78
         20000   |****                             2    16    11.11    88.89
         30000   |                                 0    16     0.00    88.89
         40000   |                                 0    16     0.00    88.89
         50000   |                                 0    16     0.00    88.89
         60000   |**                               1    17     5.56    94.44
         70000   |**                               1    18     5.56   100.00
         80000   |                                 0    18     0.00   100.00
                 |
                 ----+---+---+---+---+---+---+
                     2   4   6   8   10  12  14
                           Frequency
      
                                    SAS システム                             6
                                                     22:23 Tuesday, May 6, 2003
            Frequency
      
            16 +       *****                                                  
               |       *****                                                  
            12 +       *****                                                  
               |       *****                                                  
             8 +       *****                                                  
               |       *****                                                  
             4 +       *****                                                  
               |       *****       *****       *****       *****              
               --------------------------------------------------------
                       10000       30000       50000       70000
                                    GOUKEI Midpoint
      
    4. 出力からの知見 :
      • 入力した全変量が正しく読み込まれているかを先頭 5ケースで確認
      • ヒストグラムの区切り幅を換えると分布のイメージが変化する
      • 平均値はヒストグラムのどこに位置するか?
      • 平均値が分布形状を想像するに足る情報であろうか?
        • 対称分布の場合だけ
        • それでも広がりは判らない
      • ...

    5. プログラムの保存 :
      Program Editorエリアのコマンド行でプログラムを recall 後 : [入力] file 'les0406.sas'

  9. 出力結果の保存と転送 : Outputエリアの内容をファイルに保存して転送
    解析結果を活用するため : 印刷、レポート、...
    1. プログラムを実行(SUBmit)する前に、
      Outputエリアの過去の記録を消去しておく: [入力] clear
      この処理をしておかないと、過去の全ての(不要な、多大な)記録が全部保存される
    2. 出力結果の保存 :
      Outputエリアのコマンド行で : [入力] file 'les0406.lst'
      プログラムの保存と同じコマンドだが、保存対象が異なる
    3. 各種エリアの保存や呼び出しについては、以後、いちいち指示しない。 各自で判断してほしい。
    4. Windows 側に転送して、レポート作成に利用。
      • Lesson 4-7 : Windows 側で読み出せるか、実際に転送してみよ。
      • 転送の際は、転送モード(ASCII)、文字コード(EUC)に注意すること。

      • 印刷するだけなら、「H:」ドライブ辺りに転送して メモ帳や MS-Word (や秀丸等のエディタ等)に読みこんで印刷。
        ファイル名の拡張子(.sas、.lst等)に注意しないと見つけられない。
      • 印刷の仕方等については、「PC・ネットワーク利用ガイド」を参照のこと。
      • 手元に保存しておきたいのなら、FD や MO にバックアップを取る。

  10. 次回は、... : 5月15日 14:45
    • 基礎統計量、グループ毎の統計量、...
    • 興味あるデータの特性を明らかにしていこう
      • 皆さんのデータを使った解析 : 各自のデータを解析してみよう
      • ファイル名は各自で命名し、記録しておくように

[DIR]講義のホームページへ戻ります