2013年12月15日

「データ解析のための統計モデリング入門」8章 メトロポリス法

「データ解析のための統計モデリング入門」8章 MCMCとメトロポリス法について。


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

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

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



ふらふら試行錯誤からメトロポリス法へ
1. ある初期値からスタートする。(例:q = 0.30)
2. 0.01、あるいは、-0.01だけ変化させる。

3. 対数尤度が改善されれば、その値を採用し、そうでない場合は、元の値を採用する。

ふらふら試行錯誤の場合

3. ある一定の確率 r で、値が悪くても新しい値を採用する

ふらふら試行錯誤からメトロポリス法へ

r = L(q新)/L(q)

(例)
元 q = 0.30, -46.378
新 q_new = 0.290, -47.619

r = exp(-47.619 + 46.378) = 0.289

メトロポリス法

【r】というノードを作成しています。
min(1, exp(function_new_Sum - function_Sum))

同時に【rand】という乱数を発生させ、r の値と比較することで、
"ある一定の確率 r で、値が悪くても新しい値を採用する"
という状態を作ることができます。

シミュレーションの結果は、こちら。
メトロポリス法

2013年12月14日

「データ解析のための統計モデリング入門」8章 ふらふら試行錯誤

「データ解析のための統計モデリング入門」8章 MCMCとメトロポリス法について。


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

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

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



まずは、対数尤度を計算するストリームを作る必要があります。

対数尤度の計算式は、

data * log(q) + (8 - data) * log(1 - q) + log(二項係数)

となるのですが、あらかじめ、二項係数を作っておく必要があります。

【二項係数】

# Rの場合は、choose(8, x)



if data = 0 then 1

elseif data = 1 then 8

elseif data = 2 then 28

elseif data = 3 then 56

elseif data = 4 then 70

elseif data = 5 then 56

elseif data = 6 then 28

elseif data = 7 then 8

elseif data = 8 then 1

else -1 endif



尤度を計算するノードとして、
function
data * log(q) + (8 - data) * log(1 - q) + log(二項係数)

function_new
data * log(q_new) + (8 - data) * log(1 - q_new) + log(二項係数)

各レコードの値を計算し、最後に集計をすれば、完成です。

完成したストリームはこちら。
ふらふら試行錯誤

スクリプトは、

var x

set x = 0.0

 

for I from 1 to 100

execute 'outputfile'

execute 'tablenode'

 

set x = value:tablenode.output at 1 1

 

set q.formula_expr = x

 

endfor



q = 0.30 とした場合、
-46.378
となります。

ふらふら試行錯誤のロジックとして、
1. ある初期値からスタートする。(例:q = 0.30)
2. 0.01、あるいは、-0.01だけ変化させる。
3. 対数尤度が改善されれば、その値を採用し、そうでない場合は、元の値を採用する。

これをストリームで書いて、後は、100回ほどループをさせれば、OK!

35回くらいで、最大値 0.46 に張り付いているのがわかります。
初期値を 0.30 にしても、0.60 にしても同じ結果になります。

ふらふら試行錯誤

2013年12月13日

「データ解析のための統計モデリング入門」8章 二項分布の乱数を発生させる

「データ解析のための統計モデリング入門」8章 MCMCとメトロポリス法について。


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

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

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



この本に書かれているアプローチを IBM SPSS Modeler(旧称クレメンタイン)でできないか?と思いやってみることにした。

まず、二項分布の乱数を発生させる必要があります。

IBM SPSS Modelerには、二項分布の乱数を直接発生させる関数はないので、いくつかのノードを組み合わせて作ることにします。

この本には、生存確率 0.45625 に従う各植物個体8個の種子の生死を調べています。
それを20個体調べています。

教科書のデモデータ

data <- c(4,3,4,5,5,2,3,1,4,0,1,5,5,6,5,4,4,5,3,4)


Rで二項乱数を発生させる場合

rbinom(20, 8, 0.45625)




これを、IBM SPSS Modeler(旧称クレメンタイン)で発生させる場合のステップ
1. 入力データを160個用意する(20×8)

2. 0から1までの乱数を発生させる
 random(1.0)

3. 各レコードに対し、生死を判別する
 if rand <= 0.45625 then 1 else 0 endif

4. 8個の種子グループ(index_種子)を作成する
 (index - 1) div 8

5. レコード集計をする
 → 160レコードを20レコードに集計

これで、二項分布の乱数を発生させることができました。

試しに1万個のレコードから 10000 ÷ 8 = 1250 個の乱数を発生させてみると、

こんなグラフになりました。

2013年12月12日

SEXY LITTLE NUMBERS、データサイエンティストに学ぶ「分析力」

データサイエンティストに学ぶ「分析力」を読んでみた。

自分の業界と違う部分もあるし、取得しているデータも違いますし、そもそも、取得できない項目もあります。

しかし、同じ分析やCRMを自分のサイトでするとしたら、どうするか?ということを考えながら、読み進めてみると、意外と似たようなアプローチをすることも出来るんじゃないか?って思いながら読んでいました。


データ・サイエンティストに学ぶ「分析力」

データ・サイエンティストに学ぶ「分析力」

  • 作者: ディミトリ・マークス
  • 出版社/メーカー: 日経BP社
  • 発売日: 2013/02/28
  • メディア: 単行本



ビッグデータ(big data)に対抗する意味での "SEXY LITTLE NUMBERS" というタイトルなんでしょうけど、、w
個人的には、割と良い本だと思いました。

ただ、本を読むだけでなく、実際に、やってみるってことも大切ですね。

2013年12月11日

商用ツールか、フリーのツールか

「R+Pythonというアプローチ」という記事を書きましたが、
http://skellington.blog.so-net.ne.jp/2013-12-10
自分自身の分析が
R+Pythonというアプローチ
に移行したというわけではないです。

いくつかのコンペティション(国内や海外)に出たり、日々の業務の中で、数多くのモデリングを行い、単に精度やマーケティング思考のやりやすさ、安定性を考えた場合、

IBM SPSS Modeler(旧称クレメンタイン)

がベストだと思っています。
(※ IBMの回し者ではないです…)

もちろん、個人や学生の人にとって見れば、価格が高すぎるので、そこが問題点であり、R+Pythonが流行ってきている理由もそこにあります。

"精度"ということを考えた場合、最新の手法や様々な手法が豊富なRの方に軍配が上がるように思えるのですが、意外とSPSS Modelerも悪くない、というか、むしろ精度が高い場合が多いように感じます。

おそらく、単なるアルゴリズム云々という話ではなく、きちんとした特徴量(説明変数)を作れれば、あまり、アルゴリズムや手法には差がなくなってくるのではないか?と。

そして、アルゴリズムの豊富さという意味では、昔に比べ、IBM SPSS Modelerも十分に良いノードがそろってきていると思います。

なので、主としては、IBM SPSS Modelerを使い、気分転換として、R+Pythonを使うのが、今のところ自分自身の中でのベストアプローチですね。

2013年12月10日

R+Pythonというアプローチ

最近のデータ解析の流行として、R言語が増えてきています。
実際に、世界で使われるツールとして、No1らしいです。
フリーのツールってことも大きいかと思います。

そして、実際にkaggleやKDD cupをみていると、R+Pythonというアプローチが多いですね。

R言語に関しては、自分自身でも使っているのですが、Pythonに関しては使ったことがなかったです。

C言語、perl、ruby、phpなどは、使ったことがあります。
せっかくなので、Pythonも勉強してみよう!ってことで、この本を買いました。


Pythonスタートブック

Pythonスタートブック

  • 作者: 辻 真吾
  • 出版社/メーカー: 技術評論社
  • 発売日: 2010/04/24
  • メディア: 大型本



Amazonでの口コミも良かったですし、「まったくのゼロからでも大丈夫」という安心感もあります。

読んでみると、、、激しく簡単でした。
「まったくのゼロ」というのは、プログラミングに関して、まったくのゼロの人向けって意味な気がします。

なんらかの言語をやったことがある人には、少し物足りないかもしれません。
オブジェクト指向とかが初めての人やもう一度復習してみたい人も良いかも。

それ以外の人だと、おそらく、こちらの方がよさげ。


初めてのPython 第3版

初めてのPython 第3版

  • 作者: Mark Lutz
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2009/02/26
  • メディア: 大型本




Python クックブック 第2版

Python クックブック 第2版

  • 作者: Alex Martelli
  • 出版社/メーカー: オライリー・ジャパン
  • 発売日: 2007/06/26
  • メディア: 大型本


2013年12月07日

データ解析コンペの中間スコア

データ解析コンペの中間スコアを提出する日でした。
スコア自体の計算に時間がかかりました。

今回の手法は、協調フィルタリングといった手法ではなく、カスタマと商品の属性の関係を元にモデリングを行うという手法を使っています。

過去の経験から、協調フィルタリングやアソシエーションルールをベースにしたものより、良い精度がでると思うのですが、計算する範囲をうまく抑えてあげないと、数億レコードとか数十億レコードと一気にレコード数が増えてしまうので注意が必要です。

出来としては、50%くらい。
最終発表に向けて、どこまで精度を上げることができるか。
それは、どこまで分析に時間をさけるかでしょうか。

2013年11月29日

IBM SPSS Modeler(旧Clementine)のデータベース入力ノード

IBM SPSS Modeler(旧Clementine)のデータベース入力ノードの【モード】として、
・テーブル
・SQLクエリー
が選択できます。

どちらもあまり変わらないと思っていたのだが…

安定的にバッチが実行されていたのだが、突如、バッチが失敗をしてしまった。

はて…?どこが原因かと調べたら、入力テーブルのフィールド数が追加されたとのことでした。
事前に連絡してもらえれば、対応できたのだが、連絡が来なかったために、エラーを起こしたようだ。

何も考えずに、テーブルモードでデータを持ってきていたが、今後も同様のことが起こる可能性があるので、SQLクエリモードでバッチを修正。

定常的に運用する場合は、気を付けないと…って思った今日この頃。

2013年11月27日

デロイトアナリティクス カスタマーアナリティクスフォーラム2013

「デロイトアナリティクス カスタマーアナリティクスフォーラム2013」に行ってきた。

以下、自分なりの解釈と備忘録

----------------------------------------

午前の部:Keynote Speech & 基調講演
なんだか、どこかで聞いたことあるような、パッとしない薄い話だった。

CMOにとって大切なことは、「難しい統計を理解することではなく、良い質問をすること。」らしい。
まぁ、そうだよね、と思う。

----------------------------------------

午後の部:B−@ 「マーケティング活動におけるアナリティクスの活用」

事例の中に上がっていたベイジアンネットワークのモデルが、ちょっと微妙すぎ…
マネージャーレベルの発表だと、まぁ、こんなものかって感じ。

----------------------------------------

午後の部:B−A 「データサイエンティストが語るCMOが知っておくべき統計とIT」

成功する可能性が低い → 専門性の高いデータサイエンティスト集団を初期から雇う
成功する可能性が高い → 明確な課題設定を持つこと


と講演の中で語っていたが、本当にそうだろうか?
明確な課題を設定したとしても必要条件であって十分条件でないと思う。

その課題ってのは、ビジネスに置いて明確かもしれないけど、それを社内データや分析技術をどう組み合わせれば、解決できるのか?が明確になっていない。
そして、それをきちんと設計できる人材ってのが、データサイエンティストであると思う。

データサイエンティスト集団は、いらないかもしれないけれど、優秀なデータサイエンティストが1人いることは、必須だと思う。
CMOの参謀的な分析者って意味。

----------------------------------------

午後の部:A−B 「共通ポイントサービス「Ponta」のデータ分析」

今日一番参考になった講演。
別途まとめます。

----------------------------------------

午後の部:B−C 「コンシューマービジネスに おける顧客アナリティクスの活用」

泥臭い集計作業が、すごく納得感じがある。

変数 → イベント

・キャンペーンの事例
クーポンのみ:4割
 → 新規獲得としてどれだけ取れているか、その後の成長は?
他商品も併売:6割
 → 優良顧客の予備軍として着目

併売商品 → 呼び水戦略を意識する

・クロス集計の事例
こだわり度合 × 低価格志向で4象限に分類
 → 本物志向の人、EDLPの人がいる
 → テキストマイニングでコレポン

----------------------------------------

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/

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