为给定的峰度或偏度生成数字(分布)

时间:2016-04-27 19:03:55

标签: python excel-formula kurtosis

我是xls中使用统计函数的新手。在给定一组数字的情况下,我能够在xls中使用KURT函数计算峰度或偏度。

但是我的要求是以另一种方式来做,比如对于给定的Skewness或Kurtosis,有没有办法生成随机数。关于如何做到这一点的任何指示。

该函数应该将偏度或峰度值作为输入,它应该生成50个随机数,其中1表示最小值,100,000表示最大值。

如果Excel没办法,我正在寻找Python的建议。

您能帮我解决一下如何在Excel或Python中执行此操作吗?

1 个答案:

答案 0 :(得分:0)

在尝试了几种分布后,广义Gamma分布似乎足够灵活,可以将偏斜或峰度调整到所需的值,但不能像在question @gabriel在他的评论中提及。

因此,要从具有单个固定矩的g-Gamma分布中抽取样本,您可以使用scipy.optimize查找具有最小罚函数的分布(我选择了{{ 1}})

(target - value) ** 2

在此之前,我想出了一个匹配偏斜峰度的功能。但是,即使g-Gamma也不够灵活,无法达到此目的,具体取决于您的病情极端情况

from scipy import stats, optimize
import numpy as np

def random_by_moment(moment, value, size):
    """ Draw `size` samples out of a generalised Gamma distribution
    where a given moment has a given value """
    assert moment in 'mvsk', "'{}' invalid moment. Use 'm' for mean,"\
            "'v' for variance, 's' for skew and 'k' for kurtosis".format(moment)
    def gengamma_error(a):
        m, v, s, k = (stats.gengamma.stats(a[0], a[1], moments="mvsk"))
        moments = {'m': m, 'v': v, 's': s, 'k': k}
        return (moments[moment] - value) ** 2    # has its minimum at the desired value      

    a, c = optimize.minimize(gengamma_error, (1, 1)).x    
    return stats.gengamma.rvs(a, c, size=size)

n = random_by_moment('k', 3, 100000)
# test if result is correct
print("mean={}, var={}, skew={}, kurt={}".format(np.mean(n), np.var(n), stats.skew(n), stats.kurtosis(n)))