データ分析を便利にするJupyter notebookとPandas

アイキャッチ

こんにちは、小澤です。

今回は、Jupyter notebookとPandasの導入的な話をしようと思います。

とは?の話

Jupyter notebookもPandasもすでに「とは?」を書く必要がないくらい有名どころかもしれませんが一応書いておきます。 とはいえ、今回はこんなものがあるよというご紹介程度の内容となるので、この「とは?」がメインコンテンツとなります。

どちらもpipからインストール可能ですが、Anacondaを利用すると、グラフ描画用のmatplotlibも別途インストールする必要がなくなるため、 今回はAnaconda3-4.2.0を利用しているものとします。

Jupyter notebookとは

ブラウザ上で、REPLのようなインタラクティブにプログラムを実行するためのものです。

スクリーンショット 2017-05-12 16.00.15

Jupyter notebookを立ち上げるとブラウザから画像のような環境にアクセスできます。 セルと呼ばれる単位でプログラムを記述していき実行すると結果はそのすぐ下に表示されます。 セル内には任意の長さのプログラムをかけますし、好きなだけ数を増やすことも減らすこともできます。また、一度実行したものを変更することも可能です。

notebookeはipynbの形式(実体はjson)で保存されるため、他者と共有することも可能ですし、 githubやgistに上げると以下のようにレンダリングしてくれます。

スクリーンショット 2017-05-12 16.33.51

また、同様のものでIPython notebookと呼ばれることもありますが、こちらは旧名称です。 かつてはPythonのみが利用可能でしたが、現在ではほかの言語でも利用できるようになっており、名称もPythonに特化したものではなくJupyterとなっています。

簡単に使ってみると以下のような感じになります。

スクリーンショット 2017-05-12 18.30.15

プログラムを実行するには、各セルの中でCtrl-Enterを押します。 その直後に実行結果が表示されます。

画像中に含まれる文章の部分はmarkdonwで記述しています。 特定のセルをプログラムではなく、markdownを記述する用に変更するには上部メニューから「Code」になっている部分を「Markdown」にへんこうします。

スクリーンショット 2017-05-12 18.14.27

セルの追加には上部メニュー「+」ボタンを押します。

スクリーンショット 2017-05-12 18.15.41 2

Jupyterではこれらや、その他様々な操作にショートカットキーを利用できます。 利用可能なショートカットキー一覧はメニューのキーボードのようなアイコンをクリックすることで確認できます。

スクリーンショット 2017-05-12 18.15.41 3

また、Jupyterではmatplotlibという、Pythonのグラフ描画用ライブラリを利用して作成したグラフをインラインで表示させたり、 markdown中にMathJaxを使った数式の表示も可能です。

スクリーンショット 2017-05-12 18.38.24

その他、ここでの紹介は割愛しますが、JupyterにはExtensionという機能を拡張するものがあり、それを導入することで様々なことが可能になります。 気になった方は調べてみてください。

Pandasとは

Pandasはデータフレーム形式で、データを扱うものになります。 データフレームとは、RDBのテーブルやCSV, Excelのテーブルのような形式です。 列方向に各項目を保持して、行方向に実際に観測されたデータを記録していきます。ここの値は行列の交差した部分になります。

data-format

実際にpandasでデータを読み込んでみるとこの形式で保持していることがわかります(pandasのコードについては後ほど解説します)。

$ python
Python 3.5.2 |Anaconda 4.2.0 (x86_64)| (default, Jul  2 2016, 17:52:12) 
>>> import pandas as pd
>>> pd.read_csv('iris.data', names=['sepal_length', 'sepal_width', 'petal_length', 'petal_width', 'species'])
     sepal_length  sepal_width  petal_length  petal_width         species
0             5.1          3.5           1.4          0.2     Iris-setosa
1             4.9          3.0           1.4          0.2     Iris-setosa
2             4.7          3.2           1.3          0.2     Iris-setosa
3             4.6          3.1           1.5          0.2     Iris-setosa
4             5.0          3.6           1.4          0.2     Iris-setosa
5             5.4          3.9           1.7          0.4     Iris-setosa
6             4.6          3.4           1.4          0.3     Iris-setosa
7             5.0          3.4           1.5          0.2     Iris-setosa
8             4.4          2.9           1.4          0.2     Iris-setosa
...
...

PandasをJupyterから利用するとテーブル形式に整形して表示してくれます。

スクリーンショット 2017-05-12 17.52.58

pandasはこのようにテーブルのような形式でデータを扱うため、データに対する操作もSQLとの対比で行うのがわかりやすいかと思います。 いくつかの操作に関して、pandasではどのように行うのかを見てみましょう。

まずは、列の絞り込みです。 SQLでは「SELECT petal_length, petal_width, species FROM ...」のように必要な列のみを選択する方法です。

単一カラムで絞り込む場合は、文字列で列名を指定します。

iris['species']

スクリーンショット 2017-05-17 10.30.13

この例では結果がテーブルの形式で整形されていません。 このように、列が1つの場合に利用可能な型として、DataFrameではなくSeriesという型で表すことができます。

配列で列名を渡すことで複数選択可能です。

iris[['sepal_length', 'species']]

スクリーンショット 2017-05-17 10.33.51

SQLでいう、LIMITとOFFSETを利用したい時には、配列のように数値で範囲を指定します。

iris[47:53]

スクリーンショット 2017-05-17 10.36.00

UNIONのような操作はappendが利用できます。

# appendを実行するためにテーブルを2つに分ける
iris1 = iris[:75]
iris2 = iris[75:]

# appendの実行
iris1.append(iris2)

スクリーンショット 2017-05-17 14.20.27

JOINを実現するmergeを利用します。

# mergeの動きを見るためにテーブルを2つに分ける
iris1 = iris[['sepal_length', 'species']]
iris2 = iris[['sepal_width', 'species']]

# mergeの処理を実行
pd.merge(iris1, iris2, on='species')

スクリーンショット 2017-05-17 14.23.55

GROUP BY相当の処理にはgroupby関数と、どのような集計を行うかの関数を実行します。

iris.groupby('species').mean()

スクリーンショット 2017-05-17 14.27.10

Pandasでは、これら個々の処理を組み合わせていくことで、様々なデータフレームに対する操作を行うことが可能です。 また、plot系の関数を呼び出すことで、matplotlibを利用したデータの可視化も可能です。

iris.plot.scatter('petal_length', 'petal_width')

スクリーンショット 2017-05-17 14.30.28

終わりに

今回はJupyter notebookとPandasの紹介をしました。 これらにはまだまだ様々な機能がありますが、今回は紹介として簡単な機能のみにとどめておきます。 より詳しく知りたくなった方は

などが参考になるかと思います。