一列数据是频率的统计问题?

有一个样本,a列是数字,b列是该数字出现的次数,样本很大,要求这个样本的标准差和正态分布图,请问用python应该怎样处理?查了很多,还是不太懂...
A B
100 2
200 3
300 4
... ...

阅读 4.1k
2 个回答

关于数据

A B
100 2
200 3
300 4
...

可以看成一个长这样[100,100,200,200,200,300,300,300,300,...]list

标准分布

可以使用numpystd()来计算标准差,当然自己写公式也可以。比如

In [1]: import numpy as np
In [2]: np.std([100,100,200,200,200,300,300,300,300])
Out[2]: 78.56742013183862

分布图

正态分布图只是正态分布的数据的分布图。是否正态分布取决于你的数据。可以考虑用seaborn来绘制分布图。

import seaborn as sns
sns.distplot([100,100,200,200,200,300,300,300,300])

分布图长这样:

图片描述

大数据量

可以用pandas读取。用一个循环将数据表转为list:

import pandas as pd
df = pd.DataFrame({'A':[100,200,300],'B':[2,3,4]})
"""
df 像这样

     A  B
0  100  2
1  200  3
2  300  4
"""

l = []
for i, j in zip(df['A'],df['B']):
    tmp = [i]*j
    l.extend(tmp)
    
"""
l 像这样
[100, 100, 200, 200, 200, 300, 300, 300, 300]
"""

虽然 @Leo黎诗霆 同学的方法可以解决问题,但算不上高效率,也没有充分利用 numpy 类库的矩阵运算能力。

以下提供更为简洁、高效的方法,希望同学们从中理解 numpy 矩阵运算的精妙。

假设你已经知道如何计算一组数的标准差,否则请看 https://zh.wikipedia.org/zh-h...

对于一组数 [ 100, 200, 300 ] ,及其对应的个数 [ 1, 2, 3 ]

import pandas as pd
import matplotlib.pyplot as plt

df = pd.DataFrame({
    'a': [100, 200, 300], 
    'b': [1, 2, 3],         # a 列对应元素的个数
})

# n 为样本总数, m 为平均值, sd 为标准差
n = df.b.sum()
m = (df.a * df.b).sum() / n
sd = ((df.b * ((df.a - m) ** 2)).sum() / n) ** 0.5

# 绘制直方图
plt.hist(df.a, weights=df.b)
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题