偏度与峰度(附python代码)

1 矩

  • 对于随机变量X,X的K阶原点矩为

  • X的K阶中心矩为

  • 期望实际上是随机变量X的1阶原点矩,方差实际上是随机变量X的2阶中心矩
  • 变异系数(Coefficient of Variation):标准差与均值(期望)的比值称为变异系数,记为C.V
  • 偏度Skewness(三阶)
  • 峰度Kurtosis(四阶)

2 偏度与峰度 

 

 

3 利用matplotlib模拟偏度和峰度 

3.1计算期望和方差

import matplotlib.pyplot as plt
import math
import numpy as np
def calc(data):
    n=len(data) # 10000个数
    niu=0.0 # niu表示平均值,即期望.
    niu2=0.0 # niu2表示平方的平均值
    niu3=0.0 # niu3表示三次方的平均值
    for a in data:
        niu += a
        niu2 += a**2
        niu3 += a**3
    niu /= n  
    niu2 /= n
    niu3 /= n
    sigma = math.sqrt(niu2 - niu*niu)
    return [niu,sigma,niu3]

其中,

 

 

3.2 计算偏度和峰度

def calc_stat(data):
    [niu, sigma, niu3]=calc(data)
    n=len(data)
    niu4=0.0 # niu4计算峰度计算公式的分子
    for a in data:
        a -= niu
        niu4 += a**4
    niu4 /= n

    skew =(niu3 -3*niu*sigma**2-niu**3)/(sigma**3) # 偏度计算公式
    kurt=niu4/(sigma**4) # 峰度计算公式:下方为方差的平方即为标准差的四次方
    return [niu, sigma,skew,kurt]

3.3 利用matplotlib模拟图像

if __name__ == "__main__":
    data =  list(np.random.randn(10000)) # 满足高斯分布的10000个数
    data2 = list(2*np.random.randn(10000))  # 将满足好高斯分布的10000个数乘以两倍,方差变成四倍
    [niu, sigma, skew, kurt] = calc_stat(data)
    [niu_2, sigma2, skew2, kurt2] = calc_stat(data2)
    print (niu, sigma, skew, kurt)
    print (niu_2, sigma2, skew2, kurt2)
    info = r'$\mu=%.2f,\ \sigma=%.2f,\ skew=%.2f,\ kurt=%.2f$' %(niu,sigma, skew, kurt) # 标注
    info2 = r'$\mu=%.2f,\ \sigma=%.2f,\ skew=%.2f,\ kurt=%.2f$' %(niu_2,sigma2, skew2, kurt2)
    plt.figure(figsize=(10,10))
    plt.text(1,0.38,info,bbox=dict(facecolor='red',alpha=0.25))
    plt.text(1,0.35,info2,bbox=dict(facecolor='green',alpha=0.25))
    plt.hist(data,100,normed=True,facecolor='r',alpha=0.9)
    plt.hist(data2,100,normed=True,facecolor='g',alpha=0.8)
    plt.grid(True)
    plt.show()

 得到的图像如下

4 python中已实现的方法

当然,python中也有已经封装好的方法可以直接调用。

>>import pandas as pd
>>import numpy as np
>>data =  list(np.random.randn(10000))
>>print(pd.Series(data).skew())
>>print(pd.Series(data).kurt())
0.008183135640179836
0.0054282536088923194

使用seaborn可以画出更加美观的图,

import numpy as np
from scipy.stats import norm
from matplotlib import pyplot as plt
import seaborn as sns

data =  list(np.random.randn(10000)) # 满足高斯分布的10000个数
sns.distplot(data, fit=norm)
(mu, sigma) = norm.fit(data)
print( '\n mu = {:.2f} and sigma = {:.2f}\n'.format(mu, sigma))
plt.legend(['Normal dist. ($\mu=$ {:.2f} and $\sigma=$ {:.2f} )'.format(mu, sigma)],loc='best')
plt.ylabel('Frequency')
plt.title('Distribution')

5 总结

      偏度这一指标,又称偏斜系数、偏态系数,是用来帮助判断数据序列的分布规律性的指标。
      在数据序列呈对称分布(正态分布)的状态下,其均值、中位数和众数重合。且在这三个数的两侧,其它所有的数据完全以对称的方式左右分布。
      如果数据序列的分布不对称,则均值、中位数和众数必定分处不同的位置。这时,若以均值为参照点,则要么位于均值左侧的数据较多,称之为右偏;要么位于均值右侧的数据较多,称之为左偏;除此无它。
      考虑到所有数据与均值之间的离差之和应为零这一约束,则当均值左侧数据较多的时候,均值的右侧必定存在数值较大的“离群”数据;同理,当均值右侧数据较多的时候,均值的左侧必定存在数值较小的“离群”数据。
      一般将偏度定义为三阶中心矩与标准差的三次幂之比。
        在上述定义下,偏度系数的取值无非三种情景:
       1.当数据序列呈正态分布的时候,由于均值两侧的数据完全对称分布,其三阶中心矩必定为零,于是满足正态分布的数据序列的偏度系数必定等于零。
       2.当数据序列非对称分布的时候,如果均值的左侧数据较多,则其右侧的“离群”数据对三阶中心矩的计算结果影响至巨,乃至于三阶中心矩取正值。因此,当数据的分布呈右偏的时候,其偏度系数将大于零。
       3.当数据序列非对称分布的时候,如果均值的右侧数据较多,则其左侧的“离群”数据对三阶中心矩的计算结果影响至巨,乃至于三阶中心矩取负值。因此,当数据的分布呈左偏的时候,偏度系数将小于零。
       在右偏的分布中,由于大部分数据都在均值的左侧,且均值的右侧存在“离群”数据,这就使得分布曲线的右侧出现一个长长的拖尾;而在左偏的分布中,由于大部分数据都在均值的右侧,且均值的左侧存在“离群”数据,从而造成分布曲线的左侧出现一个长长的拖尾。
       可见,在偏度系数的绝对值较大的时候,最有可能的含义是“离群”数据离群的程度很高(很大或很小),亦即分布曲线某侧的拖尾很长。
       但“拖尾很长”与“分布曲线很偏斜”不完全等价。例如,也不能排除在数据较少的那一侧,只是多数数据的离差相对于另一侧较大,但不存在明显“离群”数据的情景。所以,为准确判断分布函数的偏斜程度,最好的办法是直接观察分布曲线的几何图形。
与偏度(系数)一样,峰度(系数)也是一个用于评价数据系列分布特征的指标。根据这两个指标,我们可以判断数据系列的分布是否满足正态性,进而评价平均数指标的使用价值。一般地,对于一个偏态分布、肥尾分布特征很明显的数据序列来说,平均数这个指标极易令人误解数据序列分布的集中位置及其集中程度,故此使用起来要极其谨慎。 


       峰度(系数)等于数据序列的四阶中心矩与标准差的四次幂之比。设若先将数据标准化,则峰度(系数)相当于标准化数据序列的四阶中心矩。
       显然,一个数据距离均值越远,其对四阶中心矩计算结果的影响越大。是故,峰度(系数)是一个用于衡量离群数据离群度的指标。峰度(系数)越大,说明该数据系列中的极端值越多。这在数据序列的分布曲线图中来看,体现为存在明显的“肥尾”。当然,峰度(系数)较大也可能说明离群数据取值的极端性很严重,或者各数据距离均值的距离普遍较远。可见,峰度(系数)的大小到底能说明什么问题,最好还是看图确定。
       根据Jensen不等式,可以确定出峰度(系数)的取值范围:它的下限不会低于1,上限不会高于数据的个数。
有一些典型分布的峰度(系数)值得特别关注。例如,正态分布的峰度(系数)为常数3,均匀分布的峰度(系数)为常数1.6。在统计实践中,我们经常把这两个典型的分布曲线作为评价样本数据序列分布性态的参照。

6 参考

http://bbs.pinggu.org/thread-3417092-1-1.html

https://blog.csdn.net/u013555719/article/details/78530879

  • 20
    点赞
  • 127
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值