Hatena::ブログ(Diary)

yokkunsの日記

2014-03-16

kmeansで楽できる(かもしれない)パッケージを作った

k-means法は、非階層的クラスタリングの代表的な手法ですごく便利ですが、使って行く上で、以下の2つが問題になってきます。

  • 初期値がランダムなので、結果がぶれる
  • 最適なクラスタ数が分からない

この2つの弱点に対して拡張版や手法が提案されていますが、すごくシンプルな方法で解決するパッケージを作ってみました。

その名もykmeansパッケージ・・・!


このパッケージは、上記の二つの問題に対して、以下のアプローチで対応しています。



N回実行して一番多く分類されたクラスタを採用する

例えば、あるデータで100回実行して、そのクラスタ平均値プロットすると、↓のようにクラスタの中心が結構ぶれます。

http://i.gyazo.com/a32a20645d641732e371fdb864a04cc4.png

クラスタの中心がずれると、当然分類されるクラスタが変わってしまうデータが出てきます。

なので、1回だけの実行では中々不安になってきます。


そこで、このパッケージでは、

「とりあえず100回くらい実行すれば安定するだろう」

という仮定のもとに、100回実行して、一番多く分類されたクラスタを採用しています。

(※回数は指定出来ます)


任意変数クラスタ分散平均値が小さくなるクラスタ数を採用する

自分がクラスタリングを使うときは、目的にもよりますが、ある程度クラスタ数の範囲は事前に決めています。

多すぎると解釈や説明がつらくなってくるので、3〜6、多くて10くらいに設定するのが多いです。

また、「クラスタリングして終わり」ではなく、各クラスタのKPIを比較するなど別の分析があります。

なので、クラスタ内で、見ようと思っているKPIが出来るだけ近い方が都合が良いです。


そこで、このパッケージでは、

「見ようと思っている変数が、クラスタ内でなるべく散らばらないクラスタ数」

を採用しています。



使い方

  • ykmeans (x, variable.names, target.name, k.list, n)
x データフレーム
variable.names クラスタリングの時の使う説明変数
target.name クラスタ間で比較しようと思っている変数
k.list クラスタ数候補
n 試行回数
実行例
  • 使うデータ
library(ykmeans)

head(actData)
##       y x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 x13 x14 x15 x16 x17
## 1 17030  7  3  4  3  3  3  3  2  3   3   1   2   3   2   2   2   2
## 2  1360  5  3  4  4  2  4  3  0  4   2   2   2   2   1   2   2   1
## 3  1360  7  4  3  4  2  4  3  3  2   3   2   2   2   2   2   2   1
## 4   100  5  2  3  2  3  1  2  3  2   1   2   1   1   2   1   0   1
## 5   320  4  3  3  2  3  1  2  2  1   1   2   2   1   1   2   1   0
## 6  2820  7  4  3  4  3  4  3  3  2   3   3   1   2   2   2   1   1
ykm <- ykmeans(actData, paste0("x", 1:17), "y", 3:6)
table(ykm$cluster)
## 
##   1   2   3   4   5 
## 140  92  16 148 104
    • このデータでは、3〜6個のクラスタ数を試して「5」が採用されています。

2014-03-14

R CMD checkでno visible binding for global variable 'hoge'

久しぶりにCRANにアップしようと思ったら、R CMD checkで以下のようなのが出てきたのでメモ。

* checking R code for possible problems ... NOTE
[関数名]: no visible binding for global variable '[変数名]'
...

注意されてる変数関数内で初期化すればオッケーなのだが、

plyrとかで使う変数に対しても上記のメッセージが出てしまう。

例えば、関数内で作ったデータフレームを使って、

res <- ddply(data, .(id), summarize, avg=mean(a))

というコードを書いてると、

* checking R code for possible problems ... NOTE
[関数名]: no visible binding for global variable 'id'
[関数名]: no visible binding for global variable 'a'

って出てしまう。

少し気持ち悪いけど、これも初期化してしまえば、とりあえずメッセージは出なくなる。

id <- NULL
a <- NULL;

res <- ddply(data, .(id), summarize, avg=mean(a))

2013-09-09

データサイエンティスト養成読本を執筆しました&Data Scientist Casual Talk in 白金台で発表してきました

データサイエンティスト養成読本を執筆しました

かなり遅い報告となってしまいましたが、データサイエンティスト養成読本という本を執筆しました!

自分の担当パートは、以下の2つです。

Rで統計解析をはじめよう
  • 目次
    • Rの導入
    • データ把握
    • 多変量解析: 予測
    • 多変量解析: 分類
    • 機械学習

このパートでは、Rの導入からデータの把握、統計解析の実行方法をなるべく網羅的になるように意識して書きました。

参考までに、内容を検討していた時に作った表を載せておきます。

太字になっているところが、本で扱った項目です。

http://gyazo.com/159d8e3a48d8cc851b5a0b9154e50f83.png


Rによるマーケティング分析

こっちのパートでは、「Rで統計解析をはじめよう」で紹介した手法を使った基本的なマーケティングの分析手法に関して紹介しています。


Data Scientist Casual Talk in 白金台

9/6に、Data Scientist Casual Talk in 白金台というイベントで発表してきました。

http://gyazo.com/34b1977002e0ffb275095a68088aefa6.png

  • 発表資料


このイベントは、データサイエンティスト養成読本が出版されたことを記念にしたイベントで

執筆者が、執筆内容にそった形でカジュアルに講演するといったものでした。

皆さん内容がとても濃く、カジュアルとは一体なんだったのか?という状態でしたが、とても勉強になりました。

また、その後の懇親会でもいろんな人と意見を交わす事ができ、とても良い時間を過ごす事が出来ました。


参考

2013-06-30

DeNAを退職しました

2011年5月に入社して、2年間ほど勤めたDeNAを本日(6/30)付けで退職しました。

DeNAでの2年間は、2年間とは思えない程濃い時間で、本当に様々な経験をする事が出来ました。


入社して最初は、データマイニング部という部署に配属され、他部門で解決出来ないような難易度の高い課題に対して、各種方法論を使って解を出すといった事をやっていました。

まだデータが整備されていない状態の中で、求められているスピード感クオリティが高く、中々苦労したのを覚えています。

基本的な統計モデルの適用だったり、他の業界で使われているような応用的な手法適用、あるいは新しいモデルを作ったりなど、かなりチャレンジングな事をさせてもらいました。



データマイニング部の時に作ったモデルの一つに、TVCMの効果測定モデルがあったのですが、そのモデルを運用してもっと深い分析をしたいというお話があり、出向という形でマーケティング部署にJOINしました。(その後継続し今年の4月に正式に配属)

マーケティングの現場に入って、外からは分からなかった現場の温度感や、価値観、スピード感などを体感する事ができ、これまでの自分の知っているものとのギャップを実感しました。

エンジニアとマーケってかなり遠い存在なんだなーと改めて思い、この両方を深く経験出来たのはとても運が良かったなと思っています。



エンジニアとしては、前職のようなサービスの開発などはやりませんでしたが、PigやHiveを使った集計バッチやRを使った解析スクリプトの開発、分析用サーバの運用などを担当していました。

あと、地味に分析チーム内のgithubを使った開発体制の構築なんてことも推進したり、PigやHiveだけでなく、ShellやPerlなど技術関連全般のサポート等もやってました。


他にも、プラットフォーム周りの企画や分析、新規サービス周りの分析も担当させてもらい、本当に幅広い領域に触れる事ができました。

もっともっと書きたい事が沢山あるのですが、書き出すとキリがないのでここら辺にしておきます。

データマイニング部の皆さん、旧PF分析部の皆さん、マーケティング本部の皆さん、SG分析の皆さん、本当にありがとうございました!


転職のきっかけですが、昨今のデータサイエンティストブームからか、いくつかお誘いがあり、

いろいろ話してみた結果、今よりも自分の持っているスキルや経験をフルに活かせそうな環境と出会ったからです。

ホント急ですが、明日から新しい会社になります。

今後もよろしくお願い致します!


参考

2013-06-01

第31回Tokyo.Rを開催しました

第31回Tokyo.Rを開催しました。

※ 資料がまだのものは、公開され次第追記します!

前半(初心者セッション)

初心者セッション1 (所沢義男)


Rによるやさしい統計学 第7章 分散分析(後半の後半) (@aad34210)


中の人が語る seekR.jp の裏技 (@hiratake55)


後半

始めよう多変量解析〜主成分分析編〜 (@sanoche16)

R言語で学ぶマーケティング分析 – 競争ポジショニング戦略 – (@yokkuns)


R による自然言語処理入門(仮) (@a_bicky)

RとPythonによるデータ解析入門 (@gepuro)

LT (5分)

ABテストと結果の検定 (@ts_3156)



R で自然順ソートを実装してみた (@kos59125)

R で自然順ソート


rzmqで並列分散コンピューティング (@chiral)


可視化周辺の進化がヤヴァイ〜rChartsを中心として〜 (@teramonagi)


RでARIMAの話 (@tetsuroito)


次回

次回は、7/20に開催予定です!