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

2013年06月11日

アナリティックス・カンファレンス 2013

『アナリティックス・カンファレンス 2013』に行ってきました。
統数研の樋口先生の講演が面白かったです。

以下、講義のメモ
----------------------------------------
・確率論は順問題を扱い、統計学は逆問題を扱う。

・ビッグデータの定義
 3v: 量(volume)、種類(variety)、頻度(velocity)
 5v: 3vに加え、価値(value)、情報の正確さ(信憑性)(veracity)

・価値密度
 価値密度 = 価値総量 / データ総量
 データ量が増え、価値密度が薄くなってきている

・cvr = (a+b)/(A+B)
 A:ターゲットの総量
 a:アクション(購買)数
 B:興味のない集団の人数
 b:アクション(購買)数

2013年06月06日

IBM SPSS Modeler サーバのメモリサイズ変更

最近、巨大なモデルを作成することが増えてきたのだが、メモリ不足で処理が停止することが頻発してきた。

ということで、IBM SPSS Modelerのメモリサイズを変更した。

クライアント側の設定は簡単で、
ツール→オプション→システム・オプション→最大メモリー
でメモリの値を増やすことができる。

サーバ側の設定は、
・ファイル名:jvm.cfg
 options, "-Xmx???m"

・ファイル名:options.cfg
 memory_usage, ???
 modelling_memory_limit_percentage, ??
 allow_modelling_memory_override, Y

この辺りのを設定をいじれば、使用するメモリを増やすことができました。

2013年06月05日

IBM SPSS Modeler、データソースが異なるテーブルの結合

IBM SPSS Modeler(旧称 Clementine)を利用して、データベース(Netezza)は同じなのだが、データソースが異なるテーブルを結合しようとしたら、結合ノードが紫色にならなかった。

つまり、データベース側で処理を行うのではなく、ローカルに持ってきての処理となっている。
(SQLプッシュバックが行われていない。)

同じデータベース上にあるんだから、それくらいなんとか頑張って欲しいものだが…。

データベースをどう設計するかとか、あまり分析者が立ち入らない場合が多く、データベース管理者的に管理がしやすい設計と分析者が分析しやすい設計って微妙に異なるんだなぁと改めて認識した今日この頃。

2013年05月30日

KDD CUP 2013 Trac1 に参加して感じたこと

KDD CUP 2013 のTrac1に参加しているが、Scoreが0.968まで上がってきた。

通常の業務をやりつつ、KDDに参加しつつってこともあり、あまり時間をさけないのが残念なのだが、効率的にモデリングをしたり、変数を作ったりすることで、なんとなく解ってきたことがある。

以下、そのまとめ。

今回、テキストのデータがあるので、それを使った方が良いだろうとは思う。
しかし、LDAなどでトピックを抽出し、距離(近さ)を計算し、そのまま投入するだけでは対して精度は上がらなかった。

むしろ、ネットワークの問題と考え、ネットワークの構造をうまく変数として与えることができれば、精度が大幅に上昇した。

次にモデルに注力した方が良いのか、うまい変数作りに注力した方が良いのか?
もちろん、両方大切である。

両方大切なので、あまりに偏った分析設計をすると、時間が足りなくなってしまう。
そこで、以下のようにすれば良いのでは?と。

最初は、モデルを固定せずに、できるだけ数多くのモデル(決定木、ニューラル、SVM、ロジスティック回帰)にチャレンジした方が良い。
この時に、あまりパラメータチューニングをガリガリ行うのではなく、簡単なモデル(チューニング)であたりを付けていく感じ。

その中で、筋の良いモデルとそうでないモデルが見えてくるので、だんだんと要らないモデルを落としていく。

上記の作業を行いつつ、変数を追加していくのだが、精度の凸凹は、変数を追加しても大きく変わることはほとんどない。
新たな変数を追加したところで、そのベースからの上昇率は、どのモデルも似たり寄ったり。

この辺りで、決定木とかも単にCHAIDだけではなく、C5.0とか、流行りのrandom forestなど複数の木を試してみる。
また、不要なモデルを削除し、そして、また、変数を追加しということを繰り返していく。

最終段階に入ってくると、深い構造を作っていく必要があるのだが、boostingやbaggingといったオプションで繰り返しモデルを作っていくと、相当時間がかかる。
この辺りになると、ほぼどのモデルを使ったらいいのか見えてくるので、1,2個のモデルを使いつつ、モデルのパラメータを微調整していく。
そして、また、変数自体も微妙性していく。

なんだか、職人のような気もするが、そうしてくると、微々ではあるが精度は少しずつ上がっていくので、(もちろん、オーバフィットには注意しつつ)、後は、どれだけ時間を取れるかが、1%以下の精度の勝負の分かれ目になるんだろう。

2013年05月29日

The maximum memory for the 64 bit Modeler Client should not be capped.

IBM SPSS Modeler(Clementine)でメモリをたくさん増やすと、起動時にJAVAのエラーが出てしまう。
メモリをたくさん使う必要があったので、調べなおしたら、使えるメモリが増えていた。

http://www-01.ibm.com/support/docview.wss?uid=swg21487451

ちなみに、JAVAのエラーが出た場合
C:\Users\\AppData\Roaming\SPSSInc\Modeler\Defaults

ここにあるファイルの値を元の数字に戻せば起動できるようになります。

2013年05月28日

データ解析のための統計モデリング入門

最近、読み進めている本があります。


データ解析のための統計モデリング入門――一般化線形モデル・階層ベイズモデル・MCMC (確率と情報の科学)

データ解析のための統計モデリング入門――一般化線形モデル・階層ベイズモデル・MCMC (確率と情報の科学)

  • 作者: 久保 拓弥
  • 出版社/メーカー: 岩波書店
  • 発売日: 2012/05/19
  • メディア: 単行本



非常に解りやすい本でオススメです。
Rを使ってGLM、GLMM、階層ベイズモデルを解りやすく説明しています。

Rを使う人を想定して書かれているので、実際にRをインストールして、読み進めていくのが良いかと思います。

分析をする際に統計モデルなんて不要だ、Modeler(Clementine)で十分だと思っている人も多いかと思います。
実際に、数理モデルを構築しなくても、クロス集計でたいていのことは解りますし。。。

とはいえ、知っていて損をすることはないですし、分析の流れとして、
クロス集計 → 決定木などの機械学習 → 数理モデル → 最適化
といった流れが良いんじゃないだろうか?とも思います。

また、最近、IBM SPSS Modelerのノードの中にもGLMやGLMMが実装されています。
このノード何の役に立つんだっけ?って場合にもこの本が良い参考書になりそうです。