データサイエンティスト・データエンジニアのための Python ライブラリ一覧

データ分析やデータ加工、機械学習などを行うのに便利な Python ライブラリを紹介する。

## なぜ Python なのか

統計や機械学習をするなら、 R という選択肢もある。 R のデータの加工や集計、統計処理に優れた言語であり、言語標準の機能だけでかなりのことができる。機械学習のライブラリも充実しており、有力な選択肢であることは間違いない。 R と比較して Python が優れている点は、周辺エコシステムの充実にある。 Python エコシステムはデータサイエンスの分野に留まらない。 NumPy や Pands で加工したデータを Django を使った本格的な Web アプリケーションで利用することも可能だ。

## ライブラリ群のインストール

ここで挙げているライブラリのほとんどは [Anaconda](https://www.continuum.io/) で一括でインストールできる。

## データ加工
### NumPy
NumPy は数値計算を効率的に行うためのライブラリ。ここでは1次元配列を例にしているが、多次元配列にも対応可能だ。ベクトルや行列計算を高速に行うことができる。

```py3
In [1]: import numpy as np # NumPy のインポート

In [2]: arr = np.asarray([n for n in range(10)]) # ベクトルの作成

In [3]: arr # 出力
Out[3]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

In [4]: arr * 10 # データの加工
Out[4]: array([ 0, 10, 20, 30, 40, 50, 60, 70, 80, 90])
```
[NumPy — NumPy](http://www.numpy.org/)

### Pandas

Pandas は NumPy を拡張したライブラリで、データの読み込みや欠損値処理など、機械学習の前処理には欠かせない機能を持っている。 `DataFrame` というオブジェクトをがあり、データの加工やマージを簡単に行うことができる。 R の `data.frame` に近い。

```py3
In [1]: import pandas as pd # Pandas のインポート

In [2]: df = pd.DataFrame({ # データフレームの作成
   ...: 'A': [n for n in range(5)],
   ...: 'B': ['male', 'male', 'female', 'female', 'male'],
   ...: 'C': [0.3, 0.4, 1.2, 100.5, -20.0]
   ...: })

In [3]: df
Out[3]: 
   A       B      C
0  0    male    0.3
1  1    male    0.4
2  2  female    1.2
3  3  female  100.5
4  4    male  -20.0

In [4]: df.describe() # 基本統計量の出力
Out[4]: 
              A           C
count  5.000000    5.000000
mean   2.000000   16.480000
std    1.581139   47.812101
min    0.000000  -20.000000
25%    1.000000    0.300000
50%    2.000000    0.400000
75%    3.000000    1.200000
max    4.000000  100.500000

In [5]: df[df['B'] == 'female'] # サブセットの呼び出し
Out[5]: 
   A       B      C
2  2  female    1.2
3  3  female  100.5
```

[Python Data Analysis Library — pandas: Python Data Analysis Library](http://pandas.pydata.org/)

## レポート、可視化
### jupyter

Jupyter Notebook は Python の実行環境で、コードの内容と出力結果が記録されるため、探索的にデータの加工や統計処理を行うコーディング環境として利用できる。また、レポートの作成やスライドとしても出力可能。

![](http://jupyter.org/assets/jupyterpreview.png)

[Project Jupyter \| Home](http://jupyter.org/)

### matplotlib

matplotlib はグラフ描画ライブラリ。棒グラフ、散布図、ヒストグラムなど、様々なグラフに対応している。

[Matplotlib: Python plotting — Matplotlib 2\.0\.2 documentation](https://matplotlib.org/)

### plotly

plotly は matplotlib よりもリッチでインタラクティブなグラフを描画することができる。作成したグラフは plot.ly で共有することも可能。

<div>
    <a href="https://plot.ly/~kohei_kimura/9/?share_key=VoMfoGVGcPL2ATlGiYvhDB" target="_blank" title="Plot 9" style="display: block; text-align: center;"><img src="https://plot.ly/~kohei_kimura/9.png?share_key=VoMfoGVGcPL2ATlGiYvhDB" alt="Plot 9" style="max-width: 100%;width: 600px;"  width="600" onerror="this.onerror=null;this.src='https://plot.ly/404.png';" /></a>
    <script data-plotly="kohei_kimura:9" sharekey-plotly="VoMfoGVGcPL2ATlGiYvhDB" src="https://plot.ly/embed.js" async></script>
</div>

[Python Graphing Library, Plotly](https://plot.ly/python/)

## メッセージング、ストリーム処理
### Kafka-Python

Kafka-Python は名前の通り、 Apache Kafka の Python クライアント。

```py3
from kafka import KafkaConsumer
import json

consumer = KafkaConsumer('topic', bootstrap_servers='localhost:9092')

for msg in consumer:
    data = json.loads(msg.value.decode())
    print(data)
```

### PySpark

Spark や Kafka はビッグデータには欠かせない存在となった。 MLlib という機械学習ライブラリが存在する。

[Python Programming Guide \- Spark 0\.9\.0 Documentation](https://spark.apache.org/docs/0.9.0/python-programming-guide.html)

## 機械学習
### scikit-learn

scikit-learn は機械学習ライブラリ。流行りのニューラルネットワークだけでなく、他のアルゴリズムも利用できる。また、機械学習を行う上で必要になってくる訓練データと検証データへの分割や交差検証、グリッドサーチなどの機能も有し、かゆいところに手が届くライブラリになっている。機械学習ライブラリを触るなら、まずはこれから。

[scikit\-learn: machine learning in Python — scikit\-learn 0\.18\.2 documentation](http://scikit-learn.org/stable/)

### TensorFlow

ご存知ディープラーニングライブラリ。

[TensorFlow](https://www.tensorflow.org/)

### Keras

Keras は TensorFlow や CNTK 、 Theano などに対応したラッパー。

[Keras Documentation](https://keras.io/)

## おすすめ書籍

### [O'Reilly Japan \- Pythonによるデータ分析入門](https://www.oreilly.co.jp/books/9784873116556/)
Pandas の作者による著書。 Pandas の使い方とデータ分析手法を学ぶことができる。 NumPy や matplotlib などの周辺ライブラリもカバーしている。

### [O'Reilly Japan \- Pythonではじめる機械学習](https://www.oreilly.co.jp/books/9784873117980/)
scikit-learn の作者による著書。 scikit-learn の使い方と機械学習に必要なエンジニアリングを学ぶことができる。

## Python を飛び出す

もしあなたが Pandas でデータをこねくり回したり機械学習ライブラリのチューニングだけに満足しないのであれば、 Python のエコシステムを飛び出す必要があるだろう。データの世界は深淵にして広大であり、エンジニアがデータサイエンティストをフォローするにはより広い範囲をカバーしておく必要がある。具体的には Hadoop, Spark, Apex などの分散処理基盤や、 BigQuery や TreasureData などのフルマネージドな DWH についても抑えておくと、活躍の場は広がるだろう。

- [ストリーム処理で文章内にある単語の出現頻度をカウントする\(Apache Apex\) \- 駄文型](http://koheikimura.hatenablog.com/entry/2017/06/07/190000)
- [fluentdコンテナをDockerで立ててRailsのログをTreasureData by IDCFに保存する \- 駄文型](http://koheikimura.hatenablog.com/entry/2016/12/22/155509)