hadoopの話とpythonでデータマイニングをする話

gumiの粟飯原です。
データマイニングやってます。しかしながら最近はあまりデータをいじる時間がなく社内でプレゼンばかりする日々で、社内でも私がなにやってるのかわからないというもっぱらの評判。そこで今回は一応データ解析もやってはいるんだよということを内外に主張するためにもデータマイニングの話をしようと思います。

アプリの基本的な日々の統計データ取得などは別の方々はやられているので、私からはhadoopを使った大規模解析の話や、そこで得られたデータを分析する環境の話をしたいと思います。コードを併記した具体例などは今回載せられないのですが、今後また紹介していければと思います。

大規模データの解析

日々のログ解析やDB解析はcronによる処理で毎朝レポーティングを行っているのですが、新しい情報を過去のアクセスログからまとめてどかんと取得したいと言う時はHadoopによる大規模解析を実行しています。

アプリケーションサーバamazon EC2上に構築されているため、logrotateの実行時にamazon S3にログデータを転送し、S3上でHadoop(amazon Elastic MapReduce)+Hadoop Streaming API(python)を用いた解析を行っています。

詳細などに関しましては 私が社内で発表した並列分散処理に関する解説資料や、エンジニアの鎌谷さん(@buhii)が第7回 データマイニング+WEB 勉強会で発表した資料を御覧ください。

データマイニング環境

gumiではアプリケーションの開発は全てpython+Mac OS Xで行っているため、データマイニング環境もpython+Mac OS Xで構築しております。

pythonは研究者コミュニティが非常に大きい言語であり、統計や機械学習のライブラリが大量に存在しています。そこで主に自分が利用しているパッケージの紹介をさせて頂きたいと思います。他にもちょこちょこ必要に応じて使うのですが、ほとんどの場合以下の環境で事足ります。

numpyとscipy

numpyとscipyはpythonでベクトルや行列を扱う場合に最も多く利用されるライブラリです。numpyは基本的なベクトル・行列演算のライブラリであり、scipyには信号処理や統計解析、クラスタリングや最適化等のアルゴリズムが実装されています。

最近のscipyは疎行列への対応や高速な固有値分解なども実装されており、比較的大きなデータに対しても適用可能な解析アルゴリズムの実装が容易に可能になります。この業界固有値分解や特異値分解を使う手法が多いのでプロトタイピングには重宝します。とはいえめちゃくちゃ高速というわけではないので、本気で業務に組み込む場合はC++でeigen等のライブラリを用いて実装する必要が有るでしょう。

matplotlib

matplotlibはpythonMATLABに搭載されているようなグラフの描画機能を実現するためのライブラリです。

サイトを見ていただければは分かるとおり非常に強力な可視化ツールとなっています。
Macでは初期状態で設定されている描画ライブラリwxwidgetのpythonバインディングがインストール不可(2010/10/5現在)であるため, TKAggを利用する必要があります。なので、画面に描画を行う場合はX11を起動しておく必要があり、さらにmatplotlibのインポート時に以下の記述をする必要があります。

import matplotlib
matplotlib.use('TkAgg')

日本語の描画を行う場合は以下のページを参照してください。

PyML

python用の機械学習ライブラリです。詳細は略。最近はDynamic Time Warpingという時系列データ間の類似度を計算するアルゴリズムとk-medoids法というクラスタリング手法を利用するために利用しました。Support Vector Machineの実装も入っているので新規流入ユーザに対する課金ユーザとそれ以外のユーザの判別の実験に利用しようかななどと妄想は膨らみますね。

  • PyML

http://pyml.sourceforge.net/

rpy2

rpy2はpythonからオープンソースの統計解析ソフトウェアRを用いるためのライブラリです。Rは非常に強力なデータ分析ツールなのですが、データの読み込み、整形などをRでやるのはpythonプログラマとしてはしちめんどくさく感じてしまいます。そこで、python側で解析したいデータを作成して、Rの必要な関数を呼び出して結果の整形もpython+matplotlibでやるというフローを取ることにしています。

Rではpython以上に大量の統計解析のライブラリが存在しており、ICML等で発表されたばかりのアルゴリズムのライブラリも公開されていたりするため、マニアックな解析をとりあえず遊んでみるという楽しみも有ります。

Mac環境で仕事ではなくちょっと試してみたいという場合は、以下のページを参考にしてセットアップをしてみてください。

NetworkXとiGraph

ソーシャルゲームの分析を行う場合には、友人関係の分析が非常に重要になってくると思います。ゲーム内のアクティビティによる分類だけではなくその他SNS上から取れるデータは全部取った上でユーザの分類や判別を行いたいというニーズは結構あるのではないでしょうか。

そこで、ソーシャルグラフデータを解析する際に便利なライブラリとしては、Network XとiGraphというライブラリが存在しています。このライブラリではグラフ(複雑ネットワーク)に対する基本的なアルゴリズム(最短経路探索・最小全域木)から、各種指標の計算や、クラスタリングなどが利用可能です。Network Xは非常に使いやすいライブラリでありますが実装されているアルゴリズムは基本的なものだけとなっています。iGraphは使い方に癖が会ったり挙動が不安定だったりしますが、マニアックなアルゴリズムが実装されています。

おわりに

基本的な統計解析の環境は今回紹介したライブラリを用いれば構築できると思います。しかしながら高速化のためのチューニングやどんな場合にどのライブラリを利用すべきかなどは個人のノウハウによるところが大きく、まだ皆で共有できる段階にはなっておりません。ケーススタディを纏めるにはまだまだ時間がかかりそうです。

今のところ業務的に余裕が無く、取りたいデータが溜まっていないため楽しい楽しいデータマイニングな世界には進めていないのですが、ユーザのアクセス時間のパターンとゲーム内のアクティビティの関係の解析を現在趣味で進めているので、次回までに面白い結果がでていればその話が出来ればと考えています。その時には実際のコードなども紹介できればと思います。