Jupyter Notebook上でデータサイエンスの「あれやりたい」ときのライブラリ


この記事

python、いろいろなデータサイエンス向けのライブラリがあるんですが

  • プロットしたいんだけど!
  • 検定処理やりたいんだけど!
  • データフレームの加工やりたいんだけど!

といった基本的なことにどんなライブラリがあるのか紹介します。

お願い: 編集リクエストで項目増やしたり、オススメ教えてください。

データ加工

pandas

(SQLで有名な)リレーショナルモデルのような形式の「データフレーム」によってデータを保持し
これに対するフィルタ、マッピング、グループ化などの機能を提供します。
ついでにデータの読み込み・書き出しのためのインタフェイスも豊富に備えています。

csvを読んで、そのうち '売上' の項目が 1000 以上である物だけを残すサンプルは以下のようになります。

import pandas as pd
data = pd.read_csv("data.csv")
over_1000 = data[ data['売上'] > 1000 ]

線型代数的な処理

numpy

import numpy as np
# リストから行列生成
mat = np.matrix([[1, 2], [3, 4]])
# リストからベクトル生成
vec = np.array([5, 6])
# 行列積をとる
mat.dot(vec)

乱数生成

numpy

numpyは線型代数の処理も含む広範な基礎的処理を提供してくれてます。この中には分布に従った乱数生成も入っています。

たとえば正規分布に従う乱数列は以下のように生成できます

import numpy as np

mu, sigma = 2, 0.5
v = np.random.normal(mu,sigma,10000)

プロット

グラフを描画するのに使えるライブラリ

matplotlib

様々なグラフを描画する機能を提供してくれます。比較的低レイヤーのライブラリなのでseabornなどと組み合わせて使うことになるでしょう。

import numpy as np
import matplotlib.pyplot as plt
x = np.arange(-3, 3, 0.1)
y = np.sin(x)
plt.plot(x, y)

seaborn

Searbornはmatplotlibをラップして、もっと簡単にきれいなグラフを描く方法を提供してくれるライブラリです。
たとえばヒートマップなどを描画する機能を提供します。

import numpy as np
import matplotlib
# seabornをimportした時点でmatplotlibのグラフはseabornスタイルのきれいなグラフになる
import seaborn as sns

x = np.random.normal(size=100)
sns.distplot(x);

統計的検定

scipy

scipyは科学技術計算に必要な処理を提供してくれるライブラリです。
このライブラリは実際にはかなり広範な機能を提供してくれているので、大抵のやりたいことはここをさがせば見つかったりするかもしれません。

t検定を以下のように実施できます。

import numpy as np
from scipy import stats

a = np.random.normal(0, 1, size=100)
b = np.random.normal(1, 1, size=10)
stats.ttest_ind(a, b)

記号微分

sympy

代数的計算を自動的にやってくれるライブラリです。つまり式変形の類を丸投げできるライブラリです。(ところで知ってる方が居れば: これって中身は項書き換え系ですか?)

用途としてここでは記号微分を挙げておきます。

import sympy as sym

# 変数を準備
x = sym.symbols("x")
# 多項式を立てて……
f = x**3 + 2*x**2 - x + 5
# 微分する
df_dx = sym.diff(f, x)

統計モデルの作成

statsmodels

統計モデルの作成に便利なライブラリです。

以下は一般化線形モデルを生成する例して、その基本的統計情報を見る例です(AICなどが出ます)

import numpy as np
import pandas as pd
import statsmodels.api as sm
import statsmodels.formula.api as smf

df = pd.read_csv("data.csv")

formula = 'Sales ~ AccessCount + MailSendedCount'
mod = smf.ols(formula=formula, data=df)
res = mod.fit()
res.summary()

scikit-learn

メモ

(順次内容増やす。)