2017年6月2日金曜日

SPSS Modelerでアソシエーション分析がしたいっ! (前処理編〜縦持ちを横持ちへ)

色々あって、「SPSS Modeler」で「アソシエーション (マーケット・バスケット)分析」がしたくなりました。
「オムツを買う人はビールを買うことも多い」とかなんとかのアレです。

単なる練習というよりは、実業務で使うことを想定したいので、インスタンス数は数十万件ぐらいのデータをやっつけたいです。

今回のゴールは、「アソシエーション分析」の前処理として、下記のようなストリームを作ります。


なお、実施環境については、以下の通りです。
・MacBook Air(CPU:1.6GHz,Memory 8GB)
・macOS Sierra ver10.12.3
・SPSS Modeler ver18.0

※本エントリーは、私、小田一弥が一個人として勉強を兼ねて記載したものです。私の勤務先である日本アイ・ビー・エム株式会社の見解・見識ではない、個人としての記載内容としてご覧ください。  


まずはサンプルデータを探そう!


探してみて実感したのですが、数十万件クラスでアソシエーション分析に使えるサンプルデータってなかなか無いんですよね。
そんなとき、役に立つのが、ご存知(?)「Machine Learing Repository」!!


このデータですが、2010/12/1から2011/12/9における海外ECサイトの購入トランザクションデータとなっております。インスタンス数は、なんと、541,909件!! ありがとう!UCI!

データ取得はとても簡単です。画像の赤枠内にある「Data Folder」のリンクをクリックして「xlsx」形式のままローカルに保存してください。

ファイルを開くと・・・おっと、縦持ちデータ(LONG型)になっているではありませんか。
アソシエーション分析を実施するためには、 一旦、横持ちデータ(WIDE型)にする前処理が必要になります。


前処理を始めよう!〜「縦持ち」を「横持ち」データに


データ準備もできたところで、早速、「SPSS Modeler」によるデータ加工を始めます。

1.Excelデータの読み込み
 「入力」パレットから「Excel」ノードを選択してください。
「インポートファイル」の「...」ボタンから先程ダウンロードしたファイルを指定して読み込ませてください。


 2.「データ検査」の実施
 こんなに膨大なデータになると、欠損値が混入しているかもしれません。
「出力」パレットにある「データ検査」ノードを選択後、何も変更せずに「OK」ボタンを押してください。


結構なデータ件数なので、自分のマシンで2分ぐらいカリカリ処理していました。


処理が完了すると、下記のような画面が表示されます。「有効」の列を見てもいいのですが、「欠損値検査」タブをご確認ください。


「非欠損値の割合」列を見ると欠損値が入っていることがわかりますね。


3.欠損値が入ったインスタンスの除外
欠損値が入っているインスタンスを除外する方法は他にもあるのですが、今回はお手軽なやり方で行きましょう。

先程の「欠損値検査」タブの「生成」メニューから「欠損値選択ノード」を選択してください。


「レコードが次の状態の時に選択:」横にある「有効」ラジオボタンを選択し、「OK」を押してください。


「生成」ノードが出来るので「Excel」ノードからつなげてください。


「データ検査」ノードで再確認すると、「非欠損値の割合(%)」が100%になっていることがわかりますね。


4.尺度を「名義型」に変更
「フィールド設定」パレットにある「データ型」ノードを配置し、「生成」ノードからつなげてください。
「データ型」ノードを開き、反転表示させているフィールドの尺度を「名義型」に変更したいのですが、このデータでは尺度変更が正しく反映されません。

「ツール」メニューの「ストリームのプロパティ」から「オプション」を選択してください。


「オプション」タブの「名義型フィールドの最大メンバー」のチェックを外してください。
チェックがついたままだと、250項目を超えるフィールドの名義型変更が出来なくなります。


「データ型」ノードを開いて、反転表示させているフィールドの尺度を「名義型」に変更し、「値の読み込み」ボタンを押してください。以下のようになっていれば「OK」ボタンを押してください。


5.「再構成」ノードによる「数値フラグ」への変換
・「フィールド設定」タブから「再構成」ノードを選択し、「データ型」ノードにつなげてください。
・「利用可能なフィールド」で「Description」を選択すると、「利用可能な値」にフィールド内の項目が表示されるので、全選択し「→」ボタンを押してください。
※前述の「データ型」ノードで尺度を「名義型」に変更しないと、プルダウン内に表示されません。
 ・「数値フラグ」ラジオボタンを選択後、「OKボタン」を押してください。


6.「InvoiceNo」を「レコード」集計でまとめる
・「レコード設定」タブから「レコード集計」ノードを選択し、「データ型」ノードにつなげてください。
・「デフォルトモード」で「最大」だけ選択し、下記画面のような選択状態にした上で「OK」ボタンをお押してください。


7.「InvoiceNo」をソートする
「レコード設定」パレットで「ソート」ノードを選択し、「InvoiceNo」で昇順ソートしてください。


最後に「テーブル」ノードで確認しましょう。
全ストリームを流すので処理完了まで数分かかります。自分の環境では10分ほどかかりました。


これで「縦持ちデータ」が「横持ちデータ」となりました。
次回はこのデータを用いてアソシエーション分析を行います。
(再度、ストリームを流すとまた10分以上かかるので、ソート後のデータをCSV形式で保存されることをお勧めいたします)

その他:SPSS関連エントリー


(無料)Watson StudioでSPSS Modeler flowの決定木を動かす

(Watson)Personality InsightsのJSONをR言語でパースしてみた

Watson Studioの「Data Refinery」機能で「馬の疝痛(せんつう)」データを眺めてみた。

SPSS Modelerだと「Kohonenネットワーク」が超簡単。http://sapporomkt.blogspot.jp/2016/09/spss-modelerkohonen.html

(参考)SPSS Modelerでクラスター分析をやってみた(K-Means)
http://sapporomkt.blogspot.jp/2016/08/spss-modelerk-means.html

SPSS ModelerからStatistics用ファイルを出力する方法
 http://sapporomkt.blogspot.jp/2016/08/spss-modelerstatistics.html

(SPSS Modeler)馬の疝痛データを誰でもカンタン決定木♪
http://sapporomkt.blogspot.jp/2016/07/spss-modeler.html

「SPSS Modeler Text Analytics」によるテキストマイニング(データ読み込みからグラフ化)
 http://sapporomkt.blogspot.jp/2016/07/spss-modeler-text-analytics.html

「SPSS Modeler」におけるデータ操作及びシーケンスデータの取り扱いまとめ
http://sapporomkt.blogspot.jp/1970/01/spss-modeler_1.html

SPSS Modelerでリーディングサイアーデータ分析:前処理(レコード追加等)
http://sapporomkt.blogspot.jp/2016/05/spss-modeler.html

SPSS Modelerで「サイアー/ブルードメアサイアー」データをレコード結合
http://sapporomkt.blogspot.jp/2016/05/spss-modeler_13.html