在PHP环境下使用Laravel Eloquent如何计算第一和第三四分位数?
Laravel 集合计算第一/第三四分位数实现
你当前使用的Laravel Collection类没有内置四分位数计算方法,可基于现有逻辑扩展实现,步骤如下:
1. 预处理排序数据
首先提取目标字段值并做升序排序,重置索引避免后续取值出错:
// 原有代码 $data = Data::select('created_at', 'value')->get(); $median = collect($data)->median("value"); // 新增四分位数计算前置逻辑 $sortedValues = collect($data)->pluck('value')->sort()->values(); $count = $sortedValues->count(); $q1 = $q3 = null; if ($count < 4) { // 数据量过少时无法计算有效四分位数,可按需补充降级逻辑 }
2. 计算四分位数值
以下实现采用统计领域常用的线性插值法计算,结果和Excel的QUARTILE.EXC函数逻辑一致,适配绝大多数异常值识别场景:
// 计算第一四分位数Q1(25%分位) $q1Pos = ($count - 1) * 0.25; $q1Base = (int) floor($q1Pos); $q1Frac = $q1Pos - $q1Base; $q1 = $sortedValues[$q1Base]; if ($q1Frac > 0 && isset($sortedValues[$q1Base + 1])) { $q1 += $q1Frac * ($sortedValues[$q1Base + 1] - $sortedValues[$q1Base]); } // 计算第三四分位数Q3(75%分位) $q3Pos = ($count - 1) * 0.75; $q3Base = (int) floor($q3Pos); $q3Frac = $q3Pos - $q3Base; $q3 = $sortedValues[$q3Base]; if ($q3Frac > 0 && isset($sortedValues[$q3Base + 1])) { $q3 += $q3Frac * ($sortedValues[$q3Base + 1] - $sortedValues[$q3Base]); }
3. 后续异常值判断规则
基于四分位数识别异常值默认采用IQR(四分位距)规则:
四分位距
$iqr = $q3 - $q1,正常取值范围为[$q1 - 1.5 * $iqr, $q3 + 1.5 * $iqr],超出该范围的值可判定为异常值。
内容的提问来源于stack exchange,提问作者Jay Lee
相关产品推荐
相关产品推荐

