pandas 为什么这些不同的离群值方法都不能检测到离群值?

c3frrgcw  于 2023-03-11  发布在  其他
关注(0)|答案(1)|浏览(148)

我尝试按组查找 Dataframe 的异常值。我有两个组:Group1Group2,我正在尝试找到实现异常值方法的最佳方式

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) 

groups = df.groupby(['Group1', 'Group2'])
means = groups.Age.transform('mean')
stds = groups.Age.transform('std')

df['Flag'] = ~df.Age.between(means-stds*3, means+stds*3)

def flag_outlier(x):
    lower_limit  = np.mean(x) - np.std(x) * 3 
    upper_limit = np.mean(x) + np.std(x) * 3
    return (x>upper_limit)| (x<lower_limit)

df['Flag2'] = df.groupby(['Group1', 'Group2'])['Age'].apply(flag_outlier)

df["Flag3"] = df.groupby(['Group1', 'Group2'])['Age'].transform(lambda x: (x - x.mean()).abs() > 3*x.std())

然而,所有3种方法都未能检测到明显的离群值-例如,当Age为2000时,这些方法都没有将其视为离群值。这是有原因的吗?或者有可能我的所有3种离群值检测模型的代码都不正确?
我有一种强烈的感觉,我在某个地方犯了一个愚蠢的错误,但我不知道在哪里,所以任何帮助将不胜感激,谢谢!

dzhpxtsq

dzhpxtsq1#

在该组中,2000年的年龄与组平均值相差不超过3个标准差,组平均值为239.666667,组标准差为660.129722。
它可能看起来像一个明显的离群值,但你没有足够的数据来标记为离群值的标准。

相关问题