在 Excel 中,stdevp 是计算样本总体标准偏差的函数,它反映了相对于平均值的离散程度。但在 PHP 里是没有该函数的,要计算标准偏差时,只能自己进行写算法,十分不便。于是查询相关资料和公式,总结出了以下代码。

公式

首先,查阅维基百科,得到了完整公式和详细的计算步骤,下图截取至维基百科

2022-01-28T05:37:57.png

参考资料:维基百科-标准差

封装成函数

然后根据公式和步骤拆分,写出以下函数

/**
 * 样本总体的标准偏差
 * @param array $list 样本
 * @return float
 */
function stdevp($list)
{
    // 样本数量
    $count = count($list);

    // 平均值
    $avg = array_sum($list) / $count;

    // 所有样本和平均值之间的差的平方和
    $sum = 0.0;
    foreach($list as $item) $sum += ($item - $avg) ** 2;

    // 根号(平方和 / 样本数)
    return sqrt($sum / $count);
}

测试运行

$list = [5,6,8,9];
var_dump(stdevp($list));

结果

float(1.5811388300842)

可以看出结果与维基百科中的示例相同,在Excel中测试stdevp函数也是相同的结果。

其实也不完全相同,因为小数长度不一致,但我相信结果是相对准确的。
如果想得到指定的小数长度,可以使用round()对结果四舍五入

MySQL

当然,实际开发中,我们大多数据都来自数据库,数据库有自带计算样本总体标准偏差的函数,顺便记录下 MySQL 的使用示例。
根据 uid 对数据进行分组,然后再根据 标准差 对经过进行从大到小排序。

SELECT `uid`, STDDEV_POP(score) `标准差`, AVG(score) `平均值` FROM `test` GROUP BY `uid` ORDER BY `标准差` DESC

标签: none

添加新评论