データサイエンティスト レベル表

プログラマレベルというページがとても面白かったのでデータサイエンティスト版つくってみました。データサイエンティストの定義は[twitter:@TJO_datasci]さんのQuantitative analystに準拠しつつ技術面に焦点をあててレベル分けしています。


レベル0

このレベルの人はデータ分析をしたことがありません。最近テレビでよく目にするビッグデータについては何だが凄そうというイメージは持っています。そしてデータサイエンティストという言葉を知らない人が大半です。


ありがちな発言
ビッグデータってすごいらしいね」

レベル1

レベル1の人達は仕事や大学等の課題でExcelを用いた集計や簡単な相関分析などを実施したことがあります。ただし分析にあまり興味を持っておらずデータをニヤニヤしながら眺めている上位レベルの人達を変人だと思っています。彼らにとってビッグデータやデータサイエンティストなんてものは別の世界のお話です。


ありがちな発言
「分析ってなにが面白いの?」

レベル2

レベル2の人達は集計分析に加えて、最低限の機械学習統計学の手法を知っています。SVMやランダムフォレストなどのメジャーな手法を覚え、データ分析が面白くなってくる頃です。しかしながらRやSPSSなどの専用ソフトを常にデフォルト設定のパラメータで分析していたり、特徴量選択や前処理の重要性を甘く見る傾向があります。
近いうちに現実のデータはirisのように甘くないことを知ることになるでしょう。


ありがちな発言
「ランダムフォレスト最強」

レベル3

このレベルの人達は一定のデータ分析の経験を持っており、機械学習統計学の理論についての基本的な部分はある程度理解しています。また欠損データや不均衡データを意識した前処理や目的に応じて利用する手法をある程度使い分けることができます。

同時にデータ分析の世界も奥が深い事を認識し始めます。そしてさらに上のレベルに到達するには数学の知識や学術的な知識が必要だということを知り、機械学習や統計解析の専門書を購入して本格的に勉強を始めます。

また、自分がまだまだ未熟だと理解しているのでデータサイエンティストと自称はしません。ただし大人の事情が絡んでいる場合はその限りではありません。


ありがちな発言
PRML読めるようになりたい」

レベル4

このレベルの人達は教科書に掲載されている一般的な機械学習や統計解析の手法に加えて学術論文を読みこなして実務適用することができます。また本人にとって未経験の課題でも調査をしながら対処できる実力があります。またビジネスの課題を見極めて複雑な手法を使うべき場面とそうでない場面を区別出来るようになります。

このレベルの特徴はパターン認識機械学習が得意なタイプとと統計解析が得意なタイプが混在していることです。また数学的な知識が足りていない部分もあり、ある程度自分の分析力に自信を持ちつつも、本人はまだまだであると認識しています。データサイエンティストとして自称しても問題ないレベルですが、やはり自らをデータサイエンティストと名乗ることはありません。


ありがちな発言
「まだまだプロフェッショナルとは言えないよ」

レベル5

このレベルの人達は分析のエキスパートとマネージャに別れます。エキスパートは博士号取得者が多く既存の論文を応用するだけでなく必要に応じてアルゴリズム開発することができます。ただし全ての分野についてこのレベルを保つことは大変難しく大抵は1つか2の分野についての専門家です。

マネージャはレベル5以下の分析者をまとめてプロジェクトを運営できる人達です。エキスパートほどの知識はありませんが技術的な知識とマネージメント力の両方が必要とされます。一般的にデータ分析大好き人間はマネージメントをするよりも分析をしていたい人間が多いので両方の能力が高くかつマネージャという立場を引き受けてくれる点で大変貴重です。またエキスパートよりもコンサルティング力を求められます。
なおマネージャになるには必ずしもレベル4を通過するとは限らずレベル3から飛び級で昇格することもあります。


ありがちな発言
「大事なのはビジネス理解なんだ」


レベル6

いわゆるゴッド。あるいはデータ分析業界のツチノココンサルティング力、エンジニアリング力、分析力の全てをトップレベルで兼ね備えた真のデータサイエンティストです。しかしながらその存在を確認したものはいなく、業界ではイデア的な存在として扱われています。


ありがちな発言
不明

レベル7

このレベルの人達は世界にイベーションを起こします。常識を超越した彼らにとってはもはや複雑なデータ分析は必要ありません。重要なのは革新的なアイディアと尽きることのない情熱なのです。
彼らは現状改善の延長線上にはない新しい世界を我々に提供してくれます。


ありがちな発言
「Stay hungry, stay foolish」

データサイエンティストになりたい学生の為の就職先の選び方

 ここ半年でIT業界ではビッグデータというバズワードが一気に広がり、データ分析者の需要が急増しています。データサイエンティストは今後10年で最も魅力的な職業になるとも言われており、データ分析に携わる仕事に就きたいと考えている学生も以前よりは増えてきているのではないかと思います。

ビッグデータ、データサイエンティスト、データマイニング機械学習などのキーワードが散りばめられた記事も連日のように投稿されていますが、新卒の学生がデータ分析の仕事に就くための方法について触れられているものはあまりないようです。IT業界で働いている人たちの間でも、正しい認知が進んでいない状況ですので、データ分析業界の構造を学生さんが理解することは難しいのではないかと思います。

私自身はデータ分析に携わって5年程度で、まだまだ初心者の域を脱していないぺーぺーですが、データマイナーになるためにどんなキャリアを積めばよいかについては主観的な部分も多いですが、過去の経験からある程度語ることができると思っています。B3,M1の方々は新年を迎えそろそろ本格的に活動を始められると思うので、少しでも就職先選定の際に参考になれば幸いです。

ちなみにタイトルでは興味を引くようにデータサイエンティストという言葉を使っていますが、今回の話はデータマイナーになるための就職先の選び方です。データサイエンティストの定義がはっきりしないので私自身はあまりこの言葉を好みません。ここでのデータマイナーの定義はデータマイニング技術を用いてデータから意味のある情報を引き出して、何かしらのアクションにつなげる仕事に関わる人というところでしょうか。


さてデータ分析にかかわる職種は大きく分けて以下の3タイプあります。

  • 研究開発タイプ
  • アナリストタイプ
  • エンジニアタイプ

それぞれのタイプの特徴を図に纏めました。職種によって求められる資質・能力が違うので、自分の性格や興味によって選ぶと良いと思います。



純粋な研究開発タイプは大企業の研究所などに所属している人達ですので、この職に就きたい場合は大手メーカや通信会社等の研究所に入るか、データ分析会社の研究開発部署に所属するのが一般的です。仕事内容は研究開発なのでサービスに直接活かす分析をするというよりは手法の開発がメインになります。アナリストタイプとエンジニアタイプはデータマイニング技術を用いて実務の分析を行う人達です。今回は後者の2タイプの仕事に就きたい人達の会社選びにフォーカスします。


さて、データ分析に関わる企業は大きく分けて2つあります。1つはBtoBビジネスを行なっている企業で他社のデータを分析する仕事。もう1つはBtoCビジネスを行なっている企業で自社のデータを分析する仕事です。BtoCはビジネス to コンシューマの略で、消費者に直接サービスや商品を提供する企業群です。例えば電機メーカやソーシャルゲーム会社やWebサービスを展開する会社はBtoCになります。一方BtoBはビジネスtoビジネスの略で、企業を顧客とする企業です。国内の多くの企業はBtoBで、わかりやすい例を挙げると材料メーカやSIerコンサルティング会社などが該当します。また、データ分析に関わる企業は、エンジニアタイプ主体の会社とエンジニアタイプとアナリストタイプを両方抱えている会社に分類できます。これを図解したのが下の図です。

(1)の領域は大企業のマーケティング部門や分析部門、大手ソーシャルゲーム企業(G,D社あたり)など、自社の商品・サービスの分析を行っている企業です。(2)の領域は他社の抱えているデータを分析するビジネスをしている企業です。自前の分析部隊を持っていない多くの企業は分析を行うときに(2)の領域の企業に仕事を発注します。またレコメンドエンジンやマイニングツールを保有しているのも(2)の企業です。(3)は主にWeb業界の企業やソーシャルゲーム企業です。(1)と似たような企業なのですが、データマイニング業務に携わる社員は機械学習データマイニングを使えるエンジニアが多く、アナリストタイプの人が少ないのが特徴です。(4)はここ最近のビッグデータブームに乗ってデータ分析サービスを開始しようとし)ているSIerです。この領域の特徴はHadoopなどのデータの処理系の基盤技術に力を入れているものの、その環境をつかって分析する人材がいません。また(4)に属する企業は経営層のデータ分析についてのリテラシーが低いため、データマイナーの職業特性を理解する文化も無いことが多く、データマイナーにとってはあまり居心地の良い企業ではありません。

もし新卒でデータマイナーになりたい人はどの領域の企業に入るべきか?と学生さんに聞かたら、できるだけ(1)か(2)の領域の会社に入りましょう。というのが私の回答になります。(1)、(2)の特徴はデータ分析のチームを持っている点です。もし皆さんがアナリストタイプのデータマイナーになりたいのであれば、上の領域に行くしかありません。下の領域の企業でキャリアを積んでなれるのはデータマイニングを理解しているエンジニアです。またアナリストタイプだけでは実際の運用やサービスが作れないためエンジニアタイプも抱えています。そのため、上の領域の企業であればアナリストタイプ、エンジニアタイプ両方を目指すことが可能です。ただし自分はエンジニアとしてやっていきたいと考えているのであれば(3)の企業も選択しては有りだと思います、また(3)に属する企業はこれから(1)の領域にシフトする可能性が高いです。



(1)と(2)のどっちが良いのかについては、これは個人の趣向によります。動機の観点からは、一企業やクライアントのために尽くすということに意義を感じるのであれば(2)の領域、サービスを通して大衆に影響を与えたいなら(1)が良いと思います。キャリアの観点から言えば、(2)の企業郡で働くと多種多様なデータセットに触れることができる、(1)の企業では特定のデータセットを深く追求できるという違いがあります。自分の貢献したい業界や好きなデータがあるのであれば(1)が良いでしょうし、そうでなければ(2)のほうが可能性は広がります。(2)は仕事をするためにドメイン知識の勉強や新しいマイニング手法を使うことになることが多いので、新しいもの好きに向いてるかもしれませんが、受託特有のきつさもあります。


(1)、(2)の企業群をおすすめしてきましたが、選ぶときに気をつけるべき点として配属リスクがあります。当然ながらデータ分析部門がある会社に入社したとしても配属されなければ意味がありません。特に(1)の領域でWeb、ソーシャルゲーム業界以外の業界、例えば自動車、飲食、電力などの業界でデータ分析に関わりたい場合に注意が必要です。これらの企業でデータ分析に関われる人は、全社員の中でほんの一握りですし、実際まだまだ手探りの段階で、部署の規模も小さいことが多いです。学生時代からデータマイニングを学んでおり、職種別採用などで入社しない限り、入社後に希望の仕事につけるかはほぼ運次第になりがちです。(1)の領域でデータマイナーになりたいのであれば現段階ではWeb,IT業界以外に就職することはオススメしません。最終的に自動車業界や、飲食業界などでデータ分析の仕事をしたいのであれば次のステップを踏むことが現実的です。

STEP1. (2)のデータ分析部門に数年勤務してデータ分析の基礎を叩き込む
STEP2. 国内のデータ分析需要が増加するタイミングを見計らって(1)の領域の企業に転職する


データアナリストになるのに確実な方法は、データ分析を専門にしている(2)の領域の企業に入ることです。会社にもよりますが、大抵の場合(2)の企業は多様なクライアントを抱えています。そこでデータマイナーとして働くことで、多種多様なデータセットに対する分析経験を積むことが可能です。場合によっては目的の業界の仕事のデータ分析をする機会もあるでしょう。いま就職活動中の方が入社して数年働けばちょうど技術が身につく頃に各業界でデータマイナーの不足が本格化するのではないかと思います。その時に(1)の領域に移るか、(2)の領域に留まるかを検討しても遅くはありません。(2)を代表する企業としては有名どころだとブレインパッドやALBERTなどです。セミナーでトップの話を聞いたり、実際に務めている知人から話を聞いた限りでは、どちらも入社すればデータマイナーとしてのキャリアを積める環境だと思いますので検討しておいて損はしないと思います。


長々と書いてしましましたが、最後に簡単にまとめておきます。

  • Web、ソシャゲ業界で自社サービスに関わりたいデータマイナーになりたいなら(1)の企業へ
  • Web,ソシャゲ以外のBtoC企業でデータマイナーになりたいならまずは(2)の企業へ
  • 多種多様なデータセットを扱いたい、問題解決や分析すること自体に興味がある人は(2)の企業へ
  • 機械学習データマイニングに関わるエンジニアになりたいなら(1)、(2)、(3)の何処かへ

参考程度にお役立てください。

実務でRandomForestを使ったときに聞かれたこと

Machine Learning Advent Calendar 2012 の 21 日目の記事です。

私は普段は受託のデータ解析を仕事にしてます。過去に何度か実務でRandomForestを利用する機会がありましたので今日は以前顧客にプレゼンをした時に、質問された内容とその回答を紹介したいと思います。普段は機械学習データマイニングを実務の立場利用しており、手法そのものの専門家ではないので、間違いなどが有りましたらご指摘ください。

さてRandomForestは有名なアルゴリズムですので、ご存じの方も多いとは思いますが、CARTの開発者でもある、Leo Breimanが2001年に提案した決定木を用いた集団学習アルゴリズムの1つです。一言で言えば、大量の決定木を作成して、それぞれの決定木が出した答えを多数決し、最も支持の多かったクラスに分類する手法です。(回帰の場合は平均を返します)

RandmoForestをご存じない方はid:hamadakoichiさんの資料が非常にわかりやすいです。






さて本題。過去によくあった質問は以下の内容です。

  • なぜRandomForestは精度が高くなるのか?
  • バギングとの違いは何か?
  • パラメータチューニングはどうすればよいか?

上2つは同じ質問とも取れますが、知ってる範囲で回答していきたいと思います。

なぜRandomForestは精度が高くなるのか?

RandomForestに限らず決定木のような弱学習器は集団学習に向いているとよく言われます。これを理解するためにはバイアスーバリアンスの観点から説明ができます。
バイアス-バリアンス - 機械学習の「朱鷺の杜Wiki」
バイアスーバリアンス理論によると汎化誤差は次のように分解されます。



汎化誤差=バイアス+バリアンス+ノイズ



ここでバイアスはモデルの表現力に由来する誤差、バリアンスはデータセットの選び方に由来する誤差、ノイズは本質的に減らせない誤差です。
決定木はアルゴリズムの性質上、モデルが学習データからうける影響が大きくバリアンスが高い学習モデルになります。RandomForestやbaggingなどの集団学習アルゴリズムはこのバリアンスを低減させることで精度を向上を図ります。
ちなみに高精度で有名なアルゴリズムであるSVMであまり集団学習の話を聞かないのは、SVMが低バリアンスのモデルだからです。

baggingとの違いは何か?

baggingは集団学習アルゴリズムの一種で、ブートストラップサンプリングで抽出したデータセットを多数作成し、各々のデータセットに対して学習した識別器の多数決でクラスを分類する方法です。RandomForestとbaggingの違いはRandomForestが特徴量のサンプリングも行なっている点です。

確率変数同士が相関を保つ場合、平均の分散は以下の式で表現されます。


{Var(\bar{X}) = \frac{1-\rho}{M}\sigma^2+\rho\sigma^2}

ここで、{M}は生成した決定木の数、{\sigma}は分散、{\rho}は変数間の相関です。baggingで抽出した決定木はデータによってはブートストラップサンプリングで作成した各々の決定木同士の相関{\rho}が高いことがあります。これに対して使用する特徴量が違う木をたくさん生成しているRandomForestは決定木間の相関が低い為、上の式の第二項が小さくなりbaggingよりもバリアンスが下がり、baggingよりRandomForestの方が生成する多様性が高くなります。

パラメータチューニングはどうすればよいか?

RandomForestの主要なパラメータは次の2つです。

  • 作成する決定木の数
  • 1つ1つの決定木を作成する際に使用する特徴量の数

作成する決定木の数を決定する方法は簡単です。予測に用いる木の数を増やしていき結果が安定する数を利用すればよいだけです。上述の様にRandomForestでは決定木間の相関を低下させるために、決定木を作成するときに使用する特徴量もサンプリングします。この時いくつの特徴量を使用するかはパラメータとなっていて、決定木の場合は特徴量の数がNの時√Nが推奨値となっています。

しかしながら、実際のところは最適な特徴量数はデータ依存です。特徴量が多い場合や、意味のある特徴量が全体の中で少ない場合は推奨値よりも大きめの値を設定したほうが良い結果が得られる傾向がありますので、グリッドサーチで決定することをお勧めします。



実装

Machine Learning Advent Calendar のコメント欄に「なにか実装します」と書いてしまったことを後悔しつつRandomForestのコア部分をPythonで実装してみました。Out-Of-Bugは間に合わなかったので無しです。1つ1つの木はscikit-learnというライブラリを用いて計算しています。(ちなみにscikit-learnにはRandomForestも実装されています)

#!/usr/bin/env python
# -*- coding: utf-8 -*-
'''
Created on 2012/12/21

@author: shakezo_
'''

from sklearn.datasets import load_iris
from sklearn import tree
from sklearn import cross_validation
from sklearn.cross_validation import train_test_split

import numpy as np



def feature_sampling(data,feature_num,mtry):

    partial_data = []
    arr = np.arange(feature_num)
    np.random.shuffle(arr)

    for d in data:
        partial_data.append(d[arr[0:mtry]])
    return [partial_data,arr[0:mtry]]



def predict(clf_list,data):
    #多数決によるモデルの決定
    predict_dic ={}
    for clf in clf_list:
        input = data[clf[1][1]]
        model = clf[0]
        pid =int(model.predict(input)[0])
        predict_dic[pid] = predict_dic.get(pid,0) + 1

    #多数決でクラスを決定
    max_count = 0
    max_id =-1
    for k,v in predict_dic.iteritems():
        if v>max_count:
            max_count = v
            max_id = k
    return max_id




if __name__ == '__main__':

    target_names = {}
    #irisデータセットを取得
    iris = load_iris()
    #ターゲットを取得
    for i,name in enumerate(iris.target_names):
        target_names[i] = name


    #データ分割
    x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.33, random_state=42)

    #parameter
    tree_num = 500;
    train_num = int(len(x_train)*(2.0/3))
    test_num  = len(x_train)-train_num
    feature_num = len(x_train[0])
    mtry = 2



    #ブートストラップサンプリング
    data_list = []
    target_list = []
    input_data_list = []
    clf_list = []
    bs = cross_validation.Bootstrap(len(x_train),n_bootstraps=tree_num,train_size=train_num,test_size=test_num, random_state=0)


    #ランダムフォレストの実行
    #使用する特徴量とデータをサンプリングして決定木を構築
    for train_index, test_index in bs:
        data = x_train[train_index]
        target = y_train[train_index]

        data_list.append(data)
        target_list.append(target)

        #特徴量の選択
        input_data = feature_sampling(data,feature_num,mtry)
        input_data_list.append(input_data)

        #決定木の作成
        clf = tree.DecisionTreeClassifier()
        clf = clf.fit(input_data[0], target)

        #作成した木とデータを追加
        clf_list.append([clf,input_data])


    #データの予測
    predict_id_list = []
    #test_data_list = iris.data
    correct_num = 0
    for i,data in enumerate(x_test):
        pid=predict(clf_list,data)
        predict_id_list.append(pid)

        if pid == y_test[i]:
            correct_num += 1

    #Accuracy
    print "Accuracy = " ,correct_num/float(len(x_test))

結果

Accuracy =  0.98

それでは。

phpでyahooのRSSを取得する

simplexml_load_fileを使うと簡単にできるらしい。

参考URL:
http://php-web.net/faq/rss.html


実際に書いた見た。

<?php
$rssdata = simplexml_load_file("http://headlines.yahoo.co.jp/rss/rps_dom.xml");
foreach ($rssdata->channel->item as $rssrow) {
    print "<a href=\"";
    //print "<a"
	print $rssrow->link;
    print "\">";
    print mb_convert_encoding($rssrow->title, "SJIS");
    print "</a>\n";
  print  "<br>";
}
	 
?>


結果

「ウィキリークスは犯罪行為」前原外相(レスポンス) 
ITSスポットで決済実験を開始 国交省と国総研(レスポンス) 
馬淵氏の問責、午前0時の参院で可決(レスポンス) 
問責決議提出前、馬淵国交相ノーコメント(レスポンス) 
国交省、EV等技術の国際標準化で行動計画策定へ(レスポンス) 
環境税来年度導入へ、石油石炭を5割増税(レスポンス) 
環境自動車税、財務省「抜本的見直しが必要」(レスポンス) 
環境自動車税、政府税調は議論を先送り(レスポンス) 
レアアース、輸出改善の傾向(レスポンス) 
環境自動車税、自工会志賀会長「現在の軽が国際的なレベル」(レスポンス) 
東京地下鉄一元化、東京都と国交省でバトル(レスポンス) 
【高速道路新料金】前向き評価は4県のみ(レスポンス) 
レアアース 大畠経産相-張平主任会談の中味(レスポンス) 
中国のレアアース輸出状況、アンケート調査実施へ(レスポンス) 
東京港臨海大橋、「東京ゲートブリッジ」に名称決定(レスポンス) 
たこフェリー運休、馬淵国交相は地元の見解を否定(レスポンス) 
[尖閣ビデオ流出]何が本当か?(レスポンス) 
子ども手当の所得制限は高所得者に不利?(レスポンス) 
[尖閣ビデオ流出]馬淵国交相の責任 閣僚からも求める声(レスポンス) 
[尖閣ビデオ流出]夜中の緊急通達---馬淵国交相(レスポンス) 


ちゃんと取れました。