初級帳票編 顧客別平均来店間隔日数

本章では、初級コマンドで用いた1996年1月のデータを用いて、下図に示すような「顧客別平均来店間隔日数」の帳票を作成する。

出力結果

顧客別平均来店間隔日数

チュートリアル初級帳票編

顧客 平均来店間隔日数
2010216000013 1.444444
2010216000020 5
2010216000037 1
2010216000051 10
2010216000099 5
2010216000105 4
2010216000136 4.4
2010216000174 10
2010216000204 8
2010216000211 3.666667
2010216000228 3
2010216000280 3
2010216000297 9.5
2010216000372 8
2010216000389 4.666667
2010216000402 2.857143
          :
          :

処理の流れ

 来店間隔とは、ある顧客がある日に来店したとき、次回の来店までの間の日数のことである。そして、顧客ごとに求まる複数の来店間隔の平均を計算した値が、平均来店間隔日数である。
 上図の帳票を作成するにあたり、これまでに学習したコマンド以外に必要となるコマンドは、「ある項目の値を一行上にずらす」コマンドである。
まずは、次に示す回答見ずに、各自で、入力データから、上図の帳票を作成するために、コマンドをどのように組み合わせて実行すればよいか(処理の流れ)を考えてもらいたい。

回答:処理の流れ

  1. 顧客がNULLである行を削除する
  2. 必要な項目「顧客」「日付」を選ぶ
  3. 顧客と日付で行を単一化する
  4. 顧客別に日付を一行上にずらして新しい項目「次回来店日」を作る
  5. 「日付」と「次回来店日」の間の日数を計算し「来店間隔日数」とする
  6. 顧客別に「来店間隔日数」の平均を計算し「平均来店間隔日数」とする
  7. 出力する項目「顧客」、「平均来店間隔日数」項目を抜き出す

次に、上記の「処理の流れ」における4の処理について解説する。

項目の一行ずらし(xtslide)

xtslide は、-kで指定した項目を単位に、-fで指定した項目の値を一行上にずらし、新しい項目を生成する。例えば、下図の左に示すような顧客と日付項目からなるデータがあったとする。このデータに対して「xtslide -k 顧客 -f 日付 -a 次回来店日」を実行すると、新しい項目「次回来店日」が図の中央のように生成される。顧客Aの二行目、顧客Bの三行目がNULL値になっているのは、ずらす行がないためである。そしてxtslideでは、NULL値となるこれらの行は削除され、図の右に示すような結果が得られる。NULL値行を削除したくなければ"-n"パラメータを付ければよい。

スクリプト

以上の説明で、顧客別来店回数を求めるスクリプトを書く準備が整った。以下にその回答を示すが、回答を見る前に各自でチャレンジしてもらいたい。

#/bin/bash
#===============================================================
# MUSASHI bash script
#===============================================================

#---- タイトル
title="顧客別平均来店間隔日数"

#---- コメント
comment="チュートリアル初級帳票編"

#---- 各種変数(適宜修正すること)
inPath="/mnt/h00/prm/tutorial"

#---------------------------------------------------------------
# コマンド
#---------------------------------------------------------------
xtdelnul -f 顧客 -i $inPath/dat.xt.gz |
xtcut -f 顧客,日付 |
xtuniq -k 顧客,日付 |
xtsort -k 顧客,日付 |
xtslide -k 顧客 -f 日付:次回来店日 |
xtcal -c 'day($次回来店日,$日付)' -a 来店間隔日数 |
xtagg -k 顧客 -f 来店間隔日数:平均来店間隔日数 -c avg |
xtcut -f 顧客,平均来店間隔日数 |
xtheader -l "$title" -c "$comment" -o cusint.xt
#===============================================================

実行結果は各自で確認してもらいたい。

練習課題