こんにちは、えびかずきです。
今回は、NumPyで統計処理をする方法についてまとめていきたいと思います。
こんな人におすすめ:
・NumPyに組み込まれている統計関数の使い方を知りたい。
・NumPy_統計でググってここに辿り着いた。
NumPyといえば行列とかベクトルとかの処理に強い数値計算のライブラリですが、統計向けの関数が割と揃っています。
Pythonで統計処理をするなら、知っておいて損はありません。
一般的にPythonで統計処理をする場合、SciPyのstatsモジュールがメインになりますが、サブでNumPyの関数を使いこなすことは効率的に開発を進める上で必須です。
そこで、ここでは自分のための備忘録の意味合いも込めて、一度NumPyの統計関連の関数についてまとめておきたいと思います。
開発環境
Python 3.7.3
NumPy 1.20.2
Jupyter Notebook
統計で使える基本的な関数リスト
項目 | 関数 | 備考 |
合計 | sum(a) | |
平均 | mean(a) | |
分散 | var(a) | ddofで自由度を指定 |
標準偏差 | std(a) | ddofで自由度を指定 |
最大値 | amax(a) | |
最小値 | amin(a) | |
最大値のindex | argmax(a) | |
最小値のindex | argmin(a) | |
中央値 | median(a) | |
相関行列 | corrcoef(a1,a2) | |
分散共分散行列 | cov(a1,a2) | ddofで自由度を指定 |
ランダム抽出 | random.choice(a) | sizeでサイズ指定,replace=Falseで重複抽出を回避 |
使用例
ここでは関数の使用例を紹介します。
なお、ここでは以下のようにnumpyが事前に読み込まれていることを前提にソースコードを紹介していきます。
# numpyをインポート
import numpy as np
合計(sum)
合計は、sum関数を使います。
# テストデータの読み込み
test_data = np.array([2,3,3,4,4,4,4,5,5,6])
# 合計を算出
result = np.sum(test_data)
print(result)
# output:40
平均(mean)
平均は、mean関数を使います。
test_data = np.array([2,3,3,4,4,4,4,5,5,6])
# 平均を算出
result = np.mean(test_data)
print(result)
# output:4.0
分散(var)
分散は、var関数を使います。
引数のddofはDelta Degrees of Freedom(自由度の差分)を意味します。
普通の標本分散が算出したいなら、ここは「0」を指定します。
デフォルトも0なので実際には指定しなくて良いです。
もし、不偏分散を算出したい場合は、ここを「1」に指定します。
この二つ以外を指定することが極めて稀でしょう。
test_data = np.array([2,3,3,4,4,4,4,5,5,6])
# 標本分散を算出
result = np.var(test_data, ddof = 0)
print(result)
# output:1.2
標準偏差(std)
標準偏差は、std関数を使います。
ここでも引数のddofはDelta Degrees of Freedom(自由度の差分)を意味します。
ここもデフォルトは0なので、普通の標準偏差を計算したい場合は、指定する必要がありません。
一方、不偏分散の平方根を算出したい場合は、ddof=1と指定します。
test_data = np.array([2,3,3,4,4,4,4,5,5,6])
# 標準偏差を算出
result = np.std(test_data, ddof = 0)
print(result)
# output:1.0954451150103321
最大値(amax),最小値(amin)
最大値の取得はamax関数、最小値はamin関数を使います。
aの意味はarray(配列)です。
test_data = np.array([2,3,3,4,4,4,4,5,5,6])
# 最大値を取得
result = np.amax(test_data)
print(result)
# output:6
numpy.maxとnumpy.amaxの違いについて:
両者に動作面での違いはありません。
numpy.maxは単にnumpy.amaxの別名(いわゆるエイリアス)なので、どちらを使っても同じ関数が呼び出されます。
aminとminも同様です。
最大値,最小値のindex(argmax,argmin)
最大値のインデックスの取得はargmax関数、最小値のインデックスはargmin関数を使います。
argの意味は引数(argument)。
ややこしいですが、ここでの引数とはプログラミングというより数学的な文脈で使われるものに近いです。
つまり配列の要素と、インデックスという引数とが、関数のような関係性にあるというイメージです。
test_data = np.array([2,3,3,4,4,4,4,5,5,6])
# 最大値のインデックスを取得
result = np.argmax(test_data)
print(result)
# output:9
共分散
共分散を取得したい場合は、
下の例のように分散共分散行列の[0,1]もしくは[1,0]位置の要素を参照します。
分散共分散行列はcov関数で実装されています。
covは共分散(co-variance)の意味です。
x = np.array([185,187,191,197,215,217,218,220,234,238])
y = np.array([34,39,41,38,45,41,52,44,44,49])
# 分散共分散行列
result = np.cov(x, y)
print(result)
# output:
# [[364.622,76.733]
# [76.733, 28.011]]
# 共分散の取り出し
print(result[0,1])
# output:76.733
相関係数
相関係数を取得したい場合は、
下の例のように相関行列の[0,1]もしくは[1,0]位置の要素を参照します。
相関行列はcorrcoef関数で実装されています。
x = np.array([185,187,191,197,215,217,218,220,234,238])
y = np.array([34,39,41,38,45,41,52,44,44,49])
# 相関行列
np.corrcoef(x, y)
print(result)
#output:
#[[1.,0.759219]
#[0.759219, 1.]]
# 相関係数の取り出し
print(result[0,1])
# output:0.759219
ランダム抽出
ランダム抽出は、random.choice関数を使います。
下のようにsizeでサイズを指定できます。
また、replace=Falseとすれば重複した抽出を回避できます。
test_data = np.array([2,3,3,4,4,4,4,5,5,6])
# ランダムに要素を3つ抽出
result = np.random.choice(test_data, size=3, replace=False)
print(result)
# output: [4 4 6]
補足
残念ながらNumPyに最頻値(mode)を求める関数はありません。
代わりにSciPyのstatsモジュールで以下のようにして取得できます。
stats.mode(a)
最大値と最小値のメソッド
最大値と最小値はメソッドを使って取得する方法もあります。
以下の例のように、ndarray.max()という風にすれば、最大値を取得できます。
もちろん最小値はndarray.min()で取得できます。
test_data = np.array([2,3,3,4,4,4,4,5,5,6])
# 最大値のインデックスを取得
result = test_data.max()
print(result)
# output:6
まとめ
今回はNumPyで使える様々な統計関数の使い方をまとめました。
Pythonで統計処理をするなら、ここに示した関数くらいはさすがに頭に入れておいた方がいいですから覚えておきましょう。
参考
・NumPyの公式ドキュメント
左上の検索窓に「numpy.var」という感じで関数を入力すると、その説明が詳しく出てきます。
・Pythonで学ぶ新しい統計学の教科書
書籍だと入門者にはこれがおすすめ。
Pythonの使い方だけでなく、初学者向けに統計の解説が一緒に記載されている。
ただし、sumやmeanなどの関数を非推奨のscipyで実装していることに注意が必要。
将来的にはscipy 2.0.0移行では使えなくなるので、本記事のようにNumPyで実装することをお勧めします。
コメントを書く