在Python中如何从频率分布表中获取平均值和标准差

2024-10-01 13:40:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个元组列表[(val1,freq1),(val2,freq2)。。。。(valn,freqn)]。我需要得到上述数据的中心趋势(平均值,中位数)和偏差度量值(方差,平均值)。我还想为这些值绘制一个方框图。在

我看到numpy数组有从值列表中获取平均值/中值和标准差(或方差)的直接方法。在

numpy(或任何其他著名的图书馆)有没有直接的方法来操作这样一个频率分布表?在

另外,用程序将上面的元组列表扩展为一个列表的最佳方法是什么?(例如,如果freq dist是[(1,3),(50,2)],则获取列表[1,1,1,50,50]的最佳方法np平均值([1,1,1,50,50]))

我看到一个自定义函数here,但如果可能的话,我希望使用标准实现


Tags: 数据方法numpy列表中心趋势平均值元组
2条回答
  • 要将(值、频率)列表转换为值列表:

    freqdist =  [(1,3), (50,2)]
    sum(([val,]*freq for val, freq in freqdist), []) 
    

    给予

    [1, 1, 1, 50, 50]
    
  • 要计算平均值,可以通过使用np.average参数来避免构建值列表:

    vals, freqs = np.array(freqdist).T
    np.average(vals, weights = freqs)
    

    如你所料的是20.6。但我不认为这对均值、方差或标准差有效。

首先,我将这个凌乱的列表改为两个numpy数组,就像@user8153所做的那样:

val, freq = np.array(list_tuples).T

然后可以重建数组(使用np.repeat防止循环):

^{pr2}$

并在data数组上使用^{} statistical functions。在


如果这会导致内存错误(或者您只是想尽可能多地压缩性能),您还可以使用一些专门构建的函数:

def mean_(val, freq):
    return np.average(val, weights = freq)

def median_(val, freq):
    ord = np.argsort(val)
    cdf = np.cumsum(freq[ord])
    return val[ord][np.searchsorted(cdf, cdf[-1] // 2)]

def mode_(val, freq): #in the strictest sense, assuming unique mode
    return val[np.argmax(freq)]

def var_(val, freq):
    avg = mean_(val, freq)
    dev = freq * (val - avg) ** 2
    return dev.sum() / (freq.sum() - 1)

def std_(val, freq):
    return np.sqrt(var_(val, freq))

相关问题 更多 >