顧客購買履歴の人工データ
Artificial Data of Customer Purchase History

データがなければ作ってしまえ

ビジネスにおけるデータマイニグの研究領域にて、特に研究者サイドから見て、「分析対象のデータが入手できない」という問題がある。そこで、MUSASHIを用いて人工的に顧客購買履歴データを生成しようという試みをはじめた。人工データであるが故に、データの漏洩を気にせずに利用できる(チュートリアルで利用しているデータも、この人工データを用いている)。

データの人工的生成においては、いかにして「あたかもそれらしいデータ」に見せるかが重要なポイントとなる。将来的には、顧客や店、天候などの情報を設定し、商品の購買確率モデルを作成し、そのモデルに従ってデータを生成することも考えているが、以下にあげた第一弾のスクリプトでは、全てのデータは乱数に基づいて生成されている。

人工データのダウンロード

1) 最新のスクリプトおよびデータのアーカイブをダウンロード(約600K)する。
2) 解凍する。( tar zxvf basic.tar.gz)
3)  basicディレクトリ以下に次のファイルが展開されていることを確認ください。

ファイル名 説明
Setup.sh
mkjcfs.sh
mksyo.sh
mktra.sh
mksepdat.sh
人工データを作成する親スクリプト(以下の4つスクリプトを起動する)。
JICFS商品分類マスターを作成するスクリプト。
商品マスターを作成するスクリプト。
顧客購買履歴データを作成するスクリプト。
顧客購買履歴データを月別に分割し圧縮して保存するスクリプト。
dat/cust.xt
dat/jicfs1.xt
dat/jicfs2.xt
dat/jicfs4.xt
dat/jicfs6.xt
dat/syo.xt
dat/dat.xt
dat/datxxxxxx.xt.gz
顧客マスター
JICFS大分類マスター
JICFS中分類マスター
JICFS小分類マスター
JICFS細分類マスター
商品マスター
顧客購買履歴データ
月別に分割された顧客購買履歴データ
input/jicfs.txt JICFSマスターのオリジナルテキストデータ

アーカイブにはSetup.shスクリプトによって既に作成されたデータ(datディレクトリ以下のファイル)が含まれていますので、データだけを利用したい人は、Setup.shスクリプトを起動する必要はありません。datディレクトリ以下のファイルを利用してください。
パラメータを調整して異なる人工データを作成したい方は、次節の解説を参考に、スクリプトを修正・起動してください。

データ生成スクリプト

  スクリプトは、1)JICFSコードファイルの変換、2)商品マスターファイルの生成、そして3)購買履歴データの生成、4)月別購買履歴データの作成の4つで構成されている。JICFSコードとは(財)流通システム開発センターが運営する商品の分類コード体系である。そこで一つ目のスクリプト(mkjicfs.sh)JICFS分類コードをXMLtableの形式のデータに変換する(大分類中分類小分類細分類の4ファイル)。二つ目のスクリプト(mksyo.sh)では、このJICFSコード表に基づいて、商品マスターファイルを自動生成する。そこでは、細分類項目につき数個の商品が登録されるようになっており、またメーカーコード、ブランドコード、仕入単価などの項目も乱数に基づいて自動生成される。そして三つ目のスクリプト(mktra.sh)にて、顧客購買履歴データおよび顧客マスターファイルを生成する。四つ目のスクリプト(mksepdat.sh)は、先に作られた顧客購買履歴データを月別ファイルとして分割し、gz圧縮して保存する。
 それぞれのスクリプトがどのように動作するかについては、各スクリプトのコメントを参照してもらいたい。またスクリプトの実行には、MUSASHI-COREの1.0.2以上がインストールされている必要があります。
 また、スクリプトでは乱数を利用しているため、Setup.shを実行しても、毎回異なるデータが生成されます。

調整可能パラメータ

以下の表で、データ自動生成において、各項目がどのようなルールで決められるかを示す。

項目 計算ルール デフォルト
商品数 各JICFS細分類について、正規分布にもとづく乱数にて決定。 平均4、標準偏差2の正規分布に基づく乱数
(以下、nrand(平均値,標準偏差)で表す。)
対象とする商品分類 全分類を対象とすると商品数が莫大な数になるので、ある商品分類のみ選択する。 中分類が11,12,13,14 のみ対象とする。
仕入単価 同じ商品は同じ仕入単価を持つ。正規分布に基づく乱数にて決定。 nrand(298円,100円)
但し、50円以下の仕入単価になる商品は削除する。
店別顧客人数 手入力にて、店コードと顧客人数を指定する。 A〜Gの7店舗、合計2350顧客
顧客の来店時間 ある時間がピークになるような乱数で決定 11時と16時が来店のピークとなるような来店時間
顧客の一来店あたりの購入数量 正規分布に基づく乱数にて決定。 nrand(nrand(5個,2個),3)
但し、0以下は省く
顧客の来店間隔 正規分布に基づく乱数にて決定。 nrand(30日,10日)
顧客の来店開始日 ある日付を中心に正規分布するように乱数で決める。 2001/07/01+nrand(0,200日)
顧客の来店終了日 ある日付を中心に正規分布するように乱数で決める。 2003/07/01+nrand(0,200日)
購入商品 商品によって売れる頻度を乱数で変える nrand(商品番号の中点, 商品数/3)
性別 ある割合でランダムに男女を決める 「男:女=1:5」となるような一様乱数
顧客の生年月日 正規分布に基づく乱数にて決定 "1960年+nrand(0,10)"/01/01 + nrand(0,365日)
販売価格 ある店のある商品について、日付によってある確率で変動させる。 最初の日付における単価は仕入単価×(1+nrand(0.3,0.1))で計算される。 次の日付からの単価は、前の日付の単価から計算する。90%の確率で前の行と同じ単価を用いる。10%の確率で単価は変動し、前の行の単価に±10%を加える。

今後の予定