簡體   English   中英

如何從 Python 中的頻率分布表中獲取均值和標准差

[英]How to get Mean and Standard deviation from a Frequency Distribution table in Python

我有一個元組列表 [(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]))

在這里看到一個自定義函數,但如果可能,我想使用標准實現

首先,我會像@user8153 那樣將那個凌亂的列表更改為兩個numpy數組:

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

然后你可以重建數組(使用np.repeat防止循環):

data = np.repeat(val, freq)

並在您的data數組上使用numpy統計函數


如果這會導致內存錯誤(或者您只想盡可能多地擠出性能),您還可以使用一些專門構建的函數:

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))
  • 要將(值,頻率)列表轉換為值列表:

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

    [1, 1, 1, 50, 50]
  • 要計算平均值,您可以使用帶np.average weights參數的np.average來避免構建值列表:

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

    正如你所期望的那樣給出 20.6。 不過,我認為這不適用於均值、方差或標准差。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM