目次


データ・サイエンス入門, 第 4 回

データ・サイエンスの言語

Comments

コンテンツシリーズ

このコンテンツは全#シリーズのパート#です: データ・サイエンス入門, 第 4 回

このシリーズの続きに乞うご期待。

このコンテンツはシリーズの一部分です:データ・サイエンス入門, 第 4 回

このシリーズの続きに乞うご期待。

問題を解決するための基盤となるのは、プログラミング言語と環境ですが、すべての言語がまったく同じように作られているわけではありません。ハイパフォーマンスのデータ分析には C 言語と C++ 言語が一般的に使われている一方、Python を使用すると、プログラマーは当面の問題をより生産的に処理することができます。ビッグ・データ処理には固有のフレームワークと言語があります。それは、データ・サイエンスにしても同じです。この記事では、データ・サイエンスで使用されている主な言語をいくつか取り上げ、それぞれの詳細と利点を調べます。

実際的観点から言えば、データ・サイエンスには、どのプログラミング言語でも使用できます。けれども言語の中には、データ・サイエンスのコンテキストでとりわけ役立つものがあります。実際のところ、このコンテキストで特に役立つと認められた言語に関しては、データ・サイエンス機能の面で進化が重ねられて、データ・サイエンスに一層適した言語に成長しています。この記事ではデータ・サイエンスに使用されている言語を 3 つのカテゴリーに分けて、それぞれのカテゴリーでとりわけよく使われている言語について詳しく探っていきます。図 1 に、この記事で分類している言語のカテゴリーを示します。

図 1. データ・サイエンスの言語のカテゴリー
縦に並んだ列として示されている 3 つのカテゴリーの図
縦に並んだ列として示されている 3 つのカテゴリーの図

「Language (言語)」は、データ・サイエンスにおいて使用されているものの、必ずしもデータ・サイエンスを目的に設計されたわけではないプログラミング言語のカテゴリーです。「Languages with ecosystems (エコシステムを伴う言語)」は、データ・サイエンスに役立つライブラリーとツールからなるエコシステムを伴って進化した言語のカテゴリーです。最後の「Ecosystems with languages (言語を伴うエコシステム)」は、データ・サイエンス・アプリケーションを実装するため言語を 1 つ以上サポートする、特化されたフレームワークのカテゴリーです。

言語:

C 言語は多様なアプリケーションにわたって使用されている汎用の言語です (当初はシステム・プログラミングを目的に開発されました)。この言語は、私が過去 31 年間にわたって 1 次言語として、主にベアメタル・ファームウェア開発の分野で使用している言語です。C がデータ・サイエンスに役立つ理由は 2 つあります。まず 1 つは、C は大規模な開発者基盤を持ち、開発者の間で共通してよく使われている言語であるためです。もう 1 つは、C では低レベルのプログラミング・モデルを使用していることから、最もハイパフォーマンスな言語の 1 つであるからです。実際、これから取り上げる言語のほとんどでは、パフォーマンスを向上させるために、C 言語とのバインディングを利用しています。

C では確かに数値計算のライブラリーとソースをサポートして、データ・サイエンス関連のタスクを実行する C の機能を強化していますが、Python のような言語に比べると、その力は色褪せて見えます。ただし、C のデータ・サイエンスへの貢献はそこで終わるわけではありません。この後わかるように、これから取り上げる言語の一部 (R、Julia、Python) は、少なくとも部分的には C 言語で実装されています。

エコシステムを伴う言語

このカテゴリーに属する言語は、ライブラリーやツールによって言語のエコシステムが成長したことにより、データ・サイエンスのアプリケーション開発に際して固有の選択肢となっている言語です。このカテゴリーを代表する言語としては、Python、R、Julia、そしてもちろん Fortran が挙げられます。

Python

データ・サイエンスで使用する言語として最も人気のある選択肢は Python です。Python はマルチパラダイム言語であり、当初はプログラミングを学習するための言語として使用するよう意図されていました。その意図は今でも引き継がれており、ほとんどの開発者が最初に学ぶ言語の 1 つとなっています。けれども Python は学習目的のためだけではなく、ファーストクラスのアプリケーションを開発するためにもよく使われています。Python は対話式で使用できることから、習得するのは簡単です。

Python はデータ・サイエンスの分野でその真価を発揮します。他の言語に比べ、Python にはデータ・サイエンスに使用できるライブラリーが最も包括的に含まれているため、データ・サイエンスに使うには理想的な選択肢です。とりわけ有用なライブラリーとしては、以下の 4 つが挙げられます。

  • SciPy: Python 用の科学計算ツールのセットです。最適化、積分、補間、線形代数を網羅した、効率の良い数多くの数値計算ルーチンが揃っています。
  • NumPy: 大規模な多次元配列および行列のサポートを Python に追加し、これらの構造体に対する数学関数を提供します。
  • scikit-learn: 多種多様な機械学習アルゴリズムを揃えた Python ライブラリーです。これらのアルゴリズムには、サポート・ベクター・マシン、ランダム・フォレスト、主成分分析などが含まれます。
  • Natural Language Toolkit: 自然言語をデータとして処理する Python プログラムを作成するために使用できる Python モジュールです。

R プログラミング言語

R はプログラミング言語であると同時に、統計的計算を目的とした対話型 (テキストおよびグラフ) 環境です。R が初めて登場したのは 1990 年代前半ですが、それ以来、着実にその機能を増やし、評判を高めています。R をバッチ形式で使用すると、複数の R プログラムを対話式で実行して、それらの R プログラムを段階的に定義してテストすることができます。R はマルチパラダイム言語であり、プロシージャー型とオブジェクト指向の手法をサポートしています。

Python と同じく、R の強みは、外部パッケージが提供する機能によってもたらされます。R はパッケージのコア・セットと一緒にインストールすることができる一方で、Comprehensive R Archive Network から 11,000 を超えるパッケージを入手できます。R のパッケージのほとんどは R で開発されていますが、C、Java 言語、Fortran で開発されているものもあります。R をベースに特化された環境も使用できます。その一例は、ゲノム・データの分析に焦点を絞っている Bioconductor です。

Julia

Julia はデータ・サイエンス向けプログラミング言語の仲間に新しく加わってから、まだそれほど経っていません。2009 年に初めて登場したとき、Julia で重点とされていたのは、プロシージャー型、オブジェクト指向、関数型のパラダイムをサポートする高度な計算科学でした。Julia は動的プログラミング言語であり、パラメーター多相の概念を採用しています (したがって、さまざまな型に対して抽象的に動作する関数を作成できます)。その一方で、並列処理と分散計算もサポートするように設計されています。Julia では、メッセージの受け渡しによってマルチプロセッシング環境を統合して、個別メモリー・ドメイン内の複数のプロセス内で異なる Julia プログラムを実行することができます。

Julia には独自のパッケージ・マネージャーが含まれており、現在 1,700 を超えるパッケージをサポートしています。Julia、C、Fortran で作成されたこれらのパッケージは、データ・サイエンスのあらゆる分野をカバーしています。Julia で Python 関数を呼び出すには、PyCall パッケージを使用します。C 関数については直接呼び出すことができるため、ラッパーや特殊なアプリケーション・プログラミング・インターフェースは必要ありません。

Fortran

最後にあげていますが、データ・サイエンス開発におけるハイパフォーマンスの計算と科学という点で同じく重要な言語として、Fortran があります。Fortran は、低水準のアセンブリ言語に代わる汎用の命令型プログラミング言語として、IBM によって開発されました。Fortran が定義されたのは、1954 年の「Specifications for the IBM Mathematical FORmula TRANslating System」です。その当時、IBM 704 メインフレームを焦点としていましたが、現在に至るまでリビジョンが重ねられています (次回のリビジョンは「Fortran 2018」と呼ばれる予定です)。

Fortran の数値計算ライブラリーの開発は今後も続けられ、保守されていきます。最もよく使われているソフトウェア・ツールの中には、内部で Fortran の Linear Algebra Package を使用し続けているものがあります。このことは、Fortran による変わらぬ影響を説明しています。新しいデータ・サイエンス・アプリケーションを開発する際に、Fortran は最優先される言語ではないかもしれませんが、その推進力とパフォーマンスにより、この言語は引き続きデータ・サイエンスの特定分野で存続するはずです。

言語を伴うエコシステム

このカテゴリーに属しているのは、データ・サイエンス・アプリケーションの開発を目的に複数の言語をサポートしているエコシステムです。このようなエコシステムのうち、このセクションでは Hadoop、Spark、Jupyter を取り上げます。

Apache Hadoop

Apache Hadoop は、複数の処理ノードからなるクラスター上で動作するオープンソースのデータ処理フレームワークです。Hadoop はジョブの処理と分散モデルだけでなく、 (Hadoop アーキテクチャーの設計教義として) 障害を念頭に置いて設計されたストレージ・アーキテクチャーもカバーしています。Hadoop で採用されている処理モデルは、MapReduce という特化したモデルです。

MapReduce は単純なモデルではあるものの、大規模なデータ・セットを複数のデータ・セットに分割してクラスター内の異なるノードに分配し、それらのデータ・セットを並行して処理するという見事なソリューションとなっています。MapReduce モデルは、Map と Reduce という 2 つの基本的な要素からなります。これらの要素は、クラスター全体で並行してデータを処理する関数のことです。Map 関数は、データ・セットのサブセットのキーと値のペアを処理して、ゼロ個以上のキーと値のペア (「中間ペア」と呼ばれます) を生成します。Reduce 関数は、中間ペアを取り、特定のキーの値を繰り返し処理します。この Reduce ステップによって生成されるのは、ゼロ個以上のキーと値のペアです。

MapReduce の規範的な例としては、「ワード・カウント」プログラムが挙げられます。このプログラムでは、Map ステップで、データ・セットに含まれる各単語のキーと値のペアを作成して値 1 を生成します (キーと値のペアは、その単語 (つまり、キー) のインスタンスを表すためです)。続く Reduce ステップで、その中間ペアを繰り返し処理して集計します。その結果、各単語 (キー) の合計数 (値) を表すキーと値のペアが生成されます。この例は単純ですが、このパターンは多種多様な問題に対して、さまざまな方法で適用できます。

Hadoop では、各種の言語を使用して、こういった Map 関数と Reduce 関数を作成することができます (このフレームワーク自体は、Java 言語と C で作成されています)。MapReduce 関数を作成するために使用できる言語には、Java 言語、Perl、Python、Erlang、Haskell、Smalltalk、OCaml などがあります。MapReduce モデルについては、このリンク先の IBM Analytics のページでわかりやすく説明しています。

Apache Pig という言語を使用すれば、さらに単純な MapReduce アプリケーションを作成できます。Apache Pig では、スクリプトが MapReduce 処理にまで自動的に分解されるためです。Hadoop では、Apache Mahout などのプロジェクトを使用してアルゴリズムをサポートしています。Apache Mahout は、機械学習アルゴリズムを含め、分類とクラスタリング用の線形代数および統計ライブラリーを実装するプロジェクトです。

Apache Spark

Apache Spark は、Hadoop と同じく大規模なデータを分散して処理するためのオープンソースのフレームワークです。Spark は当初、カリフォルニア州立大学バークレー校によって開発されましたが、その後 Apache Software Foundation に寄贈され、トップ・レベルの Apache プロジェクトとなっています。Spark は Hadoop に似ているものの、いくつかの違いがあります。まず、Spark は Scala (関数型言語) で開発されている一方、Hadoop は Java 言語と C で開発されています。Hadoop はサーバーのファイル・システムをベースに独自のファイル・システム (「Hadoop Distributed File System (HDFS)」と呼ばれています) も実装しますが、Spark には分散型ストレージとして HDFS が必要です。

Hadoop と Spark の決定的な違いは、データの処理方法にあります。Hadoop は主にバッチ・ベースの処理システムですが、Spark は、ストリーム配信されるリアルタイムのデータ分析をサポートします。さらに、Spark はディスクだけに依存するのではなく、データのインメモリ処理もサポートします。そのため、Spark 耐障害性分散データ・セットをメモリー内に維持すると同時に、アナリティクスのパフォーマンスを損なう可能性があるディスク I/O を最小限にすることができます。Spark では、Hadoop の 100 倍の速度 (メモリー内処理を使用)、またはディスクの使用により 10 倍の速度でアプリケーションを実行できる仕組みになっているとしています。

Spark 用のデータ・サイエンス・アプリケーションを開発するときに、Scala、Java 言語、Python、さらには R を使用することもできます。また、Spark には多数の機械学習アルゴリズムを実装する機械学習ライブラリーもあります。

Jupyter

最後に取り上げるエコシステムは、Jupyter です。Jupyter はノートブックを表すオープンソースの Web アプリケーションであり、ノートブックにはライブ・コードと、対話型要素をサポートする視覚化、方程式、そしてテキストが含まれます。こうした対話型ノートブックが興味深いのはなぜかというと、対話式ドキュメントを作成した後、そのドキュメントを共有して他の開発者たちと共同で作業できるからです。

Jupyter はサーバーとクライアントからなります。クライアントはブラウザー上で動作する JavaScript アプリケーションに過ぎません。このクライアント・ブラウザーに、サーバーが HTML ドキュメントとして公開された対話型ノートブックを渡します。ノートブックは、統計モデリングや視覚化からデータ・クレンジング、機械学習に至るまで、さまざまなデータ・サイエンス・アプリケーションを実装します。

Jupyter がエコシステムである理由は、対話型ノートブックを実装しているからではなく、各種の言語で作成されたコードをノートブック内で実行できるためです。現在、Jupyter では Python、Julia、R、Haskell、Ruby などをサポートしています。さらに、Python、Julia、または R で作成された単純なチュートリアルを使って Jupyter をテスト・ドライブすることもできます。

さらに詳しく調べてください

Fortran や C などの長年使われている言語から、R、Scala、Julia などの最新のマルチパラダイム言語に至るまで、データ・サイエンスの言語には幅広さと奥深さがあります。データ・サイエンスで最優先される言語は、今後も Python であることに変わりはないでしょう。それは Python に対応した極めて幅広いライブラリーが開発されているからです。けれどもデータ・サイエンスで使用されている言語の 1 つひとつ、そしてこれらの言語に関係するエコシステムの 1 つひとつが、データ・サイエンス向けアプリケーションを容易に構築する助けとなります。さらに、Jupyter などのエコシステムによってコラボレーションと共有も容易になります。


ダウンロード可能なリソース


関連トピック


コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=ビジネス・アナリティクス
ArticleID=1063617
ArticleTitle=データ・サイエンス入門, 第 4 回: データ・サイエンスの言語
publish-date=11292018