Lesson 2 データを選択する






    データ分析において、「データの選択」は最も重要でありかつ時間を要する処理の一つである。ここでデータの選択には2つの意味がある。レコード項目構造のデータでは、レコード(行)と項目(列)のそれぞれを選択することができる。通常、項目の選択に関しては、「選択」という言葉よりも「切り出し」という言葉をよく用いる。
    ここではデータ構造については特に解説はしないが、ある程度の知識は身につけておいておいてもらいたい(データ構造参照)。

1. レコードの選択(mselstr,mselnum)

1-1. ある一日のデータを選択する

    実際にデータを処理するにあたって最初におこなうことはレコードの選択である。例えば、全国に1000店舗の小売店を持つ企業の販売データを考えると、実際にデータを分析する際には、分析者は必ず、「どの店舗の」、「どの時期の」、「どの商品の」、そしてもしくは「誰の」分析をおこなうかを頭に思い浮かべるであろう。例えば、「関西地区について今年の歯ブラシについての販売動向を分析したい」などといったことである。このように分析対象とするレコードの選択は分析活動においてまず最初に行うべき処理である。
    さてLesson1で作成した"dat.gz"の解凍ファイルである"data"を用いて実際にデータの選択をおこなってみよう。このデータの項目は左から「店番号」、「日付」、「時間」、「レシート番号」・・・・といった順番に並んでいる。そこでまず「日付」項目で選択をおこなう。このデータは1998年の一年間のデータである。そこで、1998年10月10日のレコードを選択しよう。
 
bash$ mselstr field=2 string=19981010 <dat >xxtmp
(OK) mselstr field=2 string=19981010 [In:107473 Out:300 1998/04/09 17:52:34] 
    ここで"mselstr"は、「文字列比較によるデータ選択」のみに特化したコマンドである。"field=2"や"string=19981010"はパラメータと呼ばれ、mselstrコマンドの処理内容を決める。"field=2"によって2番目の項目(すなわち「日付」項目)を選択条件となる項目と見なし、"string=1998010"によって、その項目が"19981010"に一致する行を選ぶという意味を与える。すなわち「項目2=1998010」となるレコードを選択するということになる。
    実行が正常に終了すれば、上図のように終了完了のメッセージ("[OK] mselstr.....")が画面上に表示される。もしパラメータの与え方がおかしかったりすれば、下図のように異常終了のメッセージ([OK]の代わりに[NG])が表示される(下図では"fild"というスペルミス)。試してもらいたい。
 
bash$ mselstr fild=2 string=19981010 <dat >xxa
(NG) mselstr fild=2 string=19981010 (8)invalid keyword in the parameter 
    さて、正常に選択処理が終了すれば、"less"コマンドで内容を確認してもらいたい。以下に示すように、2番目の日付項目の値が"19981010"のみのレコードが選択されているのがわかるであろう。
 
bash$ less xxtmp
10216 19981010 1000 15390 * 416771 1 240 
10216 19981010 1000 15391 * 41033 1 260 
10216 19981010 1000 15392 * 120464 1 448 
10216 19981010 1000 15394 * 286711 1 1440 
10216 19981010 1000 15395 * 151319 1 0 
10216 19981010 1000 15395 * 151319 -1 -700 
10216 19981010 1000 15395 * 151319 1 700 
10216 19981010 1000 15395 * 60682 1 0 
                                 : 
                                 : 

1-2. 複数の日のデータを選択する

    次に、1998年10月10日だけでなく、1998年10月11日、1998年10月12日も加えて3日間のデータを選択してみよう。考え方は非常に単純で"string="のパラメータの内容を下図のように",(カンマ)"で区切って増やせばよい。
 
bash$ mselstr field=2 string=19981010,19981011,19981012 <dat >dat2-1
(OK) mselstr field=2 string=19981010,19981011,19981012 [In:107473 Out:1034 1998/04/09 17:52:34] 
これは、「項目2="19981010"もしくは"19981011"もしくは"19981012"」という条件に一致するレコードを選択するという意味である。
なおここで選択されたデータは後で利用するので、上記のようにファイル名を"dat2-1"としておく。

1-3. 数値範囲でデータを選択する

    さらに3日間でなく1998年10月10日から1998年10月30日までの20日間のデータを選択することを考えてみよう。"string="パラメータに20個の日付を指定すればOKである。しかし、20個ものデータを入力するのは手間であるし、入力ミスも生じる可能性がある。そこで日付項目を数値データとして考えれば範囲指定によってデータを選択できる。数値データとしての選択には「範囲」という概念が登場するために、mselstrコマンドとは別のmselnumコマンドが用意されている。
 
bash$ mselnum field=2 range=19981010_19981030 <dat >xxtmp
(OK) selnum field=2 range=19981010_19981030 [In:107473 Out:10148 1998/04/09 17:52:34] 
   数値範囲は、range=パラメータによって指定する。2つの数値を"_(アンダーバー)"で区切りる。例では19981010以上、19981030以下となる。処理が完了すればlessコマンドで確認しよう。
    さらに、range=パラメータの2つの数値のうち、どちらか一方を省略すれば、単に「○○以上」もしくは「○○以下」といった条件も指定できる。
 
bash$ mselnum field=2 range=19981030_ <dat >xxtmp
(OK) mselnum fild=2 range=19981030_ [In:107473 Out:34098 1998/04/09 17:52:34] 
上記の例は、「項目2≧19981030」という条件に一致するレコードを選択する。

以上で説明して意外にも多くの選択コマンドが用意されている。Lessonを進める中で随時取り入れていく。
 

2. 項目の切り出し(mcut)

2-1. 複数項目の指定による切り出し

    前節にて、xxaファイルに19981010日のデータが選択されているとする。このデータの項目全部で8つあり、左から順に以下の通りである。
1:店番号、2:販売日付、3:時間、6:レシート番号、8:顧客コード、13:販売金額、14:販売数量、27:商品コード
必要となるレコードの選択は終了したが、そのデータにはまだ不必要な項目が含まれているかもしれない。例えば「1998年10月10日に各商品が何個売れたか」だけを知りたければ、店番号や時間、レシートといった項目は不要であることは想像に難しくないであろう。そこで、必要な項目だけを切り出す処理をおこなう。
    まず単純に以下のコマンドを入力しよう。
 
bash$ mcut field=2 <xxa >xxb
(OK) mcut field=2 [In:1034 Out:1034 1998/04/09 17:58:42] 
上記の処理を実行し、xxbを見てもらいたい。日付項目(2番目の項目)だけが切り出されていることが確認できるであろう。当然内容は全て"19981010"のはずである。
    さて、次のLesson3で利用するデータをここで作成しておこう。Lesson3では時間別の売上金額と数量の集計をおこなう。そこで、時間、金額、数量の項目を切り出しておく。
 
bash$ mcut field=3,14,13 <dat2-1 >dat2-2
(OK) mcut field=3,14,13 [In:1034 Out:1034 1998/04/09 17:58:42] 
結果が以下の通りならばOKである。
 
bash$ less dat2-2
1034 1 198 
1710 1 370
1713 1 498
1714 1 280
1745 1 195
1823 1 880
1855 1 370
        : 
        : 

2-2. 項目範囲の指定による項目切り出し

    項目切り出しの別の指定方法をここで紹介しておこう。これはその他のMコマンド全てに共通することであるが、連続する複数項目は、範囲で指定することができる。それは"_(アンダーバー)"によっておこなう。例えば、第1項目から第7項目を切り出したければ、"mcut field=1,2,3,4,5,6,7"と入力する代わりに"mcut f=1_7"と入力することができる。
    1-1の例を範囲指定でおこなうと次のようになる。連続している項目が7と8だけなので、あまり意味はないが、演習としてはよいであろう。結果前記のものと同じである。
 
bash$ mcut field=3,7_8 <dat2-1 >xxtmp
(OK) mcut field=3,7,8 [In:1034 Out:1034 1998/04/09 17:58:42] 

・演習問題

a) 1998年1月10日のデータを選択し、さらに「日付」、「商品コード」、「数量」、「金額」項目を切り出しなさい。
b) 1998年6月から1998年12月までのデータを選択し、さらに「店番号」「日付」「時間」「レシート番号」項目を切り出しなさい。
c)上記のb)について1998年6月より前のデータについて同じことをしなさい。