web-dev-qa-db-ja.com

Scipyのスキュー関数と尖度関数を正しく使用する方法は?

歪度は、データセットの対称性を測定するパラメーターであり、尖度裾が正規分布と比較してどれくらい重いかを測定するには、たとえば here を参照してください。

scipy.statsを使用すると、これら2つの量を簡単に計算できます。 scipy.stats.kurtosis および scipy.stats.skew を参照してください。

私の理解では、 正規分布 の歪度と尖度は両方とも上記の関数を使用して0でなければなりません。ただし、私のコードではそうではありません。

import numpy as np
from scipy.stats import kurtosis
from scipy.stats import skew

x = np.linspace( -5, 5, 1000 )
y = 1./(np.sqrt(2.*np.pi)) * np.exp( -.5*(x)**2  )  # normal distribution

print( 'excess kurtosis of normal distribution (should be 0): {}'.format( kurtosis(y) ))
print( 'skewness of normal distribution (should be 0): {}'.format( skew(y) ))

出力は次のとおりです。

正規分布の過剰尖度(0でなければなりません):-0.307393087742

正規分布の歪度(0でなければなりません):1.11082371392

私は何を間違えていますか?

私が使用しているバージョンは

python: 2.7.6
scipy : 0.17.1
numpy : 1.12.1
18
Alf

これらの関数は、 確率密度分布 のモーメントを計算します(そのため、パラメーターを1つだけ使用します)。値の「関数形式」は気にしません。

これらは「ランダムなデータセット」を意味します(平均、標準偏差、分散などの尺度と考えてください):

import numpy as np
from scipy.stats import kurtosis, skew

x = np.random.normal(0, 2, 10000)   # create random values based on a normal distribution

print( 'excess kurtosis of normal distribution (should be 0): {}'.format( kurtosis(x) ))
print( 'skewness of normal distribution (should be 0): {}'.format( skew(x) ))

与えるもの:

excess kurtosis of normal distribution (should be 0): -0.024291887786943356
skewness of normal distribution (should be 0): 0.009666157036010928

ランダム値の数を変更すると、精度が向上します。

x = np.random.normal(0, 2, 10000000)

につながる:

excess kurtosis of normal distribution (should be 0): -0.00010309478605163847
skewness of normal distribution (should be 0): -0.0006751744848755031

あなたの場合、関数は各値が同じ「確率」を持っていることを「仮定」します(値が均等に分散され、各値が1回だけ発生するため)skewおよびkurtosis非ガウス確率密度(これが正確に何であるかわからない)を扱うことにより、結果の値が0にさえ近くない理由を説明します。

import numpy as np
from scipy.stats import kurtosis, skew

x_random = np.random.normal(0, 2, 10000)

x = np.linspace( -5, 5, 10000 )
y = 1./(np.sqrt(2.*np.pi)) * np.exp( -.5*(x)**2  )  # normal distribution

import matplotlib.pyplot as plt

f, (ax1, ax2) = plt.subplots(1, 2)
ax1.hist(x_random, bins='auto')
ax1.set_title('probability density (random)')
ax2.hist(y, bins='auto')
ax2.set_title('(your dataset)')
plt.tight_layout()

enter image description here

25
MSeifert

密度関数の「形状」をデータとして使用しています。これらの関数は、分布からサンプリングされたデータで使用することを目的としています。分布からサンプリングする場合、サンプルサイズを増やすと正しい値に近づくサンプル統計が得られます。データをプロットするには、ヒストグラムをお勧めします。

%matplotlib inline
import numpy as np
import pandas as pd
from scipy.stats import kurtosis
from scipy.stats import skew

import matplotlib.pyplot as plt

plt.style.use('ggplot')

data = np.random.normal(0, 1, 10000000)
np.var(data)

plt.hist(data, bins=60)

print("mean : ", np.mean(data))
print("var  : ", np.var(data))
print("skew : ",skew(data))
print("kurt : ",kurtosis(data))

出力:

mean :  0.000410213500847
var  :  0.999827716979
skew :  0.00012294118186476907
kurt :  0.0033554829466604374

enter image description here

分析式を扱っていない限り、データを使用するときにゼロを取得することはほとんどありません。

5
Juan Leni