Lesson 3 集計する

    Lesson2で、データの選択について学習してきた。データ分析において、データの選択が完了すれば、次にその選択されたデータを目的に応じた形に加工していく過程に入る。Lesson3では、加工の中で特に重要な「データ集計」について学習する。なお、このLesson3にて「キー」の概念が登場する。Mコマンドによるデータ加工においては、キーの概念が多く登場する。このレッスンでしっかりと身につけてもらいたい。

1. 日別の合計を計算する(msum)

1-1. 合計計算(間違い例)

    Lesson2で1998年10月10日〜1998年10月12日の「時間」、「数量」、「金額」項目が選択された("dat2-2")。このデータはあくまでもレシートの一行一行が単位となっている。そこで、同じ時間に合計「いくつ」そして「いくら」販売されたかを計算してみる。そのためにまず次のように入力してみる。このコマンドの意味は、key=で指定した項目(ここでは第1項目「時間」)をくくりにして、field=で指定した項目(ここでは第2、3項目「数量」と「金額」)の合計を計算するということである。
 
bash$ msum key=1 field=2,3 <dat2-2 >xxtmp
(OK) msum key=1 field=2,3 [In:1034 Out:33 1998/04/09 17:52:34]
    さて上記の結果できたxxtmpの内容を確認すると、下図のように9時(もしくは10時)から19時(もしくは20時)までのデータが3回繰り返されている様子がわかるであろう。

 (注)下記の結果は例なので実際に出てくるデータとは異なる。
bash$ less xxtmp
1000 13 9126 
1100 69 36057 
      : 
      : 
1800 45 16520 
1900 2 2160 
900 1 560 
1000 30 19387 
      : 
      : 
1800 52 32945 
1900 42 22069 
900 3 838 
1000 37 18628 
      : 
      : 
1900 62 20895 
2000 39 13111 
    なぜこのような結果になるのであろうか?我々は、9時から20時までがそれぞれ一行づつ集計されるデータを期待していたはずである。それは、msumコマンドではkey=で指定した項目(時間)で順番に並び換わっていることを前提に処理しているからに他ならない。
    我々人間がこのようなデータ("dat2-2")を合計する場合を考えてみても、まず集計の単位となる時間項目で並べ変わっていれば計算しやすい。コンピュータも同じである。ここで、key=で指定したような並び換わっていることを前提とした項目を我々はキーと呼んでいる。リレーショナルデータモデルに触れたことのある人ならばキーという用語が異なって使われていることに気がつくであろう。このことに関しては「データ構造」にて詳しく説明している。

1-2. キー項目のソート(並び替え)

    それでは時間順にデータを並び替え(ソートと呼ぶ)てみよう。そのためには次のようにコマンドを入力する。
 
bash$ sort <dat2-2 >dat3-1
    sortコマンドはMコマンドではなく、OSに標準実装されたコマンド(もしくはGNUやその他の人々が作ったコマンド)であるために、Mコマンドを実行した後に表示される(OK)や(NG)といったメッセージは表示されない。
    結果をlessで確認してみよう。時間項目順にデータがソートされていることが確認できるであろう。 しかし、データの最後を見てもらいたい。9時(900)のデータが20時(2000)のデータよりも後になっていることがわかる。これは、sortコマンドが、時間項目を数字としてではなく文字として並び替えたためである。文字として比較する場合、文字列の左から順番に比較をしていく。"2000"と"900"を比較すれば、最初に"2"と"9"が比較されるために"900"のほうが大きいと判断するのである。
    しかしながら、キー項目のソートの目的を考えてもらいたい。これは、ソートの順序に意味があるのではなく、同じデータがまとまっていることに意味がある。さらに言えば、分析者が「売上の高い時間順でデータを見たい」といった分析者から見た意味でのソートとは異なることに注意しなければならない。キー項目のソートはコンピュータにとって計算しやすくデータをまとめることを目的とするのである。そのために、上記の結果は決して誤りではなく、コンピュータにとっては正しい。

1-3. 合計計算(正解例)

    さてここでようやく合計を計算する前準備(キー項目のソート)が整った。今度こそうまくいくはずである。次のように入力してみよう。
 
bash$ msum key=1 field=2,3 <dat3-1 >dat3-2
(OK) msum key=1 field=2,3 [In:1034 Out:12 1998/04/09 17:52:34] 
lessで確認してみると、以下のように、今度は見事に当初の目的を達成している。

 (注)下記の結果は例なので実際に出てくるデータとは異なる。
bash$ less dat3-2
1000 80 47141 
1100 131 72931 
1200 96 45076 
1300 162 38923 
1400 72 31785 
1500 152 46934 
1600 156 65250 
1700 199 93684 
1800 164 80829 
1900 106 45124 
2000 39 13111 
900 4 1398 
さて、この集計結果のデータを見て始めて、分析者から見たソートが必要となる。すなわち、「9時が一番下にきては見にくい」ということである。このことに関しては次のレッスンで見ていくことにしよう。

2. これまでの復習

さて、Lesson1からLesson3までで、元の細かな販売データから、時間別に集計されたやや帳票らしいものが加工された。頭を整理するためにも、ここでこれまでの流れを必要な処理のみを見ることによって復習しておこう。
1) gunzip -c /home/practice/Mine/Data/StoreMaster1/Dat/dat.gz >dat1-1
2) mselstr field=2 string=19981010,19981011,19981012 <dat1-1 >dat2-1
3) mcut field=3,14,13 <dat2-1 >dat2-2
4) sort <dat2-2 >dat3-1
5) msum key=1 field=2,3 <dat3-1 >dat3-2
解凍選択項目切り出し集計のためのソート合計

Mコマンドではこのように、単機能のコマンドをいくつも組み合わせることによって加工処理を進めていく。次のレッスンでは、ここで作ったデータをさらに加工して見やすい帳票に仕上げていく。
 

・演習問題

a) 1998年10月10日〜12日のデータについて、「商品コード別数量金額の合計」データを作りなさい。
b) 1998年6月から1998年12月までのデータについて、「顧客コード別数量金額の合計」データを作りなさい。
c)1998年のデータをについて、「日付別数量金額の合計」データを作りなさい。