用 PHP 实现 Excel 的 stdevp 函数
在 Excel 中,stdevp
是计算样本总体标准偏差的函数,它反映了相对于平均值的离散程度。但在 PHP 里是没有该函数的,要计算标准偏差时,只能自己进行写算法,十分不便。于是查询相关资料和公式,总结出了以下代码。
公式
首先,查阅维基百科,得到了完整公式和详细的计算步骤,下图截取至维基百科
参考资料:维基百科-标准差
封装成函数
然后根据公式和步骤拆分,写出以下函数
/**
* 样本总体的标准偏差
* @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