如何计算一个数字与平均值的标准差?

Posted

技术标签:

【中文标题】如何计算一个数字与平均值的标准差?【英文标题】:How to calculate how many standard deviations a number is from the mean? 【发布时间】:2015-04-09 03:37:14 【问题描述】:

我有一个大小为 (61964, 25) 的矩阵。这是一个示例:

array([[  1.,   0.,   0.,   4.,   0.,   1.,   0.,   0.,   0.,   0.,   3.,
          0.,   2.,   1.,   0.,   0.,   3.,   0.,   3.,   0.,  14.,   0.,
          2.,   0.,   4.],
       [  0.,   0.,   0.,   1.,   2.,   0.,   0.,   0.,   0.,   0.,   1.,
          0.,   2.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   5.,   0.,
          0.,   0.,   1.]])

Scikit-learn 提供了一个有用的功能,前提是我们的数据是正态分布的:

from sklearn import preprocessing

X_2 = preprocessing.scale(X[:, :3])

然而,我的问题是我必须以行为基础——这不仅包含 25 个观察值——因此正态分布在这里不适用。解决方案是使用 t-distribution,但我如何在 Python 中做到这一点?

通常,值从 0 到 20。当我看到异常高的数字时,我会过滤掉整行。以下直方图显示了我的实际分布情况:

【问题讨论】:

Python 3.4 有一个新模块 [statistics][1],它将为您解决问题:[1]:docs.python.org/3/library/statistics.html 【参考方案1】:

scipy.stats 具有函数zscore,它允许您计算一个值有多少标准偏差高于平均值(通常称为标准分数Z分数 em>)。

如果 arr 是您问题中的示例数组,那么您可以计算每行 25 的 Z 分数,如下所示:

>>> import scipy.stats as stats
>>> stats.zscore(arr, axis=1)
array([[-0.18017365, -0.52666143, -0.52666143,  0.8592897 , -0.52666143,
        -0.18017365, -0.52666143, -0.52666143, -0.52666143, -0.52666143,
         0.51280192, -0.52666143,  0.16631414, -0.18017365, -0.52666143,
        -0.52666143,  0.51280192, -0.52666143,  0.51280192, -0.52666143,
         4.32416754, -0.52666143,  0.16631414, -0.52666143,  0.8592897 ],
       [-0.43643578, -0.43643578, -0.43643578,  0.47280543,  1.38204664,
        -0.43643578, -0.43643578, -0.43643578, -0.43643578, -0.43643578,
         0.47280543, -0.43643578,  1.38204664, -0.43643578, -0.43643578,
        -0.43643578, -0.43643578, -0.43643578, -0.43643578, -0.43643578,
         4.10977027, -0.43643578, -0.43643578, -0.43643578,  0.47280543]])

此计算使用每行的总体均值和标准差。要改用样本方差(与 t 统计量一样),请另外指定 ddof=1

stats.zscore(arr, axis=1, ddof=1)

【讨论】:

您好,非常感谢您的回复!我不知道这个功能!顺便说一句,你确定我应该使用ddof=1 吗?另外,为什么我会得到歪斜的结果?事实上,积极的一面?有任何想法吗?可能是因为初始表中有很多零吗?我怎样才能避免这种情况? 如果您想纠正样本偏差,请仅使用 ddof=1 - zscore 默认使用 ddof=0(即总体 SD)。关于您的编辑,我不确定我是否遵循您在编辑中尝试执行的操作...您想过滤掉具有异常高值的行吗?

以上是关于如何计算一个数字与平均值的标准差?的主要内容,如果未能解决你的问题,请参考以下文章

计算多个变量的一个均值和标准差

平均数、中位数、众数、方差、标准差、极差要怎么计算

用C语言如何算平均数和方差及标准差

怎么算标准差?

如何根据随机分布数据计算 C++ 中的样本均值、标准差和方差,并与原始均值和 sigma 进行比较

如何求标准差的置信区间