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

发布于 2022-09-07 16:50:34 字数 178 浏览 38 评论 0

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

半仙 2022-09-14 16:50:34

关于数据

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]
"""
﹏半生如梦愿梦如真 2022-09-14 16:50:34

虽然 @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)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文