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
正直何に使うのかよくわかりませんが、上記のような値が返ります。
モーメントについて
モーメントについてよくわからないため調べると以下の記事が見つかります。
- 確率論 モーメント とモーメント母関数 - Qiita
- Microsoft PowerPoint - #04積率
- モーメント (数学) - Wikipedia
- モーメント母関数の定義と使い方。モーメント母関数から期待値と分散を求めてみよう | アタリマエ!
モーメントは積率とも呼ばれ、期待値、分散、歪度、尖度といかのような関係があります。
- 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)
以上です。
コメント