NumPyで用意されている数学関数、統計関数は、ndarrayの配列全体および一部に対して統計処理をおこなうことができる。

今回はNumPyのあらゆる統計関数について紹介しよう。

randn関数を使ってサンプルデータを生成

まずはサンプルデータとして、randn関数を使って標準正規分布(ガウス分布)データを生成する。

rand関数と混同されがちなrandn関数だが、同じ乱数生成関数でも以下のように出力される結果は全く違う。

import numpy as np

sample1 = np.random.randn(4, 5)

# 平均値0、標準偏差1の正規分布した乱数を生成
# array([[-0.02776289,  0.3304908 ,  0.66238155,  1.51053973,  0.96823941],
#        [ 0.29526553,  0.82655862,  0.42368541,  0.24814073,  0.68781292],
#        [ 0.29518087, -0.51560602,  0.37310941,  0.57533529,  0.10978753],
#        [ 2.06806716,  0.71465671, -0.46698317, -0.18243506,  0.60399627]])
sample2 = np.random.rand(4, 5)

# 0〜1の範囲内で乱数を生成
# array([[0.27892618, 0.41062025, 0.26002768, 0.1375287 , 0.2407081 ],
#        [0.84165516, 0.63152174, 0.17065274, 0.4356197 , 0.81404647],
#        [0.45682   , 0.91877611, 0.71523087, 0.71300009, 0.49448955],
#        [0.56491664, 0.62646928, 0.64547697, 0.03154633, 0.54968903]])

今回はrandn関数を使ったサンプルデータを使っていく。

算術平均を計算するmean関数

先ほど生成したsample1配列に対してmean関数を適用すると、配列の要素全体の算術平均を求めることができる。

sample1.mean()
# 0.4750230405412764

なおmean関数は、どの軸を中心に処理を適用するかを引数axisに指定することができる。

sample1.mean(axis=1)
# array([0.68877772, 0.49629264, 0.16756142, 0.54746038])

sample1.mean(axis=0)
# array([0.65768767, 0.33902503, 0.2480483 , 0.53789517, 0.59245903])

二次元配列の場合、axisに1を指定すると列ごと、0を指定すると行ごとの平均値を求めることができる。

合計を計算するsum関数

sum関数はndarrayの値の合計を求めることができる。

sample1.sum()
# 9.500460810825528

sample1.sum(axis=0)
# array([2.63075068, 1.35610011, 0.99219321, 2.15158069, 2.36983612])

sample1.sum(1) # axisは省略可
# array([3.4438886 , 2.48146322, 0.83780708, 2.73730191])

mean関数同様、axis引数により処理対象の軸を指定することができる。

分散、標準偏差を求めるvar関数、std関数

var関数はndarrayの分散を、std関数は標準偏差を求めることができる。

これらの関数についても引数axisで対象となる軸を指定することが可能だ。

sample1.var()
# 0.34893171157228753

sample1.var(axis=0)
# array([0.68044344, 0.27731381, 0.18235768, 0.38756812, 0.09585204])
sample1.std()
# 0.5907044198008743

sample1.std(axis=0)
# array([0.82488996, 0.52660593, 0.42703358, 0.62254969, 0.3095998 ])

最小値、最大値を求めるmin関数、max関数

min関数、max関数は、それぞれndarrayのうち、最小値、最大値を求めることができる。

こちらも引数axisの指定が可能だ。

sample1.min()
# -0.5156060209743792

sample1.min(0)
# array([-0.02776289, -0.51560602, -0.46698317, -0.18243506,  0.10978753])

sample1.max()
# 2.068067160790721

sample1.max(1)
# array([1.51053973, 0.82655862, 0.57533529, 2.06806716])

最小・最大値を持つインデックスを返すargmin関数、argmax関数

min関数、max関数では値そのものを返したが、argmin関数、argmax関数ではそれぞれ最小・最大値を持つ要素のインデックスを求めることができる。

sample1.argmin()
# 11

sample1.argmax()
# 15

累積和、累積積を求めるcumsum関数、cumprod関数

ndarrayの累積和、累積積を求める場合、cumsum関数、cumprod関数を使用する。

これらの関数は単純に集計結果を返すものではなく、途中経過を含めた計算結果を配列として返す。

sample1.cumsum()
# array([-0.02776289,  0.30272791,  0.96510946,  2.47564919,  3.4438886 ,
#         3.73915414,  4.56571275,  4.98939817,  5.2375389 ,  5.92535182,
#         6.2205327 ,  5.70492668,  6.07803609,  6.65337138,  6.7631589 ,
#         8.83122606,  9.54588278,  9.07889961,  8.89646455,  9.50046081])

sample1.cumprod()
# array([-2.77628859e-02, -9.17537837e-03, -6.07760133e-03, -9.18045829e-03,
#        -8.88888148e-03, -2.62458034e-03, -2.16936950e-03, -9.19130214e-04,
#        -2.28073646e-04, -1.56872001e-04, -4.63056145e-05,  2.38754536e-05,
#         8.90815649e-06,  5.12517677e-06,  5.62680483e-07,  1.16366103e-06,
#         8.31618168e-07, -3.88351688e-07,  7.08489648e-08,  4.27925102e-08])