python scipyとnumpyで変動係数 を計算する


変動係数とは、平均に対する、データのばらつきの大きさの比率 を表す指標です。
$変動係数 = 標準偏差 / 平均$
で値を求めることができ、値が大きいほどばらつきが大きいと言えます。
numpy と、 scipy を使って変動係数を計算してみましたので、結果を記載します。


scipy を使って、変動係数を求める

scipy.stats .variation で変動係数を求めることができます。

from scipy.stats import variation
# パラメータとして設定した リストの変動係数が返される
cv = variation( [1, 2, 3, 4, 5])
print('CV:{0:2f}'.format(cv))
CV:0.471405

numpy を使って、変動係数を求める

numpy には、直接 変動係数を求める メソッドはなさそうなので、numpy.mean と、numpy.std を使って計算します。

import numpy as np
data = [1, 2, 3, 4, 5]
print('平均: {0:2f}'.format(np.mean(data)))
print('標準偏差: {0:2f}'.format(np.std(data)))
cv = np.std(x)/np.mean(x)
print('CV:{0:2f}'.format(cv))
平均: 3.000000
標準偏差: 1.414214
CV:0.471405

statistics を使って、変動係数を求める

python 3.4 から、statistics が標準ライブラリに含まれています。
statistics で直接、変動係数を求めることはできませんが、標準偏差、平均を求めるメソッドは用意されているので、それらを使って計算します。

from statistics import mean, stdev
data = [1, 2, 3, 4, 5]
m = mean(data)
stdev = stdev(data)
print('平均: {0:2f}'.format(m))
print('標準偏差: {0:2f}'.format(stdev))
cv = stdev / m
print('CV:{0:2f}'.format(cv))
平均: 3.000000
標準偏差: 1.581139
CV:0.527046

numpy、scipy で計算した結果とは値が異なりました。
stdev は、標本標準偏差 を返すようで、自由度 N - 1 の分散 の平方根になるようです。
numpy、scipy と同様の値を得るには、stdev ではなく、pstdev を使用します。

from statistics import mean, pstdev
data = [1, 2, 3, 4, 5]
m = mean(data)
pstdev = pstdev(data)
print('平均: {0:2f}'.format(m))
print('標準偏差: {0:2f}'.format(pstdev))
cv = pstdev / m
print('CV:{0:2f}'.format(cv))
平均: 3.000000
標準偏差: 1.414214
CV:0.471405

numpy、scipy で求めた、変動係数と一致しました。


参考

以下、参考にした記事になります。
* scipy.stats.variation — SciPy v1.1.0 Reference Guide
* 変動係数(CV)とは何か。その意味と求め方について。データを比較評価する比率の知恵【σ・u・sのどれを使うべき?】 | アタリマエ!
* 9.7. statistics — 数理統計関数 — Python 3.6.5 ドキュメント

以上です。

コメント