偏度是衡量数据集对称性的参数,峰度用于衡量尾部与正态分布相比的重量,参见例如{ {3}}。
scipy.stats
提供了计算这两个数量的简便方法,请参阅here和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
答案 0 :(得分:22)
这些函数计算probability density distribution的时刻(这就是为什么它只需要一个参数)并且不关心值的“函数形式”。
这些用于“随机数据集”(将它们视为均值,标准差,方差等度量):
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
在您的情况下,函数“假设”每个值具有相同的“概率”(因为值均匀分布且每个值仅出现一次)所以从skew
和{{1的角度来看它处理非高斯概率密度(不确定究竟是什么),这解释了为什么结果值甚至不接近kurtosis
:
0
答案 1 :(得分:5)
您正在使用"形状"密度函数。 这些函数用于从分布中采样的数据。 如果从分布中进行采样,则将获得在增加样本大小时将接近正确值的样本统计信息。 为了绘制数据,我建议使用直方图。
%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
除非您正在处理分析表达式,否则在使用数据时极不可能获得零。