偏度能够反应分布的对称情况,右偏(也叫正偏),在图像上表现为数据右边脱了一个长长的尾巴,这时大多数值分布在左侧,有一小部分值分布在右侧。
峰度反应的是图像的尖锐程度:峰度越大,表现在图像上面是中心点越尖锐。在相同方差的情况下,中间一大部分的值方差都很小,为了达到和正太分布方差相同的目的,必须有一些值离中心点越远,所以这就是所说的“厚尾”,反应的是异常点增多这一现象。
样本X的偏度为样本的三阶标准矩
其中是均值,为标准差, E 是均值操作。是三阶中心距,是累积量
偏度可以由三阶原点矩来进行表示:
一个容量为n的数据,一个典型的偏度计算方法如下:
其中为样本的均值(和的区别是,是整体的均值,为样本的均值)。s是样本的标准差,是样本的3阶中心距。
另外一种定义如下:
是三阶累积量的唯一对称无偏估计(unique symmetric unbiased estimator)( 和 写法不一样)。是二阶累积量的对称无偏估计。
大多数软件当中使用来计算skew,如Excel,Minitab,SAS和SPSS。
峰度定义为四阶标准矩,可以看出来和上面偏度的定义非常的像,只不过前者是三阶的。
样本的峰度还可以这样计算:
其中是四阶累积量的唯一对称无偏估计,是二阶累积量的无偏估计(等同于样本方差),是样本四阶平均距,是样本二阶平均距。
同样,大多数程序都是采用来计算峰度。
import pandas as pd
x = [53, 61, 49, 66, 78, 47]
s = pd.Series(x)
print(s.skew())
print(s.kurt())它是用上面的来计算偏度 来计算峰度,结果如下:
0.7826325504212567
-0.2631655441038463

import matplotlib.pyplot as pltimport mathimport numpy as npdef 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]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]if __name__ == "__main__": data = list(np.random.randn(10000)) # 满足高斯分布的10000个数 data2 = list(2*np.random.randn(10000)) # 将满足好高斯分布的10000个数乘以两倍,方差变成四倍 data3 =[x for x in data if x>-0.5] # 取data中>-0.5的值 data4 = list(np.random.uniform(0,4,10000)) # 取0~4的均匀分布 [niu, sigma, skew, kurt] = calc_stat(data) [niu_2, sigma2, skew2, kurt2] = calc_stat(data2) [niu_3, sigma3, skew3, kurt3] = calc_stat(data3) [niu_4, sigma4, skew4, kurt4] = calc_stat(data4) print (niu, sigma, skew, kurt) print (niu2, sigma2, skew2, kurt2) print (niu3, sigma3, skew3, kurt3) print (niu4, sigma4, skew4, kurt4) 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) info3 = r'$\mu=%.2f,\ \sigma=%.2f,\ skew=%.2f,\ kurt=%.2f$' %(niu_3,sigma3, skew3, kurt3) 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.text(1,0.32,info3,bbox=dict(facecolor='blue',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.hist(data4,100,normed=True,facecolor='b',alpha=0.7) plt.grid(True) plt.show()

n, bins, patches = plt.hist(arr, bins=10, normed=0, facecolor='black', edgecolor='black',alpha=1,histtype='b')hist的参数非常多,但常用的就这六个,只有第一个是必须的,后面四个可选 arr: 需要计算直方图的一维数组 bins: 直方图的柱数,可选项,默认为10 normed: 是否将得到的直方图向量归一化。默认为0 facecolor: 直方图颜色 edgecolor: 直方图边框颜色 alpha: 透明度 histtype: 直方图类型,‘bar’, ‘barstacked’, ‘step’, ‘stepfilled’ 返回值 : n: 直方图向量,是否归一化由参数normed设定 bins: 返回各个bin的区间范围 patches: 返回每个bin里面包含的数据,是一个list关于matplotlib.pyplot.hist函数