numpy 如何从频数分布表中获取均值和标准差

uyto3xhc  于 2022-11-23  发布在  其他
关注(0)|答案(3)|浏览(165)

我有一个元组[(val1, freq1), (val2, freq2) .... (valn, freqn)]的列表。我需要得到上述数据的中心趋势(平均值,中位数)和偏差(方差,标准差)的度量。我还想为这些值绘制一个箱线图。
我看到numpy数组有直接的方法从值列表中获得平均值/中值和标准差(或方差)。
numpy(或其他任何著名的库)是否有直接的方法来操作这样一个频率分布表?
还有:将上述元组列表以编程方式扩展为一个列表的最佳方法是什么?(例如,如果freq dist是[(1,3) , (50,2)],则获取列表[1,1,1,50,50]以使用np.mean([1,1,1,50,50])的最佳方法是什么)?
我看到了一个自定义函数here,但如果可能的话,我希望使用标准实现。

vltsax25

vltsax251#

首先,我会像@user8153那样将这个混乱的列表更改为两个numpy数组:

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

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

data = np.repeat(val, freq)

并在data数组上使用numpy 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))
6jjcrrmo

6jjcrrmo2#

  • 要将(值,频率)列表转换为值列表,请执行以下操作:
freqdist =  [(1,3), (50,2)]
sum(([val,]*freq for val, freq in freqdist), [])

给予

[1, 1, 1, 50, 50]
  • 若要计算平均值,您可以使用np.average(它采用weights参数)来避免构建值列表:
vals, freqs = np.array(freqdist).T
np.average(vals, weights = freqs)

给出了20.6,正如你所期望的。我认为这对均值,方差,或标准差不起作用。

rdrgkggo

rdrgkggo3#

import pandas as pd
import math
import numpy as np

频率分布数据

class   freq
0   60-65   3
1   65-70   150
2   70-75   335
3   75-80   135
4   80-85   4

为类创建中点列

df[['Upper','Lower']]=df['class'].str.split('-',expand=True)
df['Xi']=(df['Upper'].astype(float)+df['Lower'].astype(float))/2
df.drop(['Upper','Lower'],axis=1,inplace=True)

因此

class   freq  Xi
0   60-65   3     62.5
1   65-70   150   67.5
2   70-75   335   72.5
3   75-80   135   77.5
4   80-85   4     82.5

平均值

mean = np.average(df['Xi'], weights=df['freq'])
mean
72.396331738437

标准差

std = np.sqrt(np.average((df['Xi']-mean)**2,weights=df['freq']))
std
3.5311919641103877

相关问题