如何计算歪斜和峰度

发布于 2021-01-29 15:13:40

您可以使用以下方法计算偏斜和峰度

但是,没有方便的方法来计算变量之间的偏斜或峰度。甚至更好的是偏斜或峰度矩阵。


考虑一下 pd.DataFrame df

import pandas as pd
import numpy as np

np.random.seed([3,1415])
df = pd.DataFrame(np.random.rand(10, 2), columns=list('ab'))

df

          a         b
0  0.444939  0.407554
1  0.460148  0.465239
2  0.462691  0.016545
3  0.850445  0.817744
4  0.777962  0.757983
5  0.934829  0.831104
6  0.879891  0.926879
7  0.721535  0.117642
8  0.145906  0.199844
9  0.437564  0.100702

如何计算coskew和cokurtosisab

关注者
0
被浏览
37
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    参考文献

    计算中 coskew

    我对偏斜的解释是一个序列与另一个序列的方差之间的“相关性”。这样,根据我们要计算其方差的序列,实际上可以有两种类型的偏斜。维基百科显示了这两个公式

    'left'
    在此处输入图片说明
    'right'
    在此处输入图片说明


    幸运的是,当我们计算倾斜矩阵时,一个是另一个的转置。

    def coskew(df, bias=False):
        v = df.values
        s1 = sigma = v.std(0, keepdims=True)
        means = v.mean(0, keepdims=True)
    
        # means is 1 x n (n is number of columns
        # this difference broacasts appropriately
        v1 = v - means
    
        s2 = sigma ** 2
    
        v2 = v1 ** 2
    
        m = v.shape[0]
    
        skew = pd.DataFrame(v2.T.dot(v1) / s2.T.dot(s1) / m, df.columns, df.columns)
    
        if not bias:
            skew *= ((m - 1) * m) ** .5 / (m - 2)
    
        return skew
    

    示范

    coskew(df)
    
              a         b
    a -0.369380  0.096974
    b  0.325311  0.067020
    

    我们可以对此进行比较df.skew()并检查对角线是否相同

    df.skew()
    
    a   -0.36938
    b    0.06702
    dtype: float64
    

    计算中 cokurtosis

    我对色度的解释是以下两种之一

    1. 一个系列与另一个系列的偏斜之间的“相关性”
    2. 两个系列的方差之间的“相关性”

    对于选项1,我们再次具有左右变体,它们在矩阵形式中是彼此的转置。因此,我们仅关注左侧变体。剩下的就是计算总共两个变体。

    'left'
    在此处输入图片说明
    'middle'
    在此处输入图片说明

    def cokurt(df, bias=False, fisher=True, variant='middle'):
        v = df.values
        s1 = sigma = v.std(0, keepdims=True)
        means = v.mean(0, keepdims=True)
    
        # means is 1 x n (n is number of columns
        # this difference broacasts appropriately
        v1 = v - means
    
        s2 = sigma ** 2
        s3 = sigma ** 3
    
        v2 = v1 ** 2
        v3 = v1 ** 3
    
        m = v.shape[0]
    
        if variant in ['left', 'right']:
            kurt = pd.DataFrame(v3.T.dot(v1) / s3.T.dot(s1) / m, df.columns, df.columns)
            if variant == 'right':
                kurt = kurt.T
        elif variant == 'middle':
            kurt = pd.DataFrame(v2.T.dot(v2) / s2.T.dot(s2) / m, df.columns, df.columns)
    
        if not bias:
            kurt = kurt * (m ** 2 - 1) / (m - 2) / (m - 3) - 3 * (m - 1) ** 2 / (m - 2) / (m - 3)
        if not fisher:
            kurt += 3
    
        return kurt
    

    示范

    cokurt(df, variant='middle', bias=False, fisher=False)
    
              a        b
    a  1.882817  0.86649
    b  0.866490  1.63200
    
    cokurt(df, variant='left', bias=False, fisher=False)
    
              a        b
    a  1.882817  0.19175
    b -0.020567  1.63200
    

    对角线应等于 kurtosis

    df.kurtosis() + 3
    
    a    1.882817
    b    1.632000
    dtype: float64
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看