Fire Engine

消防士→ITエンジニア→研究者

形態素解析エンジンMecabの辞書を更新する(mecab-ipadic-NEologdの導入)

 先日、Rubyで2つの文章間の類似度を計算するモジュールについての記事を書きました。

hirotsuru.hatenablog.com

 形態素解析、すなわち文章を単語に分割することは、文章を解析する上で、最初のステップとなります。この単語分割の際に用いる辞書は、日々生み出される新しい単語に対応するために更新すべきです。今回は、『mecab-ipadic-NEologd』という非常に優れたカスタム辞書を用いると、最近のホットなキーワードにもしっかり対応できるよ、というお話です。

 MeCabには、標準的な辞書として「ipadic」というものが提供されていますが、現在は継続的に更新されていないので、急に流行ったような言葉には対応できません。新しい言葉への対応の一つとして、Wikipedia 日本語版やはてなキーワードなどを取り込み、独自に辞書を定義するということをやっている方もいるみたいですが、少々手間がかかります。そこで、『mecab-ipadic-NEologd』を導入すると、新語への対応に絶大な力を発揮します。

github.com

 mecab-ipadic-NEologdには日本語のREADMEもあるので、インストール方法、使い方については、READMEを見るのがわかりやすいと思います。

 mecab-ipadic-NEologdの優れている点の一つは、その更新頻度です。下のようにかなりの頻度でcommitされています。

f:id:hirotsuru314:20160714130342p:plain

 MeCabの標準辞書を用いて解析した際に、うまく分割できない語や読み仮名の付与ができない語をなるべく追加するようにしてくれているみたいで、本当に助かります。それでは、実際にmecab-ipadic-NEologdを導入することでの変化を見てみましょう。

mecab-ipadic-NEologd導入前

 以下の文章を形態素解析してみます。

機械学習とは、人工知能における研究課題の一つであり、様々な分野への応用が期待される。その一つがビッグデータを用いたデータマイニングである。

$ mecab
機械学習とは、人工知能における研究課題の一つであり、様々な分野への応用が期待される。その一つがビッグデータを用いたデータマイニングである。

機械 名詞,一般,*,*,*,*,機械,キカイ,キカイ
学習 名詞,サ変接続,*,*,*,*,学習,ガクシュウ,ガクシュー 
と 助詞,格助詞,引用,*,*,*,と,ト,ト
は 助詞,係助詞,*,*,*,*,は,ハ,ワ
、 記号,読点,*,*,*,*,、,、,、
人工 名詞,一般,*,*,*,*,人工,ジンコウ,ジンコー
知能 名詞,一般,*,*,*,*,知能,チノウ,チノー 
における 助詞,格助詞,連語,*,*,*,における,ニオケル,ニオケル
研究 名詞,サ変接続,*,*,*,*,研究,ケンキュウ,ケンキュー
課題 名詞,一般,*,*,*,*,課題,カダイ,カダイ
の 助詞,連体化,*,*,*,*,の,ノ,ノ
一つ 名詞,一般,*,*,*,*,一つ,ヒトツ,ヒトツ
で 助動詞,*,*,*,特殊・ダ,連用形,だ,デ,デ
あり 助動詞,*,*,*,五段・ラ行アル,連用形,ある,アリ,アリ
、 記号,読点,*,*,*,*,、,、,、
様々 名詞,形容動詞語幹,*,*,*,*,様々,サマザマ,サマザマ
な 助動詞,*,*,*,特殊・ダ,体言接続,だ,ナ,ナ
分野 名詞,一般,*,*,*,*,分野,ブンヤ,ブンヤ
へ 助詞,格助詞,一般,*,*,*,へ,ヘ,エ
の 助詞,連体化,*,*,*,*,の,ノ,ノ
応用 名詞,サ変接続,*,*,*,*,応用,オウヨウ,オーヨー
が 助詞,格助詞,一般,*,*,*,が,ガ,ガ
期待 名詞,サ変接続,*,*,*,*,期待,キタイ,キタイ
さ 動詞,自立,*,*,サ変・スル,未然レル接続,する,サ,サ
れる 動詞,接尾,*,*,一段,基本形,れる,レル,レル
。 記号,句点,*,*,*,*,。,。,。
その 連体詞,*,*,*,*,*,その,ソノ,ソノ
一つ 名詞,一般,*,*,*,*,一つ,ヒトツ,ヒトツ
が 助詞,格助詞,一般,*,*,*,が,ガ,ガ
ビッグ 名詞,一般,*,*,*,*,ビッグ,ビッグ,ビッグ
データ 名詞,一般,*,*,*,*,データ,データ,データ 
を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
用い 動詞,自立,*,*,一段,連用形,用いる,モチイ,モチイ
た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
データ 名詞,一般,*,*,*,*,データ,データ,データ
マイニング 名詞,サ変接続,*,*,*,*,マイニング,マイニング,マイニング
で 助動詞,*,*,*,特殊・ダ,連用形,だ,デ,デ
ある 助動詞,*,*,*,五段・ラ行アル,基本形,ある,アル,アル
。 記号,句点,*,*,*,*,。,。,。
EOS

 上を見てわかるように、最近のホットトピックである、「機械学習」「人工知能」「ビッグデータ」「データマイニング」がそれぞれ2つの単語に分割されています。「機械学習」を「機械」と「学習」に分けられると意味が全然変わってきますよね。

mecab-ipadic-NEologd導入後

 mecab-ipadic-NEologdを導入した場合の結果を以下に示します。(コマンドのmecab-ipadic-neologdのパスは個人により異なります)

$ mecab -d /usr/local/lib/mecab/dic/mecab-ipadic-neologd
機械学習とは、人工知能における研究課題の一つであり、様々な分野への応用が期待される。その一つがビッグデータを用いたデータマイニングである。

機械学習 名詞,固有名詞,一般,*,*,*,機械学習,キカイガクシュウ,キカイガクシュー 
と 助詞,格助詞,引用,*,*,*,と,ト,ト
は 助詞,係助詞,*,*,*,*,は,ハ,ワ
、 記号,読点,*,*,*,*,、,、,、
人工知能 名詞,固有名詞,一般,*,*,*,人工知能,ジンコウチノウ,ジンコーチノー 
における 助詞,格助詞,連語,*,*,*,における,ニオケル,ニオケル
研究 名詞,サ変接続,*,*,*,*,研究,ケンキュウ,ケンキュー
課題 名詞,一般,*,*,*,*,課題,カダイ,カダイ
の 助詞,連体化,*,*,*,*,の,ノ,ノ
一つ 名詞,一般,*,*,*,*,一つ,ヒトツ,ヒトツ
で 助動詞,*,*,*,特殊・ダ,連用形,だ,デ,デ
あり 助動詞,*,*,*,五段・ラ行アル,連用形,ある,アリ,アリ
、 記号,読点,*,*,*,*,、,、,、
様々 名詞,形容動詞語幹,*,*,*,*,様々,サマザマ,サマザマ
な 助動詞,*,*,*,特殊・ダ,体言接続,だ,ナ,ナ
分野 名詞,一般,*,*,*,*,分野,ブンヤ,ブンヤ
へ 助詞,格助詞,一般,*,*,*,へ,ヘ,エ
の 助詞,連体化,*,*,*,*,の,ノ,ノ
応用 名詞,サ変接続,*,*,*,*,応用,オウヨウ,オーヨー
が 助詞,格助詞,一般,*,*,*,が,ガ,ガ
期待 名詞,サ変接続,*,*,*,*,期待,キタイ,キタイ
さ 動詞,自立,*,*,サ変・スル,未然レル接続,する,サ,サ
れる 動詞,接尾,*,*,一段,基本形,れる,レル,レル
。 記号,句点,*,*,*,*,。,。,。
その 連体詞,*,*,*,*,*,その,ソノ,ソノ
一つ 名詞,一般,*,*,*,*,一つ,ヒトツ,ヒトツ
が 助詞,格助詞,一般,*,*,*,が,ガ,ガ
ビッグデータ 名詞,固有名詞,一般,*,*,*,ビッグデータ,ビッグデータ,ビッグデータ
を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
用い 動詞,自立,*,*,一段,連用形,用いる,モチイ,モチイ
た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
データマイニング 名詞,固有名詞,一般,*,*,*,データマイニング,データマイニング,データマイニング
で 助動詞,*,*,*,特殊・ダ,連用形,だ,デ,デ
ある 助動詞,*,*,*,五段・ラ行アル,基本形,ある,アル,アル
。 記号,句点,*,*,*,*,。,。,。
EOS

 「機械学習」「人工知能」「ビッグデータ」「データマイニング」がそれぞれ一つの言葉として認識されているのがわかると思います。文章の特徴語を抽出する際や特徴ベクトルを生成したい場合には、このようにキーワードをしっかり認識できていることは非常に大事だと思います。

 あとは、mecab-ipadic-NEologdを適宜更新していくだけで、最小限の労力で新語に対応した形態素解析に取り組むことができます。

Rubyで文章間の類似度を計算するモジュールを作ってみた(TF-IDFとCos類似度による推定)

 最近、自然言語処理に興味を持ち始めました。今回は、二つの文章(テキストファイル)の類似度を計算するモジュールを作ってみました。いずれは、これを発展させていって、機械学習とかも組み込んで、Webサイトをユーザの嗜好に応じて推薦してくれるシステムとか作りたいなーって思っています。

今回の目次は以下のような感じです。

目次

なにをやるか

 ニュース記事を3つ取ってきて、その記事同士の関連がどれだけ強いのかを数値化します。比較するニュース記事は以下の三つで、それぞれ「A」「B」「C」とします。

A:自動運転、事故時の法的責任は?テスラの死亡事故問題から考える

B:グーグルが「完全自動運転」にこだわるわけ

C:【ソフトバンク】ノーバン投球の永野「一番中途半端な感じ」オチなしパフォーマンスを反省

タイトルだけ見てもわかるようにAとBは人工知能、自動運転関連の記事であり、Cは野球の記事です。AとBが関連が強く、AとCまたはBとCが関連が弱いような結果がでるものができればよしとします。

つくったもの

 今回書いたコードは下記のリンクから見れます。

github.com

 まだまだリファクタリングの余地ありまくりですが、今回はまず動くことを最優先したので、追い追い改良していきます。

 結果をさきに見てもらいます。(モジュールを使うためには事前にRuby、natto、Mecabのインストールが必要です。)カレントディレクトリに比較したい記事を入れたテキストファイルを置き、コマンドラインで叩くだけです。そうです、この部分は、かなりアナログです。ニュース記事をテキストファイルにコピペしています。

 ゆくゆくは以前の記事に書いたようなスクレイピングを使って、対象のテキストもプログラムから取ってくるようにするつもりです。

hirotsuru.hatenablog.com

コマンドラインで実行すると、値が返ってきます。後ほどまた説明しますが、この値は1に近ければ近いほど類似度が高く、0に近ければ近いほど類似度が低いことを示しています。

AとB 0.618120128908814

AとC 0.0010326528355030487

BとC 0.011337073768295269

結果を見てみると、類似性の傾向としては、望むような結果が出ており、一定の信頼度があるようです。記事の選定の時点でかなり類似性の高いものと、全く関連がないものをチョイスしているため、結果が極端ですが。

採用したアルゴリズム

 アルゴリズムと言えるほど、たいそうなものではないですが、処理の流れとしては、以下の通り。

  1. それぞれの記事からMeCabで単語だけ切り出して記事を単語リストに変換

  2. TF-IDFによる特徴語の抽出と特徴ベクトルの生成

  3. 特徴ベクトル同士のCos類似度を求める。

技術メモ

 「文章の類似性ってどう評価するんだろう?」という疑問が浮かび、いろいろ勉強しながら今回のモジュールを作りました。その作るに至るまでに学んだことを時系列順に説明したいと思います。

文章の類似度計算にはCos類似度

 まず、文章の類似度計算にはCos類似度というのがよく使われていることを知りました。Cos類似度は次の式で定義されています。

f:id:hirotsuru314:20160711104327p:plain

 ここで、aおよびbはベクトルであり、類似性の評価対象のデータです。Cos類似度では、ベクトル空間モデルにおいて、ベクトル同士の成す角の大きさでデータの類似性を評価します。つまり、角度(θ)が小さい場合、ベクトル同士が重なり合うようになるため、ベクトル同士が類似しているということになります。また、角度(θ)がゼロのとき、cosθは1になるため、cosθが1に近いほど、データの類似度が高いということになります。

 ということは、文章をベクトルで表す必要があるということ?そういうことです。

文章をベクトル化する

 文章をベクトル化する方法で、bag of words (BoW)モデルというのがあります。

Bag-of-words model - Wikipedia, the free encyclopedia

 これは、その文章にある単語が何回出現するかをカウントしていく方法です。あるニュース記事で、「プログラミング」という言葉が何回も出てくれば、この記事はIT関連かな?っていうのが予測できそうだと思います。例えば、これを広辞苑に乗っている24万語でカウントしたとします。すると、[5, 1, 0, 3,・・・ ]という具合に出現回数の配列ができます。これが紛れもなくベクトルです。この場合、文書は 24 万次元のベクトル(または空間上の座標)として表されます。

 ということは、文章を単語に分ける必要がありそうです。

文章を単語分割する

 形態素解析という難しそうな言葉がありますが、これは、簡単に言うと文章を品詞単位に分解することです。通常、英語では単語と単語の間をスペースで区切るので単語分割は容易ですが、日本語は助詞などを続けて書くのが通常ですので、話はそんなに単純ではありません。

 ここで、有効なのがオープンソースの日本語の形態素解析エンジンである『Mecab』です。

MeCab: Yet Another Part-of-Speech and Morphological Analyzer

 今回はrubyからMecabを利用するためにnattoというgemを使用しました。nattoは、形態素解析エンジンのMeCabrubyから使うためのインタフェースの役割をします。

 MecabとNattoの導入に関しては以下のリンクが参考になります。

5分でMacにMecabをインストールする方法 | Brainvalley 人工知能と脳科学のアーカイブサイト。

【簡単】RubyとMecabを使うならnattoがおすすめ! | Brainvalley 人工知能と脳科学のアーカイブサイト。

Mecabをインストールすると、下のようにコマンドラインからすぐに利用できます。

$ mecab
今日の天気は晴れのち曇り
今日 名詞,副詞可能,*,*,*,*,今日,キョウ,キョー
の 助詞,連体化,*,*,*,*,の,ノ,ノ
天気 名詞,一般,*,*,*,*,天気,テンキ,テンキ
は 助詞,係助詞,*,*,*,*,は,ハ,ワ
晴れ 名詞,一般,*,*,*,*,晴れ,ハレ,ハレ
のち 名詞,副詞可能,*,*,*,*,のち,ノチ,ノチ
曇り 動詞,自立,*,*,五段・ラ行,連用形,曇る,クモリ,クモリ
EOS

 MeCabには、標準的な辞書として「ipadic」というものが提供されており、これをもとに単語分割します。この単語分割の際にどの辞書を使うかはかなり重要です。その理由は、単語というものは常に新しいものが出てくるため、それに対応するために辞書も更新しないといけないからです。

 また、上の例を見てわかるように「の」や「は」などの助詞は文章の特徴を表さないので、今回は名詞のみをカウントするようにしました。

 ここで、一つ疑問が湧きました。単語をカウントするといっても、「今日」とか「人」のようにどんな文章にもよく出てくるものもあれば、「人工知能」や「プログラミング」のように、特定の分野の文章にしか登場しないような単語もある。これを同じようにカウントすると、うまく文章の特徴を表せないのではないか。

文書内の単語の重み付け: TF-IDFについて

 文書内の単語の重み付けにTF-IDFという手法を使います。TF-IDFでできることは、文書内での単語の重要度を評価して、文章の特徴語を抽出することです。TF-IDFについては、TFとIDFに分けて理解するとわかりやすいです。

tf-idf - Wikipedia

TF

 TFはTerm Frequencyの頭文字をとったもので「文章中にある単語が何回現れたか」のことです。

 計算式は、

  TF = 単語の登場回数 / 文章中の単語の総数

つまり、「ある文章中に、何回も出てくる言葉ほど重要」ということです。

IDF

 Inverse Document Frequencyの頭文字をとったもので、「文章群の中で、ある単語がいくつの文章に現れたか」のことです。

 計算式は、

  IDF = log(文章群中の文章の総数 /その単語が出てくる文章数)

 つまり、単語の珍しさのようなもので、「いろんな文章によく出てくる単語はそんなに重要じゃない」ということです。

 このTFとIDFをかけ合わせたものが、TF-IDFの値となり、ある文章のTF-IDF値の配列が、その文章の特徴ベクトルとなります。

 文章の特徴ベクトルまで求めることができれば、上述のcos類似度の式で、類似度を数値化することができるわけですが、あと一つ困難なポイントがあります。IDFのところで、「文章群」と書きましたが、この文章の集まりをどこから持ってくるかというのがかなり重要です。つまり、TF-IDF法では重要度を分析したい文書だけでなく,その他の関係ないたくさんの文書の集まりが必要となるわけです。

IDFに何を採用するか

 一つの方法として、評価対象のデータと同じ場所から文書を集める方法です。例えば、ニュース記事の類似度を評価したいのであれば、ニュースサイトから5000記事を取ってきて、文書群とし、IDFを算出するというようなやり方です。

 私は今回、Wikipediaから文章を取ってきました。Wikipediaは原則スクレイピングが禁止されているみたいですが、下記のリンクから、文章を全てダウンロードできるようになっています。

Index of /jawiki/

 今回はWikipediaのAbstractを抽出し、データ量が膨大すぎるので、そこからさらに文章数を絞ってDFの算出に使っています。

精度をあげるためにやりたいこと

形態素解析に用いる辞書の検討

 mecab-ipadic-NEologdというものがあることを知りました。 mecab-ipadic-NEologdは、多数のWeb上の言語資源から得た新語を追加することでカスタマイズした MeCab 用のシステム辞書みたいです。その他にも、Wikipediaはてなキーワードなどを導入したりして新語に対応した辞書を作っているみたいです。

GitHub - neologd/mecab-ipadic-neologd: Neologism dictionary based on the language resources on the Web for mecab-ipadic

IDF算出に用いる文書群の検討

 今回は、WikipediaのAbstractを使いましたが、ここの選択が結果に大きく影響を与えることは間違いないので、いろいろ試してみたいと思います。

単語の出現位置

 単語が文章中のどの位置に出現するかということも取り込めたら、精度が上がりそうな気がします。例えば、大事なことは、最後の方に出てくるとか。どんなアルゴリズムで実装できるかはわかりませんが。

今後やること

 まだまだ精度をあげるための工夫は必要ですが、文章の特徴ベクトルが求められるようになったということは、それなりに汎用性があると思います。未知の文章でも、今回の方法で特徴ベクトルを作れば、k-meansなどで実装した分類器にかけて、文章のカテゴライズなどもできるはずです。

   今後は、今回作ったものをベースに、より高度なアルゴリズムの導入とクローラーと併せてWebアプリ化をやっていきます。最終的には、ユーザに応じてどの記事を読んだら勉強になるかを優先順位をつけて推薦してくれるようなシステムを作りたいです。結局はGunosyとかがやっていることと同じですが、それを「学び」に特化した形でやりたいと思っています。

Rubyで始めるクローラー開発とスクレイピング & 為替情報を取得してみる。

 近年「ビッグデータ」 という言葉が急速に流行し、 注目を集めています。ビッグデータとは、そのまま解釈すると膨大なデータのことですが、インターネット上の私たちの行動履歴もビックデータの重要な一部となっています。例えば、Googleでキーワードを検索する、Webページにアクセスする、アクセス先で商品を購入する、FacebookTwitterに書き込むなど、近年のインターネット社会では日々あらゆる履歴が蓄積されています。このような流れは、更なるインターネットの普及やIT技術の発展により、今後も加速していくことが容易に予想され、ビジネス界においては、蓄積されたデータをどのように活用していくかが成功のカギとなることは間違いないでしょう。

 一言に「データの活用」と言っても、そこにはいくつかのプロセスが存在します。データを集める→集めたデータを分析する→有益な情報を抜き出す→得られた結果をフィードバックする、などのプロセスです。今回は、このプロセスの中でも最初の一歩となる『データを集める』についてのお話です。データを集める際に、人間が手作業で集めていたのでは、時間もかかるし効率が悪いですよね?それをコンピュータに行わせることができたらとても便利ですし、そもそも人間に比べてはるかに処理能力が高いコンピュータを用いることで、データの収集効率も飛躍的に向上させることができます。今回の記事では、クローラー開発の概要や基本的な知識について書き、最後に非常に簡単なクローラを使って、Yahoo!ファイナンスから為替情報を取得してみます。

今回の目次はこんな感じです。

目次

クローラースクレイピング

 データ収集において、非常に重要なキーワードとして「クローラー」と「スクレイピング」が挙げられます。クローラーとは、システムが自動的にWebページを巡回して情報(文章や画像など)を収集するプログラムのことです。スクレイピングとは、収集したデータから特定のデータを抽出する技術・行為のことです。

 クローラーの構造は大きく3つの機能に分類できます。

①コンテンツの取得(クローリング)

②データの抽出(スクレイピング

③データの保存

したがって、スクレイピングクローラーの機能の一つとなります。

Rubyによるクローラー開発

 Rubyは国産のオブジェクト指向スクリプト言語として、今や世界で広く使われていますが、Rubyクローラー開発にもとても適しています。その理由の一つが、クローラー開発に利用できるライブラリが充実していることです。ここでは、代表的なライブラリを3つ紹介します。

・open-uri

 Rubyのダウンロードライブラリの定番です。Rubyにはファイルを開くための組み込みメソッドとして、openメソッドというものがあります。openメソッドは通常、ファイル名を引数に取りますが、open-uriにより引数にURLを指定できるようになります。そうすることで、ごく普通のRubyスクリプトで簡単にHTTPアクセスが行えるようになります。open-uriは標準添付ライブラリであるため、Rubyが利用可能であればすぐに使うことができます。

library open-uri (Ruby 2.1.0)

・Nokogiri

 NokogiriはRubyスクレイピングする際によく使われるライブラリです。HTMLやXMLの構造を解析でき、特定の要素を指定して取り出すことができます。このようなものをHTML・XMLパーサーと呼びます。Nokogiriの特徴は、XPathCSSセレクタを使って要素を抽出できる機能を持つことです。使い方は、下記のチュートリアルを見るのが一番いいと思います。

www.nokogiri.org

・Anemone

 Ruby製のクローラーフレームワークです。クローラーが必要とするデータの取得、解析、保存のすべての機能を備えている優れものです。下記のリンクでGitHubを見てみると2012年頃に開発が停止しているようですが、現在でも広く利用されているようです。

GitHub - chriskite/anemone: Anemone web-spider framework

クローラーは何かと注意が必要である。

 クローラーは短時間にサイトに大量のリクエストを送るため、悪用すればサイトへの攻撃にもなり得ます。また、クローリングの対象となるWebサイトは著作物であるため、著作権に関しても留意しておく必要があります。クローラー開発における注意事項については下記の記事にまとまっているので、参考にして下さい。

qiita.com

qiita.com

そもそもクローラーを作る必要があるのかをまず考える。

 どういうことかというと、「クローラーはできる限り作らない方がよい。」ということです。前述のように何かと注意が必要であるクローラーは、他の方法で目的を達することができるなら、なるべく避けたほうがよいみたいです。何かしらデータを収集したい場合は、まず以下のことを考慮するとよいと思います。

APIの活用ができないかを検討する。

 AmazonFacebookTwitterなど大手サイトの多くはAPIを提供しており、APIを利用することで目的のデータを取得できるケースが増えています。APIで目的が達成できる場合は、APIを積極的に利用したほうがよいでしょう。

 クローリングの対象サイトがAPIを提供していない場合や、APIではどうしても取得できないデータを集めたいときに初めてクローラーの作成を検討します。APIについては以下の記事がまとまっています。

qiita.com

APIではどうしても取得できないデータを集めたい」ということはけっこう出てくると思います。例えば、Amazonでは、ランキングやセール情報などはAPIでは取得できないようです。

RSSの利用ができないか検討する。

 RSSとはWebサイトの見出しや要約などのメタデータを構造化して記述するXMLベースのフォーマットのことです。Amazonではページの下の方にRSSフィードへのリンクがあります。

f:id:hirotsuru314:20160626212744p:plain

 RSSフィードXML形式で記述されているため、コンピュータが理解しやすく、プログラムから取得や解釈が容易であるという特徴があります。したがって、クローラーを作成する際はできるだけRSSを利用する方が、より簡単かつ効率よくデータの収集ができます。また、サイト運営側としても、クローラーがHTMLページを巡回するよりも、RSSフィードからデータを取得される方が負荷が少なく好ましいようです。

(補足)

wgetコマンドというものがあり、これを使うと、UNIXコマンドラインで HTTP や FTP 経由のファイル取得を行えます。やりたいことがWgetのみで完結する場合は、わざわざRubyクローラーを開発する必要はなく、クローリングをWgetに任せるのも一つの方法です。

http://girigiribauer.com/archives/925girigiribauer.com

Yahoo!ファイナンスから為替情報を取得する。

Yahoo!ファイナンスhttp://info.finance.yahoo.co.jp/fx/detail/?code=USDJPY=FX)から米ドル/円のBid(売値)とAsk(買値)を取得してみます。

f:id:hirotsuru314:20160626212748p:plain

 取得にはNokogiriを使います。(Nokogiriは事前にインストールする必要があります。)以下にコードを示します。

require 'nokogiri'
require 'open-uri'

url = 'http://info.finance.yahoo.co.jp/fx/detail/?code=USDJPY=FX'
doc = Nokogiri::HTML(open(url))
bid = doc.xpath("//*[@id='USDJPY_detail_bid']").text
ask = doc.xpath("//*[@id='USDJPY_detail_ask']").text
puts "Bid(売値):#{bid}"
puts "Ask(買値):#{ask}"

これをターミナルで実行すると

Bid(売値):102.313
Ask(買値):102.317

という結果が出てきて、上のWebページと同じ値が返ってきます。このようにNokogiriを使えば10行足らずのコードでデータを取得したりできます。

 コードを上から見ていくと、まずは必要となるライブラリの読み込み。次に、対象となるWebページのURLを変数urlに格納する。docの部分では、open-uriライブラリを読み込んでいるため、openメソッドに直接URLを渡せます。

 次にXPathを指定して、取り出す要素を決めています。XPathについては以下の記事が参考になります。

1.XPath の基本 1 | TECHSCORE(テックスコア)

 要は、HTMLソースコードを観察し、タグを階層的に指定するわけです。Google Chromeでは、ページで右クリックし、「検証」をクリックすると下図の右のように、HTMLソースコードが出てきます。そこで、取得したい要素を階層的にたどっていき、見つけたらまた右クリックして「Copy」→「Copy XPath」でXPathをコピーできます。

f:id:hirotsuru314:20160626212753p:plain

 最後のputsは出力の部分です。どうでしょうか?これを応用するといろいろできそうですよね?

 気づいたかも知れませんが、今回のものはクローリングの部分が機能していません。今回は目的のページが一つに決まっていて、ページ指定のクローラーを作りました。一方、クローラーとしての本領を発揮するのは、不特定のページから条件にあてはある情報を抜き出すようなケースだと思います。この場合は巡回のルールを自分で決めていくわけですが、先に紹介したAnemoneを使うと、巡回機能も比較的簡単に実装できるので、興味がある方は試してみてください。私も今後より高度なクローラを開発し、また記事に書きたいと思います。

今後やりたいこと

・Crondなどを使ってクローラーを自動化してみたい。

クローラーをWebアプリ化して、取得した情報をブラウザを介して見れるようにしたい。

・官公庁のオープンデータを使ってデータ分析をしてみたい。

参考書

 クローラー開発に必要なことはすべて下記の本から学びました。私のような初心者でもスクレイピングなどの比較的高度なタスクが行えるようになり、本当に楽しく勉強させてもらいましたし、とてもワクワクしました。本当に最高の本だと思います。よければ読んでみてください。(本の内容を理解するためには多少のRubyの基礎知識が必要です。)

Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例

Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例

非エンジニアによる人工知能と機械学習の話 & scikit-learnで回帰分析もやってみる。

 現在、人工知能(Artificial Intelligence; AI)という言葉が、新聞やWebニュースで見かけない日がないほど盛り上がりを見せています。人工知能は、近年の目まぐるしい発展により、もはや研究の分野だけに留まらず、私たちの身近な生活にまで押し寄せてきています。iPhoneに搭載されている音声対話システムである『Siri』やロボット掃除機の『ルンバ』などはその一例に過ぎません。これからの世界は人工知能によって、どう変わっていくのでしょうか?

 人工知能という名前はよく聞くし、なんかすごいことができるんだろうなーということはわかる。でも実際何ができるの?人工知能って人工で人間の脳のようなものを作るの?という曖昧な理解の方も多いと思います。また、IT関連の勉強している方々の中には、人工知能に興味があるから実際に自分でもやってみたいという方々も多いでしょう。私もその一人であり、興味が抑えきれず、最近人工知能関連の本を読みあさりました。今回は、非エンジニアである私が、最近学んだことをまとめてみました。また、記事の最後には、実例としてPython機械学習ライブラリであるscikit-learnを使って、簡単な回帰分析をやってみました。機械学習を触り始めるのって、そんなにハードルは高くないよっていうお話です。

 下記の目次から興味のあるところだけでも読んでみてください!

目次

人工知能の現状と将来

人工知能とは何か?

 実は、人工知能とは何か?という疑問は、一言で答えられるほど単純な話ではありません。その解釈や定義は人工知能の研究をしている方々の間でも様々です。人工知能の研究でとても有名である東京大学の松尾豊先生の定義では「人工知能とは、人工的につくられた人間のような知能、ないしはそれをつくる技術」とされています。これだけではまだ何のことかピンときませんよね?

 そんな何とも理解しがたい人工知能ですが、すでに世の中には『人工知能を搭載した商品』や『人工知能を使ったシステム』と称されるものが数多く出回っています。それらは本当に人間のような知能を持つと言えるのでしょうか?私は最近の人工知能ブームを受けて、ずっと疑問がありました。ルンバだって人間のように自分で考えているわけじゃないんじゃないか?数多くのインプットされている行動パターンから最適の行動を選択しているだけなんじゃないか?そういった疑問が常にあり、ずっともやもやしていましたが、最近少しずつそのもやもやがとれてきました。どうやら、人工知能の研究には『強いAI』と『弱いAI』という二つの立場が存在するようです。

強いAIと弱いAI

 両者を簡単に説明すると、強いAIというのは人間の知能そのものをコンピュータで実現しようという立場であり、弱いAIというのは、人間のような知能をもつ必要はなく、限定された領域において問題解決や推論ができるコンピュータを作ろうとする立場です。世間ではこの強いAIと弱いAIがごちゃまぜになって議論されているため、よくわからなくなります。

 ここで整理すると、弱いAIというのはすでに開発されており、ロボット掃除機のルンバや人間のチャンピオンを破るまでに発展したチェス・将棋・囲碁人工知能はこれにあたります。一方、強いAIはまだ開発されていません。したがって、「人間のように考えるコンピュータ」はまだできていない。というわけです。そもそも人間が考えるとは何か?というところを突き詰めていくとその知能の原理すら解明されていません。なので、コンピュータに人間のような知能を持たせることは、現時点では不可能ということになります。しかし、人間の脳も平たく言えば電気回路と同じであるため、人間の知能をコンピュータで実現できないわけがないという考え方もあります。このように人間の知能の原理を解明し、それを工学的に実現しようということが強いAIの立場であり、人工知能研究の本来の目的とも言えます。

世に出回っている弱いAIについて

 これまでのところで、現在世に出回っている人工知能は、人間のような知能を持つものではないことがわかりました。それでは何をもって人工知能と呼ばれているのでしょうか?

 それを理解するために、ここで一つ例を挙げます。人間と対話するためのシステムを考えます。例えば、そのシステムには100個のボキャブラリー(返答のパターン)が用意されていて、「こんにちは」と投げかけると、「こんにちは」と返してくれる。しかし、少し高度な質問をすると、たちまち会話が成り立たなくなる。これを人工知能と言えるのか、というとほとんどの人が言えないと答えるでしょう。しかし、システムが持つボキャブラリーの数が1億個になったらどうでしょう?極めて多彩な回答ができ、ほぼ確実に会話が成り立つ状態になれば、その見方も変わってくるでしょう。(実際にiPhoneのSiriは人工知能と称されています)つまり、そのシステムが人工知能と呼ぶかどうかは、そのシステムが人間の知的なタスクをどれだけまねできているかどうかにかかっているように思えます。システムがきちんと人間が行う知的タスクをまねできていれば、そのシステムがあたかも人間のように考えているように見え、それを人工知能と呼んでいるというわけです。

 とはいえ、現在の世の中で人工知能と呼ばれているものには様々なレベルのものが混在しています。システムが人間らしく振る舞う上では、何かしらの『入力』に対して、臨機応変に『出力』が変わることが必要であり、その入力と出力を関連付けるアルゴリズムが非常に重要となります。実際にそのアルゴリズムにごく単純な制御プログラムを搭載しているだけで、マーケティング的に人工知能という言葉を積極的に使っているものもあるでしょう。一方、あとから説明する機械学習や深層学習などの極めて高度なアルゴリズムを利用し、コンピュータがビックデータをもとに自ら学習しているようなものも存在します。

現状、人工知能は人間を超えているのか。

 前述したように本当の意味での人工知能、すなわち人間のように考えるコンピュータというものはまだできていません。人間の持つ知能というものは深遠で、いまだコンピュータのはるか手の届かないところにあります。現時点で開発されている人工知能は、基本的には、決められた処理を決められたように行うことしかできず、例外に弱く、汎用性や柔軟性がありません。

 とはいうものの、一部の領域において人工知能が人間の能力を凌駕していることは認めざるを得ない事実です。2016年3月、Googleが開発した囲碁人工知能「アルファ碁」は、世界トップ級のプロ棋士を破りました。また、金融市場では、すでにコンピュータによる取引が人間を上回っています。株などの高速トレードはどんなに熟練したトレーダーでも数秒はかかりますが、これをコンピュータなら1秒の1億分の1のナノ秒スケールで行うことができるようになってきています。

 このように、現状の人工知能では汎用性がなく、行うことができるタスクは多くありませんが、一部の領域において、人間を超えつつあります。これらの技術革新は、今後の世界の発展に大きく寄与することが期待される一方で、人々の不安も煽っています。

人工知能は人間の仕事を奪うのか。

 人工知能において、社会的な懸念や負の影響についての議論も盛んに行われています。その代表的な話として、人工知能が人間の仕事を次々と奪い取っていくのではないかと心配する声があります。一部のタスクにおいて人間を上回りつつある人工知能の存在は、人間が機械に置き換えられるという想像をかきたてます。さらには、人間の仕事を奪うだけでなく、人類の安全を脅かすといったSFのような近未来に対して警鐘を鳴らす声も少なくありません。

 現在人間が行っている知的作業のうち、今後機械によって代替が可能なものが多くあるのは事実でしょう。例えば、今後さらに自然言語処理が発達すると、コールセンターのオペレータ業務は、機械によって完全に自動化されるでしょう。また、人工知能だけの話ではありませんが、ロボットにより、人間が行う肉体労働も、置き換えられるでしょう。

 ただ、私は、人工知能は人間の仕事を奪うのではなく、人間の働き方を変える。一部では置き換えられたとしても、それ以上に新しい仕事も生む。と考えます。

 こんな興味深い予測があります。「2011年度にアメリカの小学校に入学した子どもたちの65%は、大学卒業時に今は存在していない職業に就くだろう」。(米デューク大学のキャシー・デビットソン)

 この「今は存在していない職業」の多くを人工知能が生むと思います。それは、インターネットが登場したことにより世の中に多くの職業を生み出したことを思い出すと、容易に想像できます。

機械学習による回帰分析

機械学習とは何か?

 機械学習とは、膨大なデータから、何らかの計算処理によって、そのデータに潜む規則性を見つけ出し、予測や分析に用いる手法の総称です。現在の人工知能の応用は機械学習に属する技術に支えられています。

 機械学習を利用したシステムはすでに世に溢れており、最初の商業的な成功例は、Google検索エンジンです。Googleの情報検索には機械学習にもとづくアルゴリズムが利用されています。また、AmazonやNetflixは、機械学習を利用して消費者の好みにあった商品や映画などを提案しています。

人工知能は意外と簡単に使える?

 人工知能はそれ自体を研究しようとするには、かなりハードルが高いように思えます。しかし、最近では様々な人工知能にまつわるライブラリやAPIが出てきたため、利用するハードルは下がってきています。今回はPythonによる機械学習ライブラリであるscikit-learnを使ってみます。

scikit-learn: machine learning in Python — scikit-learn 0.17.1 documentation

scikit-learnで線形回帰をやってみる

 何かしらの相関関係がある2つの変数(x, y)を考えます。(ここでxは説明変数、yは目的変数などと言われます。)

 線形回帰とは、与えられたデータを直線(もしくは平面、超平面)でフィットさせる手法のことです。フィットさせるアルゴリズムはいくつかありますが、今回は最も基本的な最小二乗法を使った方法を紹介します。

 最小二乗法をかなりざっくり言うと、与えられたデータの1点1点とモデルによる計算値がどれだけずれているかを調べ、すべての点において計算値とのずれ(誤差)を2乗したものを足しあわせて、その和が一番小さくなるように近似しようという感じです。2乗にするのはプラスとマイナスの誤差が打ち消し合わないようにするためです。

 今回はあくまで、scikit-learnを触ってみるのが目的なので、データとして、自ら乱数で作成したものを用います。

 必要となるツールのインストールについては割愛します。また、すべてIPython Notebook上で行っています。

hirotsuru.hatenablog.com

 まず必要となるモジュールを読み込みます。

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

from sklearn import datasets
from sklearn.linear_model import LinearRegression

最小二乗法を使った回帰分析には、sklearn.linear_modelのLinearRegressionを使うので、個別に読み込んでいます。 次に乱数により100個のランダムデータを作成し、散布図を描きます。

np.random.seed(0)
sample_data = datasets.make_regression(100, 1, noise=30)

plt.scatter(sample_data[0], sample_data[1])

f:id:hirotsuru314:20160527093603p:plain

このような散布図を直線でフィットしてみます。まず、LinearRegressionクラスのインスタンスを作り、lin.fit()の部分でデータを元にモデルを作っています。

lin = LinearRegression()
lin.fit(sample_data[0], sample_data[1])

では、フィットした直線を散布図上に描いてみましょう。

xr = [-2.5, 2.5]
plt.plot(xr, lin.coef_ * xr + lin.intercept_)
plt.scatter(sample_data[0], sample_data[1])

f:id:hirotsuru314:20160527093619p:plain

最後に得られたモデルの係数、切片、決定係数を表示します。ここで、決定係数とは、どれだけうまくフィットができているかを示しており、0から1の値を取ります。

print("係数: ", lin.coef_)
print("切片 : ", lin.intercept_)
print("決定係数 : ", lin.score(sample_data[0], sample_data[1]))

=>
#出力結果
係数:  [ 43.08728116]
切片 :  -2.44254548109
決定係数 :  0.647309178092



 今回はscikit-learnで非常にシンプルな回帰分析をやってみました。機械学習を触り始めるのはそんなにハードルが高くないことが分かったと思います。scikit-learnでもっと高度な分析をやってみたいという方は、英語ですが、scikit-learnのドキュメントには有用な情報がたくせん載っています。

1.1. Generalized Linear Models — scikit-learn 0.17.1 documentation

おわりに

 今回は、人工知能関連の知識のまとめと、機械学習ライブラリを用いた簡単なデータ分析をやってみました。人工知能の分野では、今まさに数十年来のブレイクスルーが起きており、今後も飛躍的な進歩が期待されています。人工知能の進歩は、既存の分野のビジネスチャンスを広げるだけでなく、未開の分野を開拓する可能性も秘めています。したがって、この分野の知識や技術を高めることは、エンジニアとしてひいてはビジネスパーソンとして競争優位に立てるのは間違いありません。これかも私が学んだことを積極的にアウトプットしていこうと思います!

hirotsuru.hatenablog.com

Pythonで株価データを取得し、Matplotlibで可視化する。

はじめに

 株価データは、代表的な時系列データの一つですが、Pythonはこの時系列データを取り扱うのを非常に得意としています。特に、Pythonライブラリの一つであるpandasはもともと金融データを扱うために開発されたため、時系列データの分析に強力な機能を数多く備えています。

 今回やることは非常にシンプルで、下記の2点だけです。(すべてIPython Notebook上で行っています。)

 1. Google Financeからトヨタの株価データを取得する。

 2. 取得した株価データを時系列データとしてプロットする。

株価データの取得

 まず始めに、下記のように必要となるライブラリをインポートします。

import pandas as pd
from pandas import Series, DataFrame
import numpy as np

import matplotlib.pyplot as plt
%matplotlib inline

 最後の1行は、描画するグラフをIPython Notebook上にそのまま埋め込むために書いたものです。

 pandasの標準機能であるDataReaderを使えばYahooやGoogleなどから簡単に株価を取得できます。

#from pandas.io.data import DataReader
from pandas_datareader.data import DataReader #モジュールが変わったため変更
from datetime import datetime

end = datetime.now()
start = datetime(end.year - 1, end.month, end.day)
toyota = DataReader('TM', 'google', start, end)

toyota.head()


f:id:hirotsuru314:20170527100205p:plain

 ここで、注意してもらいたいのが、今回Google Financeから取得したデータは、東京証券取引所のものではなく、ニューヨーク証券取引所つまりアメリカの株式市場の情報です。今回はより簡単に株式データを取得するため、Google Finance が提供しているAPIを使いました。(実際に、日本の株式市場のデータを取得するためには、少し手間はかかりますが、スクレイビングでできます。)

 上記のコードでendとstartはいつからいつまでのデータを取得するかを決めています。endをnow(現在)として、startを現在から1年前までとしています。つまり1年分の株価データを取得しています。取得したデータは"toyota"に格納しており、表のようなデータが入っていることがわかると思います。ここで最後の行のheadは、データのうち5行分だけを表示するために書いたものです。

株価データの可視化

 MatplotlibはPythonでグラフを描画するときに非常に便利なライブラリです。今回プロットに使うデータは、上の表でCloseのカラムのデータです。
 次のように1行書くだけで簡単に株価を時系列データとして描くことができます。

toyota['Close'].plot(legend=True, grid=True)

f:id:hirotsuru314:20170527095926p:plain

おわりに

 今回は、Pythonを用いて株価データの取得とその可視化という非常にシンプルな作業を行いました。現在、Pythonは金融・経済データの実践的な分析ツールとして絶大な力を持っており、非常に注目されています。Pythonによるデータ分析を極めていくと、人工知能を使って、システムトレードで大儲け、なんてこともできるかもしれませんね。次回は、複数の企業の株価を比較し、その相関関係を分析するといった過程を書きたいと思います。

 ちなみに、Pythonでデータ分析をするならオライリーの下の書籍が一番いいです。NumPyやpandasを使ったデータ分析がかなり詳しく解説されています。特に今回のような時系列データを取り扱うノウハウは網羅されており、他に同じような書籍は見当たらないため、Pythonでデータ分析をやりたい人にとってはほぼ一択と言っていいと思います。

Pythonによるデータ分析入門 ―NumPy、pandasを使ったデータ処理

Pythonによるデータ分析入門 ―NumPy、pandasを使ったデータ処理

IPython Notebook(Jupyter)って何ができるの?

 最近IPythonまたはIPython Notebookという言葉をよく目にします。私も最初はなんじゃそれ?って感じでしたが、これを使い始めてその便利さに感動を覚えました。今回はその感動を共有したいと思います。

 記事を読んで頂くと、IPython Notebookって何?という方や、名前は聞いたことはあるけど結局何がいいの?という方が、IPython Notebookでどんなことができるかが何となくわかるような内容になっていますので、興味のある方は読んでみてください。

*IPython NotebookはPythonのためのNotebookでしたが、現在は、Pythonだけでなく多言語にも対応しているため、Jupyterという名前に変更されています。

IPython Notebookのインストールはこちらから↓

Installing IPython — IPython

私はAnacondaで、Numpy、SciPy、pandas、matplotlibなどのパッケージを一括インストール・管理しています。



目次

IPython Notebookとは?

 IPython NotebookとはPythonをブラウザ上でインタラクティブ(対話的)に実行できるツールです。インタラクティブっていうのはどういうことか、例を見てみましょう。

f:id:hirotsuru314:20160511185246p:plain

 このように、コードを入力すると、即実行され結果が返ってくる、そしてまた新たにコードを入力する、これがインタラクティブということです。データ分析のためのコーディングの多くは、データ探索や試行錯誤の繰り返しからなります。IPythonのインタラクティブという特徴によって、コードを書く→実行する→データ探索というサイクルに乗ってデータ分析を進めることができるため、作業の高速化に強く寄与します。このような特徴からIPythonはPythonによる科学技術計算作業にはなくてはならない存在となりつつあります。

高度な計算が電卓のように使える。

 さきほど、IPythonで四則演算や累乗をやってみましたが、mathパッケージを読み込めば、いろいろな関数を使うことができます。ここでは例として三角関数を呼び出してみます。(例は関数電卓レベルの計算です。)

In [1]: import math
        from math import sin, pi
        sin(pi/2)

Out[2]: 1.0



表示機能が充実。

 セルと呼ばれる入力部分にはコードだけでなくMarkdown記法で記述ができます。また、LaTeX記法によって数式も簡単に挿入できます。

f:id:hirotsuru314:20160511185531p:plain

数式はこのように書いています。

$ \sqrt{a+b} $

$x^2 - 6x + 1 = 0$

$\displaystyle \lim_{x \to \infty} f(x)$



簡単にグラフが書ける。

 Matplotlibと連携していて、グラフを簡単にノートブック上に埋め込むことができます。

import numpy as np
import matplotlib.pyplot as plt
% matplotlib inline

x = np.arange(0, 10, 0.1)
y = np.cos(x)
plt.plot(x,y)

f:id:hirotsuru314:20160511185615p:plain

多くの優れた科学技術計算用ライブラリを使用できる。

 IPythonではNumPy、SciPyといった科学技術計算に優れたライブラリを簡単に使用できます。 以前の記事でもポアソン分布を描く際に、NumPyとSciPyを利用しています。

hirotsuru.hatenablog.com

ノートブックを共有できる。

 作成したノートブックはHTMLやPDF、スライドとして出力可能です。また、Jupyter Notebook Viewerを使えば、GitHub経由で、ノートブックをWeb上で公開、共有できます。以下に手順を示します。

 Jupyter上でノートブックを拡張子「.ipynb」として保存します。

f:id:hirotsuru314:20160511190001p:plain

そしてGitHub Gistに保存したノートブックをドラック&ドロップするだけで、公開・共有ができます。

f:id:hirotsuru314:20160511185935p:plain

私のオススメの使い方

 オススメの使い方は、IPython Notebookを勉強ノートとして活用することです。特に、プログラミングの勉強ノートには最適です。私の利用例として今回の記事の元となった勉強ノートを公開します。

IPython勉強ノート.ipynb · GitHub

 私はもともとPythonRubyの勉強ノートとしてEvernoteKobitoを使っていたのですが、最近Jupyterに乗り換えました。コードと実行結果、メモが同時に一つの画面に残せるのはプログラミングの勉強において、とても便利です。ちなみにRuby用にはIRuby Notebookがあります。

github.com

終わりに

 IPython Notebookが非常に多機能で便利だということが少しは伝わったでしょうか。実際にはまだまだ非常に便利な機能が数多く備わっており、今の私の手には余りすぎる状態です。

 IPython Notebookは、本格的な科学技術計算をする場合だけでなく、Python を初めて利用し、対話形式の環境で楽しく Python を学習する場合にも非常にオススメです。ぜひ使ってみてください!

 下の本には非常に多くのIPythonの活用例がのっているのオススメです!

データサイエンスを始めました!

 この度、データサイエンスの勉強を本気で始めようと決意しました!今回は、なぜやるか、なにをやるかなどをつらつらと書いていきます。

 勉強を始めて改めて実感しましたが、IT関連の分野ってほんとに広大ですね。そんな中で、それなりの結果を出そうとしたら、ある程度本気で取り組むものを絞った方がいいはずだ、とわかってはいるのですが、私は勉強に関してはやりたいことが溢れて止まらなくなります。すでにいろんなものに手を出してしまい収拾がつかなくなってきました。

 そこで、これからの方針としてWebアプリケーション開発(主にRubyRails)とデータサイエンスの二本柱でいくと決意しました!

目次

データサイエンスとデータサイエンティスト

 そもそも、データサイエンスとは何か。以下、Wikipediaからの引用です。

 データサイエンス(data science)とは、データに関する研究を行う学問である。 使用される手法は多岐にわたり、分野として数学、統計学、計算機科学、情報工学パターン認識機械学習データマイニング、データベース、可視化などと関係する。

 データサイエンスの研究者や実践者はデータサイエンティストと呼ばれる。データサイエンスの応用としては、生物学、医学、工学、社会学、人文科学などが挙げられる。

 うーん、難しそうですね。次に、データサイエンティストについて調べてみました。しかし、データサイエンスティストはその業界内でも定義が曖昧で、統一的な見解がないみたいです。参考までに一般社団法人データサイエンティスト協会というところのデータサイエンティストに対する解釈を下記に示します。

 データサイエンティストとは、データサイエンス力、データエンジニアリング力を ベースにデータから価値を創出し、ビジネス課題に答えを出すプロフェッショナル

また、この協会はデータサイエンティストのミッションについても明記しています。

   現在、情報技術革命が進む中にあって、センサの数が激増し、人類の計算キャパシテ ィは幾何級数的に拡大しております。また、ブロードバンド化に伴い、ネットワークの 接続スピードは劇的に高まり、情報トラフィックも激増しております。携帯電話、WiFi などのワイヤレスネットワークが広がることに伴い、これまで拾い上げられることが できなかった粒度の情報もリアルタイムで拾い上げることが可能となりました。 このような時代に求められるのは、人間を数字入力や情報処理の作業から開放する プロフェッショナル人材であり、「データの持つ力を解き放つ」ことが新しい時代に おけるデータプロフェッショナル、すなわち「データサイエンティスト」のミッション だと考えます。

 なんかめっちゃくちゃかっこいいですね。ただ、ここでわかったことは、データサイエンティストには、とにかく幅広い知識が必要だということ。また、データサイエンティストは、さまざまな手法を駆使してデータを分析することで世の中に存在する問題を解決する知見を導き出すプロフェッショナルだということです。プログラミング初心者の私がいきなりここを目指すのはおこがましいですが、膨大な知識が必要なら志すのも早い方がいいかなってことで、このデータサイエンス分野の勉強に本気で取り組んでいこうと思います。

 

なぜやるか

あらゆる業種・分野でデータ分析へのニーズが高まってきている。

 本格的なビックデータ時代を迎えた今日、データ分析はこれまでとは異なる局面を迎えています。例えば、Amazon楽天といったEC業界では、業務やサービスの中で自社で蓄積した顧客に関するあらゆるデータを分析することで、顧客の「行動パターン」を見つけていき、「いつ」「誰に」「何を」「どうやって」提案すれば最大の効果を生み出せるか、その組み合わせを改善し続けています。このようにデータをいかに上手く活用し、ビジネスにフィードバックするかが、未来の成功には必要不可欠となってきているようです。

 また、データ分析を活用したいと考えているのはIT業界だけではありません。私はもともと大学・大学院で実験化学を専門に研究してきたのですが、学術分野では膨大なデータの分析が求められます。私自身も研究時代は多くの実験データを取り扱っていました。しかしながら、私を含め、化学の世界にデータサイエンスに精通した人材は見たことがありません。データサイエンスを取り込むことで、実験データからこれまでは到底知りえなかった新たなルールやパターンを抽出できたり、解析が短時間で行えるようになりロジカルシンキングの方に多くの時間が割けるようになったり、そんなことができたらとても幸せなことだなーと思います。ただし、実際に化学者が自分の専門の勉強や研究だけでも手一杯な中で、膨大な知識が必要なデータサイエンスをやることはあまり現実的ではないように思えます。なので、一度化学をリタイアした私がやります。もしデータサイエンスに精通した人間になれれば、必ずどんな分野にでも大きな利益をもたらすことができると思います。

わりと向いてそうな気がする。

 化学で修士号を取得し、博士課程に進学した私は、そこそこ数字に強いです。また、化学、ひいては科学でデータサイエンスがどういかせるかといったニーズは実経験で何となくわかります。そのような理由から、勘違いかもしれませんが、私はデータサイエンスに向いてそうな気がします。そもそも、大量の数字の羅列を見たり、複雑なグラフを見たりすると何となくワクワクするので、それだけでも適正があるのかもしれません。

 

なにをやるか

 さて、それでは具体的に何をやるかです。少し前だと「マイクロソフトAccessExcelでデータ分析を」なんてことがやられてたみたいですが、それでは膨大かつ複雑なデータは扱えない。ということでPythonを使ってみようと思います。データサイエンスでよく用いられる言語としては、pythonの他にRっていうものがあり、統計解析向けのプログラミング言語として有名なようです。実際に「データ分析 R python」などと調べたら、両者を比較しているサイトが数多く見られます。それらを読んだところ、総じて「現時点ではRの方が機能が充実しているが、これからはpythonが熱い!」的な内容が多かったように思えます。

  readwrite.jp

   正直、どちらの言語が優れているかや、将来性があるかなどは私なんぞにはわかりませんが、pythonの方がとっつきやすそうだなっていう単純な理由でpythonにしました。実際にpythonを始めてみて、いろいろ調べてみるとNumPy, pandas, matplotlib, IPython, SciPyといったデータ分析に有効なライブラリが充実しているみたいなので、そのあたりを一つ一つ触っていきたいと思っています。

実際に少し触ってみた

 実際にPythonを少し触ってみました。まず、Jupyter(旧iPython Notebook)というPythonインタラクティブ実行環境をブラウザ上で実行するためのツールをインストールしました。

  jupyter.org

   Jupyterをインストールしたらterminalで「ipython notebook」とコマンドを打つだけで、ブラウザが立ち上がりJupyterが起動します。

  f:id:hirotsuru314:20160507210532p:plain

  実際に簡単な計算やprintメソッドを使ってみると、こんな感じです。

  f:id:hirotsuru314:20160507215907p:plain

これがインタラクティブ(対話的)ってやつですね。ただ、これだけではRubyirbと何ら変りない。そこでPython特有のライブラリを使ってみます。NumPyというライブラリをインポートして、2行4列の配列を作り、掛け算をしてみました。

  f:id:hirotsuru314:20160507215826p:plain

 非常に簡単ですね。さらにPythonにはSciPyという科学技術計算のためのライブラリもあるようなので使ってみます。

 

SciPyでポアソン分布を描いてみる

 ポアソン分布とは確率分布の一つです。以下Wikipediaから

 所与の時間間隔で発生する離散的な事象を数える特定の確率変数 X を持つ離散確率分布のこと。

 式で表すと、

f:id:hirotsuru314:20160507210612p:plain

となり、これは「ある期間に平均してλ回起こる現象が、ある期間にちょうどk回起きる確率の分布」です。

 なんか難しそうですね。もっとざっくり言うと、「ある時間の間に、あるイベントが起きる回数」についてのグラフです。ただし、いくつか条件があります。例えば、イベントがあまり頻繁に起こらないこと、それぞれのイベントは独立していることなどです。(ちなみに化学では、ポアソン分布は高分子の分子量分布のところで登場します。)

 ここで一つ簡単な例を示します。「ある定食屋さんはこれまでの経験から昼のピーク時に1時間で平均15名のお客さんが来ることがでわかっている」この条件のときのポアソン分布を描いてみたいと思います。

 最初は上に書いた式をもとにグラフを書こうとしましたが、scipy.statsの中にpoissonというそのままのモジュールが用意されていました。したがって、非常に簡単にグラフの描写ができます。

f:id:hirotsuru314:20160507215028p:plain

 簡単にポアソン分布が描けました!

 これによって、例えば、ピーク時にお客さんが10名だけ来る場合の確率を求めるといったことができます。(あくまで理論値ですが、)

終わりに

 今回はデータサイエンスを本気で勉強するという私の決意表明です。(自分へのプレッシャーです。)実際に、Pythonを触ってみましたが、いろんなことができそうで、ワクワクしています。

 次回から私がデータサイエンスで学んだことをどんどん発信していきますので、興味がある方は見てください!