首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >用 PHP 实现 Excel 的 stdevp 函数

用 PHP 实现 Excel 的 stdevp 函数

作者头像
jwj
发布2022-05-18 12:04:10
发布2022-05-18 12:04:10
93700
代码可运行
举报
运行总次数:0
代码可运行

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

公式

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

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

封装成函数

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

代码语言:javascript
代码运行次数:0
运行
复制
/**
 * 样本总体的标准偏差
 * @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);
}

测试运行

代码语言:javascript
代码运行次数:0
运行
复制
$list = [5,6,8,9];
var_dump(stdevp($list));

结果

代码语言:javascript
代码运行次数:0
运行
复制
float(1.5811388300842)

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

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

MySQL

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

代码语言:javascript
代码运行次数:0
运行
复制
SELECT `uid`, STDDEV_POP(score) `标准差`, AVG(score) `平均值` FROM `test` GROUP BY `uid` ORDER BY `标准差` DESC
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-01-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 公式
  • 封装成函数
  • 测试运行
  • MySQL
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档