2013年11月22日

数理システムユーザーコンファレンス 2013

「数理システムユーザーコンファレンス 2013」に行ってきました。

個人的には、宇宙飛行士 野口聡一氏の特別講演が面白かったです。
宇宙滞在中のTwitterや日記をテキストマイニングし、心理的な変化を分析するという内容でした。

他に気になったのは、ベイジアンネット(Bayonet)の事例紹介。
最近、あまりベイジアンネットの分析はしてませんでしたが、また、やってみようかなぁって思った今日この頃です。

2013年11月09日

平成25年度データ解析コンペティションの中間発表

「平成25年度データ解析コンペティションの中間発表」に行ってきました。

年々、レベルが上がってきている感じがしましたが、なんでか、今年に関しては、分析にキレがあるチームが少なかった気がします。。。
まだ、中間発表だからでしょうかね〜?

参加しているメンバー自体も少しずつ変わってきており、このビッグデータブームの影響でデータ解析がどんな方向に向かっていくのか、楽しみです。

そんな流れの中で自分自身の良さを生かした分析ができればと思います。

最終発表は、年明けの2月頃になるそうです。

2013年11月06日

IBM SPSS Modeler(旧Clementine)の"Hello world"

プログラム言語の入門として、Hello worldを表示させることから始めるのが多い。
IBM SPSS Modeler(旧称:Clementine)でも"Hello world"っぽいものがあった。



このように一見どんなノードもないストリームなのだが、スクリプトに


var file

set file = open create 'D:/hello.txt'

writeln file 'Hello'

writeln file 'World'

close file



と書いてます。
var fileは、ファイル操作をする時のおまじない。

set file = open create 'D:/hello.txt'で書き込むファイルを選択します。
 ・新規に作成、もしくは、上書きする場合:open create FILENAME
 ・既存のファイルに追記をする場合:open append FILENAME

writeln fileで書き込む内容を書きます。

最後に、開いていたファイルは、close fileで閉じてあげます。

開くとか閉じるってのは、実際にメモ帳とかが立ち上がって開いたり、閉じたりするわけではなく、プログラム的に開いたり、閉じたりって意味です。

さて、このスクリプトを実行すると、


Hello
World


という文字が書き込まれています。

ちなみに、
改行は、\n
タブは、\t
で書くことができます。

これってどんな使い方できるんだっけ?と考えたら、ステータス(終了コード)や、途中の集計値などを一つのファイルにまとめて書くこととかでしょうか?

通常のファイルのエクスポートがあるので、わざわざ、スクリプトを使って書き込むってことは重要度が低い小ネタかもしれませんが。

2013年11月04日

IBM SPSS Modeler(Clementine):for ... endfor 使い方 3

〜使い方 3〜

for パラメータ in_fields_to ノードの名前

 ここに式を書く

endfor



フィールドの変数を変更したり、削除するためには、CLEM式にある関数をそのまま使えます。

書き方としては、var_nameという変数を用意してあげて、いったんここに処理後の値を入れ、それを代入するというやり方が良いかと思います。

----- フィールドの変数名を大文字に変更する -----
for f in_fields_to Filter_c
set var_name1 = lowertoupper(^f)
set Filter_c.new_name.^f = ^var_name1
endfor
------------------------------------------------

----- フィールドの変数名を小文字に変更する -----
for f in_fields_to Filter_c
set var_name2 = uppertolower(^f)
set Filter_c.new_name.^f = ^var_name2
endfor
------------------------------------------------

----- フィールドの変数名を○個削除する -----
for f in_fields_to Filter_c
set var_name3 = allbutlast(2, ^f)
set Filter_c.new_name.^f = ^var_name3
endfor
------------------------------------------------
この例では2個削除しています。

では、一番最初に戻り、やりたかったことを。



# フィルターノードの中身を変更する
for f in_fields_to Filter_d
set var_name4 = allbutlast(13, ^f)
set Filter_d.new_name.^f = ^var_name4
endfor


このスクリプトを実行すれば、

となります。

これで、長々と増えてしまった変数名もすっきりしますね。

2013年11月03日

IBM SPSS Modeler(Clementine):for ... endfor 使い方 2

〜使い方 2〜
次に、一歩進んだ使い方を紹介。。


for パラメータ in リスト

 ここに式を書く

endfor



このままだと、リストを自分で作成する必要があります。

そこで、少し書き方を変えて、

for パラメータ in_fields_to ノードの名前

 ここに式を書く

endfor


とすると、ノードにある各フィールドに対し式を実行してくれます。



の場合、フィールドがx1〜x10まで10個あるので、forループは10回繰り返されます。

-----
for f in_fields_to Filter_b
set Filter_b.new_name.^f = ^f >< '_hohe'
endfor
-----
と書いた場合、どうなるか?

1回目のループ

for f in_fields_to Filter_b

ここで、fにx1が入力されます。

Filter_b.new_name.x1 = x1 >< '_hohe'

この式が実行されます。

new_nameというのは、新しい名前。
つまり、新しい名前に_hogeを追加しなさい、という処理になります。



これを応用すれば、各フィールドに、自由に値を追加することができます。

では、追加するのではなく、削除するにはどうすれば良いか?
これは、別の関数を使うことになります。

2013年11月02日

IBM SPSS Modeler(Clementine):for ... endfor 使い方 1

IBM SPSS Modeler(旧称:Clementine)を使って、集計を繰り返していくと、元のフィールド名がやたら長いものになってしまう。





そこで、フィルタノードを使いフィールド名を整形するのだが…



フィールド数が少ない場合は、手で修正できるのだが、フィールド数が多くなってくると、手で修正するのも面倒になる。

そこで、スクリプトを使って、簡単に修正するスクリプトを調べた。

基本は、"for ... endfor"を理解するだけの簡単なスクリプトなのだが、せっかくなので、for ... endfor を丁寧にみてみるみることにする。

〜使い方 1〜
まずは、超初心者編。


for パラメータ in リスト

 ここに式を書く

endfor



マニュアルには、
-----
【リスト】の順序を使用して、【パラメータ】に割り当てられた【リスト】内の各値に対し、【ここに式を書く】を1回ずつ実行します。
-----
と書かれています。



下記のスクリプトを実行するとどうなるか?


for f in x1 x9

 set Filter_a.new_name.^f = ^f >< '_test'

endfor



このループ、2回だけループされます。

1回目、x1
 f = x1
 Filter_a.new_name.x1 = x1 >< '_test'
x1をx1_testにリネーム

2回目、x9
 f = x9
 Filter_a.new_name.x9 = x9 >< '_test'
x9をx9_testにリネーム

となります。

これだと、リストを手打ちで書くため、スクリプトでわざわざ書くご利益はありません。

スクリプトを実行した結果は

となります。

2013年09月20日

平成25年度 データ解析コンペのデータが届く

2013年(平成25年度)のデータ解析コンペのデータが届きました。
去年は、データ提供元ということもあり、お休みしましたが、今年は参加することにしました。

ECサイトの課題編にエントリーしました。

思っていた以上にデータのサイズは小さかったです。

課題ということで、精度を競えば良いので、「さて、何をしようか…」ということはなさそうです。

2013年09月04日

Business Analytics Summit Japan 2013

「Business Analytics Summit Japan 2013」に行ってきました。
今回のセミナーの主目的である、N牧さんのIBM SPSS Modeler(旧称クレメンタイン)のTipsをみました。

今年で6年目らしいです。

今年の感想は、、、分析にキレがなかった気がします。
あまり時間がなかったんでしょうかね。

1点気になるところとしては、信頼区間を手動で作成しているところです。
・誤差が正規分布になっているのか?

・時間とともに信頼区間って大きくなると思いますが、この計算方法だとどのt時間においても一定の信頼区間になってしまいます…

来年に期待です!

そんなN牧さんにおススメの本がこちら。


経済・ファイナンスデータの計量時系列分析 (統計ライブラリー)

経済・ファイナンスデータの計量時系列分析 (統計ライブラリー)

  • 作者: 沖本 竜義
  • 出版社/メーカー: 朝倉書店
  • 発売日: 2010/02/01
  • メディア: 単行本


2013年08月14日

今後10年間で最もセクシーな仕事

Google の Chief Economist である Hal Varian が

“I keep saying that the sexy job in the next 10 years will be statisticians,” said Hal Varian, chief economist at Google. “And I’m not kidding.”

「これからの10年で最も魅力的な職業は統計学者」だと言っています。

確かに、最近は、ビッグデータとか、データサイエンスって言葉をよく聴くようになりました。
とはいえ、データサイエンスって何?って10人の人に聞けば、10人とも異なった答えが返ってくるでしょう。

Hal Varianの基調講演がありました。

てっきり、上記の有名な言葉でも出てくるのかと思えば、けっこうまじめな話でした。
しかも、数式とか普通に出てきましたし。

自分のビジネスに対しても良いヒントが得られたと思います。

Hal Varianさんとの記念撮影。
20130814.jpg

2013年08月13日

KDD2013から2014へ

KDD2013に参加してきました。
ランチのセッションの時に、次の開催地の告知がありました。

KDD2014がニューヨーク。
KDD2015がシドニー。
KDD2016がアメリカ西海岸のどこか。
らしいです。

ずいぶんと先まで開催地が決まっているんだなぁって驚きでした。

今回のシドニーですが、寒かった。。。
長袖を持って行きましたが、夏なのに20度を下回る気温でした。

さらに、会場でエアコンがガンガンついていて、なんだか冷蔵庫の中にいる感じでした。

2013年08月10日

19th ACM SIGKDD Conference on Knowledge Discovery and Data Mining (KDD 2013)

先日エントリーしていたKDD CUP 2013ですが、最終スコアが出たようです。

https://www.kaggle.com/c/kdd-cup-2013-author-paper-identification-challenge/leaderboard

まぁ日々の仕事をやりながらの参加だったってこともあり、まずまず納得のスコアだった気がします。

最後の「切れる分析」まで研ぎ澄まされた分析を行ったか?といえば、残念ながらそこまで時間を割くことはできませんでしたが…。

BenchmarkのコードやForumsを通じて、こんな手法もあるんだとか、さまざまなアプローチや考え方を学習出来たのは、非常に大きな収穫だった気がします。

やはり、実際に手を動かして、いろいろ悩み、試行錯誤を繰り返すというアプローチが非常に重要な気がします。

来年もまた参加してみたいです。

さて、ACM SIGKDDのカンファレンスがシカゴで行われます。

19th ACM SIGKDD Conference on Knowledge Discovery and Data Mining (KDD 2013)
http://www.kdd.org/kdd2013/

今年は、参加して来ようと思います。

2013年08月08日

平成25年度 データ解析コンペティション 発会式

平成25年度 データ解析コンペティション の発会式がありました。
http://jasmac-j.jimdo.com/

今年は、マクロミル(フリー部門のみ)と某ECサイト(課題部門、フリー部門)のデータらしいです。

個人的には、国内のデータ解析コンペは卒業したつもりで、面白そうなデータがあれば、たまに参加しようかなってスタンスでした。

去年は、自社データだったので、参加せず。
他の人の発表を観ていると、参加したくなりますね。

個人的には、ECサイトのデータが興味があるので、その課題部門にエントリーしてみようかなぁって思っています。

ちょうどKDD cupでやっていた手法が試せそうなので。

2013年07月10日

あみだくじは公平か? - 『統計学が最強の学問である』より

スタートが
a1, a2, a3, …, a8
までの8つあり、

ゴールが
b1, b2, b3, …, b8
までの8つのゴールがあったとする。



今、当たり番号を1から8まで変化させたとき、それぞれのスタートラインでの当たりの確率がどう変化していくかをシミュレーションする。

仮にあみだくじが公平であるとした場合、
・スタートがどこだとしても
・ゴール(当たり)がどこだとして
その発生する確率は同じである。

ということが言えるはずである。

シミュレーションの方法として、
1. 一人の人が1回だけ線を引く場合
2. 一人の人が2回だけ線を引く場合
3. 一人の人が100回だけ線を引く場合
どうなるか、計算してみる。

1回だけだと、偶然性があるので、上記のシミュレーションを1000回行ってみる。
つまり、
1. 一人の人が1本だけ線を引く場合 → 8000回のシミュレーション
2. 一人の人が2本だけ線を引く場合 → 16000回のシミュレーション
3. 一人の人が100本だけ線を引く場合 → 800000回のシミュレーション

シミュレーションの方法だが、IBM SPSS Modeler(旧称クレメンタイン)で行った。
スクリプトを組んでループをまわすだけの簡単なスクリプトなので、詳細は割愛しますが。。。

20130710_img02.jpg

結果、どうなったか?

20130710_img03.jpg

20130710_img04.jpg

20130710_img05.jpg

こうしてみると、線を引く本数が少ない場合は、当たりと同じ線上に線を引くというのがよさそうである。

線を引く本数が多くなっていった場合、一様分布に近づくので、スタート地点に関係なくなる。

とはいえ、あみだくじで線を引くのって、せいぜい1本か2本であり、100本も線を引いたりしない。w

となると、当たりがどこにあるのか知っているのと知っていないのでは、公平性に大きく差があるという結果になる。

統計学が最強の学問である

統計学が最強の学問である

統計学が最強の学問である

  • 作者: 西内 啓
  • 出版社/メーカー: ダイヤモンド社
  • 発売日: 2013/01/25
  • メディア: 単行本(ソフトカバー)


2013年07月09日

統計学が最強の学問である

統計学が最強の学問である

統計学が最強の学問である

統計学が最強の学問である

  • 作者: 西内 啓
  • 出版社/メーカー: ダイヤモンド社
  • 発売日: 2013/01/25
  • メディア: 単行本(ソフトカバー)



Amazonの口コミなどで、いろいろな意見が書かれていますね。
今まで特に読もうとも思わなかったのですが、あえて読んでみることにしました。

一章のところで、「あみだくじ」の事例が出てきたので、それについて考えてみることにした。

まず、なぜあみだくじは、一意に決まるのか?

たとえば、スタートが a1, a2, a3, …, an と n 個選択できるとすると、
ゴールは、必ず b1, b2, b3, …, bn にたどり着き、同じすべてのスタートがバラバラにゴールに着きます。

Aさんの結果とBさんの結果が同じゴールに着くことはありません。

いろいろな数学の証明方法はありますが、直感的にわかりやすい理由を考えてみました。

まず、横棒が1本も引かれていなかった場合。
これは、
 a1 → b1
 a2 → b2
 a3 → b3
 …
 an → bn
となります。

あみだくじでもなんでもないですね。

次に、線を1本引くという行為 Fij は何かを考えます。
たとえば、1と2の間に線を引けばどうなるか?

それは、
 a1 → b2
 a2 → b1
 a3 → b3
 …
 an → bn
となります。

つまり、F12 によって、二つのスタートとゴールが対になって入れ替わっています。

b2を新しいb1, b1を新しいb2と考えれば、横棒が1本も引かれていない状態
 a1 → b1
 a2 → b2
 a3 → b3
 …
 an → bn
と同じことになり、いくら横棒を引いても、対でゴールが入れ替わっているだけになります。

逆に考えれば、あみだくじとして成立しない置換方法として、対にならないような置換の場合
(ある時はこっち、また、あるときはこっちというような特殊な置換の場合)
この場合は、あみだくじとして成立しないことになりますね。

2013年07月05日

IBM SPSS Modeler ID数を絞ってのループ処理

Netezzaで大量データを高速に処理できるようになり、何も考えずに数千万とか数億レコードの処理してしまう。

普通は、問題ないのだが、1レコードに対し、最終的にそのレコードが1000倍とかになってしまう場合に注意が必要だ。

つまり、1000万レコード×1000=10,000,000,000
100億レコード!

さすがに、これらのレコードを同時に扱うと、処理が終わるのに数日かかってしまう。
ここは、初心に戻り、レコード数を小さくして処理を行うのがよさそうだ。

レコード数が増える場合、計算にかかる時間が
 1レコード数あたりの計算時間 × レコード数
と線形に増える場合は、あまり意味がなく、
 1レコード数あたりの計算時間 × (レコード数)n乗
レコード数が増えれば、計算時間が爆発的に増えてくる処理の場合に有効となる。

(例)
id数が1000万レコードだったとする。

IBM SPSS Modeler(旧称クレメンタイン)のスクリプトで1000人単位で1万回のループを回せばOK。


# i = 1

# ID >= 1000 * (1 - 1) and ID < 1000 * 1

 

execute 'out_1'

 

 

# i >= 2 and i <= 10000

 

for i from 2 to 10000

set id_num.condition = "ID >= 1000 * ('$P-i' - 1) and ID < 1000 * '$P-i'"

execute 'out_2'

endfor



この場合の注意点として、
1. あるIDの状態が他のIDに影響を与えないこと。
(与える場合は、あらかじめ独立で処理できるようにしておく。)

2. ループをたくさん回ることになるので、1回の処理に時間がかかる場合は、この方法は使えない。

この場合1万回のループを回すので、1回あたりの処理が10秒かかると仮定すると
10秒×1万回
= 100,000秒
≒ 1.16日

ということで、まるまる1日かければ、終了することになる。

レコード数を小さくして処理をする場合、1ループあたりにどれくらいのレコード数を入れるのか、1回ループあたりの処理時間は?などを意識しておかないと、かえって時間がかかることになるので注意が必要だ。

2013年07月04日

失敗の備忘録…最新の年月の値の取得

とあるリコメンドロジックを作っていた際に、出力レコードが0になっていた。
テストでは正常に出力されていたのだが、どうしてだろう?と思い調べてみると…。

会員のステータスを月ごとに持っていると仮定する。
(例)
月 ID 状態
4月 1 A
5月 1 B
6月 1 A

SPSS Modelerでモデルを作成するときに、分析者側のオーダーとしては、

1. 7月の状態を計算し
 (→ 7月 1 B なるものを計算し)

2. 以下、モデルの付与を行う

という処理を想定していたのだが、システム側は、1. と 2. を独立のものと考えていたようで、2. → 1. の順番で実行されてしまった。
つまり、7月分のレコードがないので、出力レコードが 0 だった。。。というわけである。

ここで、今後の対策を兼ねて、いろいろ検討してみると、
・月が切り替わるタイミングで施策を実行する場合、当月のファイルを作成できない場合どうなるのか?
という問題も残る。

そのあたりの分岐の仕組みもバッチ化すると、場合分けの条件が増えてしまう。

解決方法としては、シンプルに、最新の状態(最新の年月)を持ってくるのがよさそうだ。

→ max値を取得し、条件抽出する。

2013年06月28日

バッチでモデルの自動更新

IBM SPSS Modeler(旧Clementine)を使って
1. モデルを毎日更新し
2. その出力結果をアウトプットしたい

ここで一度モデルを作り、ずっとそのモデルを使い続けるなら簡単なのですが、モデルを毎日更新する場合、どうするのか?

方法として二つ考えられます。

[やり方 1]
モデルノードを使わずに、すべてノードやスクリプトだけで完結する。
この場合、モデルノードの置換する面倒さはいりませんが、あまり複雑なモデルは作成できません。

[やり方 2]
Modelerに用意されているモデルノードを使い、スクリプトで制御をする。

例として時系列の需要予測を毎日行うと仮定します。

スクリプトの書き方として、

batファイルの書き方

D:\SPSS\Modeler\14.2\bin\clemb.exe -stream D:\test\時系列\時系列.str -script 時系列.txt -log log.txt -execute


スクリプトファイルの書き方

# モデルの実行

execute '時系列'


 

# 作成したモデルをパレットに挿入

insert model ARIMA at 950 110


 

# モデルの前のノードとモデルをリンクさせる

connect A to ARIMA


 

# モデルとモデルの後のノードをリンクさせる

connect ARIMA to B



いたって簡単にバッチ化することができます。

2013年06月26日

一般化ブースト回帰モデル

r で gbm を使ってみた。
gbm: 一般化ブースト回帰モデル (Generalized Boosted Regression Models)

計算時間はそれなりにかかるが、安定して高い精度が出せそう。

同じデータでランダムフォレスト(Random Forest)も使ってみたが、どちらもそれなりに時間はかかるし、精度も同じくらいだった。
パラメータ云々で多少の差はあるんだろう。

Rのオススメパッケージの一つになりそう。

2013年06月15日

Amazon.com - Employee Access Challenge

KDD CUP 2013もほぼ終了ということで、次のお題を探していたら、面白いのを見つけた。

Amazon.com - Employee Access Challenge
https://www.kaggle.com/c/amazon-employee-access-challenge

特徴量(説明変数)は、
・RESOURCE
・MGR_ID
・ROLE_ROLLUP_1
・ROLE_ROLLUP_2
・ROLE_DEPTNAME
・ROLE_TITLE
・ROLE_FAMILY_DESC
・ROLE_FAMILY
・ROLE_CODE
の9個。

目的変数は、ACTIONの1 or 0を予測するというもの。

一見単純そうですが、上記のカテゴリ変数を1,0にフラグ化する場合、
・RESOURCE → 7518
・MGR_ID → 4243
・ROLE_ROLLUP_1 → 128
・ROLE_ROLLUP_2 → 177
・ROLE_DEPTNAME → 449
・ROLE_TITLE → 343
・ROLE_FAMILY_DESC → 2358
・ROLE_FAMILY → 67
・ROLE_CODE → 343

と、いっきに 15,626変数を作成することができます。
しかも、ほとんど0しか入っていないというデータです。

この辺りどう工夫していくのかが、難しいところでもあり、
面白いところでもありますね。

評価基準としては、area under the ROC curveを採用しています。
http://en.wikipedia.org/wiki/Receiver_operating_characteristic

ちなみに、ベンチマークとして、randomのスコアが0.50000。
K-Nearest-Neighbors (k=1)のスコアが0.63083でした。

2013年06月12日

overflow in 8 bit arithmetic

overflow in 8 bit arithmetic

IBM SPSS Modeler(旧称 Clementine)を使い、Netezzaに処理をさせているときに発生したエラー。

う〜ん、なんだろうと思いましたが、調べてみると、エラーの原因は
"変数の桁あふれ"
が原因でした。

Aという変数が3桁(例えば、300)
Bという変数が3桁(例えば、400)
の箱に入っているとして、
A×Bを実行すると答えは、120000となり箱に入りません。

通常は、Modelerの中(ローカル)の中で処理をさせるので、発生しないエラーですが、
SQLプッシュバックでデータベース側に処理させる場合に発生してしまいます。

対処方法としては、キャストをして回避できます。
SPSS Modelerとしては、変数作成ノードを使わずに、入力ノードの部分に、下記の様にSQLで書きます。

例)
select
  A,
  B,
  A*B::BIGINT
from hogehoge