为何多种离群值检测方法无法识别数据框中的明显离群值?
分组检测离群值:均值±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
相关产品推荐
相关产品推荐

