scipy には、moment という関数があります。
これを使うと、指定した配列のn次のモーメントを求めることができます。
試しに実行してみた結果を記載します。


Example を実行する

サイコロをイメージして、[1, 2, 3, 4, 5, 6]インプットに指定してみます。

from scipy.stats import moment
moment([1, 2, 3, 4, 5, 6], moment=1)

0.0

from scipy.stats import moment
moment([1,2,3,4,5,6], moment=2)

2.9166666666666665

from scipy.stats import moment
moment([1,2,3,4,5,6], moment=3)

0.0

from scipy.stats import moment
moment([1,2,3,4,5,6], moment=4)

14.729166666666666

正直何に使うのかよくわかりませんが、上記のような値が返ります。


モーメントについて

モーメントについてよくわからないため調べると以下の記事が見つかります。

モーメントは積率とも呼ばれ、期待値、分散、歪度、尖度といかのような関係があります。

  • 1次のモーメントは、期待値
  • 2次の中心積率は、分散
  • 3次の中心積率は、歪度
  • 4次の中心積率は、尖度

scipy skew、kurtosis で、歪度 、尖度の計算をする

scipy には、歪度、尖度を計算する関数、skew、kurtosis が用意されています。

# 歪度 を計算する
from scipy.stats import skew
skew([1, 2, 3, 4, 5, 6])

0.0

# 尖度 を計算する
from scipy.stats import kurtosis
kurtosis([1, 2, 3, 4, 5, 6])

-1.2685714285714282

skew、kurtosis 関数では内部で moment 関数が呼び出されており、モーメントと関連があることがわかります。
scipy/stats.py at master · scipy/scipy

ちなみに、describe で 1次のモーメントである平均、2次のモーメントである分散を求めることができますが、moment関数は使っておらず、numpy の処理を呼び出しています。

from scipy.stats import describe
describe([1, 2, 3, 4, 5, 6])

DescribeResult(nobs=6, minmax=(1, 6), mean=3.5, variance=3.5, skewness=0.0, kurtosis=-1.2685714285714282)

内部的には以下を実行して、平均、分散を求めています。

    # 平均
    m = np.mean(a, axis=axis)
    # 分散
    v = np.var(a, axis=axis, ddof=1)

以上です。

コメント