从加权数据创建的直方图统计 - numpy

时间:2017-02-08 11:58:15

标签: python numpy matplotlib scipy statistics

我有2个数据阵列,一个描述我想要绘制的数据,第二个描述该数据的频率或权重。

我使用

创建直方图
import numpy as np
import matplotlib.pyplot as plt

data = [7., 8.2, 9.6, 11.3, 13.2, 15.5, 18.1, 21.2, 24.9, 29.1, 34.1, 40.0]
freq = [2., 4.1, 4.5, 3.2, 2.7, 2.1, 1.3, 1., 0.9, 0., 0., 0.]

h = np.histogram(data, weights = freq, bins = data)
f = plt.hist(data, weights = freq, bins = data)

我现在想要找到结果直方图的均值,标准差,偏度和峰度,但由于数据是“加权”或预先计数的,我似乎无法使scipy.stats.describe函数起作用。有什么想法吗?

我应该说清楚,我已经尝试过scipy.stats.describe但似乎无法找到一个允许我做我想做的重量论证。我真的不知道有哪些工具可以帮助解决这个问题,谷歌搜索没有返回很多有用的结果(虽然我承认我可能会搜索错误的东西)。

为了让事情变得更复杂,看到你的老鹰会注意到数据在日志空间中均匀分布,而不是真实的空间。因此,如果您的方法涉及高斯拟合,您可能需要牢记这一点......

2 个答案:

答案 0 :(得分:0)

问题很简单,你可以在这里编写自己的函数,并且不需要scipy.stats中的函数。基本上你在这里给出的是分布函数,并且想要计算期望值。这由一个简单的积分给出。解决方案的一个例子是

def integrator(f,data,freq):
    diffs = np.roll(data,-1)-data
    return (f(data[:-1])*freq[:-1]*diffs[:-1]).sum()

freq_norm = freq/integrator(lambda x:1,data,freq)

exp_x = integrator(lambda x:x,data,freq_norm)
exp_x2 = integrator(lambda x:x**2,data,freq_norm)
exp_x4 = integrator(lambda x:x**4,data,freq_norm)

mean = exp_x
kurt = integrator(lambda x: ((x-exp_x)/std)**4,data,freq_norm)
skew = integrator(lambda x: ((x-exp_x)/std)**3,data,freq_norm)

答案 1 :(得分:0)

您可以使用 scipy.stats.rv_histogram 生成一个随机变量,其分布由 numpy.histogram 的输出给出,然后在其上使用 stats 方法得到您想要的。

import numpy as np
import scipy.stats as stats

data = [7., 8.2, 9.6, 11.3, 13.2, 15.5, 18.1, 21.2, 24.9, 29.1, 34.1, 40.0]
freq = [2., 4.1, 4.5, 3.2, 2.7, 2.1, 1.3, 1., 0.9, 0., 0., 0.]

rv = stats.rv_histogram(np.histogram(data, weights=freq))

您还可以使用 rv.moments(n) 直接获取(非中心)时刻,其中 n 是您感兴趣的顺序。 均值、变量、偏斜、kurt = rv.stats(moments='mvsk')

我希望这可以帮助某人!