自IBM support 转载的一篇文章:
Standard errors of skewness and kurtosis are all the same for a set of variables
N = 样本数
偏度标准误 = 6*N*(N-1)/((N-2)*(N+1)*(N+3))
峰度标准误 = 4*(N**2 -1)*偏度标准误 /((N-3)*(N+5))
*原理暂时不清楚,总之知道这两个标准误之后可以求出对应的Z-score
偏度Z-score = 偏度/偏度标准误
峰度Z-score = 峰度/峰度标准误
α=0.05,abs(偏度Z-score) &abs(峰度Z-score) 均<1.96,则认为此分布服从正态分布
使用Python 绘制对应测试项并且在标题中标注出对应的z-score值的代码如下:
# 注意:R是dataframe,item为R中某一列的名称
def calculate_sk(item,R):
data = R.loc[:,item]
N = len(data)
se_skew = 6*N*(N-1)/((N-2)*(N+1)*(N+3))
se_kur = 4*(N*N -1)*se_skew/((N-3)*(N+5))
skew = stats.skew(data,nan_policy = 'omit')/se_skew
kurtosis =stats.kurtosis(data,nan_policy = 'omit')/se_kur
fig = plt.figure(figsize=(10,8),facecolor='w',edgecolor='k',frameon=True)
plt.subplot(111)
plt.title(item+' Skewness z-score is:{}, Kurtosis z-score is:{}'.format(skew,kurtosis))
plt.hist(skew1,bins = 30,facecolor = 'darkblue',edgecolor = 'k',alpha = 0.3)
plt.axvline(np.mean(data),ls = '-',c = 'blue',alpha = 0.5)
尝试使用此函数后结果如下:(item名称被我隐藏了)