You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何多种离群值检测方法无法识别数据框中的明显离群值?

分组检测离群值:均值±3倍标准差方法失效的原因与解决办法

你的三种代码实现本身没有语法错误,问题出在均值±3倍标准差方法的原理缺陷上:

  • 均值和标准差对极端值极度敏感:当分组中存在像2000这样的极端值时,它会大幅拉高分组的均值,同时让标准差变得极大,导致3倍标准差的范围被拉得极宽,最终把这个极端值也包含在了“正常范围”内,自然无法被标记为离群值。
  • 举个具体例子:2000所在的分组是Group1=A, Group2=C,该组的Age数据为[20,21,19,18,2000,22,24,17,16],计算后均值约为239.67,标准差超过600,3倍标准差的上限远大于2000,所以2000不会被判定为离群值。

替代方案:用稳健的四分位距(IQR)方法

四分位距(IQR)基于中位数和分位数,对极端值不敏感,是更可靠的离群值检测方法,实现代码如下:

import pandas as pd
import numpy as np

data = {'Group1':['A', 'A', 'A', 'B', 'B', 'B','A','A','B','B','B','A','A','A','B','B','B','A','A','A','B','B','B','A','A','A','A','A','B','B'], 'Group2':['C', 'C', 'C', 'C', 'D', 'D','C','D','C','C','D', 'C', 'C', 'D', 'D','C', 'C','D','D','D', 'D','C','D','C','C', 'D','C','D','C','C'], 'Age':[20, 21, 19, 24, 11, 15, 18, 1, 17,23, 35,2000,22,24,24,18,17,19,21,22,20,25,18,24,17,19,16,18,25,23]} 
df = pd.DataFrame(data)

def flag_outlier_iqr(x):
    q1 = x.quantile(0.25)
    q3 = x.quantile(0.75)
    iqr = q3 - q1
    lower_limit = q1 - 1.5 * iqr
    upper_limit = q3 + 1.5 * iqr
    return (x > upper_limit) | (x < lower_limit)

df['Flag_IQR'] = df.groupby(['Group1', 'Group2'])['Age'].apply(flag_outlier_iqr)

运行后,2000所在的行Flag_IQR会被标记为True,正确识别为离群值。

内容的提问来源于stack exchange,提问作者ImNotSureAboutStats

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 06:40:14